diff --git a/!src-dist/data/MY_TeamMon/data/default.zhcn.jx3dat b/!src-dist/data/MY_TeamMon/data/default.zhcn.jx3dat new file mode 100644 index 000000000..0450ab068 --- /dev/null +++ b/!src-dist/data/MY_TeamMon/data/default.zhcn.jx3dat @@ -0,0 +1,60563 @@ +return { + CASTING = { + [147] = { + { + dwID = 4108, + nLevel = 1, + }, + { + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "反弹剩余时间", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4119, + nLevel = 1, + }, + }, + [242] = { + [7] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + nIcon = 13, + nTime = "8,随机技能;16,随机技能;24,随机技能;32,随机技能;40,随机技能;48,随机技能;54,随机技能;", + }, + }, + dwID = 15871, + }, + [1] = { + dwID = 16029, + nLevel = 1, + szNote = "主T注意减伤", + [8] = { + bBigFontAlarm = true, + }, + }, + [2] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + szNote = "准备拉人出圈", + dwID = 15791, + }, + [4] = { + nLevel = 1, + dwID = 15867, + }, + [8] = { + nLevel = 1, + dwID = 15884, + tCountdown = { + { + nClass = 8, + szName = "正面AOE", + nIcon = 13, + nTime = 13, + }, + }, + }, + [9] = { + nLevel = 1, + szName = "霜印", + dwID = 15892, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "霜印", + nFrame = 1, + nClass = 8, + }, + { + nClass = 8, + szName = "正面AOE", + nIcon = 13, + nTime = 13, + }, + }, + }, + [5] = { + nLevel = 2, + dwID = 15869, + }, + [10] = { + nLevel = 1, + [8] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 15887, + szNote = "霜印变冰块躲冰后面!", + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nClass = 9, + nIcon = 13, + nTime = "13,拉人;41,拉人", + }, + { + nClass = 9, + nIcon = 13, + nTime = "29,主T减伤;59,分散&准备点名", + }, + }, + dwID = 15824, + }, + [6] = { + nLevel = 1, + dwID = 15876, + }, + [11] = { + dwID = 15889, + nLevel = 1, + szNote = "快躲避", + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [211] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "火龙机雷", + nTime = 22, + szName = "火龙机雷", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "摧城一击", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "黑油圈", + nTime = 30, + szName = "黑油圈", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "追击火龙", + nTime = 11, + szName = "追击火龙", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 11, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 4, + szName = "虎啸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "准备排火", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 67, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [5] = { + nLevel = 4, + szName = "断骨", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "★远离10尺★远离10尺★", + }, + }, + [212] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "禁断", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "断长生", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [4] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "玄冰一指", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [16] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "★躲避断浪气劲★远离★", + }, + [17] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + nTime = 21, + szName = "恐惧debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [5] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 26, + szName = "毒血涌动", + nClass = 8, + }, + }, + dwID = 13197, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "和弦总章(穿透)", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "圣火焚城", + dwID = 10337, + }, + [13] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "★快打断★快打断★", + dwID = 9355, + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "★注意躲避★", + dwID = 10347, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "断浪斩(流血)", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9393, + }, + [15] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "剁山劈(破甲)", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9392, + }, + }, + [244] = { + [7] = { + dwID = 15871, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nClass = 8, + nTime = "8,随机技能;16,随机技能;24,随机技能;32,随机技能;40,随机技能;48,随机技能;54,随机技能;", + }, + }, + }, + [1] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + szNote = "主T注意减伤", + dwID = 16029, + }, + [2] = { + dwID = 15791, + nLevel = 1, + szNote = "准备拉人出圈", + [8] = { + bBigFontAlarm = true, + }, + }, + [4] = { + nLevel = 1, + dwID = 15867, + }, + [8] = { + tCountdown = { + { + szName = "正面AOE", + nClass = 8, + nIcon = 13, + nTime = 13, + }, + }, + nLevel = 1, + dwID = 15884, + }, + [9] = { + tCountdown = { + { + nClass = 8, + nTime = 40, + szName = "霜印", + nIcon = 13, + nFrame = 1, + }, + { + szName = "正面AOE", + nClass = 8, + nIcon = 13, + nTime = 13, + }, + }, + nLevel = 1, + dwID = 15892, + szName = "霜印", + }, + [5] = { + nLevel = 2, + dwID = 15869, + }, + [10] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 15887, + szNote = "霜印靠近!!躲冰后面", + }, + [3] = { + dwID = 15824, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nClass = 9, + nTime = "13,拉人;41,拉人", + }, + { + nIcon = 13, + nClass = 9, + nTime = "29,主T减伤;59,分散&准备点名", + }, + }, + }, + [6] = { + nLevel = 1, + dwID = 15876, + }, + [11] = { + dwID = 15889, + nLevel = 1, + szNote = "快躲避", + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [183] = { + [13] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 32, + szName = "★准备跳灯★", + nRefresh = 30, + nClass = 9, + }, + }, + dwID = 8731, + }, + [7] = { + dwID = 8811, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + }, + [1] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "天火", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 8767, + }, + [2] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "兵势", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8778, + }, + [4] = { + dwID = 8782, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [8] = { + nLevel = 4, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 8578, + szNote = "★远离5尺★远离5尺★", + tCountdown = { + { + nIcon = 13, + nTime = 12, + szName = "随机技能点名", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [9] = { + dwID = 8877, + nLevel = 1, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8790, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "致命一击", + nTime = 31, + szName = "致命一击", + nRefresh = 10, + nClass = 8, + nFrame = 2, + }, + }, + dwID = 8734, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "黑暗之力(穿透)", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "★远离BOSS20尺★", + dwID = 8850, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 15, + szName = "随机技能", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8785, + }, + [6] = { + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "优艳·下一次随机技能", + nRefresh = 10, + nClass = 8, + }, + }, + [8] = { + bBigFontAlarm = true, + }, + dwID = 8807, + szName = "优艳火花(3)", + szNote = "远离3尺!!", + nLevel = 1, + }, + [12] = { + nLevel = 1, + dwID = 8741, + }, + [11] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3419, + nTime = 11, + szName = "时间暂停结束", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8941, + }, + }, + [218] = { + { + dwID = 14048, + nLevel = 1, + }, + { + [8] = { + bCenterAlarm = true, + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 14012, + szNote = "注意分散", + nLevel = 1, + }, + [4] = { + tCountdown = { + { + nClass = 9, + szName = "流风五连斩", + nIcon = 13, + nTime = 40, + }, + }, + nLevel = 1, + col = { + 247, + 161, + 2, + }, + dwID = 13967, + nIcon = 13, + [9] = { + bBigFontAlarm = true, + }, + szName = "流风五连斩", + }, + [3] = { + nIcon = 13, + bMonTarget = true, + dwID = 14007, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + szName = "献祭剑姬", + }, + }, + [126] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 6929, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "准备躲避线!", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 6927, + }, + }, + [220] = { + { + nLevel = 1, + dwID = 14050, + }, + { + dwID = 14052, + tCountdown = { + { + nClass = 8, + szName = "泣", + nIcon = 2589, + nTime = 60, + }, + }, + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 14055, + tCountdown = { + { + nClass = 9, + szName = "连斩", + nIcon = 345, + nTime = 20, + }, + { + nFrame = 8, + nTime = 60, + szName = "追魂剑气", + nClass = 9, + nIcon = 3443, + }, + }, + }, + [8] = { + dwID = 14130, + szName = "斩流剑·徊", + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 60, + szName = "三环锡杖", + nClass = 8, + }, + { + nClass = 8, + key = "紫金钵·镇", + nTime = 88, + szName = "紫金钵·镇", + nIcon = 2123, + }, + }, + }, + [17] = { + dwID = 14024, + nLevel = 1, + }, + [9] = { + nLevel = 1, + szName = "斩流剑·灭", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + dwID = 14025, + }, + [5] = { + dwID = 14119, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·内", + }, + [21] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·外", + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,一鼓作气;15,叫阵;", + }, + { + nClass = 9, + szName = "防御姿态", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [3] = { + nLevel = 1, + dwID = 14092, + tCountdown = { + { + nClass = 8, + szName = "连斩", + nIcon = 345, + nTime = 23, + }, + { + nFrame = 8, + nTime = 61, + szName = "追魂剑气", + nClass = 8, + nIcon = 3443, + }, + }, + }, + [6] = { + nLevel = 1, + dwID = 14123, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,一鼓作气;18,盾牌反震;", + }, + { + nClass = 9, + szName = "步步紧逼", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "攻击姿态", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + [9] = { + bCenterAlarm = true, + }, + szName = "斩流剑·破", + }, + [14] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [19] = { + nLevel = 1, + dwID = 14420, + }, + [15] = { + tCountdown = { + { + nClass = 9, + szName = "盾牌反震", + nIcon = 2589, + nTime = 10, + }, + }, + dwID = 14540, + szName = "盾牌反震", + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + }, + [221] = { + [7] = { + szName = "一式·行舟", + dwID = 13928, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "幻心问魔曲", + nTime = 80, + szName = "幻心问魔曲", + nClass = 8, + }, + }, + dwID = 14200, + nLevel = 1, + }, + [2] = { + nLevel = 1, + dwID = 14586, + tCountdown = { + { + nIcon = 2589, + key = "潇潇协奏曲", + nTime = 67, + szName = "品竹曲", + nClass = 8, + }, + }, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 14147, + }, + [8] = { + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "行舟", + nTime = "13,行舟;26,行舟;39,行舟;", + }, + { + nIcon = 2589, + key = "二式·登楼", + nTime = 48, + szName = "二式·登楼", + nClass = 8, + }, + }, + szName = "二式·登楼", + nLevel = 1, + dwID = 13933, + }, + [9] = { + tCountdown = { + { + nIcon = 2589, + nTime = 25, + szName = "映日", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + nLevel = 2, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "四式·映日", + }, + [5] = { + nLevel = 1, + dwID = 14114, + tCountdown = { + { + nClass = 8, + szName = "知心火", + nIcon = 327, + nTime = 5, + }, + }, + }, + [3] = { + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "辩玉掌", + nRefresh = 5, + nClass = 9, + }, + }, + dwID = 13903, + szName = "辩玉掌", + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + }, + [190] = { + { + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 9239, + }, + }, + [222] = { + { + dwID = 13897, + [9] = { + bCenterAlarm = true, + bBigFontAlarm = true, + }, + nLevel = 1, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + dwID = 13891, + }, + }, + [191] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "火龙机雷", + nTime = 22, + szName = "火龙机雷", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "摧城一击", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "黑油圈", + nTime = 30, + szName = "黑油圈", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "追击火龙", + nTime = 11, + szName = "追击火龙", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 1, + szName = "虎啸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "准备排火", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 67, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 11, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 4, + szName = "断骨", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "★远离10尺★远离10尺★", + }, + }, + [192] = { + [7] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "玄冰一指", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 26, + szName = "毒血涌动", + nClass = 8, + }, + }, + dwID = 13197, + }, + [4] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [8] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "★注意躲避★", + dwID = 10347, + }, + [9] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "和弦总章(穿透)", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "禁断", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "断长生", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "圣火焚城", + dwID = 10337, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + }, + [224] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 13656, + szNote = "远离BOSS四尺", + tCountdown = { + { + szName = "幽冥鬼步", + nClass = 8, + nIcon = 13, + nTime = 18, + }, + }, + }, + }, + [225] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 14020, + szNote = "扶摇跳", + tCountdown = { + { + nIcon = 13, + nClass = 8, + szName = "音潮倾湖", + nTime = 55, + }, + }, + }, + }, + [227] = { + { + tCountdown = { + { + nIcon = 13, + key = "DPS停手", + nTime = "15,DPS停手;80,DPS停手;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "黑风破岩斩", + nTime = "48,黑风破岩斩;112,黑风破岩斩;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "正面AOE", + nTime = "35,正面AOE;68,正面AOE;99,正面AOE;136,正面AOE;", + nRefresh = 130, + nClass = 8, + }, + }, + dwID = 13775, + nLevel = 1, + }, + { + nIcon = 13, + nLevel = 1, + szName = "反击", + szNote = "输出输出输出输出", + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 13808, + }, + { + nLevel = 1, + dwID = 13777, + }, + }, + [133] = { + [6] = { + dwID = 3613, + nLevel = 2, + }, + [2] = { + dwID = 3914, + nLevel = 1, + }, + [8] = { + [8] = { + bTeamChannel = true, + }, + nLevel = 1, + szNote = "快停手!", + dwID = 3703, + }, + [3] = { + dwID = 3682, + nLevel = 33, + }, + [1] = { + [8] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + nLevel = 1, + dwID = 4023, + }, + [4] = { + [8] = { + bTeamChannel = true, + }, + nLevel = 1, + szName = "奔狼踏月式(穿刺)", + dwID = 3628, + }, + [5] = { + dwID = 3643, + nLevel = 1, + }, + [7] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + dwID = 3705, + }, + }, + [165] = { + [7] = { + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "血祭天", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 5531, + bCheckLevel = true, + }, + [1] = { + nLevel = 2, + bCheckLevel = true, + dwID = 5624, + nIcon = 3418, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "沙暴", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [2] = { + nIcon = 332, + tCountdown = { + { + nIcon = 13, + nTime = 18, + szName = "SKILL#5645:1", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 5645, + nLevel = 1, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + szName = "结算技能", + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 16, + szName = "点名结束", + nRefresh = 20, + nClass = 9, + }, + }, + nRelScrutinyType = 3, + dwID = 6119, + }, + [8] = { + nLevel = 2, + bCheckLevel = true, + dwID = 5524, + tCountdown = { + { + nIcon = 13, + nTime = 50, + szName = "血重楼", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 2025, + }, + [9] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 5513, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "皇之怒", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [5] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "日浆阴煞焱", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 5449, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 5653, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "平砍剑圣进入心魔幻境", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5631, + }, + [6] = { + dwID = 5450, + nLevel = 2, + }, + [11] = { + nLevel = 2, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 5513, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "皇之怒", + nRefresh = 10, + nClass = 8, + }, + }, + }, + }, + [229] = { + { + dwID = 14048, + nLevel = 1, + }, + { + [8] = { + bCenterAlarm = true, + bBigFontAlarm = true, + bTeamChannel = true, + }, + nLevel = 1, + szNote = "注意分散", + dwID = 14012, + }, + [4] = { + tCountdown = { + { + szName = "流风五连斩", + nClass = 9, + nIcon = 13, + nTime = 40, + }, + }, + szName = "流风五连斩", + col = { + 247, + 161, + 2, + }, + dwID = 13967, + nIcon = 13, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [3] = { + nLevel = 1, + bMonTarget = true, + dwID = 14007, + szName = "献祭剑姬", + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + }, + [198] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "火龙机雷", + nTime = 22, + szName = "火龙机雷", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "摧城一击", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "黑油圈", + nTime = 30, + szName = "黑油圈", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "追击火龙", + nTime = 11, + szName = "追击火龙", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 2, + szName = "虎啸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "准备排火", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 67, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 11, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 4, + szName = "断骨", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "★远离10尺★远离10尺★", + }, + }, + [230] = { + [13] = { + tCountdown = { + { + nClass = 8, + nTime = 34, + szName = "缠", + nIcon = 3404, + nFrame = 8, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "12,行舟;20,行舟;28,行舟;", + }, + { + nClass = 8, + szName = "七式·踏歌", + nIcon = 2589, + nTime = 45, + }, + }, + [8] = { + bScreenHead = true, + bFullScreen = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + nLevel = 2, + szName = "七式·踏歌", + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "辩玉掌", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "辩玉掌", + nLevel = 6, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13903, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + dwID = 14586, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "准备QTE", + nTime = 43, + szName = "准备QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "品竹曲", + nTime = 80, + szName = "品竹曲", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,幻魔问心曲;322,幻魔问心曲;", + }, + [3] = { + nIcon = 3437, + nTime = "120,音缠;278,音缠;318,音缠;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "分川手·排浪", + nIcon = 2139, + nTime = 24, + }, + }, + dwID = 14147, + }, + [8] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 2, + szName = "一式·行舟", + [9] = { + bCenterAlarm = true, + }, + dwID = 13928, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + tCountdown = { + { + nClass = 8, + szName = "知心火", + nIcon = 327, + nTime = 6, + }, + }, + dwID = 14114, + nLevel = 2, + }, + [10] = { + nLevel = 2, + szName = "一式变·覆舟(穿透)", + [9] = { + bBigFontAlarm = true, + }, + dwID = 15084, + }, + [14] = { + nLevel = 2, + dwID = 13959, + [9] = { + bBigFontAlarm = true, + }, + szName = "八式·月池", + }, + [3] = { + szName = "分川手·排浪(穿透)", + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13913, + }, + [12] = { + tCountdown = { + { + nIcon = 2589, + key = "映日", + nTime = 28, + szName = "映日", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + szName = "四式·映日", + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [11] = { + dwID = 13933, + tCountdown = { + { + nClass = 8, + nIcon = 2589, + key = "行舟", + nTime = "13,行舟;26,行舟;39,行舟;", + }, + { + nIcon = 2589, + key = "二式·登楼", + nTime = 48, + szName = "二式·登楼", + nClass = 8, + }, + }, + nLevel = 1, + szName = "二式·登楼", + }, + }, + [199] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "禁断", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "断长生", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 26, + szName = "毒血涌动", + nClass = 8, + }, + }, + dwID = 13197, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "玄冰一指", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [16] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "剁山劈(破甲)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9392, + }, + [17] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + nTime = 21, + szName = "恐惧debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [5] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [3] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "和弦总章(穿透)", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "圣火焚城", + dwID = 10337, + }, + [13] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "★躲避断浪气劲★远离★", + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "★注意躲避★", + dwID = 10347, + }, + [14] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "★快打断★快打断★", + dwID = 9355, + }, + [15] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "断浪斩(流血)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9393, + }, + }, + [231] = { + { + nLevel = 1, + dwID = 14050, + }, + { + tCountdown = { + { + szName = "泣", + nClass = 8, + nIcon = 2589, + nTime = 69, + }, + }, + nLevel = 1, + dwID = 14052, + }, + [4] = { + dwID = 14055, + tCountdown = { + { + nIcon = 345, + key = "连斩", + nTime = 20, + szName = "连斩", + nClass = 9, + }, + { + nIcon = 3443, + key = "追魂剑气", + nTime = 60, + szName = "追魂剑气", + nClass = 9, + }, + }, + nLevel = 1, + }, + [8] = { + szName = "斩流剑·灭", + dwID = 14131, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 14024, + nLevel = 2, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 80, + szName = "三环锡杖", + nClass = 9, + }, + }, + }, + [17] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14025, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 14228, + nLevel = 1, + }, + [18] = { + [8] = { + bScreenHead = true, + }, + dwID = 14420, + nLevel = 1, + }, + [5] = { + nLevel = 1, + bMonTarget = true, + dwID = 14124, + szName = "斩流剑·半月", + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "5,一鼓作气;15,叫阵;", + }, + { + szName = "攻击姿态结束", + nClass = 9, + nIcon = 2589, + nTime = 50, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14259, + }, + [20] = { + nLevel = 1, + dwID = 14112, + }, + [21] = { + nLevel = 2, + szName = "剑器舞·内", + [9] = { + bCenterAlarm = true, + }, + dwID = 14771, + }, + [11] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "6,一鼓作气;18,盾牌反震;", + }, + { + szName = "步步紧逼", + nClass = 9, + nIcon = 2133, + nTime = 12, + }, + { + szName = "防御姿态结束", + nClass = 9, + nIcon = 2589, + nTime = 66, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14265, + }, + [22] = { + nLevel = 2, + szName = "剑器舞·外", + [9] = { + bCenterAlarm = true, + }, + dwID = 14770, + }, + [3] = { + dwID = 14092, + tCountdown = { + { + nIcon = 345, + key = "连斩", + nTime = 23, + szName = "连斩", + nClass = 8, + }, + { + nIcon = 3443, + key = "追魂剑气", + nTime = 63, + szName = "追魂剑气", + nClass = 8, + }, + }, + nLevel = 1, + }, + [6] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + szName = "斩流剑·破", + }, + [12] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [7] = { + nLevel = 2, + szName = "斩流剑·落", + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "半月", + nRefresh = 7, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14126, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + szName = "盾牌反震", + nClass = 9, + nIcon = 2589, + nTime = 10, + }, + }, + szName = "盾牌反震", + dwID = 14540, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + [19] = { + dwID = 14113, + nLevel = 2, + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "住相", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "涅槃经", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "紫金钵", + nTime = 0, + szName = "紫金钵·镇", + nClass = 9, + }, + }, + }, + [15] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2133, + key = "紫金钵", + nTime = 80, + szName = "紫金钵·镇", + nClass = 8, + }, + }, + szName = "紫金钵·镇", + }, + }, + [-9] = { + [13] = { + dwID = 2341, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 7, + }, + [7] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13955, + tCountdown = { + { + szName = "555", + nClass = 9, + nIcon = 4223, + nTime = 15, + }, + }, + }, + [1] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [2] = { + dwID = 15080, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 10, + }, + [4] = { + dwID = 14130, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [8] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13955, + tCountdown = { + { + szName = "55", + nClass = 9, + nIcon = 4223, + nTime = 10, + }, + }, + }, + [9] = { + dwID = 1116, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + tCountdown = { + { + szName = "浊水花开还有", + nClass = 9, + nIcon = 13, + nTime = 12, + }, + }, + dwID = 13935, + nLevel = 4, + }, + [10] = { + dwID = 6134, + nLevel = 29, + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + szName = "雪中行1", + }, + [14] = { + nLevel = 1, + dwID = 15867, + }, + [11] = { + nLevel = 1, + dwID = 15792, + }, + [6] = { + [8] = { + bCenterAlarm = true, + bScreenHead = true, + }, + dwID = 14025, + nLevel = 2, + }, + [12] = { + dwID = 1557, + [9] = { + bTeamChannel = true, + bBigFontAlarm = true, + bWhisperChannel = true, + }, + nLevel = 8, + }, + [3] = { + nLevel = 4, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14276, + }, + }, + [232] = { + { + nLevel = 1, + dwID = 14050, + }, + { + tCountdown = { + { + szName = "泣", + nClass = 8, + nIcon = 2589, + nTime = 69, + }, + }, + nLevel = 1, + dwID = 14052, + }, + [4] = { + dwID = 14055, + tCountdown = { + { + nIcon = 345, + key = "连斩", + nTime = 20, + szName = "连斩", + nClass = 9, + }, + { + nIcon = 3443, + key = "追魂剑气", + nTime = 60, + szName = "追魂剑气", + nClass = 9, + }, + }, + nLevel = 1, + }, + [8] = { + szName = "斩流剑·灭", + dwID = 14131, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 14024, + nLevel = 2, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 80, + szName = "三环锡杖", + nClass = 9, + }, + }, + }, + [17] = { + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "住相", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "涅槃经", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "紫金钵·镇", + nTime = 0, + szName = "紫金钵·镇", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 14228, + nLevel = 1, + }, + [18] = { + [8] = { + bScreenHead = true, + }, + dwID = 14420, + nLevel = 1, + }, + [5] = { + nLevel = 1, + bMonTarget = true, + dwID = 14124, + szName = "斩流剑·半月", + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "5,一鼓作气;15,叫阵;", + }, + { + szName = "攻击姿态结束", + nClass = 9, + nIcon = 2589, + nTime = 50, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14259, + }, + [20] = { + nLevel = 1, + dwID = 14112, + }, + [21] = { + nLevel = 2, + szName = "剑器舞·内", + [9] = { + bCenterAlarm = true, + }, + dwID = 14771, + }, + [11] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "6,一鼓作气;18,盾牌反震;", + }, + { + szName = "步步紧逼", + nClass = 9, + nIcon = 2133, + nTime = 12, + }, + { + szName = "防御姿态结束", + nClass = 9, + nIcon = 2589, + nTime = 66, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14265, + }, + [22] = { + nLevel = 2, + szName = "剑器舞·外", + [9] = { + bCenterAlarm = true, + }, + dwID = 14770, + }, + [3] = { + dwID = 14092, + tCountdown = { + { + nIcon = 345, + key = "连斩", + nTime = 23, + szName = "连斩", + nClass = 8, + }, + { + nIcon = 3443, + key = "追魂剑气", + nTime = 63, + szName = "追魂剑气", + nClass = 8, + }, + }, + nLevel = 1, + }, + [6] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + szName = "斩流剑·破", + }, + [12] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [7] = { + nLevel = 2, + szName = "斩流剑·落", + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "半月", + nRefresh = 7, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14126, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + szName = "盾牌反震", + nClass = 9, + nIcon = 2589, + nTime = 10, + }, + }, + szName = "盾牌反震", + dwID = 14540, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + [19] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14025, + nLevel = 2, + }, + [15] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2133, + key = "紫金钵", + nTime = 80, + szName = "紫金钵·镇", + nClass = 8, + }, + }, + szName = "紫金钵·镇", + }, + }, + [138] = { + { + [8] = { + bCenterAlarm = true, + }, + nLevel = 2, + dwID = 3718, + tCountdown = { + { + nClass = 8, + szName = "天云挂雷", + nIcon = 13, + nTime = 85, + }, + }, + }, + }, + [233] = { + [13] = { + nLevel = 2, + szName = "七式·踏歌", + tCountdown = { + { + nClass = 8, + nTime = 34, + szName = "缠", + nIcon = 3404, + nFrame = 8, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "12,行舟;20,行舟;28,行舟;", + }, + { + nClass = 8, + szName = "七式·踏歌", + nIcon = 2589, + nTime = 43, + }, + }, + dwID = 13961, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "辩玉掌", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "辩玉掌", + nLevel = 6, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13903, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + dwID = 14586, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "准备QTE", + nTime = 43, + szName = "准备QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "品竹曲", + nTime = 80, + szName = "品竹曲", + nClass = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,幻魔问心曲;322,幻魔问心曲;", + }, + [3] = { + nIcon = 3437, + nRefresh = 165, + nClass = 8, + nTime = "120,音缠;278,音缠;318,音缠;", + }, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "分川手", + nIcon = 2139, + nTime = 25, + }, + }, + dwID = 14147, + }, + [8] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 2, + szName = "一式·行舟", + [9] = { + bCenterAlarm = true, + }, + dwID = 13928, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + tCountdown = { + { + nClass = 8, + szName = "知心火", + nIcon = 327, + nTime = 6, + }, + }, + dwID = 14114, + nLevel = 2, + }, + [10] = { + nLevel = 2, + szName = "一式变·覆舟(穿透)", + [9] = { + bBigFontAlarm = true, + }, + dwID = 15084, + }, + [14] = { + nLevel = 2, + dwID = 13959, + [9] = { + bBigFontAlarm = true, + }, + szName = "八式·月池", + }, + [3] = { + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + nLevel = 2, + dwID = 13913, + }, + [12] = { + tCountdown = { + { + nIcon = 2589, + key = "映日", + nTime = 28, + szName = "映日", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + szName = "四式·映日", + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [11] = { + dwID = 13933, + tCountdown = { + { + nClass = 8, + nIcon = 2589, + key = "行舟", + nTime = "13,行舟;26,行舟;39,行舟;", + }, + { + nIcon = 2589, + key = "二式·登楼", + nTime = 48, + szName = "二式·登楼", + nClass = 8, + }, + }, + nLevel = 1, + szName = "二式·登楼", + }, + }, + [155] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 29, + szName = "红圈出现", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "注意红圈!", + dwID = 4999, + }, + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 66, + szName = "下一次玉石", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4990, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "随机技能", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5133, + }, + [8] = { + dwID = 4457, + nLevel = 1, + }, + [16] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 63, + szName = "火墙", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "注意停手,即将火墙,MT速度拉回仇恨!!", + dwID = 4298, + }, + [17] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "截脉", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "截脉驱散!", + dwID = 4254, + }, + [9] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 12, + szName = "一阳指·二品", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4802, + }, + [18] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 26, + szName = "冰棺", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4195, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 23, + szName = "随机技能", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5131, + }, + [10] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 3, + szName = "击晕·剩余时间", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "近战准备击晕BOSS!", + dwID = 4501, + }, + [11] = { + dwID = 4503, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [3] = { + tCountdown = { + { + nIcon = 13, + nTime = 66, + szName = "下一次玉石", + nRefresh = 10, + nClass = 9, + }, + }, + nLevel = 1, + dwID = 5147, + bCheckLevel = true, + }, + [6] = { + dwID = 4455, + nLevel = 1, + }, + [12] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "火云掌·烧魂灭灵", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "挡好分身!", + dwID = 4385, + }, + [13] = { + [8] = { + bFullScreen = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "冰柱出现", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4343, + }, + [7] = { + dwID = 4456, + nLevel = 1, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "龙王之怒(穿刺)", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4934, + }, + [19] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "点燃", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4193, + }, + [15] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "八部浮屠", + nRefresh = 48, + nClass = 9, + }, + }, + dwID = 4271, + }, + }, + [234] = { + { + [8] = { + bScreenHead = true, + }, + dwID = 14050, + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "追魂剑气", + nIcon = 3443, + nTime = 40, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "32,泣;64,连斩;", + }, + }, + }, + { + dwID = 14052, + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 14092, + }, + [8] = { + nLevel = 2, + szName = "斩流剑·落", + dwID = 14126, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "半月", + nRefresh = 7, + nClass = 9, + }, + }, + }, + [16] = { + szName = "紫金钵·镇", + dwID = 13949, + tCountdown = { + { + nIcon = 2123, + key = "紫金钵", + nTime = 80, + szName = "紫金钵·镇", + nClass = 8, + }, + }, + nLevel = 1, + }, + [17] = { + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 80, + szName = "三环锡杖", + nClass = 9, + }, + }, + dwID = 14024, + nLevel = 2, + }, + [9] = { + nLevel = 1, + szName = "斩流剑·灭", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 2, + dwID = 14025, + }, + [5] = { + nLevel = 1, + dwID = 14055, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "住相", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "涅槃经", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "紫金钵", + nTime = 0, + szName = "紫金钵·镇", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [21] = { + nLevel = 1, + dwID = 14112, + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,一鼓作气;15,叫阵;", + }, + { + nClass = 9, + szName = "攻击姿态结束", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [22] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·内", + }, + [3] = { + dwID = 14278, + tCountdown = { + { + nClass = 9, + key = "龙图炮击", + nTime = 55, + szName = "龙图炮击", + nRefresh = 30, + nIcon = 3293, + nFrame = 8, + }, + { + nIcon = 3293, + key = "炮击", + nTime = "9,第二次炮击;14,第三次炮击;19,第四次炮击;", + nRefresh = 30, + nClass = 9, + }, + }, + nLevel = 3, + }, + [6] = { + nLevel = 1, + bMonTarget = true, + szName = "斩流剑·半月", + dwID = 14124, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,一鼓作气;18,盾牌反震;", + }, + { + nClass = 9, + szName = "步步紧逼", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "防御姿态结束", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + szName = "斩流剑·破", + dwID = 14125, + }, + [14] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [23] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·外", + }, + [19] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14420, + }, + [15] = { + nLevel = 1, + nIcon = 13, + szName = "盾牌反震", + tCountdown = { + { + nClass = 9, + szName = "盾牌反震", + nIcon = 2589, + nTime = 10, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14540, + }, + }, + [203] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + dwID = 13656, + szNote = "远离BOSS四尺", + tCountdown = { + { + nClass = 8, + szName = "幽冥鬼步", + nIcon = 13, + nTime = 18, + }, + }, + }, + }, + [235] = { + [13] = { + szName = "八式·月池", + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13959, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "辩玉掌", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "辩玉掌", + dwID = 13903, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + tCountdown = { + { + nIcon = 2589, + key = "准备QTE", + nTime = 43, + szName = "准备QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "品竹曲", + nTime = 80, + szName = "品竹曲", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,幻魔问心曲;322,幻魔问心曲;", + }, + [3] = { + nIcon = 3437, + nTime = "120,音缠;278,音缠;318,音缠;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + dwID = 14586, + nLevel = 1, + }, + [4] = { + dwID = 14147, + nLevel = 1, + tCountdown = { + { + szName = "分川手·排浪", + nClass = 8, + nIcon = 2139, + nTime = 21, + }, + }, + }, + [8] = { + dwID = 13928, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "一式·行舟", + }, + [9] = { + dwID = 15084, + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + szName = "一式变·覆舟(穿透)", + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14114, + nLevel = 2, + tCountdown = { + { + szName = "知心火", + nClass = 8, + nIcon = 327, + nTime = 6, + }, + }, + }, + [10] = { + szName = "二式·登楼", + dwID = 13933, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "行舟", + nTime = "13,行舟;26,行舟;39,行舟;", + }, + { + nIcon = 2589, + key = "二式·登楼", + nTime = 48, + szName = "二式·登楼", + nClass = 8, + }, + }, + }, + [3] = { + nLevel = 3, + szName = "分川手·排浪(穿透)", + [9] = { + bCenterAlarm = true, + }, + dwID = 15080, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 13913, + nLevel = 2, + }, + [12] = { + tCountdown = { + { + nFrame = 8, + nTime = 34, + szName = "缠", + nClass = 8, + nIcon = 3404, + }, + { + nIcon = 2589, + nClass = 8, + nTime = "12,行舟;20,行舟;28,行舟;", + }, + { + szName = "七式·踏歌", + nClass = 8, + nIcon = 2589, + nTime = 43, + }, + }, + [8] = { + bFullScreen = true, + bScreenHead = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + szName = "七式·踏歌", + nLevel = 2, + }, + [11] = { + nLevel = 2, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + tCountdown = { + { + nIcon = 2589, + key = "映日", + nTime = 28, + szName = "映日", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "四式·映日", + }, + }, + [204] = { + { + dwID = 13775, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "DPS停手", + nTime = "15,DPS停手;80,DPS停手;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "黑风破岩斩", + nTime = "48,黑风破岩斩;112,黑风破岩斩;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "正面AOE", + nTime = "35,正面AOE;68,正面AOE;99,正面AOE;136,正面AOE;", + nRefresh = 130, + nClass = 8, + }, + }, + }, + { + nIcon = 13, + nLevel = 1, + szName = "反击", + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + szNote = "输出输出输出输出", + dwID = 13808, + }, + { + nLevel = 1, + dwID = 13777, + }, + }, + [236] = { + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nClass = 8, + szName = "追魂剑气", + nIcon = 3443, + nTime = 40, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "32,泣;70,连斩;", + }, + }, + dwID = 14050, + nLevel = 1, + }, + { + tCountdown = { + { + nClass = 9, + key = "龙图炮击", + nTime = 55, + szName = "龙图炮击", + nRefresh = 30, + nFrame = 8, + nIcon = 3293, + }, + { + nIcon = 3293, + key = "炮击", + nTime = "9,第二次炮击;14,第三次炮击;19,第四次炮击;", + nRefresh = 30, + nClass = 9, + }, + }, + nLevel = 3, + dwID = 14278, + }, + [4] = { + nLevel = 1, + dwID = 14092, + }, + [8] = { + nLevel = 2, + szName = "斩流剑·落", + dwID = 14126, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "半月", + nRefresh = 7, + nClass = 9, + }, + }, + }, + [16] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [17] = { + nLevel = 1, + nIcon = 13, + szName = "盾牌反震", + tCountdown = { + { + nClass = 9, + szName = "盾牌反震", + nIcon = 2589, + nTime = 10, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14540, + }, + [9] = { + nLevel = 1, + szName = "斩流剑·灭", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + szName = "紫金钵·镇", + dwID = 13949, + tCountdown = { + { + nIcon = 2123, + key = "紫金钵", + nTime = 86, + szName = "紫金钵·镇", + nClass = 8, + }, + }, + nLevel = 1, + }, + [5] = { + nLevel = 1, + dwID = 14055, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 4, + szNote = "躲开BOSS面向!", + dwID = 14026, + }, + [21] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14420, + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,一鼓作气;15,叫阵;", + }, + { + nClass = 9, + szName = "攻击姿态结束", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [22] = { + tCountdown = { + { + nIcon = 2133, + nTime = 33, + szName = "住相", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "涅槃经", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "紫金钵", + nTime = 0, + szName = "紫金钵·镇", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [3] = { + dwID = 14052, + nLevel = 1, + }, + [6] = { + nLevel = 1, + bMonTarget = true, + szName = "斩流剑·半月", + dwID = 14124, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,一鼓作气;18,盾牌反震;", + }, + { + nClass = 9, + szName = "步步紧逼", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "防御姿态结束", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [24] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·内", + }, + [25] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "剑器舞·外", + }, + [13] = { + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14264, + }, + [26] = { + dwID = 14933, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + szName = "斩流剑·破", + dwID = 14125, + }, + [14] = { + szName = "无坚不摧一", + dwID = 14262, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [27] = { + dwID = 14932, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [23] = { + nLevel = 1, + dwID = 14112, + }, + [19] = { + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 87, + szName = "三环锡杖", + nClass = 9, + }, + }, + dwID = 14024, + nLevel = 2, + }, + [15] = { + szName = "无坚不摧二", + dwID = 14263, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 16, + }, + }, + [205] = { + [6] = { + nLevel = 4, + dwID = 9454, + szName = "断骨", + szNote = "★远离10尺★远离10尺★", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 8, + szName = "分筋", + nClass = 9, + nFrame = 2, + }, + }, + }, + [2] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [3] = { + nLevel = 3, + szName = "虎啸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "准备排火", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 82, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "火龙机雷", + nTime = 22, + szName = "火龙机雷", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "摧城一击", + nRefresh = 5, + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 13, + key = "黑油圈", + nTime = 30, + szName = "黑油圈", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "追击火龙", + nTime = 11, + szName = "追击火龙", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "虎啸(穿透)", + nTime = 11, + szName = "虎啸(穿透)", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 1, + dwID = 13788, + szName = "分筋", + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "飞斧气场", + nRefresh = 10, + nClass = 9, + }, + }, + }, + }, + [237] = { + { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "准备QTE", + nTime = 43, + szName = "准备QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "品竹曲", + nTime = 80, + szName = "品竹曲", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,幻魔问心曲;322,幻魔问心曲;", + }, + [3] = { + nIcon = 3437, + nTime = "120,音缠;278,音缠;318,音缠;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + dwID = 14586, + nLevel = 1, + }, + [4] = { + dwID = 14147, + nLevel = 1, + tCountdown = { + { + szName = "分川手·排浪", + nClass = 8, + nIcon = 2139, + nTime = 24, + }, + }, + }, + [8] = { + nLevel = 4, + [9] = { + bBigFontAlarm = true, + }, + dwID = 15271, + }, + [16] = { + szName = "八式·月池", + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13959, + }, + [17] = { + [8] = { + bScreenHead = true, + }, + nLevel = 4, + dwID = 13935, + tCountdown = { + { + nClass = 8, + szName = "浊水花开", + nIcon = 2589, + nTime = 12, + }, + }, + }, + [9] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14114, + nLevel = 2, + tCountdown = { + { + szName = "知心火", + nClass = 8, + nIcon = 327, + nTime = 6, + }, + }, + }, + [10] = { + dwID = 13928, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "一式·行舟", + }, + [11] = { + dwID = 15084, + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + szName = "一式变·覆舟(穿透)", + }, + [3] = { + nLevel = 3, + szName = "分川手·排浪(穿透)", + [9] = { + bCenterAlarm = true, + }, + dwID = 15080, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 13913, + nLevel = 2, + }, + [12] = { + szName = "二式·登楼", + dwID = 13933, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "行舟", + nTime = "13,行舟;26,行舟;39,行舟;", + }, + { + nIcon = 2589, + key = "二式·登楼", + nTime = 48, + szName = "二式·登楼", + nClass = 8, + }, + }, + }, + [13] = { + nLevel = 2, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + tCountdown = { + { + nIcon = 2589, + nTime = 36, + szName = "映日", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 14, + szName = "雾散(倒计时结束二段跳)", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "四式·映日", + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "辩玉掌", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "辩玉掌", + dwID = 13903, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + [14] = { + nLevel = 4, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 238, + }, + dwID = 13942, + szName = "五式·雾散", + }, + [15] = { + tCountdown = { + { + nFrame = 8, + nTime = 34, + szName = "缠", + nClass = 8, + nIcon = 3404, + }, + { + nIcon = 2589, + nClass = 8, + nTime = "12,行舟;20,行舟;28,行舟;", + }, + { + szName = "七式·踏歌", + nClass = 8, + nIcon = 2589, + nTime = 43, + }, + }, + [8] = { + bFullScreen = true, + bScreenHead = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + szName = "七式·踏歌", + nLevel = 2, + }, + }, + [206] = { + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + key = "断浪斩(流血)", + nTime = 21, + szName = "断浪斩(流血)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9393, + }, + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + key = "剁山劈(破甲)", + nTime = 21, + szName = "剁山劈(破甲)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9392, + }, + [4] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "★躲避断浪气劲★远离★", + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "能量输入", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10335, + }, + [16] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "禁断", + nTime = 24, + szName = "禁断", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + key = "断长生", + nTime = 49, + szName = "断长生", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [17] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [9] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 6, + szName = "圣火焚城", + dwID = 10337, + }, + [18] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [5] = { + nLevel = 2, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 31, + 31, + }, + dwID = 9355, + szNote = "★快打断★快打断★", + }, + [10] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3443, + nTime = 12, + szName = "玄冰一指", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [3] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + key = "恐惧debuff", + nTime = 21, + szName = "恐惧debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "★注意躲避★", + dwID = 10347, + }, + [13] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "和弦总章(穿透)", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [7] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "献祭debuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,下一次冷(赤)雨;", + }, + }, + }, + [14] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "灌血掌", + nTime = 21, + szName = "灌血掌", + nFrame = 8, + nClass = 8, + }, + { + nClass = 8, + szName = "回龙掌", + nIcon = 13, + nTime = 34, + }, + }, + dwID = 13197, + }, + [15] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + }, + [175] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 65, + szName = "准备QTE", + nRefresh = 10, + nClass = 9, + }, + }, + bCheckLevel = true, + dwID = 8466, + szName = "令狐伤QTE", + [9] = { + bBigFontAlarm = true, + }, + nIcon = 332, + }, + }, + [178] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 74, + szName = "分骨", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 8657, + }, + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 70, + szName = "千山鸟鸣", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8658, + }, + [4] = { + dwID = 8903, + nLevel = 1, + }, + [8] = { + dwID = 8745, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 8072, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [17] = { + dwID = 9026, + nLevel = 1, + }, + [9] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + szNote = "注意躲避!", + dwID = 8730, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "幽冥气劲", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9147, + }, + [5] = { + dwID = 8757, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + dwID = 8716, + nLevel = 1, + }, + [20] = { + nLevel = 2, + bCheckLevel = true, + dwID = 8082, + szName = "幽冥穿透", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "下一次幽冥双刃", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [21] = { + nLevel = 2, + szName = "幽冥狂暴", + dwID = 8083, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "下一次幽冥双刃", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [11] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8717, + }, + [22] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + szNote = "打断无名之影读条!!!!", + dwID = 8907, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "逐风飞雪斩", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8664, + }, + [6] = { + dwID = 8845, + nLevel = 1, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8739, + }, + [13] = { + dwID = 8724, + nLevel = 1, + }, + [7] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 21, + szName = "贪狼噬日", + nRefresh = 20, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8744, + }, + [14] = { + dwID = 8725, + nLevel = 1, + }, + [19] = { + nLevel = 1, + bCheckLevel = true, + dwID = 8082, + szName = "幽冥双刃", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 14, + szName = "幽冥双刃(穿透)", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [15] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 50, + szName = "阴阳易转", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8891, + }, + }, + [176] = { + [13] = { + dwID = 8311, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + }, + [7] = { + [8] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "小狼出现", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 70, + szName = "狼之怒", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8127, + }, + [1] = { + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "云卷烟", + nRefresh = 10, + nClass = 8, + }, + }, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8176, + szName = "云烟卷", + nRelScrutinyType = 3, + nLevel = 2, + }, + [2] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 49, + szName = "下一次QTE", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8204, + }, + [4] = { + nLevel = 2, + [8] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + bCheckLevel = true, + dwID = 8129, + tCountdown = { + { + nIcon = 13, + nRefresh = 55, + nClass = 8, + nTime = "25,藏离精失;60,下一次藏离精失;", + }, + }, + }, + [8] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "空连湮标记圈", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8003, + }, + [15] = { + dwID = 8295, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "亦幻亦真", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 90, + nClass = 8, + nTime = "95,黑齿折磨;", + }, + }, + dwID = 8194, + }, + [5] = { + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "骑兵冲锋", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 60, + szName = "撼岳", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 8450, + bCheckLevel = true, + }, + [10] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 150, + szName = "【令狐伤】火箭雨", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 9, + nTime = "90,【苏曼莎】火箭雨;", + }, + }, + dwID = 8440, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "穿心劫", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8331, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 8278, + szNote = "被注视者保持8-15尺", + }, + [6] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 19, + szName = "支援", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8380, + }, + [12] = { + nLevel = 1, + szNote = "★驱散★驱散★", + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8226, + }, + [14] = { + nLevel = 2, + nIcon = 332, + bCheckLevel = true, + dwID = 8466, + szName = "令狐伤QTE::25", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 90, + szName = "令狐伤QTE", + nRefresh = 10, + nClass = 9, + }, + }, + }, + }, + [200] = { + { + dwID = 13897, + [9] = { + bCenterAlarm = true, + bBigFontAlarm = true, + }, + nLevel = 1, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + dwID = 13891, + }, + }, + [228] = { + { + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13796, + }, + }, + [72] = { + [6] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 18, + szName = "痛血指", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2094, + }, + [2] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 14, + szName = "逐莲升华", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2777, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 4, + dwID = 2124, + }, + [1] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "恸哭霜落术", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + dwID = 3080, + }, + [4] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 15, + szName = "破剑八刀", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2118, + }, + [5] = { + [8] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 37, + szName = "震地颤尘锤", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2809, + }, + }, + [-1] = { + [4] = { + tKungFu = { + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + ["SKILL#10002"] = true, + }, + nScrutinyType = 2, + dwID = 411, + [9] = { + bCenterAlarm = true, + }, + nLevel = 6, + }, + [13] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13954, + tCountdown = { + { + nClass = 9, + szName = "开始钓鱼", + nIcon = 2672, + nTime = 25, + }, + }, + }, + [7] = { + nLevel = 4, + bMonTarget = true, + dwID = 551, + [9] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + nScrutinyType = 2, + }, + [1] = { + nLevel = 1, + nScrutinyType = 2, + dwID = 2220, + [9] = { + bCenterAlarm = true, + bTeamChannel = true, + }, + bMonTarget = true, + }, + [2] = { + dwID = 3985, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [15] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13953, + tCountdown = { + { + nClass = 9, + szName = "开始钓鱼", + nIcon = 2672, + nTime = 25, + }, + }, + }, + [8] = { + [8] = { + bScreenHead = true, + }, + dwID = 7381, + nLevel = 1, + }, + [16] = { + nLevel = 24, + szName = "雪中行", + nIcon = 4519, + dwID = 6135, + }, + [9] = { + tCountdown = { + { + nClass = 8, + szName = "准备领取高级糖果", + nIcon = 13, + nTime = 121, + }, + }, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + szName = "高级糖果放材料", + col = { + 182, + 0, + 255, + }, + nLevel = 1, + dwID = 13910, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + dwID = 371, + }, + [10] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + szName = "快快领取高级糖果", + tCountdown = { + { + nClass = 8, + szName = "下一次制作高级糖果", + nIcon = 13, + nTime = 60, + }, + }, + col = { + 182, + 0, + 255, + }, + dwID = 13912, + }, + [3] = { + dwID = 252, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [11] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 13876, + szName = "放材料", + }, + [6] = { + dwID = 2235, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [12] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 13879, + szName = "领取", + }, + [14] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13952, + tCountdown = { + { + nClass = 9, + szName = "开始钓鱼", + nIcon = 2672, + nTime = 25, + }, + }, + }, + }, + [171] = { + [6] = { + [8] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "骨牢", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5458, + }, + [2] = { + nLevel = 2, + nIcon = 3441, + dwID = 5467, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "孤雁唳", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 3432, + dwID = 6246, + }, + [1] = { + nIcon = 3430, + [8] = { + bTeamChannel = true, + }, + dwID = 6245, + tCountdown = { + { + nIcon = 13, + nTime = 16, + szName = "裂云枪", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "请勿在BOSS正面!", + nLevel = 1, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 48, + szName = "下一次点名", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 3412, + dwID = 5469, + }, + [5] = { + nLevel = 1, + [8] = { + bTeamChannel = true, + }, + dwID = 5459, + szNote = "注意躲避!", + tCountdown = { + { + nIcon = 13, + nTime = 47, + szName = "掷锤", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 5346, + }, + }, + }, + CIRCLE = { + [122] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50823, + szNote = "唐门事件", + }, + }, + [134] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "乌蒙贵", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + key = "霸王蛇", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 40, + bEnable = true, + }, + }, + key = "毒蛇图腾", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "眼镜蛇毒雾", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "雷球", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "千秋子·雷球", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "贴地电流", + bDrawName = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "雷神·贴地电流", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "祭龙潭傀儡", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "炮弹", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "雷神·炮弹", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 12, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "炼蛇", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "万毒奔腾", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "陆寻", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "南之雷神", + bEnable = true, + }, + }, + [136] = { + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "汪莽", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙暗卫", + bEnable = true, + }, + [1] = { + dwType = 3, + key = "霹雳堂火器师", + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙弓箭手", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙重弩", + bEnable = true, + }, + }, + [138] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4.5, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "霹雳堂火器师", + bDrawName = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙暗卫", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "汪莽", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙弓箭手", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙重弩", + bEnable = true, + }, + }, + [140] = { + [7] = { + dwType = 3, + key = "段玉", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "3-中冲剑(黄)", + bEnable = true, + }, + [1] = { + dwType = 3, + bWhisperChat = false, + key = "龙象气劲", + bTarget = true, + bDrawLineSelf = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [2] = { + dwType = 3, + key = "萧沙", + bTarget = true, + bScreenHead = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "段俭魏", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "6-少泽剑(紫)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "段风荷", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "2-商阳剑(橙)", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "段永安", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "1-少商剑(红)", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "段灵", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "5-少冲剑(蓝)", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "泰崇傣", + bTarget = true, + bEnable = true, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 0, + }, + bBorder = false, + nAngle = 80, + bEnable = false, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [6] = { + dwType = 3, + key = "段平南", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "4-关冲剑(绿)", + bEnable = true, + }, + }, + [148] = { + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "木人", + bEnable = true, + }, + }, + [-9] = { + [27] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "男撞", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48406, + }, + [38] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 51938, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "斩流剑·半月", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "斩流剑·落", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "斩流剑·聚", + }, + [6] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "破敌", + bDrawName = false, + }, + [7] = { + dwType = 5, + key = "天青石矿", + bDoodadLine = true, + }, + [8] = { + dwType = 5, + key = "烟雨石矿", + bDoodadLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48545, + szNote = "斩流剑·破", + }, + [12] = { + dwType = 5, + bDoodadLine = true, + key = "玉虚冰壶", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "小极·玉虚冰壶", + bEnable = true, + }, + [14] = { + dwType = 5, + bDoodadLine = true, + key = "无量冰晶", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "小极·无量冰晶", + bEnable = true, + }, + [16] = { + dwType = 5, + bDoodadLine = true, + key = "落雪冰花", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "小极·落雪冰花", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "涅槃经", + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [28] = { + dwType = 3, + key = "剑气旋窝", + bTarget = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bScreenHead = false, + }, + [32] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51344, + szNote = "万籁齐喑", + }, + [40] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 255, + 255, + 255, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + szNote = "冰霜地面", + }, + [48] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [33] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + key = 51342, + szNote = "震林碎山", + }, + [41] = { + dwType = 5, + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 0, + }, + nAngle = 55, + bBorder = true, + bEnable = true, + }, + }, + key = 6074, + szNote = "震林碎山", + }, + [49] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + szNote = "冽霜", + }, + [17] = { + dwType = 3, + key = 63781, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "涅槃经", + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "男撞", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [29] = { + dwType = 5, + key = "白木", + }, + [34] = { + dwType = 5, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + nAngle = 40, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [42] = { + dwType = 3, + bDrawName = false, + key = "小猫", + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "斩流剑·破", + bDrawName = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "斩流剑·半月", + }, + [13] = { + dwType = 5, + bDoodadLine = true, + key = "华山冰锥", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "小极·华山冰锥", + bEnable = true, + }, + [15] = { + dwType = 5, + bDoodadLine = true, + key = "寒潭冰针", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "小极·寒潭冰针", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "涅槃经", + }, + [22] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "涅槃经", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [26] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [30] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "十三娘气场", + }, + [36] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = "阴阳之力", + }, + [44] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [35] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + }, + [46] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + }, + [39] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6079, + }, + [43] = { + dwType = 5, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 6075, + szNote = "万籁齐喑", + }, + [37] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 51582, + }, + [45] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + szNote = "冽霜", + }, + [31] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51354, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 48418, + }, + [19] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "涅槃经", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "涅槃经", + }, + [47] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + }, + }, + [164] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "探头探脑的老鼠", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "乱窜的老鼠", + bEnable = true, + }, + [4] = { + dwType = 3, + bEnable = true, + key = "祆教使者", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + bDrawLineSelf = false, + bScreenHead = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "碧落之炎", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "何莘涯", + bEnable = true, + }, + [17] = { + dwType = 3, + bDrawLineSelf = false, + key = "随机宝箱", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [9] = { + dwType = 3, + bScreenHead = true, + key = "无名", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bWhisperChat = true, + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "暗母祭司", + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑圣", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "净土", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "屋顶漏洞", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "炫父祭司", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "针沼", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "干扰炸弹", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "红莲之火", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "狼牙骑兵", + bEnable = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "球", + bEnable = true, + }, + }, + [176] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "金蛇剑风", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑暗治愈虚拟体", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + }, + key = "冲锋骑兵", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "破釜沉舟", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑齿元佑", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "断罪舞者", + bTarget = true, + bDrawLine = true, + bEnable = true, + }, + [15] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + key = "苏曼莎", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "冰雨寒息", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "腐骨", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 27365, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "令狐伤(分身)", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "空连湮标记圈", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "地龙剑吼", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "旋风武器", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "盘蛇剑影", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [14] = { + dwType = 3, + key = "令狐伤", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 80, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + }, + [178] = { + [15] = { + dwType = 3, + key = "阵法·巽", + bDrawName = true, + szNote = "风(巽)", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "阵法·坎", + bDrawName = true, + szNote = "水(坎)", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "无名", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "阵法·震", + bDrawName = true, + szNote = "雷(震)", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "精准炮台", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "十二相·丑", + bTarget = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 90, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "丑牛", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "阵法·乾", + bDrawName = true, + szNote = "天(乾)", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "地字一号", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "阵法·坤", + bDrawName = true, + szNote = "地(坤)", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "十二相·午", + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "午马", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "阵法·兑", + bDrawName = true, + szNote = "泽(兑)", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "强击炮台", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "阵法·艮", + bDrawName = true, + szNote = "山(艮)", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "十二相·戌", + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + szNote = "戌狗", + bEnable = true, + }, + [12] = { + dwType = 3, + key = "阵法·离", + bDrawName = true, + szNote = "火(离)", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "毒鸩", + bEnable = true, + }, + }, + [182] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "石麒麟", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "麟火", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "探雪", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "岚剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "分身★千切子", + bEnable = true, + }, + [16] = { + dwType = 3, + key = "剑俑", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 45, + bEnable = true, + }, + }, + bDrawName = false, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "戟俑", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "谷剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "谷风★反弹", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "亡者气息", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 27698, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火牢花雨", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "冬剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "北风★白龙剑走", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑色能量体", + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白色能量体", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "白龙剑风", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 30, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "圆弧劈", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 153, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 27717, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "令狐伤", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36241, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "令狐伤(分身)", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "地龙剑吼", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "虚龙剑", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "盘蛇剑影", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [19] = { + dwType = 5, + key = "兵俑残骸石堆", + tCircles = { + { + nRadius = 3, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = "安禄山", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + }, + [184] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "踏霆车", + bEnable = true, + }, + { + dwType = 3, + key = 30507, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "落石", + bEnable = true, + }, + { + dwType = 3, + key = 30398, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 100, + bEnable = true, + }, + }, + szNote = "白起", + bEnable = true, + }, + }, + [192] = { + [15] = { + dwType = 3, + key = 37043, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "毒血圈", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "灌血掌", + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [7] = { + dwType = 3, + key = "音波球", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + key = 37271, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "灌血掌终点", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "安雨", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "阴极", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·琵琶", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 37042, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "魔血圈", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·箜篌", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灵魂聚力", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "疾风冲击", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [3] = { + dwType = 3, + key = "阳极", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "漫天雪舞", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鲜血聚力", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "史思明", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "军资箱", + bEnable = true, + }, + }, + [198] = { + [13] = { + dwType = 3, + key = 40742, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "投石车落点", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 40714, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "狼牙投石车", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "军需物资", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "田布戈", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 40645, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火圈", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "狼牙攻城队长", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "火龙摧城", + bTarget = false, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 40717, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "朝曦门飞石", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 40584, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油圈", + bEnable = true, + }, + [14] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 40583, + bDrawLine = true, + szNote = "追击火龙点名判定", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 40646, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "飞斧气场", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "狼牙号角手", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + dwType = 3, + key = 40585, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油燃烧圈", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "追击火龙", + bScreenHead = true, + dwType = 3, + key = 40587, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [200] = { + [7] = { + dwType = 3, + key = 43935, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵土", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "水柱", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 43929, + bDrawName = true, + szNote = "土", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 43925, + bDrawName = true, + szNote = "水", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 43934, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵火", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 43933, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵水", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 43924, + bDrawName = true, + szNote = "木", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 43932, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵木", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 43928, + bDrawName = true, + szNote = "火", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 43921, + bDrawName = true, + szNote = "金", + bEnable = true, + }, + [11] = { + dwType = 3, + key = 43931, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵金", + bEnable = true, + }, + }, + [204] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "植尸将", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "刀光", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "地裂", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 145, + bBorder = true, + bEnable = true, + }, + }, + key = "秦秀", + }, + [4] = { + dwType = 5, + key = "弹药", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = false, + bDrawName = true, + }, + [5] = { + dwType = 3, + key = "天一余孽", + bTarget = false, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + }, + }, + [206] = { + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "军资箱", + bEnable = true, + }, + { + dwType = 3, + key = "阿独鹿", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "可蒙", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bEnable = true, + }, + [8] = { + dwType = 3, + key = "阴极", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "双生协作球·阴", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "双生协作球·阳", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = false, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "灵魂聚力", + bEnable = true, + }, + [18] = { + dwType = 3, + key = "史思明", + bTarget = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 15, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = "断浪气劲", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = false, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "鲜血聚力", + bEnable = true, + }, + [20] = { + dwType = 3, + key = "赤狼卫", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + [21] = { + dwType = 3, + key = "盲眼血奴", + bWhisperChat = false, + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·琵琶", + bEnable = true, + }, + [22] = { + dwType = 3, + bDrawLine = true, + key = "魄衣血仆", + bTarget = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bFlash = false, + bEnable = true, + }, + [3] = { + dwType = 3, + key = "乌素尔", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "安雨", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·箜篌", + bEnable = true, + }, + [24] = { + dwType = 3, + key = 42182, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "魔血圈", + bEnable = true, + }, + [25] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "“恶修罗”端木正我", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "音波球", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [26] = { + dwType = 3, + key = 42190, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "灌血掌终", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "42173", + bDrawName = true, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "阳极", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "漫天雪舞", + bEnable = true, + }, + [27] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "血牢", + bEnable = true, + }, + [23] = { + dwType = 3, + key = 42183, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "毒血圈", + bEnable = true, + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灌血掌", + bEnable = true, + }, + [15] = { + dwType = 3, + key = "疾风冲击", + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + }, + [212] = { + { + dwType = 3, + key = "阿独鹿", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + { + dwType = 3, + key = "乌素尔", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "断浪气劲", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·琵琶", + bEnable = true, + }, + [16] = { + dwType = 3, + bWhisperChat = false, + key = "盲眼血奴", + bTarget = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "魄衣血仆", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + bFlash = false, + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·箜篌", + bEnable = true, + }, + [18] = { + dwType = 3, + key = 42718, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "灌血掌终点", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "安雨", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "音波球", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [20] = { + dwType = 3, + key = 37043, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "毒血圈(瞎子)", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "漫天雪舞", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "可蒙", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "阳极", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "疾风冲击", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "史思明", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "阴极", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灌血掌", + bEnable = true, + }, + [19] = { + dwType = 3, + key = 42711, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "毒血圈", + bEnable = true, + }, + [15] = { + dwType = 3, + key = "赤狼卫", + bTarget = true, + bDrawLineSelf = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + }, + [214] = { + { + dwType = 3, + key = 45196, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "重置", + bDrawName = true, + }, + { + dwType = 3, + key = 45195, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "加速", + bDrawName = true, + }, + [4] = { + dwType = 3, + bDrawName = false, + key = "无神", + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 9, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钟叔", + }, + }, + [216] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "流民", + }, + }, + [220] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "屈焰阳", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "森九岚", + }, + [4] = { + dwType = 3, + key = 44544, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "斩流剑·破", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫队副", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "李璘", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "八荒阵眼", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "李玚", + }, + [18] = { + dwType = 3, + key = "飞花蝶舞", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫", + }, + [10] = { + dwType = 3, + bDrawName = false, + key = "一鼓作气", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bFlash = false, + bScreenHead = true, + }, + [20] = { + dwType = 3, + key = 43124, + bDrawName = true, + szNote = "男撞", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑墙", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "仲虚念", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 44553, + szNote = "斩流剑·半月", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫队副", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "紫金钵", + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "涅槃经", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "三环锡杖", + }, + [19] = { + dwType = 3, + key = 43123, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "苏十三娘", + }, + }, + [222] = { + [7] = { + dwType = 3, + key = 43935, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵土", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "水柱", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 43929, + bDrawName = true, + szNote = "土", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 43925, + bDrawName = true, + szNote = "水", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 43934, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵火", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 43933, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵水", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 43924, + bDrawName = true, + szNote = "木", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 43932, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵木", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 43928, + bDrawName = true, + szNote = "火", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 43921, + bDrawName = true, + szNote = "金", + bEnable = true, + }, + [11] = { + dwType = 3, + key = 43931, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "御阵金", + bEnable = true, + }, + }, + [224] = { + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "看舞", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "崖剑", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "箭矢", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "高力士", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "旋转冰晶", + }, + }, + [228] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 128, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46742, + szNote = "王者", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "悟影", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "双针定阳", + }, + [4] = { + dwType = 3, + key = 46737, + bDrawName = false, + szNote = "剑爆-圣者", + tCircles = { + { + nRadius = 5.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46741, + szNote = "圣者", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46708, + szNote = "千击", + }, + [5] = { + dwType = 3, + bDrawName = true, + key = 46721, + szNote = "答案:211-圣者", + }, + [3] = { + dwType = 3, + key = 46738, + bDrawName = false, + szNote = "剑爆-王者", + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [6] = { + dwType = 3, + bDrawName = true, + key = 46732, + szNote = "答案:121-王者", + }, + }, + [230] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "火", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + key = "知心火控制", + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池·幻", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔附体", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "可人", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "毛毛", + }, + [5] = { + dwType = 3, + key = "莫雨", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李白", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "音缠", + }, + [6] = { + dwType = 3, + key = "知心火", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑气旋涡", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "青莲子剑", + }, + }, + [232] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47435, + szNote = "屈焰阳", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "森九岚", + }, + [4] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "斩流剑·破", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫队副", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "涅槃经", + }, + [17] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "涅槃经", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "涅槃经", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "斩流剑·落", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫队副", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "李璘", + }, + [21] = { + dwType = 3, + key = "飞花蝶舞", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李玚", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "八荒阵眼", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "斩流剑·半月", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "斩流剑·聚", + }, + [12] = { + dwType = 3, + bDrawLine = true, + key = "一鼓作气", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "男撞", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "仲虚念", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "紫金钵", + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑墙", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "苏十三娘", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "三环锡杖", + }, + }, + [234] = { + { + dwType = 3, + key = 48269, + bDrawName = false, + szNote = "屈焰阳", + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + { + dwType = 3, + key = 48381, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "炮击", + bDrawName = false, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "森九岚", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫队副", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "三环锡杖", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48306, + szNote = "涅槃经", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "苏十三娘", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48323, + szNote = "斩流剑·半月", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫队副", + }, + [20] = { + dwType = 3, + key = "飞花蝶舞", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "八荒阵眼", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李玚", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑墙", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48405, + szNote = "火圈", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48316, + szNote = "破敌", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "一鼓作气", + bTarget = true, + bDrawName = false, + bDrawLine = true, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 48278, + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "男撞", + bDrawName = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "仲虚念", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫", + }, + [14] = { + dwType = 3, + key = 48757, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "卍字禅", + bDrawName = false, + }, + [23] = { + dwType = 3, + key = 48277, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "李璘", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "紫金钵", + }, + }, + [236] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48481, + szNote = "屈焰阳", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "森九岚", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48555, + szNote = "炮击", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "斩流剑·聚", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50154, + szNote = "卍字禅", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48582, + szNote = "涅槃经", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫队副", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "三环锡杖", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48578, + szNote = "斩流剑·破敌", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫队副", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "苏十三娘", + }, + [21] = { + dwType = 3, + key = "李璘", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bDrawLine = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫", + }, + [22] = { + dwType = 3, + key = "飞花蝶舞", + bTarget = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [3] = { + dwType = 3, + key = 48658, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "火圈", + bDrawName = false, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48545, + szNote = "斩流剑·半月", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫", + }, + [24] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑墙", + }, + [25] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48525, + szNote = "女撞", + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 30, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李玚", + }, + [26] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48526, + szNote = "男撞", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "斩流剑·落", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "一鼓作气", + bTarget = true, + bDrawName = false, + bDrawLine = true, + bFlash = false, + bScreenHead = true, + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "八荒阵眼", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "紫金钵", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 15, + bBorder = true, + bEnable = true, + }, + }, + key = "仲虚念", + }, + }, + [60] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "木人", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + }, + [242] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + szNote = "冰面", + }, + [2] = { + bTarget = true, + bDrawName = false, + szNote = "龙卷风", + bEmployer = false, + dwType = 3, + key = 51346, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = false, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51345, + szNote = "气场", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51255, + szNote = "星落云散", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "宫天蝉", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "雨卓承", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51394, + szNote = "冰块", + }, + }, + [244] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51649, + szNote = "冰面", + }, + [2] = { + dwType = 3, + key = 51619, + bTarget = true, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "龙卷风", + bDrawLine = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51618, + szNote = "气场", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51600, + szNote = "星落云散", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "宫天蝉", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "雨卓承", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51665, + szNote = "冰块", + }, + }, + [131] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "木人", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + }, + [133] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "万毒奔腾", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "陆寻", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "南之雷神", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "贴地电流", + bDrawName = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "雷神·贴地电流", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "祭龙潭傀儡", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "眼镜蛇毒雾", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "雷球", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "千秋子·雷球", + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 12, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "炼蛇", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "炮弹", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "雷神·炮弹", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "乌蒙贵", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + key = "霸王蛇", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 40, + bEnable = true, + }, + }, + key = "毒蛇图腾", + bEnable = true, + }, + }, + [68] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "逐莲弹", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "被封的重力球", + bEnable = true, + }, + }, + [69] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "逐莲弹", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "被封的重力球", + bEnable = true, + }, + }, + [70] = { + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "被封的重力球", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "逐莲弹", + bEnable = true, + }, + }, + [72] = { + { + dwType = 3, + key = "血玉", + bDrawName = true, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "血玉", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "逐莲弹", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "被封的重力球", + bEnable = true, + }, + }, + [73] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "牡丹", + bEnable = true, + }, + }, + [147] = { + [6] = { + dwType = 3, + key = "易爆的滚石", + tCircles = { + { + nRadius = 10, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·滚石", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 18138, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·雷神", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "冰冻", + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·冰冻", + bEnable = true, + }, + [1] = { + dwType = 3, + key = 18141, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·真·尸罐", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "解除无敌", + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·解除无敌", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 18695, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "试练·五行易伤", + bEnable = true, + }, + }, + [155] = { + [13] = { + dwType = 3, + key = "狱炎杀圈", + bTarget = true, + tCircles = { + { + nRadius = 3, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [7] = { + dwType = 3, + key = "泰崇傣", + bTarget = true, + bScreenHead = true, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 0, + }, + bBorder = false, + nAngle = 80, + bEnable = false, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [1] = { + dwType = 3, + key = "段永安", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "1-少商剑(红)", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "段风荷", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "2-商阳剑(橙)", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "段平南", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "4-关冲剑(绿)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 21362, + bDrawName = true, + tCircles = { + { + nRadius = 20, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + szNote = "李倓分身", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 21374, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 0.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "金龙·头", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "段灵", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "5-少冲剑(蓝)", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "龙象气劲", + bWhisperChat = false, + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 255, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bDrawLineSelf = false, + bEnable = true, + }, + [14] = { + dwType = 3, + key = "萧沙", + bTarget = true, + bEnable = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [3] = { + dwType = 3, + key = "段玉", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "3-中冲剑(黄)", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "段俭魏", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "6-少泽剑(紫)", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 40, + 140, + 218, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "散射弩手", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "宫廷神射手", + bEnable = true, + }, + }, + [165] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "球", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "狼牙骑兵", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "针沼", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "炫父祭司", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "何莘涯", + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "随机宝箱", + bTarget = false, + bDrawLineSelf = false, + bDrawName = true, + bDrawLine = false, + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "暗母祭司", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "净土", + bEnable = true, + }, + [10] = { + dwType = 3, + bScreenHead = true, + key = "祆教使者", + bTarget = true, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + bDrawLineSelf = false, + bDrawLine = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "屋顶漏洞", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "干扰炸弹", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "碧落之炎", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "乱窜的老鼠", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "探头探脑的老鼠", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "红莲之火", + bEnable = true, + }, + [14] = { + dwType = 3, + bEnable = true, + key = "无名", + bTarget = true, + bWhisperChat = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑圣", + bEnable = true, + }, + }, + [175] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "破釜沉舟", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "断罪舞者", + bTarget = true, + bDrawLine = true, + bEnable = true, + }, + [1] = { + dwType = 3, + bEnable = true, + bWhisperChat = true, + bTarget = true, + key = "苏曼莎", + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [2] = { + dwType = 3, + key = "令狐伤", + bTarget = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 80, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "盘蛇剑影", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑暗治愈虚拟体", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "旋风武器", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = "地龙剑吼", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "腐骨", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + }, + key = "冲锋骑兵", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "金蛇剑风", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "冰雨寒息", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "空连湮标记圈", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑齿元佑", + bEnable = true, + }, + }, + [177] = { + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "毒鸩", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "强击炮台", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "阵法·坤", + bDrawName = true, + szNote = "地(坤)", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "精准炮台", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "阵法·震", + bDrawName = true, + szNote = "雷(震)", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "阵法·离", + bDrawName = true, + szNote = "火(离)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "阵法·乾", + bDrawName = true, + szNote = "天(乾)", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "地字一号", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "无名", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "阵法·艮", + bDrawName = true, + szNote = "山(艮)", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "十二相·戌", + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + szNote = "戌狗", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "阵法·坎", + bDrawName = true, + szNote = "水(坎)", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "十二相·午", + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "午马", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "阵法·兑", + bDrawName = true, + szNote = "泽(兑)", + bEnable = true, + }, + [12] = { + dwType = 3, + key = "十二相·丑", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 90, + bEnable = true, + }, + }, + szNote = "丑牛", + bEnable = true, + }, + [1] = { + dwType = 3, + key = "阵法·巽", + bDrawName = true, + szNote = "风(巽)", + bEnable = true, + }, + }, + [179] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "狼牙神射手", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + }, + key = "牛介平", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 40, + 140, + 218, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "安守忠", + bEnable = true, + }, + }, + [183] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "石麒麟", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "麟火", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "探雪", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "岚剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "分身★千切子", + bEnable = true, + }, + [16] = { + dwType = 3, + key = "剑俑", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 45, + bEnable = true, + }, + }, + bDrawName = false, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "戟俑", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "谷剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "谷风★反弹", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "亡者气息", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 36163, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火牢花雨", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "冬剑", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "北风★白龙剑走", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "黑色能量体", + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白色能量体", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "白龙剑风", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 30, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "圆弧劈", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 153, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 36169, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "令狐伤", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36241, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "令狐伤(分身)", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "地龙剑吼", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "虚龙剑", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "盘蛇剑影", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [19] = { + dwType = 5, + key = "兵俑残骸石堆", + tCircles = { + { + nRadius = 3, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = "安禄山", + bTarget = false, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + bEnable = true, + }, + }, + [189] = { + { + dwType = 3, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "地刺", + }, + }, + [191] = { + [13] = { + dwType = 3, + key = 37384, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "投石车落点", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 37184, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "狼牙投石车", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "军需物资", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "田布戈", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 40646, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "飞斧气场", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "狼牙攻城队长", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "火龙摧城", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 37206, + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "朝曦门飞石", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 36872, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油圈", + bEnable = true, + }, + [14] = { + bTarget = true, + bDrawName = false, + szNote = "追击火龙点名判断", + bScreenHead = true, + dwType = 3, + bWhisperChat = true, + bDrawLine = true, + key = 36871, + bEnable = true, + }, + [3] = { + dwType = 3, + key = 37016, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火圈", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "狼牙号角手", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36873, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油燃烧圈", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "追击火龙", + bScreenHead = true, + dwType = 3, + key = 36875, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [199] = { + { + dwType = 3, + key = "阿独鹿", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + { + dwType = 3, + key = "乌素尔", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "断浪气劲", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·琵琶", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 40963, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "毒血圈", + bEnable = true, + }, + [17] = { + dwType = 3, + key = 40962, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "魔血圈", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "白陶·箜篌", + bEnable = true, + }, + [18] = { + dwType = 3, + key = "赤狼卫", + bTarget = true, + bDrawLineSelf = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "安雨", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "音波球", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "魄衣血仆", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + bFlash = false, + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "“恶修罗”端木正我", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "漫天雪舞", + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "军资箱", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "可蒙", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "阳极", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "疾风冲击", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "史思明", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "阴极", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灌血掌", + bEnable = true, + }, + [19] = { + dwType = 3, + bWhisperChat = false, + key = "盲眼血奴", + bTarget = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = 40970, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "灌血掌终", + bEnable = true, + }, + }, + [203] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "箭矢", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "看舞", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "旋转冰晶", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "高力士", + }, + }, + [205] = { + [13] = { + dwType = 3, + key = 41903, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油燃烧圈", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "狼牙投石车", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "军需物资", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "田布戈", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 41963, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火圈", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "狼牙攻城队长", + bEnable = true, + }, + [15] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 41901, + bDrawLine = true, + szNote = "追击火龙点名判定", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "火龙摧城", + bTarget = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 42035, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "朝曦门飞石", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 41902, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油圈", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 41964, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "飞斧气场", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "火龙机雷", + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "狼牙号角手", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + bTarget = true, + szNote = "追击火龙", + bScreenHead = true, + dwType = 3, + key = 41905, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + [14] = { + dwType = 3, + key = 42060, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "投石车落点", + bEnable = true, + }, + }, + [209] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46267, + szNote = "剑爆-王者", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "双针定阳", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 128, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46345, + szNote = "剑气-王者", + }, + [3] = { + dwType = 3, + key = 45957, + bTarget = false, + bDrawName = true, + szNote = "答案:211-圣者", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "悟影", + }, + [4] = { + dwType = 3, + key = 45958, + bDrawName = true, + szNote = "答案:121-王者", + tCircles = { + { + nRadius = 1, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46266, + szNote = "剑爆-圣者", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46344, + szNote = "剑气-圣者", + }, + }, + [211] = { + [13] = { + dwType = 3, + key = 42642, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "投石车落点", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 42553, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "狼牙投石车", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "军需物资", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "田布戈", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 42484, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "火圈", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "狼牙攻城队长", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "火龙摧城", + bTarget = false, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 42556, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "朝曦门飞石", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 42423, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油圈", + bEnable = true, + }, + [14] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 36871, + bDrawLine = true, + szNote = "追击火龙点名判定", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 42485, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "飞斧气场", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "狼牙号角手", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + dwType = 3, + key = 42424, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "黑油燃烧圈", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "追击火龙", + bScreenHead = true, + dwType = 3, + key = 36875, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [217] = { + { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5846, + }, + { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5844, + }, + [4] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5835, + }, + [8] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5833, + }, + [16] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5838, + }, + [17] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5840, + }, + [9] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5847, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "盗宝贼", + }, + [5] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5837, + }, + [10] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5839, + }, + [11] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5841, + }, + [3] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5845, + }, + [6] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5834, + }, + [12] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5848, + }, + [13] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5842, + }, + [7] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5843, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "打劫者", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50473, + }, + [15] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5836, + }, + }, + [-1] = { + { + dwType = 3, + key = "鬼祟的狼牙军士", + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "茶馆·狼牙军士", + bEnable = true, + }, + { + dwType = 3, + key = "梁笑堂", + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "茶馆·梁笑堂", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "机巧木人", + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "美人图·机巧木人", + bEnable = true, + }, + [8] = { + dwType = 5, + key = "灵山妙雨", + bDrawName = true, + szNote = "峨眉白芽", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 36782, + tCircles = { + { + nRadius = 1, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "7", + bDrawName = true, + }, + [17] = { + dwType = 3, + key = 36781, + bDrawName = true, + szNote = "6", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 5, + key = "阳崖云泉", + bDrawName = true, + szNote = "顾渚紫笋", + bEnable = true, + }, + [18] = { + dwType = 3, + key = 20111, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "5", + bDrawName = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "气场镇山河", + bEnable = true, + }, + [10] = { + dwType = 5, + key = "翠竹朝露", + bDrawName = true, + szNote = "仙崖石花", + bEnable = true, + }, + [20] = { + dwType = 3, + key = 20109, + bDrawName = true, + szNote = "3", + tCircles = { + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [21] = { + dwType = 3, + key = 20108, + tCircles = { + { + nRadius = 1, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "2", + bDrawName = true, + }, + [11] = { + dwType = 3, + key = 16170, + bDrawName = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "80茶馆·梁笑堂", + bEnable = true, + }, + [22] = { + dwType = 3, + key = 20107, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "1", + bDrawName = true, + }, + [3] = { + dwType = 3, + key = "求助的流民", + tCircles = { + { + nRadius = 25, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "茶馆·求助的流民", + bEnable = true, + }, + [6] = { + dwType = 5, + key = "无香真水", + bDrawName = true, + szNote = "西山白露", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 23674, + bDrawName = false, + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "90茶馆·梁笑堂", + bEnable = true, + }, + [24] = { + dwType = 5, + key = "烟雨石矿", + }, + [25] = { + dwType = 5, + key = "紫苏", + }, + [13] = { + dwType = 3, + key = 36785, + tCircles = { + { + nRadius = 1, + col = { + 121, + 241, + 182, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "10", + bDrawName = true, + }, + [26] = { + dwType = 5, + bDrawName = false, + key = "白术", + bDoodadLine = false, + }, + [27] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "阴阳之力", + bDrawName = true, + }, + [14] = { + dwType = 3, + key = 36784, + bDrawName = true, + szNote = "9", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [19] = { + dwType = 3, + key = 20110, + bDrawName = true, + szNote = "4", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [7] = { + dwType = 5, + key = "月鸿仙泉", + bDrawName = true, + szNote = "蒙顶石花", + bEnable = true, + }, + [23] = { + dwType = 5, + key = "天青石矿", + }, + [15] = { + dwType = 3, + key = 36783, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "8", + bDrawName = true, + }, + }, + [221] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "火", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "知心火控制", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池·幻", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔附体", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "毛毛", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "可人", + }, + [5] = { + dwType = 3, + key = "莫雨", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "李白", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔", + }, + [6] = { + dwType = 3, + key = "知心火", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "青莲子剑", + }, + }, + [35] = { + { + dwType = 3, + key = "花灯", + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + { + dwType = 5, + key = "月影菇", + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = true, + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "水柱", + bEnable = true, + }, + }, + [225] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "刺客聂政", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "残志光球", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + }, + key = 46475, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "无名剑", + }, + }, + [227] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "植尸将", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "刀光", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "地裂", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 145, + bBorder = true, + bEnable = true, + }, + }, + key = "秦秀", + }, + [4] = { + dwType = 5, + key = "弹药", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = false, + }, + [5] = { + dwType = 3, + key = "天一余孽", + bTarget = false, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + }, + }, + [229] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = 46899, + }, + }, + [231] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47175, + szNote = "屈焰阳", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "森九岚", + }, + [4] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "斩流剑·破", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫队副", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "涅槃经", + }, + [17] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "涅槃经", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "涅槃经", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "斩流剑·落", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "弩卫队副", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "李璘", + }, + [21] = { + dwType = 3, + key = "飞花蝶舞", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李玚", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "八荒阵眼", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "斩流剑·半月", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "斩流剑·聚", + }, + [12] = { + dwType = 3, + bDrawLine = true, + key = "一鼓作气", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "女撞", + bDrawName = true, + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "男撞", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "仲虚念", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "斧卫", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "紫金钵", + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑墙", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "苏十三娘", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "三环锡杖", + }, + }, + [233] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "火", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + key = "知心火控制", + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池·幻", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔附体", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "可人", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "毛毛", + }, + [5] = { + dwType = 3, + key = "莫雨", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李白", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "音缠", + }, + [6] = { + dwType = 3, + key = "知心火", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑气旋涡", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "青莲子剑", + }, + }, + [235] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "火", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "知心火控制", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池·幻", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔附体", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "可人", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "毛毛", + }, + [5] = { + dwType = 3, + key = "莫雨", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李白", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "音缠", + }, + [6] = { + dwType = 3, + key = "知心火", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑气旋涡", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "青莲子剑", + }, + }, + [237] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "剑气旋涡", + }, + [7] = { + bTarget = true, + bDrawName = true, + szNote = "火", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "知心火控制", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "韩非池·幻", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "幻魔附体", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "可人", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "毛毛", + }, + [5] = { + dwType = 3, + key = "莫雨", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "李白", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "音缠", + }, + [6] = { + dwType = 3, + key = "知心火", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + key = "青莲剑气", + bTarget = true, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bScreenHead = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "青莲子剑", + }, + }, + [66] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "木人", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "落石", + bEnable = true, + }, + }, + [67] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "牡丹", + bEnable = true, + }, + }, + }, + CHAT = {}, + TALK = { + [147] = { + { + tCountdown = { + { + szName = "解除无敌剩余时间", + nIcon = 340, + nClass = 14, + nTime = 9, + }, + }, + szNote = "吸血鬼解除无敌", + szContent = "吸血鬼解除了无敌,快攻击它。", + [14] = { + bCenterAlarm = true, + }, + }, + }, + [242] = { + { + szContent = "四散奔逃吧!", + col = { + 255, + 0, + 203, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "慕容绿珠", + szNote = "分散8尺!分散8尺!分散8尺!分散8尺!分散8尺!", + }, + { + szContent = "傻姑娘,你总说连累我太多,我又何尝不知你也为我吃尽了苦?谢盟主对我有知遇之恩,但我又怎能为了侠名负了你……", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "雨卓承", + szNote = "霜印靠近!!躲冰后面!", + }, + { + szContent = "小妹,你我坎坷太多,世人不允,却又如何?我苦练内功为你续命,若上天也不允,我们便此生同尽,再等来世!", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "雨卓承", + szNote = "霜印靠近!!躲冰后面!", + }, + }, + [211] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "准备天上巨石", + szContent = "远处传来阵阵的轰鸣声!!!", + tCountdown = { + { + szName = "准备天上巨石", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "统统去死吧!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "田布戈", + szNote = "虎啸", + }, + [4] = { + szContent = "投石车支援!", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "牛廷玠", + szNote = "注意躲避投石", + }, + [3] = { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "狼牙大军,兵临城下,炮火过处,寸草不生!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "田布戈", + szNote = "准备排火", + }, + }, + [212] = { + { + tCountdown = { + { + szName = "☆回血结束☆下一波小怪", + nIcon = 340, + nClass = 14, + nTime = 20, + }, + { + nClass = 14, + nTime = 41, + szName = "☆回血结束☆三毒入体准备", + nIcon = 340, + nFrame = 8, + }, + }, + szContent = "你们果真有些门道……死士何在,保护本王运功!", + szNote = "☆回血结束☆下一波小怪", + szTarget = "史思明", + }, + { + tCountdown = { + { + nClass = 14, + key = "毒血涌动", + nTime = 30, + szName = "毒血涌动", + nIcon = 4504, + }, + }, + szTarget = "史思明", + szContent = "谁敢接我一掌!", + szNote = "毒血涌动", + }, + [4] = { + tCountdown = { + { + szName = "★圣火焚城★", + nIcon = 340, + nClass = 14, + nTime = 110, + }, + { + szName = "☆圣火焚城☆", + nIcon = 340, + nClass = 14, + nTime = 170, + }, + }, + szTarget = "安雨", + szContent = "冰与火、阴与阳,是为你等编织的炼狱之门!", + szNote = "★圣火焚城★", + }, + [3] = { + tCountdown = { + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 15, + }, + }, + szContent = "糟糕,现在用这招还是太勉强了……", + [14] = { + bFullScreen = true, + }, + szTarget = "史思明", + szNote = "→→→★准备☆断长生★", + }, + }, + [244] = { + { + szContent = "四散奔逃吧!", + col = { + 255, + 0, + 203, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "慕容绿珠", + szNote = "分散8尺!分散8尺!分散8尺!分散8尺!分散8尺!", + }, + { + szContent = "傻姑娘,你总说连累我太多,我又何尝不知你也为我吃尽了苦?谢盟主对我有知遇之恩,但我又怎能为了侠名负了你……", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "雨卓承", + szNote = "霜印靠近!!躲冰后面!", + }, + { + szContent = "小妹,你我坎坷太多,世人不允,却又如何?我苦练内功为你续命,若上天也不允,我们便此生同尽,再等来世!", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "雨卓承", + szNote = "霜印靠近!!躲冰后面!", + }, + }, + [182] = { + [2] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "跳灯↑↑跳灯↑↑", + szContent = "战马显得异常的狂躁!", + tCountdown = { + { + szName = "★跳灯结束★", + nIcon = 340, + nClass = 14, + nTime = 33, + }, + }, + }, + [3] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "令狐伤", + szContent = "你们的轻功不错嘛,接下来你们应该如何应付呢?", + szNote = "令狐伤进入P2", + }, + [1] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "跳灯结束↓↓落地↓↓", + szContent = "战马安静了下来!", + tCountdown = { + { + nIcon = 340, + nTime = 32, + szName = "冲撞|亡者气息", + nFrame = 8, + nClass = 14, + }, + }, + }, + [4] = { + [14] = { + bFullScreen = true, + }, + szTarget = "探雪", + szContent = "你们的内心太过污秽,接受真理的净化吧!", + szNote = "进入P2,柱子就位", + }, + [5] = { + tCountdown = { + { + szName = "魅惑", + nIcon = 340, + nClass = 14, + nTime = 45, + }, + }, + szTarget = "探雪", + szContent = "火焰之舞的热情,你们承受的住么?", + szNote = "准备五色舞", + }, + }, + [183] = { + [2] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "跳灯↑↑跳灯↑↑", + szContent = "战马显得异常的狂躁!", + tCountdown = { + { + szName = "★跳灯结束★", + nIcon = 340, + nClass = 14, + nTime = 33, + }, + }, + }, + [3] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "令狐伤", + szContent = "你们的轻功不错嘛,接下来你们应该如何应付呢?", + szNote = "令狐伤进入P2", + }, + [1] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "跳灯结束↓↓落地↓↓", + szContent = "战马安静了下来!", + tCountdown = { + { + nIcon = 340, + nTime = 32, + szName = "冲撞|亡者气息", + nFrame = 8, + nClass = 14, + }, + }, + }, + [4] = { + [14] = { + bFullScreen = true, + }, + szTarget = "探雪", + szContent = "你们的内心太过污秽,接受真理的净化吧!", + szNote = "进入P2,柱子就位", + }, + [5] = { + tCountdown = { + { + szName = "魅惑", + nIcon = 340, + nClass = 14, + nTime = 45, + }, + }, + szTarget = "探雪", + szContent = "火焰之舞的热情,你们承受的住么?", + szNote = "准备五色舞", + }, + }, + [155] = { + { + tCountdown = { + { + szName = "段宗公激活", + nIcon = 340, + nClass = 14, + nTime = 120, + }, + { + szName = "泰崇傣激活", + nIcon = 340, + nClass = 14, + nTime = 60, + }, + }, + szContent = "我的能力是你们无法想象的!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "泰崇傣", + szNote = "段宗公激活", + }, + { + tCountdown = { + { + nClass = 14, + szName = "冰柱", + nIcon = 13, + nTime = 25, + }, + }, + szContent = "西天有路,且让我送你一程!", + [14] = { + bCenterAlarm = true, + }, + szNote = "冰柱出现", + szTarget = "摩提耶罗", + }, + }, + [220] = { + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "李璘", + szNote = "7尺内内内内", + }, + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "苏十三娘", + szNote = "9尺外外外外", + }, + { + tCountdown = { + { + nIcon = 13, + key = "当前集火★", + nTime = 0, + szName = "当前集火★", + nClass = 14, + }, + }, + szContent = "我那儿子之死是他的命数", + szTarget = "李璘", + szNote = "清空倒计时", + }, + }, + [221] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "毛毛", + szNote = "转回P1", + szContent = "可恶,怎么会这样,侠士靠你们了", + }, + { + tCountdown = { + { + szName = "映日", + nClass = 14, + nIcon = 13, + nTime = 25, + }, + { + nIcon = 13, + key = "二式·登楼", + nTime = 0, + szName = "二式·登楼", + nClass = 14, + }, + { + nIcon = 13, + key = "行舟", + nTime = 0, + szName = "行舟", + nClass = 14, + }, + }, + szContent = "有两下子啊", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "李白", + szNote = "进入P2", + }, + }, + [191] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "准备天上巨石", + szContent = "远处传来阵阵的轰鸣声!!!", + tCountdown = { + { + szName = "准备天上巨石", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "统统去死吧!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "田布戈", + szNote = "虎啸", + }, + [4] = { + szContent = "投石车支援!", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "牛廷玠", + szNote = "注意躲避投石", + }, + [3] = { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "狼牙大军,兵临城下,炮火过处,寸草不生!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "田布戈", + szNote = "准备排火", + }, + }, + [192] = { + { + tCountdown = { + { + nIcon = 340, + szName = "☆回血结束☆下一波小怪", + nClass = 14, + nTime = 30, + }, + { + nIcon = 340, + szName = "☆回血结束☆三毒入体准备", + nClass = 14, + nTime = 61, + }, + }, + szTarget = "史思明", + szContent = "你们果真有些门道……死士何在,保护本王运功!", + szNote = "☆回血结束☆下一波小怪", + }, + { + tCountdown = { + { + nClass = 14, + key = "毒血涌动", + nTime = 30, + szName = "毒血涌动", + nIcon = 4504, + }, + }, + szTarget = "史思明", + szContent = "谁敢接我一掌!", + szNote = "毒血涌动", + }, + { + tCountdown = { + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 15, + }, + }, + szContent = "糟糕,现在用这招还是太勉强了……", + [14] = { + bFullScreen = true, + }, + szTarget = "史思明", + szNote = "→→→★准备☆断长生★", + }, + }, + [164] = { + { + tCountdown = { + { + szName = "【25人】血重楼", + nIcon = 340, + nClass = 14, + nTime = 15, + }, + }, + szContent = "安某倾覆李唐,若要问谁对谁错?我如今是人中皇帝,当然是我对!他错!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "安禄山", + szNote = "15秒后血重楼", + }, + { + tCountdown = { + { + szName = "【25人】燃血笼锁", + nIcon = 340, + nClass = 14, + nTime = 40, + }, + }, + szContent = "逐鹿天下,孰可狼中称王?不是东都天策府,而是我安禄山的范阳狼牙军!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "安禄山", + szNote = "40秒后燃血笼锁", + }, + }, + [133] = { + { + [14] = { + bCenterAlarm = true, + }, + szNote = "陆寻双眼放出寒光!", + szContent = "陆寻双眼放出寒光!", + }, + }, + [165] = { + { + tCountdown = { + { + szName = "【25人】血重楼", + nIcon = 340, + nClass = 14, + nTime = 15, + }, + }, + szContent = "安某倾覆李唐,若要问谁对谁错?我如今是人中皇帝,当然是我对!他错!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "安禄山", + szNote = "15秒后血重楼", + }, + { + tCountdown = { + { + szName = "【25人】燃血笼锁", + nIcon = 340, + nClass = 14, + nTime = 40, + }, + }, + szContent = "逐鹿天下,孰可狼中称王?不是东都天策府,而是我安禄山的范阳狼牙军!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "安禄山", + szNote = "40秒后燃血笼锁", + }, + }, + [134] = { + { + [14] = { + bCenterAlarm = true, + }, + szNote = "陆寻双眼放出寒光!", + szContent = "陆寻双眼放出寒光!", + }, + }, + [198] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "准备天上巨石", + szContent = "远处传来阵阵的轰鸣声!!!", + tCountdown = { + { + szName = "准备天上巨石", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "统统去死吧!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "田布戈", + szNote = "虎啸", + }, + [4] = { + szContent = "投石车支援!", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "牛廷玠", + szNote = "注意躲避投石", + }, + [3] = { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "狼牙大军,兵临城下,炮火过处,寸草不生!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "田布戈", + szNote = "准备排火", + }, + }, + [230] = { + { + [14] = { + bCenterAlarm = true, + }, + szTarget = "毛毛", + szNote = "转回P1", + szContent = "可恶,怎么会这样,侠士靠你们了", + }, + { + tCountdown = { + { + nIcon = 13, + key = "行舟", + nTime = 25, + szName = "映日", + nClass = 14, + }, + { + nIcon = 13, + key = "二式·登楼", + nTime = 0, + szName = "二式·登楼", + nClass = 14, + }, + }, + szContent = "有两下子啊", + [14] = { + bFullScreen = true, + }, + szTarget = "李白", + szNote = "进入P2", + }, + }, + [199] = { + { + tCountdown = { + { + nIcon = 340, + szName = "☆回血结束☆下一波小怪", + nClass = 14, + nTime = 20, + }, + { + nClass = 14, + nTime = 41, + szName = "☆回血结束☆三毒入体准备", + nIcon = 340, + nFrame = 8, + }, + }, + szNote = "☆回血结束☆下一波小怪", + szTarget = "史思明", + szContent = "你们果真有些门道……死士何在,保护本王运功!", + }, + { + tCountdown = { + { + nClass = 14, + key = "毒血涌动", + nTime = 30, + szName = "毒血涌动", + nIcon = 4504, + }, + }, + szTarget = "史思明", + szContent = "谁敢接我一掌!", + szNote = "毒血涌动", + }, + [4] = { + tCountdown = { + { + szName = "★圣火焚城★", + nIcon = 340, + nClass = 14, + nTime = 110, + }, + { + szName = "☆圣火焚城☆", + nIcon = 340, + nClass = 14, + nTime = 170, + }, + }, + szTarget = "安雨", + szContent = "冰与火、阴与阳,是为你等编织的炼狱之门!", + szNote = "★圣火焚城★", + }, + [3] = { + tCountdown = { + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 15, + }, + }, + szContent = "糟糕,现在用这招还是太勉强了……", + [14] = { + bFullScreen = true, + }, + szTarget = "史思明", + szNote = "→→→★准备☆断长生★", + }, + }, + [231] = { + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "苏十三娘", + szNote = "9尺外外外外", + }, + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "李璘", + szNote = "7尺内内内内", + }, + { + tCountdown = { + { + nIcon = 13, + key = "当前集火★", + nTime = 0, + szName = "当前集火★", + nClass = 14, + }, + }, + szContent = "我那儿子之死是他的命数", + szTarget = "李璘", + szNote = "清空倒计时", + }, + }, + [-9] = { + [2] = { + szContent = "当心了!", + szTarget = "李璘", + }, + [3] = { + tCountdown = { + { + szName = "领取糖果时间", + nClass = 14, + nIcon = 13, + nTime = 60, + }, + { + szName = "下一次做糖时间", + nClass = 14, + nIcon = 13, + nTime = 120, + }, + }, + szContent = "噗嗤噗嗤……噗嗤噗嗤噗嗤……", + szTarget = "榴芒兔", + }, + [1] = { + szContent = "跑开太远了,背篓里的东西都掉了!", + }, + [4] = { + tCountdown = { + { + szName = "领取糖果", + nClass = 14, + nIcon = 13, + nTime = 120, + }, + { + szName = "可以做高级糖果", + nClass = 14, + nIcon = 13, + nTime = 60, + }, + }, + szContent = "啦啦啦,大家快点放材料,呼啦呼啦准备做糖啦!", + szTarget = "榴芒兔", + }, + [5] = { + szContent = "包裹中没有鱼饵,无法钓鱼。", + [14] = { + bScreenHead = true, + }, + }, + }, + [232] = { + { + tCountdown = { + { + nClass = 14, + szName = "下一次走位", + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "苏十三娘", + szNote = "9尺外外外外", + }, + { + tCountdown = { + { + nClass = 14, + szName = "下一次走位", + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "李璘", + szNote = "7尺内内内内", + }, + { + tCountdown = { + { + nIcon = 13, + key = "当前集火★", + nTime = 0, + szName = "当前集火★", + nClass = 14, + }, + }, + szTarget = "李璘", + szNote = "清空倒计时", + szContent = "我那儿子之死是他的命数", + }, + }, + [138] = { + { + szContent = "狼牙弩兵,列阵攻击!", + col = { + 223, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "汪莽", + szNote = "重弩激活!", + }, + { + tCountdown = { + { + nClass = 14, + szName = "卡盾倒计时", + nIcon = 13, + nTime = 65, + }, + }, + szContent = "全军突击!", + szTarget = "狼牙守备官", + }, + }, + [233] = { + { + [14] = { + bCenterAlarm = true, + }, + szTarget = "毛毛", + szNote = "转回P1", + szContent = "可恶,怎么会这样,侠士靠你们了", + }, + { + tCountdown = { + { + nIcon = 13, + key = "行舟", + nTime = 25, + szName = "映日", + nClass = 14, + }, + { + nIcon = 13, + key = "二式·登楼", + nTime = 0, + szName = "二式·登楼", + nClass = 14, + }, + }, + szContent = "有两下子啊", + [14] = { + bFullScreen = true, + }, + szTarget = "李白", + szNote = "进入P2", + }, + }, + [234] = { + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "苏十三娘", + szNote = "9尺外外外外", + }, + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "李璘", + szNote = "7尺内内内内", + }, + { + tCountdown = { + { + nIcon = 13, + key = "当前集火★", + nTime = 0, + szName = "当前集火★", + nClass = 14, + }, + }, + szContent = "我那儿子之死是他的命数", + szTarget = "李璘", + szNote = "清空倒计时", + }, + }, + [140] = { + { + tCountdown = { + { + szName = "段宗公激活", + nIcon = 340, + nClass = 14, + nTime = 120, + }, + { + szName = "泰崇傣激活", + nIcon = 340, + nClass = 14, + nTime = 60, + }, + }, + szContent = "我的能力是你们无法想象的!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "泰崇傣", + szNote = "段宗公激活", + }, + }, + [235] = { + { + [14] = { + bCenterAlarm = true, + }, + szContent = "可恶,怎么会这样,侠士靠你们了", + szTarget = "毛毛", + szNote = "转回P1", + }, + { + tCountdown = { + { + nIcon = 13, + key = "行舟", + nTime = 25, + szName = "映日", + nClass = 14, + }, + { + nIcon = 13, + key = "二式·登楼", + nTime = 0, + szName = "二式·登楼", + nClass = 14, + }, + }, + szContent = "有两下子啊", + [14] = { + bFullScreen = true, + }, + szTarget = "李白", + szNote = "进入P2", + }, + }, + [136] = { + { + szContent = "狼牙弩兵,列阵攻击!", + col = { + 223, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "汪莽", + szNote = "重弩激活!", + }, + }, + [236] = { + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "苏十三娘", + szNote = "9尺外外外外", + }, + { + tCountdown = { + { + szName = "下一次走位", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "当心了!", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "李璘", + szNote = "7尺内内内内", + }, + { + tCountdown = { + { + nIcon = 13, + key = "当前集火★", + nTime = 0, + szName = "当前集火★", + nClass = 14, + }, + }, + szContent = "我那儿子之死是他的命数", + szTarget = "李璘", + szNote = "清空倒计时", + }, + }, + [72] = { + { + tCountdown = { + { + szName = "沙利亚进入虚弱", + nIcon = 340, + nClass = 14, + nTime = 61, + }, + { + szName = "虚弱剩余时间", + nIcon = 340, + nClass = 14, + nTime = 28, + }, + }, + szContent = "呃……", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "沙利亚", + szNote = "沙利亚进入虚弱", + }, + { + tCountdown = { + { + szName = "阿萨辛点亮了蜡烛", + nIcon = 340, + nClass = 14, + nTime = 50, + }, + { + szName = "秒人倒计时", + nIcon = 340, + nClass = 14, + nTime = 20, + }, + }, + szContent = "闪耀的光明!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "阿萨辛", + szNote = "阿萨辛点亮了蜡烛", + }, + }, + [237] = { + { + [14] = { + bCenterAlarm = true, + }, + szContent = "可恶,怎么会这样,侠士靠你们了", + szTarget = "毛毛", + szNote = "转回P1", + }, + { + tCountdown = { + { + nIcon = 13, + key = "行舟", + nTime = 25, + szName = "映日", + nClass = 14, + }, + { + nIcon = 13, + key = "二式·登楼", + nTime = 0, + szName = "二式·登楼", + nClass = 14, + }, + }, + szContent = "有两下子啊", + [14] = { + bFullScreen = true, + }, + szTarget = "李白", + szNote = "进入P2", + }, + }, + [206] = { + { + tCountdown = { + { + nIcon = 13, + key = "灌血掌", + nTime = 27, + szName = "灌血掌", + nFrame = 8, + nClass = 14, + }, + }, + szTarget = "史思明", + szContent = "谁敢接我一掌!", + szNote = "毒血涌动", + }, + { + tCountdown = { + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "→→→★准备☆断长生★", + nClass = 14, + nTime = 15, + }, + { + nClass = 14, + szName = "P5血染春秋&禁断", + nIcon = 13, + nTime = 38, + }, + }, + szContent = "糟糕,现在用这招还是太勉强了……", + [14] = { + bFullScreen = true, + }, + szTarget = "史思明", + szNote = "→→→★准备☆断长生★", + }, + [4] = { + tCountdown = { + { + nClass = 14, + key = "★圣火焚城★", + nTime = 110, + szName = "★圣火焚城★", + nIcon = 340, + }, + { + nClass = 14, + key = "☆圣火焚城☆", + nTime = 170, + szName = "☆圣火焚城☆", + nIcon = 340, + }, + }, + szTarget = "安雨", + szContent = "冰与火、阴与阳,是为你等编织的炼狱之门!", + szNote = "★圣火焚城★", + }, + [3] = { + tCountdown = { + [2] = { + nClass = 14, + nTime = 41, + szName = "☆回血结束☆三毒入体准备", + nIcon = 340, + nFrame = 8, + }, + [3] = { + nIcon = 13, + key = "断长生", + nTime = 0, + szName = "断长生", + nClass = 14, + }, + [1] = { + nIcon = 340, + szName = "☆回血结束☆下一波小怪", + nClass = 14, + nTime = 20, + }, + [4] = { + nIcon = 13, + key = "禁断", + nTime = 0, + szName = "禁断", + nClass = 14, + }, + [5] = { + nIcon = 13, + key = "灌血掌", + nTime = 0, + szName = "灌血掌", + nClass = 14, + }, + }, + szTarget = "史思明", + szContent = "你们果真有些门道……死士何在,保护本王运功!", + szNote = "☆回血结束☆下一波小怪", + }, + }, + [175] = { + { + tCountdown = { + { + szName = "苏曼莎QTE/无男神提前25秒", + nIcon = 340, + nClass = 14, + nTime = 90, + }, + { + szName = "QTE结束(苏曼莎),令狐伤QTE", + nIcon = 340, + nClass = 14, + nTime = 31, + }, + }, + szContent = "以此舞相伴,君何不就此一醉方休?", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "苏曼莎", + szNote = "苏曼莎QTE/无男神提前25秒", + }, + { + tCountdown = { + { + szName = "狼牙军进攻倒计时", + nIcon = 340, + nClass = 14, + nTime = 12, + }, + }, + szTarget = "狼牙指挥官", + szContent = "这仗打完,女人酒肉应有尽有!", + szNote = "12秒后进攻开始", + }, + }, + [-1] = { + [7] = { + tCountdown = { + { + nClass = 14, + szName = "藏宝洞存在时间", + nIcon = 13, + nTime = 1800, + }, + }, + szContent = "你发现了一个藏宝洞!藏宝洞只存在两刻钟,务必速速前往挖掘宝藏!", + }, + [1] = { + [14] = { + bScreenHead = true, + }, + szContent = "老子要喝酒!", + szTarget = "吃饭的水贼", + szNote = "喝酒", + }, + [2] = { + [14] = { + bScreenHead = true, + }, + szContent = "给我来一碗菜!", + szTarget = "吃饭的水贼", + szNote = "吃菜", + }, + [4] = { + [14] = { + bScreenHead = true, + }, + szContent = "给我盛一碗香喷喷的饭来!", + szTarget = "吃饭的水贼", + szNote = "吃饭", + }, + [8] = { + szContent = "好像有鱼儿上钩了。", + [14] = { + bScreenHead = true, + }, + }, + [9] = { + tCountdown = { + { + nClass = 14, + szName = "鳄鱼出现", + nIcon = 4223, + nTime = 20, + }, + }, + szContent = "三只小鳄鱼!快找点儿东西喂他们!", + }, + [5] = { + tCountdown = { + { + nClass = 14, + szName = "发放工资计时", + nIcon = 2290, + nTime = 30, + }, + }, + szContent = "分配者正发起收入分配,不在相同场景者无法投票,倒计时结束后默认反对", + col = { + 255, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + szNote = "发放工资,请确认", + }, + [3] = { + [14] = { + bScreenHead = true, + }, + szContent = "这菜咸死了,快给老子上一大碗水来!", + szTarget = "吃饭的水贼", + szNote = "喝水", + }, + [6] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szContent = "{$me}", + szTarget = "%", + }, + }, + [176] = { + { + tCountdown = { + { + szName = "苏曼莎QTE/无男神提前25秒", + nIcon = 340, + nClass = 14, + nTime = 90, + }, + { + szName = "QTE结束(苏曼莎),令狐伤QTE", + nIcon = 340, + nClass = 14, + nTime = 31, + }, + }, + szContent = "以此舞相伴,君何不就此一醉方休?", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "苏曼莎", + szNote = "苏曼莎QTE/无男神提前25秒", + }, + { + tCountdown = { + { + szName = "狼牙军进攻倒计时", + nIcon = 340, + nClass = 14, + nTime = 12, + }, + }, + szTarget = "狼牙指挥官", + szContent = "这仗打完,女人酒肉应有尽有!", + szNote = "12秒后进攻开始", + }, + }, + [205] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "准备天上巨石", + szContent = "远处传来阵阵的轰鸣声!!!", + tCountdown = { + { + szName = "准备天上巨石", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "统统去死吧!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "田布戈", + szNote = "虎啸", + }, + [4] = { + szContent = "投石车支援!", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "牛廷玠", + szNote = "注意躲避投石", + }, + [3] = { + tCountdown = { + { + szName = "断骨", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "狼牙大军,兵临城下,炮火过处,寸草不生!", + [14] = { + bCenterAlarm = true, + }, + szTarget = "田布戈", + szNote = "准备排火", + }, + }, + [177] = { + { + tCountdown = { + { + szName = "十二相出现", + nIcon = 340, + nClass = 14, + nTime = 11, + }, + }, + szContent = "看来我要认真一点了!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "黑鹰", + szNote = "转阶段准备12相", + }, + { + tCountdown = { + { + szName = "逐风飞雪斩", + nIcon = 340, + nClass = 14, + nTime = 47, + }, + }, + szContent = "逐风飞雪埋骨殖,寒星射月索命归!各位且瞧我此招风雪连天~~", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "地字一号", + szNote = "准备逐风飞雪斩", + }, + }, + [74] = { + { + szContent = "好像鱼儿上钩了,速速收杆。", + [14] = { + bScreenHead = true, + }, + }, + }, + [178] = { + { + tCountdown = { + { + szName = "十二相出现", + nIcon = 340, + nClass = 14, + nTime = 11, + }, + }, + szContent = "看来我要认真一点了!", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "黑鹰", + szNote = "转阶段准备12相", + }, + { + tCountdown = { + { + szName = "逐风飞雪斩", + nIcon = 340, + nClass = 14, + nTime = 47, + }, + }, + szContent = "逐风飞雪埋骨殖,寒星射月索命归!各位且瞧我此招风雪连天~~", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "地字一号", + szNote = "准备逐风飞雪斩", + }, + }, + [200] = { + { + szContent = "哼!捣乱的人,会被我踢成肉泥!", + col = { + 255, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "宇文画", + szNote = "T交减伤", + }, + }, + }, + DOODAD = { + [-9] = { + { + dwID = 6074, + }, + { + dwID = 6078, + }, + { + dwID = 6078, + }, + }, + [-1] = { + { + tCountdown = { + { + nClass = 17, + szName = "下一次", + nIcon = 13, + nTime = 125, + }, + }, + [17] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 1470, + }, + }, + }, + NPC = { + [241] = { + { + dwID = 51050, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "哥舒翰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51054, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火扇落点", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51055, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "夺魂惊龙枪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51056, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "哥舒翰幻影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黑齿元佑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蜘蛛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安全点", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51552, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "英招", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51589, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51675, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安庆绪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "穿心瞄准2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51690, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "穿心瞄准1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52557, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓·分裂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓·爆炸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [357] = { + { + dwID = 60636, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "翁幼之", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60684, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "端木珩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60688, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "哈尔芙林", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [361] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "神罚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白圈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小太阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秘法门识破者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "信仰暴徒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火把", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼窝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水源", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铂尔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63166, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "罗纳真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康疑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63188, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "没藏呼月", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63253, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拿云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秘法门识破者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63288, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "方天剑豪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63294, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "遗落的食物", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63302, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "信仰暴徒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63304, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣法门卫道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63312, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拓跋思羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63319, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火网", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63334, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "熊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄金气脉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [365] = { + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "礼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65926, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄的巨手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65931, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钱宗龙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65935, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65936, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "邢不僵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏灾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65938, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "孙楚珊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65943, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伍藏野", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65950, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无面鬼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65954, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "弓箭手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鬼首", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65963, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水鬼[抓人]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65982, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑫鑫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65987, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "强袭奴仆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65988, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无耻混蛋", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鱼枪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66005, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康宴别", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66066, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "李如峰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [249] = { + { + dwID = 51056, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "哥舒翰幻影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安全点", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "穿心瞄准2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51690, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "穿心瞄准1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53985, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "哥舒翰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53989, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火扇落点", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53990, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "夺魂惊龙枪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53995, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黑齿元佑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53996, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蜘蛛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54006, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "英招", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54007, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54008, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安庆绪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54089, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓·分裂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛞蝓·爆炸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [126] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "准备躲避线!", + nRefresh = 10, + nClass = 3, + }, + { + nIcon = 346, + nTime = 110, + szName = "飞剑", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25675, + }, + { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "100,准备躲避线!;185,飞剑;", + }, + }, + dwID = 19456, + }, + }, + [32] = { + { + dwID = 638, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "燎原", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 891, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "餐风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 892, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "饮火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 893, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "吞云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5067, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王海银", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5068, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朱癸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5072, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "掌火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "镇恶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5662, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "迦兰武僧头目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5744, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "平等", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7791, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "千手观音", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7792, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7793, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无相", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7806, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "不稳定的机雷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [262] = { + { + dwID = 55524, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八重妙法村正", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55528, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "令狐伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩梨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55573, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳雪乾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55595, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳贯角的影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55720, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "村正法阵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [270] = { + { + dwID = 56826, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "木材→金", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56827, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "合金块→火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳鸾旗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56835, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒水石→土", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56836, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "硫磺岩→水", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56841, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56845, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "土块→木", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56861, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者·右", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56873, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "雷溶石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56888, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "法健公", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56895, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳秀岳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56911, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "雷食兽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56919, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻境魔影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56924, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者·右", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57020, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者·左", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [138] = { + { + nFrame = 57, + dwID = 18047, + tCountdown = { + { + nClass = 7, + szName = "天云挂雷", + nIcon = 13, + nTime = 60, + }, + }, + }, + }, + [140] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "红球·刷新", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "红球(普通)", + dwID = 18786, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "绿球·刷新", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "绿球(普通)", + dwID = 18787, + }, + [4] = { + dwID = 19649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "恐怖处刑人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "泰拳手·刷新", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 18783, + szName = "泰拳手(普通)", + nFrame = 57, + }, + }, + [144] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寅·中", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巳·真身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尸罐·真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天一教大祭祀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小贼雅克", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [146] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寅·中", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巳·真身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尸罐·真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天一教大祭祀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小贼雅克", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [148] = { + { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + nTime = 29, + szName = "木人", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 18286, + }, + { + nFrame = 52, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "34,大音波;67,大音波;97,大音波;131,大音波;165,大音波;195,大音波;228,大音波;261,大音波;291,大音波;325,大音波;359,大音波;389,大音波;422,大音波;", + }, + }, + dwID = 18281, + }, + }, + [298] = { + { + dwID = 59385, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59392, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "地刺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59397, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "困兽囚笼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59405, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌夜啼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59406, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月泉淮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蓄积的内力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59427, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "暗月血球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59433, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "庄愈华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59434, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "百慕玲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59435, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幽冥禁锢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59452, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰髓毒爆弹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59545, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻念剑气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [-9] = { + [13] = { + nFrame = 52, + dwID = 48701, + }, + [7] = { + dwID = 47208, + szName = "涅槃经1", + nFrame = 57, + }, + [1] = { + dwID = 48381, + szName = "炮火", + nFrame = 57, + }, + [2] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 57, + dwID = 48487, + }, + [4] = { + nFrame = 57, + dwID = 48578, + }, + [8] = { + dwID = 43966, + szName = "涅槃经2", + nFrame = 57, + }, + [9] = { + dwID = 47276, + szName = "涅槃经3", + nFrame = 57, + }, + [5] = { + tCountdown = { + { + szName = "破敌|落", + nClass = 3, + nIcon = 13, + nTime = 10, + }, + }, + dwID = 48545, + nFrame = 57, + }, + [10] = { + szName = "涅槃经1", + nFrame = 57, + dwID = 47208, + }, + [14] = { + nFrame = 52, + dwID = 48748, + }, + [3] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 48482, + }, + [6] = { + dwID = 48514, + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "涅槃经", + }, + [12] = { + szName = "涅槃经3", + nFrame = 57, + dwID = 47276, + }, + [11] = { + szName = "涅槃经2", + nFrame = 57, + dwID = 43966, + }, + }, + [160] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 80, + szName = "龙卷风刷新", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 23192, + }, + { + dwID = 21880, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "卓力格图", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21881, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "澹台枯火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21882, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "闻人彦范", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21883, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "岳承志", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21885, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "破城锤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21886, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "骨牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22289, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "萧沙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22290, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "韦柔丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25617, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "狼牙百夫长", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [164] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 50, + szName = "燃血笼锁", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23005, + [3] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 50, + szName = "下一次小怪", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23009, + [3] = { + bTeamChannel = true, + }, + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,皇之怒;39,头狼点名;", + }, + { + nIcon = 346, + nClass = 6, + nTime = "0.72,准备进入P2;0.42,准备进入P3;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安禄山", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 22647, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "使者出现", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 22618, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者", + tRelation = { + bAll = true, + }, + }, + }, + [11] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 19, + szName = "红蓝火出现", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 22602, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "墓碑激活剩余时间", + nTime = 30, + szName = "墓碑激活剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23751, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "墓碑激活剩余时间", + nTime = 30, + szName = "墓碑激活剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23750, + nFrame = 52, + }, + { + dwID = 23336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡丝", + tRelation = { + bAll = true, + }, + }, + }, + [4] = { + bBigFontAlarm = true, + }, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "平血剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23342, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 17, + szName = "干扰炸弹", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23827, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 23360, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "击鼓手", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 62, + szName = "击鼓手", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 3, + nIcon = 2589, + nTime = "83,第二波进攻;173,第三波进攻;263,第四波进攻;353,最后一波进攻;", + }, + }, + dwID = 24188, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 120, + szDisplay = "随机宝箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 24539, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23760, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23761, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23752, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23753, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 52, + dwID = 23757, + }, + { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23758, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23755, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23756, + }, + { + dwID = 22038, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22916, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑圣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22989, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "头狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "独孤问俗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·幻灭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23749, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无名", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23922, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "击鼓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23924, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "心魔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23926, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛星明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23927, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛星让", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23951, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蝴蝶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24045, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24053, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24062, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乾坤剑意", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24119, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "何莘涯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24396, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屋顶漏洞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24668, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水鬼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李忘生", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24931, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡宝箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [330] = { + { + dwID = 62770, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月泉淮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“流浪剑客”拭问", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64220, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“苦行僧”马继纳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64221, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“吊睛白额”啸天虎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64222, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“凛冬将至”孤狼王", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [334] = { + { + dwID = 61156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "金十五", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62110, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "炎晖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64202, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尹莫萍", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "端木羚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王吒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [342] = { + { + dwID = 60654, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "杀末邪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60660, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "月笼草", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60663, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "蒹葭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61085, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "风香无情", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61086, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "复幽草", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [176] = { + { + tCountdown = { + { + nIcon = 346, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 27200, + szName = "狼牙精英斥候::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27201, + szName = "断罪舞者::25", + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 346, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27217, + szName = "狼牙射手::25", + nFrame = 57, + }, + [8] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,封岳;40,骑兵冲锋;55,撼岳;75,封岳;135,封岳;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.75,准备进入【P2】;0.35,准备进入【P3】;", + }, + }, + dwID = 27161, + szName = "沙叱博::25", + nFrame = 57, + }, + [16] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "跳风结束倒计时", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27285, + szName = "大旋风::25", + nFrame = 47, + }, + [17] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "30,【盾兵门】下一波;70,【盾兵门】下一波;100,【盾兵门】下一波;140,【盾兵门】下一波;170,【盾兵门】下一波;210,【盾兵门】下一波;240,【盾兵门】下一波;280,【盾兵门】下一波;310,【盾兵门】下一波;350,【盾兵门】下一波;380,【盾兵门】下一波;420,【盾兵门】下一波;", + }, + }, + dwID = 27159, + szName = "【盾兵门】持盾兵", + nFrame = 57, + }, + [9] = { + tCountdown = { + { + nIcon = 346, + nTime = 10, + szName = "集火狼时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27481, + szName = "白狼", + nFrame = 57, + }, + [18] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "30,【地雷门】下一波;70,【地雷门】下一波;100,【地雷门】下一波;140,【地雷门】下一波;170,【地雷门】下一波;210,【地雷门】下一波;240,【地雷门】下一波;280,【地雷门】下一波;310,【地雷门】下一波;350,【地雷门】下一波;380,【地雷门】下一波;420,【地雷门】下一波;", + }, + }, + dwID = 27155, + szName = "【地雷门】喷火兵", + nFrame = 57, + }, + [5] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27222, + szName = "黑齿卫士::25", + nFrame = 57, + }, + [10] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "35,空连湮标记圈;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.30,DPS注意停手;", + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27144, + szName = "靛云:25", + nFrame = 57, + }, + [20] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "40,火星;68,云卷烟;", + }, + }, + dwID = 27255, + szName = "席庶云::25", + nFrame = 57, + }, + [21] = { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "下一个循环3冲锋|1弓兵", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 27357, + szName = "【剪】喷火兵", + nFrame = 57, + }, + [11] = { + tCountdown = { + { + nIcon = 346, + nTime = 19, + szName = "天行漫", + nRefresh = 10, + nClass = 3, + }, + { + nClass = 3, + nIcon = 346, + nTime = "8,标记圈消失;11,厚土出现DPS准备爆发;", + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 27145, + szName = "空连湮标记圈::25", + nFrame = 57, + }, + [22] = { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "下一波进攻", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 27111, + szName = "【扇】冲锋兵", + nFrame = 57, + }, + [3] = { + tCountdown = { + { + nIcon = 346, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27289, + szName = "狼牙刀锋::25", + nFrame = 57, + }, + [6] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27219, + szName = "黑齿巫师::25", + nFrame = 57, + }, + [12] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "11,球;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.42,准备找小七抱团;", + }, + }, + dwID = 27139, + szName = "天狼::25", + nFrame = 47, + }, + [13] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "球", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27163, + szName = "鸢戾天::25", + nFrame = 57, + }, + [7] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27223, + szName = "黑齿祭司::25", + nFrame = 57, + }, + [14] = { + szName = "[青锥牧场]狼牙援兵", + dwID = 26871, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "下一波援军", + nRefresh = 10, + nClass = 3, + }, + }, + nFrame = 57, + }, + [19] = { + tCountdown = { + { + nIcon = 346, + nTime = 33, + szName = "【倒油门】下一波", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27190, + szName = "【倒油门】藤甲兵", + nFrame = 57, + }, + [15] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "52,点名QTE;", + }, + }, + dwID = 27128, + szName = "曹炎烈::25", + nFrame = 47, + }, + }, + [178] = { + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·噬", + tRelation = { + bAll = true, + }, + }, + }, + szName = "傀儡·噬:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 18, + szName = "幽冥双刃(穿透)", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36448, + szName = "幽冥气劲:25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36315, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·寅", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A组·寅虎:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36316, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·卯", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A组·卯兔:25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36319, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·午", + tRelation = { + bAll = true, + }, + }, + }, + szName = "B组·午马:25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36322, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·酉", + tRelation = { + bAll = true, + }, + }, + }, + szName = "C组·酉鸡:25", + nFrame = 57, + }, + { + szName = "地刺补给车:25", + dwID = 36335, + [3] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + szName = "焦油补给车:25", + dwID = 36336, + [3] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + nFrame = 47, + szName = "史朝义::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史朝义", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,扇风;", + }, + }, + dwID = 36328, + }, + { + nFrame = 57, + szName = "地字一号::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "地字一号", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "9,分骨;30,飞鸟出现;43,暗杀者出现;", + }, + }, + dwID = 36299, + }, + { + szName = "隐元会暗杀者::25", + dwID = 36301, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + { + szName = "杜森:25", + dwID = 36464, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "钟一洋:25", + dwID = 36463, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "莫寻常::25", + dwID = 36462, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "霍正军::25", + dwID = 36461, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + dwID = 36279, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "隐元会暗杀者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36284, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无名", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36285, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36286, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·阴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36306, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黑鹰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36312, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "邪影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36313, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·子", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36314, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·丑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36317, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·辰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·巳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36320, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·未", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36321, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·申", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36323, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·戌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36324, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·亥", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36327, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "愁城", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [358] = { + { + dwID = 63881, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "姜仇封", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63882, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "魏宗明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63883, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "宫傲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [182] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 22, + szName = "圆弧劈", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27654, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "带盾剑俑·2号", + tRelation = { + bAll = true, + }, + }, + }, + szName = "带盾俑(云)", + nFrame = 47, + }, + { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27653, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "带盾剑俑·1号", + tRelation = { + bAll = true, + }, + }, + }, + szName = "带盾俑(剑)", + }, + { + nFrame = 67, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 27711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "不祥的黑蛇", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 37, + szName = "不祥的黑蛇", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,冲撞;62,准备跳灯;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安禄山", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 27644, + nFrame = 47, + }, + { + nFrame = 52, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "岚尘剑", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "下一次出剑", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27715, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "古剑", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "下一次出剑", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 15, + szName = "魅惑", + nRefresh = 10, + nClass = 7, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "探雪", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 30354, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27642, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙方士", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 28, + szName = "狼牙方士", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "随机技能", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27616, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "随即技能", + nIcon = 2589, + nTime = 11, + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.75,准备麒麟修复;0.25,准备麒麟修复;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石麒麟", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 27676, + nFrame = 67, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 35, + szName = "车俑", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 30353, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + { + dwID = 27623, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王翦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 27689, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "切割机", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 27717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "令狐伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30378, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "岚剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30379, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "谷剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30380, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冬剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30402, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "擎天兵俑巨像", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30429, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "将俑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36029, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盗墓贼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [184] = { + { + tCountdown = { + { + nIcon = 346, + nTime = 43, + szName = "躲避落石", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "墨家秘殿落石", + dwID = 30507, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "23,QTE准备;45,躲避落石;", + }, + }, + dwID = 30398, + nFrame = 47, + }, + }, + [370] = { + { + dwID = 66135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毒心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影嗔(智)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66150, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影痴(礼)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66151, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影慢(信)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66161, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影贪(仁)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影疑(义)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66168, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄穆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [190] = { + { + dwID = 36683, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王史涯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [192] = { + { + nFrame = 57, + dwID = 36976, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + szName = "史思明:10PT", + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "毒血涌动", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 2589, + nTime = "12,盲眼血奴;41,魄衣血仆;72,赤狼卫;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36845, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·琵琶", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "连线", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "白陶·琵琶:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36846, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·箜篌", + tRelation = { + bAll = true, + }, + }, + }, + szName = "白陶·箜篌:10PT", + }, + { + nFrame = 57, + dwID = 37006, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安雨", + tRelation = { + bAll = true, + }, + }, + }, + szName = "安雨:10PT", + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "45,圣火焚城;105,圣火樊城;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36841, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阿独鹿", + tRelation = { + bAll = true, + }, + }, + }, + szName = "阿独鹿:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36842, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌素尔", + tRelation = { + bAll = true, + }, + }, + }, + szName = "乌素尔:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 36843, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可蒙", + tRelation = { + bAll = true, + }, + }, + }, + szName = "可蒙:10PT", + }, + { + dwID = 36861, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36977, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盲眼血奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36979, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "赤狼卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37009, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鲜血聚力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37010, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵魂聚力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "严孝通", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“恶修罗”端木正我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38201, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“烈焰燎原”贲百胜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38262, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“孤影绝尘”赫连武功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41161, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军资箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [263] = { + { + dwID = 55542, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳愚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55607, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳哲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55614, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "耀武卫·外功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55615, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清霄卫·内功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55637, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "解语", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55641, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "周武侍卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55872, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰盔龙甲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55906, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小机器人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55956, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史朝英", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55960, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蛇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [198] = { + [7] = { + tCountdown = { + { + nIcon = 346, + nTime = 37, + szName = "飞斧气场", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "飞斧气场:25PT", + dwID = 40646, + nFrame = 57, + }, + [1] = { + tCountdown = { + { + nIcon = 346, + key = "火龙机雷", + nTime = 30, + szName = "火龙机雷", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40586, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙机雷", + tRelation = { + bAll = true, + }, + }, + }, + szName = "火龙机雷:25PT", + nFrame = 52, + }, + [2] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "黑油圈", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 40584, + szName = "黑油圈:25PT", + szNote = "★远离油圈★远离油圈★", + nFrame = 57, + }, + [4] = { + nFrame = 52, + szName = "火龙摧城:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙摧城", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "黑油圈", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,追击火龙;16,火龙机雷;60,摧城一击;", + }, + }, + dwID = 40581, + }, + [8] = { + nFrame = 47, + szName = "田布戈:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "田布戈", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7.5,断骨;18,飞斧气场;25,准备排火;195,点名;", + }, + { + nIcon = 13, + nTime = 65, + szName = "虎啸(穿透)", + nFrame = 8, + nClass = 7, + }, + }, + dwID = 40576, + }, + [9] = { + [3] = { + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军需物资", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 41164, + nFrame = 52, + }, + [5] = { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "下一波号角手", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 40748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙号角手", + tRelation = { + bAll = true, + }, + }, + }, + szName = "号角手:25PT", + nFrame = 47, + }, + [10] = { + dwID = 40719, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙攻城队长", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40587, + szName = "追击火龙:25PT", + tCountdown = { + { + nIcon = 346, + key = "追击火龙", + nTime = 30, + szName = "追击火龙", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [6] = { + nFrame = 67, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 40717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朝曦门飞石", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "★快射击★快射击★", + szName = "飞石:25PT", + }, + [12] = { + dwID = 40777, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "图拔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 40758, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可木汗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [271] = { + { + dwID = 56305, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "解语", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56316, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳愚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56323, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "周武侍卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56339, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰盔龙甲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳哲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56346, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小机器人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56359, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "耀武卫·外功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56362, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清霄卫·内功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56381, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史朝英", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [275] = { + { + dwID = 56254, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八重妙法村正", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56256, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "令狐伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56260, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩梨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56261, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳雪乾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56265, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳贯角的影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [204] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 13, + key = "DPS停手", + nTime = 0, + szName = "DPS停手", + nClass = 12, + }, + { + nIcon = 13, + key = "黑风破岩斩", + nTime = 0, + szName = "黑风破岩斩", + nClass = 12, + }, + [4] = { + nClass = 7, + szName = "正面AOE", + nIcon = 13, + nTime = 7, + }, + [3] = { + nIcon = 13, + key = "正面AOE", + nTime = 0, + szName = "正面AOE", + nClass = 12, + }, + }, + dwID = 41826, + }, + }, + [206] = { + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42139, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可蒙", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "剁山劈(破甲)", + nTime = 7, + szName = "剁山劈(破甲)", + nClass = 7, + }, + }, + szName = "可蒙:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42137, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阿独鹿", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 8, + key = "恐惧debuff", + nTime = 17, + szName = "恐惧debuff", + nClass = 7, + nIcon = 346, + }, + }, + szName = "阿独鹿:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌素尔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "断浪斩(流血)", + nTime = 11, + szName = "断浪斩(流血)", + nClass = 7, + }, + }, + szName = "乌素尔:25TZ", + }, + { + nFrame = 57, + dwID = 42172, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安雨", + tRelation = { + bAll = true, + }, + }, + }, + szName = "安雨:25TZ", + tCountdown = { + { + nIcon = 346, + key = "★圣火焚城★", + nTime = 45, + szName = "圣火樊城", + nClass = 7, + }, + { + nIcon = 13, + key = "☆圣火焚城☆", + nTime = 105, + szName = "圣火樊城", + nClass = 7, + }, + }, + }, + { + nFrame = 67, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 42176, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵魂聚力", + tRelation = { + bAll = true, + }, + }, + }, + szName = "灵魂聚力:25TZ", + }, + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 42175, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鲜血聚力", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + szName = "鲜血聚力:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·箜篌", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "蓝色连线", + nIcon = 3448, + nTime = 14, + }, + { + nClass = 7, + nIcon = 3449, + szName = "红色连线", + nTime = 57, + }, + }, + szName = "白陶·箜篌:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "白陶·琵琶:25TZ", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·琵琶", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "莲花指", + nIcon = 13, + nTime = 5, + }, + }, + dwID = 42141, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szName = "史思明:25TZ", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "11,盲眼血奴;41,魄衣血仆;60,血染春秋;71,赤狼卫;", + }, + { + nClass = 7, + nIcon = 13, + nTime = "5,P1毒血涌动;45,P1毒血涌动;75,P1毒血涌动;107,P1毒血涌动;135,P1毒血涌动;", + }, + }, + dwID = 42168, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + szName = "灌血掌终", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灌血掌终点", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 42190, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + nFrame = 67, + dwID = 42371, + }, + { + dwID = 42157, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盲眼血奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42171, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "赤狼卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "严孝通", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“恶修罗”端木正我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42217, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“烈焰燎原”贲百胜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42230, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“孤影绝尘”赫连武功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42269, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军资箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [287] = { + { + dwID = 58859, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "炮弹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58860, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "司晴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58864, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·普伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58865, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·技伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58866, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·外防", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58867, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·内防", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58880, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李令霞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58881, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李令霞·分身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58884, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙弓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58885, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石斑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58886, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58921, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·回血", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58941, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石斑喷射", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [212] = { + { + nFrame = 57, + dwID = 42696, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + szName = "史思明:10TZ", + tCountdown = { + { + nIcon = 4504, + nTime = 5, + szName = "毒血涌动", + nRefresh = 10, + nClass = 7, + }, + { + nIcon = 346, + nClass = 7, + nTime = "11,盲眼血奴;41,魄衣血仆;69,血染春秋;71,赤狼卫;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42669, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·琵琶", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "连线", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "白陶·琵琶:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42670, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·箜篌", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3401, + nTime = 8, + szName = "莲花指", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "白陶·箜篌:10TZ", + }, + { + nFrame = 57, + dwID = 42700, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安雨", + tRelation = { + bAll = true, + }, + }, + }, + szName = "安雨:10TZ", + tCountdown = { + { + nIcon = 346, + nClass = 7, + nTime = "45,圣火焚城;105,圣火樊城;", + }, + }, + }, + { + szName = "断浪气劲:10TZ", + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 42688, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42665, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阿独鹿", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 8, + nTime = 17, + szName = "恐惧debuff", + nIcon = 346, + nClass = 7, + }, + }, + szName = "阿独鹿:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42666, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌素尔", + tRelation = { + bAll = true, + }, + }, + }, + szName = "乌素尔:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42667, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可蒙", + tRelation = { + bAll = true, + }, + }, + }, + szName = "可蒙:10TZ", + }, + { + dwID = 42685, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42697, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盲眼血奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42699, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "赤狼卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42703, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鲜血聚力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵魂聚力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42713, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "严孝通", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42718, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灌血掌终点", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42736, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“恶修罗”端木正我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42745, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“烈焰燎原”贲百胜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42758, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“孤影绝尘”赫连武功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42797, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军资箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [299] = { + { + dwID = 60704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌索", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60707, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60715, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞虫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60718, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "靳空明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60721, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "突袭军狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60726, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "练血之奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60727, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "迷乱之奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狂乱巨鳄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60769, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绿球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60783, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼神令使", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [216] = { + { + [3] = { + bScreenHead = true, + }, + dwID = 45043, + nFrame = 47, + }, + }, + [218] = { + [6] = { + nFrame = 47, + dwID = 42890, + tCountdown = { + { + nClass = 3, + szName = "流风五连斩", + nIcon = 13, + nTime = 20, + }, + }, + }, + [2] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42884, + szNote = "外功减伤", + szName = "壁·外减伤", + }, + [3] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42886, + szNote = "内功减伤", + szName = "界·内减伤", + }, + [1] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42887, + szNote = "增加攻击", + szName = "攻·加攻", + }, + [4] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42883, + szNote = "反弹伤害", + szName = "镜·反弹", + }, + [5] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42885, + szNote = "被(内功)击回血", + szName = "宁·回血", + }, + }, + [220] = { + { + dwID = 43110, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屈焰阳", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "刺客出现", + nIcon = 2589, + nTime = 70, + }, + { + nClass = 7, + nIcon = 2589, + nTime = "27,连斩;57,泣;", + }, + { + nClass = 7, + szName = "追魂剑气", + nIcon = 3443, + nTime = 67, + }, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 3, + szName = "刺客出现", + nIcon = 2589, + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43115, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "龙图刺客", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + tCountdown = { + { + nClass = 3, + szName = "破敌", + nIcon = 4224, + nTime = 10, + }, + }, + szName = "半月刀气", + dwID = 44553, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 45723, + }, + [16] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "当前集火★", + nTime = "20,当前集火★女;40,当前集火★男;60,当前集火★女;80,当前集火★男;100,当前集火★女;120,当前集火★男;140,当前集火★女;160,当前集火★男;180,当前集火★女;200,当前集火★男;220,当前集火★女;240,当前集火★男;260,当前集火★女;280,当前集火★男;300,当前集火★女;320,当前集火★男;340,当前集火★女;360,当前集火★男;380,当前集火★女;400,当前集火★男;420,当前集火★女;440,当前集火★男;460,当前集火★女;480,当前集火★男;500,当前集火★女;520,当前集火★男;540,当前集火★女;560,当前集火★男;580,当前集火★女;600,当前集火★男;620,当前集火★女;640,当前集火★男;660,当前集火★女;680,当前集火★男;700,当前集火★女;720,当前集火★男;740,当前集火★女;760,当前集火★男;780,当前集火★女;800,当前集火★男;820,当前集火★女;840,当前集火★男;860,当前集火★女;880,当前集火★男;900,当前集火★女;", + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43118, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏十三娘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [17] = { + tCountdown = { + { + nClass = 3, + szName = "准备集火★八荒阵眼★", + nIcon = 2028, + nTime = 10, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43121, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八荒阵眼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 45721, + }, + [18] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 43120, + nFrame = 57, + }, + [31] = { + dwID = 46220, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "张关毅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [5] = { + nFrame = 57, + dwID = 44543, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + nTime = "6,半月;105,气场消失;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "4,斩流剑·徊;18,斩流剑·灭;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,居合;42,居合;54,居合·扫;62,斩流剑气场;", + }, + }, + szName = "斩流剑", + }, + [10] = { + dwID = 43720, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李玚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [20] = { + dwID = 44591, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [30] = { + dwID = 46219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "古定音", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 45036, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "一鼓作气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "仲虚念", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43869, + tCountdown = { + { + nClass = 7, + nIcon = 2123, + nTime = "11,紫金钵;", + }, + }, + }, + [22] = { + dwID = 45259, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞花之刃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "森九岚", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43323, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,居合;19,居合;29,斩流剑气场;", + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 44588, + nFrame = 57, + }, + [12] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "紫金钵", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43959, + nFrame = 57, + }, + [24] = { + dwID = 46203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "游荡的咸鱼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + nFrame = 57, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "相如剑牢", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "相如剑牢", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43127, + }, + [25] = { + dwID = 46211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛山石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "三环锡杖", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43868, + nFrame = 57, + }, + [26] = { + dwID = 46214, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "张冬恩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [27] = { + dwID = 46215, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王澤渝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 45720, + }, + [14] = { + nFrame = 57, + dwID = 43966, + szName = "涅槃经", + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 28, + szName = "三环锡杖", + nRefresh = 30, + nClass = 3, + }, + { + nClass = 3, + szName = "涅槃经", + nIcon = 2589, + nTime = 45, + }, + }, + }, + [28] = { + dwID = 46216, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "陈镜儒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [23] = { + dwID = 46149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阎纹陲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [29] = { + dwID = 46217, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "郑羽焯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李璘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + dwID = 43117, + }, + }, + [143] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寅·中", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巳·真身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尸罐·真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天一教大祭祀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小贼雅克", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [46] = { + { + dwID = 6408, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "餐风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6420, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "迦兰武僧头目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "燎原", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6431, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "平等", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6435, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "吞云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6436, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王海银", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6451, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "饮火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6454, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "掌火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6455, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "镇恶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6456, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朱癸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7602, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "千手观音", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7686, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7687, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无相", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [228] = { + { + dwID = 46663, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣者剑意", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 46676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王者剑意", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [230] = { + [13] = { + dwID = 47145, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池·幻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "【白云】打断", + nFrame = 0, + nClass = 3, + }, + }, + }, + [1] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "品竹曲", + nTime = "84,品竹曲;123,音缠;163,音缠;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "准备QTE", + nTime = "22,准备QTE;62,准备QTE;167,幻魔问心曲;", + }, + }, + dwID = 47147, + }, + [2] = { + dwID = 47144, + tCountdown = { + { + nClass = 3, + szName = "音缠消失", + nIcon = 2589, + nTime = 14, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "莫雨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,分川手·排浪;26,分川手·排浪;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,准备转P2;0.35,准备转P2;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,情绪失控;65,镇狱眼;", + }, + }, + dwID = 47101, + }, + [8] = { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毛毛", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47109, + }, + [9] = { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可人", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47110, + }, + [5] = { + nFrame = 47, + tCountdown = { + { + nIcon = 327, + key = "知心火消失", + nTime = 20, + szName = "知心火消失", + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47106, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "知心火控制", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "控制", + szName = "知心火", + }, + [10] = { + dwID = 47097, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李白", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,行舟;21,行舟;34,行舟;", + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.75,准备进入P2;0.45,准备进入P3;", + }, + { + nClass = 7, + szName = "二式·登楼", + nIcon = 2589, + nTime = 44, + }, + }, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 47120, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻魔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "幻魔附体", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47123, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "【剑】打断", + nFrame = 7, + nClass = 3, + }, + }, + }, + [12] = { + tCountdown = { + { + nClass = 3, + szName = "青莲子剑", + nIcon = 13, + nTime = 50, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 47118, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "青莲子剑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "P3青莲子剑", + nFrame = 52, + }, + [11] = { + nFrame = 57, + dwID = 47117, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,行舟;15,行舟;23,行舟;", + }, + { + nClass = 4, + nTime = 28, + szName = "缠", + nIcon = 3404, + nFrame = 8, + }, + [4] = { + nClass = 4, + szName = "七式·踏歌", + nIcon = 2589, + nTime = 40, + }, + [3] = { + nIcon = 2589, + key = "映日", + nTime = 0, + szName = "映日", + nClass = 4, + }, + }, + }, + }, + [232] = { + { + dwID = 47435, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "26,连斩;56,泣;", + }, + { + nClass = 7, + szName = "刺客出现", + nIcon = 2589, + nTime = 70, + }, + { + nClass = 7, + szName = "追魂剑气", + nIcon = 3443, + nTime = 65, + }, + }, + }, + { + dwID = 47176, + tCountdown = { + { + nIcon = 2589, + nClass = 3, + szName = "刺客出现", + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + szName = "斩流剑", + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "27,居合;42,居合;54,居合·扫;62,斩流剑气场;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "4,斩流剑·徊;18,斩流剑·灭;", + }, + { + nClass = 3, + nIcon = 2589, + nTime = "6,半月;105,气场消失;", + }, + }, + dwID = 47218, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 57, + dwID = 47362, + }, + [16] = { + nFrame = 57, + dwID = 47276, + szName = "涅槃经3", + }, + [17] = { + nFrame = 57, + dwID = 43966, + szName = "涅槃经2", + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47364, + }, + [18] = { + nFrame = 57, + dwID = 47208, + szName = "涅槃经1", + }, + [5] = { + nFrame = 57, + szName = "半月刀气", + tCountdown = { + { + nClass = 3, + szName = "破敌", + nIcon = 4224, + nTime = 10, + }, + }, + dwID = 47272, + }, + [10] = { + nFrame = 47, + dwID = 47611, + }, + [20] = { + tCountdown = { + { + nIcon = 2589, + nClass = 7, + key = "当前集火★", + nTime = "20,当前集火★女;40,当前集火★男;60,当前集火★女;80,当前集火★男;100,当前集火★女;120,当前集火★男;140,当前集火★女;160,当前集火★男;180,当前集火★女;200,当前集火★男;220,当前集火★女;240,当前集火★男;260,当前集火★女;280,当前集火★男;300,当前集火★女;320,当前集火★男;340,当前集火★女;360,当前集火★男;380,当前集火★女;400,当前集火★男;420,当前集火★女;440,当前集火★男;460,当前集火★女;480,当前集火★男;500,当前集火★女;520,当前集火★男;540,当前集火★女;560,当前集火★男;580,当前集火★女;600,当前集火★男;620,当前集火★女;640,当前集火★男;660,当前集火★女;680,当前集火★男;700,当前集火★女;720,当前集火★男;740,当前集火★女;760,当前集火★男;780,当前集火★女;800,当前集火★男;820,当前集火★女;840,当前集火★男;860,当前集火★女;880,当前集火★男;900,当前集火★女;", + }, + }, + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47463, + }, + [21] = { + nFrame = 57, + dwID = 47206, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "准备集火★八荒阵眼★", + nIcon = 2028, + nTime = 9, + }, + }, + }, + [11] = { + dwID = 47536, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2123, + nTime = "11,紫金钵;", + }, + }, + }, + [22] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47205, + }, + [3] = { + dwID = 47479, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,居合;19,居合;29,斩流剑气场;", + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47283, + nFrame = 57, + }, + [12] = { + tCountdown = { + { + szName = "一鼓作气消失", + nClass = 3, + nIcon = 2589, + nTime = 15, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 47288, + [4] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + [13] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47202, + }, + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47361, + }, + [14] = { + tCountdown = { + { + szName = "紫金灭", + nClass = 3, + nIcon = 3398, + nTime = 25, + }, + }, + nFrame = 57, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47256, + }, + [19] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 47448, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47225, + nFrame = 57, + }, + }, + [234] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屈焰阳", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "炮击", + nTime = "25,连斩;70,箭卫;", + }, + { + nIcon = 2589, + nClass = 7, + key = "刺客小怪", + nTime = "81,刺客小怪;161,刺客小怪;241,刺客小怪;321,刺客小怪;401,刺客小怪;481,刺客小怪;561,刺客小怪;641,刺客小怪;", + }, + [4] = { + nIcon = 3293, + key = "龙图炮击", + nTime = 75, + szName = "龙图炮击", + nFrame = 8, + nClass = 7, + }, + [3] = { + nIcon = 2589, + key = "刺客小怪", + nTime = 0, + szName = "刺客小怪", + nClass = 12, + }, + }, + dwID = 48269, + }, + { + nFrame = 57, + col = { + 255, + 2, + 208, + }, + dwID = 48271, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szName = "箭卫", + tCountdown = { + { + nClass = 3, + szName = "箭卫", + nIcon = 2589, + nTime = 70, + }, + }, + }, + { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "龙图刺客", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48270, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "森九岚", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,居合;19,居合;29,斩流剑气场;", + }, + }, + dwID = 48289, + }, + { + nFrame = 57, + dwID = 48315, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "气场消失", + nTime = "6,半月;105,气场消失;", + }, + { + nClass = 4, + nIcon = 2589, + key = "气场消失", + nTime = "4,斩流剑·徊;18,斩流剑·灭;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,居合;42,居合;54,居合·扫;62,斩流剑气场;", + }, + }, + szName = "斩流剑", + }, + { + nFrame = 57, + dwID = 48323, + szName = "半月刀气", + tCountdown = { + { + nClass = 3, + szName = "破敌", + nIcon = 4224, + nTime = 10, + }, + }, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48326, + }, + { + nFrame = 47, + dwID = 48408, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "仲虚念", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,紫金钵;62,三环锡杖;", + }, + }, + dwID = 48300, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "紫金钵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48304, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "三环锡杖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48299, + }, + { + szName = "涅槃经", + dwID = 48306, + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李璘", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48272, + nFrame = 47, + }, + { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48273, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏十三娘", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "当前集火★", + nTime = "20,当前集火★女;40,当前集火★男;60,当前集火★女;80,当前集火★男;100,当前集火★女;120,当前集火★男;140,当前集火★女;160,当前集火★男;180,当前集火★女;200,当前集火★男;220,当前集火★女;240,当前集火★男;260,当前集火★女;280,当前集火★男;300,当前集火★女;320,当前集火★男;340,当前集火★女;360,当前集火★男;380,当前集火★女;400,当前集火★男;420,当前集火★女;440,当前集火★男;460,当前集火★女;480,当前集火★男;500,当前集火★女;520,当前集火★男;540,当前集火★女;560,当前集火★男;580,当前集火★女;600,当前集火★男;620,当前集火★女;640,当前集火★男;660,当前集火★女;680,当前集火★男;700,当前集火★女;720,当前集火★男;740,当前集火★女;760,当前集火★男;780,当前集火★女;800,当前集火★男;820,当前集火★女;840,当前集火★男;860,当前集火★女;880,当前集火★男;900,当前集火★女;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 48276, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八荒阵眼", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "准备集火★八荒阵眼★", + nIcon = 2028, + nTime = 9, + }, + }, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 48275, + }, + { + dwID = 48280, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "相如剑牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48290, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李玚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48328, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48386, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "一鼓作气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48399, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞花之刃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48413, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [236] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屈焰阳", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "炮击", + nTime = "25,连斩;60,箭卫;", + }, + { + nClass = 7, + key = "龙图炮击", + nTime = 75, + szName = "龙图炮击", + nFrame = 8, + nIcon = 3293, + }, + { + nIcon = 2589, + nClass = 7, + key = "刺客小怪", + nTime = "70,刺客小怪;141,刺客小怪;211,刺客小怪;281,刺客小怪;351,刺客小怪;421,刺客小怪;", + }, + }, + dwID = 48481, + }, + { + nFrame = 57, + col = { + 255, + 2, + 233, + }, + dwID = 48487, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = true, + }, + }, + szName = "箭卫", + tCountdown = { + { + nClass = 3, + szName = "箭卫", + nIcon = 2589, + nTime = 60, + }, + }, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "森九岚", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,居合;19,居合;29,斩流剑气场;", + }, + }, + dwID = 48503, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48609, + nFrame = 57, + }, + [16] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "三环锡杖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48531, + }, + [17] = { + nFrame = 57, + szName = "涅槃经", + dwID = 48582, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48667, + nFrame = 57, + }, + [18] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李璘", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48488, + nFrame = 47, + }, + [5] = { + szName = "斩流剑", + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "气场消失", + nTime = "6,半月;92,气场消失;", + }, + { + nClass = 4, + nIcon = 2589, + key = "气场消失", + nTime = "4,斩流剑·徊;18,斩流剑·灭;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,居合;42,居合;54,居合·扫;62,斩流剑气场;", + }, + }, + nFrame = 57, + dwID = 48524, + }, + [10] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫队副", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48670, + nFrame = 57, + }, + [20] = { + tCountdown = { + { + nClass = 3, + szName = "准备集火★八荒阵眼★", + nIcon = 2028, + nTime = 9, + }, + { + nClass = 3, + szName = "男BOSS满蓝", + nIcon = 13, + nTime = 35, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 48512, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八荒阵眼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [21] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 48511, + nFrame = 57, + }, + [11] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫队副", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48668, + nFrame = 57, + }, + [22] = { + dwID = 48493, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李玚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "龙图刺客", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48482, + }, + [6] = { + dwID = 48578, + nFrame = 57, + tCountdown = { + { + nClass = 3, + szName = "破敌&落", + nIcon = 4224, + nTime = 10, + }, + }, + szName = "半月", + }, + [12] = { + nFrame = 47, + dwID = 48665, + }, + [24] = { + dwID = 48594, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "一鼓作气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞花之刃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48508, + }, + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48589, + nFrame = 57, + }, + [14] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "仲虚念", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,紫金钵;70,三环锡杖;", + }, + }, + dwID = 48532, + }, + [23] = { + dwID = 48538, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "相如剑牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48495, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏十三娘", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "当前集火★", + nTime = "20,当前集火★女;40,当前集火★男;60,当前集火★女;80,当前集火★男;100,当前集火★女;120,当前集火★男;140,当前集火★女;160,当前集火★男;180,当前集火★女;200,当前集火★男;220,当前集火★女;240,当前集火★男;260,当前集火★女;280,当前集火★男;300,当前集火★女;320,当前集火★男;340,当前集火★女;360,当前集火★男;380,当前集火★女;400,当前集火★男;420,当前集火★女;440,当前集火★男;460,当前集火★女;480,当前集火★男;500,当前集火★女;520,当前集火★男;540,当前集火★女;560,当前集火★男;580,当前集火★女;600,当前集火★男;620,当前集火★女;640,当前集火★男;660,当前集火★女;680,当前集火★男;700,当前集火★女;720,当前集火★男;740,当前集火★女;760,当前集火★男;780,当前集火★女;800,当前集火★男;820,当前集火★女;840,当前集火★男;860,当前集火★女;880,当前集火★男;900,当前集火★女;", + }, + }, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "紫金钵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48562, + }, + }, + [347] = { + { + dwID = 62195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62672, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教隐遁者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62673, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教殉道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62674, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教审判者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62675, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教揭示者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62677, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教大力士", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62701, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62794, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉结晶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "流火化蝠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [240] = { + { + dwID = 51004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51060, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳绯君", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "挡球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51068, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "章灰琳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51096, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "曹炎烈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51102, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "风球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51103, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "追命箭矢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "沈眠风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙悍将", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51385, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "独孤先生", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51389, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51947, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙守备官", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51978, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "敦敦敦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52210, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "噬骨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "炸药", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53712, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉幻影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [242] = { + { + nFrame = 47, + dwID = 51211, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.99,拉人,15;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,分散&准备点名,33;", + }, + }, + }, + { + nFrame = 47, + dwID = 51334, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "4,面向AOE;13,AOE圈;23,龙卷风;31,气场;", + }, + }, + }, + [4] = { + nFrame = 47, + dwID = 51352, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.90,霜印准备;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.50,AOE圈准备;", + }, + }, + }, + [3] = { + nFrame = 57, + dwID = 51346, + tCountdown = { + { + nIcon = 13, + nTime = 28, + szName = "龙卷风消失", + nFrame = 1, + nClass = 3, + }, + }, + szName = "龙卷风", + }, + }, + [244] = { + [2] = { + nFrame = 47, + dwID = 51601, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "4,面向AOE;13,AOE圈;23,龙卷风;31,气场;", + }, + }, + }, + [3] = { + tCountdown = { + { + nFrame = 1, + nTime = 28, + szName = "龙卷风消失", + nIcon = 13, + nClass = 3, + }, + }, + nFrame = 57, + szName = "龙卷风", + dwID = 51619, + }, + [1] = { + nFrame = 47, + dwID = 51632, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.32,准备站桩打;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,拉人,15;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,分散&准备点名,33;", + }, + }, + }, + [4] = { + nFrame = 47, + dwID = 51631, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.90,霜印准备;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.50,AOE圈准备;", + }, + }, + }, + [5] = { + nFrame = 57, + szName = "冰块", + dwID = 51665, + [3] = { + bScreenHead = true, + }, + }, + }, + [62] = { + { + dwID = 7448, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "大树", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [248] = { + { + dwID = 53813, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53817, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳绯君", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53823, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "挡球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53825, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "章灰琳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53826, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "曹炎烈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53832, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "风球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53833, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "追命箭矢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53837, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "沈眠风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53842, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙悍将", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53851, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "独孤先生", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53855, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53897, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙守备官", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53911, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "敦敦敦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53941, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "噬骨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53959, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "炸药", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53984, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉幻影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [119] = { + { + dwID = 14001, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "慕容野狐", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14002, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "殷青丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "里赤梅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14005, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏贝德哈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [118] = { + { + dwID = 14020, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "慕容野狐", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14021, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "殷青丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14023, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "里赤梅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14024, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏贝德哈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [117] = { + { + dwID = 13962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "慕容野狐", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13963, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "殷青丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13965, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "里赤梅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13966, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏贝德哈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [264] = { + { + dwID = 55513, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳鸾旗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55519, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "雷食兽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55585, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻境魔影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55657, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55972, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "柳秀岳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56013, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "木材→金", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56015, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "合金块→火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56016, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒水石→土", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "硫磺岩→水", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56018, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "土块→木", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56022, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "雷溶石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56783, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "法健公", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [283] = { + { + dwID = 57245, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "报九枫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57257, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "化羽蝶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57407, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌灵风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57428, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巨蜂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57463, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "唐书雁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57502, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "也漠河", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巨木穿刺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57664, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无支祁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58231, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "连弩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "重弩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [133] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 83, + szName = "万毒奔腾", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + dwID = 18394, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 55, + szName = "下一次毒球掉落", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + }, + dwID = 18396, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毒球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 36, + szName = "第一次蛊毒点名", + nRefresh = 10, + nClass = 7, + }, + }, + dwID = 18386, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "玛索", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,霸王蛇;20,空谷清韵;30,噬脉蛊;45,霸王蛇;55,空谷清韵;65,噬脉蛊;70,霸王蛇;80,空谷清韵;90,噬脉蛊;105,霸王蛇;115,空谷清韵;125,噬脉蛊;130,霸王蛇;140,空谷清韵;150,噬脉蛊;165,霸王蛇;175,空谷清韵;185,噬脉蛊;190,霸王蛇;200,空谷清韵;210,噬脉蛊;225,霸王蛇;235,空谷清韵;245,噬脉蛊;250,霸王蛇;260,空谷清韵;270,噬脉蛊;285,霸王蛇;295,空谷清韵;305,噬脉蛊;", + }, + }, + dwID = 18370, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌蒙贵", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7,第一批护卫;", + }, + }, + dwID = 18369, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "索笛尔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,天龙回风;35,龙行虎步;50,天龙回风;65,龙行虎步;75,天龙回风;85,龙扫八荒;135,天龙回风;150,龙行虎步;165,天龙回风;180,龙行虎步;190,天龙回风;200,龙扫八荒;250,天龙回风;265,龙行虎步;280,天龙回风;295,龙行虎步;305,天龙回风;315,龙扫八荒;365,天龙回风;380,龙行虎步;395,天龙回风;410,龙行虎步;420,天龙回风;430,龙扫八荒", + }, + }, + dwID = 17406, + }, + { + nFrame = 52, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "南之雷神", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,雷涌;40,扫射;61,扫射结束;81,扫射;102,扫射结束;114,雷涌;123,贴地电流;180,雷涌;195,扫射;216,扫射结束;236,扫射;257,扫射结束;269,雷涌;278,贴地电流;335,雷涌;350,扫射;371,扫射结束;391,扫射;412,扫射结束;424,雷涌;433,贴地电流", + }, + }, + dwID = 17328, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "陆寻", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "30,双眼放出寒光;35,奔狼踏月式;65,双眼放出寒光;70,奔狼踏月式;100,双眼放出寒光;105,奔狼踏月式;135,双眼放出寒光;140,奔狼踏月式;170,双眼放出寒光;175,奔狼踏月式;205,双眼放出寒光;210,奔狼踏月式;240,双眼放出寒光;245,奔狼踏月式", + }, + }, + dwID = 17321, + }, + { + dwID = 17292, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "武逸青", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17293, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "胡鞑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天蛛巨尸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17378, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "醉蛛老人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17382, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瓷罐", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17417, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒雷冰锁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "千秋子", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17576, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小邪子", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17654, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祭龙潭巡守", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18372, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "霸王蛇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18377, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祭龙潭傀儡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [68] = { + { + dwID = 8117, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "牡丹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 8147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "血玉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 10570, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵气内力结界", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 11142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冥花连舞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 11674, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "卓婉清", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [-1] = { + { + [3] = { + bTeamChannel = true, + }, + dwID = 11734, + nFrame = 47, + }, + { + nFrame = 67, + [3] = { + bScreenHead = true, + }, + dwID = 51501, + }, + }, + [70] = { + { + dwID = 13479, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "血玉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13540, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冥花连舞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [407] = { + { + dwID = 65836, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白沫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65839, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "悉达罗摩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65840, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "曹庆司", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65844, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鬼鬼祟祟的弓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65847, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "形迹可疑的海寇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [72] = { + [13] = { + dwID = 14970, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "卓婉清", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 35, + szName = "下一次跑圈准备", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 14941, + }, + [1] = { + [3] = { + bCenterAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 67, + dwID = 13479, + }, + [2] = { + [3] = { + bCenterAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "血玉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 67, + dwID = 14901, + }, + [4] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "阴性血玉", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 13546, + }, + [8] = { + tCountdown = { + { + nIcon = 346, + nTime = 13, + szName = "维提吠达特天罚剑", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + bCenterAlarm = true, + }, + dwID = 14897, + szName = "天罚剑★25YX", + nFrame = 52, + }, + [9] = { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + nTime = 42, + szName = "捆缚祭链", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "捆缚祭链(英雄)", + dwID = 14899, + }, + [5] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "血涂风暴", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14966, + }, + [10] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 54, + szName = "疯狂祭司", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 15188, + }, + [3] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 56, + szName = "阴性血玉", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14968, + }, + [6] = { + tCountdown = { + { + nIcon = 346, + nTime = 31, + szName = "冥花连舞", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冥花连舞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [12] = { + dwID = 14943, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵气内力结界", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 8117, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "牡丹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [145] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寅·中", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巳·真身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尸罐·真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天一教大祭祀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小贼雅克", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [147] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寅·中", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巳·真身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "尸罐·真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天一教大祭祀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小贼雅克", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [109] = { + { + dwID = 12171, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "慕容野狐", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "殷青丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12241, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "里赤梅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12249, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏贝德哈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [300] = { + { + dwID = 59995, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻念剑气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60003, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60028, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "地刺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60061, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "困兽囚笼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌夜啼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60067, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "月泉淮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60093, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蓄积的内力", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰髓毒爆弹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60119, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "暗月血球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60133, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "庄愈华", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "百慕玲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幽冥禁锢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [355] = { + { + dwID = 63845, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "文闰一", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63851, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "尹无咎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63852, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "尹无咎心魔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63855, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "魔念", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63861, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "连玉良", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63864, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "穆玄英", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [155] = { + [13] = { + dwID = 20386, + nFrame = 57, + }, + [7] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 62, + szName = "狼魂", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 20492, + }, + [1] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "动物出现", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21257, + }, + [2] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "动物出现", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21256, + }, + [4] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,随机技能;30,动物出现;40,随机技能;60,衮石投掷;65,怒火猛击;85,致命格挡;105,随机技能;125,随机技能;145,衮石投掷;150,怒火猛击;170,致命格挡;190,随机技能;210,随机技能;230,衮石投掷;235,怒火猛击;255,致命格挡;275,随机技能;295,随机技能;315,衮石投掷;320,怒火猛击;340,致命格挡;360,随机技能;", + }, + }, + dwID = 21601, + }, + [8] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 10, + szName = "火球自爆倒计时", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 19056, + }, + [9] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 120, + szName = "P2剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 20419, + }, + [5] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,第一次技能;70,第一次牢笼;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.71,0.7,0.31,0.3,0.21,0.2", + }, + }, + dwID = 21595, + }, + [10] = { + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,八部浮屠;", + }, + }, + szName = "萧沙(英雄)", + dwID = 20273, + }, + [14] = { + dwID = 20562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "恐怖处刑人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "动物出现", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21255, + }, + [6] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,第一次狼魂;", + }, + }, + dwID = 20280, + }, + [12] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "6,第一波泰拳手x2出现;11,第一波枪斧兵x1出现;20,绿球出现;30,红球出现;45,第二波泰拳手x3出现;50,第二波枪斧兵x2出现;60,绿球出现;70,红球出现;84,第三波泰拳手x3出现;89,第三波枪斧兵x2出现;100,绿球出现;110,红球出现;123,第四波泰拳手x2出现;128,第四波枪斧兵x1出现;140,绿球出现;150,红球出现;160,准备转阶段;165,第一个统帅出现;185,第二个统帅出现;225,第一个统帅出现;245,第二个统帅出现", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = 0.13, + }, + }, + dwID = 20383, + }, + [11] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,撕裂;22,震压火圈;32,火墙;62,震压火圈;82,震压火圈;122,震压火圈;142,震压火圈;182,震压火圈;202,震压火圈;240,狂暴剩余时间;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.2,0.23", + }, + }, + dwID = 20384, + }, + }, + [286] = { + { + dwID = 58409, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "报九枫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58413, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "化羽蝶·治疗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "化羽蝶·外功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "化羽蝶·内功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58419, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌灵风", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巨蜂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58428, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "唐书雁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58444, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "也漠河", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58445, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "巨木穿刺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58476, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无支祁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58539, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "连弩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58540, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "重弩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [284] = { + { + dwID = 57259, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙弓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57262, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石斑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57264, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57301, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石斑喷射", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57335, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "炮弹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57351, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李令霞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57352, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李令霞分身", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57462, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "司晴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57574, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·普伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57575, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·技伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57576, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·外防", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57577, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·内防", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57578, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "天山·回血", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [325] = { + { + dwID = 62714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铁黎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64011, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“白日鬼”源义还", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“锁魂猎人”刘三刀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64018, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“大嘴恶犬”吴大运", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64026, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“横叶一刀”服部段藏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [337] = { + { + dwID = 60632, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "康成辩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60634, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "源明信", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60635, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "康杖石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60668, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "雍和", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60677, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "星体禁锢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [165] = { + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,皇之怒;38,头狼点名;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.42,即将进入P3", + }, + }, + szName = "安禄山::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安禄山", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25110, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 40, + szName = "燃血笼锁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 25137, + szName = "燃血笼锁::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "血祭天", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25139, + szName = "凝血之地::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "【P3】下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25222, + szName = "狼牙军官::25", + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 50, + szName = "【P2】下一次小怪", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25141, + szName = "狼牙军官::25", + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "18,BOSS瞬移;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25084, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "使者出现", + nRefresh = 10, + nClass = 3, + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = 0, + }, + }, + szName = "祆教使者::25", + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 25106, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教使者", + tRelation = { + bAll = true, + }, + }, + }, + [11] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "红蓝火出现", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25092, + szName = "红莲之火::25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bCenterAlarm = true, + bFullScreen = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 25090, + szNote = "进入P2阶段", + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "使者出现", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "18,乾坤剑意;52,乾坤剑意;78,乾坤剑意;112,乾坤剑意;138,乾坤剑意;172,乾坤剑意;198,乾坤剑意;232,乾坤剑意;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·幻灭", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25202, + nFrame = 52, + }, + { + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乾坤剑意", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 25277, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 15, + szName = "血球出现", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25526, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "墓碑激活剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25205, + szName = "增益·锁神::25", + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "墓碑激活剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25204, + szName = "增益·妙手::25", + nFrame = 52, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,地狱恶鬼;30,离愁;", + }, + }, + dwID = 25166, + nFrame = 52, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,净土;25,饿鬼饥;", + }, + }, + dwID = 25161, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 34, + szName = "地狱恶鬼", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25170, + szName = "地狱恶鬼::25", + nFrame = 54, + }, + { + nFrame = 52, + szName = "傀儡丝::25", + [4] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡丝", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25169, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "平血剩余时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25175, + szName = "六道技能辅助体::25", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,击鼓手", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "独孤问俗", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25182, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 17, + szName = "干扰炸弹", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25224, + szName = "干扰炸弹::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 70, + szName = "击鼓手", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 25181, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "击鼓手", + tRelation = { + bAll = true, + }, + }, + }, + szName = "击鼓手::25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25325, + aFocus = { + { + nMaxDistance = 120, + szDisplay = "随机宝箱", + tRelation = { + bAll = true, + }, + }, + }, + szName = "随机宝箱::25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "最后一波进攻", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25326, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "下一波进攻", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25327, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "下一波进攻", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25301, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 62, + szName = "下一波进攻", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25302, + szName = "狼牙刀兵::25", + nFrame = 57, + }, + { + dwID = 25116, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑圣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25127, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "头狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无名", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25235, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "击鼓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25237, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "心魔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25239, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛星明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25240, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛星让", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25264, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蝴蝶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25268, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25269, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25289, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "何莘涯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25315, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屋顶漏洞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25342, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水鬼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25352, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李忘生", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25373, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡宝箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [332] = { + { + dwID = 64201, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毛天雷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "雪心狼王", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "纳什布尔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [339] = { + { + dwID = 60971, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "连玉良", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61032, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "文闰一", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61074, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "尹无咎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61076, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "尹无咎心魔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61079, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "魔念", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61729, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "穆玄英", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [171] = { + { + tCountdown = { + { + nIcon = 346, + nTime = 80, + szName = "龙卷风刷新", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + dwID = 24920, + szName = "沙啸风::25", + nFrame = 57, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "萧沙", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "78,龙卷风;", + }, + }, + dwID = 24909, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 31, + szName = "龙相气劲", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23191, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 32, + szName = "龙相气劲", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 24919, + }, + { + dwID = 24866, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "卓力格图", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24867, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "澹台枯火", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24868, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "闻人彦范", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24869, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "岳承志", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24871, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "破城锤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24872, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "骨牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24910, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "韦柔丝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [340] = { + { + dwID = 63764, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "端木珩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63768, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "哈尔芙林", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63802, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "翁幼之", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [175] = { + { + tCountdown = { + { + nIcon = 2589, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26461, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26462, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 2589, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26823, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [8] = { + tCountdown = { + { + nClass = 3, + szName = "空连湮标记圈", + nIcon = 2589, + nTime = 35, + }, + }, + dwID = 26234, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + [16] = { + tCountdown = { + { + nIcon = 2589, + nTime = 20, + szName = "下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26046, + nFrame = 57, + }, + [17] = { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 20, + szName = "下一波小怪", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26742, + }, + [9] = { + tCountdown = { + { + nClass = 7, + szName = "球", + nIcon = 2589, + nTime = 11, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阿史那从礼", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26229, + nFrame = 47, + }, + [18] = { + dwID = 26108, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "沙叱博", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [5] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,第二波小怪;60,第三波小怪;90,第四波小怪;120,第五波小怪;150,第六波小怪;180,最后一波小怪;", + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.53,准备转阶段;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黑齿元佑", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26001, + nFrame = 47, + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nTime = 19, + szName = "天行漫", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26235, + szNote = "治疗准备进!", + nFrame = 57, + }, + [20] = { + dwID = 26238, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蓝语涟·羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 26239, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鸢戾天·羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26276, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蓝语涟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "球", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [22] = { + dwID = 26277, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鸢戾天", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + tCountdown = { + { + nIcon = 2589, + key = "火箭雨[令狐伤]", + nTime = 150, + szName = "火箭雨[令狐伤]", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[苏曼莎]火箭雨", + nTime = 90, + szName = "[苏曼莎]火箭雨", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26583, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [6] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "15,内伤;40,骑兵冲锋;55,撼岳;", + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.75,准备进入【P2】;0.35,准备进入【P3】;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "沙叱博", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26275, + nFrame = 57, + }, + [12] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "50,点名QTE;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.72,准备跳黑白云;0.32,准备跳黑白云", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "曹炎烈", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26161, + nFrame = 47, + }, + [24] = { + dwID = 26279, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣狼灵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [25] = { + dwID = 26458, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏曼莎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "跳风结束倒计时", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26804, + nFrame = 47, + }, + [26] = { + dwID = 26459, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "令狐伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [27] = { + dwID = 26691, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "追命箭矢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 10, + szName = "集火狼时间", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26339, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + [14] = { + dwID = 26380, + szName = "【倒油门】藤甲兵", + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 33, + szName = "【倒油门】下一波", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [28] = { + dwID = 26805, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "追魂戟真气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [23] = { + dwID = 26278, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "金龙渊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + dwID = 26237, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "金龙渊·羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [15] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "席庶云", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nClass = 3, + nTime = "40,火星;69,云卷烟;", + }, + }, + dwID = 26755, + }, + }, + [177] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26136, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·寅", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A组·寅虎", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26137, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·卯", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A组·卯兔", + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26140, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·午", + tRelation = { + bAll = true, + }, + }, + }, + szName = "B组·午马", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "集火十二相时间", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26143, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·酉", + tRelation = { + bAll = true, + }, + }, + }, + szName = "C组·酉鸡", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "9,分骨;30,飞鸟出现;43,暗杀者出现;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "地字一号", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26119, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36457, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36458, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36459, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36460, + }, + { + dwID = 26019, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "隐元会暗杀者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26024, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无名", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26025, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26026, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·阴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26027, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "傀儡·噬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26126, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黑鹰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26133, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "邪影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·子", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·丑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·辰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26139, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·巳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·未", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·申", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26144, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·戌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26145, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "十二相·亥", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26148, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "愁城", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史朝义", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [356] = { + { + dwID = 63921, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "雍和", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63922, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "星体禁锢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63937, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "康成辩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63938, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "源明信", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63939, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "康杖石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [360] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "神罚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白圈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小太阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火把", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼窝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水源", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63511, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铂尔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63512, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "罗纳真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63519, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康疑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63546, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "落星", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63554, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "没藏呼月", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63582, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拿云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63612, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秘法门识破者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63613, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "方天剑豪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63634, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "信仰暴徒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63636, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣法门卫道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63644, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "遗落的食物", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63659, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火网", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63668, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拓跋思羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "熊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63679, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "红衣教告密者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63680, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣法门奴役者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄金气脉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [183] = { + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 36165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "不祥的黑蛇", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "不祥的黑蛇:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 23, + szName = "圆弧真气", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27655, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 346, + key = "致命一击", + nTime = 28, + szName = "致命一击", + nRefresh = 10, + nClass = 3, + nFrame = 2, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36131, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "带盾剑俑·1号", + tRelation = { + bAll = true, + }, + }, + }, + szName = "带盾俑(剑:25)", + nFrame = 47, + }, + [8] = { + nFrame = 52, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 255, + 0, + }, + dwID = 36191, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "谷剑", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "谷风★反弹★注意停手", + szName = "谷剑:25", + }, + [16] = { + tCountdown = { + { + nIcon = 346, + nTime = 28, + szName = "狼牙方士", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36124, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙方士", + tRelation = { + bAll = true, + }, + }, + }, + szName = "狼牙方士:25", + nFrame = 57, + }, + [17] = { + tCountdown = { + { + nIcon = 346, + nTime = 13, + szName = "随机技能", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 36110, + szName = "麟火:25", + nFrame = 57, + }, + [9] = { + nFrame = 52, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 0, + }, + dwID = 36190, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "岚剑", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "分身★千切子★快集火", + szName = "岚剑:25", + }, + [18] = { + nFrame = 67, + szName = "石麒麟:25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "石麒麟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "11,随机技能;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.75,★穿麟弩准备就位★;0.25,★穿麟弩准备就位★;", + }, + }, + dwID = 36142, + }, + [5] = { + nFrame = 47, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36118, + szNote = "★注意开减伤★", + szName = "弩俑:25", + }, + [10] = { + nFrame = 57, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 36192, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冬剑", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "北风★白龙剑走★挂扶摇", + szName = "冬剑:25", + }, + [20] = { + dwID = 36114, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王翦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 36154, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "切割机", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 36411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "虚龙剑", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "随机剑点名", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [22] = { + dwID = 36208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "将俑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 47, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 36132, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "带盾剑俑·2号", + tRelation = { + bAll = true, + }, + }, + }, + szName = "带盾俑(云:25)", + tCountdown = { + { + nIcon = 346, + nTime = 23, + szName = "圆弧劈", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [6] = { + nFrame = 47, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36120, + szNote = "★注意面向★", + szName = "剑俑:25", + }, + [12] = { + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "随机剑点名", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36180, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "岚尘剑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "岚尘剑:25", + nFrame = 52, + }, + [13] = { + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "随机剑点名", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36167, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "古剑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "古剑:25", + nFrame = 57, + }, + [7] = { + tCountdown = { + { + nClass = 7, + nFrame = 8, + nIcon = 346, + nTime = "30,冲撞|亡者气息;", + }, + }, + dwID = 36125, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安禄山", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + szName = "安禄山:25", + }, + [14] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,随机剑点名;62,Boss瞬移;75,随机剑点名;122,Boss瞬移;135,随机剑点名;182,Boss瞬移;195,随机剑点名;242,Boss瞬移;255,随机剑点名;302,Boss瞬移;315,随机剑点名;362,Boss瞬移;375,随机剑点名;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.65,★准备进入P2★;", + }, + }, + dwID = 36169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "令狐伤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + szName = "令狐伤:25", + }, + [23] = { + dwID = 36254, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盗墓贼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + tCountdown = { + { + nIcon = 346, + nTime = 35, + szName = "车俑", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36183, + szName = "车俑:25", + nFrame = 57, + }, + [15] = { + nFrame = 57, + szName = "探雪:25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "探雪", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,魅惑;", + }, + }, + dwID = 36184, + }, + }, + [368] = { + { + dwID = 64855, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄穆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65057, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65097, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影贪(仁)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65104, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影嗔(智)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65207, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影痴(礼)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影慢(信)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影疑(义)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65230, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毒心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [341] = { + { + dwID = 61114, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康疑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61177, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铂尔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61191, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "罗纳真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "神罚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白圈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61303, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火网", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小太阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61557, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "没藏呼月", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拓跋思羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61672, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拿云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秘法门识破者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61712, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "方天剑豪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "信仰暴徒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61716, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣法门卫道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火把", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62484, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "靛羽风鸟", + tRelation = { + bEnemy = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼窝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水源", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "遗落的食物", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64755, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "发光的踪迹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄金气脉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [189] = { + { + dwID = 36680, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "野人首领", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36688, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "老虎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "呼呼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [191] = { + { + nFrame = 52, + dwID = 36869, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙摧城", + tRelation = { + bAll = true, + }, + }, + }, + szName = "火龙摧城:10PT", + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "摧城一击", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + szName = "火龙机雷", + nIcon = 2589, + nTime = 22, + }, + }, + }, + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36874, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙机雷", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + key = "火龙机雷", + nTime = 30, + szName = "火龙机雷", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "火龙机雷:10PT", + }, + { + tCountdown = { + { + nIcon = 2589, + key = "追击火龙", + nTime = 30, + szName = "追击火龙", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "追击火龙:10PT", + dwID = 36875, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 100, + szName = "下一波号角手", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 37535, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙号角手", + tRelation = { + bAll = true, + }, + }, + }, + szName = "号角手:10PT", + nFrame = 47, + }, + { + nFrame = 67, + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "下一次天上巨石", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + col = { + 255, + 0, + 255, + }, + szName = "飞石:10PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朝曦门飞石", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "★快射击★快射击★", + dwID = 37206, + }, + { + nFrame = 47, + dwID = 36864, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "田布戈", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "7.5,断骨;18,飞斧气场;25,准备排火;65,虎啸;195,点名;", + }, + }, + szName = "田布戈:10PT", + }, + { + dwID = 37209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙攻城队长", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37760, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可木汗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37867, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "图拔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41163, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军需物资", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [343] = { + { + dwID = 60998, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "姜仇封", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60999, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "魏宗明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61000, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "宫傲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [348] = { + { + dwID = 62830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "流火化蝠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64046, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教隐遁者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64047, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教殉道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64048, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教审判者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64049, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教揭示者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64063, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教大力士", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64064, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64069, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰3", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [354] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "神罚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白圈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "小太阳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火把", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼窝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水源", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63342, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铂尔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "罗纳真", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63349, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "落星", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63370, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康疑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63377, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63379, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拿云", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63400, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "没藏呼月", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63410, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秘法门识破者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "方天剑豪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63424, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "信仰暴徒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63426, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "圣法门卫道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63451, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "拓跋思羽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63460, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "遗落的食物", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63498, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火网", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63502, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "熊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "靛羽风鸟", + tRelation = { + bEnemy = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63833, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "熊肉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄金气脉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [199] = { + { + dwID = 41019, + tCountdown = { + { + nClass = 3, + szName = "南营援军出现", + nIcon = 337, + nTime = 30, + }, + }, + nFrame = 57, + }, + { + dwID = 41018, + tCountdown = { + { + nClass = 3, + szName = "北营援军出现", + nIcon = 337, + nTime = 30, + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40951, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "赤狼卫", + tRelation = { + bAll = true, + }, + }, + }, + szName = "赤狼卫:25PT", + }, + { + nFrame = 57, + col = { + 0, + 255, + 255, + }, + dwID = 40949, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "盲眼血奴", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + }, + szName = "盲眼血奴:25PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 40970, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灌血掌终点", + tRelation = { + bAll = true, + }, + }, + }, + szName = "灌血掌终点", + }, + { + nFrame = 57, + dwID = 40948, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + szName = "史思明:25PT", + tCountdown = { + { + nIcon = 4504, + nTime = 5, + szName = "毒血涌动", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "11,盲眼血奴;41,魄衣血仆;69,血染春秋;71,赤狼卫;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.58,★准备进入回血阶段★;0.35,★准备进入回血阶段★;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "蓝色连线", + nRefresh = 5, + nClass = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40921, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·琵琶", + tRelation = { + bAll = true, + }, + }, + }, + szName = "白陶·琵琶:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 3401, + nTime = 8, + szName = "莲花指", + nRefresh = 5, + nClass = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40922, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白陶·箜篌", + tRelation = { + bAll = true, + }, + }, + }, + szName = "白陶·箜篌:25PT", + nFrame = 57, + }, + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 40955, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鲜血聚力", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "鲜血聚力:25PT", + }, + { + nFrame = 67, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40956, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灵魂聚力", + tRelation = { + bAll = true, + }, + }, + }, + szName = "灵魂聚力:25PT", + }, + { + nFrame = 57, + szName = "安雨:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "安雨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "★圣火焚城★", + nTime = 45, + szName = "圣火樊城", + nClass = 7, + }, + { + nIcon = 13, + key = "☆圣火焚城☆", + nTime = 105, + szName = "圣火樊城", + nClass = 7, + }, + }, + dwID = 40952, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 40940, + szNote = "★远离★远离★", + szName = "断浪气劲:25PT", + }, + { + tCountdown = { + { + nFrame = 8, + nTime = 17, + szName = "恐惧debuff", + nClass = 7, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40917, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阿独鹿", + tRelation = { + bAll = true, + }, + }, + }, + szName = "阿独鹿:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "剁山劈(破甲)", + nIcon = 346, + nTime = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 40919, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可蒙", + tRelation = { + bAll = true, + }, + }, + }, + szName = "可蒙:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "断浪斩(流血)", + nIcon = 346, + nTime = 11, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40918, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌素尔", + tRelation = { + bAll = true, + }, + }, + }, + szName = "乌素尔:25PT", + nFrame = 57, + }, + { + [3] = { + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军资箱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 41162, + }, + { + dwID = 40937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40965, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "严孝通", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40988, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“恶修罗”端木正我", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40997, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“烈焰燎原”贲百胜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41010, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "“孤影绝尘”赫连武功", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [364] = { + { + dwID = 64853, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64856, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "邢不僵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64857, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏灾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64858, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "孙楚珊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64859, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鬼首", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64860, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水鬼[抓人]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64892, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄的巨手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "礼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64913, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无面鬼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64918, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑫鑫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65012, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钱宗龙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65046, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "强袭奴仆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65047, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无耻混蛋", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65052, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鱼枪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65058, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康宴别", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65346, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伍藏野", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65633, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "弓箭手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65714, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "李如峰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [369] = { + { + dwID = 66090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毒心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "清心", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66098, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影嗔(智)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66099, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影痴(礼)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影慢(信)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66101, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影疑(义)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66107, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "影贪(仁)", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66125, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄穆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [205] = { + { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + key = "火龙机雷", + nTime = 30, + szName = "火龙机雷", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 41904, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙机雷", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "★快集火★快集火★", + szName = "火龙机雷:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 41905, + szName = "追击火龙:25TZ", + tCountdown = { + { + nIcon = 346, + key = "追击火龙", + nTime = 30, + szName = "追击火龙", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + key = "黑油圈", + nTime = 30, + szName = "黑油圈", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "黑油圈:25TZ", + dwID = 41902, + nFrame = 57, + }, + { + nFrame = 52, + dwID = 41899, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙摧城", + tRelation = { + bAll = true, + }, + }, + }, + szName = "火龙摧城:25TZ", + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "黑油圈", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,追击火龙;16,火龙机雷;", + }, + [4] = { + nIcon = 13, + nTime = 60, + szName = "摧城一击", + nClass = 7, + nFrame = 8, + }, + [3] = { + nClass = 6, + nIcon = 2995, + nTime = "0.55,★准备第一次火墙★;0.25,★准备第二次火墙★;0.15,★准备第三次火墙★;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "狼牙号角手", + nRefresh = 10, + nClass = 3, + nFrame = 8, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 0, + }, + dwID = 42066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙号角手", + tRelation = { + bAll = true, + }, + }, + }, + szName = "号角手:25TZ", + nFrame = 47, + }, + { + nFrame = 67, + col = { + 255, + 0, + 255, + }, + dwID = 42035, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朝曦门飞石", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "飞石:25TZ", + }, + { + nFrame = 57, + dwID = 41894, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "田布戈", + tRelation = { + bAll = true, + }, + }, + }, + szName = "田布戈:25TZ", + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "8.5,断骨;35,准备排火;240,点名;", + }, + { + nIcon = 13, + nTime = 80, + szName = "虎啸(穿透)", + nClass = 7, + nFrame = 8, + }, + }, + }, + { + dwID = 42037, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙攻城队长", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42076, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可木汗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "图拔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42128, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军需物资", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [412] = { + { + dwID = 65410, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "贪星巨猿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65411, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "贪星巨猿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65412, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "煞星龙兽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65413, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "凶星龙兽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65721, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "朱雀超级俑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65722, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "玄武超级俑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [69] = { + { + dwID = 14549, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "血玉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14610, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冥花连舞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [211] = { + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 42425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙机雷", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "火龙机雷", + nTime = 30, + szName = "火龙机雷", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "火龙机雷:10TZ", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "黑油圈", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "黑油圈:10TZ", + dwID = 42423, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36875, + szName = "追击火龙:10TZ", + tCountdown = { + { + nIcon = 346, + key = "追击火龙", + nTime = 30, + szName = "追击火龙", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + nFrame = 52, + dwID = 42420, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "火龙摧城", + tRelation = { + bAll = true, + }, + }, + }, + szName = "火龙摧城:10TZ", + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "黑油圈", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,追击火龙;16,火龙机雷;60,摧城一击;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "狼牙号角手", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 42587, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙号角手", + tRelation = { + bAll = true, + }, + }, + }, + szName = "号角手:10TZ", + nFrame = 47, + }, + { + nFrame = 67, + col = { + 255, + 0, + 255, + }, + dwID = 42556, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "朝曦门飞石", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "飞石:10TZ", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 37, + szName = "飞斧气场", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "飞斧气场:10TZ", + dwID = 42485, + nFrame = 57, + }, + { + nFrame = 57, + dwID = 42415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "田布戈", + tRelation = { + bAll = true, + }, + }, + }, + szName = "田布戈:10TZ", + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7.5,断骨;18,飞斧气场;25,准备排火;195,点名;", + }, + { + nIcon = 13, + nTime = 65, + szName = "虎啸(穿透)", + nFrame = 8, + nClass = 7, + }, + }, + }, + { + dwID = 42558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼牙攻城队长", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42597, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可木汗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "图拔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42657, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "军需物资", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [359] = { + { + dwID = 63950, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "月笼草", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63953, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "蒹葭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63954, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "杀末邪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63973, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "风香无情", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63974, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "复幽草", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [301] = { + { + dwID = 60484, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "乌索", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "史思明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60515, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞虫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60523, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "靳空明", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60526, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "突袭军狼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60541, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "练血之奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60543, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "迷乱之奴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60544, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狂乱巨鳄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "狼神令使", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60769, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绿球", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [217] = { + { + nFrame = 57, + szName = "一堆古董", + [3] = { + bScreenHead = true, + }, + dwID = 48752, + }, + { + nFrame = 47, + szName = "超多古董", + [3] = { + bScreenHead = true, + }, + dwID = 48751, + }, + }, + [406] = { + { + dwID = 64894, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "曹庆司", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "白沫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65033, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "悉达罗摩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65456, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鬼鬼祟祟的弓手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65460, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "形迹可疑的海寇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [221] = { + [7] = { + nFrame = 47, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "知心火控制", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 327, + key = "知心火消失", + nTime = 20, + szName = "知心火消失", + nClass = 3, + }, + }, + szName = "知心火", + }, + [1] = { + dwID = 44805, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "品竹曲", + nIcon = 2589, + nTime = 58, + }, + }, + nFrame = 57, + }, + [2] = { + dwID = 44812, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池·幻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [4] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 43236, + }, + [8] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李白", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43275, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,行舟;21,行舟;34,行舟;", + }, + { + nIcon = 2589, + nClass = 7, + szName = "二式·登楼", + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.60,准备进入P2;", + }, + }, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 43281, + }, + [5] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43129, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + szName = "黄泉绝影", + }, + [10] = { + dwID = 43112, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毛毛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 44810, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻魔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "幻魔附体", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + dwID = 43107, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "莫雨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "镇狱眼", + nIcon = 3434, + nTime = 60, + }, + { + nClass = 7, + szName = "情绪失控", + nIcon = 2589, + nTime = 32, + }, + }, + nFrame = 57, + }, + [12] = { + dwID = 43282, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "青莲子剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 43113, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [366] = { + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "礼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66327, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钱宗龙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66328, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66329, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "邢不僵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66330, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏灾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66331, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "孙楚珊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66334, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "晏厄的巨手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鬼首", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66337, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "水鬼[抓人]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66351, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无面鬼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66355, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "弓箭手", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66365, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "强袭奴仆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66366, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "无耻混蛋", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66367, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伍藏野", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑫鑫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66401, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鱼枪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66402, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "康宴别", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66458, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "李如峰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [225] = { + { + dwID = 46475, + tCountdown = { + { + nClass = 7, + szName = "音潮倾湖", + nIcon = 13, + nTime = 52, + }, + }, + nFrame = 47, + }, + }, + [227] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "秦秀", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 13, + key = "DPS停手", + nTime = 0, + szName = "DPS停手", + nClass = -1, + }, + { + nIcon = 13, + key = "黑风破岩斩", + nTime = 0, + szName = "黑风破岩斩", + nClass = -1, + }, + [4] = { + nClass = 7, + szName = "正面AOE", + nIcon = 13, + nTime = 7, + }, + [3] = { + nIcon = 13, + key = "正面AOE", + nTime = 0, + szName = "正面AOE", + nClass = -1, + }, + }, + dwID = 46560, + }, + { + dwID = 46562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "植尸将", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 46575, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "莫蕾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [229] = { + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 46912, + }, + [2] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46889, + }, + [3] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46891, + }, + [1] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46894, + }, + [4] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46888, + }, + [5] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46890, + }, + [7] = { + nFrame = 47, + tCountdown = { + { + nClass = 3, + szName = "流风五连斩", + nIcon = 13, + nTime = 20, + }, + }, + dwID = 46899, + }, + }, + [231] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "屈焰阳", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "26,连斩;56,泣;", + }, + { + nClass = 7, + szName = "刺客出现", + nIcon = 2589, + nTime = 70, + }, + { + nFrame = 8, + nTime = 65, + szName = "追魂剑气", + nClass = 7, + nIcon = 3443, + }, + }, + dwID = 47175, + }, + { + tCountdown = { + { + nClass = 3, + szName = "刺客出现", + nIcon = 2589, + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47176, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "龙图刺客", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + dwID = 47197, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "森九岚", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,居合;19,居合;29,斩流剑气场;", + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + dwID = 47218, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "气场消失", + nTime = "6,半月;105,气场消失;", + }, + { + nClass = 4, + nIcon = 2589, + key = "气场消失", + nTime = "4,斩流剑·徊;18,斩流剑·灭;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,居合;42,居合;54,居合·扫;62,斩流剑气场;", + }, + }, + szName = "斩流剑", + }, + { + dwID = 47272, + tCountdown = { + { + nFrame = 8, + nTime = 10, + szName = "破敌", + nClass = 3, + nIcon = 4224, + }, + }, + szName = "半月刀气", + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47283, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47361, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47364, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "剑卫队副", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47362, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "弩卫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47303, + }, + { + tCountdown = { + { + nClass = 3, + szName = "一鼓作气消失", + nIcon = 2589, + nTime = 15, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 47288, + [4] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "一鼓作气", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "飞花之刃", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 47202, + nFrame = 57, + }, + { + dwID = 47359, + nFrame = 47, + }, + { + dwID = 47226, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "仲虚念", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,紫金钵;62,三环锡杖;", + }, + }, + }, + { + tCountdown = { + { + nClass = 3, + szName = "紫金灭", + nIcon = 3398, + nTime = 25, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47256, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "紫金钵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "三环锡杖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47225, + }, + { + dwID = 47276, + szName = "涅槃经3", + nFrame = 57, + }, + { + dwID = 43966, + szName = "涅槃经2", + nFrame = 57, + }, + { + dwID = 47208, + szName = "涅槃经1", + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李璘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + dwID = 47182, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "当前集火★", + nTime = "20,当前集火★女;40,当前集火★男;60,当前集火★女;80,当前集火★男;100,当前集火★女;120,当前集火★男;140,当前集火★女;160,当前集火★男;180,当前集火★女;200,当前集火★男;220,当前集火★女;240,当前集火★男;260,当前集火★女;280,当前集火★男;300,当前集火★女;320,当前集火★男;340,当前集火★女;360,当前集火★男;380,当前集火★女;400,当前集火★男;420,当前集火★女;440,当前集火★男;460,当前集火★女;480,当前集火★男;500,当前集火★女;520,当前集火★男;540,当前集火★女;560,当前集火★男;580,当前集火★女;600,当前集火★男;620,当前集火★女;640,当前集火★男;660,当前集火★女;680,当前集火★男;700,当前集火★女;720,当前集火★男;740,当前集火★女;760,当前集火★男;780,当前集火★女;800,当前集火★男;820,当前集火★女;840,当前集火★男;860,当前集火★女;880,当前集火★男;900,当前集火★女;", + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47189, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "苏十三娘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 3, + szName = "准备集火★八荒阵眼★", + nIcon = 2028, + nTime = 9, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "八荒阵眼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47205, + nFrame = 57, + }, + { + dwID = 47187, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李玚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "相如剑牢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47310, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "阎纹陲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47330, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "游荡的咸鱼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47335, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "薛山石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "张冬恩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47339, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "王澤渝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47340, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "陈镜儒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "郑羽焯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47344, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "古定音", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47347, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "张关毅", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [233] = { + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47134, + nFrame = 57, + }, + [1] = { + dwID = 47683, + nFrame = 57, + tCountdown = { + [2] = { + nClass = 7, + nIcon = 2589, + key = "品竹曲", + nTime = "84,品竹曲;123,音缠;163,音缠;", + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "准备QTE", + nTime = "22,准备QTE;62,准备QTE;167,幻魔问心曲;", + }, + }, + }, + [2] = { + nFrame = 57, + dwID = 47144, + tCountdown = { + { + szName = "音缠消失", + nClass = 3, + nIcon = 2589, + nTime = 14, + }, + }, + }, + [4] = { + dwID = 47637, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,分川手·排浪;26,分川手·排浪;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,情绪失控;65,镇狱眼;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,准备转P2;0.35,准备转P2;", + }, + }, + }, + [8] = { + dwID = 47633, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,行舟;21,行舟;34,行舟;", + }, + { + nClass = 7, + szName = "二式·登楼", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.75,准备进入P2;0.45,准备进入P3;", + }, + }, + }, + [9] = { + tCountdown = { + { + nIcon = 2589, + nClass = 4, + nTime = "6,行舟;15,行舟;23,行舟;", + }, + { + nFrame = 8, + nTime = 28, + szName = "缠", + nClass = 4, + nIcon = 3404, + }, + [4] = { + szName = "七式·踏歌", + nClass = 4, + nIcon = 2589, + nTime = 37, + }, + [3] = { + nIcon = 2589, + key = "映日", + nTime = 0, + szName = "映日", + nClass = 4, + }, + }, + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47117, + }, + [5] = { + tCountdown = { + { + nIcon = 327, + key = "知心火消失", + nTime = 20, + szName = "知心火消失", + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47106, + szName = "知心火", + szNote = "控制", + nFrame = 47, + }, + [10] = { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 47118, + tCountdown = { + { + szName = "青莲子剑", + nClass = 3, + nIcon = 2589, + nTime = 50, + }, + }, + szName = "P3青莲子剑", + }, + [3] = { + nFrame = 57, + dwID = 47120, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + tCountdown = { + { + szName = "幻魔附体", + nClass = 3, + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47123, + nFrame = 57, + }, + }, + [235] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "品竹曲", + nTime = "84,品竹曲;123,音缠;163,音缠;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "准备QTE", + nTime = "22,准备QTE;62,准备QTE;167,幻魔问心曲;", + }, + }, + dwID = 48229, + }, + { + nFrame = 57, + dwID = 48233, + [3] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nClass = 3, + szName = "音缠消失", + nIcon = 2589, + nTime = 14, + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 48232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻魔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "幻魔附体", + nIcon = 3434, + nTime = 30, + }, + }, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "莫雨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,分川手·排浪;26,分川手·排浪;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,情绪失控;65,镇狱眼;", + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.70,准备转P2;0.35,准备转P2;", + }, + }, + dwID = 48200, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李白", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,行舟;21,行舟;34,行舟;", + }, + { + nClass = 7, + szName = "二式·登楼", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.60,准备进入P2;0.45,准备进入P3;", + }, + }, + dwID = 48214, + }, + { + nFrame = 57, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,行舟;15,行舟;23,行舟;", + }, + { + nClass = 4, + szName = "缠", + nIcon = 3404, + nTime = 28, + }, + [4] = { + nClass = 4, + szName = "七式·踏歌", + nIcon = 2589, + nTime = 37, + }, + [3] = { + nIcon = 2589, + key = "映日", + nTime = 0, + szName = "映日", + nClass = 4, + }, + }, + dwID = 48218, + }, + { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "青莲子剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 48219, + }, + { + dwID = 48204, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毛毛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48205, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48207, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "知心火控制", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48212, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48234, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池·幻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [237] = { + [13] = { + dwID = 48728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池·幻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "李白", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,行舟;21,行舟;34,行舟;", + }, + { + nClass = 7, + szName = "二式·登楼", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.75,准备进入P2;0.45,准备进入P3;", + }, + }, + dwID = 48680, + }, + [1] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "韩非池", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "品竹曲", + nTime = "84,品竹曲;123,音缠;163,音缠;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "准备QTE", + nTime = "22,准备QTE;62,准备QTE;167,幻魔问心曲;", + }, + }, + dwID = 48730, + }, + [2] = { + dwID = 48727, + tCountdown = { + { + nClass = 3, + szName = "音缠消失", + nIcon = 2589, + nTime = 14, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "莫雨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,分川手·排浪;26,分川手·排浪;84,分川手·排浪;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,镇狱眼;62,奔流爪;90,情绪失控;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,准备转P2;0.35,准备转P2;", + }, + }, + dwID = 48684, + }, + [8] = { + dwID = 48700, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,行舟;15,行舟;23,行舟;", + }, + { + nIcon = 3404, + key = "雾散(倒计时结束二段跳)", + nTime = 28, + szName = "缠", + nClass = 4, + }, + { + nIcon = 2589, + key = "映日", + nTime = 37, + szName = "七式·踏歌", + nClass = 4, + }, + }, + nFrame = 57, + }, + [9] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "青莲子剑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 48701, + }, + [5] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 0, + nTime = 13, + szName = "【白云】打断", + nClass = 3, + nIcon = 2589, + }, + }, + }, + [10] = { + dwID = 48689, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "知心火控制", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 48703, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "幻魔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "幻魔附体", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48706, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "黄泉绝影", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 7, + nTime = 13, + szName = "【剑】打断", + nClass = 3, + nIcon = 2589, + }, + }, + }, + [12] = { + dwID = 48693, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "可人", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 48692, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "毛毛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [349] = { + { + dwID = 62830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "流火化蝠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教隐遁者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64091, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教殉道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64092, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教审判者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64093, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教揭示者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64099, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教大力士", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64121, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰3", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "冰1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [350] = { + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "流火化蝠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64146, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教隐遁者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教殉道者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64148, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教审判者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教揭示者", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64155, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "祆教大力士", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉石", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "伊玛目", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寒玉结晶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + }, + DEBUFF = { + [130] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 3416, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + { + { + bFullScreen = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3454, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + }, + [134] = { + { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + }, + dwID = 3971, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4066, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [4] = { + nIcon = 1435, + dwID = 4001, + nLevel = 1, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + nLevel = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群跑动!", + dwID = 3984, + }, + }, + [136] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3808, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3807, + }, + { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "马上离开原地", + dwID = 3799, + }, + }, + [138] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3808, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3807, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 3781, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "马上离开原地", + dwID = 3799, + }, + }, + [140] = { + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [1] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4942, + }, + [2] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4249, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4658, + }, + [8] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4637, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "吞日月驱散!", + dwID = 4298, + }, + [10] = { + nLevel = 1, + nScrutinyType = 2, + nCount = 6, + col = { + 0, + 0, + 255, + }, + dwID = 4314, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [3] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4250, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4318, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 4313, + }, + }, + [148] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "朱云", + szNote = "快去鹤★快去鹤", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "欲吐地葬", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "白露", + szNote = "快去瓶子★快去瓶子", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "破静天门", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "镇魂长曲", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "普渡八音", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "黑洞", + szNote = "快去灯★快去灯", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "碧海", + szNote = "快去小船★快去小船", + dwID = 1876, + }, + }, + [-9] = { + [13] = { + { + bScreenHead = true, + }, + nLevel = 2, + dwID = 9052, + }, + [7] = { + { + bScreenHead = true, + }, + dwID = 2337, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8894, + }, + [2] = { + { + bTeamChannel = true, + }, + dwID = 8290, + szName = "8290", + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 5866, + }, + [8] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2868, + }, + [9] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 7660, + }, + [5] = { + nLevel = 1, + dwID = 5865, + }, + [10] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 10777, + }, + [11] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2870, + }, + [3] = { + { + bScreenHead = true, + }, + dwID = 5866, + nLevel = 1, + }, + [6] = { + szName = "10803", + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bScreenHead = true, + }, + dwID = 10803, + nLevel = 1, + }, + [12] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2968, + }, + [14] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2968, + }, + }, + [160] = { + { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5872, + nLevel = 1, + }, + { + dwID = 5871, + nLevel = 1, + szNote = "远离人群", + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [164] = { + { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5581, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5576, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + }, + [176] = { + [27] = { + szName = "封内", + dwID = 7135, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6740, + }, + [38] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "封内", + dwID = 6979, + }, + [3] = { + szName = "操作QTE", + dwID = 6874, + nLevel = 1, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE3", + szNote = "按键3333", + dwID = 6877, + }, + [5] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE2", + szNote = "按键2222", + dwID = 6876, + }, + [6] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE1", + szNote = "按键1111", + dwID = 6875, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bCenterAlarm = true, + }, + szNote = "快去找白云!", + dwID = 6907, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bCenterAlarm = true, + }, + szNote = "快去找黑云!", + dwID = 6908, + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6976, + nLevel = 1, + col = { + 40, + 237, + 0, + }, + }, + [12] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6707, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6888, + }, + [16] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6576, + }, + [20] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bScreenHead = true, + bTeamChannel = true, + bFullScreen = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szNote = "治疗速度奶爆!", + dwID = 6573, + }, + [24] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "幻", + dwID = 6859, + }, + [28] = { + szName = "眩晕", + dwID = 6958, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [32] = { + szName = "定身", + dwID = 6923, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [40] = { + { + bBuffList = true, + }, + dwID = 6965, + nLevel = 1, + }, + [48] = { + dwID = 6927, + nLevel = 1, + nCount = 2, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [33] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "封内", + dwID = 6998, + }, + [41] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6949, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [49] = { + { + bBuffList = true, + }, + dwID = 6953, + nLevel = 1, + }, + [17] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "☆分散☆分散☆", + dwID = 6564, + }, + [21] = { + tCountdown = { + { + nIcon = 340, + nTime = 13, + szName = "鬼魅/噬魄出现", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 0, + 201, + 0, + }, + [1] = { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6869, + }, + [25] = { + { + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6778, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [29] = { + szName = "眩晕", + dwID = 6977, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [34] = { + szName = "锁足", + dwID = 6954, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [42] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6936, + nLevel = 2, + }, + [50] = { + { + bBuffList = true, + }, + dwID = 6956, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + bCenterAlarm = true, + }, + dwID = 7184, + nLevel = 1, + }, + [11] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 51, + 219, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6975, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6708, + }, + [15] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 6549, + }, + [18] = { + tCountdown = { + { + nIcon = 327, + nTime = 17, + szName = "连线准备!", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 232, + 9, + 202, + }, + [1] = { + bWhisperChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "☆远离人群☆", + dwID = 6566, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6861, + }, + [26] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7110, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [30] = { + szName = "定身", + dwID = 7004, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [36] = { + szName = "缴械", + dwID = 6992, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [44] = { + nLevel = 1, + col = { + 244, + 252, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "苏曼莎QTE", + dwID = 6917, + }, + [52] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 1, + col = { + 234, + 242, + 0, + }, + }, + [51] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [47] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "令狐伤QTE", + dwID = 5197, + }, + [46] = { + { + bBuffList = true, + }, + dwID = 7871, + nLevel = 2, + }, + [39] = { + { + bBuffList = true, + }, + dwID = 6777, + nLevel = 1, + }, + [43] = { + nLevel = 1, + szName = "禁疗", + dwID = 6991, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [37] = { + szName = "禁疗", + dwID = 7026, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [45] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6940, + nLevel = 2, + }, + [35] = { + szName = "封内", + dwID = 6935, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + tCountdown = { + { + nIcon = 3415, + nTime = 16, + szName = "下一次火星", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 240, + 40, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6826, + }, + [19] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6648, + }, + [23] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "真", + dwID = 6860, + }, + [31] = { + szName = "眩晕", + dwID = 6955, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [178] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7285, + }, + { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + szName = "锁足", + dwID = 7284, + }, + [4] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7297, + nLevel = 1, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3398, + nTime = 28, + szName = "回风望月(穿过BOSS)", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7413, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [16] = { + nLevel = 1, + szName = "恐惧", + dwID = 7371, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [17] = { + nLevel = 1, + szName = "锁足", + dwID = 7380, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [9] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7452, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [18] = { + nLevel = 1, + szName = "缴械", + dwID = 7406, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7296, + nLevel = 1, + col = { + 237, + 0, + 229, + }, + }, + [10] = { + nLevel = 1, + szName = "风怒", + dwID = 7367, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 245, + 33, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7376, + tCountdown = { + { + nIcon = 4549, + nTime = 50, + szName = "痴断情肠点名", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "情", + }, + [21] = { + nLevel = 1, + col = { + 234, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "接收伤害", + dwID = 7554, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7369, + nLevel = 1, + col = { + 0, + 255, + 0, + }, + }, + [22] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "转移", + dwID = 6653, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7299, + }, + [6] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7295, + nLevel = 1, + col = { + 0, + 226, + 242, + }, + }, + [12] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7374, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7534, + }, + [7] = { + { + bBuffList = true, + }, + dwID = 7287, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7375, + nLevel = 1, + }, + [23] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6661, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [19] = { + nLevel = 1, + col = { + 0, + 113, + 242, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "痴", + dwID = 7377, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7370, + nLevel = 1, + }, + }, + [182] = { + { + nLevel = 1, + col = { + 233, + 250, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "兵佣", + dwID = 7721, + }, + { + nLevel = 1, + col = { + 220, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7720, + tCountdown = { + { + nIcon = 4580, + nTime = 45, + szName = "下一波虚实", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "即将变身", + }, + [4] = { + { + bBuffList = true, + }, + dwID = 7455, + nLevel = 1, + }, + [8] = { + nLevel = 1, + szName = "眩晕", + dwID = 7639, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [16] = { + tCountdown = { + { + nIcon = 4531, + nTime = 50, + szName = "红舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 232, + 0, + 31, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7479, + }, + [17] = { + tCountdown = { + { + nIcon = 4528, + nTime = 50, + szName = "绿舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 0, + 212, + 21, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7481, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 7474, + nLevel = 1, + }, + [18] = { + nLevel = 2, + col = { + 15, + 0, + 222, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 3419, + nTime = 50, + szName = "蓝舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "☆远离人群☆远离人群☆", + dwID = 7483, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7454, + nLevel = 1, + }, + [10] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7472, + nLevel = 1, + }, + [20] = { + nLevel = 2, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 235, + 237, + 237, + }, + szName = "白舞", + tCountdown = { + { + nIcon = 4494, + nTime = 50, + szName = "白舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "☆远离人群☆远离人群☆", + dwID = 7485, + }, + [21] = { + nLevel = 1, + szName = "眩晕", + dwID = 7540, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [11] = { + tCountdown = { + { + nIcon = 4549, + nTime = 10, + szName = "魅惑·下一次随机技能", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 245, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7583, + }, + [22] = { + nLevel = 1, + szName = "封内", + dwID = 7737, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7460, + nLevel = 1, + }, + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7670, + nLevel = 1, + }, + [12] = { + tCountdown = { + { + nIcon = 4495, + nTime = 20, + szName = "火牢·下一次随机技能", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nLevel = 1, + dwID = 7476, + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7541, + nLevel = 2, + }, + [25] = { + nLevel = 4, + nCount = 2, + bCheckLevel = true, + [1] = { + bFullScreen = true, + bBuffList = true, + bTeamPanel = true, + }, + col = { + 255, + 0, + 255, + }, + szNote = "★远离人群★远离人群★", + dwID = 6927, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7488, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + [26] = { + nLevel = 3, + col = { + 242, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 6964, + }, + [7] = { + { + bBuffList = true, + }, + dwID = 7661, + nLevel = 1, + }, + [14] = { + nLevel = 2, + col = { + 255, + 252, + 252, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "定身", + dwID = 7487, + }, + [27] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7501, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7538, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [19] = { + nLevel = 1, + col = { + 64, + 32, + 64, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7480, + tCountdown = { + { + nIcon = 4529, + nTime = 50, + szName = "黑舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "黑舞", + }, + [15] = { + nLevel = 2, + nCount = 3, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7486, + }, + }, + [184] = { + { + tCountdown = { + { + nIcon = 4576, + nTime = 42, + szName = "准备QTE", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7607, + nLevel = 1, + [1] = { + bTeamPanel = true, + }, + }, + }, + [190] = { + { + { + bWhisperChannel = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7973, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7962, + }, + }, + [192] = { + { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★蓝", + szNote = "★抱团点排球★", + dwID = 8174, + }, + { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★红", + szNote = "★抱团点排球★", + dwID = 8027, + }, + [4] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "找蓝蓝蓝球", + szName = "圣炎", + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [16] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [17] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "你被瞎子点名", + szName = "点名", + }, + [9] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [18] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★切勿做任何动作★", + dwID = 8340, + }, + [21] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "★注意控制层数★", + szName = "三毒", + }, + [11] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "★保持移动★", + dwID = 8199, + }, + [3] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "找红红红球", + szName = "寒意", + }, + [6] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "蓝☆莲花", + }, + [12] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [7] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "红☆莲花", + }, + [14] = { + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 20, + szName = "毒血涌动", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [19] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "注意血量", + dwID = 8313, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + }, + [196] = { + { + { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8369, + nLevel = 1, + }, + { + szName = "眩晕", + dwID = 8308, + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8322, + nLevel = 1, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8332, + nLevel = 1, + }, + }, + [198] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "★注意换T★", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★准备承伤★", + dwID = 8343, + }, + }, + [200] = { + [6] = { + dwID = 8901, + nLevel = 2, + szName = "金", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [2] = { + dwID = 8905, + nLevel = 2, + szName = "土", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [3] = { + dwID = 8904, + nLevel = 2, + szName = "火", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8912, + }, + [4] = { + dwID = 8903, + nLevel = 2, + szName = "水", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [5] = { + dwID = 8902, + nLevel = 2, + szName = "木", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [7] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8948, + nLevel = 1, + }, + }, + [204] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8828, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9024, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8833, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8834, + }, + }, + [206] = { + [27] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "★保持移动★", + dwID = 8199, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [38] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "注意血量", + dwID = 8313, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8220, + nLevel = 1, + }, + [5] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szNote = "★快驱散★", + dwID = 8014, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "找红红红球", + szName = "寒意", + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "找蓝蓝蓝球", + szName = "圣炎", + }, + [10] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 8240, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8047, + nLevel = 1, + col = { + 255, + 31, + 255, + }, + }, + [20] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "蓝☆莲花", + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [32] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "★注意开减伤★", + dwID = 8215, + }, + [40] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [33] = { + tCountdown = { + { + nIcon = 4504, + nTime = 20, + szName = "毒血涌动", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [41] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8319, + nLevel = 2, + }, + [17] = { + { + bBuffList = true, + }, + dwID = 8465, + nLevel = 1, + }, + [21] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "红☆莲花", + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8823, + szName = "音殇·阴", + nLevel = 1, + }, + [29] = { + { + bBuffList = true, + }, + dwID = 8198, + nLevel = 1, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [42] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★切勿做任何动作★", + dwID = 8340, + }, + [9] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8049, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 8239, + nLevel = 1, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8046, + nLevel = 1, + col = { + 255, + 31, + 255, + }, + }, + [18] = { + tCountdown = { + { + nClass = 1, + szName = "连线", + nIcon = 3449, + nTime = 45, + }, + }, + col = { + 223, + 31, + 31, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8027, + nLevel = 3, + szName = "连线★红", + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8822, + szName = "音殇·阳", + nLevel = 1, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [36] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "你被瞎子点名", + szName = "点名", + }, + [44] = { + nLevel = 1, + dwID = 8821, + col = { + 255, + 255, + 31, + }, + }, + [35] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [39] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + [46] = { + nLevel = 1, + dwID = 8356, + }, + [37] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [45] = { + nLevel = 1, + dwID = 8793, + }, + [43] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "★注意控制层数★", + szName = "三毒", + }, + [1] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [19] = { + tCountdown = { + { + nClass = 1, + szName = "连线", + nIcon = 3448, + nTime = 45, + }, + }, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★蓝", + nLevel = 3, + dwID = 8174, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [31] = { + { + bBuffList = true, + }, + dwID = 8206, + nLevel = 1, + }, + }, + [212] = { + { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★蓝", + szNote = "★抱团点排球★", + dwID = 8174, + }, + { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★红", + szNote = "★抱团点排球★", + dwID = 8027, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "找蓝蓝蓝球", + szName = "圣炎", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [17] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "★保持移动★", + dwID = 8199, + }, + [9] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [31] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szNote = "★快驱散★", + dwID = 8014, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [10] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "★注意开减伤★", + dwID = 8215, + }, + [30] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "★注意控制层数★", + szName = "三毒", + }, + [21] = { + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 20, + szName = "毒血涌动", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [12] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "蓝☆莲花", + }, + [24] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "你被瞎子点名", + szName = "点名", + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [25] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [13] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "红☆莲花", + }, + [26] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "注意血量", + dwID = 8313, + }, + [27] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "找红红红球", + szName = "寒意", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [29] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★切勿做任何动作★", + dwID = 8340, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + }, + [218] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9188, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9032, + }, + }, + [220] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9229, + nLevel = 1, + szName = "接收①", + }, + [2] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [38] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [3] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9291, + nLevel = 1, + col = { + 37, + 239, + 2, + }, + }, + [4] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "不要再中第二次", + dwID = 9195, + }, + [5] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [6] = { + nLevel = 1, + dwID = 9244, + }, + [7] = { + dwID = 9239, + tCountdown = { + { + szName = "破敌剑气", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "半月", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [8] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + col = { + 255, + 2, + 208, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [12] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9196, + }, + [14] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + dwID = 9402, + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + szNote = "一一一一", + szName = "一一一", + }, + [16] = { + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 2, + 27, + 255, + }, + szName = "三三三", + nLevel = 1, + szNote = "三三三三", + dwID = 9404, + }, + [20] = { + { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nClass = -1, + szName = "名称", + nIcon = 13, + nTime = 10, + }, + }, + dwID = 9213, + nLevel = 1, + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9224, + szName = "转①", + nLevel = 1, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9230, + nLevel = 1, + szName = "接收②", + }, + [32] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [33] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [17] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [21] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9635, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9225, + szName = "转②", + nLevel = 1, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "接收③", + dwID = 9231, + }, + [34] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9371, + }, + [9] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [11] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9122, + }, + [13] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [15] = { + nLevel = 1, + col = { + 255, + 197, + 40, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "二二二二", + szName = "二二二", + }, + [18] = { + { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9412, + tCountdown = { + { + nIcon = 13, + nTime = 48, + szName = "点名结束", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9226, + szName = "转③", + nLevel = 1, + }, + [30] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [36] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [35] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "奶爆", + dwID = 9535, + }, + [1] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + }, + [19] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [23] = { + { + bBuffList = true, + }, + dwID = 9642, + nLevel = 1, + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + }, + [222] = { + [6] = { + szName = "金", + dwID = 8901, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [2] = { + szName = "土", + dwID = 8905, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [3] = { + szName = "火", + dwID = 8904, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8912, + }, + [4] = { + szName = "水", + dwID = 8903, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [5] = { + szName = "木", + dwID = 8902, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [7] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8948, + }, + }, + [224] = { + { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8734, + }, + { + { + bBigFontAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "不要站水里", + dwID = 8776, + }, + }, + [228] = { + [6] = { + szName = "锁定·圣者", + nLevel = 1, + dwID = 8858, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8789, + nLevel = 1, + szName = "定身", + }, + [3] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8790, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 8788, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8791, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 9317, + nLevel = 1, + }, + [7] = { + dwID = 8817, + nLevel = 1, + szNote = "远离人群", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [230] = { + { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "牵引", + nLevel = 2, + dwID = 9652, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9662, + nLevel = 2, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nIcon = 7051, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 2, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nIcon = 7054, + szName = "11111", + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nIcon = 7070, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8983, + nLevel = 1, + col = { + 242, + 255, + 2, + }, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8975, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nIcon = 7057, + szName = "44444", + }, + [12] = { + { + bCenterAlarm = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + col = { + 255, + 2, + 2, + }, + }, + [24] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8978, + nLevel = 2, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8985, + nLevel = 2, + col = { + 68, + 224, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + nClass = 1, + szName = "行舟", + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nIcon = 7073, + szName = "33333", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8896, + nLevel = 2, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 8981, + col = { + 2, + 255, + 19, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 2, + }, + }, + [232] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 18, + szName = "三环锡杖", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nLevel = 1, + [1] = { + bBuffList = true, + }, + szName = "气血爆发", + dwID = 9585, + nIcon = 4549, + }, + [4] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9291, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 9193, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "不要再中第二次", + dwID = 9195, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9429, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + nLevel = 1, + dwID = 9239, + tCountdown = { + { + nClass = 1, + szName = "破敌剑气", + nIcon = 4224, + nTime = 10, + }, + { + nClass = 1, + szName = "半月", + nIcon = 2589, + nTime = 21, + }, + }, + [1] = { + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "三三三三", + szName = "三三三", + }, + [24] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9225, + szName = "转②", + }, + [40] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9226, + szName = "转③", + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + dwID = 9412, + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "点名结束", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + col = { + 32, + 255, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9405, + szNote = "四四四四", + szName = "四四四", + }, + [25] = { + dwID = 9420, + nLevel = 1, + tCountdown = { + { + nClass = 2, + szName = "一鼓作气", + nIcon = 2589, + nTime = 8, + }, + { + nClass = 2, + szName = "再次隐身", + nIcon = 3408, + nTime = 12, + }, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9229, + szName = "接收①", + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "一一一", + tCountdown = { + { + nClass = 2, + szName = "一鼓作气", + nIcon = 2589, + nTime = 6, + }, + { + nClass = 2, + szName = "无坚不摧", + nIcon = 3409, + nTime = 10, + }, + }, + szNote = "一一一一", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "五五五五", + szName = "五五五", + }, + [26] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + szName = "接收③", + dwID = 9231, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9230, + nLevel = 1, + szName = "接收②", + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9537, + nLevel = 2, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9535, + szName = "奶爆", + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "二二二二", + szName = "二二二", + }, + [23] = { + dwID = 9423, + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "一鼓作气", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "飞花之刃", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "涅槃经", + nRefresh = 400, + nClass = 1, + }, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转①", + dwID = 9224, + }, + }, + [234] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 18, + szName = "三环锡杖", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "气血爆发", + dwID = 9585, + }, + [4] = { + { + bTeamPanel = true, + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 9291, + nLevel = 1, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bPartyBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "不要再中第二次", + dwID = 9195, + }, + [7] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + dwID = 9239, + tCountdown = { + { + szName = "破敌剑气", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "半月", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10243"] = true, + ["SKILL#10062"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "三三三三", + szName = "三三三", + }, + [24] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转②", + dwID = 9225, + }, + [40] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转③", + dwID = 9226, + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "点名结束", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + dwID = 9412, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + col = { + 32, + 255, + 2, + }, + dwID = 9405, + szName = "四四四", + szNote = "四四四四", + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + }, + [25] = { + nLevel = 1, + tCountdown = { + { + szName = "一鼓作气", + nClass = 2, + nIcon = 2589, + nTime = 8, + }, + { + szName = "再次隐身", + nClass = 2, + nIcon = 3408, + nTime = 12, + }, + }, + dwID = 9420, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [29] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + nLevel = 1, + szName = "接收①", + dwID = 9229, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "一一一", + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + szNote = "一一一一", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + dwID = 9406, + szNote = "五五五五", + szName = "五五五", + }, + [26] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + dwID = 9231, + szName = "接收③", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9534, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + nLevel = 1, + szName = "接收②", + dwID = 9230, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9536, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "奶爆", + dwID = 9535, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "二二二二", + szName = "二二二", + }, + [23] = { + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "一鼓作气", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "飞花之刃", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + dwID = 9423, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转①", + dwID = 9224, + }, + }, + [236] = { + [27] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8988, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "气血爆发", + dwID = 9585, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10238, + nLevel = 4, + }, + [5] = { + { + bTeamPanel = true, + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 9291, + nLevel = 1, + col = { + 26, + 209, + 2, + }, + }, + [6] = { + { + bPartyBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [7] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "不要再中第二次", + dwID = 9195, + }, + [8] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [12] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [16] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [20] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "二二二二", + szName = "二二二", + }, + [24] = { + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "一鼓作气", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "飞花之刃", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + dwID = 9423, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [32] = { + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "涅槃经", + nRefresh = 400, + nClass = 1, + }, + }, + dwID = 9224, + szName = "转①", + }, + [40] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转②", + dwID = 9225, + }, + [41] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9409, + }, + [21] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "三三三三", + szName = "三三三", + }, + [25] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9422, + nLevel = 1, + }, + [29] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9635, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "转③", + dwID = 9226, + }, + [42] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [9] = { + dwID = 9239, + tCountdown = { + { + szName = "破敌剑气", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "半月", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [15] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [18] = { + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "点名结束", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + dwID = 9412, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [22] = { + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 32, + 255, + 2, + }, + szName = "四四四", + nLevel = 1, + szNote = "四四四四", + dwID = 9405, + }, + [26] = { + nLevel = 1, + tCountdown = { + { + szName = "一鼓作气", + nClass = 2, + nIcon = 2589, + nTime = 8, + }, + { + szName = "再次隐身", + nClass = 2, + nIcon = 3408, + nTime = 12, + }, + }, + dwID = 9420, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [30] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [36] = { + nLevel = 1, + szName = "接收②", + dwID = 9230, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "奶爆", + dwID = 9535, + }, + [35] = { + szName = "接收①", + dwID = 9229, + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 18, + szName = "三环锡杖", + nClass = 1, + }, + }, + dwID = 9155, + }, + [47] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9536, + col = { + 255, + 2, + 208, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + szName = "接收③", + dwID = 9231, + nLevel = 1, + }, + [45] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9534, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [43] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "一一一", + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + szNote = "一一一一", + dwID = 9402, + }, + [23] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "五五五五", + szName = "五五五", + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + }, + [60] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "朱云", + szNote = "快去鹤★快去鹤", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "欲吐地葬", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "白露", + szNote = "快去瓶子★快去瓶子", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1882, + szName = "破静天门", + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "镇魂长曲", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "普渡八音", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "黑洞", + szNote = "快去灯★快去灯", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "碧海", + szNote = "快去小船★快去小船", + dwID = 1876, + }, + }, + [242] = { + [7] = { + nLevel = 2, + col = { + 238, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nIcon = 339, + szName = "霜印", + dwID = 10812, + }, + [1] = { + nLevel = 1, + dwID = 10797, + [1] = { + bBuffList = true, + }, + }, + [2] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "点名", + dwID = 10702, + nIcon = 3431, + }, + [4] = { + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10790, + col = { + 255, + 0, + 0, + }, + }, + [8] = { + nLevel = 1, + dwID = 10780, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [9] = { + nLevel = 1, + [1] = { + bBuffList = true, + }, + dwID = 10853, + }, + [5] = { + nLevel = 1, + dwID = 10773, + [1] = { + bBuffList = true, + }, + }, + [3] = { + nLevel = 1, + dwID = 10772, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [6] = { + nLevel = 1, + col = { + 246, + 5, + 255, + }, + szName = "霜印", + dwID = 10778, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + }, + [244] = { + [7] = { + nLevel = 1, + col = { + 238, + 5, + 255, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 10778, + szName = "霜印", + }, + [1] = { + { + bBuffList = true, + }, + dwID = 10797, + nLevel = 1, + }, + [2] = { + nLevel = 1, + dwID = 10703, + [1] = { + bBuffList = true, + }, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10772, + nLevel = 1, + }, + [8] = { + nIcon = 339, + col = { + 238, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "霜印", + nLevel = 2, + dwID = 10812, + }, + [9] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10780, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 10790, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10853, + }, + [3] = { + nIcon = 3431, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + szName = "点名", + dwID = 10702, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 10773, + nLevel = 1, + }, + }, + [65] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1882, + szName = "破静天门", + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "碧海", + szNote = "快去小船★快去小船", + dwID = 1876, + }, + [8] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "镇魂长曲", + dwID = 1884, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "朱云", + szNote = "快去鹤★快去鹤", + dwID = 1877, + }, + [1] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "白露", + szNote = "快去瓶子★快去瓶子", + dwID = 1875, + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "黑洞", + szNote = "快去灯★快去灯", + dwID = 1878, + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "普渡八音", + dwID = 1881, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "欲吐地葬", + dwID = 1883, + }, + }, + [131] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "朱云", + szNote = "快去鹤★快去鹤", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "欲吐地葬", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "白露", + szNote = "快去瓶子★快去瓶子", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "破静天门", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "镇魂长曲", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "普渡八音", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "黑洞", + szNote = "快去灯★快去灯", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "碧海", + szNote = "快去小船★快去小船", + dwID = 1876, + }, + }, + [133] = { + [6] = { + nIcon = 1435, + dwID = 4001, + nLevel = 1, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 3657, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + }, + dwID = 3971, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + [1] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bScreenHead = true, + }, + nIcon = 371, + dwID = 3773, + }, + [4] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4066, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [5] = { + nLevel = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群跑动!", + dwID = 3984, + }, + }, + [68] = { + [7] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [1] = { + dwID = 2179, + nLevel = 4, + szNote = "注意驱散!", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [2] = { + dwID = 2172, + nLevel = 4, + nCount = 30, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 3877, + nIcon = 1435, + szName = "原罪缚穴术点名", + }, + [8] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群!", + dwID = 2628, + }, + [9] = { + nLevel = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2629, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 917, + nTime = 123, + szName = "虚弱剩余时间", + nRefresh = 7, + nClass = 1, + }, + }, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2243, + nLevel = 4, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "快进水池!", + dwID = 2181, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2231, + nLevel = 4, + col = { + 255, + 255, + 0, + }, + }, + }, + [69] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 2243, + col = { + 255, + 0, + 255, + }, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2632, + }, + [3] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群!", + dwID = 2628, + }, + [1] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3877, + nIcon = 1435, + szName = "原罪缚穴术点名", + }, + [4] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 4, + dwID = 2231, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "快进水池!", + dwID = 2181, + }, + }, + [70] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 2243, + col = { + 255, + 0, + 255, + }, + }, + [2] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [3] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群!", + dwID = 2628, + }, + [1] = { + nIcon = 1435, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3877, + nLevel = 4, + szName = "原罪缚穴术点名", + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2632, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 4, + dwID = 2231, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "快进水池!", + dwID = 2181, + }, + }, + [72] = { + [7] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [1] = { + dwID = 2179, + nLevel = 4, + szNote = "注意驱散!", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [2] = { + dwID = 2172, + nLevel = 4, + nCount = 30, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 3877, + nIcon = 1435, + szName = "原罪缚穴术点名", + }, + [8] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "快远离人群!", + dwID = 2628, + }, + [9] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2632, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2243, + nLevel = 4, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "快进水池!", + dwID = 2181, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2231, + nLevel = 4, + col = { + 255, + 255, + 0, + }, + }, + }, + [155] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4942, + }, + { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4249, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4658, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4318, + }, + [16] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4651, + }, + [17] = { + dwID = 4351, + nLevel = 1, + nRelScrutinyType = 3, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4899, + }, + [18] = { + nIcon = 1435, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "点名撞钟", + nLevel = 1, + dwID = 4378, + }, + [5] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4338, + }, + [10] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [20] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5079, + }, + [21] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 5096, + }, + [11] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 5096, + }, + [3] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4250, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "吞日月驱散!", + dwID = 4298, + }, + [12] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4310, + }, + [24] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5081, + }, + [25] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5195, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 3409, + nTime = 19, + szName = "李倓虚弱剩余时间", + nRefresh = 7, + nClass = 1, + }, + }, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4637, + }, + [26] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamPanel = true, + }, + dwID = 4403, + }, + [27] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4404, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "注意解除全团定身", + dwID = 4299, + }, + [14] = { + nLevel = 1, + nScrutinyType = 2, + nCount = 6, + col = { + 0, + 0, + 255, + }, + dwID = 4314, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [28] = { + nIcon = 1435, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szName = "牢笼被锁", + nLevel = 1, + dwID = 5084, + }, + [23] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5157, + }, + [19] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 4460, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 4313, + }, + }, + [165] = { + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5898, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + dwID = 5600, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 6006, + nLevel = 1, + }, + [8] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5579, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [16] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 5536, + nLevel = 1, + }, + [17] = { + { + bBuffList = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + dwID = 5539, + nLevel = 1, + }, + [9] = { + szName = "眩晕", + dwID = 5578, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [18] = { + szName = "眩晕", + dwID = 5958, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2022, + nTime = 30, + szName = "下一次战狼点名", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 5513, + }, + [5] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5599, + nLevel = 1, + }, + [10] = { + szName = "锁足", + dwID = 5580, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5684, + nLevel = 1, + }, + [30] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5522, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 5713, + }, + [11] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5576, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5688, + nLevel = 1, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5491, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 5493, + nLevel = 1, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5595, + nLevel = 5, + }, + [24] = { + nLevel = 1, + col = { + 245, + 5, + 21, + }, + [1] = { + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "红", + dwID = 5403, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5712, + nLevel = 1, + }, + [25] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "蓝", + dwID = 5404, + }, + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5592, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [26] = { + { + bBuffList = true, + }, + dwID = 5406, + nLevel = 2, + col = { + 0, + 8, + 245, + }, + }, + [27] = { + { + bBuffList = true, + }, + dwID = 5405, + nLevel = 2, + col = { + 245, + 0, + 41, + }, + }, + [7] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5581, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5593, + nLevel = 4, + }, + [28] = { + { + bBuffList = true, + }, + dwID = 5717, + nLevel = 2, + }, + [23] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5701, + nLevel = 1, + }, + [29] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5516, + nLevel = 1, + }, + [15] = { + dwID = 5546, + nLevel = 1, + szNote = "治疗请勿挂持续!", + [1] = { + bBuffList = true, + }, + }, + }, + [171] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5329, + nLevel = 1, + }, + [2] = { + dwID = 5871, + nLevel = 1, + szNote = "远离人群", + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5476, + nLevel = 1, + }, + [1] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5872, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5477, + nLevel = 1, + }, + [5] = { + dwID = 5331, + nLevel = 1, + szNote = "远离人群排火!", + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [175] = { + [27] = { + { + bBuffList = true, + }, + dwID = 6777, + nLevel = 1, + }, + [2] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE3", + szNote = "按键3333", + dwID = 6877, + }, + [3] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE2", + szNote = "按键2222", + dwID = 6876, + }, + [4] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE1", + szNote = "按键1111", + dwID = 6875, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6707, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 6549, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "☆分散☆分散☆", + dwID = 6564, + }, + [8] = { + tCountdown = { + { + nIcon = 327, + nTime = 17, + szName = "连线准备!", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 232, + 9, + 202, + }, + [1] = { + bWhisperChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "☆远离人群☆", + dwID = 6566, + }, + [10] = { + tCountdown = { + { + nIcon = 340, + nTime = 13, + szName = "鬼魅/噬魄出现", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 0, + 201, + 0, + }, + [1] = { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6869, + }, + [12] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "真", + dwID = 6860, + }, + [14] = { + { + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6778, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [16] = { + szName = "眩晕", + dwID = 6958, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + szName = "定身", + dwID = 6923, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [24] = { + szName = "缴械", + dwID = 6992, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6949, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [32] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "令狐伤QTE", + dwID = 5197, + }, + [33] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [17] = { + szName = "眩晕", + dwID = 6977, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "封内", + dwID = 6998, + }, + [25] = { + szName = "禁疗", + dwID = 7026, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6936, + nLevel = 2, + }, + [34] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 1, + col = { + 234, + 242, + 0, + }, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bScreenHead = true, + bTeamChannel = true, + bFullScreen = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szNote = "治疗速度奶爆!", + dwID = 6573, + }, + [11] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6861, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "幻", + dwID = 6859, + }, + [15] = { + szName = "封内", + dwID = 7135, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [18] = { + szName = "定身", + dwID = 7004, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [22] = { + szName = "锁足", + dwID = 6954, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [26] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "封内", + dwID = 6979, + }, + [30] = { + szName = "禁疗", + dwID = 6991, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + szName = "操作QTE", + dwID = 6874, + nLevel = 1, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [19] = { + szName = "眩晕", + dwID = 6955, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [23] = { + szName = "封内", + dwID = 6935, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + col = { + 244, + 252, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "苏曼莎QTE", + dwID = 6917, + }, + }, + [177] = { + [13] = { + nLevel = 1, + col = { + 234, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "接收伤害", + dwID = 7554, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7534, + }, + [1] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7297, + nLevel = 1, + }, + [2] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7296, + nLevel = 1, + col = { + 237, + 0, + 229, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3398, + nTime = 28, + szName = "回风望月(穿过BOSS)", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7413, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [8] = { + nLevel = 1, + szName = "恐惧", + dwID = 7371, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [15] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6661, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [9] = { + nLevel = 1, + szName = "锁足", + dwID = 7380, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7452, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [10] = { + nLevel = 1, + szName = "缴械", + dwID = 7406, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7295, + nLevel = 1, + col = { + 0, + 226, + 242, + }, + }, + [11] = { + nLevel = 1, + col = { + 0, + 113, + 242, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "痴", + dwID = 7377, + }, + [6] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7374, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + nLevel = 1, + col = { + 245, + 33, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7376, + tCountdown = { + { + nIcon = 4549, + nTime = 50, + szName = "痴断情肠点名", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "情", + }, + [14] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "转移", + dwID = 6653, + }, + }, + [179] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6929, + }, + }, + [183] = { + [27] = { + nLevel = 1, + szName = "封内", + dwID = 7737, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 6953, + nLevel = 1, + }, + [38] = { + dwID = 6955, + nLevel = 1, + szName = "眩晕", + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 6956, + nLevel = 1, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7722, + nLevel = 1, + }, + [6] = { + nLevel = 1, + col = { + 233, + 250, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "兵佣", + dwID = 7721, + }, + [7] = { + nLevel = 1, + col = { + 220, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7720, + tCountdown = { + { + nIcon = 4580, + nTime = 45, + szName = "下一波虚实", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "即将变身", + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7460, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7454, + nLevel = 1, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7661, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 7474, + nLevel = 1, + }, + [16] = { + tCountdown = { + { + nIcon = 4549, + nTime = 10, + szName = "魅惑·下一次随机技能", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 245, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7583, + }, + [20] = { + nLevel = 2, + nCount = 3, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7486, + }, + [24] = { + nLevel = 1, + col = { + 64, + 32, + 64, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7480, + tCountdown = { + { + nIcon = 4529, + nTime = 50, + szName = "黑舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "黑舞", + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7538, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [32] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 3, + col = { + 242, + 242, + 0, + }, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7383, + nLevel = 1, + }, + [17] = { + tCountdown = { + { + nIcon = 4495, + nTime = 20, + szName = "火牢·下一次随机技能", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nLevel = 1, + dwID = 7476, + }, + [21] = { + tCountdown = { + { + nIcon = 4531, + nTime = 50, + szName = "红舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 232, + 0, + 31, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7479, + }, + [25] = { + nLevel = 2, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 235, + 237, + 237, + }, + szName = "白舞", + tCountdown = { + { + nIcon = 4494, + nTime = 50, + szName = "白舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "☆远离人群☆远离人群☆", + dwID = 7485, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7541, + nLevel = 2, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7382, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 7455, + nLevel = 1, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7670, + nLevel = 1, + }, + [13] = { + nLevel = 1, + szName = "眩晕", + dwID = 7639, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [15] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7472, + nLevel = 1, + }, + [18] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7488, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + [22] = { + tCountdown = { + { + nIcon = 4528, + nTime = 50, + szName = "绿舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 0, + 212, + 21, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7481, + }, + [26] = { + nLevel = 1, + szName = "眩晕", + dwID = 7540, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [30] = { + nLevel = 4, + nCount = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6927, + }, + [36] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7501, + nLevel = 1, + }, + [37] = { + dwID = 6958, + nLevel = 1, + szName = "眩晕", + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [35] = { + { + bBuffList = true, + }, + dwID = 7513, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6940, + nLevel = 2, + }, + [19] = { + nLevel = 2, + col = { + 255, + 252, + 252, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "定身", + dwID = 7487, + }, + [23] = { + nLevel = 2, + col = { + 15, + 0, + 222, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 3419, + nTime = 50, + szName = "蓝舞已触发", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "☆远离人群☆远离人群☆", + dwID = 7483, + }, + [31] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7578, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + }, + [187] = { + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7895, + nLevel = 1, + }, + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7896, + nLevel = 1, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7874, + nLevel = 1, + }, + }, + [189] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + bWhisperChannel = true, + }, + [1] = { + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + szNote = "地刺出现", + dwID = 7972, + }, + }, + [191] = { + [7] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [5] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★准备承伤★", + dwID = 8343, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + }, + [199] = { + [27] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [2] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★红", + szNote = "★抱团点排球★", + dwID = 8027, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "找红红红球", + szName = "寒意", + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "找蓝蓝蓝球", + szName = "圣炎", + }, + [10] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 8239, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 8465, + nLevel = 1, + }, + [16] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "红☆莲花", + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "★保持移动★", + dwID = 8199, + }, + [24] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "★注意开减伤★", + dwID = 8215, + }, + [28] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "你被瞎子点名", + szName = "点名", + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8319, + nLevel = 2, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [21] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [25] = { + tCountdown = { + { + nIcon = 4504, + key = "毒血涌动", + nTime = 20, + szName = "毒血涌动", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [29] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [34] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★切勿做任何动作★", + dwID = 8340, + }, + [9] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8240, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [15] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "莲花指", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "★远离人群★", + szName = "蓝☆莲花", + }, + [18] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + }, + dwID = 8198, + nLevel = 1, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [30] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "注意血量", + dwID = 8313, + }, + [36] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "★快驱散★", + dwID = 8014, + }, + [35] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "★注意控制层数★", + szName = "三毒", + }, + [1] = { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "连线★蓝", + szNote = "★抱团点排球★", + dwID = 8174, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [31] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + }, + [203] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8734, + }, + { + { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "不要站水里", + dwID = 8776, + }, + }, + [205] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "★注意换T★", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★准备承伤★", + dwID = 8343, + }, + }, + [209] = { + [6] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8858, + szName = "锁定·圣者", + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8789, + szName = "定身", + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8790, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8788, + }, + [4] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8791, + }, + [5] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9317, + }, + [7] = { + { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "远离人群", + dwID = 8817, + }, + }, + [211] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "★注意换T★", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "★准备承伤★", + dwID = 8343, + }, + }, + [221] = { + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8975, + }, + [7] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 1, + }, + [1] = { + { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "牵引", + nLevel = 1, + dwID = 9652, + }, + [2] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9663, + }, + [4] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 8895, + nLevel = 1, + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 8896, + nLevel = 1, + }, + [10] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8983, + nLevel = 1, + col = { + 208, + 255, + 2, + }, + }, + [3] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 161, + 9, + 232, + }, + }, + [6] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 1, + }, + [12] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 2, + 255, + 19, + }, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + }, + [-1] = { + { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szName = "缴械", + dwID = 4053, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6756, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8391, + }, + [8] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6426, + nIcon = 4534, + szName = "天地根", + }, + [16] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6394, + nIcon = 3406, + szName = "雷特效", + }, + [17] = { + nIcon = 2589, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 2584, + nLevel = 1, + szName = "橙武CD", + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 2911, + nIcon = 1439, + szName = "雨集", + }, + [18] = { + nLevel = 1, + [2] = { + bTeamChannel = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 9299, + }, + [5] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5697, + nLevel = 1, + }, + [10] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8218, + nIcon = 913, + szName = "上元CD", + }, + [20] = { + tCountdown = { + { + nClass = 1, + szName = "挖宝CD", + nIcon = 13, + nTime = 60, + }, + }, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "挖宝CD", + nIcon = 2409, + nLevel = 1, + dwID = 1895, + }, + [21] = { + nLevel = 3, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 10175, + szName = "三鼓", + }, + [11] = { + nIcon = 4571, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "三生CD", + dwID = 6195, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 219, + 61, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10186, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 2316, + }, + [6] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 7656, + nIcon = 4513, + szName = "大漠", + }, + [12] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8509, + nIcon = 3224, + szName = "蚀肌之伤", + }, + [13] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 3287, + nIcon = 3237, + szName = "蚀肌化血", + }, + [7] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6359, + nIcon = 3242, + szName = "流星赶月", + }, + [14] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 3286, + nIcon = 3229, + szName = "奥妙无穷", + }, + [19] = { + dwID = 10050, + nLevel = 1, + }, + [15] = { + nLevel = 1, + szName = "行气血", + dwID = 6267, + [1] = { + bBuffList = true, + }, + }, + [23] = { + nLevel = 1, + dwID = 10827, + [1] = { + bBuffList = true, + }, + }, + }, + [225] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8752, + }, + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8773, + }, + }, + [227] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8828, + nLevel = 1, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9024, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8833, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8834, + nLevel = 1, + }, + }, + [229] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9188, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9032, + }, + }, + [231] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "三环锡杖", + nTime = 18, + szName = "三环锡杖", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + szName = "气血爆发", + dwID = 9585, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9291, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 9193, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "不要再中第二次", + dwID = 9195, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9429, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + nLevel = 1, + dwID = 9239, + tCountdown = { + { + nClass = 1, + szName = "破敌剑气", + nIcon = 4224, + nTime = 10, + }, + { + nClass = 1, + szName = "半月", + nIcon = 2589, + nTime = 21, + }, + }, + [1] = { + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10062"] = true, + ["SKILL#10002"] = true, + ["SKILL#10389"] = true, + ["SKILL#10243"] = true, + }, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "三三三三", + szName = "三三三", + }, + [24] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9225, + szName = "转②", + }, + [40] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9226, + szName = "转③", + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + dwID = 9412, + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "点名结束", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 32, + 255, + 2, + }, + dwID = 9405, + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + szNote = "四四四四", + szName = "四四四", + }, + [25] = { + dwID = 9420, + nLevel = 1, + tCountdown = { + { + nClass = 2, + szName = "一鼓作气", + nIcon = 2589, + nTime = 8, + }, + { + nClass = 2, + szName = "再次隐身", + nIcon = 3408, + nTime = 12, + }, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + nLevel = 1, + dwID = 9229, + szName = "接收①", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "一一一", + tCountdown = { + { + nIcon = 2589, + key = "一鼓作气", + nTime = 5, + szName = "一鼓作气", + nClass = 2, + }, + { + nIcon = 3409, + key = "无坚不摧", + nTime = 10, + szName = "无坚不摧", + nClass = 2, + }, + }, + szNote = "一一一一", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "五五五五", + szName = "五五五", + }, + [26] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + szName = "接收③", + dwID = 9231, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + nLevel = 1, + dwID = 9230, + szName = "接收②", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9537, + nLevel = 2, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9535, + szName = "奶爆", + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "二二二二", + szName = "二二二", + }, + [23] = { + dwID = 9423, + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "一鼓作气", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "飞花之刃", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "涅槃经", + nRefresh = 400, + nClass = 1, + }, + }, + szName = "转①", + dwID = 9224, + }, + }, + [233] = { + { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "牵引", + nLevel = 2, + dwID = 9652, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9662, + nLevel = 2, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nIcon = 7051, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 2, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nIcon = 7054, + szName = "11111", + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nIcon = 7070, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8975, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nIcon = 7057, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8978, + nLevel = 2, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8985, + nLevel = 2, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + nClass = 1, + szName = "行舟", + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nIcon = 7073, + szName = "33333", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8896, + nLevel = 2, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 8981, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 2, + }, + }, + [235] = { + { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + szName = "牵引", + dwID = 9652, + nLevel = 2, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9662, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nIcon = 7051, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nLevel = 2, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8918, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nIcon = 7054, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nLevel = 2, + szName = "11111", + }, + [18] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nIcon = 7070, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nLevel = 2, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9664, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8975, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nIcon = 7057, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nLevel = 2, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8978, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8985, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + szName = "行舟", + nClass = 1, + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nIcon = 7073, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nLevel = 2, + szName = "33333", + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8896, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8916, + }, + }, + [237] = { + { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + szName = "牵引", + dwID = 9652, + nLevel = 2, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9662, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nIcon = 7051, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nLevel = 2, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8918, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nIcon = 7054, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nLevel = 2, + szName = "11111", + }, + [18] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nIcon = 7070, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nLevel = 2, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9664, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8975, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nIcon = 7057, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nLevel = 2, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8978, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8985, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + szName = "行舟", + nClass = 1, + nIcon = 13, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nIcon = 7073, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nLevel = 2, + szName = "33333", + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8896, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8916, + }, + }, + [120] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 3416, + col = { + 0, + 255, + 255, + }, + }, + { + { + bFullScreen = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3454, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + }, + [66] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "朱云", + szNote = "快去鹤★快去鹤", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "欲吐地葬", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "白露", + szNote = "快去瓶子★快去瓶子", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "破静天门", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "镇魂长曲", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "普渡八音", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "黑洞", + szNote = "快去灯★快去灯", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "碧海", + szNote = "快去小船★快去小船", + dwID = 1876, + }, + }, + }, + __meta = { + szLang = "zhcn", + szAuthor = "茗伊", + nTimeStamp = 1565612703, + szServer = "枫泾古镇", + }, + BUFF = { + [122] = { + { + { + bBuffList = true, + }, + dwID = 10450, + nLevel = 1, + }, + }, + [211] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [212] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [182] = { + [6] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7456, + nLevel = 1, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 7677, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 7471, + nLevel = 1, + }, + [1] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7591, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7475, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 7465, + nLevel = 1, + }, + }, + [214] = { + [7] = { + szName = "香双倍", + dwID = 10115, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 9474, + szName = "重置", + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 9473, + szName = "飞人", + nLevel = 3, + }, + [4] = { + szName = "木材", + dwID = 9469, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [8] = { + szName = "佛双倍", + dwID = 10116, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [9] = { + szName = "木双倍", + nLevel = 1, + dwID = 10114, + [1] = { + bBuffList = true, + }, + }, + [5] = { + szName = "香烛", + dwID = 9470, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [3] = { + szName = "佛像", + dwID = 9471, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [6] = { + szName = "香烛", + dwID = 9520, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + }, + [183] = { + [6] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7456, + nLevel = 1, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 7677, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 7471, + nLevel = 1, + }, + [1] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7591, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7475, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 7465, + nLevel = 1, + }, + }, + [217] = { + { + { + bBuffList = true, + }, + dwID = 10229, + szName = "古董", + nLevel = 1, + }, + }, + [155] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5089, + }, + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4836, + }, + }, + [221] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8915, + nScrutinyType = 1, + szName = "阳", + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8917, + nScrutinyType = 1, + szName = "阴", + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [222] = { + [6] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8967, + }, + [2] = { + szName = "火", + dwID = 8909, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + szName = "水", + dwID = 8908, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + szName = "土", + dwID = 8910, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + szName = "木", + dwID = 8907, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + szName = "金", + dwID = 8906, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [191] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [192] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [225] = { + { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9104, + }, + }, + [164] = { + { + { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5632, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 5486, + }, + }, + [165] = { + { + { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5632, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 5486, + }, + }, + [68] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [198] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [230] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "阳", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szName = "阴", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [69] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [-9] = { + [7] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7691, + }, + [1] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9433, + nLevel = 3, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 854, + nLevel = 1, + }, + [4] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nIcon = 4601, + dwID = 5994, + }, + [8] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9353, + nLevel = 3, + }, + [9] = { + nIcon = 8043, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "修罗鬼面", + nLevel = 4, + dwID = 8474, + }, + [5] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6385, + nLevel = 1, + }, + [10] = { + nLevel = 1, + dwID = 6176, + }, + [3] = { + nIcon = 4900, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bOnlySelfSrc = true, + }, + dwID = 6381, + nLevel = 1, + szName = "龙头", + }, + [6] = { + nLevel = 29, + dwID = 631, + }, + }, + [70] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [233] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "阳", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "阴", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [199] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [140] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4836, + }, + }, + [235] = { + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 9665, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szName = "阴", + nScrutinyType = 1, + dwID = 8917, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "阳", + nScrutinyType = 1, + dwID = 8915, + }, + }, + [178] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6681, + szName = "乾", + }, + { + nIcon = 4224, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "坤", + nLevel = 1, + dwID = 6682, + }, + [4] = { + nIcon = 4503, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "艮", + nLevel = 1, + dwID = 6685, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6687, + szName = "巽", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7695, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [17] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7450, + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "互换", + nIcon = 537, + dwID = 7559, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6684, + szName = "离", + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6666, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7419, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6688, + szName = "兑", + }, + [6] = { + nIcon = 4495, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "坎", + nLevel = 1, + dwID = 6683, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7446, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 7447, + nLevel = 1, + }, + [7] = { + nIcon = 3422, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "震", + nLevel = 1, + dwID = 6686, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7694, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7693, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + }, + [228] = { + { + { + bBuffList = true, + }, + szName = "王者", + dwID = 8855, + nLevel = 1, + }, + { + szName = "圣者", + nLevel = 1, + dwID = 8854, + [1] = { + bBuffList = true, + }, + }, + }, + [72] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [237] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBigFontAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "阳", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "阴", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 9665, + }, + }, + [206] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [175] = { + [6] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6900, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6862, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 6952, + }, + [1] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7226, + }, + [4] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7148, + }, + [5] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6891, + }, + }, + [205] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [176] = { + [6] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6891, + }, + [2] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7226, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6862, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 7870, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 6952, + }, + [5] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7148, + }, + [7] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6900, + }, + }, + [179] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6928, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6930, + }, + }, + [177] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6681, + szName = "乾", + }, + { + nIcon = 4224, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "坤", + nLevel = 1, + dwID = 6682, + }, + [4] = { + nIcon = 4503, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "艮", + nLevel = 1, + dwID = 6685, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6687, + szName = "巽", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7695, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [17] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7450, + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "互换", + nIcon = 537, + dwID = 7559, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6684, + szName = "离", + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6666, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7419, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6688, + szName = "兑", + }, + [6] = { + nIcon = 4495, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "坎", + nLevel = 1, + dwID = 6683, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7446, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 7447, + nLevel = 1, + }, + [7] = { + nIcon = 3422, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "震", + nLevel = 1, + dwID = 6686, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7694, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7693, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + }, + [209] = { + { + { + bBuffList = true, + }, + dwID = 8855, + szName = "王者", + nLevel = 1, + }, + { + { + bBuffList = true, + }, + dwID = 8854, + szName = "圣者", + nLevel = 1, + }, + }, + [-1] = { + [33] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6757, + nLevel = 1, + }, + [35] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1170, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9769, + }, + [39] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 684, + }, + [41] = { + { + bBuffList = true, + }, + dwID = 213, + nLevel = 4, + }, + [43] = { + { + bBuffList = true, + }, + dwID = 1437, + nLevel = 1, + }, + [45] = { + tKungFu = { + ["SKILL#10081"] = true, + ["SKILL#10021"] = true, + ["SKILL#10225"] = true, + ["SKILL#10447"] = true, + ["SKILL#10242"] = true, + ["SKILL#10014"] = true, + ["SKILL#10003"] = true, + ["SKILL#10175"] = true, + }, + dwID = 9770, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [47] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9586, + }, + [49] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8528, + }, + [51] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6419, + }, + [53] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2686, + nLevel = 1, + }, + [55] = { + { + bBuffList = true, + }, + dwID = 9801, + nLevel = 1, + }, + [57] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 399, + }, + [59] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1378, + nLevel = 2, + }, + [61] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2706, + nLevel = 1, + }, + [63] = { + { + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 10208, + nLevel = 1, + }, + [66] = { + { + bBuffList = true, + }, + nLevel = 1, + szName = "防", + dwID = 10024, + }, + [70] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 395, + }, + [74] = { + { + bBuffList = true, + }, + nLevel = 6, + dwID = 2797, + }, + [78] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 3885, + }, + [82] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 3447, + }, + [86] = { + { + bBuffList = true, + }, + nLevel = 4, + dwID = 3068, + }, + [90] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2849, + }, + [94] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2844, + nLevel = 1, + }, + [98] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6240, + }, + [102] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7700, + nLevel = 1, + }, + [106] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 2065, + }, + [110] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6140, + nLevel = 1, + }, + [114] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 113, + }, + [118] = { + { + bBuffList = true, + }, + dwID = 6265, + nLevel = 1, + }, + [122] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6371, + }, + [126] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 412, + nLevel = 1, + }, + [132] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2778, + }, + [140] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3316, + nLevel = 2, + }, + [148] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6112, + nLevel = 1, + }, + [156] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6299, + }, + [164] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2757, + nLevel = 1, + }, + [172] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9919, + nLevel = 1, + }, + [180] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7802, + }, + [188] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4052, + bCheckLevel = true, + }, + [196] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8300, + }, + [204] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8423, + }, + [212] = { + nLevel = 3, + col = { + 208, + 0, + 255, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "凌冬三", + dwID = 9502, + }, + [220] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10216, + nLevel = 1, + }, + [228] = { + nLevel = 7, + dwID = 378, + tKungFu = { + ["SKILL#10224"] = true, + ["SKILL#10225"] = true, + ["SKILL#10026"] = true, + ["SKILL#10268"] = true, + ["SKILL#10144"] = true, + ["SKILL#10145"] = true, + ["SKILL#10390"] = true, + }, + [1] = { + bBuffList = true, + }, + }, + [236] = { + nLevel = 6, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "风特效", + dwID = 6360, + }, + [1] = { + dwID = 3682, + szName = "朱雀", + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [235] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 11, + dwID = 208, + }, + [190] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9909, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8650, + }, + [133] = { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + szName = "一鼓", + dwID = 10175, + }, + [141] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3281, + nLevel = 1, + }, + [149] = { + { + bBuffList = true, + }, + nLevel = 8, + dwID = 3214, + }, + [157] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 10, + dwID = 1900, + }, + [165] = { + { + bBuffList = true, + }, + dwID = 9949, + nLevel = 1, + }, + [173] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4754, + }, + [181] = { + { + bBuffList = true, + }, + dwID = 6308, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7979, + nLevel = 1, + }, + [197] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8279, + }, + [205] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8303, + }, + [213] = { + nLevel = 2, + col = { + 126, + 107, + 255, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "凌冬二", + dwID = 9502, + }, + [221] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9284, + nLevel = 1, + }, + [229] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8607, + szName = "调息", + }, + [237] = { + nLevel = 3, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "水特效", + dwID = 4761, + }, + [15] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bOnlySelfSrc = true, + bBigFontAlarm = true, + bBuffList = true, + }, + dwID = 1919, + nIcon = 8034, + szName = "浮心·劫", + }, + [4] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7983, + nLevel = 1, + }, + [67] = { + { + bBuffList = true, + }, + nLevel = 1, + szName = "攻", + dwID = 10023, + }, + [71] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 1242, + }, + [75] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2795, + nLevel = 6, + }, + [5] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "六合", + dwID = 7989, + }, + [83] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2840, + }, + [87] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9873, + }, + [91] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2828, + nLevel = 2, + }, + [6] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8007, + nLevel = 1, + }, + [99] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2704, + nLevel = 1, + }, + [103] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 1802, + }, + [107] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2683, + nLevel = 1, + }, + [7] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7981, + nLevel = 1, + }, + [115] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9933, + nLevel = 1, + }, + [119] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6262, + }, + [123] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1487, + }, + [8] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8087, + nLevel = 1, + }, + [134] = { + nLevel = 2, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + szName = "二鼓", + dwID = 10175, + }, + [9] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8085, + nLevel = 1, + }, + [150] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3401, + nLevel = 2, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 926, + }, + [166] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9906, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 917, + }, + [182] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 4246, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 3, + dwID = 4101, + }, + [198] = { + nIcon = 6340, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nLevel = 1, + dwID = 8273, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 4487, + }, + [214] = { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + col = { + 249, + 124, + 124, + }, + szName = "凌冬一", + dwID = 9502, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + dwID = 377, + nLevel = 1, + }, + [230] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 8656, + }, + [238] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "雷特效", + dwID = 4759, + }, + [239] = { + { + bBuffList = true, + }, + dwID = 3853, + nLevel = 2, + }, + [16] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1920, + nIcon = 8033, + szName = "莲华·缘", + }, + [17] = { + nLevel = 3, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "吞虹", + nIcon = 8037, + dwID = 1912, + }, + [18] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1911, + nIcon = 8038, + szName = "紫龙寂地", + }, + [19] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1915, + nIcon = 8041, + szName = "周流星位", + }, + [20] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1916, + nIcon = 8042, + szName = "渊微指玄", + }, + [21] = { + nIcon = 8045, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 6471, + nLevel = 1, + szName = "西天聆雪", + }, + [22] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1917, + nIcon = 8026, + szName = "寒声·寂影", + }, + [23] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1913, + nIcon = 8029, + szName = "墨颠", + }, + [24] = { + nIcon = 8046, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "弱水", + nLevel = 1, + szNote = "特效触发快无限按云飞", + dwID = 1922, + }, + [25] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3028, + nIcon = 8032, + szName = "绛玉拨云", + }, + [26] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3488, + nIcon = 8036, + szName = "造化异轨", + }, + [27] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3487, + nIcon = 8035, + szName = "碎屏沉星", + }, + [28] = { + nIcon = 8040, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 4930, + nLevel = 3, + szName = "残月惊天", + }, + [29] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 4931, + nIcon = 8039, + szName = "执手", + }, + [30] = { + nIcon = 8030, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 6466, + nLevel = 3, + szName = "涯风嘲雨", + }, + [31] = { + nLevel = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + nIcon = 8044, + dwID = 8474, + szName = "朱轩怀雀", + }, + [32] = { + nIcon = 8047, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + }, + szName = "青玉流", + nLevel = 4, + dwID = 10192, + }, + [34] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6758, + nLevel = 1, + }, + [36] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 538, + }, + [38] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 693, + nLevel = 5, + }, + [40] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3067, + nLevel = 1, + }, + [42] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10121, + nLevel = 1, + }, + [44] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10240, + }, + [46] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 677, + }, + [48] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6418, + }, + [50] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2805, + }, + [52] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9835, + }, + [54] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6194, + }, + [56] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 10081, + }, + [58] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 9803, + }, + [60] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6417, + nLevel = 1, + }, + [62] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9828, + }, + [64] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10209, + }, + [68] = { + szName = "四阵", + nLevel = 1, + dwID = 916, + [1] = { + bBuffList = true, + }, + }, + [72] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6214, + nLevel = 1, + }, + [76] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9809, + nLevel = 1, + }, + [80] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8080, + nLevel = 1, + }, + [84] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6246, + nLevel = 1, + }, + [88] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9877, + nLevel = 1, + }, + [92] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6243, + nLevel = 1, + }, + [96] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2953, + }, + [100] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7701, + }, + [104] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1728, + nLevel = 1, + }, + [108] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1722, + nLevel = 1, + }, + [112] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6266, + }, + [116] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5678, + nLevel = 1, + }, + [120] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2719, + }, + [124] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6256, + nLevel = 1, + }, + [128] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1440, + nLevel = 1, + }, + [136] = { + { + bBuffList = true, + }, + dwID = 7671, + nLevel = 1, + }, + [144] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3443, + nLevel = 1, + }, + [152] = { + { + bBuffList = true, + }, + dwID = 9964, + nLevel = 1, + }, + [160] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7729, + }, + [168] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9910, + }, + [176] = { + nLevel = 4, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4052, + }, + [184] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 4423, + nLevel = 1, + }, + [192] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 5996, + }, + [200] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8253, + }, + [208] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9506, + nLevel = 1, + }, + [216] = { + { + bBuffList = true, + }, + dwID = 9330, + nLevel = 1, + }, + [224] = { + { + bBuffList = true, + }, + dwID = 9509, + nLevel = 1, + }, + [232] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + nScrutinyType = 2, + dwID = 680, + nLevel = 29, + }, + [240] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "减伤大旗", + dwID = 2573, + }, + [175] = { + nLevel = 2, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4937, + }, + [195] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7180, + }, + [231] = { + szName = "上元", + nLevel = 6, + dwID = 681, + [1] = { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + }, + [227] = { + nLevel = 5, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + tKungFu = { + ["SKILL#10021"] = true, + ["SKILL#10242"] = true, + ["SKILL#10447"] = true, + ["SKILL#10003"] = true, + ["SKILL#10081"] = true, + ["SKILL#10175"] = true, + ["SKILL#10176"] = true, + ["SKILL#10080"] = true, + ["SKILL#10028"] = true, + ["SKILL#10448"] = true, + }, + dwID = 375, + }, + [179] = { + nLevel = 1, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4937, + }, + [199] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8272, + }, + [223] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9355, + nLevel = 1, + }, + [222] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9329, + nLevel = 1, + }, + [219] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9437, + nLevel = 1, + }, + [183] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9744, + nLevel = 1, + }, + [189] = { + { + bBuffList = true, + }, + dwID = 4052, + nLevel = 1, + bCheckLevel = true, + }, + [215] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9544, + }, + [211] = { + nLevel = 1, + col = { + 255, + 91, + 91, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "凌冬一", + dwID = 9353, + }, + [187] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 6301, + col = { + 2, + 209, + 22, + }, + }, + [203] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8422, + }, + [207] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8291, + }, + [206] = { + { + bBuffList = true, + }, + nLevel = 9, + dwID = 8448, + }, + [129] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7657, + }, + [137] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 360, + }, + [145] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3217, + }, + [153] = { + { + bBuffList = true, + bOnlySelfSrc = true, + }, + nScrutinyType = 1, + dwID = 6425, + nLevel = 1, + }, + [161] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 139, + }, + [169] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9911, + }, + [177] = { + { + bBuffList = true, + }, + dwID = 4711, + nLevel = 2, + }, + [185] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 4056, + nLevel = 1, + }, + [193] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10221, + nLevel = 1, + }, + [201] = { + nIcon = 6346, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nLevel = 1, + dwID = 8245, + }, + [209] = { + nLevel = 3, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 9353, + col = { + 255, + 0, + 238, + }, + szName = "凌冬三", + }, + [217] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9265, + nLevel = 1, + }, + [225] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9495, + nLevel = 1, + }, + [233] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + dwID = 5693, + nLevel = 1, + }, + [241] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "大旗已下,爆发全开!", + dwID = 2570, + }, + [191] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6821, + nLevel = 1, + }, + [65] = { + { + bBuffList = true, + }, + dwID = 7171, + nLevel = 1, + }, + [69] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 9830, + nLevel = 1, + }, + [73] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1436, + }, + [77] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 856, + }, + [81] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2946, + }, + [85] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2543, + nLevel = 1, + }, + [89] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10127, + nLevel = 1, + }, + [93] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2542, + }, + [97] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2315, + }, + [101] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7971, + nLevel = 1, + }, + [105] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2701, + nLevel = 3, + }, + [109] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5668, + nLevel = 1, + }, + [113] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 7, + dwID = 6264, + }, + [117] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6255, + nLevel = 1, + }, + [121] = { + { + bBuffList = true, + }, + dwID = 9728, + nLevel = 1, + }, + [125] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 7, + dwID = 122, + }, + [130] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 203, + }, + [138] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3203, + }, + [146] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6105, + nLevel = 1, + }, + [154] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 384, + }, + [162] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2983, + }, + [170] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4489, + }, + [178] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 4244, + }, + [186] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 4439, + }, + [194] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9920, + nLevel = 1, + }, + [202] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8244, + }, + [210] = { + nLevel = 2, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + col = { + 157, + 71, + 255, + }, + dwID = 9353, + szName = "凌冬二", + }, + [218] = { + { + bBuffList = true, + }, + dwID = 9334, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [226] = { + nLevel = 5, + nScrutinyType = 1, + dwID = 392, + }, + [234] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + dwID = 631, + nLevel = 29, + }, + [174] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9736, + }, + [171] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 4671, + }, + [167] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9908, + }, + [163] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7709, + }, + [159] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 999, + nLevel = 1, + }, + [158] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1439, + }, + [155] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 613, + nLevel = 2, + }, + [151] = { + { + bBuffList = true, + }, + dwID = 9951, + nLevel = 1, + }, + [147] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3425, + }, + [143] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3468, + nLevel = 1, + }, + [142] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3276, + nLevel = 1, + }, + [139] = { + { + bBuffList = true, + }, + dwID = 3254, + nLevel = 1, + }, + [135] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 367, + }, + [131] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7655, + }, + [127] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9722, + }, + [111] = { + { + bBuffList = true, + }, + dwID = 9714, + nLevel = 1, + }, + [95] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6221, + nLevel = 1, + }, + [79] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6229, + nLevel = 1, + }, + }, + [200] = { + [6] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8967, + }, + [2] = { + dwID = 8909, + nLevel = 1, + szName = "火", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + dwID = 8908, + nLevel = 1, + szName = "水", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + dwID = 8910, + nLevel = 1, + szName = "土", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + dwID = 8907, + nLevel = 1, + szName = "木", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + dwID = 8906, + nLevel = 1, + szName = "金", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + }, + }, +} diff --git a/!src-dist/data/MY_TeamMon/data/default.zhtw.jx3dat b/!src-dist/data/MY_TeamMon/data/default.zhtw.jx3dat new file mode 100644 index 000000000..979ce264c --- /dev/null +++ b/!src-dist/data/MY_TeamMon/data/default.zhtw.jx3dat @@ -0,0 +1,60563 @@ +return { + CASTING = { + [147] = { + { + dwID = 4108, + nLevel = 1, + }, + { + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "鍙嶅綀鍓╅鏅傞枔", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4119, + nLevel = 1, + }, + }, + [242] = { + [7] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + nIcon = 13, + nTime = "8,闅ㄦ鎶鑳;16,闅ㄦ鎶鑳;24,闅ㄦ鎶鑳;32,闅ㄦ鎶鑳;40,闅ㄦ鎶鑳;48,闅ㄦ鎶鑳;54,闅ㄦ鎶鑳;", + }, + }, + dwID = 15871, + }, + [1] = { + dwID = 16029, + nLevel = 1, + szNote = "涓籘娉ㄦ剰娓涘偡", + [8] = { + bBigFontAlarm = true, + }, + }, + [2] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + szNote = "婧栧倷鎷変汉鍑哄湀", + dwID = 15791, + }, + [4] = { + nLevel = 1, + dwID = 15867, + }, + [8] = { + nLevel = 1, + dwID = 15884, + tCountdown = { + { + nClass = 8, + szName = "姝i潰AOE", + nIcon = 13, + nTime = 13, + }, + }, + }, + [9] = { + nLevel = 1, + szName = "闇滃嵃", + dwID = 15892, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "闇滃嵃", + nFrame = 1, + nClass = 8, + }, + { + nClass = 8, + szName = "姝i潰AOE", + nIcon = 13, + nTime = 13, + }, + }, + }, + [5] = { + nLevel = 2, + dwID = 15869, + }, + [10] = { + nLevel = 1, + [8] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 15887, + szNote = "闇滃嵃璁婂啺濉婅翰鍐板緦闈紒", + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nClass = 9, + nIcon = 13, + nTime = "13,鎷変汉;41,鎷変汉", + }, + { + nClass = 9, + nIcon = 13, + nTime = "29,涓籘娓涘偡;59,鍒嗘暎&婧栧倷榛炲悕", + }, + }, + dwID = 15824, + }, + [6] = { + nLevel = 1, + dwID = 15876, + }, + [11] = { + dwID = 15889, + nLevel = 1, + szNote = "蹇翰閬", + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [211] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鐏緧姗熼浄", + nTime = 22, + szName = "鐏緧姗熼浄", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "鎽у煄涓鎿", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "榛戞补鍦", + nTime = 30, + szName = "榛戞补鍦", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "杩芥搳鐏緧", + nTime = 11, + szName = "杩芥搳鐏緧", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 11, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 4, + szName = "铏庡槸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "婧栧倷鎺掔伀", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 67, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [5] = { + nLevel = 4, + szName = "鏂烽", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "鈽呴仩闆10灏衡槄閬犻洟10灏衡槄", + }, + }, + [212] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "绂佹柗", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "鏂烽暦鐢", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [4] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "鐜勫啺涓鎸", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [16] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "鈽呰翰閬挎柗娴埃鍕佲槄閬犻洟鈽", + }, + [17] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + nTime = 21, + szName = "鎭愭嚰debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [5] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 26, + szName = "姣掕娑屽嫊", + nClass = 8, + }, + }, + dwID = 13197, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "鍜屽鸡绺界珷锛堢┛閫忥級", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "鑱栫伀鐒氬煄", + dwID = 10337, + }, + [13] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "鈽呭揩鎵撴柗鈽呭揩鎵撴柗鈽", + dwID = 9355, + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "鈽呮敞鎰忚翰閬库槄", + dwID = 10347, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "鏂锋氮鏂(娴佽)", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9393, + }, + [15] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "鍓佸北鍔(鐮寸敳)", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9392, + }, + }, + [244] = { + [7] = { + dwID = 15871, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nClass = 8, + nTime = "8,闅ㄦ鎶鑳;16,闅ㄦ鎶鑳;24,闅ㄦ鎶鑳;32,闅ㄦ鎶鑳;40,闅ㄦ鎶鑳;48,闅ㄦ鎶鑳;54,闅ㄦ鎶鑳;", + }, + }, + }, + [1] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + szNote = "涓籘娉ㄦ剰娓涘偡", + dwID = 16029, + }, + [2] = { + dwID = 15791, + nLevel = 1, + szNote = "婧栧倷鎷変汉鍑哄湀", + [8] = { + bBigFontAlarm = true, + }, + }, + [4] = { + nLevel = 1, + dwID = 15867, + }, + [8] = { + tCountdown = { + { + szName = "姝i潰AOE", + nClass = 8, + nIcon = 13, + nTime = 13, + }, + }, + nLevel = 1, + dwID = 15884, + }, + [9] = { + tCountdown = { + { + nClass = 8, + nTime = 40, + szName = "闇滃嵃", + nIcon = 13, + nFrame = 1, + }, + { + szName = "姝i潰AOE", + nClass = 8, + nIcon = 13, + nTime = 13, + }, + }, + nLevel = 1, + dwID = 15892, + szName = "闇滃嵃", + }, + [5] = { + nLevel = 2, + dwID = 15869, + }, + [10] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 15887, + szNote = "闇滃嵃闈犺繎锛侊紒韬插啺寰岄潰", + }, + [3] = { + dwID = 15824, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nClass = 9, + nTime = "13,鎷変汉;41,鎷変汉", + }, + { + nIcon = 13, + nClass = 9, + nTime = "29,涓籘娓涘偡;59,鍒嗘暎&婧栧倷榛炲悕", + }, + }, + }, + [6] = { + nLevel = 1, + dwID = 15876, + }, + [11] = { + dwID = 15889, + nLevel = 1, + szNote = "蹇翰閬", + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [183] = { + [13] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 32, + szName = "鈽呮簴鍌欒烦鐕堚槄", + nRefresh = 30, + nClass = 9, + }, + }, + dwID = 8731, + }, + [7] = { + dwID = 8811, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + }, + [1] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "澶╃伀", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 8767, + }, + [2] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "鍏靛嫝", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8778, + }, + [4] = { + dwID = 8782, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [8] = { + nLevel = 4, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 8578, + szNote = "鈽呴仩闆5灏衡槄閬犻洟5灏衡槄", + tCountdown = { + { + nIcon = 13, + nTime = 12, + szName = "闅ㄦ鎶鑳介粸鍚", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [9] = { + dwID = 8877, + nLevel = 1, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8790, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鑷村懡涓鎿", + nTime = 31, + szName = "鑷村懡涓鎿", + nRefresh = 10, + nClass = 8, + nFrame = 2, + }, + }, + dwID = 8734, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "榛戞殫涔嬪姏(绌块)", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "鈽呴仩闆OSS20灏衡槄", + dwID = 8850, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 15, + szName = "闅ㄦ鎶鑳", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8785, + }, + [6] = { + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "鍎壏路涓嬩竴娆¢毃姗熸妧鑳", + nRefresh = 10, + nClass = 8, + }, + }, + [8] = { + bBigFontAlarm = true, + }, + dwID = 8807, + szName = "鍎壏鐏姳(3)", + szNote = "閬犻洟3灏猴紒锛", + nLevel = 1, + }, + [12] = { + nLevel = 1, + dwID = 8741, + }, + [11] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3419, + nTime = 11, + szName = "鏅傞枔鏆仠绲愭潫", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8941, + }, + }, + [218] = { + { + dwID = 14048, + nLevel = 1, + }, + { + [8] = { + bCenterAlarm = true, + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 14012, + szNote = "娉ㄦ剰鍒嗘暎", + nLevel = 1, + }, + [4] = { + tCountdown = { + { + nClass = 9, + szName = "娴侀ⅷ浜旈f柆", + nIcon = 13, + nTime = 40, + }, + }, + nLevel = 1, + col = { + 247, + 161, + 2, + }, + dwID = 13967, + nIcon = 13, + [9] = { + bBigFontAlarm = true, + }, + szName = "娴侀ⅷ浜旈f柆", + }, + [3] = { + nIcon = 13, + bMonTarget = true, + dwID = 14007, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + szName = "鐛荤キ鍔嶅К", + }, + }, + [126] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 6929, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "婧栧倷韬查伩绶氾紒", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 6927, + }, + }, + [220] = { + { + nLevel = 1, + dwID = 14050, + }, + { + dwID = 14052, + tCountdown = { + { + nClass = 8, + szName = "娉", + nIcon = 2589, + nTime = 60, + }, + }, + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 14055, + tCountdown = { + { + nClass = 9, + szName = "閫f柆", + nIcon = 345, + nTime = 20, + }, + { + nFrame = 8, + nTime = 60, + szName = "杩介瓊鍔嶆埃", + nClass = 9, + nIcon = 3443, + }, + }, + }, + [8] = { + dwID = 14130, + szName = "鏂祦鍔嵚峰緤", + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 60, + szName = "涓夌挵閷潠", + nClass = 8, + }, + { + nClass = 8, + key = "绱噾缂铰烽幃", + nTime = 88, + szName = "绱噾缂铰烽幃", + nIcon = 2123, + }, + }, + }, + [17] = { + dwID = 14024, + nLevel = 1, + }, + [9] = { + nLevel = 1, + szName = "鏂祦鍔嵚锋粎", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + dwID = 14025, + }, + [5] = { + dwID = 14119, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰収", + }, + [21] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰", + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,涓榧撲綔姘;15,鍙櫍;", + }, + { + nClass = 9, + szName = "闃茬Ζ濮挎厠", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [3] = { + nLevel = 1, + dwID = 14092, + tCountdown = { + { + nClass = 8, + szName = "閫f柆", + nIcon = 345, + nTime = 23, + }, + { + nFrame = 8, + nTime = 61, + szName = "杩介瓊鍔嶆埃", + nClass = 8, + nIcon = 3443, + }, + }, + }, + [6] = { + nLevel = 1, + dwID = 14123, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,涓榧撲綔姘;18,鐩剧墝鍙嶉渿;", + }, + { + nClass = 9, + szName = "姝ユ绶婇", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "鏀绘搳濮挎厠", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + [9] = { + bCenterAlarm = true, + }, + szName = "鏂祦鍔嵚风牬", + }, + [14] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [19] = { + nLevel = 1, + dwID = 14420, + }, + [15] = { + tCountdown = { + { + nClass = 9, + szName = "鐩剧墝鍙嶉渿", + nIcon = 2589, + nTime = 10, + }, + }, + dwID = 14540, + szName = "鐩剧墝鍙嶉渿", + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + }, + [221] = { + [7] = { + szName = "涓寮徛疯鑸", + dwID = 13928, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "骞诲績鍟忛瓟鏇", + nTime = 80, + szName = "骞诲績鍟忛瓟鏇", + nClass = 8, + }, + }, + dwID = 14200, + nLevel = 1, + }, + [2] = { + nLevel = 1, + dwID = 14586, + tCountdown = { + { + nIcon = 2589, + key = "鐎熺熷崝濂忔洸", + nTime = 67, + szName = "鍝佺鏇", + nClass = 8, + }, + }, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 14147, + }, + [8] = { + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "琛岃垷", + nTime = "13,琛岃垷;26,琛岃垷;39,琛岃垷;", + }, + { + nIcon = 2589, + key = "浜屽紡路鐧绘〒", + nTime = 48, + szName = "浜屽紡路鐧绘〒", + nClass = 8, + }, + }, + szName = "浜屽紡路鐧绘〒", + nLevel = 1, + dwID = 13933, + }, + [9] = { + tCountdown = { + { + nIcon = 2589, + nTime = 25, + szName = "鏄犳棩", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + nLevel = 2, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "鍥涘紡路鏄犳棩", + }, + [5] = { + nLevel = 1, + dwID = 14114, + tCountdown = { + { + nClass = 8, + szName = "鐭ュ績鐏", + nIcon = 327, + nTime = 5, + }, + }, + }, + [3] = { + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "杈帀鎺", + nRefresh = 5, + nClass = 9, + }, + }, + dwID = 13903, + szName = "杈帀鎺", + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + }, + [190] = { + { + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 9239, + }, + }, + [222] = { + { + dwID = 13897, + [9] = { + bCenterAlarm = true, + bBigFontAlarm = true, + }, + nLevel = 1, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + dwID = 13891, + }, + }, + [191] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鐏緧姗熼浄", + nTime = 22, + szName = "鐏緧姗熼浄", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "鎽у煄涓鎿", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "榛戞补鍦", + nTime = 30, + szName = "榛戞补鍦", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "杩芥搳鐏緧", + nTime = 11, + szName = "杩芥搳鐏緧", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 1, + szName = "铏庡槸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "婧栧倷鎺掔伀", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 67, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 11, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 4, + szName = "鏂烽", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "鈽呴仩闆10灏衡槄閬犻洟10灏衡槄", + }, + }, + [192] = { + [7] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "鐜勫啺涓鎸", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 26, + szName = "姣掕娑屽嫊", + nClass = 8, + }, + }, + dwID = 13197, + }, + [4] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [8] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "鈽呮敞鎰忚翰閬库槄", + dwID = 10347, + }, + [9] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "鍜屽鸡绺界珷锛堢┛閫忥級", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "绂佹柗", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "鏂烽暦鐢", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "鑱栫伀鐒氬煄", + dwID = 10337, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + }, + [224] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 13656, + szNote = "閬犻洟BOSS鍥涘昂", + tCountdown = { + { + szName = "骞藉啣楝兼", + nClass = 8, + nIcon = 13, + nTime = 18, + }, + }, + }, + }, + [225] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 14020, + szNote = "鎵舵悥璺", + tCountdown = { + { + nIcon = 13, + nClass = 8, + szName = "闊虫疆鍌炬箹", + nTime = 55, + }, + }, + }, + }, + [227] = { + { + tCountdown = { + { + nIcon = 13, + key = "DPS鍋滄墜", + nTime = "15,DPS鍋滄墜;80,DPS鍋滄墜;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "榛戦ⅷ鐮村博鏂", + nTime = "48,榛戦ⅷ鐮村博鏂;112,榛戦ⅷ鐮村博鏂;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "姝i潰AOE", + nTime = "35,姝i潰AOE;68,姝i潰AOE;99,姝i潰AOE;136,姝i潰AOE;", + nRefresh = 130, + nClass = 8, + }, + }, + dwID = 13775, + nLevel = 1, + }, + { + nIcon = 13, + nLevel = 1, + szName = "鍙嶆搳", + szNote = "杓稿嚭杓稿嚭杓稿嚭杓稿嚭", + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + dwID = 13808, + }, + { + nLevel = 1, + dwID = 13777, + }, + }, + [133] = { + [6] = { + dwID = 3613, + nLevel = 2, + }, + [2] = { + dwID = 3914, + nLevel = 1, + }, + [8] = { + [8] = { + bTeamChannel = true, + }, + nLevel = 1, + szNote = "蹇仠鎵嬶紒", + dwID = 3703, + }, + [3] = { + dwID = 3682, + nLevel = 33, + }, + [1] = { + [8] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + nLevel = 1, + dwID = 4023, + }, + [4] = { + [8] = { + bTeamChannel = true, + }, + nLevel = 1, + szName = "濂旂嫾韪忔湀寮忥紙绌垮埡锛", + dwID = 3628, + }, + [5] = { + dwID = 3643, + nLevel = 1, + }, + [7] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + dwID = 3705, + }, + }, + [165] = { + [7] = { + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "琛绁ぉ", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 5531, + bCheckLevel = true, + }, + [1] = { + nLevel = 2, + bCheckLevel = true, + dwID = 5624, + nIcon = 3418, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "娌欐毚", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [2] = { + nIcon = 332, + tCountdown = { + { + nIcon = 13, + nTime = 18, + szName = "SKILL#5645:1", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 5645, + nLevel = 1, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + szName = "绲愮畻鎶鑳", + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 16, + szName = "榛炲悕绲愭潫", + nRefresh = 20, + nClass = 9, + }, + }, + nRelScrutinyType = 3, + dwID = 6119, + }, + [8] = { + nLevel = 2, + bCheckLevel = true, + dwID = 5524, + tCountdown = { + { + nIcon = 13, + nTime = 50, + szName = "琛閲嶆〒", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 2025, + }, + [9] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 5513, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "鐨囦箣鎬", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [5] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "鏃ユ伎闄扮厼鐒", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 5449, + }, + [10] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 5653, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "骞崇爫鍔嶈仏閫插叆蹇冮瓟骞诲", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5631, + }, + [6] = { + dwID = 5450, + nLevel = 2, + }, + [11] = { + nLevel = 2, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 5513, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "鐨囦箣鎬", + nRefresh = 10, + nClass = 8, + }, + }, + }, + }, + [229] = { + { + dwID = 14048, + nLevel = 1, + }, + { + [8] = { + bCenterAlarm = true, + bBigFontAlarm = true, + bTeamChannel = true, + }, + nLevel = 1, + szNote = "娉ㄦ剰鍒嗘暎", + dwID = 14012, + }, + [4] = { + tCountdown = { + { + szName = "娴侀ⅷ浜旈f柆", + nClass = 9, + nIcon = 13, + nTime = 40, + }, + }, + szName = "娴侀ⅷ浜旈f柆", + col = { + 247, + 161, + 2, + }, + dwID = 13967, + nIcon = 13, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [3] = { + nLevel = 1, + bMonTarget = true, + dwID = 14007, + szName = "鐛荤キ鍔嶅К", + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + }, + [198] = { + [2] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鐏緧姗熼浄", + nTime = 22, + szName = "鐏緧姗熼浄", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "鎽у煄涓鎿", + nRefresh = 5, + nClass = 8, + }, + [4] = { + nIcon = 13, + key = "榛戞补鍦", + nTime = 30, + szName = "榛戞补鍦", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "杩芥搳鐏緧", + nTime = 11, + szName = "杩芥搳鐏緧", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [3] = { + nLevel = 2, + szName = "铏庡槸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "婧栧倷鎺掔伀", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 67, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 11, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 4, + szName = "鏂烽", + dwID = 9454, + [9] = { + bBigFontAlarm = true, + }, + szNote = "鈽呴仩闆10灏衡槄閬犻洟10灏衡槄", + }, + }, + [230] = { + [13] = { + tCountdown = { + { + nClass = 8, + nTime = 34, + szName = "绾", + nIcon = 3404, + nFrame = 8, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "12,琛岃垷;20,琛岃垷;28,琛岃垷;", + }, + { + nClass = 8, + szName = "涓冨紡路韪忔瓕", + nIcon = 2589, + nTime = 45, + }, + }, + [8] = { + bScreenHead = true, + bFullScreen = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + nLevel = 2, + szName = "涓冨紡路韪忔瓕", + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "杈帀鎺", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "杈帀鎺", + nLevel = 6, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13903, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + dwID = 14586, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "婧栧倷QTE", + nTime = 43, + szName = "婧栧倷QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "鍝佺鏇", + nTime = 80, + szName = "鍝佺鏇", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,骞婚瓟鍟忓績鏇;322,骞婚瓟鍟忓績鏇;", + }, + [3] = { + nIcon = 3437, + nTime = "120,闊崇簭;278,闊崇簭;318,闊崇簭;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "鍒嗗窛鎵嬄锋帓娴", + nIcon = 2139, + nTime = 24, + }, + }, + dwID = 14147, + }, + [8] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 2, + szName = "涓寮徛疯鑸", + [9] = { + bCenterAlarm = true, + }, + dwID = 13928, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + tCountdown = { + { + nClass = 8, + szName = "鐭ュ績鐏", + nIcon = 327, + nTime = 6, + }, + }, + dwID = 14114, + nLevel = 2, + }, + [10] = { + nLevel = 2, + szName = "涓寮忚畩路瑕嗚垷(绌块)", + [9] = { + bBigFontAlarm = true, + }, + dwID = 15084, + }, + [14] = { + nLevel = 2, + dwID = 13959, + [9] = { + bBigFontAlarm = true, + }, + szName = "鍏紡路鏈堟睜", + }, + [3] = { + szName = "鍒嗗窛鎵嬄锋帓娴(绌块)", + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13913, + }, + [12] = { + tCountdown = { + { + nIcon = 2589, + key = "鏄犳棩", + nTime = 28, + szName = "鏄犳棩", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + szName = "鍥涘紡路鏄犳棩", + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [11] = { + dwID = 13933, + tCountdown = { + { + nClass = 8, + nIcon = 2589, + key = "琛岃垷", + nTime = "13,琛岃垷;26,琛岃垷;39,琛岃垷;", + }, + { + nIcon = 2589, + key = "浜屽紡路鐧绘〒", + nTime = 48, + szName = "浜屽紡路鐧绘〒", + nClass = 8, + }, + }, + nLevel = 1, + szName = "浜屽紡路鐧绘〒", + }, + }, + [199] = { + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "绂佹柗", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 39, + szName = "鏂烽暦鐢", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 26, + szName = "姣掕娑屽嫊", + nClass = 8, + }, + }, + dwID = 13197, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "鐜勫啺涓鎸", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [16] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "鍓佸北鍔(鐮寸敳)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9392, + }, + [17] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + nTime = 21, + szName = "鎭愭嚰debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [5] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [3] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "鍜屽鸡绺界珷锛堢┛閫忥級", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 6, + szName = "鑱栫伀鐒氬煄", + dwID = 10337, + }, + [13] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "鈽呰翰閬挎柗娴埃鍕佲槄閬犻洟鈽", + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "鈽呮敞鎰忚翰閬库槄", + dwID = 10347, + }, + [14] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "鈽呭揩鎵撴柗鈽呭揩鎵撴柗鈽", + dwID = 9355, + }, + [15] = { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "鏂锋氮鏂(娴佽)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9393, + }, + }, + [231] = { + { + nLevel = 1, + dwID = 14050, + }, + { + tCountdown = { + { + szName = "娉", + nClass = 8, + nIcon = 2589, + nTime = 69, + }, + }, + nLevel = 1, + dwID = 14052, + }, + [4] = { + dwID = 14055, + tCountdown = { + { + nIcon = 345, + key = "閫f柆", + nTime = 20, + szName = "閫f柆", + nClass = 9, + }, + { + nIcon = 3443, + key = "杩介瓊鍔嶆埃", + nTime = 60, + szName = "杩介瓊鍔嶆埃", + nClass = 9, + }, + }, + nLevel = 1, + }, + [8] = { + szName = "鏂祦鍔嵚锋粎", + dwID = 14131, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 14024, + nLevel = 2, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 80, + szName = "涓夌挵閷潠", + nClass = 9, + }, + }, + }, + [17] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14025, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 14228, + nLevel = 1, + }, + [18] = { + [8] = { + bScreenHead = true, + }, + dwID = 14420, + nLevel = 1, + }, + [5] = { + nLevel = 1, + bMonTarget = true, + dwID = 14124, + szName = "鏂祦鍔嵚峰崐鏈", + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "5,涓榧撲綔姘;15,鍙櫍;", + }, + { + szName = "鏀绘搳濮挎厠绲愭潫", + nClass = 9, + nIcon = 2589, + nTime = 50, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14259, + }, + [20] = { + nLevel = 1, + dwID = 14112, + }, + [21] = { + nLevel = 2, + szName = "鍔嶅櫒鑸灺峰収", + [9] = { + bCenterAlarm = true, + }, + dwID = 14771, + }, + [11] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "6,涓榧撲綔姘;18,鐩剧墝鍙嶉渿;", + }, + { + szName = "姝ユ绶婇", + nClass = 9, + nIcon = 2133, + nTime = 12, + }, + { + szName = "闃茬Ζ濮挎厠绲愭潫", + nClass = 9, + nIcon = 2589, + nTime = 66, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14265, + }, + [22] = { + nLevel = 2, + szName = "鍔嶅櫒鑸灺峰", + [9] = { + bCenterAlarm = true, + }, + dwID = 14770, + }, + [3] = { + dwID = 14092, + tCountdown = { + { + nIcon = 345, + key = "閫f柆", + nTime = 23, + szName = "閫f柆", + nClass = 8, + }, + { + nIcon = 3443, + key = "杩介瓊鍔嶆埃", + nTime = 63, + szName = "杩介瓊鍔嶆埃", + nClass = 8, + }, + }, + nLevel = 1, + }, + [6] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + szName = "鏂祦鍔嵚风牬", + }, + [12] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [7] = { + nLevel = 2, + szName = "鏂祦鍔嵚疯惤", + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "鍗婃湀", + nRefresh = 7, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14126, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + szName = "鐩剧墝鍙嶉渿", + nClass = 9, + nIcon = 2589, + nTime = 10, + }, + }, + szName = "鐩剧墝鍙嶉渿", + dwID = 14540, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + [19] = { + dwID = 14113, + nLevel = 2, + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "浣忕浉", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "娑呮缍", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "绱噾缂", + nTime = 0, + szName = "绱噾缂铰烽幃", + nClass = 9, + }, + }, + }, + [15] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2133, + key = "绱噾缂", + nTime = 80, + szName = "绱噾缂铰烽幃", + nClass = 8, + }, + }, + szName = "绱噾缂铰烽幃", + }, + }, + [-9] = { + [13] = { + dwID = 2341, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 7, + }, + [7] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13955, + tCountdown = { + { + szName = "555", + nClass = 9, + nIcon = 4223, + nTime = 15, + }, + }, + }, + [1] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [2] = { + dwID = 15080, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 10, + }, + [4] = { + dwID = 14130, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [8] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13955, + tCountdown = { + { + szName = "55", + nClass = 9, + nIcon = 4223, + nTime = 10, + }, + }, + }, + [9] = { + dwID = 1116, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + tCountdown = { + { + szName = "婵佹按鑺遍枊閭勬湁", + nClass = 9, + nIcon = 13, + nTime = 12, + }, + }, + dwID = 13935, + nLevel = 4, + }, + [10] = { + dwID = 6134, + nLevel = 29, + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + szName = "闆腑琛1", + }, + [14] = { + nLevel = 1, + dwID = 15867, + }, + [11] = { + nLevel = 1, + dwID = 15792, + }, + [6] = { + [8] = { + bCenterAlarm = true, + bScreenHead = true, + }, + dwID = 14025, + nLevel = 2, + }, + [12] = { + dwID = 1557, + [9] = { + bTeamChannel = true, + bBigFontAlarm = true, + bWhisperChannel = true, + }, + nLevel = 8, + }, + [3] = { + nLevel = 4, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14276, + }, + }, + [232] = { + { + nLevel = 1, + dwID = 14050, + }, + { + tCountdown = { + { + szName = "娉", + nClass = 8, + nIcon = 2589, + nTime = 69, + }, + }, + nLevel = 1, + dwID = 14052, + }, + [4] = { + dwID = 14055, + tCountdown = { + { + nIcon = 345, + key = "閫f柆", + nTime = 20, + szName = "閫f柆", + nClass = 9, + }, + { + nIcon = 3443, + key = "杩介瓊鍔嶆埃", + nTime = 60, + szName = "杩介瓊鍔嶆埃", + nClass = 9, + }, + }, + nLevel = 1, + }, + [8] = { + szName = "鏂祦鍔嵚锋粎", + dwID = 14131, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 14024, + nLevel = 2, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 80, + szName = "涓夌挵閷潠", + nClass = 9, + }, + }, + }, + [17] = { + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "浣忕浉", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "娑呮缍", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "绱噾缂铰烽幃", + nTime = 0, + szName = "绱噾缂铰烽幃", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [9] = { + [8] = { + bScreenHead = true, + }, + dwID = 14228, + nLevel = 1, + }, + [18] = { + [8] = { + bScreenHead = true, + }, + dwID = 14420, + nLevel = 1, + }, + [5] = { + nLevel = 1, + bMonTarget = true, + dwID = 14124, + szName = "鏂祦鍔嵚峰崐鏈", + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "5,涓榧撲綔姘;15,鍙櫍;", + }, + { + szName = "鏀绘搳濮挎厠绲愭潫", + nClass = 9, + nIcon = 2589, + nTime = 50, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14259, + }, + [20] = { + nLevel = 1, + dwID = 14112, + }, + [21] = { + nLevel = 2, + szName = "鍔嶅櫒鑸灺峰収", + [9] = { + bCenterAlarm = true, + }, + dwID = 14771, + }, + [11] = { + tCountdown = { + { + nIcon = 2589, + nClass = 9, + nTime = "6,涓榧撲綔姘;18,鐩剧墝鍙嶉渿;", + }, + { + szName = "姝ユ绶婇", + nClass = 9, + nIcon = 2133, + nTime = 12, + }, + { + szName = "闃茬Ζ濮挎厠绲愭潫", + nClass = 9, + nIcon = 2589, + nTime = 66, + }, + }, + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14265, + }, + [22] = { + nLevel = 2, + szName = "鍔嶅櫒鑸灺峰", + [9] = { + bCenterAlarm = true, + }, + dwID = 14770, + }, + [3] = { + dwID = 14092, + tCountdown = { + { + nIcon = 345, + key = "閫f柆", + nTime = 23, + szName = "閫f柆", + nClass = 8, + }, + { + nIcon = 3443, + key = "杩介瓊鍔嶆埃", + nTime = 63, + szName = "杩介瓊鍔嶆埃", + nClass = 8, + }, + }, + nLevel = 1, + }, + [6] = { + nLevel = 2, + bMonTarget = true, + dwID = 14125, + szName = "鏂祦鍔嵚风牬", + }, + [12] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [7] = { + nLevel = 2, + szName = "鏂祦鍔嵚疯惤", + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "鍗婃湀", + nRefresh = 7, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14126, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + szName = "鐩剧墝鍙嶉渿", + nClass = 9, + nIcon = 2589, + nTime = 10, + }, + }, + szName = "鐩剧墝鍙嶉渿", + dwID = 14540, + [9] = { + bBigFontAlarm = true, + }, + nIcon = 13, + }, + [19] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14025, + nLevel = 2, + }, + [15] = { + dwID = 13949, + nLevel = 1, + tCountdown = { + { + nIcon = 2133, + key = "绱噾缂", + nTime = 80, + szName = "绱噾缂铰烽幃", + nClass = 8, + }, + }, + szName = "绱噾缂铰烽幃", + }, + }, + [138] = { + { + [8] = { + bCenterAlarm = true, + }, + nLevel = 2, + dwID = 3718, + tCountdown = { + { + nClass = 8, + szName = "澶╅洸鎺涢浄", + nIcon = 13, + nTime = 85, + }, + }, + }, + }, + [233] = { + [13] = { + nLevel = 2, + szName = "涓冨紡路韪忔瓕", + tCountdown = { + { + nClass = 8, + nTime = 34, + szName = "绾", + nIcon = 3404, + nFrame = 8, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "12,琛岃垷;20,琛岃垷;28,琛岃垷;", + }, + { + nClass = 8, + szName = "涓冨紡路韪忔瓕", + nIcon = 2589, + nTime = 43, + }, + }, + dwID = 13961, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "杈帀鎺", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "杈帀鎺", + nLevel = 6, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13903, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + dwID = 14586, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + key = "婧栧倷QTE", + nTime = 43, + szName = "婧栧倷QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "鍝佺鏇", + nTime = 80, + szName = "鍝佺鏇", + nClass = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,骞婚瓟鍟忓績鏇;322,骞婚瓟鍟忓績鏇;", + }, + [3] = { + nIcon = 3437, + nRefresh = 165, + nClass = 8, + nTime = "120,闊崇簭;278,闊崇簭;318,闊崇簭;", + }, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "鍒嗗窛鎵", + nIcon = 2139, + nTime = 25, + }, + }, + dwID = 14147, + }, + [8] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 2, + szName = "涓寮徛疯鑸", + [9] = { + bCenterAlarm = true, + }, + dwID = 13928, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + tCountdown = { + { + nClass = 8, + szName = "鐭ュ績鐏", + nIcon = 327, + nTime = 6, + }, + }, + dwID = 14114, + nLevel = 2, + }, + [10] = { + nLevel = 2, + szName = "涓寮忚畩路瑕嗚垷(绌块)", + [9] = { + bBigFontAlarm = true, + }, + dwID = 15084, + }, + [14] = { + nLevel = 2, + dwID = 13959, + [9] = { + bBigFontAlarm = true, + }, + szName = "鍏紡路鏈堟睜", + }, + [3] = { + dwID = 15080, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [6] = { + nLevel = 2, + dwID = 13913, + }, + [12] = { + tCountdown = { + { + nIcon = 2589, + key = "鏄犳棩", + nTime = 28, + szName = "鏄犳棩", + nRefresh = 10, + nClass = 9, + }, + }, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + szName = "鍥涘紡路鏄犳棩", + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [11] = { + dwID = 13933, + tCountdown = { + { + nClass = 8, + nIcon = 2589, + key = "琛岃垷", + nTime = "13,琛岃垷;26,琛岃垷;39,琛岃垷;", + }, + { + nIcon = 2589, + key = "浜屽紡路鐧绘〒", + nTime = 48, + szName = "浜屽紡路鐧绘〒", + nClass = 8, + }, + }, + nLevel = 1, + szName = "浜屽紡路鐧绘〒", + }, + }, + [155] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 29, + szName = "绱呭湀鍑虹従", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "娉ㄦ剰绱呭湀锛", + dwID = 4999, + }, + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 66, + szName = "涓嬩竴娆$帀鐭", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4990, + }, + [4] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "闅ㄦ鎶鑳", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5133, + }, + [8] = { + dwID = 4457, + nLevel = 1, + }, + [16] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 63, + szName = "鐏墕", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "娉ㄦ剰鍋滄墜锛屽嵆灏囩伀鐗嗭紝MT閫熷害鎷夊洖浠囨仺锛侊紒", + dwID = 4298, + }, + [17] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "鎴剤", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "鎴剤椹呮暎锛", + dwID = 4254, + }, + [9] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 12, + szName = "涓闄芥寚路浜屽搧", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4802, + }, + [18] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 26, + szName = "鍐版:", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4195, + }, + [5] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 23, + szName = "闅ㄦ鎶鑳", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5131, + }, + [10] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 3, + szName = "鎿婃殘路鍓╅鏅傞枔", + nRefresh = 10, + nClass = 9, + }, + }, + szNote = "杩戞埌婧栧倷鎿婃殘BOSS锛", + dwID = 4501, + }, + [11] = { + dwID = 4503, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [3] = { + tCountdown = { + { + nIcon = 13, + nTime = 66, + szName = "涓嬩竴娆$帀鐭", + nRefresh = 10, + nClass = 9, + }, + }, + nLevel = 1, + dwID = 5147, + bCheckLevel = true, + }, + [6] = { + dwID = 4455, + nLevel = 1, + }, + [12] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "鐏洸鎺屄风噿榄傛粎闈", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "鎿嬪ソ鍒嗚韩锛", + dwID = 4385, + }, + [13] = { + [8] = { + bFullScreen = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 25, + szName = "鍐版煴鍑虹従", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4343, + }, + [7] = { + dwID = 4456, + nLevel = 1, + }, + [14] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "榫嶇帇涔嬫(绌垮埡)", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 4934, + }, + [19] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "榛炵噧", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 4193, + }, + [15] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "鍏儴娴睜", + nRefresh = 48, + nClass = 9, + }, + }, + dwID = 4271, + }, + }, + [234] = { + { + [8] = { + bScreenHead = true, + }, + dwID = 14050, + nLevel = 1, + tCountdown = { + { + nClass = 8, + szName = "杩介瓊鍔嶆埃", + nIcon = 3443, + nTime = 40, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "32,娉;64,閫f柆;", + }, + }, + }, + { + dwID = 14052, + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 14092, + }, + [8] = { + nLevel = 2, + szName = "鏂祦鍔嵚疯惤", + dwID = 14126, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "鍗婃湀", + nRefresh = 7, + nClass = 9, + }, + }, + }, + [16] = { + szName = "绱噾缂铰烽幃", + dwID = 13949, + tCountdown = { + { + nIcon = 2123, + key = "绱噾缂", + nTime = 80, + szName = "绱噾缂铰烽幃", + nClass = 8, + }, + }, + nLevel = 1, + }, + [17] = { + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 80, + szName = "涓夌挵閷潠", + nClass = 9, + }, + }, + dwID = 14024, + nLevel = 2, + }, + [9] = { + nLevel = 1, + szName = "鏂祦鍔嵚锋粎", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 2, + dwID = 14025, + }, + [5] = { + nLevel = 1, + dwID = 14055, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + tCountdown = { + { + nIcon = 2122, + nTime = 33, + szName = "浣忕浉", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "娑呮缍", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "绱噾缂", + nTime = 0, + szName = "绱噾缂铰烽幃", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [21] = { + nLevel = 1, + dwID = 14112, + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,涓榧撲綔姘;15,鍙櫍;", + }, + { + nClass = 9, + szName = "鏀绘搳濮挎厠绲愭潫", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [22] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰収", + }, + [3] = { + dwID = 14278, + tCountdown = { + { + nClass = 9, + key = "榫嶅湒鐐搳", + nTime = 55, + szName = "榫嶅湒鐐搳", + nRefresh = 30, + nIcon = 3293, + nFrame = 8, + }, + { + nIcon = 3293, + key = "鐐搳", + nTime = "9,绗簩娆$偖鎿;14,绗笁娆$偖鎿;19,绗洓娆$偖鎿;", + nRefresh = 30, + nClass = 9, + }, + }, + nLevel = 3, + }, + [6] = { + nLevel = 1, + bMonTarget = true, + szName = "鏂祦鍔嵚峰崐鏈", + dwID = 14124, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,涓榧撲綔姘;18,鐩剧墝鍙嶉渿;", + }, + { + nClass = 9, + szName = "姝ユ绶婇", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "闃茬Ζ濮挎厠绲愭潫", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [13] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14264, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + szName = "鏂祦鍔嵚风牬", + dwID = 14125, + }, + [14] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [23] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰", + }, + [19] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14420, + }, + [15] = { + nLevel = 1, + nIcon = 13, + szName = "鐩剧墝鍙嶉渿", + tCountdown = { + { + nClass = 9, + szName = "鐩剧墝鍙嶉渿", + nIcon = 2589, + nTime = 10, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14540, + }, + }, + [203] = { + { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + }, + dwID = 13656, + szNote = "閬犻洟BOSS鍥涘昂", + tCountdown = { + { + nClass = 8, + szName = "骞藉啣楝兼", + nIcon = 13, + nTime = 18, + }, + }, + }, + }, + [235] = { + [13] = { + szName = "鍏紡路鏈堟睜", + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13959, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "杈帀鎺", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "杈帀鎺", + dwID = 13903, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + [1] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + [2] = { + tCountdown = { + { + nIcon = 2589, + key = "婧栧倷QTE", + nTime = 43, + szName = "婧栧倷QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "鍝佺鏇", + nTime = 80, + szName = "鍝佺鏇", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,骞婚瓟鍟忓績鏇;322,骞婚瓟鍟忓績鏇;", + }, + [3] = { + nIcon = 3437, + nTime = "120,闊崇簭;278,闊崇簭;318,闊崇簭;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + dwID = 14586, + nLevel = 1, + }, + [4] = { + dwID = 14147, + nLevel = 1, + tCountdown = { + { + szName = "鍒嗗窛鎵嬄锋帓娴", + nClass = 8, + nIcon = 2139, + nTime = 21, + }, + }, + }, + [8] = { + dwID = 13928, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "涓寮徛疯鑸", + }, + [9] = { + dwID = 15084, + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + szName = "涓寮忚畩路瑕嗚垷(绌块)", + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14114, + nLevel = 2, + tCountdown = { + { + szName = "鐭ュ績鐏", + nClass = 8, + nIcon = 327, + nTime = 6, + }, + }, + }, + [10] = { + szName = "浜屽紡路鐧绘〒", + dwID = 13933, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "琛岃垷", + nTime = "13,琛岃垷;26,琛岃垷;39,琛岃垷;", + }, + { + nIcon = 2589, + key = "浜屽紡路鐧绘〒", + nTime = 48, + szName = "浜屽紡路鐧绘〒", + nClass = 8, + }, + }, + }, + [3] = { + nLevel = 3, + szName = "鍒嗗窛鎵嬄锋帓娴(绌块)", + [9] = { + bCenterAlarm = true, + }, + dwID = 15080, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 13913, + nLevel = 2, + }, + [12] = { + tCountdown = { + { + nFrame = 8, + nTime = 34, + szName = "绾", + nClass = 8, + nIcon = 3404, + }, + { + nIcon = 2589, + nClass = 8, + nTime = "12,琛岃垷;20,琛岃垷;28,琛岃垷;", + }, + { + szName = "涓冨紡路韪忔瓕", + nClass = 8, + nIcon = 2589, + nTime = 43, + }, + }, + [8] = { + bFullScreen = true, + bScreenHead = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + szName = "涓冨紡路韪忔瓕", + nLevel = 2, + }, + [11] = { + nLevel = 2, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + tCountdown = { + { + nIcon = 2589, + key = "鏄犳棩", + nTime = 28, + szName = "鏄犳棩", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "鍥涘紡路鏄犳棩", + }, + }, + [204] = { + { + dwID = 13775, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "DPS鍋滄墜", + nTime = "15,DPS鍋滄墜;80,DPS鍋滄墜;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "榛戦ⅷ鐮村博鏂", + nTime = "48,榛戦ⅷ鐮村博鏂;112,榛戦ⅷ鐮村博鏂;", + nRefresh = 130, + nClass = 8, + }, + { + nIcon = 13, + key = "姝i潰AOE", + nTime = "35,姝i潰AOE;68,姝i潰AOE;99,姝i潰AOE;136,姝i潰AOE;", + nRefresh = 130, + nClass = 8, + }, + }, + }, + { + nIcon = 13, + nLevel = 1, + szName = "鍙嶆搳", + [9] = { + bBigFontAlarm = true, + bTeamChannel = true, + }, + szNote = "杓稿嚭杓稿嚭杓稿嚭杓稿嚭", + dwID = 13808, + }, + { + nLevel = 1, + dwID = 13777, + }, + }, + [236] = { + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nClass = 8, + szName = "杩介瓊鍔嶆埃", + nIcon = 3443, + nTime = 40, + }, + { + nClass = 8, + nIcon = 2589, + nTime = "32,娉;70,閫f柆;", + }, + }, + dwID = 14050, + nLevel = 1, + }, + { + tCountdown = { + { + nClass = 9, + key = "榫嶅湒鐐搳", + nTime = 55, + szName = "榫嶅湒鐐搳", + nRefresh = 30, + nFrame = 8, + nIcon = 3293, + }, + { + nIcon = 3293, + key = "鐐搳", + nTime = "9,绗簩娆$偖鎿;14,绗笁娆$偖鎿;19,绗洓娆$偖鎿;", + nRefresh = 30, + nClass = 9, + }, + }, + nLevel = 3, + dwID = 14278, + }, + [4] = { + nLevel = 1, + dwID = 14092, + }, + [8] = { + nLevel = 2, + szName = "鏂祦鍔嵚疯惤", + dwID = 14126, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 12, + szName = "鍗婃湀", + nRefresh = 7, + nClass = 9, + }, + }, + }, + [16] = { + nLevel = 1, + [9] = { + bCenterAlarm = true, + }, + dwID = 14268, + }, + [17] = { + nLevel = 1, + nIcon = 13, + szName = "鐩剧墝鍙嶉渿", + tCountdown = { + { + nClass = 9, + szName = "鐩剧墝鍙嶉渿", + nIcon = 2589, + nTime = 10, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14540, + }, + [9] = { + nLevel = 1, + szName = "鏂祦鍔嵚锋粎", + [9] = { + bBigFontAlarm = true, + }, + dwID = 14131, + }, + [18] = { + szName = "绱噾缂铰烽幃", + dwID = 13949, + tCountdown = { + { + nIcon = 2123, + key = "绱噾缂", + nTime = 86, + szName = "绱噾缂铰烽幃", + nClass = 8, + }, + }, + nLevel = 1, + }, + [5] = { + nLevel = 1, + dwID = 14055, + }, + [10] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14228, + }, + [20] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 4, + szNote = "韬查枊BOSS闈㈠悜锛", + dwID = 14026, + }, + [21] = { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14420, + }, + [11] = { + dwID = 14259, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "5,涓榧撲綔姘;15,鍙櫍;", + }, + { + nClass = 9, + szName = "鏀绘搳濮挎厠绲愭潫", + nIcon = 2589, + nTime = 50, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [22] = { + tCountdown = { + { + nIcon = 2133, + nTime = 33, + szName = "浣忕浉", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 80, + szName = "娑呮缍", + nRefresh = 45, + nClass = 9, + }, + { + nIcon = 13, + key = "绱噾缂", + nTime = 0, + szName = "绱噾缂铰烽幃", + nClass = 9, + }, + }, + dwID = 14113, + nLevel = 2, + }, + [3] = { + dwID = 14052, + nLevel = 1, + }, + [6] = { + nLevel = 1, + bMonTarget = true, + szName = "鏂祦鍔嵚峰崐鏈", + dwID = 14124, + }, + [12] = { + dwID = 14265, + tCountdown = { + { + nClass = 9, + nIcon = 2589, + nTime = "6,涓榧撲綔姘;18,鐩剧墝鍙嶉渿;", + }, + { + nClass = 9, + szName = "姝ユ绶婇", + nIcon = 2133, + nTime = 12, + }, + { + nClass = 9, + szName = "闃茬Ζ濮挎厠绲愭潫", + nIcon = 2589, + nTime = 66, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [24] = { + dwID = 14771, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰収", + }, + [25] = { + dwID = 14770, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "鍔嶅櫒鑸灺峰", + }, + [13] = { + nLevel = 1, + [9] = { + bBigFontAlarm = true, + }, + dwID = 14264, + }, + [26] = { + dwID = 14933, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [7] = { + nLevel = 2, + bMonTarget = true, + szName = "鏂祦鍔嵚风牬", + dwID = 14125, + }, + [14] = { + szName = "鐒″爡涓嶆懅涓", + dwID = 14262, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [27] = { + dwID = 14932, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 4, + }, + [23] = { + nLevel = 1, + dwID = 14112, + }, + [19] = { + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 87, + szName = "涓夌挵閷潠", + nClass = 9, + }, + }, + dwID = 14024, + nLevel = 2, + }, + [15] = { + szName = "鐒″爡涓嶆懅浜", + dwID = 14263, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 16, + }, + }, + [205] = { + [6] = { + nLevel = 4, + dwID = 9454, + szName = "鏂烽", + szNote = "鈽呴仩闆10灏衡槄閬犻洟10灏衡槄", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 8, + szName = "鍒嗙瓔", + nClass = 9, + nFrame = 2, + }, + }, + }, + [2] = { + [8] = { + bScreenHead = true, + }, + dwID = 9376, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [3] = { + nLevel = 3, + szName = "铏庡槸", + dwID = 9453, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "婧栧倷鎺掔伀", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 82, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + }, + [1] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鐏緧姗熼浄", + nTime = 22, + szName = "鐏緧姗熼浄", + nClass = 8, + }, + { + nIcon = 13, + nTime = 65, + szName = "鎽у煄涓鎿", + nRefresh = 5, + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 13, + key = "榛戞补鍦", + nTime = 30, + szName = "榛戞补鍦", + nClass = 8, + }, + [3] = { + nClass = 8, + key = "杩芥搳鐏緧", + nTime = 11, + szName = "杩芥搳鐏緧", + nIcon = 13, + }, + }, + dwID = 9269, + }, + [4] = { + nLevel = 2, + tCountdown = { + { + nIcon = 13, + key = "铏庡槸锛堢┛閫忥級", + nTime = 11, + szName = "铏庡槸锛堢┛閫忥級", + nRefresh = 10, + nClass = 9, + nFrame = 8, + }, + }, + dwID = 9461, + }, + [5] = { + nLevel = 1, + dwID = 13788, + szName = "鍒嗙瓔", + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 10, + szName = "椋涙枾姘e牬", + nRefresh = 10, + nClass = 9, + }, + }, + }, + }, + [237] = { + { + [8] = { + bScreenHead = true, + }, + nLevel = 1, + dwID = 14200, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "婧栧倷QTE", + nTime = 43, + szName = "婧栧倷QTE", + nClass = 8, + }, + { + nIcon = 2589, + key = "鍝佺鏇", + nTime = 80, + szName = "鍝佺鏇", + nClass = 8, + nFrame = 8, + }, + [4] = { + nIcon = 2589, + nRefresh = 165, + nClass = 8, + nTime = "158,骞婚瓟鍟忓績鏇;322,骞婚瓟鍟忓績鏇;", + }, + [3] = { + nIcon = 3437, + nTime = "120,闊崇簭;278,闊崇簭;318,闊崇簭;", + nRefresh = 165, + nClass = 8, + nFrame = 8, + }, + }, + dwID = 14586, + nLevel = 1, + }, + [4] = { + dwID = 14147, + nLevel = 1, + tCountdown = { + { + szName = "鍒嗗窛鎵嬄锋帓娴", + nClass = 8, + nIcon = 2139, + nTime = 24, + }, + }, + }, + [8] = { + nLevel = 4, + [9] = { + bBigFontAlarm = true, + }, + dwID = 15271, + }, + [16] = { + szName = "鍏紡路鏈堟睜", + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13959, + }, + [17] = { + [8] = { + bScreenHead = true, + }, + nLevel = 4, + dwID = 13935, + tCountdown = { + { + nClass = 8, + szName = "婵佹按鑺遍枊", + nIcon = 2589, + nTime = 12, + }, + }, + }, + [9] = { + dwID = 13885, + [9] = { + bCenterAlarm = true, + }, + nLevel = 2, + }, + [5] = { + [8] = { + bCenterAlarm = true, + }, + dwID = 14114, + nLevel = 2, + tCountdown = { + { + szName = "鐭ュ績鐏", + nClass = 8, + nIcon = 327, + nTime = 6, + }, + }, + }, + [10] = { + dwID = 13928, + nLevel = 2, + [9] = { + bCenterAlarm = true, + }, + szName = "涓寮徛疯鑸", + }, + [11] = { + dwID = 15084, + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + szName = "涓寮忚畩路瑕嗚垷(绌块)", + }, + [3] = { + nLevel = 3, + szName = "鍒嗗窛鎵嬄锋帓娴(绌块)", + [9] = { + bCenterAlarm = true, + }, + dwID = 15080, + }, + [6] = { + [8] = { + bScreenHead = true, + }, + dwID = 13913, + nLevel = 2, + }, + [12] = { + szName = "浜屽紡路鐧绘〒", + dwID = 13933, + nLevel = 1, + tCountdown = { + { + nIcon = 2589, + nClass = 8, + key = "琛岃垷", + nTime = "13,琛岃垷;26,琛岃垷;39,琛岃垷;", + }, + { + nIcon = 2589, + key = "浜屽紡路鐧绘〒", + nTime = 48, + szName = "浜屽紡路鐧绘〒", + nClass = 8, + }, + }, + }, + [13] = { + nLevel = 2, + col = { + 255, + 255, + 255, + }, + dwID = 13941, + tCountdown = { + { + nIcon = 2589, + nTime = 36, + szName = "鏄犳棩", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 2589, + nTime = 14, + szName = "闇ф暎(鍊掕▓鏅傜祼鏉熶簩娈佃烦)", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szName = "鍥涘紡路鏄犳棩", + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 8, + szName = "杈帀鎺", + nRefresh = 5, + nClass = 9, + }, + }, + szName = "杈帀鎺", + dwID = 13903, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 6, + }, + [14] = { + nLevel = 4, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 238, + }, + dwID = 13942, + szName = "浜斿紡路闇ф暎", + }, + [15] = { + tCountdown = { + { + nFrame = 8, + nTime = 34, + szName = "绾", + nClass = 8, + nIcon = 3404, + }, + { + nIcon = 2589, + nClass = 8, + nTime = "12,琛岃垷;20,琛岃垷;28,琛岃垷;", + }, + { + szName = "涓冨紡路韪忔瓕", + nClass = 8, + nIcon = 2589, + nTime = 43, + }, + }, + [8] = { + bFullScreen = true, + bScreenHead = true, + }, + col = { + 255, + 2, + 2, + }, + dwID = 13961, + szName = "涓冨紡路韪忔瓕", + nLevel = 2, + }, + }, + [206] = { + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + key = "鏂锋氮鏂(娴佽)", + nTime = 21, + szName = "鏂锋氮鏂(娴佽)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9393, + }, + { + [8] = { + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 13, + key = "鍓佸北鍔(鐮寸敳)", + nTime = 21, + szName = "鍓佸北鍔(鐮寸敳)", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 9392, + }, + [4] = { + nLevel = 1, + [8] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 0, + 255, + }, + dwID = 9371, + szNote = "鈽呰翰閬挎柗娴埃鍕佲槄閬犻洟鈽", + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "鑳介噺杓稿叆", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10335, + }, + [16] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "绂佹柗", + nTime = 24, + szName = "绂佹柗", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + key = "鏂烽暦鐢", + nTime = 49, + szName = "鏂烽暦鐢", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 13210, + }, + [17] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 13240, + }, + [9] = { + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 6, + szName = "鑱栫伀鐒氬煄", + dwID = 10337, + }, + [18] = { + dwID = 13351, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [5] = { + nLevel = 2, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 31, + 31, + }, + dwID = 9355, + szNote = "鈽呭揩鎵撴柗鈽呭揩鎵撴柗鈽", + }, + [10] = { + [8] = { + bScreenHead = true, + }, + dwID = 10340, + nLevel = 3, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3443, + nTime = 12, + szName = "鐜勫啺涓鎸", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 10352, + }, + [3] = { + dwID = 9370, + tCountdown = { + { + nClass = 9, + key = "鎭愭嚰debuff", + nTime = 21, + szName = "鎭愭嚰debuff", + nFrame = 8, + nIcon = 13, + }, + }, + nLevel = 2, + }, + [6] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 255, + 0, + 0, + }, + dwID = 10399, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + szNote = "鈽呮敞鎰忚翰閬库槄", + dwID = 10347, + }, + [13] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + col = { + 255, + 128, + 0, + }, + dwID = 13254, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "鍜屽鸡绺界珷锛堢┛閫忥級", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [7] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + col = { + 0, + 255, + 255, + }, + dwID = 10398, + tCountdown = { + { + nIcon = 13, + nTime = 9, + szName = "鐛荤キdebuff", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 8, + nTime = "20,涓嬩竴娆″喎(璧)闆;", + }, + }, + }, + [14] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + key = "鐏岃鎺", + nTime = 21, + szName = "鐏岃鎺", + nFrame = 8, + nClass = 8, + }, + { + nClass = 8, + szName = "鍥為緧鎺", + nIcon = 13, + nTime = 34, + }, + }, + dwID = 13197, + }, + [15] = { + [8] = { + bScreenHead = true, + }, + nLevel = 2, + dwID = 13249, + }, + }, + [175] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 65, + szName = "婧栧倷QTE", + nRefresh = 10, + nClass = 9, + }, + }, + bCheckLevel = true, + dwID = 8466, + szName = "浠ょ嫄鍌稱TE", + [9] = { + bBigFontAlarm = true, + }, + nIcon = 332, + }, + }, + [178] = { + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 74, + szName = "鍒嗛", + nRefresh = 10, + nClass = 9, + }, + }, + dwID = 8657, + }, + { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 70, + szName = "鍗冨北槌ラ炒", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8658, + }, + [4] = { + dwID = 8903, + nLevel = 1, + }, + [8] = { + dwID = 8745, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [16] = { + dwID = 8072, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [17] = { + dwID = 9026, + nLevel = 1, + }, + [9] = { + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + szNote = "娉ㄦ剰韬查伩锛", + dwID = 8730, + }, + [18] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 13, + szName = "骞藉啣姘e媮", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 9147, + }, + [5] = { + dwID = 8757, + [9] = { + bBigFontAlarm = true, + }, + nLevel = 1, + }, + [10] = { + dwID = 8716, + nLevel = 1, + }, + [20] = { + nLevel = 2, + bCheckLevel = true, + dwID = 8082, + szName = "骞藉啣绌块", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "涓嬩竴娆″菇鍐ラ洐鍒", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [21] = { + nLevel = 2, + szName = "骞藉啣鐙傛毚", + dwID = 8083, + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 17, + szName = "涓嬩竴娆″菇鍐ラ洐鍒", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [11] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8717, + }, + [22] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + szNote = "鎵撴柗鐒″悕涔嬪奖璁姊濓紒锛侊紒锛", + dwID = 8907, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 33, + szName = "閫愰ⅷ椋涢洩鏂", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8664, + }, + [6] = { + dwID = 8845, + nLevel = 1, + }, + [12] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 8739, + }, + [13] = { + dwID = 8724, + nLevel = 1, + }, + [7] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 21, + szName = "璨嫾鍣棩", + nRefresh = 20, + nClass = 9, + }, + }, + [9] = { + bBigFontAlarm = true, + }, + dwID = 8744, + }, + [14] = { + dwID = 8725, + nLevel = 1, + }, + [19] = { + nLevel = 1, + bCheckLevel = true, + dwID = 8082, + szName = "骞藉啣闆欏垉", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 14, + szName = "骞藉啣闆欏垉(绌块)", + nRefresh = 10, + nClass = 9, + }, + }, + }, + [15] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 50, + szName = "闄伴櫧鏄撹綁", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8891, + }, + }, + [176] = { + [13] = { + dwID = 8311, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 1, + }, + [7] = { + [8] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 20, + szName = "灏忕嫾鍑虹従", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 70, + szName = "鐙间箣鎬", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8127, + }, + [1] = { + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "闆插嵎鐓", + nRefresh = 10, + nClass = 8, + }, + }, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8176, + szName = "闆茬厵鎹", + nRelScrutinyType = 3, + nLevel = 2, + }, + [2] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 49, + szName = "涓嬩竴娆TE", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8204, + }, + [4] = { + nLevel = 2, + [8] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + bCheckLevel = true, + dwID = 8129, + tCountdown = { + { + nIcon = 13, + nRefresh = 55, + nClass = 8, + nTime = "25,钘忛洟绮惧け;60,涓嬩竴娆¤棌闆㈢簿澶;", + }, + }, + }, + [8] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "绌洪f巩妯欒鍦", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8003, + }, + [15] = { + dwID = 8295, + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nLevel = 2, + }, + [9] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "浜﹀够浜︾湡", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nRefresh = 90, + nClass = 8, + nTime = "95,榛戦綊鎶樼(;", + }, + }, + dwID = 8194, + }, + [5] = { + tCountdown = { + { + nIcon = 13, + nTime = 45, + szName = "楱庡叺琛濋嫆", + nRefresh = 10, + nClass = 8, + }, + { + nIcon = 13, + nTime = 60, + szName = "鎾煎渤", + nRefresh = 10, + nClass = 8, + }, + }, + nLevel = 1, + dwID = 8450, + bCheckLevel = true, + }, + [10] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 150, + szName = "銆愪护鐙愬偡銆戠伀绠洦", + nRefresh = 10, + nClass = 9, + }, + { + nIcon = 13, + nRefresh = 7, + nClass = 9, + nTime = "90,銆愯槆鏇艰帋銆戠伀绠洦;", + }, + }, + dwID = 8440, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 40, + szName = "绌垮績鍔", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8331, + }, + [11] = { + nLevel = 1, + [8] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + bCheckLevel = true, + dwID = 8278, + szNote = "琚敞瑕栬呬繚鎸8-15灏", + }, + [6] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 19, + szName = "鏀彺", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 8380, + }, + [12] = { + nLevel = 1, + szNote = "鈽呴﹨鏁b槄椹呮暎鈽", + [9] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 8226, + }, + [14] = { + nLevel = 2, + nIcon = 332, + bCheckLevel = true, + dwID = 8466, + szName = "浠ょ嫄鍌稱TE::25", + [9] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 90, + szName = "浠ょ嫄鍌稱TE", + nRefresh = 10, + nClass = 9, + }, + }, + }, + }, + [200] = { + { + dwID = 13897, + [9] = { + bCenterAlarm = true, + bBigFontAlarm = true, + }, + nLevel = 1, + }, + { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 2, + dwID = 13891, + }, + }, + [228] = { + { + nLevel = 2, + [9] = { + bBigFontAlarm = true, + }, + dwID = 13796, + }, + }, + [72] = { + [6] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 18, + szName = "鐥涜鎸", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2094, + }, + [2] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 14, + szName = "閫愯摦鍗囪彲", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2777, + }, + [3] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 4, + dwID = 2124, + }, + [1] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 24, + szName = "鎱熷摥闇滆惤琛", + nRefresh = 10, + nClass = 9, + }, + }, + [9] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + dwID = 3080, + }, + [4] = { + [8] = { + bCenterAlarm = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 15, + szName = "鐮村妽鍏垁", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2118, + }, + [5] = { + [8] = { + bCenterAlarm = true, + bFullScreen = true, + }, + nLevel = 4, + tCountdown = { + { + nIcon = 13, + nTime = 37, + szName = "闇囧湴椤〉閷", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 2809, + }, + }, + [-1] = { + [4] = { + tKungFu = { + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + ["SKILL#10002"] = true, + }, + nScrutinyType = 2, + dwID = 411, + [9] = { + bCenterAlarm = true, + }, + nLevel = 6, + }, + [13] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13954, + tCountdown = { + { + nClass = 9, + szName = "闁嬪閲i瓪", + nIcon = 2672, + nTime = 25, + }, + }, + }, + [7] = { + nLevel = 4, + bMonTarget = true, + dwID = 551, + [9] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + nScrutinyType = 2, + }, + [1] = { + nLevel = 1, + nScrutinyType = 2, + dwID = 2220, + [9] = { + bCenterAlarm = true, + bTeamChannel = true, + }, + bMonTarget = true, + }, + [2] = { + dwID = 3985, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [15] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13953, + tCountdown = { + { + nClass = 9, + szName = "闁嬪閲i瓪", + nIcon = 2672, + nTime = 25, + }, + }, + }, + [8] = { + [8] = { + bScreenHead = true, + }, + dwID = 7381, + nLevel = 1, + }, + [16] = { + nLevel = 24, + szName = "闆腑琛", + nIcon = 4519, + dwID = 6135, + }, + [9] = { + tCountdown = { + { + nClass = 8, + szName = "婧栧倷闋樺彇楂樼礆绯栨灉", + nIcon = 13, + nTime = 121, + }, + }, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + szName = "楂樼礆绯栨灉鏀炬潗鏂", + col = { + 182, + 0, + 255, + }, + nLevel = 1, + dwID = 13910, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + dwID = 371, + }, + [10] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + szName = "蹇揩闋樺彇楂樼礆绯栨灉", + tCountdown = { + { + nClass = 8, + szName = "涓嬩竴娆¤=浣滈珮绱氱硸鏋", + nIcon = 13, + nTime = 60, + }, + }, + col = { + 182, + 0, + 255, + }, + dwID = 13912, + }, + [3] = { + dwID = 252, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 3, + }, + [11] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 13876, + szName = "鏀炬潗鏂", + }, + [6] = { + dwID = 2235, + nScrutinyType = 2, + [9] = { + bCenterAlarm = true, + }, + nLevel = 1, + }, + [12] = { + nLevel = 1, + [8] = { + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 13879, + szName = "闋樺彇", + }, + [14] = { + nLevel = 1, + nScrutinyType = 1, + dwID = 13952, + tCountdown = { + { + nClass = 9, + szName = "闁嬪閲i瓪", + nIcon = 2672, + nTime = 25, + }, + }, + }, + }, + [171] = { + [6] = { + [8] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 30, + szName = "楠ㄧ墷", + nRefresh = 10, + nClass = 8, + }, + }, + dwID = 5458, + }, + [2] = { + nLevel = 2, + nIcon = 3441, + dwID = 5467, + }, + [3] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 22, + szName = "瀛ら泚鍞", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 3432, + dwID = 6246, + }, + [1] = { + nIcon = 3430, + [8] = { + bTeamChannel = true, + }, + dwID = 6245, + tCountdown = { + { + nIcon = 13, + nTime = 16, + szName = "瑁傞洸妲", + nRefresh = 10, + nClass = 8, + }, + }, + szNote = "璜嬪嬁鍦˙OSS姝i潰锛", + nLevel = 1, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 13, + nTime = 48, + szName = "涓嬩竴娆¢粸鍚", + nRefresh = 10, + nClass = 9, + }, + }, + nIcon = 3412, + dwID = 5469, + }, + [5] = { + nLevel = 1, + [8] = { + bTeamChannel = true, + }, + dwID = 5459, + szNote = "娉ㄦ剰韬查伩锛", + tCountdown = { + { + nIcon = 13, + nTime = 47, + szName = "鎿查寴", + nRefresh = 10, + nClass = 8, + }, + }, + }, + [7] = { + [8] = { + bBigFontAlarm = true, + }, + nLevel = 1, + dwID = 5346, + }, + }, + }, + CIRCLE = { + [122] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50823, + szNote = "鍞愰杸浜嬩欢", + }, + }, + [134] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐑忚挋璨", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + key = "闇哥帇铔", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 40, + bEnable = true, + }, + }, + key = "姣掕泧鍦栭ò", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐪奸彙铔囨瘨闇", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "闆风悆", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍗冪瀛惵烽浄鐞", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "璨煎湴闆绘祦", + bDrawName = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "闆风路璨煎湴闆绘祦", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绁緧娼個鍎", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "鐐綀", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "闆风路鐐綀", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 12, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "鐓夎泧", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "钀瘨濂旈ò", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "闄稿皨", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍗椾箣闆风", + bEnable = true, + }, + }, + [136] = { + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "姹幗", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮鏆楄", + bEnable = true, + }, + [1] = { + dwType = 3, + key = "闇归潅鍫傜伀鍣ㄥ斧", + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮寮撶鎵", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮閲嶅缉", + bEnable = true, + }, + }, + [138] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4.5, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "闇归潅鍫傜伀鍣ㄥ斧", + bDrawName = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮鏆楄", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "姹幗", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮寮撶鎵", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮閲嶅缉", + bEnable = true, + }, + }, + [140] = { + [7] = { + dwType = 3, + key = "娈电帀", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "3-涓矕鍔(榛)", + bEnable = true, + }, + [1] = { + dwType = 3, + bWhisperChat = false, + key = "榫嶈薄姘e媮", + bTarget = true, + bDrawLineSelf = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [2] = { + dwType = 3, + key = "钑矙", + bTarget = true, + bScreenHead = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "娈靛剦榄", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "6-灏戞兢鍔(绱)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "娈甸ⅷ鑽", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "2-鍟嗛櫧鍔(姗)", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "娈垫案瀹", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "1-灏戝晢鍔(绱)", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "娈甸潏", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "5-灏戞矕鍔(钘)", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "娉板磭鍌", + bTarget = true, + bEnable = true, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 0, + }, + bBorder = false, + nAngle = 80, + bEnable = false, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [6] = { + dwType = 3, + key = "娈靛钩鍗", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "4-闂滄矕鍔(缍)", + bEnable = true, + }, + }, + [148] = { + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏈ㄤ汉", + bEnable = true, + }, + }, + [-9] = { + [27] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "鐢锋挒", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48406, + }, + [38] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 51938, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "鏂祦鍔嵚疯惤", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "鏂祦鍔嵚疯仛", + }, + [6] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鐮存暤", + bDrawName = false, + }, + [7] = { + dwType = 5, + key = "澶╅潚鐭崇う", + bDoodadLine = true, + }, + [8] = { + dwType = 5, + key = "鐓欓洦鐭崇う", + bDoodadLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48545, + szNote = "鏂祦鍔嵚风牬", + }, + [12] = { + dwType = 5, + bDoodadLine = true, + key = "鐜夎櫅鍐板:", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "灏忔サ路鐜夎櫅鍐板:", + bEnable = true, + }, + [14] = { + dwType = 5, + bDoodadLine = true, + key = "鐒¢噺鍐版櫠", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "灏忔サ路鐒¢噺鍐版櫠", + bEnable = true, + }, + [16] = { + dwType = 5, + bDoodadLine = true, + key = "钀介洩鍐拌姳", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "灏忔サ路钀介洩鍐拌姳", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "娑呮缍", + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [28] = { + dwType = 3, + key = "鍔嶆埃鏃嬬", + bTarget = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bScreenHead = false, + }, + [32] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51344, + szNote = "钀睙榻婂枒", + }, + [40] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 255, + 255, + 255, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + szNote = "鍐伴湝鍦伴潰", + }, + [48] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [33] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + key = 51342, + szNote = "闇囨灄纰庡北", + }, + [41] = { + dwType = 5, + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 0, + }, + nAngle = 55, + bBorder = true, + bEnable = true, + }, + }, + key = 6074, + szNote = "闇囨灄纰庡北", + }, + [49] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + szNote = "鍐介湝", + }, + [17] = { + dwType = 3, + key = 63781, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "娑呮缍", + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "鐢锋挒", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [29] = { + dwType = 5, + key = "鐧芥湪", + }, + [34] = { + dwType = 5, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + nAngle = 40, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [42] = { + dwType = 3, + bDrawName = false, + key = "灏忚矒", + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鏂祦鍔嵚风牬", + bDrawName = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [13] = { + dwType = 5, + bDoodadLine = true, + key = "鑿北鍐伴寪", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "灏忔サ路鑿北鍐伴寪", + bEnable = true, + }, + [15] = { + dwType = 5, + bDoodadLine = true, + key = "瀵掓江鍐伴嚌", + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + szNote = "灏忔サ路瀵掓江鍐伴嚌", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "娑呮缍", + }, + [22] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "娑呮缍", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [26] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [30] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍗佷笁濞樻埃鍫", + }, + [36] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = "闄伴櫧涔嬪姏", + }, + [44] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6076, + }, + [35] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + }, + [46] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + }, + [39] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6079, + }, + [43] = { + dwType = 5, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 6075, + szNote = "钀睙榻婂枒", + }, + [37] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 51582, + }, + [45] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + szNote = "鍐介湝", + }, + [31] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51354, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 48418, + }, + [19] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "娑呮缍", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "娑呮缍", + }, + [47] = { + dwType = 5, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 80, + bBorder = true, + bEnable = true, + }, + }, + key = 6078, + }, + }, + [164] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鎺㈤牠鎺㈣叇鐨勮侀紶", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "浜傜珓鐨勮侀紶", + bEnable = true, + }, + [4] = { + dwType = 3, + bEnable = true, + key = "绁嗘暀浣胯", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + bDrawLineSelf = false, + bScreenHead = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "纰ц惤涔嬬値", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "浣曡帢娑", + bEnable = true, + }, + [17] = { + dwType = 3, + bDrawLineSelf = false, + key = "闅ㄦ瀵剁", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [9] = { + dwType = 3, + bScreenHead = true, + key = "鐒″悕", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bWhisperChat = true, + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鏆楁瘝绁徃", + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶈仏", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍑堝湡", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灞嬮爞婕忔礊", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐐埗绁徃", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閲濇布", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "骞叉摼鐐稿綀", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绱呰摦涔嬬伀", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "鐙肩墮楱庡叺", + bEnable = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐞", + bEnable = true, + }, + }, + [176] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閲戣泧鍔嶉ⅷ", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戞殫娌绘剤铏涙摤楂", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + }, + key = "琛濋嫆楱庡叺", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐮撮嚋娌夎垷", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戦綊鍏冧綉", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "鏂风姜鑸炶", + bTarget = true, + bDrawLine = true, + bEnable = true, + }, + [15] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + key = "铇囨浖鑾", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍐伴洦瀵掓伅", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鑵愰", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 27365, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "浠ょ嫄鍌(鍒嗚韩)", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绌洪f巩妯欒鍦", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "鍦伴緧鍔嶅惣", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "鏃嬮ⅷ姝﹀櫒", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "鐩よ泧鍔嶅奖", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [14] = { + dwType = 3, + key = "浠ょ嫄鍌", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 80, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + }, + [178] = { + [15] = { + dwType = 3, + key = "闄f硶路宸", + bDrawName = true, + szNote = "棰(宸)", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "闄f硶路鍧", + bDrawName = true, + szNote = "姘(鍧)", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐒″悕", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "闄f硶路闇", + bDrawName = true, + szNote = "闆(闇)", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绮炬簴鐐彴", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "鍗佷簩鐩嘎烽啘", + bTarget = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 90, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "閱滅墰", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "闄f硶路涔", + bDrawName = true, + szNote = "澶(涔)", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鍦板瓧涓铏", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "闄f硶路鍧", + bDrawName = true, + szNote = "鍦(鍧)", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "鍗佷簩鐩嘎峰崍", + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍗堥Μ", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "闄f硶路鍏", + bDrawName = true, + szNote = "婢(鍏)", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "寮锋搳鐐彴", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "闄f硶路鑹", + bDrawName = true, + szNote = "灞(鑹)", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "鍗佷簩鐩嘎锋垖", + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + szNote = "鎴岀嫍", + bEnable = true, + }, + [12] = { + dwType = 3, + key = "闄f硶路闆", + bDrawName = true, + szNote = "鐏(闆)", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "姣掗磫", + bEnable = true, + }, + }, + [182] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐭抽簰楹", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "楹熺伀", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "鎺㈤洩", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "宓愬妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍒嗚韩鈽呭崈鍒囧瓙", + bEnable = true, + }, + [16] = { + dwType = 3, + key = "鍔嶄繎", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 45, + bEnable = true, + }, + }, + bDrawName = false, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鎴熶繎", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "璋峰妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "璋烽ⅷ鈽呭弽褰", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "浜¤呮埃鎭", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 27698, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏墷鑺遍洦", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "鍐妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍖楅ⅷ鈽呯櫧榫嶅妽璧", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戣壊鑳介噺楂", + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧借壊鑳介噺楂", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "鐧介緧鍔嶉ⅷ", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 30, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍦撳姬鍔", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 153, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 27717, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "浠ょ嫄鍌", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36241, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "浠ょ嫄鍌(鍒嗚韩)", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍦伴緧鍔嶅惣", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "铏涢緧鍔", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "鐩よ泧鍔嶅奖", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [19] = { + dwType = 5, + key = "鍏典繎娈橀鐭冲爢", + tCircles = { + { + nRadius = 3, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = "瀹夌タ灞", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + }, + [184] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "韪忛渾杌", + bEnable = true, + }, + { + dwType = 3, + key = 30507, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "钀界煶", + bEnable = true, + }, + { + dwType = 3, + key = 30398, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 100, + bEnable = true, + }, + }, + szNote = "鐧借捣", + bEnable = true, + }, + }, + [192] = { + [15] = { + dwType = 3, + key = 37043, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "姣掕鍦", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "鐏岃鎺", + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [7] = { + dwType = 3, + key = "闊虫尝鐞", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + key = 37271, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏岃鎺岀祩榛", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "瀹夐洦", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "闄版サ", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路鐞电惗", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 37042, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榄旇鍦", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路绠滅瘜", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "闈堥瓊鑱氬姏", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "鐤鹃ⅷ琛濇搳", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [3] = { + dwType = 3, + key = "闄芥サ", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "婕ぉ闆垶", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "楫鑱氬姏", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "鍙叉濇槑", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "杌嶈硣绠", + bEnable = true, + }, + }, + [198] = { + [13] = { + dwType = 3, + key = 40742, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鎶曠煶杌婅惤榛", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 40714, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐙肩墮鎶曠煶杌", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "杌嶉渶鐗╄硣", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐢板竷鎴", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 40645, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏湀", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "鐙肩墮鏀诲煄闅婇暦", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "鐏緧鎽у煄", + bTarget = false, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 40717, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鏈濇洣闁椋涚煶", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 40584, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鍦", + bEnable = true, + }, + [14] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 40583, + bDrawLine = true, + szNote = "杩芥搳鐏緧榛炲悕鍒ゅ畾", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 40646, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "椋涙枾姘e牬", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "鐙肩墮铏熻鎵", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + dwType = 3, + key = 40585, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鐕冪噿鍦", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "杩芥搳鐏緧", + bScreenHead = true, + dwType = 3, + key = 40587, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [200] = { + [7] = { + dwType = 3, + key = 43935, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鍦", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姘存煴", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 43929, + bDrawName = true, + szNote = "鍦", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 43925, + bDrawName = true, + szNote = "姘", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 43934, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鐏", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 43933, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍姘", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 43924, + bDrawName = true, + szNote = "鏈", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 43932, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鏈", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 43928, + bDrawName = true, + szNote = "鐏", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 43921, + bDrawName = true, + szNote = "閲", + bEnable = true, + }, + [11] = { + dwType = 3, + key = 43931, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍閲", + bEnable = true, + }, + }, + [204] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "妞嶅睄灏", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍒鍏", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍦拌", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 145, + bBorder = true, + bEnable = true, + }, + }, + key = "绉︾", + }, + [4] = { + dwType = 5, + key = "褰堣棩", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = false, + bDrawName = true, + }, + [5] = { + dwType = 3, + key = "澶╀竴椁樺", + bTarget = false, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + }, + }, + [206] = { + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "杌嶈硣绠", + bEnable = true, + }, + { + dwType = 3, + key = "闃跨崹楣", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "鍙挋", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bEnable = true, + }, + [8] = { + dwType = 3, + key = "闄版サ", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闆欑敓鍗斾綔鐞兟烽櫚", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闆欑敓鍗斾綔鐞兟烽櫧", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = false, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "闈堥瓊鑱氬姏", + bEnable = true, + }, + [18] = { + dwType = 3, + key = "鍙叉濇槑", + bTarget = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 15, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = "鏂锋氮姘e媮", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = false, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "楫鑱氬姏", + bEnable = true, + }, + [20] = { + dwType = 3, + key = "璧ょ嫾琛", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + [21] = { + dwType = 3, + key = "鐩茬溂琛濂", + bWhisperChat = false, + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路鐞电惗", + bEnable = true, + }, + [22] = { + dwType = 3, + bDrawLine = true, + key = "榄勮。琛鍍", + bTarget = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bFlash = false, + bEnable = true, + }, + [3] = { + dwType = 3, + key = "鐑忕礌鐖", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "瀹夐洦", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路绠滅瘜", + bEnable = true, + }, + [24] = { + dwType = 3, + key = 42182, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "榄旇鍦", + bEnable = true, + }, + [25] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + bEnable = true, + }, + [13] = { + dwType = 3, + key = "闊虫尝鐞", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [26] = { + dwType = 3, + key = 42190, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鐏岃鎺岀祩", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "42173", + bDrawName = true, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "闄芥サ", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "婕ぉ闆垶", + bEnable = true, + }, + [27] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "琛鐗", + bEnable = true, + }, + [23] = { + dwType = 3, + key = 42183, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "姣掕鍦", + bEnable = true, + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐏岃鎺", + bEnable = true, + }, + [15] = { + dwType = 3, + key = "鐤鹃ⅷ琛濇搳", + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + }, + [212] = { + { + dwType = 3, + key = "闃跨崹楣", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + { + dwType = 3, + key = "鐑忕礌鐖", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "鏂锋氮姘e媮", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路鐞电惗", + bEnable = true, + }, + [16] = { + dwType = 3, + bWhisperChat = false, + key = "鐩茬溂琛濂", + bTarget = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榄勮。琛鍍", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + bFlash = false, + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路绠滅瘜", + bEnable = true, + }, + [18] = { + dwType = 3, + key = 42718, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏岃鎺岀祩榛", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "瀹夐洦", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "闊虫尝鐞", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [20] = { + dwType = 3, + key = 37043, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "姣掕鍦(鐬庡瓙)", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "婕ぉ闆垶", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "鍙挋", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "闄芥サ", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "鐤鹃ⅷ琛濇搳", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "鍙叉濇槑", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "闄版サ", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐏岃鎺", + bEnable = true, + }, + [19] = { + dwType = 3, + key = 42711, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "姣掕鍦", + bEnable = true, + }, + [15] = { + dwType = 3, + key = "璧ょ嫾琛", + bTarget = true, + bDrawLineSelf = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + }, + [214] = { + { + dwType = 3, + key = 45196, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "閲嶇疆", + bDrawName = true, + }, + { + dwType = 3, + key = 45195, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鍔犻", + bDrawName = true, + }, + [4] = { + dwType = 3, + bDrawName = false, + key = "鐒$", + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 9, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "閻樺彅", + }, + }, + [216] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "娴佹皯", + }, + }, + [220] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "灞堢劙闄", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "妫節宓", + }, + [4] = { + dwType = 3, + key = 44544, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鏂祦鍔嵚风牬", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄闅婂壇", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "鏉庣挊", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍏崚闄g溂", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣憭", + }, + [18] = { + dwType = 3, + key = "椋涜姳铦惰垶", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц", + }, + [10] = { + dwType = 3, + bDrawName = false, + key = "涓榧撲綔姘", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bFlash = false, + bScreenHead = true, + }, + [20] = { + dwType = 3, + key = 43124, + bDrawName = true, + szNote = "鐢锋挒", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶇墕", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "浠茶櫅蹇", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 44553, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц闅婂壇", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绱噾缂", + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "娑呮缍", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓夌挵閷潠", + }, + [19] = { + dwType = 3, + key = 43123, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "铇囧崄涓夊", + }, + }, + [222] = { + [7] = { + dwType = 3, + key = 43935, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鍦", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姘存煴", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 43929, + bDrawName = true, + szNote = "鍦", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 43925, + bDrawName = true, + szNote = "姘", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 43934, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鐏", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 43933, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍姘", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 43924, + bDrawName = true, + szNote = "鏈", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 43932, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍鏈", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 43928, + bDrawName = true, + szNote = "鐏", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 43921, + bDrawName = true, + szNote = "閲", + bEnable = true, + }, + [11] = { + dwType = 3, + key = 43931, + bDrawName = true, + tCircles = { + { + nRadius = 1.5, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "寰¢櫍閲", + bEnable = true, + }, + }, + [224] = { + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐪嬭垶", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "宕栧妽", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绠煝", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "楂樺姏澹", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏃嬭綁鍐版櫠", + }, + }, + [228] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 128, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46742, + szNote = "鐜嬭", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鎮熷奖", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闆欓嚌瀹氶櫧", + }, + [4] = { + dwType = 3, + key = 46737, + bDrawName = false, + szNote = "鍔嶇垎-鑱栬", + tCircles = { + { + nRadius = 5.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46741, + szNote = "鑱栬", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46708, + szNote = "鍗冩搳", + }, + [5] = { + dwType = 3, + bDrawName = true, + key = 46721, + szNote = "绛旀锛211-鑱栬", + }, + [3] = { + dwType = 3, + key = 46738, + bDrawName = false, + szNote = "鍔嶇垎-鐜嬭", + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [6] = { + dwType = 3, + bDrawName = true, + key = 46732, + szNote = "绛旀锛121-鐜嬭", + }, + }, + [230] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "鐏", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + key = "鐭ュ績鐏帶鍒", + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹犅峰够", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟闄勯珨", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍙汉", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姣涙瘺", + }, + [5] = { + dwType = 3, + key = "鑾洦", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣櫧", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊崇簭", + }, + [6] = { + dwType = 3, + key = "鐭ュ績鐏", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶆埃鏃嬫甫", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闈掕摦瀛愬妽", + }, + }, + [232] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47435, + szNote = "灞堢劙闄", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "妫節宓", + }, + [4] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鏂祦鍔嵚风牬", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц闅婂壇", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "娑呮缍", + }, + [17] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "娑呮缍", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "娑呮缍", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "鏂祦鍔嵚疯惤", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄闅婂壇", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "鏉庣挊", + }, + [21] = { + dwType = 3, + key = "椋涜姳铦惰垶", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣憭", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍏崚闄g溂", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "鏂祦鍔嵚疯仛", + }, + [12] = { + dwType = 3, + bDrawLine = true, + key = "涓榧撲綔姘", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "鐢锋挒", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "浠茶櫅蹇", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绱噾缂", + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶇墕", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "铇囧崄涓夊", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓夌挵閷潠", + }, + }, + [234] = { + { + dwType = 3, + key = 48269, + bDrawName = false, + szNote = "灞堢劙闄", + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + { + dwType = 3, + key = 48381, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鐐搳", + bDrawName = false, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "妫節宓", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц闅婂壇", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓夌挵閷潠", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48306, + szNote = "娑呮缍", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "铇囧崄涓夊", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48323, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄闅婂壇", + }, + [20] = { + dwType = 3, + key = "椋涜姳铦惰垶", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍏崚闄g溂", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣憭", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶇墕", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48405, + szNote = "鐏湀", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48316, + szNote = "鐮存暤", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓榧撲綔姘", + bTarget = true, + bDrawName = false, + bDrawLine = true, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 48278, + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鐢锋挒", + bDrawName = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "浠茶櫅蹇", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц", + }, + [14] = { + dwType = 3, + key = 48757, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鍗嶅瓧绂", + bDrawName = false, + }, + [23] = { + dwType = 3, + key = 48277, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "鏉庣挊", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绱噾缂", + }, + }, + [236] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48481, + szNote = "灞堢劙闄", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "妫節宓", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48555, + szNote = "鐐搳", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "鏂祦鍔嵚疯仛", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50154, + szNote = "鍗嶅瓧绂", + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48582, + szNote = "娑呮缍", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄闅婂壇", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓夌挵閷潠", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48578, + szNote = "鏂祦鍔嵚风牬鏁", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц闅婂壇", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "铇囧崄涓夊", + }, + [21] = { + dwType = 3, + key = "鏉庣挊", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + bDrawLine = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄", + }, + [22] = { + dwType = 3, + key = "椋涜姳铦惰垶", + bTarget = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [3] = { + dwType = 3, + key = 48658, + tCircles = { + { + nRadius = 3.5, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鐏湀", + bDrawName = false, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48545, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц", + }, + [24] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶇墕", + }, + [25] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48525, + szNote = "濂虫挒", + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 30, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣憭", + }, + [26] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 48526, + szNote = "鐢锋挒", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "鏂祦鍔嵚疯惤", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓榧撲綔姘", + bTarget = true, + bDrawName = false, + bDrawLine = true, + bFlash = false, + bScreenHead = true, + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍏崚闄g溂", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绱噾缂", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 15, + bBorder = true, + bEnable = true, + }, + }, + key = "浠茶櫅蹇", + }, + }, + [60] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏈ㄤ汉", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + }, + [242] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51361, + szNote = "鍐伴潰", + }, + [2] = { + bTarget = true, + bDrawName = false, + szNote = "榫嶅嵎棰", + bEmployer = false, + dwType = 3, + key = 51346, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = false, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51345, + szNote = "姘e牬", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51255, + szNote = "鏄熻惤闆叉暎", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "瀹ぉ锜", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "闆ㄥ崜鎵", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51394, + szNote = "鍐板", + }, + }, + [244] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = 51649, + szNote = "鍐伴潰", + }, + [2] = { + dwType = 3, + key = 51619, + bTarget = true, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "榫嶅嵎棰", + bDrawLine = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51618, + szNote = "姘e牬", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51600, + szNote = "鏄熻惤闆叉暎", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "瀹ぉ锜", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "闆ㄥ崜鎵", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 51665, + szNote = "鍐板", + }, + }, + [131] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏈ㄤ汉", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + }, + [133] = { + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "钀瘨濂旈ò", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "闄稿皨", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍗椾箣闆风", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "璨煎湴闆绘祦", + bDrawName = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "闆风路璨煎湴闆绘祦", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绁緧娼個鍎", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐪奸彙铔囨瘨闇", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "闆风悆", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍗冪瀛惵烽浄鐞", + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 12, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "鐓夎泧", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "鐐綀", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "闆风路鐐綀", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐑忚挋璨", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + key = "闇哥帇铔", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 40, + bEnable = true, + }, + }, + key = "姣掕泧鍦栭ò", + bEnable = true, + }, + }, + [68] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閫愯摦褰", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "琚皝鐨勯噸鍔涚悆", + bEnable = true, + }, + }, + [69] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閫愯摦褰", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "琚皝鐨勯噸鍔涚悆", + bEnable = true, + }, + }, + [70] = { + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "琚皝鐨勯噸鍔涚悆", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "閫愯摦褰", + bEnable = true, + }, + }, + [72] = { + { + dwType = 3, + key = "琛鐜", + bDrawName = true, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "琛鐜", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閫愯摦褰", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "琚皝鐨勯噸鍔涚悆", + bEnable = true, + }, + }, + [73] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "鐗′腹", + bEnable = true, + }, + }, + [147] = { + [6] = { + dwType = 3, + key = "鏄撶垎鐨勬痪鐭", + tCircles = { + { + nRadius = 10, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路婊剧煶", + bEnable = true, + }, + [2] = { + dwType = 3, + key = 18138, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 60, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路闆风", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "鍐板噸", + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路鍐板噸", + bEnable = true, + }, + [1] = { + dwType = 3, + key = 18141, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路鐪熉峰睄缃", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "瑙i櫎鐒℃暤", + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路瑙i櫎鐒℃暤", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 18695, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "瑭︾反路浜旇鏄撳偡", + bEnable = true, + }, + }, + [155] = { + [13] = { + dwType = 3, + key = "鐛勭値娈哄湀", + bTarget = true, + tCircles = { + { + nRadius = 3, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [7] = { + dwType = 3, + key = "娉板磭鍌", + bTarget = true, + bScreenHead = true, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 0, + }, + bBorder = false, + nAngle = 80, + bEnable = false, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [1] = { + dwType = 3, + key = "娈垫案瀹", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "1-灏戝晢鍔(绱)", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "娈甸ⅷ鑽", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "2-鍟嗛櫧鍔(姗)", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "娈靛钩鍗", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "4-闂滄矕鍔(缍)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = 21362, + bDrawName = true, + tCircles = { + { + nRadius = 20, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + szNote = "鏉庡撳垎韬", + bEnable = true, + }, + [9] = { + dwType = 3, + key = 21374, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 0.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "閲戦緧路闋", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "娈甸潏", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "5-灏戞矕鍔(钘)", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "榫嶈薄姘e媮", + bWhisperChat = false, + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 255, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bDrawLineSelf = false, + bEnable = true, + }, + [14] = { + dwType = 3, + key = "钑矙", + bTarget = true, + bEnable = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [3] = { + dwType = 3, + key = "娈电帀", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "3-涓矕鍔(榛)", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "娈靛剦榄", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "6-灏戞兢鍔(绱)", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 40, + 140, + 218, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏁e皠寮╂墜", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "瀹环绁炲皠鎵", + bEnable = true, + }, + }, + [165] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐞", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 5, + bEnable = true, + }, + }, + key = "鐙肩墮楱庡叺", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閲濇布", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐐埗绁徃", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "浣曡帢娑", + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闅ㄦ瀵剁", + bTarget = false, + bDrawLineSelf = false, + bDrawName = true, + bDrawLine = false, + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 25, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 2.5, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鏆楁瘝绁徃", + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍑堝湡", + bEnable = true, + }, + [10] = { + dwType = 3, + bScreenHead = true, + key = "绁嗘暀浣胯", + bTarget = true, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + bDrawLineSelf = false, + bDrawLine = true, + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "灞嬮爞婕忔礊", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "骞叉摼鐐稿綀", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "纰ц惤涔嬬値", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "浜傜珓鐨勮侀紶", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鎺㈤牠鎺㈣叇鐨勮侀紶", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绱呰摦涔嬬伀", + bEnable = true, + }, + [14] = { + dwType = 3, + bEnable = true, + key = "鐒″悕", + bTarget = true, + bWhisperChat = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶈仏", + bEnable = true, + }, + }, + [175] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐮撮嚋娌夎垷", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "鏂风姜鑸炶", + bTarget = true, + bDrawLine = true, + bEnable = true, + }, + [1] = { + dwType = 3, + bEnable = true, + bWhisperChat = true, + bTarget = true, + key = "铇囨浖鑾", + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [2] = { + dwType = 3, + key = "浠ょ嫄鍌", + bTarget = true, + bDrawLineSelf = true, + tCircles = { + { + nRadius = 7, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 80, + bEnable = true, + }, + }, + bDrawLine = true, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "鐩よ泧鍔嶅奖", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 3.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戞殫娌绘剤铏涙摤楂", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "鏃嬮ⅷ姝﹀櫒", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = "鍦伴緧鍔嶅惣", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鑵愰", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 30, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + }, + key = "琛濋嫆楱庡叺", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "閲戣泧鍔嶉ⅷ", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍐伴洦瀵掓伅", + bEnable = true, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绌洪f巩妯欒鍦", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戦綊鍏冧綉", + bEnable = true, + }, + }, + [177] = { + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "姣掗磫", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "寮锋搳鐐彴", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "闄f硶路鍧", + bDrawName = true, + szNote = "鍦(鍧)", + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "绮炬簴鐐彴", + bEnable = true, + }, + [2] = { + dwType = 3, + key = "闄f硶路闇", + bDrawName = true, + szNote = "闆(闇)", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "闄f硶路闆", + bDrawName = true, + szNote = "鐏(闆)", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "闄f硶路涔", + bDrawName = true, + szNote = "澶(涔)", + bEnable = true, + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鍦板瓧涓铏", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐒″悕", + bEnable = true, + }, + [5] = { + dwType = 3, + key = "闄f硶路鑹", + bDrawName = true, + szNote = "灞(鑹)", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "鍗佷簩鐩嘎锋垖", + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + szNote = "鎴岀嫍", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "闄f硶路鍧", + bDrawName = true, + szNote = "姘(鍧)", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "鍗佷簩鐩嘎峰崍", + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍗堥Μ", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "闄f硶路鍏", + bDrawName = true, + szNote = "婢(鍏)", + bEnable = true, + }, + [12] = { + dwType = 3, + key = "鍗佷簩鐩嘎烽啘", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 90, + bEnable = true, + }, + }, + szNote = "閱滅墰", + bEnable = true, + }, + [1] = { + dwType = 3, + key = "闄f硶路宸", + bDrawName = true, + szNote = "棰(宸)", + bEnable = true, + }, + }, + [179] = { + { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐙肩墮绁炲皠鎵", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 170, + 65, + 180, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + }, + key = "鐗涗粙骞", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 40, + 140, + 218, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "瀹夊畧蹇", + bEnable = true, + }, + }, + [183] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 110, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐭抽簰楹", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "楹熺伀", + bEnable = true, + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "鎺㈤洩", + bEnable = true, + }, + [8] = { + dwType = 3, + key = "宓愬妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍒嗚韩鈽呭崈鍒囧瓙", + bEnable = true, + }, + [16] = { + dwType = 3, + key = "鍔嶄繎", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 45, + bEnable = true, + }, + }, + bDrawName = false, + bDrawLine = true, + bEnable = true, + }, + [17] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鎴熶繎", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "璋峰妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "璋烽ⅷ鈽呭弽褰", + bEnable = true, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "浜¤呮埃鎭", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 36163, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏墷鑺遍洦", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "鍐妽", + bDrawName = true, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鍖楅ⅷ鈽呯櫧榫嶅妽璧", + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 0, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榛戣壊鑳介噺楂", + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 2, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧借壊鑳介噺楂", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "鐧介緧鍔嶉ⅷ", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 30, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍦撳姬鍔", + bEnable = true, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 153, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + [6] = { + dwType = 3, + key = 36169, + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + szNote = "浠ょ嫄鍌", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36241, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "浠ょ嫄鍌(鍒嗚韩)", + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鍦伴緧鍔嶅惣", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "铏涢緧鍔", + bEnable = true, + }, + [14] = { + dwType = 3, + key = "鐩よ泧鍔嶅奖", + bTarget = false, + bDrawLine = false, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [19] = { + dwType = 5, + key = "鍏典繎娈橀鐭冲爢", + tCircles = { + { + nRadius = 3, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = "瀹夌タ灞", + bTarget = false, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 40, + 140, + 218, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = false, + bEnable = true, + }, + }, + [189] = { + { + dwType = 3, + tCircles = { + { + nRadius = 2.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍦板埡", + }, + }, + [191] = { + [13] = { + dwType = 3, + key = 37384, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鎶曠煶杌婅惤榛", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 37184, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐙肩墮鎶曠煶杌", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "杌嶉渶鐗╄硣", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 15, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐢板竷鎴", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 40646, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "椋涙枾姘e牬", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "鐙肩墮鏀诲煄闅婇暦", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐏緧鎽у煄", + bEnable = true, + }, + [5] = { + dwType = 3, + key = 37206, + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鏈濇洣闁椋涚煶", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 36872, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鍦", + bEnable = true, + }, + [14] = { + bTarget = true, + bDrawName = false, + szNote = "杩芥搳鐏緧榛炲悕鍒ゆ柗", + bScreenHead = true, + dwType = 3, + bWhisperChat = true, + bDrawLine = true, + key = 36871, + bEnable = true, + }, + [3] = { + dwType = 3, + key = 37016, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏湀", + bEnable = true, + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐙肩墮铏熻鎵", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 36873, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鐕冪噿鍦", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "杩芥搳鐏緧", + bScreenHead = true, + dwType = 3, + key = 36875, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [199] = { + { + dwType = 3, + key = "闃跨崹楣", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + { + nRadius = 10, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + { + dwType = 3, + key = "鐑忕礌鐖", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [4] = { + dwType = 3, + key = "鏂锋氮姘e媮", + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 10, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路鐞电惗", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 40963, + tCircles = { + { + nRadius = 3, + col = { + 255, + 99, + 71, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "姣掕鍦", + bEnable = true, + }, + [17] = { + dwType = 3, + key = 40962, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榄旇鍦", + bEnable = true, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐧介櫠路绠滅瘜", + bEnable = true, + }, + [18] = { + dwType = 3, + key = "璧ょ嫾琛", + bTarget = true, + bDrawLineSelf = true, + bDrawLine = true, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + bBorder = true, + nAngle = 120, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 180, + bEnable = true, + }, + }, + key = "瀹夐洦", + bEnable = true, + }, + [10] = { + dwType = 3, + key = "闊虫尝鐞", + tCircles = { + { + nRadius = 30, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "榄勮。琛鍍", + bTarget = true, + bDrawLine = true, + bDrawLineSelf = true, + bFlash = false, + bEnable = true, + }, + [21] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 170, + 65, + 180, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + bEnable = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "婕ぉ闆垶", + bEnable = true, + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "杌嶈硣绠", + bEnable = true, + }, + [3] = { + dwType = 3, + key = "鍙挋", + bTarget = true, + bDrawLine = true, + tCircles = { + { + nRadius = 6, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 75, + bEnable = true, + }, + }, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "闄芥サ", + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [12] = { + dwType = 3, + key = "鐤鹃ⅷ琛濇搳", + tCircles = { + { + nRadius = 30, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 1, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 70, + bEnable = true, + }, + }, + key = "鍙叉濇槑", + bEnable = true, + }, + [7] = { + dwType = 3, + key = "闄版サ", + tCircles = { + { + nRadius = 1, + col = { + 0, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3.5, + col = { + 0, + 255, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 3, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐏岃鎺", + bEnable = true, + }, + [19] = { + dwType = 3, + bWhisperChat = false, + key = "鐩茬溂琛濂", + bTarget = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 128, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLineSelf = true, + bDrawLine = true, + bEnable = true, + }, + [15] = { + dwType = 3, + key = 40970, + tCircles = { + { + nRadius = 1.5, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏岃鎺岀祩", + bEnable = true, + }, + }, + [203] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 0, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绠煝", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐪嬭垶", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏃嬭綁鍐版櫠", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "楂樺姏澹", + }, + }, + [205] = { + [13] = { + dwType = 3, + key = 41903, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鐕冪噿鍦", + bEnable = true, + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐙肩墮鎶曠煶杌", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "杌嶉渶鐗╄硣", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐢板竷鎴", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 41963, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏湀", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "鐙肩墮鏀诲煄闅婇暦", + bEnable = true, + }, + [15] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 41901, + bDrawLine = true, + szNote = "杩芥搳鐏緧榛炲悕鍒ゅ畾", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "鐏緧鎽у煄", + bTarget = false, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 42035, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鏈濇洣闁椋涚煶", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 41902, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鍦", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 41964, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "椋涙枾姘e牬", + bEnable = true, + }, + [11] = { + dwType = 3, + key = "鐏緧姗熼浄", + bTarget = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + bEnable = true, + }, + [6] = { + dwType = 3, + key = "鐙肩墮铏熻鎵", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + bTarget = true, + szNote = "杩芥搳鐏緧", + bScreenHead = true, + dwType = 3, + key = 41905, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + [14] = { + dwType = 3, + key = 42060, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鎶曠煶杌婅惤榛", + bEnable = true, + }, + }, + [209] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46267, + szNote = "鍔嶇垎-鐜嬭", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闆欓嚌瀹氶櫧", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 128, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46345, + szNote = "鍔嶆埃-鐜嬭", + }, + [3] = { + dwType = 3, + key = 45957, + bTarget = false, + bDrawName = true, + szNote = "绛旀锛211-鑱栬", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鎮熷奖", + }, + [4] = { + dwType = 3, + key = 45958, + bDrawName = true, + szNote = "绛旀锛121-鐜嬭", + tCircles = { + { + nRadius = 1, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46266, + szNote = "鍔嶇垎-鑱栬", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 46344, + szNote = "鍔嶆埃-鑱栬", + }, + }, + [211] = { + [13] = { + dwType = 3, + key = 42642, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鎶曠煶杌婅惤榛", + bEnable = true, + }, + [7] = { + dwType = 3, + key = 42553, + tCircles = { + { + nRadius = 2, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐙肩墮鎶曠煶杌", + bEnable = true, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "杌嶉渶鐗╄硣", + bEnable = true, + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 12, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + key = "鐢板竷鎴", + bEnable = true, + }, + [4] = { + dwType = 3, + key = 42484, + bDrawName = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鐏湀", + bEnable = true, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + }, + key = "鐙肩墮鏀诲煄闅婇暦", + bEnable = true, + }, + [9] = { + dwType = 3, + key = "鐏緧鎽у煄", + bTarget = false, + tCircles = { + { + nRadius = 6.5, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bEnable = true, + }, + [5] = { + dwType = 3, + key = 42556, + bDrawName = true, + tCircles = { + { + nRadius = 6, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鏈濇洣闁椋涚煶", + bEnable = true, + }, + [10] = { + dwType = 3, + key = 42423, + tCircles = { + { + nRadius = 5, + col = { + 65, + 50, + 160, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鍦", + bEnable = true, + }, + [14] = { + dwType = 3, + bScreenHead = true, + bWhisperChat = true, + bTarget = true, + key = 36871, + bDrawLine = true, + szNote = "杩芥搳鐏緧榛炲悕鍒ゅ畾", + bEnable = true, + }, + [3] = { + dwType = 3, + key = 42485, + tCircles = { + { + nRadius = 8.5, + col = { + 211, + 229, + 37, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "椋涙枾姘e牬", + bEnable = true, + }, + [6] = { + dwType = 3, + key = "鐙肩墮铏熻鎵", + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawName = false, + bEnable = true, + }, + [12] = { + dwType = 3, + key = 42424, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "榛戞补鐕冪噿鍦", + bEnable = true, + }, + [11] = { + bTarget = true, + szNote = "杩芥搳鐏緧", + bScreenHead = true, + dwType = 3, + key = 36875, + tCircles = { + { + nRadius = 7, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 20, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + bDrawLine = true, + bWhisperChat = true, + bEnable = true, + }, + }, + [217] = { + { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5846, + }, + { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5844, + }, + [4] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5835, + }, + [8] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5833, + }, + [16] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5838, + }, + [17] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5840, + }, + [9] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5847, + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐩滃璩", + }, + [5] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5837, + }, + [10] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5839, + }, + [11] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5841, + }, + [3] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5845, + }, + [6] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5834, + }, + [12] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5848, + }, + [13] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5842, + }, + [7] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5843, + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鎵撳姭鑰", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 50473, + }, + [15] = { + dwType = 5, + tCircles = { + { + nRadius = 2, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 5836, + }, + }, + [-1] = { + { + dwType = 3, + key = "楝肩鐨勭嫾鐗欒粛澹", + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鑼堕え路鐙肩墮杌嶅+", + bEnable = true, + }, + { + dwType = 3, + key = "姊佺瑧鍫", + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鑼堕え路姊佺瑧鍫", + bEnable = true, + }, + [4] = { + dwType = 3, + key = "姗熷阀鏈ㄤ汉", + tCircles = { + { + nRadius = 2, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "缇庝汉鍦柭锋宸ф湪浜", + bEnable = true, + }, + [8] = { + dwType = 5, + key = "闈堝北濡欓洦", + bDrawName = true, + szNote = "宄ㄧ湁鐧借娊", + bEnable = true, + }, + [16] = { + dwType = 3, + key = 36782, + tCircles = { + { + nRadius = 1, + col = { + 170, + 65, + 180, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "7", + bDrawName = true, + }, + [17] = { + dwType = 3, + key = 36781, + bDrawName = true, + szNote = "6", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 5, + key = "闄藉礀闆叉硥", + bDrawName = true, + szNote = "椤ф笟绱瓖", + bEnable = true, + }, + [18] = { + dwType = 3, + key = 20111, + tCircles = { + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "5", + bDrawName = true, + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姘e牬閹北娌", + bEnable = true, + }, + [10] = { + dwType = 5, + key = "缈犵鏈濋湶", + bDrawName = true, + szNote = "浠欏礀鐭宠姳", + bEnable = true, + }, + [20] = { + dwType = 3, + key = 20109, + bDrawName = true, + szNote = "3", + tCircles = { + { + nRadius = 1, + col = { + 40, + 140, + 218, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [21] = { + dwType = 3, + key = 20108, + tCircles = { + { + nRadius = 1, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "2", + bDrawName = true, + }, + [11] = { + dwType = 3, + key = 16170, + bDrawName = false, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "80鑼堕え路姊佺瑧鍫", + bEnable = true, + }, + [22] = { + dwType = 3, + key = 20107, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "1", + bDrawName = true, + }, + [3] = { + dwType = 3, + key = "姹傚姪鐨勬祦姘", + tCircles = { + { + nRadius = 25, + col = { + 0, + 255, + 0, + }, + bBorder = true, + nAngle = 360, + bEnable = true, + }, + }, + szNote = "鑼堕え路姹傚姪鐨勬祦姘", + bEnable = true, + }, + [6] = { + dwType = 5, + key = "鐒¢鐪熸按", + bDrawName = true, + szNote = "瑗垮北鐧介湶", + bEnable = true, + }, + [12] = { + dwType = 3, + key = 23674, + bDrawName = false, + tCircles = { + { + nRadius = 30, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "90鑼堕え路姊佺瑧鍫", + bEnable = true, + }, + [24] = { + dwType = 5, + key = "鐓欓洦鐭崇う", + }, + [25] = { + dwType = 5, + key = "绱槆", + }, + [13] = { + dwType = 3, + key = 36785, + tCircles = { + { + nRadius = 1, + col = { + 121, + 241, + 182, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "10", + bDrawName = true, + }, + [26] = { + dwType = 5, + bDrawName = false, + key = "鐧借", + bDoodadLine = false, + }, + [27] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闄伴櫧涔嬪姏", + bDrawName = true, + }, + [14] = { + dwType = 3, + key = 36784, + bDrawName = true, + szNote = "9", + tCircles = { + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [19] = { + dwType = 3, + key = 20110, + bDrawName = true, + szNote = "4", + tCircles = { + { + nRadius = 1, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [7] = { + dwType = 5, + key = "鏈堥椿浠欐硥", + bDrawName = true, + szNote = "钂欓爞鐭宠姳", + bEnable = true, + }, + [23] = { + dwType = 5, + key = "澶╅潚鐭崇う", + }, + [15] = { + dwType = 3, + key = 36783, + tCircles = { + { + nRadius = 1, + col = { + 211, + 229, + 37, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "8", + bDrawName = true, + }, + }, + [221] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "鐏", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐭ュ績鐏帶鍒", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹犅峰够", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟闄勯珨", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姣涙瘺", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍙汉", + }, + [5] = { + dwType = 3, + key = "鑾洦", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣櫧", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟", + }, + [6] = { + dwType = 3, + key = "鐭ュ績鐏", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闈掕摦瀛愬妽", + }, + }, + [35] = { + { + dwType = 3, + key = "鑺辩噲", + tCircles = { + { + nRadius = 3, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bEnable = true, + }, + { + dwType = 5, + key = "鏈堝奖鑿", + tCircles = { + { + nRadius = 4, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = true, + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 0, + 255, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姘存煴", + bEnable = true, + }, + }, + [225] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "鍒哄鑱舵斂", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 1, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "娈樺織鍏夌悆", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 30, + bBorder = true, + bEnable = true, + }, + }, + key = 46475, + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐒″悕鍔", + }, + }, + [227] = { + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "妞嶅睄灏", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍒鍏", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍦拌", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 145, + bBorder = true, + bEnable = true, + }, + }, + key = "绉︾", + }, + [4] = { + dwType = 5, + key = "褰堣棩", + bDrawName = true, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDoodadLine = false, + }, + [5] = { + dwType = 3, + key = "澶╀竴椁樺", + bTarget = false, + bDrawName = false, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bScreenHead = false, + }, + }, + [229] = { + { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = 46899, + }, + }, + [231] = { + { + dwType = 3, + tCircles = { + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47175, + szNote = "灞堢劙闄", + }, + { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 128, + 0, + }, + nAngle = 120, + bBorder = true, + bEnable = true, + }, + }, + key = "妫節宓", + }, + [4] = { + dwType = 3, + key = 47239, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "鏂祦鍔嵚风牬", + bDrawName = false, + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц闅婂壇", + }, + [16] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 43966, + szNote = "娑呮缍", + }, + [17] = { + dwType = 3, + key = 47276, + bDrawName = false, + szNote = "娑呮缍", + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄", + }, + [18] = { + dwType = 3, + tCircles = { + { + nRadius = 21, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47208, + szNote = "娑呮缍", + }, + [5] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47259, + szNote = "鏂祦鍔嵚疯惤", + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + }, + key = "寮╄闅婂壇", + }, + [20] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = false, + }, + }, + key = "鏉庣挊", + }, + [21] = { + dwType = 3, + key = "椋涜姳铦惰垶", + bTarget = true, + tCircles = { + { + nRadius = 1.5, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + bScreenHead = true, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣憭", + }, + [22] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍏崚闄g溂", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 65, + 50, + 160, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47272, + szNote = "鏂祦鍔嵚峰崐鏈", + }, + [6] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1.5, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = 47269, + szNote = "鏂祦鍔嵚疯仛", + }, + [12] = { + dwType = 3, + bDrawLine = true, + key = "涓榧撲綔姘", + bTarget = true, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = false, + bFlash = false, + bScreenHead = true, + }, + [24] = { + dwType = 3, + key = 47219, + tCircles = { + { + nRadius = 5, + col = { + 255, + 0, + 0, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + szNote = "濂虫挒", + bDrawName = true, + }, + [25] = { + dwType = 3, + key = 47220, + bDrawName = true, + szNote = "鐢锋挒", + tCircles = { + { + nRadius = 5, + col = { + 51, + 0, + 255, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 51, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 50, + bBorder = true, + bEnable = true, + }, + }, + key = "浠茶櫅蹇", + }, + [7] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 65, + 50, + 160, + }, + nAngle = 100, + bBorder = true, + bEnable = true, + }, + }, + key = "鏂ц", + }, + [14] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "绱噾缂", + }, + [23] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 0, + 0, + }, + nAngle = 20, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶇墕", + }, + [19] = { + dwType = 3, + tCircles = { + { + nRadius = 8, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "铇囧崄涓夊", + }, + [15] = { + dwType = 3, + tCircles = { + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "涓夌挵閷潠", + }, + }, + [233] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "鐏", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + key = "鐭ュ績鐏帶鍒", + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹犅峰够", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟闄勯珨", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍙汉", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姣涙瘺", + }, + [5] = { + dwType = 3, + key = "鑾洦", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣櫧", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊崇簭", + }, + [6] = { + dwType = 3, + key = "鐭ュ績鐏", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶆埃鏃嬫甫", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闈掕摦瀛愬妽", + }, + }, + [235] = { + [7] = { + bTarget = true, + bDrawName = true, + szNote = "鐏", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐭ュ績鐏帶鍒", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹犅峰够", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟闄勯珨", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍙汉", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姣涙瘺", + }, + [5] = { + dwType = 3, + key = "鑾洦", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣櫧", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊崇簭", + }, + [6] = { + dwType = 3, + key = "鐭ュ績鐏", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶆埃鏃嬫甫", + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闈掕摦瀛愬妽", + }, + }, + [237] = { + [13] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍔嶆埃鏃嬫甫", + }, + [7] = { + bTarget = true, + bDrawName = true, + szNote = "鐏", + bScreenHead = true, + dwType = 3, + bWhisperChat = false, + bDrawLine = true, + tCircles = { + { + nRadius = 10, + col = { + 0, + 255, + 255, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 3, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鐭ュ績鐏帶鍒", + }, + [1] = { + dwType = 3, + tCircles = { + { + nRadius = 4, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹", + }, + [2] = { + dwType = 3, + tCircles = { + { + nRadius = 16, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + { + nRadius = 28, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊撻潪姹犅峰够", + }, + [4] = { + dwType = 3, + tCircles = { + { + nRadius = 6, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "骞婚瓟闄勯珨", + }, + [8] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 0, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鍙汉", + }, + [9] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "姣涙瘺", + }, + [5] = { + dwType = 3, + key = "鑾洦", + bTarget = true, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 45, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = true, + }, + [10] = { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 255, + 128, + 0, + }, + nAngle = 180, + bBorder = true, + bEnable = true, + }, + { + nRadius = 20, + col = { + 255, + 255, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏉庣櫧", + }, + [3] = { + dwType = 3, + tCircles = { + { + nRadius = 10, + col = { + 255, + 0, + 0, + }, + nAngle = 5, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闊崇簭", + }, + [6] = { + dwType = 3, + key = "鐭ュ績鐏", + bTarget = false, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawLine = false, + bScreenHead = false, + }, + [12] = { + dwType = 3, + key = "闈掕摦鍔嶆埃", + bTarget = true, + tCircles = { + { + nRadius = 20, + col = { + 255, + 0, + 255, + }, + nAngle = 2, + bBorder = true, + bEnable = true, + }, + { + nRadius = 2, + col = { + 255, + 0, + 255, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + bDrawName = true, + bScreenHead = false, + }, + [11] = { + dwType = 3, + tCircles = { + { + nRadius = 5.5, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "闈掕摦瀛愬妽", + }, + }, + [66] = { + { + dwType = 3, + tCircles = { + { + nRadius = 15, + col = { + 211, + 229, + 37, + }, + nAngle = 10, + bBorder = true, + bEnable = true, + }, + { + nRadius = 1, + col = { + 65, + 50, + 160, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "鏈ㄤ汉", + bEnable = true, + }, + { + dwType = 3, + tCircles = { + { + nRadius = 3, + col = { + 255, + 0, + 0, + }, + nAngle = 360, + bBorder = true, + bEnable = true, + }, + }, + key = "钀界煶", + bEnable = true, + }, + }, + [67] = { + { + dwType = 3, + tCircles = { + { + nRadius = 7, + col = { + 65, + 50, + 160, + }, + nAngle = 60, + bBorder = true, + bEnable = true, + }, + }, + key = "鐗′腹", + bEnable = true, + }, + }, + }, + CHAT = {}, + TALK = { + [147] = { + { + tCountdown = { + { + szName = "瑙i櫎鐒℃暤鍓╅鏅傞枔", + nIcon = 340, + nClass = 14, + nTime = 9, + }, + }, + szNote = "鍚歌楝艰В闄ょ劇鏁", + szContent = "鍚歌楝艰В闄や簡鐒℃暤锛屽揩鏀绘搳瀹冦", + [14] = { + bCenterAlarm = true, + }, + }, + }, + [242] = { + { + szContent = "鍥涙暎濂旈冨惂锛", + col = { + 255, + 0, + 203, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "鎱曞缍犵彔", + szNote = "鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒", + }, + { + szContent = "鍌诲濞橈紝浣犵附瑾g疮鎴戝お澶氾紝鎴戝張浣曞槜涓嶇煡浣犱篃鐐烘垜鍚冪洝浜嗚嫤锛熻瑵鐩熶富灏嶆垜鏈夌煡閬囦箣鎭╋紝浣嗘垜鍙堟庤兘鐐轰簡淇犲悕璨犱簡浣犫︹", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "闆ㄥ崜鎵", + szNote = "闇滃嵃闈犺繎锛侊紒韬插啺寰岄潰锛", + }, + { + szContent = "灏忓锛屼綘鎴戝潕鍧峰お澶氾紝涓栦汉涓嶅厑锛屽嵒鍙堝浣曪紵鎴戣嫤绶村収鍔熺偤浣犵簩鍛斤紝鑻ヤ笂澶╀篃涓嶅厑锛屾垜鍊戜究姝ょ敓鍚岀洝锛屽啀绛変締涓栵紒", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "闆ㄥ崜鎵", + szNote = "闇滃嵃闈犺繎锛侊紒韬插啺寰岄潰锛", + }, + }, + [211] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "婧栧倷澶╀笂宸ㄧ煶", + szContent = "閬犺檿鍌充締闄i櫍鐨勮綗槌磋伈锛侊紒锛", + tCountdown = { + { + szName = "婧栧倷澶╀笂宸ㄧ煶", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "绲辩当鍘绘鍚э紒", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐢板竷鎴", + szNote = "铏庡槸", + }, + [4] = { + szContent = "鎶曠煶杌婃敮鎻达紒", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐗涘环鐜", + szNote = "娉ㄦ剰韬查伩鎶曠煶", + }, + [3] = { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "鐙肩墮澶ц粛锛屽叺鑷ㄥ煄涓嬶紝鐐伀閬庤檿锛屽鑽変笉鐢燂紒", + [14] = { + bCenterAlarm = true, + }, + szTarget = "鐢板竷鎴", + szNote = "婧栧倷鎺掔伀", + }, + }, + [212] = { + { + tCountdown = { + { + szName = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + nIcon = 340, + nClass = 14, + nTime = 20, + }, + { + nClass = 14, + nTime = 41, + szName = "鈽嗗洖琛绲愭潫鈽嗕笁姣掑叆楂旀簴鍌", + nIcon = 340, + nFrame = 8, + }, + }, + szContent = "浣犲戞灉鐪熸湁浜涢杸閬撯︹︽澹綍鍦紝淇濊鏈帇閬嬪姛锛", + szNote = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + szTarget = "鍙叉濇槑", + }, + { + tCountdown = { + { + nClass = 14, + key = "姣掕娑屽嫊", + nTime = 30, + szName = "姣掕娑屽嫊", + nIcon = 4504, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "瑾版暍鎺ユ垜涓鎺岋紒", + szNote = "姣掕娑屽嫊", + }, + [4] = { + tCountdown = { + { + szName = "鈽呰仏鐏剼鍩庘槄", + nIcon = 340, + nClass = 14, + nTime = 110, + }, + { + szName = "鈽嗚仏鐏剼鍩庘槅", + nIcon = 340, + nClass = 14, + nTime = 170, + }, + }, + szTarget = "瀹夐洦", + szContent = "鍐拌垏鐏侀櫚鑸囬櫧锛屾槸鐐轰綘绛夌法绻旂殑鐓夌崉涔嬮杸锛", + szNote = "鈽呰仏鐏剼鍩庘槄", + }, + [3] = { + tCountdown = { + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 15, + }, + }, + szContent = "绯熺硶锛岀従鍦ㄧ敤閫欐嫑閭勬槸澶媺寮蜂簡鈥︹", + [14] = { + bFullScreen = true, + }, + szTarget = "鍙叉濇槑", + szNote = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + }, + }, + [244] = { + { + szContent = "鍥涙暎濂旈冨惂锛", + col = { + 255, + 0, + 203, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "鎱曞缍犵彔", + szNote = "鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒鍒嗘暎8灏猴紒", + }, + { + szContent = "鍌诲濞橈紝浣犵附瑾g疮鎴戝お澶氾紝鎴戝張浣曞槜涓嶇煡浣犱篃鐐烘垜鍚冪洝浜嗚嫤锛熻瑵鐩熶富灏嶆垜鏈夌煡閬囦箣鎭╋紝浣嗘垜鍙堟庤兘鐐轰簡淇犲悕璨犱簡浣犫︹", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "闆ㄥ崜鎵", + szNote = "闇滃嵃闈犺繎锛侊紒韬插啺寰岄潰锛", + }, + { + szContent = "灏忓锛屼綘鎴戝潕鍧峰お澶氾紝涓栦汉涓嶅厑锛屽嵒鍙堝浣曪紵鎴戣嫤绶村収鍔熺偤浣犵簩鍛斤紝鑻ヤ笂澶╀篃涓嶅厑锛屾垜鍊戜究姝ょ敓鍚岀洝锛屽啀绛変締涓栵紒", + col = { + 238, + 0, + 255, + }, + [14] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + szTarget = "闆ㄥ崜鎵", + szNote = "闇滃嵃闈犺繎锛侊紒韬插啺寰岄潰锛", + }, + }, + [182] = { + [2] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "璺崇噲鈫戔啈璺崇噲鈫戔啈", + szContent = "鎴伴Μ椤緱鐣板父鐨勭媯韬侊紒", + tCountdown = { + { + szName = "鈽呰烦鐕堢祼鏉熲槄", + nIcon = 340, + nClass = 14, + nTime = 33, + }, + }, + }, + [3] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "浠ょ嫄鍌", + szContent = "浣犲戠殑杓曞姛涓嶉尟鍢涳紝鎺ヤ笅渚嗕綘鍊戞噳瑭插浣曟噳浠樺憿锛", + szNote = "浠ょ嫄鍌烽插叆P2", + }, + [1] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "璺崇噲绲愭潫鈫撯啌钀藉湴鈫撯啌", + szContent = "鎴伴Μ瀹夐潨浜嗕笅渚嗭紒", + tCountdown = { + { + nIcon = 340, + nTime = 32, + szName = "琛濇挒|浜¤呮埃鎭", + nFrame = 8, + nClass = 14, + }, + }, + }, + [4] = { + [14] = { + bFullScreen = true, + }, + szTarget = "鎺㈤洩", + szContent = "浣犲戠殑鍏у績澶亷姹$锛屾帴鍙楃湡鐞嗙殑鍑堝寲鍚э紒", + szNote = "閫插叆P2,鏌卞瓙灏变綅", + }, + [5] = { + tCountdown = { + { + szName = "榄呮儜", + nIcon = 340, + nClass = 14, + nTime = 45, + }, + }, + szTarget = "鎺㈤洩", + szContent = "鐏劙涔嬭垶鐨勭啽鎯咃紝浣犲戞壙鍙楃殑浣忛航?", + szNote = "婧栧倷浜旇壊鑸", + }, + }, + [183] = { + [2] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "璺崇噲鈫戔啈璺崇噲鈫戔啈", + szContent = "鎴伴Μ椤緱鐣板父鐨勭媯韬侊紒", + tCountdown = { + { + szName = "鈽呰烦鐕堢祼鏉熲槄", + nIcon = 340, + nClass = 14, + nTime = 33, + }, + }, + }, + [3] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "浠ょ嫄鍌", + szContent = "浣犲戠殑杓曞姛涓嶉尟鍢涳紝鎺ヤ笅渚嗕綘鍊戞噳瑭插浣曟噳浠樺憿锛", + szNote = "浠ょ嫄鍌烽插叆P2", + }, + [1] = { + [14] = { + bCenterAlarm = true, + }, + szNote = "璺崇噲绲愭潫鈫撯啌钀藉湴鈫撯啌", + szContent = "鎴伴Μ瀹夐潨浜嗕笅渚嗭紒", + tCountdown = { + { + nIcon = 340, + nTime = 32, + szName = "琛濇挒|浜¤呮埃鎭", + nFrame = 8, + nClass = 14, + }, + }, + }, + [4] = { + [14] = { + bFullScreen = true, + }, + szTarget = "鎺㈤洩", + szContent = "浣犲戠殑鍏у績澶亷姹$锛屾帴鍙楃湡鐞嗙殑鍑堝寲鍚э紒", + szNote = "閫插叆P2,鏌卞瓙灏变綅", + }, + [5] = { + tCountdown = { + { + szName = "榄呮儜", + nIcon = 340, + nClass = 14, + nTime = 45, + }, + }, + szTarget = "鎺㈤洩", + szContent = "鐏劙涔嬭垶鐨勭啽鎯咃紝浣犲戞壙鍙楃殑浣忛航?", + szNote = "婧栧倷浜旇壊鑸", + }, + }, + [155] = { + { + tCountdown = { + { + szName = "娈靛畻鍏縺娲", + nIcon = 340, + nClass = 14, + nTime = 120, + }, + { + szName = "娉板磭鍌f縺娲", + nIcon = 340, + nClass = 14, + nTime = 60, + }, + }, + szContent = "鎴戠殑鑳藉姏鏄綘鍊戠劇娉曟兂璞$殑锛", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "娉板磭鍌", + szNote = "娈靛畻鍏縺娲", + }, + { + tCountdown = { + { + nClass = 14, + szName = "鍐版煴", + nIcon = 13, + nTime = 25, + }, + }, + szContent = "瑗垮ぉ鏈夎矾锛屼笖璁撴垜閫佷綘涓绋嬶紒", + [14] = { + bCenterAlarm = true, + }, + szNote = "鍐版煴鍑虹従", + szTarget = "鎽╂彁鑰剁緟", + }, + }, + [220] = { + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "鏉庣挊", + szNote = "7灏哄収鍏у収鍏", + }, + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "铇囧崄涓夊", + szNote = "9灏哄澶栧澶", + }, + { + tCountdown = { + { + nIcon = 13, + key = "鐣跺墠闆嗙伀鈽", + nTime = 0, + szName = "鐣跺墠闆嗙伀鈽", + nClass = 14, + }, + }, + szContent = "鎴戦偅鍏掑瓙涔嬫鏄粬鐨勫懡鏁", + szTarget = "鏉庣挊", + szNote = "娓呯┖鍊掕▓鏅", + }, + }, + [221] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "姣涙瘺", + szNote = "杞夊洖P1", + szContent = "鍙儭锛屾庨杭鏈冮欐ǎ锛屼繝澹潬浣犲戜簡", + }, + { + tCountdown = { + { + szName = "鏄犳棩", + nClass = 14, + nIcon = 13, + nTime = 25, + }, + { + nIcon = 13, + key = "浜屽紡路鐧绘〒", + nTime = 0, + szName = "浜屽紡路鐧绘〒", + nClass = 14, + }, + { + nIcon = 13, + key = "琛岃垷", + nTime = 0, + szName = "琛岃垷", + nClass = 14, + }, + }, + szContent = "鏈夊叐涓嬪瓙鍟", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鏉庣櫧", + szNote = "閫插叆P2", + }, + }, + [191] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "婧栧倷澶╀笂宸ㄧ煶", + szContent = "閬犺檿鍌充締闄i櫍鐨勮綗槌磋伈锛侊紒锛", + tCountdown = { + { + szName = "婧栧倷澶╀笂宸ㄧ煶", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "绲辩当鍘绘鍚э紒", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐢板竷鎴", + szNote = "铏庡槸", + }, + [4] = { + szContent = "鎶曠煶杌婃敮鎻达紒", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐗涘环鐜", + szNote = "娉ㄦ剰韬查伩鎶曠煶", + }, + [3] = { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "鐙肩墮澶ц粛锛屽叺鑷ㄥ煄涓嬶紝鐐伀閬庤檿锛屽鑽変笉鐢燂紒", + [14] = { + bCenterAlarm = true, + }, + szTarget = "鐢板竷鎴", + szNote = "婧栧倷鎺掔伀", + }, + }, + [192] = { + { + tCountdown = { + { + nIcon = 340, + szName = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + nClass = 14, + nTime = 30, + }, + { + nIcon = 340, + szName = "鈽嗗洖琛绲愭潫鈽嗕笁姣掑叆楂旀簴鍌", + nClass = 14, + nTime = 61, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "浣犲戞灉鐪熸湁浜涢杸閬撯︹︽澹綍鍦紝淇濊鏈帇閬嬪姛锛", + szNote = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + }, + { + tCountdown = { + { + nClass = 14, + key = "姣掕娑屽嫊", + nTime = 30, + szName = "姣掕娑屽嫊", + nIcon = 4504, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "瑾版暍鎺ユ垜涓鎺岋紒", + szNote = "姣掕娑屽嫊", + }, + { + tCountdown = { + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 15, + }, + }, + szContent = "绯熺硶锛岀従鍦ㄧ敤閫欐嫑閭勬槸澶媺寮蜂簡鈥︹", + [14] = { + bFullScreen = true, + }, + szTarget = "鍙叉濇槑", + szNote = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + }, + }, + [164] = { + { + tCountdown = { + { + szName = "銆25浜恒戣閲嶆〒", + nIcon = 340, + nClass = 14, + nTime = 15, + }, + }, + szContent = "瀹夋煇鍌捐鏉庡攼锛岃嫢瑕佸晱瑾板皪瑾伴尟锛熸垜濡備粖鏄汉涓殗甯濓紝鐣剁劧鏄垜灏嶏紒浠栭尟锛", + [14] = { + bCenterAlarm = true, + }, + szTarget = "瀹夌タ灞", + szNote = "15绉掑緦琛閲嶆〒", + }, + { + tCountdown = { + { + szName = "銆25浜恒戠噧琛绫犻帠", + nIcon = 340, + nClass = 14, + nTime = 40, + }, + }, + szContent = "閫愰箍澶╀笅锛屽鍙嫾涓ū鐜嬶紵涓嶆槸鏉遍兘澶╃瓥搴滐紝鑰屾槸鎴戝畨绁垮北鐨勮寖闄界嫾鐗欒粛锛", + [14] = { + bCenterAlarm = true, + }, + szTarget = "瀹夌タ灞", + szNote = "40绉掑緦鐕冭绫犻帠", + }, + }, + [133] = { + { + [14] = { + bCenterAlarm = true, + }, + szNote = "闄稿皨闆欑溂鏀惧嚭瀵掑厜锛", + szContent = "闄稿皨闆欑溂鏀惧嚭瀵掑厜锛", + }, + }, + [165] = { + { + tCountdown = { + { + szName = "銆25浜恒戣閲嶆〒", + nIcon = 340, + nClass = 14, + nTime = 15, + }, + }, + szContent = "瀹夋煇鍌捐鏉庡攼锛岃嫢瑕佸晱瑾板皪瑾伴尟锛熸垜濡備粖鏄汉涓殗甯濓紝鐣剁劧鏄垜灏嶏紒浠栭尟锛", + [14] = { + bCenterAlarm = true, + }, + szTarget = "瀹夌タ灞", + szNote = "15绉掑緦琛閲嶆〒", + }, + { + tCountdown = { + { + szName = "銆25浜恒戠噧琛绫犻帠", + nIcon = 340, + nClass = 14, + nTime = 40, + }, + }, + szContent = "閫愰箍澶╀笅锛屽鍙嫾涓ū鐜嬶紵涓嶆槸鏉遍兘澶╃瓥搴滐紝鑰屾槸鎴戝畨绁垮北鐨勮寖闄界嫾鐗欒粛锛", + [14] = { + bCenterAlarm = true, + }, + szTarget = "瀹夌タ灞", + szNote = "40绉掑緦鐕冭绫犻帠", + }, + }, + [134] = { + { + [14] = { + bCenterAlarm = true, + }, + szNote = "闄稿皨闆欑溂鏀惧嚭瀵掑厜锛", + szContent = "闄稿皨闆欑溂鏀惧嚭瀵掑厜锛", + }, + }, + [198] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "婧栧倷澶╀笂宸ㄧ煶", + szContent = "閬犺檿鍌充締闄i櫍鐨勮綗槌磋伈锛侊紒锛", + tCountdown = { + { + szName = "婧栧倷澶╀笂宸ㄧ煶", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "绲辩当鍘绘鍚э紒", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐢板竷鎴", + szNote = "铏庡槸", + }, + [4] = { + szContent = "鎶曠煶杌婃敮鎻达紒", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐗涘环鐜", + szNote = "娉ㄦ剰韬查伩鎶曠煶", + }, + [3] = { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "鐙肩墮澶ц粛锛屽叺鑷ㄥ煄涓嬶紝鐐伀閬庤檿锛屽鑽変笉鐢燂紒", + [14] = { + bCenterAlarm = true, + }, + szTarget = "鐢板竷鎴", + szNote = "婧栧倷鎺掔伀", + }, + }, + [230] = { + { + [14] = { + bCenterAlarm = true, + }, + szTarget = "姣涙瘺", + szNote = "杞夊洖P1", + szContent = "鍙儭锛屾庨杭鏈冮欐ǎ锛屼繝澹潬浣犲戜簡", + }, + { + tCountdown = { + { + nIcon = 13, + key = "琛岃垷", + nTime = 25, + szName = "鏄犳棩", + nClass = 14, + }, + { + nIcon = 13, + key = "浜屽紡路鐧绘〒", + nTime = 0, + szName = "浜屽紡路鐧绘〒", + nClass = 14, + }, + }, + szContent = "鏈夊叐涓嬪瓙鍟", + [14] = { + bFullScreen = true, + }, + szTarget = "鏉庣櫧", + szNote = "閫插叆P2", + }, + }, + [199] = { + { + tCountdown = { + { + nIcon = 340, + szName = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + nClass = 14, + nTime = 20, + }, + { + nClass = 14, + nTime = 41, + szName = "鈽嗗洖琛绲愭潫鈽嗕笁姣掑叆楂旀簴鍌", + nIcon = 340, + nFrame = 8, + }, + }, + szNote = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + szTarget = "鍙叉濇槑", + szContent = "浣犲戞灉鐪熸湁浜涢杸閬撯︹︽澹綍鍦紝淇濊鏈帇閬嬪姛锛", + }, + { + tCountdown = { + { + nClass = 14, + key = "姣掕娑屽嫊", + nTime = 30, + szName = "姣掕娑屽嫊", + nIcon = 4504, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "瑾版暍鎺ユ垜涓鎺岋紒", + szNote = "姣掕娑屽嫊", + }, + [4] = { + tCountdown = { + { + szName = "鈽呰仏鐏剼鍩庘槄", + nIcon = 340, + nClass = 14, + nTime = 110, + }, + { + szName = "鈽嗚仏鐏剼鍩庘槅", + nIcon = 340, + nClass = 14, + nTime = 170, + }, + }, + szTarget = "瀹夐洦", + szContent = "鍐拌垏鐏侀櫚鑸囬櫧锛屾槸鐐轰綘绛夌法绻旂殑鐓夌崉涔嬮杸锛", + szNote = "鈽呰仏鐏剼鍩庘槄", + }, + [3] = { + tCountdown = { + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 15, + }, + }, + szContent = "绯熺硶锛岀従鍦ㄧ敤閫欐嫑閭勬槸澶媺寮蜂簡鈥︹", + [14] = { + bFullScreen = true, + }, + szTarget = "鍙叉濇槑", + szNote = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + }, + }, + [231] = { + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "铇囧崄涓夊", + szNote = "9灏哄澶栧澶", + }, + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "鏉庣挊", + szNote = "7灏哄収鍏у収鍏", + }, + { + tCountdown = { + { + nIcon = 13, + key = "鐣跺墠闆嗙伀鈽", + nTime = 0, + szName = "鐣跺墠闆嗙伀鈽", + nClass = 14, + }, + }, + szContent = "鎴戦偅鍏掑瓙涔嬫鏄粬鐨勫懡鏁", + szTarget = "鏉庣挊", + szNote = "娓呯┖鍊掕▓鏅", + }, + }, + [-9] = { + [2] = { + szContent = "鐣跺績浜嗭紒", + szTarget = "鏉庣挊", + }, + [3] = { + tCountdown = { + { + szName = "闋樺彇绯栨灉鏅傞枔", + nClass = 14, + nIcon = 13, + nTime = 60, + }, + { + szName = "涓嬩竴娆″仛绯栨檪闁", + nClass = 14, + nIcon = 13, + nTime = 120, + }, + }, + szContent = "鍣楀棨鍣楀棨鈥︹﹀櫁鍡ゅ櫁鍡ゅ櫁鍡も︹", + szTarget = "姒磋姃鍏", + }, + [1] = { + szContent = "璺戦枊澶仩浜嗭紝鑳岀皪閲岀殑鏉辫タ閮芥帀浜嗭紒", + }, + [4] = { + tCountdown = { + { + szName = "闋樺彇绯栨灉", + nClass = 14, + nIcon = 13, + nTime = 120, + }, + { + szName = "鍙互鍋氶珮绱氱硸鏋", + nClass = 14, + nIcon = 13, + nTime = 60, + }, + }, + szContent = "鍟﹀暒鍟︼紝澶у蹇粸鏀炬潗鏂欙紝鍛煎暒鍛煎暒婧栧倷鍋氱硸鍟︼紒", + szTarget = "姒磋姃鍏", + }, + [5] = { + szContent = "鍖呰9涓矑鏈夐瓪椁岋紝鐒℃硶閲i瓪銆", + [14] = { + bScreenHead = true, + }, + }, + }, + [232] = { + { + tCountdown = { + { + nClass = 14, + szName = "涓嬩竴娆¤蛋浣", + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "铇囧崄涓夊", + szNote = "9灏哄澶栧澶", + }, + { + tCountdown = { + { + nClass = 14, + szName = "涓嬩竴娆¤蛋浣", + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "鏉庣挊", + szNote = "7灏哄収鍏у収鍏", + }, + { + tCountdown = { + { + nIcon = 13, + key = "鐣跺墠闆嗙伀鈽", + nTime = 0, + szName = "鐣跺墠闆嗙伀鈽", + nClass = 14, + }, + }, + szTarget = "鏉庣挊", + szNote = "娓呯┖鍊掕▓鏅", + szContent = "鎴戦偅鍏掑瓙涔嬫鏄粬鐨勫懡鏁", + }, + }, + [138] = { + { + szContent = "鐙肩墮寮╁叺锛屽垪闄f敾鎿婏紒", + col = { + 223, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "姹幗", + szNote = "閲嶅缉婵娲伙紒", + }, + { + tCountdown = { + { + nClass = 14, + szName = "鍗$浘鍊掕▓鏅", + nIcon = 13, + nTime = 65, + }, + }, + szContent = "鍏ㄨ粛绐佹搳锛", + szTarget = "鐙肩墮瀹堝倷瀹", + }, + }, + [233] = { + { + [14] = { + bCenterAlarm = true, + }, + szTarget = "姣涙瘺", + szNote = "杞夊洖P1", + szContent = "鍙儭锛屾庨杭鏈冮欐ǎ锛屼繝澹潬浣犲戜簡", + }, + { + tCountdown = { + { + nIcon = 13, + key = "琛岃垷", + nTime = 25, + szName = "鏄犳棩", + nClass = 14, + }, + { + nIcon = 13, + key = "浜屽紡路鐧绘〒", + nTime = 0, + szName = "浜屽紡路鐧绘〒", + nClass = 14, + }, + }, + szContent = "鏈夊叐涓嬪瓙鍟", + [14] = { + bFullScreen = true, + }, + szTarget = "鏉庣櫧", + szNote = "閫插叆P2", + }, + }, + [234] = { + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "铇囧崄涓夊", + szNote = "9灏哄澶栧澶", + }, + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "鏉庣挊", + szNote = "7灏哄収鍏у収鍏", + }, + { + tCountdown = { + { + nIcon = 13, + key = "鐣跺墠闆嗙伀鈽", + nTime = 0, + szName = "鐣跺墠闆嗙伀鈽", + nClass = 14, + }, + }, + szContent = "鎴戦偅鍏掑瓙涔嬫鏄粬鐨勫懡鏁", + szTarget = "鏉庣挊", + szNote = "娓呯┖鍊掕▓鏅", + }, + }, + [140] = { + { + tCountdown = { + { + szName = "娈靛畻鍏縺娲", + nIcon = 340, + nClass = 14, + nTime = 120, + }, + { + szName = "娉板磭鍌f縺娲", + nIcon = 340, + nClass = 14, + nTime = 60, + }, + }, + szContent = "鎴戠殑鑳藉姏鏄綘鍊戠劇娉曟兂璞$殑锛", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "娉板磭鍌", + szNote = "娈靛畻鍏縺娲", + }, + }, + [235] = { + { + [14] = { + bCenterAlarm = true, + }, + szContent = "鍙儭锛屾庨杭鏈冮欐ǎ锛屼繝澹潬浣犲戜簡", + szTarget = "姣涙瘺", + szNote = "杞夊洖P1", + }, + { + tCountdown = { + { + nIcon = 13, + key = "琛岃垷", + nTime = 25, + szName = "鏄犳棩", + nClass = 14, + }, + { + nIcon = 13, + key = "浜屽紡路鐧绘〒", + nTime = 0, + szName = "浜屽紡路鐧绘〒", + nClass = 14, + }, + }, + szContent = "鏈夊叐涓嬪瓙鍟", + [14] = { + bFullScreen = true, + }, + szTarget = "鏉庣櫧", + szNote = "閫插叆P2", + }, + }, + [136] = { + { + szContent = "鐙肩墮寮╁叺锛屽垪闄f敾鎿婏紒", + col = { + 223, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "姹幗", + szNote = "閲嶅缉婵娲伙紒", + }, + }, + [236] = { + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 255, + 255, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "铇囧崄涓夊", + szNote = "9灏哄澶栧澶", + }, + { + tCountdown = { + { + szName = "涓嬩竴娆¤蛋浣", + nClass = 14, + nIcon = 13, + nTime = 4, + }, + }, + szContent = "鐣跺績浜嗭紒", + col = { + 255, + 2, + 208, + }, + [14] = { + bFullScreen = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szTarget = "鏉庣挊", + szNote = "7灏哄収鍏у収鍏", + }, + { + tCountdown = { + { + nIcon = 13, + key = "鐣跺墠闆嗙伀鈽", + nTime = 0, + szName = "鐣跺墠闆嗙伀鈽", + nClass = 14, + }, + }, + szContent = "鎴戦偅鍏掑瓙涔嬫鏄粬鐨勫懡鏁", + szTarget = "鏉庣挊", + szNote = "娓呯┖鍊掕▓鏅", + }, + }, + [72] = { + { + tCountdown = { + { + szName = "娌欏埄浜為插叆铏涘急", + nIcon = 340, + nClass = 14, + nTime = 61, + }, + { + szName = "铏涘急鍓╅鏅傞枔", + nIcon = 340, + nClass = 14, + nTime = 28, + }, + }, + szContent = "鍛冣︹", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "娌欏埄浜", + szNote = "娌欏埄浜為插叆铏涘急", + }, + { + tCountdown = { + { + szName = "闃胯柀杈涢粸浜簡锠熺嚟", + nIcon = 340, + nClass = 14, + nTime = 50, + }, + { + szName = "绉掍汉鍊掕▓鏅", + nIcon = 340, + nClass = 14, + nTime = 20, + }, + }, + szContent = "闁冭鐨勫厜鏄庯紒", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "闃胯柀杈", + szNote = "闃胯柀杈涢粸浜簡锠熺嚟", + }, + }, + [237] = { + { + [14] = { + bCenterAlarm = true, + }, + szContent = "鍙儭锛屾庨杭鏈冮欐ǎ锛屼繝澹潬浣犲戜簡", + szTarget = "姣涙瘺", + szNote = "杞夊洖P1", + }, + { + tCountdown = { + { + nIcon = 13, + key = "琛岃垷", + nTime = 25, + szName = "鏄犳棩", + nClass = 14, + }, + { + nIcon = 13, + key = "浜屽紡路鐧绘〒", + nTime = 0, + szName = "浜屽紡路鐧绘〒", + nClass = 14, + }, + }, + szContent = "鏈夊叐涓嬪瓙鍟", + [14] = { + bFullScreen = true, + }, + szTarget = "鏉庣櫧", + szNote = "閫插叆P2", + }, + }, + [206] = { + { + tCountdown = { + { + nIcon = 13, + key = "鐏岃鎺", + nTime = 27, + szName = "鐏岃鎺", + nFrame = 8, + nClass = 14, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "瑾版暍鎺ユ垜涓鎺岋紒", + szNote = "姣掕娑屽嫊", + }, + { + tCountdown = { + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 5, + }, + { + nIcon = 340, + szName = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + nClass = 14, + nTime = 15, + }, + { + nClass = 14, + szName = "P5琛鏌撴槬绉&绂佹柗", + nIcon = 13, + nTime = 38, + }, + }, + szContent = "绯熺硶锛岀従鍦ㄧ敤閫欐嫑閭勬槸澶媺寮蜂簡鈥︹", + [14] = { + bFullScreen = true, + }, + szTarget = "鍙叉濇槑", + szNote = "鈫掆啋鈫掆槄婧栧倷鈽嗘柗闀风敓鈽", + }, + [4] = { + tCountdown = { + { + nClass = 14, + key = "鈽呰仏鐏剼鍩庘槄", + nTime = 110, + szName = "鈽呰仏鐏剼鍩庘槄", + nIcon = 340, + }, + { + nClass = 14, + key = "鈽嗚仏鐏剼鍩庘槅", + nTime = 170, + szName = "鈽嗚仏鐏剼鍩庘槅", + nIcon = 340, + }, + }, + szTarget = "瀹夐洦", + szContent = "鍐拌垏鐏侀櫚鑸囬櫧锛屾槸鐐轰綘绛夌法绻旂殑鐓夌崉涔嬮杸锛", + szNote = "鈽呰仏鐏剼鍩庘槄", + }, + [3] = { + tCountdown = { + [2] = { + nClass = 14, + nTime = 41, + szName = "鈽嗗洖琛绲愭潫鈽嗕笁姣掑叆楂旀簴鍌", + nIcon = 340, + nFrame = 8, + }, + [3] = { + nIcon = 13, + key = "鏂烽暦鐢", + nTime = 0, + szName = "鏂烽暦鐢", + nClass = 14, + }, + [1] = { + nIcon = 340, + szName = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + nClass = 14, + nTime = 20, + }, + [4] = { + nIcon = 13, + key = "绂佹柗", + nTime = 0, + szName = "绂佹柗", + nClass = 14, + }, + [5] = { + nIcon = 13, + key = "鐏岃鎺", + nTime = 0, + szName = "鐏岃鎺", + nClass = 14, + }, + }, + szTarget = "鍙叉濇槑", + szContent = "浣犲戞灉鐪熸湁浜涢杸閬撯︹︽澹綍鍦紝淇濊鏈帇閬嬪姛锛", + szNote = "鈽嗗洖琛绲愭潫鈽嗕笅涓娉㈠皬鎬", + }, + }, + [175] = { + { + tCountdown = { + { + szName = "铇囨浖鑾嶲TE/鐒$敺绁炴彁鍓25绉", + nIcon = 340, + nClass = 14, + nTime = 90, + }, + { + szName = "QTE绲愭潫(铇囨浖鑾)锛屼护鐙愬偡QTE", + nIcon = 340, + nClass = 14, + nTime = 31, + }, + }, + szContent = "浠ユ鑸炵浉浼达紝鍚涗綍涓嶅氨姝や竴閱夋柟浼戯紵", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "铇囨浖鑾", + szNote = "铇囨浖鑾嶲TE/鐒$敺绁炴彁鍓25绉", + }, + { + tCountdown = { + { + szName = "鐙肩墮杌嶉叉敾鍊掕▓鏅", + nIcon = 340, + nClass = 14, + nTime = 12, + }, + }, + szTarget = "鐙肩墮鎸囨彯瀹", + szContent = "閫欎粭鎵撳畬锛屽コ浜洪厭鑲夋噳鏈夌洝鏈夛紒", + szNote = "12绉掑緦閫叉敾闁嬪", + }, + }, + [-1] = { + [7] = { + tCountdown = { + { + nClass = 14, + szName = "钘忓娲炲瓨鍦ㄦ檪闁", + nIcon = 13, + nTime = 1800, + }, + }, + szContent = "浣犵櫦鐝句簡涓鍊嬭棌瀵舵礊锛佽棌瀵舵礊鍙瓨鍦ㄥ叐鍒婚悩锛屽嫏蹇呴熼熷墠寰鎸栨帢瀵惰棌锛", + }, + [1] = { + [14] = { + bScreenHead = true, + }, + szContent = "鑰佸瓙瑕佸枬閰掞紒", + szTarget = "鍚冮/鐨勬按璩", + szNote = "鍠濋厭", + }, + [2] = { + [14] = { + bScreenHead = true, + }, + szContent = "绲︽垜渚嗕竴纰楄彍锛", + szTarget = "鍚冮/鐨勬按璩", + szNote = "鍚冭彍", + }, + [4] = { + [14] = { + bScreenHead = true, + }, + szContent = "绲︽垜鐩涗竴纰楅鍣村櫞鐨勯/渚嗭紒", + szTarget = "鍚冮/鐨勬按璩", + szNote = "鍚冮/", + }, + [8] = { + szContent = "濂藉儚鏈夐瓪鍏掍笂閴や簡銆", + [14] = { + bScreenHead = true, + }, + }, + [9] = { + tCountdown = { + { + nClass = 14, + szName = "楸烽瓪鍑虹従", + nIcon = 4223, + nTime = 20, + }, + }, + szContent = "涓夐毣灏忛狈榄氾紒蹇壘榛炲厭鏉辫タ鍠備粬鍊戯紒", + }, + [5] = { + tCountdown = { + { + nClass = 14, + szName = "鐧兼斁宸ヨ硣瑷堟檪", + nIcon = 2290, + nTime = 30, + }, + }, + szContent = "鍒嗛厤鑰呮鐧艰捣鏀跺叆鍒嗛厤锛屼笉鍦ㄧ浉鍚屽牬鏅呯劇娉曟姇绁紝鍊掕▓鏅傜祼鏉熷緦榛樿獚鍙嶅皪", + col = { + 255, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + szNote = "鐧兼斁宸ヨ硣,璜嬬⒑瑾", + }, + [3] = { + [14] = { + bScreenHead = true, + }, + szContent = "閫欒彍鍜告浜嗭紝蹇郸鑰佸瓙涓婁竴澶х姘翠締锛", + szTarget = "鍚冮/鐨勬按璩", + szNote = "鍠濇按", + }, + [6] = { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szContent = "{$me}", + szTarget = "%", + }, + }, + [176] = { + { + tCountdown = { + { + szName = "铇囨浖鑾嶲TE/鐒$敺绁炴彁鍓25绉", + nIcon = 340, + nClass = 14, + nTime = 90, + }, + { + szName = "QTE绲愭潫(铇囨浖鑾)锛屼护鐙愬偡QTE", + nIcon = 340, + nClass = 14, + nTime = 31, + }, + }, + szContent = "浠ユ鑸炵浉浼达紝鍚涗綍涓嶅氨姝や竴閱夋柟浼戯紵", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "铇囨浖鑾", + szNote = "铇囨浖鑾嶲TE/鐒$敺绁炴彁鍓25绉", + }, + { + tCountdown = { + { + szName = "鐙肩墮杌嶉叉敾鍊掕▓鏅", + nIcon = 340, + nClass = 14, + nTime = 12, + }, + }, + szTarget = "鐙肩墮鎸囨彯瀹", + szContent = "閫欎粭鎵撳畬锛屽コ浜洪厭鑲夋噳鏈夌洝鏈夛紒", + szNote = "12绉掑緦閫叉敾闁嬪", + }, + }, + [205] = { + { + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szNote = "婧栧倷澶╀笂宸ㄧ煶", + szContent = "閬犺檿鍌充締闄i櫍鐨勮綗槌磋伈锛侊紒锛", + tCountdown = { + { + szName = "婧栧倷澶╀笂宸ㄧ煶", + nIcon = 340, + nClass = 14, + nTime = 6, + }, + }, + }, + { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 14, + }, + }, + szContent = "绲辩当鍘绘鍚э紒", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐢板竷鎴", + szNote = "铏庡槸", + }, + [4] = { + szContent = "鎶曠煶杌婃敮鎻达紒", + col = { + 255, + 31, + 95, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鐗涘环鐜", + szNote = "娉ㄦ剰韬查伩鎶曠煶", + }, + [3] = { + tCountdown = { + { + szName = "鏂烽", + nIcon = 340, + nClass = 14, + nTime = 18, + }, + }, + szContent = "鐙肩墮澶ц粛锛屽叺鑷ㄥ煄涓嬶紝鐐伀閬庤檿锛屽鑽変笉鐢燂紒", + [14] = { + bCenterAlarm = true, + }, + szTarget = "鐢板竷鎴", + szNote = "婧栧倷鎺掔伀", + }, + }, + [177] = { + { + tCountdown = { + { + szName = "鍗佷簩鐩稿嚭鐝", + nIcon = 340, + nClass = 14, + nTime = 11, + }, + }, + szContent = "鐪嬩締鎴戣瑾嶇湡涓榛炰簡锛", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "榛戦饭", + szNote = "杞夐殠娈垫簴鍌12鐩", + }, + { + tCountdown = { + { + szName = "閫愰ⅷ椋涢洩鏂", + nIcon = 340, + nClass = 14, + nTime = 47, + }, + }, + szContent = "閫愰ⅷ椋涢洩鍩嬮娈栵紝瀵掓槦灏勬湀绱㈠懡姝革紒鍚勪綅涓旂灖鎴戞鎷涢ⅷ闆eぉ~~", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鍦板瓧涓铏", + szNote = "婧栧倷閫愰ⅷ椋涢洩鏂", + }, + }, + [74] = { + { + szContent = "濂藉儚榄氬厭涓婇墹浜嗭紝閫熼熸敹妗裤", + [14] = { + bScreenHead = true, + }, + }, + }, + [178] = { + { + tCountdown = { + { + szName = "鍗佷簩鐩稿嚭鐝", + nIcon = 340, + nClass = 14, + nTime = 11, + }, + }, + szContent = "鐪嬩締鎴戣瑾嶇湡涓榛炰簡锛", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "榛戦饭", + szNote = "杞夐殠娈垫簴鍌12鐩", + }, + { + tCountdown = { + { + szName = "閫愰ⅷ椋涢洩鏂", + nIcon = 340, + nClass = 14, + nTime = 47, + }, + }, + szContent = "閫愰ⅷ椋涢洩鍩嬮娈栵紝瀵掓槦灏勬湀绱㈠懡姝革紒鍚勪綅涓旂灖鎴戞鎷涢ⅷ闆eぉ~~", + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "鍦板瓧涓铏", + szNote = "婧栧倷閫愰ⅷ椋涢洩鏂", + }, + }, + [200] = { + { + szContent = "鍝硷紒鎼椾簜鐨勪汉锛屾渻琚垜韪㈡垚鑲夋偿锛", + col = { + 255, + 31, + 31, + }, + [14] = { + bCenterAlarm = true, + bFullScreen = true, + }, + szTarget = "瀹囨枃鐣", + szNote = "T浜ゆ笡鍌", + }, + }, + }, + DOODAD = { + [-9] = { + { + dwID = 6074, + }, + { + dwID = 6078, + }, + { + dwID = 6078, + }, + }, + [-1] = { + { + tCountdown = { + { + nClass = 17, + szName = "涓嬩竴娆", + nIcon = 13, + nTime = 125, + }, + }, + [17] = { + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 1470, + }, + }, + }, + NPC = { + [241] = { + { + dwID = 51050, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍝ヨ垝缈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51054, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏墖钀介粸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51055, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "濂瓊椹氶緧妲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51056, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍝ヨ垝缈板够褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛戦綊鍏冧綉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铚樿洓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夊叏榛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51552, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑻辨嫑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51589, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51675, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夋叾绶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绌垮績鐬勬簴2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51690, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绌垮績鐬勬簴1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52557, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛路鍒嗚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛路鐖嗙偢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [357] = { + { + dwID = 60636, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "缈佸辜涔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60684, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "绔湪鐝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60688, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鍝堢埦鑺欐灄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [361] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁炵桨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧藉湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忓お闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉樻硶闁璀樼牬鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "淇′话鏆村緬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏妸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘存簮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閴戠埦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63166, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缇呯磵鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴风枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63188, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌掕棌鍛兼湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63253, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷块洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉樻硶闁璀樼牬鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63288, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏂瑰ぉ鍔嶈豹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63294, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬鸿惤鐨勯鐗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63302, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "淇′话鏆村緬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63304, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栨硶闁琛涢亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63312, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷撹穻鎬濈窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63319, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏恫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63334, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冮噾姘h剤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [365] = { + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65926, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹鐨勫法鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65931, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閷㈠畻榫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65935, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65936, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閭笉鍍", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忕伣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65938, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀛鐝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65943, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼嶈棌閲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65950, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒¢潰楝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65954, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "寮撶鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楝奸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65963, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘撮[鎶撲汉]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65982, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閼懌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65987, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮疯ゲ濂村儠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65988, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃仴娣疯泲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榄氭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66005, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴峰鍒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66066, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "鏉庡宄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [249] = { + { + dwID = 51056, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍝ヨ垝缈板够褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夊叏榛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绌垮績鐬勬簴2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51690, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绌垮績鐬勬簴1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53985, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍝ヨ垝缈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53989, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏墖钀介粸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53990, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "濂瓊椹氶緧妲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53995, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛戦綊鍏冧綉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53996, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铚樿洓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54006, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑻辨嫑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54007, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54008, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夋叾绶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54089, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛路鍒嗚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 54090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔炶潛路鐖嗙偢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [126] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "婧栧倷韬查伩绶氾紒", + nRefresh = 10, + nClass = 3, + }, + { + nIcon = 346, + nTime = 110, + szName = "椋涘妽", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25675, + }, + { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "100,婧栧倷韬查伩绶氾紒;185,椋涘妽;", + }, + }, + dwID = 19456, + }, + }, + [32] = { + { + dwID = 638, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐕庡師", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 891, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椁愰ⅷ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 892, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋茬伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 893, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍚為洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5067, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬫捣閵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5068, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈辩櫢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5072, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎺岀伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閹儭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5662, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩﹁槶姝﹀儳闋洰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 5744, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞崇瓑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7791, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗冩墜瑙闊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7792, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃垜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7793, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒$浉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7806, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓嶇┅瀹氱殑姗熼浄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [262] = { + { + dwID = 55524, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏噸濡欐硶鏉戞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55528, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠ょ嫄鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撴ⅷ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55573, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌抽洩涔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55595, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌宠搏瑙掔殑褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55720, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉戞娉曢櫍", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [270] = { + { + dwID = 56826, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈ㄦ潗鈫掗噾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56827, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍚堥噾濉娾啋鐏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌抽笧鏃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56835, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掓按鐭斥啋鍦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56836, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "纭:宀┾啋姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56841, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56845, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦熷鈫掓湪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56861, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯吢峰彸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56873, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闆锋憾鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56888, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娉曞仴鍏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56895, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌崇宀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56911, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闆烽鐛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56919, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞诲榄斿奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56924, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯吢峰彸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57020, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯吢峰乏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [138] = { + { + nFrame = 57, + dwID = 18047, + tCountdown = { + { + nClass = 7, + szName = "澶╅洸鎺涢浄", + nIcon = 13, + nTime = 60, + }, + }, + }, + }, + [140] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "绱呯悆路鍒锋柊", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "绱呯悆锛堟櫘閫氾級", + dwID = 18786, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "缍犵悆路鍒锋柊", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "缍犵悆锛堟櫘閫氾級", + dwID = 18787, + }, + [4] = { + dwID = 19649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎭愭栬檿鍒戜汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + tCountdown = { + { + nIcon = 2589, + nTime = 40, + szName = "娉版嫵鎵嬄峰埛鏂", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 18783, + szName = "娉版嫵鎵嬶紙鏅氾級", + nFrame = 57, + }, + }, + [144] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵吢蜂腑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸陈风湡韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嶇綈路鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╀竴鏁欏ぇ绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忚硦闆呭厠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [146] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵吢蜂腑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸陈风湡韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嶇綈路鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╀竴鏁欏ぇ绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忚硦闆呭厠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [148] = { + { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + nTime = 29, + szName = "鏈ㄤ汉", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 18286, + }, + { + nFrame = 52, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "34,澶ч煶娉;67,澶ч煶娉;97,澶ч煶娉;131,澶ч煶娉;165,澶ч煶娉;195,澶ч煶娉;228,澶ч煶娉;261,澶ч煶娉;291,澶ч煶娉;325,澶ч煶娉;359,澶ч煶娉;389,澶ч煶娉;422,澶ч煶娉;", + }, + }, + dwID = 18281, + }, + }, + [298] = { + { + dwID = 59385, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堣彲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59392, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦板埡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59397, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍥扮嵏鍥氱睜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59405, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忓鍟", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59406, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堟硥娣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钃勭⿳鐨勫収鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59427, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏆楁湀琛鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59433, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴勬剤鑿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59434, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧炬厱鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59435, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞藉啣绂侀尞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59452, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐伴珦姣掔垎褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 59545, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞诲康鍔嶆埃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [-9] = { + [13] = { + nFrame = 52, + dwID = 48701, + }, + [7] = { + dwID = 47208, + szName = "娑呮缍1", + nFrame = 57, + }, + [1] = { + dwID = 48381, + szName = "鐐伀", + nFrame = 57, + }, + [2] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 57, + dwID = 48487, + }, + [4] = { + nFrame = 57, + dwID = 48578, + }, + [8] = { + dwID = 43966, + szName = "娑呮缍2", + nFrame = 57, + }, + [9] = { + dwID = 47276, + szName = "娑呮缍3", + nFrame = 57, + }, + [5] = { + tCountdown = { + { + szName = "鐮存暤|钀", + nClass = 3, + nIcon = 13, + nTime = 10, + }, + }, + dwID = 48545, + nFrame = 57, + }, + [10] = { + szName = "娑呮缍1", + nFrame = 57, + dwID = 47208, + }, + [14] = { + nFrame = 52, + dwID = 48748, + }, + [3] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 48482, + }, + [6] = { + dwID = 48514, + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "娑呮缍", + }, + [12] = { + szName = "娑呮缍3", + nFrame = 57, + dwID = 47276, + }, + [11] = { + szName = "娑呮缍2", + nFrame = 57, + dwID = 43966, + }, + }, + [160] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 80, + szName = "榫嶅嵎棰ㄥ埛鏂", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 23192, + }, + { + dwID = 21880, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鍗撳姏鏍煎湒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21881, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "婢瑰彴鏋伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21882, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鑱炰汉褰ョ瘎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21883, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "宀虫壙蹇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21885, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鐮村煄閷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 21886, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "楠ㄧ墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22289, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "钑矙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22290, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "闊嬫煍绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25617, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鐙肩墮鐧惧か闀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [164] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 50, + szName = "鐕冭绫犻帠", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23005, + [3] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 50, + szName = "涓嬩竴娆″皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23009, + [3] = { + bTeamChannel = true, + }, + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,鐨囦箣鎬;39,闋嫾榛炲悕;", + }, + { + nIcon = 346, + nClass = 6, + nTime = "0.72,婧栧倷閫插叆P2;0.42,婧栧倷閫插叆P3;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夌タ灞", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 22647, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "浣胯呭嚭鐝", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 22618, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯", + tRelation = { + bAll = true, + }, + }, + }, + [11] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 19, + szName = "绱呰棈鐏嚭鐝", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 22602, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "澧撶婵娲诲墿椁樻檪闁", + nTime = 30, + szName = "澧撶婵娲诲墿椁樻檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23751, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "澧撶婵娲诲墿椁樻檪闁", + nTime = 30, + szName = "澧撶婵娲诲墿椁樻檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23750, + nFrame = 52, + }, + { + dwID = 23336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎$挡", + tRelation = { + bAll = true, + }, + }, + }, + [4] = { + bBigFontAlarm = true, + }, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "骞宠鍓╅鏅傞枔", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23342, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 17, + szName = "骞叉摼鐐稿綀", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23827, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 23360, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿婇紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 62, + szName = "鎿婇紦鎵", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 3, + nIcon = 2589, + nTime = "83,绗簩娉㈤叉敾;173,绗笁娉㈤叉敾;263,绗洓娉㈤叉敾;353,鏈寰屼竴娉㈤叉敾;", + }, + }, + dwID = 24188, + [3] = { + bTeamChannel = true, + }, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 120, + szDisplay = "闅ㄦ瀵剁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 24539, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23760, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23761, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23752, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23753, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 52, + dwID = 23757, + }, + { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23758, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23755, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 52, + dwID = 23756, + }, + { + dwID = 22038, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22916, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈仏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 22989, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闋嫾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐛ㄥ鍟忎織", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷峰够婊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23749, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒″悕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23922, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿婇紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23924, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蹇冮瓟", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23926, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涙槦鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23927, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涙槦璁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 23951, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铦磋澏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24045, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24053, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24062, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涔惧潳鍔嶆剰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24119, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浣曡帢娑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24396, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嬮爞婕忔礊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24668, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘撮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庡繕鐢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24931, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎$挡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎″绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [330] = { + { + dwID = 62770, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堟硥娣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄祦娴妽瀹⑩濇嫮鍟", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64220, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滆嫤琛屽儳鈥濋Μ绻肩磵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64221, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃紨鐫涚櫧椤嶁濆槸澶╄檸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64222, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃嚋鍐皣鑷斥濆鐙肩帇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [334] = { + { + dwID = 61156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲戝崄浜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62110, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐐庢殙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64202, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏硅帿钀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绔湪缇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬪悞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [342] = { + { + dwID = 60654, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "娈烘湯閭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60660, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏈堢睜鑽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60663, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "钂硅懎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61085, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "棰ㄩ鐒℃儏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61086, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "寰╁菇鑽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [176] = { + { + tCountdown = { + { + nIcon = 346, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 27200, + szName = "鐙肩墮绮捐嫳鏂ュ::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27201, + szName = "鏂风姜鑸炶::25", + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 346, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27217, + szName = "鐙肩墮灏勬墜::25", + nFrame = 57, + }, + [8] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,灏佸渤;40,楱庡叺琛濋嫆;55,鎾煎渤;75,灏佸渤;135,灏佸渤;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.75,婧栧倷閫插叆銆怭2銆;0.35,婧栧倷閫插叆銆怭3銆;", + }, + }, + dwID = 27161, + szName = "娌欏彵鍗::25", + nFrame = 57, + }, + [16] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "璺抽ⅷ绲愭潫鍊掕▓鏅", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27285, + szName = "澶ф棆棰::25", + nFrame = 47, + }, + [17] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "30,銆愮浘鍏甸杸銆戜笅涓娉;70,銆愮浘鍏甸杸銆戜笅涓娉;100,銆愮浘鍏甸杸銆戜笅涓娉;140,銆愮浘鍏甸杸銆戜笅涓娉;170,銆愮浘鍏甸杸銆戜笅涓娉;210,銆愮浘鍏甸杸銆戜笅涓娉;240,銆愮浘鍏甸杸銆戜笅涓娉;280,銆愮浘鍏甸杸銆戜笅涓娉;310,銆愮浘鍏甸杸銆戜笅涓娉;350,銆愮浘鍏甸杸銆戜笅涓娉;380,銆愮浘鍏甸杸銆戜笅涓娉;420,銆愮浘鍏甸杸銆戜笅涓娉;", + }, + }, + dwID = 27159, + szName = "銆愮浘鍏甸杸銆戞寔鐩惧叺", + nFrame = 57, + }, + [9] = { + tCountdown = { + { + nIcon = 346, + nTime = 10, + szName = "闆嗙伀鐙兼檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27481, + szName = "鐧界嫾", + nFrame = 57, + }, + [18] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "30,銆愬湴闆烽杸銆戜笅涓娉;70,銆愬湴闆烽杸銆戜笅涓娉;100,銆愬湴闆烽杸銆戜笅涓娉;140,銆愬湴闆烽杸銆戜笅涓娉;170,銆愬湴闆烽杸銆戜笅涓娉;210,銆愬湴闆烽杸銆戜笅涓娉;240,銆愬湴闆烽杸銆戜笅涓娉;280,銆愬湴闆烽杸銆戜笅涓娉;310,銆愬湴闆烽杸銆戜笅涓娉;350,銆愬湴闆烽杸銆戜笅涓娉;380,銆愬湴闆烽杸銆戜笅涓娉;420,銆愬湴闆烽杸銆戜笅涓娉;", + }, + }, + dwID = 27155, + szName = "銆愬湴闆烽杸銆戝櫞鐏叺", + nFrame = 57, + }, + [5] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "涓嬩竴娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27222, + szName = "榛戦綊琛涘+::25", + nFrame = 57, + }, + [10] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "35,绌洪f巩妯欒鍦;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.30,DPS娉ㄦ剰鍋滄墜;", + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27144, + szName = "闈涢洸:25", + nFrame = 57, + }, + [20] = { + tCountdown = { + { + nClass = 3, + nIcon = 346, + nTime = "40,鐏槦;68,闆插嵎鐓;", + }, + }, + dwID = 27255, + szName = "甯憾闆::25", + nFrame = 57, + }, + [21] = { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "涓嬩竴鍊嬪惊鐠3琛濋嫆|1寮撳叺", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 27357, + szName = "銆愬壀銆戝櫞鐏叺", + nFrame = 57, + }, + [11] = { + tCountdown = { + { + nIcon = 346, + nTime = 19, + szName = "澶╄婕", + nRefresh = 10, + nClass = 3, + }, + { + nClass = 3, + nIcon = 346, + nTime = "8,妯欒鍦堟秷澶;11,鍘氬湡鍑虹従DPS婧栧倷鐖嗙櫦;", + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 27145, + szName = "绌洪f巩妯欒鍦::25", + nFrame = 57, + }, + [22] = { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "涓嬩竴娉㈤叉敾", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 27111, + szName = "銆愭墖銆戣閶掑叺", + nFrame = 57, + }, + [3] = { + tCountdown = { + { + nIcon = 346, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27289, + szName = "鐙肩墮鍒閶::25", + nFrame = 57, + }, + [6] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "涓嬩竴娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27219, + szName = "榛戦綊宸斧::25", + nFrame = 57, + }, + [12] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "11,鐞;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.42,婧栧倷鎵惧皬涓冩姳鍦;", + }, + }, + dwID = 27139, + szName = "澶╃嫾::25", + nFrame = 47, + }, + [13] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "鐞", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27163, + szName = "槌舵埦澶::25", + nFrame = 57, + }, + [7] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "涓嬩竴娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27223, + szName = "榛戦綊绁徃::25", + nFrame = 57, + }, + [14] = { + szName = "[闈掗寪鐗у牬]鐙肩墮鎻村叺", + dwID = 26871, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "涓嬩竴娉㈡彺杌", + nRefresh = 10, + nClass = 3, + }, + }, + nFrame = 57, + }, + [19] = { + tCountdown = { + { + nIcon = 346, + nTime = 33, + szName = "銆愬掓补闁銆戜笅涓娉", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27190, + szName = "銆愬掓补闁銆戣棨鐢插叺", + nFrame = 57, + }, + [15] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "52,榛炲悕QTE;", + }, + }, + dwID = 27128, + szName = "鏇圭値鐑::25", + nFrame = 47, + }, + }, + [178] = { + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷峰櫖", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍌鍎÷峰櫖:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 18, + szName = "骞藉啣闆欏垉(绌块)", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36448, + szName = "骞藉啣姘e媮:25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36315, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰瘏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A绲劼峰瘏铏:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36316, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰嵂", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A绲劼峰嵂鍏:25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36319, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰崍", + tRelation = { + bAll = true, + }, + }, + }, + szName = "B绲劼峰崍棣:25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36322, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎烽厜", + tRelation = { + bAll = true, + }, + }, + }, + szName = "C绲劼烽厜闆:25", + nFrame = 57, + }, + { + szName = "鍦板埡瑁滅郸杌:25", + dwID = 36335, + [3] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + szName = "鐒︽补瑁滅郸杌:25", + dwID = 36336, + [3] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + nFrame = 47, + szName = "鍙叉湞缇::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉湞缇", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,鎵囬ⅷ;", + }, + }, + dwID = 36328, + }, + { + nFrame = 57, + szName = "鍦板瓧涓铏::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦板瓧涓铏", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "9,鍒嗛;30,椋涢偿鍑虹従;43,鏆楁鑰呭嚭鐝;", + }, + }, + dwID = 36299, + }, + { + szName = "闅卞厓鏈冩殫娈鸿::25", + dwID = 36301, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + { + szName = "鏉滄.:25", + dwID = 36464, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "閻樹竴娲:25", + dwID = 36463, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "鑾皨甯::25", + dwID = 36462, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + szName = "闇嶆杌::25", + dwID = 36461, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + { + dwID = 36279, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闅卞厓鏈冩殫娈鸿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36284, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒″悕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36285, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷烽櫧", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36286, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷烽櫚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36306, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛戦饭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36312, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閭奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36313, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰瓙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36314, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎烽啘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36317, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎疯景", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰烦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36320, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎锋湭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36321, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎风敵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36323, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎锋垖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36324, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎蜂亥", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36327, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎰佸煄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [358] = { + { + dwID = 63881, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "钖戜粐灏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63882, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "榄忓畻鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63883, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "瀹偛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [182] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 22, + szName = "鍦撳姬鍔", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27654, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "甯剁浘鍔嶄繎路2铏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "甯剁浘淇(闆)", + nFrame = 47, + }, + { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27653, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "甯剁浘鍔嶄繎路1铏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "甯剁浘淇(鍔)", + }, + { + nFrame = 67, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 27711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓嶇ゥ鐨勯粦铔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 37, + szName = "涓嶇ゥ鐨勯粦铔", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,琛濇挒;62,婧栧倷璺崇噲;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夌タ灞", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 27644, + nFrame = 47, + }, + { + nFrame = 52, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宓愬〉鍔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "涓嬩竴娆″嚭鍔", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 27715, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙ゅ妽", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "涓嬩竴娆″嚭鍔", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 15, + szName = "榄呮儜", + nRefresh = 10, + nClass = 7, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎺㈤洩", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 30354, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 27642, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏂瑰+", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 28, + szName = "鐙肩墮鏂瑰+", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "闅ㄦ鎶鑳", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27616, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "闅ㄥ嵆鎶鑳", + nIcon = 2589, + nTime = 11, + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.75,婧栧倷楹掗簾淇;0.25,婧栧倷楹掗簾淇;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭抽簰楹", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 27676, + nFrame = 67, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 35, + szName = "杌婁繎", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 30353, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + { + dwID = 27623, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬬喀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 27689, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍒囧壊姗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 27717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠ょ嫄鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30378, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宓愬妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30379, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璋峰妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30380, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30402, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿庡ぉ鍏典繎宸ㄥ儚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 30429, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏囦繎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36029, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩滃璩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [184] = { + { + tCountdown = { + { + nIcon = 346, + nTime = 43, + szName = "韬查伩钀界煶", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "澧ㄥ绉樻钀界煶", + dwID = 30507, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "23,QTE婧栧倷;45,韬查伩钀界煶;", + }, + }, + dwID = 30398, + nFrame = 47, + }, + }, + [370] = { + { + dwID = 66135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣掑績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰卞棓锛堟櫤锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66150, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩棿锛堢Ξ锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66151, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辨參锛堜俊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66161, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辫勃锛堜粊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩枒锛堢京锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66168, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冪﹩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [190] = { + { + dwID = 36683, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬪彶娑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [192] = { + { + nFrame = 57, + dwID = 36976, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙叉濇槑:10PT", + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "姣掕娑屽嫊", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 2589, + nTime = "12,鐩茬溂琛濂;41,榄勮。琛鍍;72,璧ょ嫾琛;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36845, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路鐞电惗", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "閫g窔", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "鐧介櫠路鐞电惗:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36846, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路绠滅瘜", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐧介櫠路绠滅瘜:10PT", + }, + { + nFrame = 57, + dwID = 37006, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夐洦", + tRelation = { + bAll = true, + }, + }, + }, + szName = "瀹夐洦:10PT", + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "45,鑱栫伀鐒氬煄;105,鑱栫伀妯婂煄;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36841, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闃跨崹楣", + tRelation = { + bAll = true, + }, + }, + }, + szName = "闃跨崹楣:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36842, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕礌鐖", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐑忕礌鐖:10PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 36843, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙挋", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙挋:10PT", + }, + { + dwID = 36861, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36977, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩茬溂琛濂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36979, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璧ょ嫾琛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37009, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楫鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37010, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堥瓊鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍤村瓭閫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38201, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滅儓鐒扮噹鍘熲濊硜鐧惧嫕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 38262, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃褰辩禃濉碘濊但閫f鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41161, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶈硣绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [263] = { + { + dwID = 55542, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌虫剼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55607, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌冲摬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55614, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑰姝﹁路澶栧姛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55615, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呴渼琛浡峰収鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55637, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瑙h獮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55641, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍛ㄦ渚嶈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55872, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮洈榫嶇敳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55906, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忔鍣ㄤ汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55956, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉湞鑻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55960, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [198] = { + [7] = { + tCountdown = { + { + nIcon = 346, + nTime = 37, + szName = "椋涙枾姘e牬", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "椋涙枾姘e牬:25PT", + dwID = 40646, + nFrame = 57, + }, + [1] = { + tCountdown = { + { + nIcon = 346, + key = "鐏緧姗熼浄", + nTime = 30, + szName = "鐏緧姗熼浄", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40586, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧姗熼浄", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐏緧姗熼浄:25PT", + nFrame = 52, + }, + [2] = { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 40584, + szName = "榛戞补鍦:25PT", + szNote = "鈽呴仩闆㈡补鍦堚槄閬犻洟娌瑰湀鈽", + nFrame = 57, + }, + [4] = { + nFrame = 52, + szName = "鐏緧鎽у煄:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧鎽у煄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,杩芥搳鐏緧;16,鐏緧姗熼浄;60,鎽у煄涓鎿;", + }, + }, + dwID = 40581, + }, + [8] = { + nFrame = 47, + szName = "鐢板竷鎴:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐢板竷鎴", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7.5,鏂烽;18,椋涙枾姘e牬;25,婧栧倷鎺掔伀;195,榛炲悕;", + }, + { + nIcon = 13, + nTime = 65, + szName = "铏庡槸锛堢┛閫忥級", + nFrame = 8, + nClass = 7, + }, + }, + dwID = 40576, + }, + [9] = { + [3] = { + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶉渶鐗╄硣", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 41164, + nFrame = 52, + }, + [5] = { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "涓嬩竴娉㈣櫉瑙掓墜", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 40748, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮铏熻鎵", + tRelation = { + bAll = true, + }, + }, + }, + szName = "铏熻鎵:25PT", + nFrame = 47, + }, + [10] = { + dwID = 40719, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏀诲煄闅婇暦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40587, + szName = "杩芥搳鐏緧:25PT", + tCountdown = { + { + nIcon = 346, + key = "杩芥搳鐏緧", + nTime = 30, + szName = "杩芥搳鐏緧", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [6] = { + nFrame = 67, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 40717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈濇洣闁椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鈽呭揩灏勬搳鈽呭揩灏勬搳鈽", + szName = "椋涚煶:25PT", + }, + [12] = { + dwID = 40777, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦栨嫈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 40758, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙湪姹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [271] = { + { + dwID = 56305, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瑙h獮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56316, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌虫剼", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56323, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍛ㄦ渚嶈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56339, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮洈榫嶇敳", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌冲摬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56346, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忔鍣ㄤ汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56359, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑰姝﹁路澶栧姛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56362, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呴渼琛浡峰収鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56381, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉湞鑻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [275] = { + { + dwID = 56254, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏噸濡欐硶鏉戞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56256, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠ょ嫄鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56260, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撴ⅷ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56261, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌抽洩涔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56265, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌宠搏瑙掔殑褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [204] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 13, + key = "DPS鍋滄墜", + nTime = 0, + szName = "DPS鍋滄墜", + nClass = 12, + }, + { + nIcon = 13, + key = "榛戦ⅷ鐮村博鏂", + nTime = 0, + szName = "榛戦ⅷ鐮村博鏂", + nClass = 12, + }, + [4] = { + nClass = 7, + szName = "姝i潰AOE", + nIcon = 13, + nTime = 7, + }, + [3] = { + nIcon = 13, + key = "姝i潰AOE", + nTime = 0, + szName = "姝i潰AOE", + nClass = 12, + }, + }, + dwID = 41826, + }, + }, + [206] = { + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42139, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙挋", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "鍓佸北鍔(鐮寸敳)", + nTime = 7, + szName = "鍓佸北鍔(鐮寸敳)", + nClass = 7, + }, + }, + szName = "鍙挋:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42137, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闃跨崹楣", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 8, + key = "鎭愭嚰debuff", + nTime = 17, + szName = "鎭愭嚰debuff", + nClass = 7, + nIcon = 346, + }, + }, + szName = "闃跨崹楣:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕礌鐖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "鏂锋氮鏂(娴佽)", + nTime = 11, + szName = "鏂锋氮鏂(娴佽)", + nClass = 7, + }, + }, + szName = "鐑忕礌鐖:25TZ", + }, + { + nFrame = 57, + dwID = 42172, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夐洦", + tRelation = { + bAll = true, + }, + }, + }, + szName = "瀹夐洦:25TZ", + tCountdown = { + { + nIcon = 346, + key = "鈽呰仏鐏剼鍩庘槄", + nTime = 45, + szName = "鑱栫伀妯婂煄", + nClass = 7, + }, + { + nIcon = 13, + key = "鈽嗚仏鐏剼鍩庘槅", + nTime = 105, + szName = "鑱栫伀妯婂煄", + nClass = 7, + }, + }, + }, + { + nFrame = 67, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 42176, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堥瓊鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "闈堥瓊鑱氬姏:25TZ", + }, + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 42175, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楫鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + szName = "楫鑱氬姏:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路绠滅瘜", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "钘嶈壊閫g窔", + nIcon = 3448, + nTime = 14, + }, + { + nClass = 7, + nIcon = 3449, + szName = "绱呰壊閫g窔", + nTime = 57, + }, + }, + szName = "鐧介櫠路绠滅瘜:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "鐧介櫠路鐞电惗:25TZ", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路鐞电惗", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "钃姳鎸", + nIcon = 13, + nTime = 5, + }, + }, + dwID = 42141, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szName = "鍙叉濇槑:25TZ", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "11,鐩茬溂琛濂;41,榄勮。琛鍍;60,琛鏌撴槬绉;71,璧ょ嫾琛;", + }, + { + nClass = 7, + nIcon = 13, + nTime = "5,P1姣掕娑屽嫊;45,P1姣掕娑屽嫊;75,P1姣掕娑屽嫊;107,P1姣掕娑屽嫊;135,P1姣掕娑屽嫊;", + }, + }, + dwID = 42168, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + szName = "鐏岃鎺岀祩", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏岃鎺岀祩榛", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 42190, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + nFrame = 67, + dwID = 42371, + }, + { + dwID = 42157, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩茬溂琛濂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42171, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璧ょ嫾琛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍤村瓭閫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42217, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滅儓鐒扮噹鍘熲濊硜鐧惧嫕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42230, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃褰辩禃濉碘濊但閫f鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42269, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶈硣绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [287] = { + { + dwID = 58859, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐐綀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58860, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙告櫞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58864, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鏅偡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58865, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鎶鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58866, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路澶栭槻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58867, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鍏ч槻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58880, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庝护闇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58881, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庝护闇灺峰垎韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58884, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮寮撴墜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58885, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭虫枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58886, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏煶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58921, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鍥炶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58941, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭虫枒鍣村皠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [212] = { + { + nFrame = 57, + dwID = 42696, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙叉濇槑:10TZ", + tCountdown = { + { + nIcon = 4504, + nTime = 5, + szName = "姣掕娑屽嫊", + nRefresh = 10, + nClass = 7, + }, + { + nIcon = 346, + nClass = 7, + nTime = "11,鐩茬溂琛濂;41,榄勮。琛鍍;69,琛鏌撴槬绉;71,璧ょ嫾琛;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42669, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路鐞电惗", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "閫g窔", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "鐧介櫠路鐞电惗:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42670, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路绠滅瘜", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 3401, + nTime = 8, + szName = "钃姳鎸", + nRefresh = 5, + nClass = 7, + }, + }, + szName = "鐧介櫠路绠滅瘜:10TZ", + }, + { + nFrame = 57, + dwID = 42700, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夐洦", + tRelation = { + bAll = true, + }, + }, + }, + szName = "瀹夐洦:10TZ", + tCountdown = { + { + nIcon = 346, + nClass = 7, + nTime = "45,鑱栫伀鐒氬煄;105,鑱栫伀妯婂煄;", + }, + }, + }, + { + szName = "鏂锋氮姘e媮:10TZ", + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 42688, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42665, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闃跨崹楣", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 8, + nTime = 17, + szName = "鎭愭嚰debuff", + nIcon = 346, + nClass = 7, + }, + }, + szName = "闃跨崹楣:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42666, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕礌鐖", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐑忕礌鐖:10TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42667, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙挋", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙挋:10TZ", + }, + { + dwID = 42685, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42697, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩茬溂琛濂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42699, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璧ょ嫾琛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42703, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楫鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堥瓊鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42713, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍤村瓭閫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42718, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏岃鎺岀祩榛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42736, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42745, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滅儓鐒扮噹鍘熲濊硜鐧惧嫕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42758, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃褰辩禃濉碘濊但閫f鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42797, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶈硣绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [299] = { + { + dwID = 60704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕储", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60707, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60715, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜煵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60718, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈崇┖鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60721, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绐佽ゲ杌嶇嫾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60726, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绶磋涔嬪ゴ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60727, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩蜂簜涔嬪ゴ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙備簜宸ㄩ狈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60769, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缍犵悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60783, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩浠や娇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [216] = { + { + [3] = { + bScreenHead = true, + }, + dwID = 45043, + nFrame = 47, + }, + }, + [218] = { + [6] = { + nFrame = 47, + dwID = 42890, + tCountdown = { + { + nClass = 3, + szName = "娴侀ⅷ浜旈f柆", + nIcon = 13, + nTime = 20, + }, + }, + }, + [2] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42884, + szNote = "澶栧姛娓涘偡", + szName = "澹伮峰娓涘偡", + }, + [3] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 42886, + szNote = "鍏у姛娓涘偡", + szName = "鐣屄峰収娓涘偡", + }, + [1] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42887, + szNote = "澧炲姞鏀绘搳", + szName = "鏀宦峰姞鏀", + }, + [4] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42883, + szNote = "鍙嶅綀鍌峰", + szName = "閺÷峰弽褰", + }, + [5] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 42885, + szNote = "琚(鍏у姛)鎿婂洖琛", + szName = "瀵峰洖琛", + }, + }, + [220] = { + { + dwID = 43110, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞堢劙闄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "鍒哄鍑虹従", + nIcon = 2589, + nTime = 70, + }, + { + nClass = 7, + nIcon = 2589, + nTime = "27,閫f柆;57,娉;", + }, + { + nClass = 7, + szName = "杩介瓊鍔嶆埃", + nIcon = 3443, + nTime = 67, + }, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 3, + szName = "鍒哄鍑虹従", + nIcon = 2589, + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43115, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榫嶅湒鍒哄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + tCountdown = { + { + nClass = 3, + szName = "鐮存暤", + nIcon = 4224, + nTime = 10, + }, + }, + szName = "鍗婃湀鍒姘", + dwID = 44553, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 45723, + }, + [16] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐣跺墠闆嗙伀鈽", + nTime = "20,鐣跺墠闆嗙伀鈽呭コ;40,鐣跺墠闆嗙伀鈽呯敺;60,鐣跺墠闆嗙伀鈽呭コ;80,鐣跺墠闆嗙伀鈽呯敺;100,鐣跺墠闆嗙伀鈽呭コ;120,鐣跺墠闆嗙伀鈽呯敺;140,鐣跺墠闆嗙伀鈽呭コ;160,鐣跺墠闆嗙伀鈽呯敺;180,鐣跺墠闆嗙伀鈽呭コ;200,鐣跺墠闆嗙伀鈽呯敺;220,鐣跺墠闆嗙伀鈽呭コ;240,鐣跺墠闆嗙伀鈽呯敺;260,鐣跺墠闆嗙伀鈽呭コ;280,鐣跺墠闆嗙伀鈽呯敺;300,鐣跺墠闆嗙伀鈽呭コ;320,鐣跺墠闆嗙伀鈽呯敺;340,鐣跺墠闆嗙伀鈽呭コ;360,鐣跺墠闆嗙伀鈽呯敺;380,鐣跺墠闆嗙伀鈽呭コ;400,鐣跺墠闆嗙伀鈽呯敺;420,鐣跺墠闆嗙伀鈽呭コ;440,鐣跺墠闆嗙伀鈽呯敺;460,鐣跺墠闆嗙伀鈽呭コ;480,鐣跺墠闆嗙伀鈽呯敺;500,鐣跺墠闆嗙伀鈽呭コ;520,鐣跺墠闆嗙伀鈽呯敺;540,鐣跺墠闆嗙伀鈽呭コ;560,鐣跺墠闆嗙伀鈽呯敺;580,鐣跺墠闆嗙伀鈽呭コ;600,鐣跺墠闆嗙伀鈽呯敺;620,鐣跺墠闆嗙伀鈽呭コ;640,鐣跺墠闆嗙伀鈽呯敺;660,鐣跺墠闆嗙伀鈽呭コ;680,鐣跺墠闆嗙伀鈽呯敺;700,鐣跺墠闆嗙伀鈽呭コ;720,鐣跺墠闆嗙伀鈽呯敺;740,鐣跺墠闆嗙伀鈽呭コ;760,鐣跺墠闆嗙伀鈽呯敺;780,鐣跺墠闆嗙伀鈽呭コ;800,鐣跺墠闆嗙伀鈽呯敺;820,鐣跺墠闆嗙伀鈽呭コ;840,鐣跺墠闆嗙伀鈽呯敺;860,鐣跺墠闆嗙伀鈽呭コ;880,鐣跺墠闆嗙伀鈽呯敺;900,鐣跺墠闆嗙伀鈽呭コ;", + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43118, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囧崄涓夊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [17] = { + tCountdown = { + { + nClass = 3, + szName = "婧栧倷闆嗙伀鈽呭叓鑽掗櫍鐪尖槄", + nIcon = 2028, + nTime = 10, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43121, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏崚闄g溂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 45721, + }, + [18] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 43120, + nFrame = 57, + }, + [31] = { + dwID = 46220, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮甸棞姣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [5] = { + nFrame = 57, + dwID = 44543, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + nTime = "6,鍗婃湀;105,姘e牬娑堝け;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "4,鏂祦鍔嵚峰緤;18,鏂祦鍔嵚锋粎;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,灞呭悎;42,灞呭悎;54,灞呭悎路鎺;62,鏂祦鍔嶆埃鍫;", + }, + }, + szName = "鏂祦鍔", + }, + [10] = { + dwID = 43720, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣憭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [20] = { + dwID = 44591, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [30] = { + dwID = 46219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙ゅ畾闊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 45036, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓榧撲綔姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠茶櫅蹇", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43869, + tCountdown = { + { + nClass = 7, + nIcon = 2123, + nTime = "11,绱噾缂;", + }, + }, + }, + [22] = { + dwID = 45259, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜姳涔嬪垉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "妫節宓", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43323, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,灞呭悎;19,灞呭悎;29,鏂祦鍔嶆埃鍫;", + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 44588, + nFrame = 57, + }, + [12] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱噾缂", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43959, + nFrame = 57, + }, + [24] = { + dwID = 46203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬婅暕鐨勯构榄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + nFrame = 57, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + szName = "鐩稿鍔嶇墷", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩稿鍔嶇墷", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43127, + }, + [25] = { + dwID = 46211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涘北鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓夌挵閷潠", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43868, + nFrame = 57, + }, + [26] = { + dwID = 46214, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮靛啲鎭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [27] = { + dwID = 46215, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬫兢娓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 45720, + }, + [14] = { + nFrame = 57, + dwID = 43966, + szName = "娑呮缍", + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 28, + szName = "涓夌挵閷潠", + nRefresh = 30, + nClass = 3, + }, + { + nClass = 3, + szName = "娑呮缍", + nIcon = 2589, + nTime = 45, + }, + }, + }, + [28] = { + dwID = 46216, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闄抽彙鍎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [23] = { + dwID = 46149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闁荤磱闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [29] = { + dwID = 46217, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閯窘鐒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣挊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + dwID = 43117, + }, + }, + [143] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵吢蜂腑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸陈风湡韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嶇綈路鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╀竴鏁欏ぇ绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忚硦闆呭厠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [46] = { + { + dwID = 6408, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椁愰ⅷ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6420, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩﹁槶姝﹀儳闋洰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐕庡師", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6431, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞崇瓑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6435, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍚為洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6436, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬫捣閵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6451, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋茬伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6454, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎺岀伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6455, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閹儭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 6456, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈辩櫢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7602, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗冩墜瑙闊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7686, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃垜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 7687, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒$浉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [228] = { + { + dwID = 46663, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栬呭妽鎰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 46676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬭呭妽鎰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [230] = { + [13] = { + dwID = 47145, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹犅峰够", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "銆愮櫧闆层戞墦鏂", + nFrame = 0, + nClass = 3, + }, + }, + }, + [1] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "鍝佺鏇", + nTime = "84,鍝佺鏇;123,闊崇簭;163,闊崇簭;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "婧栧倷QTE", + nTime = "22,婧栧倷QTE;62,婧栧倷QTE;167,骞婚瓟鍟忓績鏇;", + }, + }, + dwID = 47147, + }, + [2] = { + dwID = 47144, + tCountdown = { + { + nClass = 3, + szName = "闊崇簭娑堝け", + nIcon = 2589, + nTime = 14, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑾洦", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,鍒嗗窛鎵嬄锋帓娴;26,鍒嗗窛鎵嬄锋帓娴;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,婧栧倷杞塒2;0.35,婧栧倷杞塒2;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,鎯呯窉澶辨帶;65,閹崉鐪;", + }, + }, + dwID = 47101, + }, + [8] = { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣涙瘺", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47109, + }, + [9] = { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙汉", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47110, + }, + [5] = { + nFrame = 47, + tCountdown = { + { + nIcon = 327, + key = "鐭ュ績鐏秷澶", + nTime = 20, + szName = "鐭ュ績鐏秷澶", + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47106, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭ュ績鐏帶鍒", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鎺у埗", + szName = "鐭ュ績鐏", + }, + [10] = { + dwID = 47097, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣櫧", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,琛岃垷;21,琛岃垷;34,琛岃垷;", + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.75,婧栧倷閫插叆P2;0.45,婧栧倷閫插叆P3;", + }, + { + nClass = 7, + szName = "浜屽紡路鐧绘〒", + nIcon = 2589, + nTime = 44, + }, + }, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 47120, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞婚瓟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "骞婚瓟闄勯珨", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47123, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 13, + szName = "銆愬妽銆戞墦鏂", + nFrame = 7, + nClass = 3, + }, + }, + }, + [12] = { + tCountdown = { + { + nClass = 3, + szName = "闈掕摦瀛愬妽", + nIcon = 13, + nTime = 50, + }, + }, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 47118, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈掕摦瀛愬妽", + tRelation = { + bAll = true, + }, + }, + }, + szName = "P3闈掕摦瀛愬妽", + nFrame = 52, + }, + [11] = { + nFrame = 57, + dwID = 47117, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,琛岃垷;15,琛岃垷;23,琛岃垷;", + }, + { + nClass = 4, + nTime = 28, + szName = "绾", + nIcon = 3404, + nFrame = 8, + }, + [4] = { + nClass = 4, + szName = "涓冨紡路韪忔瓕", + nIcon = 2589, + nTime = 40, + }, + [3] = { + nIcon = 2589, + key = "鏄犳棩", + nTime = 0, + szName = "鏄犳棩", + nClass = 4, + }, + }, + }, + }, + [232] = { + { + dwID = 47435, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "26,閫f柆;56,娉;", + }, + { + nClass = 7, + szName = "鍒哄鍑虹従", + nIcon = 2589, + nTime = 70, + }, + { + nClass = 7, + szName = "杩介瓊鍔嶆埃", + nIcon = 3443, + nTime = 65, + }, + }, + }, + { + dwID = 47176, + tCountdown = { + { + nIcon = 2589, + nClass = 3, + szName = "鍒哄鍑虹従", + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + szName = "鏂祦鍔", + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "27,灞呭悎;42,灞呭悎;54,灞呭悎路鎺;62,鏂祦鍔嶆埃鍫;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "4,鏂祦鍔嵚峰緤;18,鏂祦鍔嵚锋粎;", + }, + { + nClass = 3, + nIcon = 2589, + nTime = "6,鍗婃湀;105,姘e牬娑堝け;", + }, + }, + dwID = 47218, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + nFrame = 57, + dwID = 47362, + }, + [16] = { + nFrame = 57, + dwID = 47276, + szName = "娑呮缍3", + }, + [17] = { + nFrame = 57, + dwID = 43966, + szName = "娑呮缍2", + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47364, + }, + [18] = { + nFrame = 57, + dwID = 47208, + szName = "娑呮缍1", + }, + [5] = { + nFrame = 57, + szName = "鍗婃湀鍒姘", + tCountdown = { + { + nClass = 3, + szName = "鐮存暤", + nIcon = 4224, + nTime = 10, + }, + }, + dwID = 47272, + }, + [10] = { + nFrame = 47, + dwID = 47611, + }, + [20] = { + tCountdown = { + { + nIcon = 2589, + nClass = 7, + key = "鐣跺墠闆嗙伀鈽", + nTime = "20,鐣跺墠闆嗙伀鈽呭コ;40,鐣跺墠闆嗙伀鈽呯敺;60,鐣跺墠闆嗙伀鈽呭コ;80,鐣跺墠闆嗙伀鈽呯敺;100,鐣跺墠闆嗙伀鈽呭コ;120,鐣跺墠闆嗙伀鈽呯敺;140,鐣跺墠闆嗙伀鈽呭コ;160,鐣跺墠闆嗙伀鈽呯敺;180,鐣跺墠闆嗙伀鈽呭コ;200,鐣跺墠闆嗙伀鈽呯敺;220,鐣跺墠闆嗙伀鈽呭コ;240,鐣跺墠闆嗙伀鈽呯敺;260,鐣跺墠闆嗙伀鈽呭コ;280,鐣跺墠闆嗙伀鈽呯敺;300,鐣跺墠闆嗙伀鈽呭コ;320,鐣跺墠闆嗙伀鈽呯敺;340,鐣跺墠闆嗙伀鈽呭コ;360,鐣跺墠闆嗙伀鈽呯敺;380,鐣跺墠闆嗙伀鈽呭コ;400,鐣跺墠闆嗙伀鈽呯敺;420,鐣跺墠闆嗙伀鈽呭コ;440,鐣跺墠闆嗙伀鈽呯敺;460,鐣跺墠闆嗙伀鈽呭コ;480,鐣跺墠闆嗙伀鈽呯敺;500,鐣跺墠闆嗙伀鈽呭コ;520,鐣跺墠闆嗙伀鈽呯敺;540,鐣跺墠闆嗙伀鈽呭コ;560,鐣跺墠闆嗙伀鈽呯敺;580,鐣跺墠闆嗙伀鈽呭コ;600,鐣跺墠闆嗙伀鈽呯敺;620,鐣跺墠闆嗙伀鈽呭コ;640,鐣跺墠闆嗙伀鈽呯敺;660,鐣跺墠闆嗙伀鈽呭コ;680,鐣跺墠闆嗙伀鈽呯敺;700,鐣跺墠闆嗙伀鈽呭コ;720,鐣跺墠闆嗙伀鈽呯敺;740,鐣跺墠闆嗙伀鈽呭コ;760,鐣跺墠闆嗙伀鈽呯敺;780,鐣跺墠闆嗙伀鈽呭コ;800,鐣跺墠闆嗙伀鈽呯敺;820,鐣跺墠闆嗙伀鈽呭コ;840,鐣跺墠闆嗙伀鈽呯敺;860,鐣跺墠闆嗙伀鈽呭コ;880,鐣跺墠闆嗙伀鈽呯敺;900,鐣跺墠闆嗙伀鈽呭コ;", + }, + }, + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47463, + }, + [21] = { + nFrame = 57, + dwID = 47206, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "婧栧倷闆嗙伀鈽呭叓鑽掗櫍鐪尖槄", + nIcon = 2028, + nTime = 9, + }, + }, + }, + [11] = { + dwID = 47536, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2123, + nTime = "11,绱噾缂;", + }, + }, + }, + [22] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47205, + }, + [3] = { + dwID = 47479, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,灞呭悎;19,灞呭悎;29,鏂祦鍔嶆埃鍫;", + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47283, + nFrame = 57, + }, + [12] = { + tCountdown = { + { + szName = "涓榧撲綔姘f秷澶", + nClass = 3, + nIcon = 2589, + nTime = 15, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 47288, + [4] = { + bBigFontAlarm = true, + }, + nFrame = 57, + }, + [13] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47202, + }, + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47361, + }, + [14] = { + tCountdown = { + { + szName = "绱噾婊", + nClass = 3, + nIcon = 3398, + nTime = 25, + }, + }, + nFrame = 57, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47256, + }, + [19] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 47448, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47225, + nFrame = 57, + }, + }, + [234] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞堢劙闄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐐搳", + nTime = "25,閫f柆;70,绠;", + }, + { + nIcon = 2589, + nClass = 7, + key = "鍒哄灏忔", + nTime = "81,鍒哄灏忔;161,鍒哄灏忔;241,鍒哄灏忔;321,鍒哄灏忔;401,鍒哄灏忔;481,鍒哄灏忔;561,鍒哄灏忔;641,鍒哄灏忔;", + }, + [4] = { + nIcon = 3293, + key = "榫嶅湒鐐搳", + nTime = 75, + szName = "榫嶅湒鐐搳", + nFrame = 8, + nClass = 7, + }, + [3] = { + nIcon = 2589, + key = "鍒哄灏忔", + nTime = 0, + szName = "鍒哄灏忔", + nClass = 12, + }, + }, + dwID = 48269, + }, + { + nFrame = 57, + col = { + 255, + 2, + 208, + }, + dwID = 48271, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szName = "绠", + tCountdown = { + { + nClass = 3, + szName = "绠", + nIcon = 2589, + nTime = 70, + }, + }, + }, + { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榫嶅湒鍒哄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48270, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "妫節宓", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,灞呭悎;19,灞呭悎;29,鏂祦鍔嶆埃鍫;", + }, + }, + dwID = 48289, + }, + { + nFrame = 57, + dwID = 48315, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "6,鍗婃湀;105,姘e牬娑堝け;", + }, + { + nClass = 4, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "4,鏂祦鍔嵚峰緤;18,鏂祦鍔嵚锋粎;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,灞呭悎;42,灞呭悎;54,灞呭悎路鎺;62,鏂祦鍔嶆埃鍫;", + }, + }, + szName = "鏂祦鍔", + }, + { + nFrame = 57, + dwID = 48323, + szName = "鍗婃湀鍒姘", + tCountdown = { + { + nClass = 3, + szName = "鐮存暤", + nIcon = 4224, + nTime = 10, + }, + }, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48326, + }, + { + nFrame = 47, + dwID = 48408, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠茶櫅蹇", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,绱噾缂;62,涓夌挵閷潠;", + }, + }, + dwID = 48300, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱噾缂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48304, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓夌挵閷潠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48299, + }, + { + szName = "娑呮缍", + dwID = 48306, + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣挊", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48272, + nFrame = 47, + }, + { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48273, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囧崄涓夊", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐣跺墠闆嗙伀鈽", + nTime = "20,鐣跺墠闆嗙伀鈽呭コ;40,鐣跺墠闆嗙伀鈽呯敺;60,鐣跺墠闆嗙伀鈽呭コ;80,鐣跺墠闆嗙伀鈽呯敺;100,鐣跺墠闆嗙伀鈽呭コ;120,鐣跺墠闆嗙伀鈽呯敺;140,鐣跺墠闆嗙伀鈽呭コ;160,鐣跺墠闆嗙伀鈽呯敺;180,鐣跺墠闆嗙伀鈽呭コ;200,鐣跺墠闆嗙伀鈽呯敺;220,鐣跺墠闆嗙伀鈽呭コ;240,鐣跺墠闆嗙伀鈽呯敺;260,鐣跺墠闆嗙伀鈽呭コ;280,鐣跺墠闆嗙伀鈽呯敺;300,鐣跺墠闆嗙伀鈽呭コ;320,鐣跺墠闆嗙伀鈽呯敺;340,鐣跺墠闆嗙伀鈽呭コ;360,鐣跺墠闆嗙伀鈽呯敺;380,鐣跺墠闆嗙伀鈽呭コ;400,鐣跺墠闆嗙伀鈽呯敺;420,鐣跺墠闆嗙伀鈽呭コ;440,鐣跺墠闆嗙伀鈽呯敺;460,鐣跺墠闆嗙伀鈽呭コ;480,鐣跺墠闆嗙伀鈽呯敺;500,鐣跺墠闆嗙伀鈽呭コ;520,鐣跺墠闆嗙伀鈽呯敺;540,鐣跺墠闆嗙伀鈽呭コ;560,鐣跺墠闆嗙伀鈽呯敺;580,鐣跺墠闆嗙伀鈽呭コ;600,鐣跺墠闆嗙伀鈽呯敺;620,鐣跺墠闆嗙伀鈽呭コ;640,鐣跺墠闆嗙伀鈽呯敺;660,鐣跺墠闆嗙伀鈽呭コ;680,鐣跺墠闆嗙伀鈽呯敺;700,鐣跺墠闆嗙伀鈽呭コ;720,鐣跺墠闆嗙伀鈽呯敺;740,鐣跺墠闆嗙伀鈽呭コ;760,鐣跺墠闆嗙伀鈽呯敺;780,鐣跺墠闆嗙伀鈽呭コ;800,鐣跺墠闆嗙伀鈽呯敺;820,鐣跺墠闆嗙伀鈽呭コ;840,鐣跺墠闆嗙伀鈽呯敺;860,鐣跺墠闆嗙伀鈽呭コ;880,鐣跺墠闆嗙伀鈽呯敺;900,鐣跺墠闆嗙伀鈽呭コ;", + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 48276, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏崚闄g溂", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "婧栧倷闆嗙伀鈽呭叓鑽掗櫍鐪尖槄", + nIcon = 2028, + nTime = 9, + }, + }, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 48275, + }, + { + dwID = 48280, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩稿鍔嶇墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48290, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣憭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48328, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48386, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓榧撲綔姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48399, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜姳涔嬪垉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48413, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [236] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞堢劙闄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐐搳", + nTime = "25,閫f柆;60,绠;", + }, + { + nClass = 7, + key = "榫嶅湒鐐搳", + nTime = 75, + szName = "榫嶅湒鐐搳", + nFrame = 8, + nIcon = 3293, + }, + { + nIcon = 2589, + nClass = 7, + key = "鍒哄灏忔", + nTime = "70,鍒哄灏忔;141,鍒哄灏忔;211,鍒哄灏忔;281,鍒哄灏忔;351,鍒哄灏忔;421,鍒哄灏忔;", + }, + }, + dwID = 48481, + }, + { + nFrame = 57, + col = { + 255, + 2, + 233, + }, + dwID = 48487, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = true, + }, + }, + szName = "绠", + tCountdown = { + { + nClass = 3, + szName = "绠", + nIcon = 2589, + nTime = 60, + }, + }, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "妫節宓", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,灞呭悎;19,灞呭悎;29,鏂祦鍔嶆埃鍫;", + }, + }, + dwID = 48503, + }, + [8] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48609, + nFrame = 57, + }, + [16] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓夌挵閷潠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48531, + }, + [17] = { + nFrame = 57, + szName = "娑呮缍", + dwID = 48582, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48667, + nFrame = 57, + }, + [18] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣挊", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48488, + nFrame = 47, + }, + [5] = { + szName = "鏂祦鍔", + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "6,鍗婃湀;92,姘e牬娑堝け;", + }, + { + nClass = 4, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "4,鏂祦鍔嵚峰緤;18,鏂祦鍔嵚锋粎;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,灞呭悎;42,灞呭悎;54,灞呭悎路鎺;62,鏂祦鍔嶆埃鍫;", + }, + }, + nFrame = 57, + dwID = 48524, + }, + [10] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48670, + nFrame = 57, + }, + [20] = { + tCountdown = { + { + nClass = 3, + szName = "婧栧倷闆嗙伀鈽呭叓鑽掗櫍鐪尖槄", + nIcon = 2028, + nTime = 9, + }, + { + nClass = 3, + szName = "鐢稡OSS婊胯棈", + nIcon = 13, + nTime = 35, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 48512, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏崚闄g溂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [21] = { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 48511, + nFrame = 57, + }, + [11] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48668, + nFrame = 57, + }, + [22] = { + dwID = 48493, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣憭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榫嶅湒鍒哄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48482, + }, + [6] = { + dwID = 48578, + nFrame = 57, + tCountdown = { + { + nClass = 3, + szName = "鐮存暤&钀", + nIcon = 4224, + nTime = 10, + }, + }, + szName = "鍗婃湀", + }, + [12] = { + nFrame = 47, + dwID = 48665, + }, + [24] = { + dwID = 48594, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓榧撲綔姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜姳涔嬪垉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48508, + }, + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 48589, + nFrame = 57, + }, + [14] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠茶櫅蹇", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,绱噾缂;70,涓夌挵閷潠;", + }, + }, + dwID = 48532, + }, + [23] = { + dwID = 48538, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩稿鍔嶇墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48495, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囧崄涓夊", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐣跺墠闆嗙伀鈽", + nTime = "20,鐣跺墠闆嗙伀鈽呭コ;40,鐣跺墠闆嗙伀鈽呯敺;60,鐣跺墠闆嗙伀鈽呭コ;80,鐣跺墠闆嗙伀鈽呯敺;100,鐣跺墠闆嗙伀鈽呭コ;120,鐣跺墠闆嗙伀鈽呯敺;140,鐣跺墠闆嗙伀鈽呭コ;160,鐣跺墠闆嗙伀鈽呯敺;180,鐣跺墠闆嗙伀鈽呭コ;200,鐣跺墠闆嗙伀鈽呯敺;220,鐣跺墠闆嗙伀鈽呭コ;240,鐣跺墠闆嗙伀鈽呯敺;260,鐣跺墠闆嗙伀鈽呭コ;280,鐣跺墠闆嗙伀鈽呯敺;300,鐣跺墠闆嗙伀鈽呭コ;320,鐣跺墠闆嗙伀鈽呯敺;340,鐣跺墠闆嗙伀鈽呭コ;360,鐣跺墠闆嗙伀鈽呯敺;380,鐣跺墠闆嗙伀鈽呭コ;400,鐣跺墠闆嗙伀鈽呯敺;420,鐣跺墠闆嗙伀鈽呭コ;440,鐣跺墠闆嗙伀鈽呯敺;460,鐣跺墠闆嗙伀鈽呭コ;480,鐣跺墠闆嗙伀鈽呯敺;500,鐣跺墠闆嗙伀鈽呭コ;520,鐣跺墠闆嗙伀鈽呯敺;540,鐣跺墠闆嗙伀鈽呭コ;560,鐣跺墠闆嗙伀鈽呯敺;580,鐣跺墠闆嗙伀鈽呭コ;600,鐣跺墠闆嗙伀鈽呯敺;620,鐣跺墠闆嗙伀鈽呭コ;640,鐣跺墠闆嗙伀鈽呯敺;660,鐣跺墠闆嗙伀鈽呭コ;680,鐣跺墠闆嗙伀鈽呯敺;700,鐣跺墠闆嗙伀鈽呭コ;720,鐣跺墠闆嗙伀鈽呯敺;740,鐣跺墠闆嗙伀鈽呭コ;760,鐣跺墠闆嗙伀鈽呯敺;780,鐣跺墠闆嗙伀鈽呭コ;800,鐣跺墠闆嗙伀鈽呯敺;820,鐣跺墠闆嗙伀鈽呭コ;840,鐣跺墠闆嗙伀鈽呯敺;860,鐣跺墠闆嗙伀鈽呭コ;880,鐣跺墠闆嗙伀鈽呯敺;900,鐣跺墠闆嗙伀鈽呭コ;", + }, + }, + }, + [15] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱噾缂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 48562, + }, + }, + [347] = { + { + dwID = 62195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62672, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀闅遍亖鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62673, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀娈夐亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62674, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀瀵╁垽鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62675, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀鎻ず鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62677, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀澶у姏澹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62701, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62794, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀绲愭櫠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娴佺伀鍖栬潬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [240] = { + { + dwID = 51004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堣彲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51060, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌崇穻鍚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿嬬悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51068, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绔犵伆鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51096, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏇圭値鐑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51102, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "棰ㄧ悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51103, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩藉懡绠煝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌堢湢棰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51219, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鎮嶅皣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51385, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐛ㄥ鍏堢敓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51389, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51947, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮瀹堝倷瀹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 51978, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏁︽暒鏁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52210, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 52336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐐歌棩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53712, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥骞诲奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [242] = { + { + nFrame = 47, + dwID = 51211, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.99,鎷変汉,15;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,鍒嗘暎&婧栧倷榛炲悕,33;", + }, + }, + }, + { + nFrame = 47, + dwID = 51334, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "4,闈㈠悜AOE;13,AOE鍦;23,榫嶅嵎棰;31,姘e牬;", + }, + }, + }, + [4] = { + nFrame = 47, + dwID = 51352, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.90,闇滃嵃婧栧倷;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.50,AOE鍦堟簴鍌;", + }, + }, + }, + [3] = { + nFrame = 57, + dwID = 51346, + tCountdown = { + { + nIcon = 13, + nTime = 28, + szName = "榫嶅嵎棰ㄦ秷澶", + nFrame = 1, + nClass = 3, + }, + }, + szName = "榫嶅嵎棰", + }, + }, + [244] = { + [2] = { + nFrame = 47, + dwID = 51601, + tCountdown = { + { + nClass = 7, + nIcon = 13, + nTime = "4,闈㈠悜AOE;13,AOE鍦;23,榫嶅嵎棰;31,姘e牬;", + }, + }, + }, + [3] = { + tCountdown = { + { + nFrame = 1, + nTime = 28, + szName = "榫嶅嵎棰ㄦ秷澶", + nIcon = 13, + nClass = 3, + }, + }, + nFrame = 57, + szName = "榫嶅嵎棰", + dwID = 51619, + }, + [1] = { + nFrame = 47, + dwID = 51632, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.32,婧栧倷绔欐▉鎵;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,鎷変汉,15;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.99,鍒嗘暎&婧栧倷榛炲悕,33;", + }, + }, + }, + [4] = { + nFrame = 47, + dwID = 51631, + tCountdown = { + { + nClass = 6, + nIcon = 13, + nTime = "0.90,闇滃嵃婧栧倷;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.50,AOE鍦堟簴鍌;", + }, + }, + }, + [5] = { + nFrame = 57, + szName = "鍐板", + dwID = 51665, + [3] = { + bScreenHead = true, + }, + }, + }, + [62] = { + { + dwID = 7448, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶фü", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [248] = { + { + dwID = 53813, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堣彲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53817, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌崇穻鍚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53823, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿嬬悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53825, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绔犵伆鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53826, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏇圭値鐑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53832, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "棰ㄧ悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53833, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩藉懡绠煝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53837, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌堢湢棰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53842, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鎮嶅皣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53851, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐛ㄥ鍏堢敓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53855, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53897, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮瀹堝倷瀹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53911, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏁︽暒鏁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53941, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53959, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐐歌棩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 53984, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥骞诲奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [119] = { + { + dwID = 14001, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎱曞閲庣嫄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14002, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娈烽潚绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14004, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲岃丹姊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14005, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囪矟寰峰搱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [118] = { + { + dwID = 14020, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎱曞閲庣嫄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14021, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娈烽潚绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14023, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲岃丹姊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14024, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囪矟寰峰搱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [117] = { + { + dwID = 13962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎱曞閲庣嫄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13963, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娈烽潚绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13965, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲岃丹姊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13966, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囪矟寰峰搱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [264] = { + { + dwID = 55513, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌抽笧鏃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55519, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闆烽鐛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55585, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞诲榄斿奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55657, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 55972, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏌崇宀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56013, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈ㄦ潗鈫掗噾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56015, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍚堥噾濉娾啋鐏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56016, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掓按鐭斥啋鍦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "纭:宀┾啋姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56018, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦熷鈫掓湪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56022, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闆锋憾鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 56783, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娉曞仴鍏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [283] = { + { + dwID = 57245, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍫变節妤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57257, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍖栫窘铦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57407, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忛潏棰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57428, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸ㄨ渹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57463, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍞愭浉闆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57502, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涔熸紶娌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸ㄦ湪绌垮埡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57664, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃敮绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58231, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閫e缉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲嶅缉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [133] = { + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 83, + szName = "钀瘨濂旈ò", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bCenterAlarm = true, + }, + dwID = 18394, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 55, + szName = "涓嬩竴娆℃瘨鐞冩帀钀", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + }, + dwID = 18396, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣掔悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 36, + szName = "绗竴娆¤牨姣掗粸鍚", + nRefresh = 10, + nClass = 7, + }, + }, + dwID = 18386, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐟储", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,闇哥帇铔;20,绌鸿胺娓呴熁;30,鍣剤锠;45,闇哥帇铔;55,绌鸿胺娓呴熁;65,鍣剤锠;70,闇哥帇铔;80,绌鸿胺娓呴熁;90,鍣剤锠;105,闇哥帇铔;115,绌鸿胺娓呴熁;125,鍣剤锠;130,闇哥帇铔;140,绌鸿胺娓呴熁;150,鍣剤锠;165,闇哥帇铔;175,绌鸿胺娓呴熁;185,鍣剤锠;190,闇哥帇铔;200,绌鸿胺娓呴熁;210,鍣剤锠;225,闇哥帇铔;235,绌鸿胺娓呴熁;245,鍣剤锠;250,闇哥帇铔;260,绌鸿胺娓呴熁;270,鍣剤锠;285,闇哥帇铔;295,绌鸿胺娓呴熁;305,鍣剤锠;", + }, + }, + dwID = 18370, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忚挋璨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7,绗竴鎵硅琛;", + }, + }, + dwID = 18369, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱㈢瑳鐖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,澶╅緧杩撮ⅷ;35,榫嶈铏庢;50,澶╅緧杩撮ⅷ;65,榫嶈铏庢;75,澶╅緧杩撮ⅷ;85,榫嶆巸鍏崚;135,澶╅緧杩撮ⅷ;150,榫嶈铏庢;165,澶╅緧杩撮ⅷ;180,榫嶈铏庢;190,澶╅緧杩撮ⅷ;200,榫嶆巸鍏崚;250,澶╅緧杩撮ⅷ;265,榫嶈铏庢;280,澶╅緧杩撮ⅷ;295,榫嶈铏庢;305,澶╅緧杩撮ⅷ;315,榫嶆巸鍏崚;365,澶╅緧杩撮ⅷ;380,榫嶈铏庢;395,澶╅緧杩撮ⅷ;410,榫嶈铏庢;420,澶╅緧杩撮ⅷ;430,榫嶆巸鍏崚", + }, + }, + dwID = 17406, + }, + { + nFrame = 52, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗椾箣闆风", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,闆锋秾;40,鎺冨皠;61,鎺冨皠绲愭潫;81,鎺冨皠;102,鎺冨皠绲愭潫;114,闆锋秾;123,璨煎湴闆绘祦;180,闆锋秾;195,鎺冨皠;216,鎺冨皠绲愭潫;236,鎺冨皠;257,鎺冨皠绲愭潫;269,闆锋秾;278,璨煎湴闆绘祦;335,闆锋秾;350,鎺冨皠;371,鎺冨皠绲愭潫;391,鎺冨皠;412,鎺冨皠绲愭潫;424,闆锋秾;433,璨煎湴闆绘祦", + }, + }, + dwID = 17328, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闄稿皨", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "30,闆欑溂鏀惧嚭瀵掑厜;35,濂旂嫾韪忔湀寮;65,闆欑溂鏀惧嚭瀵掑厜;70,濂旂嫾韪忔湀寮;100,闆欑溂鏀惧嚭瀵掑厜;105,濂旂嫾韪忔湀寮;135,闆欑溂鏀惧嚭瀵掑厜;140,濂旂嫾韪忔湀寮;170,闆欑溂鏀惧嚭瀵掑厜;175,濂旂嫾韪忔湀寮;205,闆欑溂鏀惧嚭瀵掑厜;210,濂旂嫾韪忔湀寮;240,闆欑溂鏀惧嚭瀵掑厜;245,濂旂嫾韪忔湀寮", + }, + }, + dwID = 17321, + }, + { + dwID = 17292, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姝﹂搁潚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17293, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑳¢焹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╄洓宸ㄥ睄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17378, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閱夎洓鑰佷汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17382, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐡风綈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17417, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掗浄鍐伴帠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗冪瀛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17576, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忛偑瀛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17654, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁緧娼贰瀹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18372, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闇哥帇铔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18377, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁緧娼個鍎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [68] = { + { + dwID = 8117, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐗′腹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 8147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "琛鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 10570, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堟埃鍏у姏绲愮晫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 11142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐ヨ姳閫h垶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 11674, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗撳〾娓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [-1] = { + { + [3] = { + bTeamChannel = true, + }, + dwID = 11734, + nFrame = 47, + }, + { + nFrame = 67, + [3] = { + bScreenHead = true, + }, + dwID = 51501, + }, + }, + [70] = { + { + dwID = 13479, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "琛鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 13540, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐ヨ姳閫h垶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [407] = { + { + dwID = 65836, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧芥搏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65839, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎮夐仈缇呮懇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65840, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏇规叾鍙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65844, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楝奸绁熺鐨勫紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65847, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰㈣贰鍙枒鐨勬捣瀵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [72] = { + [13] = { + dwID = 14970, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗撳〾娓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 35, + szName = "涓嬩竴娆¤窇鍦堟簴鍌", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 14941, + }, + [1] = { + [3] = { + bCenterAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 67, + dwID = 13479, + }, + [2] = { + [3] = { + bCenterAlarm = true, + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "琛鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 67, + dwID = 14901, + }, + [4] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "闄版ц鐜", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 13546, + }, + [8] = { + tCountdown = { + { + nIcon = 346, + nTime = 13, + szName = "缍彁鍚犻仈鐗瑰ぉ缃板妽", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + bCenterAlarm = true, + }, + dwID = 14897, + szName = "澶╃桨鍔嶁槄25YX", + nFrame = 52, + }, + [9] = { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + nTime = 42, + szName = "鎹嗙笡绁張", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "鎹嗙笡绁張锛堣嫳闆勶級", + dwID = 14899, + }, + [5] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "琛濉楅ⅷ鏆", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14966, + }, + [10] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 54, + szName = "鐦嬬媯绁徃", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 15188, + }, + [3] = { + nFrame = 67, + tCountdown = { + { + nIcon = 346, + nTime = 56, + szName = "闄版ц鐜", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14968, + }, + [6] = { + tCountdown = { + { + nIcon = 346, + nTime = 31, + szName = "鍐ヨ姳閫h垶", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bCenterAlarm = true, + }, + dwID = 14962, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐ヨ姳閫h垶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [12] = { + dwID = 14943, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堟埃鍏у姏绲愮晫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 8117, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐗′腹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [145] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵吢蜂腑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸陈风湡韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嶇綈路鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╀竴鏁欏ぇ绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忚硦闆呭厠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [147] = { + { + dwID = 17616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵吢蜂腑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 17619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸陈风湡韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嶇綈路鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╀竴鏁欏ぇ绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 18156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忚硦闆呭厠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [109] = { + { + dwID = 12171, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎱曞閲庣嫄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娈烽潚绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12241, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲岃丹姊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 12249, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囪矟寰峰搱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [300] = { + { + dwID = 59995, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞诲康鍔嶆埃", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60003, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堣彲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60028, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦板埡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60061, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍥扮嵏鍥氱睜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忓鍟", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60067, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈堟硥娣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60093, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钃勭⿳鐨勫収鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐伴珦姣掔垎褰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60119, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏆楁湀琛鐞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60133, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴勬剤鑿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧炬厱鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞藉啣绂侀尞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [355] = { + { + dwID = 63845, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏂囬枏涓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63851, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "灏圭劇鍜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63852, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "灏圭劇鍜庡績榄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63855, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "榄斿康", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63861, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "閫g帀鑹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63864, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "绌嗙巹鑻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [155] = { + [13] = { + dwID = 20386, + nFrame = 57, + }, + [7] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 62, + szName = "鐙奸瓊", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 20492, + }, + [1] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "鍕曠墿鍑虹従", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21257, + }, + [2] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "鍕曠墿鍑虹従", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21256, + }, + [4] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,闅ㄦ鎶鑳;30,鍕曠墿鍑虹従;40,闅ㄦ鎶鑳;60,琚炵煶鎶曟摬;65,鎬掔伀鐚涙搳;85,鑷村懡鏍兼搵;105,闅ㄦ鎶鑳;125,闅ㄦ鎶鑳;145,琚炵煶鎶曟摬;150,鎬掔伀鐚涙搳;170,鑷村懡鏍兼搵;190,闅ㄦ鎶鑳;210,闅ㄦ鎶鑳;230,琚炵煶鎶曟摬;235,鎬掔伀鐚涙搳;255,鑷村懡鏍兼搵;275,闅ㄦ鎶鑳;295,闅ㄦ鎶鑳;315,琚炵煶鎶曟摬;320,鎬掔伀鐚涙搳;340,鑷村懡鏍兼搵;360,闅ㄦ鎶鑳;", + }, + }, + dwID = 21601, + }, + [8] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 10, + szName = "鐏悆鑷垎鍊掕▓鏅", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 19056, + }, + [9] = { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 120, + szName = "P2鍓╅鏅傞枔", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 20419, + }, + [5] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,绗竴娆℃妧鑳;70,绗竴娆$墷绫;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.71,0.7,0.31,0.3,0.21,0.2", + }, + }, + dwID = 21595, + }, + [10] = { + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,鍏儴娴睜;", + }, + }, + szName = "钑矙锛堣嫳闆勶級", + dwID = 20273, + }, + [14] = { + dwID = 20562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎭愭栬檿鍒戜汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 50, + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "鍕曠墿鍑虹従", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 21255, + }, + [6] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "10,绗竴娆$嫾榄;", + }, + }, + dwID = 20280, + }, + [12] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "6,绗竴娉㈡嘲鎷虫墜x2鍑虹従;11,绗竴娉㈡鏂у叺x1鍑虹従;20,缍犵悆鍑虹従;30,绱呯悆鍑虹従;45,绗簩娉㈡嘲鎷虫墜x3鍑虹従;50,绗簩娉㈡鏂у叺x2鍑虹従;60,缍犵悆鍑虹従;70,绱呯悆鍑虹従;84,绗笁娉㈡嘲鎷虫墜x3鍑虹従;89,绗笁娉㈡鏂у叺x2鍑虹従;100,缍犵悆鍑虹従;110,绱呯悆鍑虹従;123,绗洓娉㈡嘲鎷虫墜x2鍑虹従;128,绗洓娉㈡鏂у叺x1鍑虹従;140,缍犵悆鍑虹従;150,绱呯悆鍑虹従;160,婧栧倷杞夐殠娈;165,绗竴鍊嬬当甯ュ嚭鐝;185,绗簩鍊嬬当甯ュ嚭鐝;225,绗竴鍊嬬当甯ュ嚭鐝;245,绗簩鍊嬬当甯ュ嚭鐝", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = 0.13, + }, + }, + dwID = 20383, + }, + [11] = { + nFrame = 47, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,鎾曡;22,闇囧鐏湀;32,鐏墕;62,闇囧鐏湀;82,闇囧鐏湀;122,闇囧鐏湀;142,闇囧鐏湀;182,闇囧鐏湀;202,闇囧鐏湀;240,鐙傛毚鍓╅鏅傞枔;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.2,0.23", + }, + }, + dwID = 20384, + }, + }, + [286] = { + { + dwID = 58409, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍫变節妤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58413, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍖栫窘铦堵锋不鐧", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍖栫窘铦堵峰鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍖栫窘铦堵峰収鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58419, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忛潏棰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸ㄨ渹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58428, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍞愭浉闆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58444, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涔熸紶娌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58445, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宸ㄦ湪绌垮埡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58476, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃敮绁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58539, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閫e缉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 58540, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲嶅缉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [284] = { + { + dwID = 57259, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮寮撴墜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57262, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭虫枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57264, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏煶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57287, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57301, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭虫枒鍣村皠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57335, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐐綀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57351, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庝护闇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57352, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庝护闇炲垎韬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57462, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙告櫞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57574, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鏅偡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57575, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鎶鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57576, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路澶栭槻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57577, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鍏ч槻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 57578, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "澶╁北路鍥炶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [325] = { + { + dwID = 62714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閻甸粠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64011, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滅櫧鏃ラ鈥濇簮缇╅倓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滈帠榄傜嵉浜衡濆妷涓夊垁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64018, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃ぇ鍢存儭鐘濆惓澶ч亱", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64026, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄┇钁変竴鍒鈥濇湇閮ㄦ钘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [337] = { + { + dwID = 60632, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "搴锋垚杈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60634, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "婧愭槑淇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60635, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "搴锋潠鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60668, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "闆嶅拰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60677, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏄熼珨绂侀尞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [165] = { + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,鐨囦箣鎬;38,闋嫾榛炲悕;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.42,鍗冲皣閫插叆P3", + }, + }, + szName = "瀹夌タ灞::25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夌タ灞", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25110, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 40, + szName = "鐕冭绫犻帠", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + dwID = 25137, + szName = "鐕冭绫犻帠::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "琛绁ぉ", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25139, + szName = "鍑濊涔嬪湴::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 52, + szName = "銆怭3銆戜笅涓娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25222, + szName = "鐙肩墮杌嶅畼::25", + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 50, + szName = "銆怭2銆戜笅涓娆″皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25141, + szName = "鐙肩墮杌嶅畼::25", + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "18,BOSS鐬Щ;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25084, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "浣胯呭嚭鐝", + nRefresh = 10, + nClass = 3, + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = 0, + }, + }, + szName = "绁嗘暀浣胯::25", + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 25106, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀浣胯", + tRelation = { + bAll = true, + }, + }, + }, + [11] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 20, + szName = "绱呰棈鐏嚭鐝", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25092, + szName = "绱呰摦涔嬬伀::25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bCenterAlarm = true, + bFullScreen = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 25090, + szNote = "閫插叆P2闅庢", + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "浣胯呭嚭鐝", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "18,涔惧潳鍔嶆剰;52,涔惧潳鍔嶆剰;78,涔惧潳鍔嶆剰;112,涔惧潳鍔嶆剰;138,涔惧潳鍔嶆剰;172,涔惧潳鍔嶆剰;198,涔惧潳鍔嶆剰;232,涔惧潳鍔嶆剰;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷峰够婊", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25202, + nFrame = 52, + }, + { + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涔惧潳鍔嶆剰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 25277, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 15, + szName = "琛鐞冨嚭鐝", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25526, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "澧撶婵娲诲墿椁樻檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25205, + szName = "澧炵泭路閹栫::25", + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "澧撶婵娲诲墿椁樻檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25204, + szName = "澧炵泭路濡欐墜::25", + nFrame = 52, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "25,鍦扮崉鎯¢;30,闆㈡剚;", + }, + }, + dwID = 25166, + nFrame = 52, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,鍑堝湡;25,椁撻椋;", + }, + }, + dwID = 25161, + nFrame = 52, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 34, + szName = "鍦扮崉鎯¢", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25170, + szName = "鍦扮崉鎯¢::25", + nFrame = 54, + }, + { + nFrame = 52, + szName = "鍌鍎$挡::25", + [4] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎$挡", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25169, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "骞宠鍓╅鏅傞枔", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25175, + szName = "鍏亾鎶鑳借紨鍔╅珨::25", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "20,鎿婇紦鎵", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐛ㄥ鍟忎織", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 25182, + nFrame = 47, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 17, + szName = "骞叉摼鐐稿綀", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25224, + szName = "骞叉摼鐐稿綀::25", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 70, + szName = "鎿婇紦鎵", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 25181, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿婇紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鎿婇紦鎵::25", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 25325, + aFocus = { + { + nMaxDistance = 120, + szDisplay = "闅ㄦ瀵剁", + tRelation = { + bAll = true, + }, + }, + }, + szName = "闅ㄦ瀵剁::25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "鏈寰屼竴娉㈤叉敾", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25326, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "涓嬩竴娉㈤叉敾", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25327, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 60, + szName = "涓嬩竴娉㈤叉敾", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25301, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 62, + szName = "涓嬩竴娉㈤叉敾", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 25302, + szName = "鐙肩墮鍒鍏::25", + nFrame = 57, + }, + { + dwID = 25116, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈仏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25127, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闋嫾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25203, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒″悕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25235, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎿婇紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25237, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "蹇冮瓟", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25239, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涙槦鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25240, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涙槦璁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25264, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铦磋澏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25268, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25269, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25289, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浣曡帢娑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25315, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞嬮爞婕忔礊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25342, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘撮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25352, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庡繕鐢", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25373, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎$挡", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 25415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎″绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [332] = { + { + dwID = 64201, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣涘ぉ闆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闆績鐙肩帇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱嶄粈甯冪埦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [339] = { + { + dwID = 60971, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "閫g帀鑹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61032, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏂囬枏涓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61074, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "灏圭劇鍜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61076, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "灏圭劇鍜庡績榄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61079, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "榄斿康", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61729, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "绌嗙巹鑻", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [171] = { + { + tCountdown = { + { + nIcon = 346, + nTime = 80, + szName = "榫嶅嵎棰ㄥ埛鏂", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + dwID = 24920, + szName = "娌欏槸棰::25", + nFrame = 57, + }, + { + nFrame = 47, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "钑矙", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "78,榫嶅嵎棰;", + }, + }, + dwID = 24909, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 31, + szName = "榫嶇浉姘e媮", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 23191, + }, + { + nFrame = 57, + tCountdown = { + { + nIcon = 346, + nTime = 32, + szName = "榫嶇浉姘e媮", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 24919, + }, + { + dwID = 24866, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鍗撳姏鏍煎湒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24867, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "婢瑰彴鏋伀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24868, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鑱炰汉褰ョ瘎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24869, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "宀虫壙蹇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24871, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "鐮村煄閷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24872, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "楠ㄧ墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 24910, + aFocus = { + { + nMaxDistance = 30, + szDisplay = "闊嬫煍绲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [340] = { + { + dwID = 63764, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "绔湪鐝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63768, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鍝堢埦鑺欐灄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63802, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "缈佸辜涔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [175] = { + { + tCountdown = { + { + nIcon = 2589, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26461, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26462, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 2589, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26823, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [8] = { + tCountdown = { + { + nClass = 3, + szName = "绌洪f巩妯欒鍦", + nIcon = 2589, + nTime = 35, + }, + }, + dwID = 26234, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + [16] = { + tCountdown = { + { + nIcon = 2589, + nTime = 20, + szName = "涓嬩竴娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26046, + nFrame = 57, + }, + [17] = { + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 20, + szName = "涓嬩竴娉㈠皬鎬", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26742, + }, + [9] = { + tCountdown = { + { + nClass = 7, + szName = "鐞", + nIcon = 2589, + nTime = 11, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闃垮彶閭e緸绂", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26229, + nFrame = 47, + }, + [18] = { + dwID = 26108, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌欏彵鍗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [5] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "30,绗簩娉㈠皬鎬;60,绗笁娉㈠皬鎬;90,绗洓娉㈠皬鎬;120,绗簲娉㈠皬鎬;150,绗叚娉㈠皬鎬;180,鏈寰屼竴娉㈠皬鎬;", + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.53,婧栧倷杞夐殠娈;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛戦綊鍏冧綉", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26001, + nFrame = 47, + }, + [10] = { + tCountdown = { + { + nIcon = 2589, + nTime = 19, + szName = "澶╄婕", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26235, + szNote = "娌荤檪婧栧倷閫诧紒", + nFrame = 57, + }, + [20] = { + dwID = 26238, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钘嶈獮婕B风窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 26239, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "槌舵埦澶┞风窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 47, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26276, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钘嶈獮婕", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "鐞", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [22] = { + dwID = 26277, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "槌舵埦澶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + tCountdown = { + { + nIcon = 2589, + key = "鐏闆╗浠ょ嫄鍌穄", + nTime = 150, + szName = "鐏闆╗浠ょ嫄鍌穄", + nRefresh = 5, + nClass = 3, + }, + { + nClass = 3, + key = "[铇囨浖鑾嶿鐏闆", + nTime = 90, + szName = "[铇囨浖鑾嶿鐏闆", + nRefresh = 5, + nIcon = 2589, + }, + }, + dwID = 26583, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + nFrame = 57, + }, + [6] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "15,鍏у偡;40,楱庡叺琛濋嫆;55,鎾煎渤;", + }, + { + nIcon = 2589, + nRefresh = 7, + nClass = 6, + nTime = "0.75,婧栧倷閫插叆銆怭2銆;0.35,婧栧倷閫插叆銆怭3銆;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌欏彵鍗", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26275, + nFrame = 57, + }, + [12] = { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "50,榛炲悕QTE;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.72,婧栧倷璺抽粦鐧介洸;0.32,婧栧倷璺抽粦鐧介洸", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏇圭値鐑", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26161, + nFrame = 47, + }, + [24] = { + dwID = 26279, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栫嫾闈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [25] = { + dwID = 26458, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囨浖鑾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [13] = { + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "璺抽ⅷ绲愭潫鍊掕▓鏅", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26804, + nFrame = 47, + }, + [26] = { + dwID = 26459, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠ょ嫄鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [27] = { + dwID = 26691, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩藉懡绠煝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + tCountdown = { + { + nIcon = 2589, + nTime = 10, + szName = "闆嗙伀鐙兼檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 26339, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + }, + [14] = { + dwID = 26380, + szName = "銆愬掓补闁銆戣棨鐢插叺", + nFrame = 57, + tCountdown = { + { + nIcon = 2589, + nTime = 33, + szName = "銆愬掓补闁銆戜笅涓娉", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [28] = { + dwID = 26805, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩介瓊鎴熺湡姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [23] = { + dwID = 26278, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲戦緧娣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + dwID = 26237, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲戦緧娣德风窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [15] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "甯憾闆", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + nClass = 3, + nTime = "40,鐏槦;69,闆插嵎鐓;", + }, + }, + dwID = 26755, + }, + }, + [177] = { + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26136, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰瘏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A绲劼峰瘏铏", + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26137, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰嵂", + tRelation = { + bAll = true, + }, + }, + }, + szName = "A绲劼峰嵂鍏", + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26140, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰崍", + tRelation = { + bAll = true, + }, + }, + }, + szName = "B绲劼峰崍棣", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "闆嗙伀鍗佷簩鐩告檪闁", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 26143, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎烽厜", + tRelation = { + bAll = true, + }, + }, + }, + szName = "C绲劼烽厜闆", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "9,鍒嗛;30,椋涢偿鍑虹従;43,鏆楁鑰呭嚭鐝;", + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦板瓧涓铏", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 26119, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36457, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36458, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36459, + }, + { + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + dwID = 36460, + }, + { + dwID = 26019, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闅卞厓鏈冩殫娈鸿", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26024, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒″悕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26025, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷烽櫧", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26026, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷烽櫚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26027, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍌鍎÷峰櫖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26126, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛戦饭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26133, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閭奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26134, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰瓙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26135, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎烽啘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26138, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎疯景", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26139, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎峰烦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26141, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎锋湭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26142, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎风敵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26144, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎锋垖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26145, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍗佷簩鐩嘎蜂亥", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26148, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎰佸煄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 26169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉湞缇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [356] = { + { + dwID = 63921, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "闆嶅拰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63922, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏄熼珨绂侀尞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63937, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "搴锋垚杈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63938, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "婧愭槑淇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63939, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "搴锋潠鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [360] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁炵桨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧藉湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忓お闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏妸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘存簮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63511, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閴戠埦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63512, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缇呯磵鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63519, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴风枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63546, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钀芥槦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63554, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌掕棌鍛兼湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63582, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷块洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63612, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉樻硶闁璀樼牬鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63613, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏂瑰ぉ鍔嶈豹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63634, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "淇′话鏆村緬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63636, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栨硶闁琛涢亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63644, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬鸿惤鐨勯鐗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63659, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏恫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63668, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷撹穻鎬濈窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63676, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63679, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱呰。鏁欏憡瀵嗚", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63680, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栨硶闁濂村焦鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冮噾姘h剤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [183] = { + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 36165, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓嶇ゥ鐨勯粦铔", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "涓嶇ゥ鐨勯粦铔:25", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 23, + szName = "鍦撳姬鐪熸埃", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 27655, + [3] = { + bBigFontAlarm = true, + bFullScreen = true, + }, + nFrame = 57, + }, + [4] = { + tCountdown = { + { + nIcon = 346, + key = "鑷村懡涓鎿", + nTime = 28, + szName = "鑷村懡涓鎿", + nRefresh = 10, + nClass = 3, + nFrame = 2, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36131, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "甯剁浘鍔嶄繎路1铏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "甯剁浘淇(鍔:25)", + nFrame = 47, + }, + [8] = { + nFrame = 52, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 255, + 0, + }, + dwID = 36191, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璋峰妽", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "璋烽ⅷ鈽呭弽褰堚槄娉ㄦ剰鍋滄墜", + szName = "璋峰妽:25", + }, + [16] = { + tCountdown = { + { + nIcon = 346, + nTime = 28, + szName = "鐙肩墮鏂瑰+", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36124, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏂瑰+", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐙肩墮鏂瑰+:25", + nFrame = 57, + }, + [17] = { + tCountdown = { + { + nIcon = 346, + nTime = 13, + szName = "闅ㄦ鎶鑳", + nRefresh = 10, + nClass = 3, + }, + }, + dwID = 36110, + szName = "楹熺伀:25", + nFrame = 57, + }, + [9] = { + nFrame = 52, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 0, + }, + dwID = 36190, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宓愬妽", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鍒嗚韩鈽呭崈鍒囧瓙鈽呭揩闆嗙伀", + szName = "宓愬妽:25", + }, + [18] = { + nFrame = 67, + szName = "鐭抽簰楹:25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭抽簰楹", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "11,闅ㄦ鎶鑳;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.75,鈽呯┛楹熷缉婧栧倷灏变綅鈽;0.25,鈽呯┛楹熷缉婧栧倷灏变綅鈽;", + }, + }, + dwID = 36142, + }, + [5] = { + nFrame = 47, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36118, + szNote = "鈽呮敞鎰忛枊娓涘偡鈽", + szName = "寮╀繎:25", + }, + [10] = { + nFrame = 57, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 36192, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐妽", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鍖楅ⅷ鈽呯櫧榫嶅妽璧扳槄鎺涙壎鎼", + szName = "鍐妽:25", + }, + [20] = { + dwID = 36114, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬬喀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [21] = { + dwID = 36154, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍒囧壊姗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 36411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铏涢緧鍔", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "闅ㄦ鍔嶉粸鍚", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [22] = { + dwID = 36208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏囦繎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 47, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + col = { + 255, + 0, + 255, + }, + dwID = 36132, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "甯剁浘鍔嶄繎路2铏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "甯剁浘淇(闆:25)", + tCountdown = { + { + nIcon = 346, + nTime = 23, + szName = "鍦撳姬鍔", + nRefresh = 10, + nClass = 3, + }, + }, + }, + [6] = { + nFrame = 47, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36120, + szNote = "鈽呮敞鎰忛旱鍚戔槄", + szName = "鍔嶄繎:25", + }, + [12] = { + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "闅ㄦ鍔嶉粸鍚", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36180, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "宓愬〉鍔", + tRelation = { + bAll = true, + }, + }, + }, + szName = "宓愬〉鍔:25", + nFrame = 52, + }, + [13] = { + tCountdown = { + { + nIcon = 346, + nTime = 8, + szName = "闅ㄦ鍔嶉粸鍚", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36167, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙ゅ妽", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙ゅ妽:25", + nFrame = 57, + }, + [7] = { + tCountdown = { + { + nClass = 7, + nFrame = 8, + nIcon = 346, + nTime = "30,琛濇挒|浜¤呮埃鎭;", + }, + }, + dwID = 36125, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夌タ灞", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + szName = "瀹夌タ灞:25", + }, + [14] = { + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "12,闅ㄦ鍔嶉粸鍚;62,Boss鐬Щ;75,闅ㄦ鍔嶉粸鍚;122,Boss鐬Щ;135,闅ㄦ鍔嶉粸鍚;182,Boss鐬Щ;195,闅ㄦ鍔嶉粸鍚;242,Boss鐬Щ;255,闅ㄦ鍔嶉粸鍚;302,Boss鐬Щ;315,闅ㄦ鍔嶉粸鍚;362,Boss鐬Щ;375,闅ㄦ鍔嶉粸鍚;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.65,鈽呮簴鍌欓插叆P2鈽;", + }, + }, + dwID = 36169, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠ょ嫄鍌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + szName = "浠ょ嫄鍌:25", + }, + [23] = { + dwID = 36254, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩滃璩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [19] = { + tCountdown = { + { + nIcon = 346, + nTime = 35, + szName = "杌婁繎", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bFullScreen = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36183, + szName = "杌婁繎:25", + nFrame = 57, + }, + [15] = { + nFrame = 57, + szName = "鎺㈤洩:25", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎺㈤洩", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "15,榄呮儜;", + }, + }, + dwID = 36184, + }, + }, + [368] = { + { + dwID = 64855, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冪﹩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65057, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65097, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辫勃锛堜粊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65104, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰卞棓锛堟櫤锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65207, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩棿锛堢Ξ锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65208, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辨參锛堜俊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩枒锛堢京锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65230, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣掑績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [341] = { + { + dwID = 61114, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴风枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61177, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閴戠埦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61191, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缇呯磵鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁炵桨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧藉湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61303, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏恫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忓お闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61557, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌掕棌鍛兼湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷撹穻鎬濈窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61672, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷块洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61711, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉樻硶闁璀樼牬鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61712, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏂瑰ぉ鍔嶈豹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61714, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "淇′话鏆村緬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61716, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栨硶闁琛涢亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏妸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62484, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈涚窘棰ㄩ偿", + tRelation = { + bEnemy = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘存簮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62649, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬鸿惤鐨勯鐗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64755, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧煎厜鐨勮工璺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冮噾姘h剤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [189] = { + { + dwID = 36680, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閲庝汉棣栭牁", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 36688, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑰佽檸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47704, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍛煎懠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [191] = { + { + nFrame = 52, + dwID = 36869, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧鎽у煄", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐏緧鎽у煄:10PT", + tCountdown = { + { + nIcon = 2589, + nTime = 60, + szName = "鎽у煄涓鎿", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + szName = "鐏緧姗熼浄", + nIcon = 2589, + nTime = 22, + }, + }, + }, + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 36874, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧姗熼浄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 2589, + key = "鐏緧姗熼浄", + nTime = 30, + szName = "鐏緧姗熼浄", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "鐏緧姗熼浄:10PT", + }, + { + tCountdown = { + { + nIcon = 2589, + key = "杩芥搳鐏緧", + nTime = 30, + szName = "杩芥搳鐏緧", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "杩芥搳鐏緧:10PT", + dwID = 36875, + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 2589, + nTime = 100, + szName = "涓嬩竴娉㈣櫉瑙掓墜", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 37535, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮铏熻鎵", + tRelation = { + bAll = true, + }, + }, + }, + szName = "铏熻鎵:10PT", + nFrame = 47, + }, + { + nFrame = 67, + tCountdown = { + { + nIcon = 2589, + nTime = 30, + szName = "涓嬩竴娆″ぉ涓婂法鐭", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + col = { + 255, + 0, + 255, + }, + szName = "椋涚煶:10PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈濇洣闁椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鈽呭揩灏勬搳鈽呭揩灏勬搳鈽", + dwID = 37206, + }, + { + nFrame = 47, + dwID = 36864, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐢板竷鎴", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "7.5,鏂烽;18,椋涙枾姘e牬;25,婧栧倷鎺掔伀;65,铏庡槸;195,榛炲悕;", + }, + }, + szName = "鐢板竷鎴:10PT", + }, + { + dwID = 37209, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏀诲煄闅婇暦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37760, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙湪姹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 37867, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦栨嫈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41163, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶉渶鐗╄硣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [343] = { + { + dwID = 60998, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "钖戜粐灏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60999, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "榄忓畻鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61000, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "瀹偛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [348] = { + { + dwID = 62830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娴佺伀鍖栬潬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64046, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀闅遍亖鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64047, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀娈夐亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64048, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀瀵╁垽鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64049, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀鎻ず鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64063, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀澶у姏澹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64064, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64069, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐3", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [354] = { + { + dwID = 61194, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁炵桨", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61195, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧藉湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 61318, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灏忓お闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62464, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏妸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62569, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘存簮", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63342, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閴戠埦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缇呯磵鐪", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63349, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钀芥槦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63370, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴风枒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63377, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63379, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷块洸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63400, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娌掕棌鍛兼湀", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63410, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉樻硶闁璀樼牬鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63411, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏂瑰ぉ鍔嶈豹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63424, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "淇′话鏆村緬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63426, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑱栨硶闁琛涢亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63451, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎷撹穻鎬濈窘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63460, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬鸿惤鐨勯鐗", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63498, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏恫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63502, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63509, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈涚窘棰ㄩ偿", + tRelation = { + bEnemy = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63833, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐔婅倝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64834, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冮噾姘h剤", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [199] = { + { + dwID = 41019, + tCountdown = { + { + nClass = 3, + szName = "鍗楃嚐鎻磋粛鍑虹従", + nIcon = 337, + nTime = 30, + }, + }, + nFrame = 57, + }, + { + dwID = 41018, + tCountdown = { + { + nClass = 3, + szName = "鍖楃嚐鎻磋粛鍑虹従", + nIcon = 337, + nTime = 30, + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40951, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "璧ょ嫾琛", + tRelation = { + bAll = true, + }, + }, + }, + szName = "璧ょ嫾琛:25PT", + }, + { + nFrame = 57, + col = { + 0, + 255, + 255, + }, + dwID = 40949, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩茬溂琛濂", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + }, + szName = "鐩茬溂琛濂:25PT", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 40970, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏岃鎺岀祩榛", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐏岃鎺岀祩榛", + }, + { + nFrame = 57, + dwID = 40948, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙叉濇槑:25PT", + tCountdown = { + { + nIcon = 4504, + nTime = 5, + szName = "姣掕娑屽嫊", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "11,鐩茬溂琛濂;41,榄勮。琛鍍;69,琛鏌撴槬绉;71,璧ょ嫾琛;", + }, + { + nIcon = 346, + nRefresh = 7, + nClass = 6, + nTime = "0.58,鈽呮簴鍌欓插叆鍥炶闅庢鈽;0.35,鈽呮簴鍌欓插叆鍥炶闅庢鈽;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 3448, + nTime = 12, + szName = "钘嶈壊閫g窔", + nRefresh = 5, + nClass = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40921, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路鐞电惗", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐧介櫠路鐞电惗:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nIcon = 3401, + nTime = 8, + szName = "钃姳鎸", + nRefresh = 5, + nClass = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40922, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧介櫠路绠滅瘜", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐧介櫠路绠滅瘜:25PT", + nFrame = 57, + }, + { + nFrame = 67, + col = { + 255, + 0, + 0, + }, + dwID = 40955, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楫鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "楫鑱氬姏:25PT", + }, + { + nFrame = 67, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 40956, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈堥瓊鑱氬姏", + tRelation = { + bAll = true, + }, + }, + }, + szName = "闈堥瓊鑱氬姏:25PT", + }, + { + nFrame = 57, + szName = "瀹夐洦:25PT", + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀹夐洦", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "鈽呰仏鐏剼鍩庘槄", + nTime = 45, + szName = "鑱栫伀妯婂煄", + nClass = 7, + }, + { + nIcon = 13, + key = "鈽嗚仏鐏剼鍩庘槅", + nTime = 105, + szName = "鑱栫伀妯婂煄", + nClass = 7, + }, + }, + dwID = 40952, + }, + { + nFrame = 57, + [3] = { + bBigFontAlarm = true, + }, + dwID = 40940, + szNote = "鈽呴仩闆⑩槄閬犻洟鈽", + szName = "鏂锋氮姘e媮:25PT", + }, + { + tCountdown = { + { + nFrame = 8, + nTime = 17, + szName = "鎭愭嚰debuff", + nClass = 7, + nIcon = 346, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40917, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闃跨崹楣", + tRelation = { + bAll = true, + }, + }, + }, + szName = "闃跨崹楣:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "鍓佸北鍔(鐮寸敳)", + nIcon = 346, + nTime = 7, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 40919, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙挋", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鍙挋:25PT", + nFrame = 57, + }, + { + tCountdown = { + { + nClass = 7, + szName = "鏂锋氮鏂(娴佽)", + nIcon = 346, + nTime = 11, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 40918, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕礌鐖", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐑忕礌鐖:25PT", + nFrame = 57, + }, + { + [3] = { + bScreenHead = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶈硣绠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 41162, + }, + { + dwID = 40937, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐扮墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40965, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍤村瓭閫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40988, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滄儭淇緟鈥濈鏈ㄦ鎴", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 40997, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滅儓鐒扮噹鍘熲濊硜鐧惧嫕", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 41010, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鈥滃褰辩禃濉碘濊但閫f鍔", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [364] = { + { + dwID = 64853, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64856, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閭笉鍍", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64857, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忕伣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64858, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀛鐝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64859, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楝奸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64860, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘撮[鎶撲汉]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64892, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹鐨勫法鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64913, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒¢潰楝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64918, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閼懌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65012, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閷㈠畻榫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65046, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮疯ゲ濂村儠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65047, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃仴娣疯泲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65052, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榄氭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65058, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴峰鍒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65346, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼嶈棌閲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65633, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "寮撶鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65714, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "鏉庡宄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [369] = { + { + dwID = 66090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣掑績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娓呭績", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66098, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰卞棓锛堟櫤锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66099, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩棿锛堢Ξ锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辨參锛堜俊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66101, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辩枒锛堢京锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66107, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰辫勃锛堜粊锛", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66125, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冪﹩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [205] = { + { + nFrame = 52, + tCountdown = { + { + nIcon = 346, + key = "鐏緧姗熼浄", + nTime = 30, + szName = "鐏緧姗熼浄", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 41904, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧姗熼浄", + tRelation = { + bAll = true, + }, + }, + }, + szNote = "鈽呭揩闆嗙伀鈽呭揩闆嗙伀鈽", + szName = "鐏緧姗熼浄:25TZ", + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 41905, + szName = "杩芥搳鐏緧:25TZ", + tCountdown = { + { + nIcon = 346, + key = "杩芥搳鐏緧", + nTime = 30, + szName = "杩芥搳鐏緧", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + key = "榛戞补鍦", + nTime = 30, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "榛戞补鍦:25TZ", + dwID = 41902, + nFrame = 57, + }, + { + nFrame = 52, + dwID = 41899, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧鎽у煄", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐏緧鎽у煄:25TZ", + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,杩芥搳鐏緧;16,鐏緧姗熼浄;", + }, + [4] = { + nIcon = 13, + nTime = 60, + szName = "鎽у煄涓鎿", + nClass = 7, + nFrame = 8, + }, + [3] = { + nClass = 6, + nIcon = 2995, + nTime = "0.55,鈽呮簴鍌欑涓娆$伀鐗嗏槄;0.25,鈽呮簴鍌欑浜屾鐏墕鈽;0.15,鈽呮簴鍌欑涓夋鐏墕鈽;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "鐙肩墮铏熻鎵", + nRefresh = 10, + nClass = 3, + nFrame = 8, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 0, + }, + dwID = 42066, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮铏熻鎵", + tRelation = { + bAll = true, + }, + }, + }, + szName = "铏熻鎵:25TZ", + nFrame = 47, + }, + { + nFrame = 67, + col = { + 255, + 0, + 255, + }, + dwID = 42035, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈濇洣闁椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "椋涚煶:25TZ", + }, + { + nFrame = 57, + dwID = 41894, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐢板竷鎴", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐢板竷鎴:25TZ", + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "8.5,鏂烽;35,婧栧倷鎺掔伀;240,榛炲悕;", + }, + { + nIcon = 13, + nTime = 80, + szName = "铏庡槸锛堢┛閫忥級", + nClass = 7, + nFrame = 8, + }, + }, + }, + { + dwID = 42037, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏀诲煄闅婇暦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42076, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙湪姹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42095, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦栨嫈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42128, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶉渶鐗╄硣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [412] = { + { + dwID = 65410, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "璨槦宸ㄧ尶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65411, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "璨槦宸ㄧ尶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65412, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鐓炴槦榫嶇嵏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65413, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鍑舵槦榫嶇嵏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65721, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏈遍泙瓒呯礆淇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65722, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鐜勬瓒呯礆淇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [69] = { + { + dwID = 14549, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "琛鐜", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 14610, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐ヨ姳閫h垶", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [211] = { + { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 42425, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧姗熼浄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 346, + key = "鐏緧姗熼浄", + nTime = 30, + szName = "鐏緧姗熼浄", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "鐏緧姗熼浄:10TZ", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 30, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "榛戞补鍦:10TZ", + dwID = 42423, + nFrame = 57, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 36875, + szName = "杩芥搳鐏緧:10TZ", + tCountdown = { + { + nIcon = 346, + key = "杩芥搳鐏緧", + nTime = 30, + szName = "杩芥搳鐏緧", + nRefresh = 10, + nClass = 3, + }, + }, + }, + { + nFrame = 52, + dwID = 42420, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐏緧鎽у煄", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐏緧鎽у煄:10TZ", + tCountdown = { + { + nIcon = 346, + nTime = 25, + szName = "榛戞补鍦", + nRefresh = 10, + nClass = 7, + }, + { + nClass = 7, + nIcon = 346, + nTime = "5,杩芥搳鐏緧;16,鐏緧姗熼浄;60,鎽у煄涓鎿;", + }, + }, + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 100, + szName = "鐙肩墮铏熻鎵", + nRefresh = 10, + nClass = 3, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + col = { + 255, + 128, + 64, + }, + dwID = 42587, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮铏熻鎵", + tRelation = { + bAll = true, + }, + }, + }, + szName = "铏熻鎵:10TZ", + nFrame = 47, + }, + { + nFrame = 67, + col = { + 255, + 0, + 255, + }, + dwID = 42556, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏈濇洣闁椋涚煶", + tRelation = { + bAll = true, + }, + }, + }, + [3] = { + bScreenHead = true, + bBigFontAlarm = true, + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + szName = "椋涚煶:10TZ", + }, + { + tCountdown = { + { + nIcon = 346, + nTime = 37, + szName = "椋涙枾姘e牬", + nRefresh = 10, + nClass = 3, + }, + }, + szName = "椋涙枾姘e牬:10TZ", + dwID = 42485, + nFrame = 57, + }, + { + nFrame = 57, + dwID = 42415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐢板竷鎴", + tRelation = { + bAll = true, + }, + }, + }, + szName = "鐢板竷鎴:10TZ", + tCountdown = { + { + nClass = 7, + nIcon = 346, + nTime = "7.5,鏂烽;18,椋涙枾姘e牬;25,婧栧倷鎺掔伀;195,榛炲悕;", + }, + { + nIcon = 13, + nTime = 65, + szName = "铏庡槸锛堢┛閫忥級", + nFrame = 8, + nClass = 7, + }, + }, + }, + { + dwID = 42558, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩墮鏀诲煄闅婇暦", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42597, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙湪姹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42616, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍦栨嫈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 42657, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杌嶉渶鐗╄硣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [359] = { + { + dwID = 63950, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "鏈堢睜鑽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63953, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "钂硅懎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63954, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "娈烘湯閭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63973, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "棰ㄩ鐒℃儏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 63974, + aFocus = { + { + nMaxDistance = 40, + szDisplay = "寰╁菇鑽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [301] = { + { + dwID = 60484, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐑忕储", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60503, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙叉濇槑", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60515, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜煵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60523, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈崇┖鏄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60526, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绐佽ゲ杌嶇嫾", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60541, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绶磋涔嬪ゴ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60543, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "杩蜂簜涔嬪ゴ", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60544, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙備簜宸ㄩ狈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60619, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐙肩浠や娇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 60769, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "缍犵悆", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [217] = { + { + nFrame = 57, + szName = "涓鍫嗗彜钁", + [3] = { + bScreenHead = true, + }, + dwID = 48752, + }, + { + nFrame = 47, + szName = "瓒呭鍙よ懀", + [3] = { + bScreenHead = true, + }, + dwID = 48751, + }, + }, + [406] = { + { + dwID = 64894, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏇规叾鍙", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65017, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐧芥搏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65033, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鎮夐仈缇呮懇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65456, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楝奸绁熺鐨勫紦鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 65460, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "褰㈣贰鍙枒鐨勬捣瀵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [221] = { + [7] = { + nFrame = 47, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭ュ績鐏帶鍒", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 327, + key = "鐭ュ績鐏秷澶", + nTime = 20, + szName = "鐭ュ績鐏秷澶", + nClass = 3, + }, + }, + szName = "鐭ュ績鐏", + }, + [1] = { + dwID = 44805, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "鍝佺鏇", + nIcon = 2589, + nTime = 58, + }, + }, + nFrame = 57, + }, + [2] = { + dwID = 44812, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹犅峰够", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + [4] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 43236, + }, + [8] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣櫧", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 43275, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,琛岃垷;21,琛岃垷;34,琛岃垷;", + }, + { + nIcon = 2589, + nClass = 7, + szName = "浜屽紡路鐧绘〒", + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.60,婧栧倷閫插叆P2;", + }, + }, + }, + [9] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 43281, + }, + [5] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 43129, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + szName = "榛冩硥绲曞奖", + }, + [10] = { + dwID = 43112, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣涙瘺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 44810, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞婚瓟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "骞婚瓟闄勯珨", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + dwID = 43107, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑾洦", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + szName = "閹崉鐪", + nIcon = 3434, + nTime = 60, + }, + { + nClass = 7, + szName = "鎯呯窉澶辨帶", + nIcon = 2589, + nTime = 32, + }, + }, + nFrame = 57, + }, + [12] = { + dwID = 43282, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈掕摦瀛愬妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 43113, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [366] = { + { + dwID = 64896, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66327, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閷㈠畻榫", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66328, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66329, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閭笉鍍", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66330, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忕伣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66331, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀛鐝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66334, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏅忓巹鐨勫法鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "楝奸", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66337, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姘撮[鎶撲汉]", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66351, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒¢潰楝", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66355, + aFocus = { + { + nMaxDistance = 150, + szDisplay = "寮撶鎵", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66365, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮疯ゲ濂村儠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66366, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐒℃仴娣疯泲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66367, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼嶈棌閲", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66375, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閼懌", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66401, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榄氭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66402, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "搴峰鍒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 66458, + aFocus = { + { + nMaxDistance = 15, + szDisplay = "鏉庡宄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [225] = { + { + dwID = 46475, + tCountdown = { + { + nClass = 7, + szName = "闊虫疆鍌炬箹", + nIcon = 13, + nTime = 52, + }, + }, + nFrame = 47, + }, + }, + [227] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绉︾", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nIcon = 13, + key = "DPS鍋滄墜", + nTime = 0, + szName = "DPS鍋滄墜", + nClass = -1, + }, + { + nIcon = 13, + key = "榛戦ⅷ鐮村博鏂", + nTime = 0, + szName = "榛戦ⅷ鐮村博鏂", + nClass = -1, + }, + [4] = { + nClass = 7, + szName = "姝i潰AOE", + nIcon = 13, + nTime = 7, + }, + [3] = { + nIcon = 13, + key = "姝i潰AOE", + nTime = 0, + szName = "姝i潰AOE", + nClass = -1, + }, + }, + dwID = 46560, + }, + { + dwID = 46562, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "妞嶅睄灏", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 46575, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑾暰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [229] = { + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 57, + dwID = 46912, + }, + [2] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46889, + }, + [3] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46891, + }, + [1] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46894, + }, + [4] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46888, + }, + [5] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 47, + dwID = 46890, + }, + [7] = { + nFrame = 47, + tCountdown = { + { + nClass = 3, + szName = "娴侀ⅷ浜旈f柆", + nIcon = 13, + nTime = 20, + }, + }, + dwID = 46899, + }, + }, + [231] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "灞堢劙闄", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "26,閫f柆;56,娉;", + }, + { + nClass = 7, + szName = "鍒哄鍑虹従", + nIcon = 2589, + nTime = 70, + }, + { + nFrame = 8, + nTime = 65, + szName = "杩介瓊鍔嶆埃", + nClass = 7, + nIcon = 3443, + }, + }, + dwID = 47175, + }, + { + tCountdown = { + { + nClass = 3, + szName = "鍒哄鍑虹従", + nIcon = 2589, + nTime = 70, + }, + }, + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47176, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榫嶅湒鍒哄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + dwID = 47197, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "妫節宓", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,灞呭悎;19,灞呭悎;29,鏂祦鍔嶆埃鍫;", + }, + }, + nFrame = 57, + }, + { + nFrame = 57, + dwID = 47218, + tCountdown = { + { + nClass = 3, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "6,鍗婃湀;105,姘e牬娑堝け;", + }, + { + nClass = 4, + nIcon = 2589, + key = "姘e牬娑堝け", + nTime = "4,鏂祦鍔嵚峰緤;18,鏂祦鍔嵚锋粎;", + }, + { + nClass = 4, + nIcon = 2589, + nTime = "27,灞呭悎;42,灞呭悎;54,灞呭悎路鎺;62,鏂祦鍔嶆埃鍫;", + }, + }, + szName = "鏂祦鍔", + }, + { + dwID = 47272, + tCountdown = { + { + nFrame = 8, + nTime = 10, + szName = "鐮存暤", + nClass = 3, + nIcon = 4224, + }, + }, + szName = "鍗婃湀鍒姘", + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47283, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nFrame = 57, + dwID = 47361, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47364, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍔嶈闅婂壇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47362, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = true, + [9] = true, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮╄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47303, + }, + { + tCountdown = { + { + nClass = 3, + szName = "涓榧撲綔姘f秷澶", + nIcon = 2589, + nTime = 15, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + dwID = 47288, + [4] = { + bBigFontAlarm = true, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓榧撲綔姘", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "椋涜姳涔嬪垉", + tRelation = { + bAll = true, + }, + }, + }, + dwID = 47202, + nFrame = 57, + }, + { + dwID = 47359, + nFrame = 47, + }, + { + dwID = 47226, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浠茶櫅蹇", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "11,绱噾缂;62,涓夌挵閷潠;", + }, + }, + }, + { + tCountdown = { + { + nClass = 3, + szName = "绱噾婊", + nIcon = 3398, + nTime = 25, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47256, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绱噾缂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + bScreenHead = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "涓夌挵閷潠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + dwID = 47225, + }, + { + dwID = 47276, + szName = "娑呮缍3", + nFrame = 57, + }, + { + dwID = 43966, + szName = "娑呮缍2", + nFrame = 57, + }, + { + dwID = 47208, + szName = "娑呮缍1", + nFrame = 57, + }, + { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣挊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + dwID = 47182, + }, + { + tCountdown = { + { + nClass = 7, + nIcon = 2589, + key = "鐣跺墠闆嗙伀鈽", + nTime = "20,鐣跺墠闆嗙伀鈽呭コ;40,鐣跺墠闆嗙伀鈽呯敺;60,鐣跺墠闆嗙伀鈽呭コ;80,鐣跺墠闆嗙伀鈽呯敺;100,鐣跺墠闆嗙伀鈽呭コ;120,鐣跺墠闆嗙伀鈽呯敺;140,鐣跺墠闆嗙伀鈽呭コ;160,鐣跺墠闆嗙伀鈽呯敺;180,鐣跺墠闆嗙伀鈽呭コ;200,鐣跺墠闆嗙伀鈽呯敺;220,鐣跺墠闆嗙伀鈽呭コ;240,鐣跺墠闆嗙伀鈽呯敺;260,鐣跺墠闆嗙伀鈽呭コ;280,鐣跺墠闆嗙伀鈽呯敺;300,鐣跺墠闆嗙伀鈽呭コ;320,鐣跺墠闆嗙伀鈽呯敺;340,鐣跺墠闆嗙伀鈽呭コ;360,鐣跺墠闆嗙伀鈽呯敺;380,鐣跺墠闆嗙伀鈽呭コ;400,鐣跺墠闆嗙伀鈽呯敺;420,鐣跺墠闆嗙伀鈽呭コ;440,鐣跺墠闆嗙伀鈽呯敺;460,鐣跺墠闆嗙伀鈽呭コ;480,鐣跺墠闆嗙伀鈽呯敺;500,鐣跺墠闆嗙伀鈽呭コ;520,鐣跺墠闆嗙伀鈽呯敺;540,鐣跺墠闆嗙伀鈽呭コ;560,鐣跺墠闆嗙伀鈽呯敺;580,鐣跺墠闆嗙伀鈽呭コ;600,鐣跺墠闆嗙伀鈽呯敺;620,鐣跺墠闆嗙伀鈽呭コ;640,鐣跺墠闆嗙伀鈽呯敺;660,鐣跺墠闆嗙伀鈽呭コ;680,鐣跺墠闆嗙伀鈽呯敺;700,鐣跺墠闆嗙伀鈽呭コ;720,鐣跺墠闆嗙伀鈽呯敺;740,鐣跺墠闆嗙伀鈽呭コ;760,鐣跺墠闆嗙伀鈽呯敺;780,鐣跺墠闆嗙伀鈽呭コ;800,鐣跺墠闆嗙伀鈽呯敺;820,鐣跺墠闆嗙伀鈽呭コ;840,鐣跺墠闆嗙伀鈽呯敺;860,鐣跺墠闆嗙伀鈽呭コ;880,鐣跺墠闆嗙伀鈽呯敺;900,鐣跺墠闆嗙伀鈽呭コ;", + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47189, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "铇囧崄涓夊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + tCountdown = { + { + nClass = 3, + szName = "婧栧倷闆嗙伀鈽呭叓鑽掗櫍鐪尖槄", + nIcon = 2028, + nTime = 9, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47206, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍏崚闄g溂", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 57, + }, + { + [3] = { + bBigFontAlarm = true, + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47205, + nFrame = 57, + }, + { + dwID = 47187, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣憭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐩稿鍔嶇墷", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47310, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闁荤磱闄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47330, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閬婅暕鐨勯构榄", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47335, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "钖涘北鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47336, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮靛啲鎭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47339, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐜嬫兢娓", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47340, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闄抽彙鍎", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47343, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "閯窘鐒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47344, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙ゅ畾闊", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 47347, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "寮甸棞姣", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [233] = { + [7] = { + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47134, + nFrame = 57, + }, + [1] = { + dwID = 47683, + nFrame = 57, + tCountdown = { + [2] = { + nClass = 7, + nIcon = 2589, + key = "鍝佺鏇", + nTime = "84,鍝佺鏇;123,闊崇簭;163,闊崇簭;", + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "婧栧倷QTE", + nTime = "22,婧栧倷QTE;62,婧栧倷QTE;167,骞婚瓟鍟忓績鏇;", + }, + }, + }, + [2] = { + nFrame = 57, + dwID = 47144, + tCountdown = { + { + szName = "闊崇簭娑堝け", + nClass = 3, + nIcon = 2589, + nTime = 14, + }, + }, + }, + [4] = { + dwID = 47637, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,鍒嗗窛鎵嬄锋帓娴;26,鍒嗗窛鎵嬄锋帓娴;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,鎯呯窉澶辨帶;65,閹崉鐪;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,婧栧倷杞塒2;0.35,婧栧倷杞塒2;", + }, + }, + }, + [8] = { + dwID = 47633, + nFrame = 57, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,琛岃垷;21,琛岃垷;34,琛岃垷;", + }, + { + nClass = 7, + szName = "浜屽紡路鐧绘〒", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.75,婧栧倷閫插叆P2;0.45,婧栧倷閫插叆P3;", + }, + }, + }, + [9] = { + tCountdown = { + { + nIcon = 2589, + nClass = 4, + nTime = "6,琛岃垷;15,琛岃垷;23,琛岃垷;", + }, + { + nFrame = 8, + nTime = 28, + szName = "绾", + nClass = 4, + nIcon = 3404, + }, + [4] = { + szName = "涓冨紡路韪忔瓕", + nClass = 4, + nIcon = 2589, + nTime = 37, + }, + [3] = { + nIcon = 2589, + key = "鏄犳棩", + nTime = 0, + szName = "鏄犳棩", + nClass = 4, + }, + }, + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + dwID = 47117, + }, + [5] = { + tCountdown = { + { + nIcon = 327, + key = "鐭ュ績鐏秷澶", + nTime = 20, + szName = "鐭ュ績鐏秷澶", + nClass = 3, + }, + }, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bScreenHead = true, + }, + dwID = 47106, + szName = "鐭ュ績鐏", + szNote = "鎺у埗", + nFrame = 47, + }, + [10] = { + nFrame = 52, + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + dwID = 47118, + tCountdown = { + { + szName = "闈掕摦瀛愬妽", + nClass = 3, + nIcon = 2589, + nTime = 50, + }, + }, + szName = "P3闈掕摦瀛愬妽", + }, + [3] = { + nFrame = 57, + dwID = 47120, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + tCountdown = { + { + szName = "骞婚瓟闄勯珨", + nClass = 3, + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 47123, + nFrame = 57, + }, + }, + [235] = { + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "鍝佺鏇", + nTime = "84,鍝佺鏇;123,闊崇簭;163,闊崇簭;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "婧栧倷QTE", + nTime = "22,婧栧倷QTE;62,婧栧倷QTE;167,骞婚瓟鍟忓績鏇;", + }, + }, + dwID = 48229, + }, + { + nFrame = 57, + dwID = 48233, + [3] = { + bBigFontAlarm = true, + }, + tCountdown = { + { + nClass = 3, + szName = "闊崇簭娑堝け", + nIcon = 2589, + nTime = 14, + }, + }, + }, + { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = true, + [6] = true, + }, + }, + dwID = 48232, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞婚瓟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "骞婚瓟闄勯珨", + nIcon = 3434, + nTime = 30, + }, + }, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑾洦", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,鍒嗗窛鎵嬄锋帓娴;26,鍒嗗窛鎵嬄锋帓娴;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,鎯呯窉澶辨帶;65,閹崉鐪;", + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.70,婧栧倷杞塒2;0.35,婧栧倷杞塒2;", + }, + }, + dwID = 48200, + }, + { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣櫧", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,琛岃垷;21,琛岃垷;34,琛岃垷;", + }, + { + nClass = 7, + szName = "浜屽紡路鐧绘〒", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.60,婧栧倷閫插叆P2;0.45,婧栧倷閫插叆P3;", + }, + }, + dwID = 48214, + }, + { + nFrame = 57, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,琛岃垷;15,琛岃垷;23,琛岃垷;", + }, + { + nClass = 4, + szName = "绾", + nIcon = 3404, + nTime = 28, + }, + [4] = { + nClass = 4, + szName = "涓冨紡路韪忔瓕", + nIcon = 2589, + nTime = 37, + }, + [3] = { + nIcon = 2589, + key = "鏄犳棩", + nTime = 0, + szName = "鏄犳棩", + nClass = 4, + }, + }, + dwID = 48218, + }, + { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈掕摦瀛愬妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 48219, + }, + { + dwID = 48204, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣涙瘺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48205, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48207, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48211, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭ュ績鐏帶鍒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48212, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 48234, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹犅峰够", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [237] = { + [13] = { + dwID = 48728, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹犅峰够", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [7] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鏉庣櫧", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2589, + nTime = "8,琛岃垷;21,琛岃垷;34,琛岃垷;", + }, + { + nClass = 7, + szName = "浜屽紡路鐧绘〒", + nIcon = 2589, + nTime = 44, + }, + { + nClass = 6, + nIcon = 2589, + nTime = "0.75,婧栧倷閫插叆P2;0.45,婧栧倷閫插叆P3;", + }, + }, + dwID = 48680, + }, + [1] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闊撻潪姹", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + [2] = { + nFrame = 8, + key = "鍝佺鏇", + nTime = "84,鍝佺鏇;123,闊崇簭;163,闊崇簭;", + nIcon = 2589, + nClass = 7, + }, + [1] = { + nClass = 7, + nIcon = 2589, + key = "婧栧倷QTE", + nTime = "22,婧栧倷QTE;62,婧栧倷QTE;167,骞婚瓟鍟忓績鏇;", + }, + }, + dwID = 48730, + }, + [2] = { + dwID = 48727, + tCountdown = { + { + nClass = 3, + szName = "闊崇簭娑堝け", + nIcon = 2589, + nTime = 14, + }, + }, + nFrame = 57, + }, + [4] = { + nFrame = 57, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鑾洦", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 7, + nIcon = 2139, + nTime = "10,鍒嗗窛鎵嬄锋帓娴;26,鍒嗗窛鎵嬄锋帓娴;84,鍒嗗窛鎵嬄锋帓娴;", + }, + { + nClass = 7, + nIcon = 2589, + nTime = "33,閹崉鐪;62,濂旀祦鐖;90,鎯呯窉澶辨帶;", + }, + { + nClass = 6, + nIcon = 13, + nTime = "0.70,婧栧倷杞塒2;0.35,婧栧倷杞塒2;", + }, + }, + dwID = 48684, + }, + [8] = { + dwID = 48700, + tCountdown = { + { + nClass = 4, + nIcon = 2589, + nTime = "6,琛岃垷;15,琛岃垷;23,琛岃垷;", + }, + { + nIcon = 3404, + key = "闇ф暎(鍊掕▓鏅傜祼鏉熶簩娈佃烦)", + nTime = 28, + szName = "绾", + nClass = 4, + }, + { + nIcon = 2589, + key = "鏄犳棩", + nTime = 37, + szName = "涓冨紡路韪忔瓕", + nClass = 4, + }, + }, + nFrame = 57, + }, + [9] = { + [3] = { + tMark = { + [7] = true, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = true, + }, + }, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "闈掕摦瀛愬妽", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 52, + dwID = 48701, + }, + [5] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48717, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 0, + nTime = 13, + szName = "銆愮櫧闆层戞墦鏂", + nClass = 3, + nIcon = 2589, + }, + }, + }, + [10] = { + dwID = 48689, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鐭ュ績鐏帶鍒", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [3] = { + nFrame = 57, + [3] = { + tMark = { + [7] = true, + [1] = true, + [2] = true, + [4] = true, + [8] = true, + [9] = true, + [5] = true, + [10] = true, + [3] = true, + [6] = true, + }, + }, + dwID = 48703, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "骞婚瓟", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nClass = 3, + szName = "骞婚瓟闄勯珨", + nIcon = 3434, + nTime = 30, + }, + }, + }, + [6] = { + nFrame = 57, + [3] = { + tMark = { + [7] = false, + [1] = false, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 48706, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "榛冩硥绲曞奖", + tRelation = { + bAll = true, + }, + }, + }, + tCountdown = { + { + nFrame = 7, + nTime = 13, + szName = "銆愬妽銆戞墦鏂", + nClass = 3, + nIcon = 2589, + }, + }, + }, + [12] = { + dwID = 48693, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍙汉", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + [11] = { + dwID = 48692, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "姣涙瘺", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [349] = { + { + dwID = 62830, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐2", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娴佺伀鍖栬潬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64090, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀闅遍亖鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64091, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀娈夐亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64092, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀瀵╁垽鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64093, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀鎻ず鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64099, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀澶у姏澹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64100, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64121, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64414, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐3", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64415, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "鍐1", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + [350] = { + { + dwID = 62876, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "娴佺伀鍖栬潬", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64146, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀闅遍亖鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64147, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀娈夐亾鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64148, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀瀵╁垽鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64149, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀鎻ず鑰", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64155, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "绁嗘暀澶у姏澹", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64156, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀鐭", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64173, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "浼婄應鐩", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + { + dwID = 64185, + aFocus = { + { + nMaxDistance = 80, + szDisplay = "瀵掔帀绲愭櫠", + tRelation = { + bAll = true, + }, + }, + }, + nFrame = 47, + }, + }, + }, + DEBUFF = { + [130] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 3416, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + { + { + bFullScreen = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3454, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + }, + [134] = { + { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + }, + dwID = 3971, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4066, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [4] = { + nIcon = 1435, + dwID = 4001, + nLevel = 1, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + nLevel = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇よ窇鍕曪紒", + dwID = 3984, + }, + }, + [136] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3808, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3807, + }, + { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "棣笂闆㈤枊鍘熷湴", + dwID = 3799, + }, + }, + [138] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3808, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 3807, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 3781, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "棣笂闆㈤枊鍘熷湴", + dwID = 3799, + }, + }, + [140] = { + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [1] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4942, + }, + [2] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4249, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4658, + }, + [8] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4637, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鍚炴棩鏈堥﹨鏁o紒", + dwID = 4298, + }, + [10] = { + nLevel = 1, + nScrutinyType = 2, + nCount = 6, + col = { + 0, + 0, + 255, + }, + dwID = 4314, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [3] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4250, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4318, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 4313, + }, + }, + [148] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鏈遍洸", + szNote = "蹇幓槎粹槄蹇幓槎", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "娆插悙鍦拌懍", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鐧介湶", + szNote = "蹇幓鐡跺瓙鈽呭揩鍘荤摱瀛", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鐮撮潨澶╅杸", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "閹瓊闀锋洸", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "鏅浮鍏煶", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "榛戞礊", + szNote = "蹇幓鐕堚槄蹇幓鐕", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "纰ф捣", + szNote = "蹇幓灏忚埞鈽呭揩鍘诲皬鑸", + dwID = 1876, + }, + }, + [-9] = { + [13] = { + { + bScreenHead = true, + }, + nLevel = 2, + dwID = 9052, + }, + [7] = { + { + bScreenHead = true, + }, + dwID = 2337, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8894, + }, + [2] = { + { + bTeamChannel = true, + }, + dwID = 8290, + szName = "8290", + nLevel = 1, + }, + [4] = { + nLevel = 1, + dwID = 5866, + }, + [8] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2868, + }, + [9] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 7660, + }, + [5] = { + nLevel = 1, + dwID = 5865, + }, + [10] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 10777, + }, + [11] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2870, + }, + [3] = { + { + bScreenHead = true, + }, + dwID = 5866, + nLevel = 1, + }, + [6] = { + szName = "10803", + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bScreenHead = true, + }, + dwID = 10803, + nLevel = 1, + }, + [12] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2968, + }, + [14] = { + { + bScreenHead = true, + }, + nLevel = 1, + dwID = 2968, + }, + }, + [160] = { + { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5872, + nLevel = 1, + }, + { + dwID = 5871, + nLevel = 1, + szNote = "閬犻洟浜虹兢", + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [164] = { + { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5581, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5576, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + }, + [176] = { + [27] = { + szName = "灏佸収", + dwID = 7135, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6740, + }, + [38] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "灏佸収", + dwID = 6979, + }, + [3] = { + szName = "鎿嶄綔QTE", + dwID = 6874, + nLevel = 1, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE3", + szNote = "鎸夐嵉3333", + dwID = 6877, + }, + [5] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE2", + szNote = "鎸夐嵉2222", + dwID = 6876, + }, + [6] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE1", + szNote = "鎸夐嵉1111", + dwID = 6875, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bCenterAlarm = true, + }, + szNote = "蹇幓鎵剧櫧闆诧紒", + dwID = 6907, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bCenterAlarm = true, + }, + szNote = "蹇幓鎵鹃粦闆诧紒", + dwID = 6908, + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6976, + nLevel = 1, + col = { + 40, + 237, + 0, + }, + }, + [12] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6707, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6888, + }, + [16] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6576, + }, + [20] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bScreenHead = true, + bTeamChannel = true, + bFullScreen = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szNote = "娌荤檪閫熷害濂剁垎锛", + dwID = 6573, + }, + [24] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "骞", + dwID = 6859, + }, + [28] = { + szName = "鐪╂殘", + dwID = 6958, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [32] = { + szName = "瀹氳韩", + dwID = 6923, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [40] = { + { + bBuffList = true, + }, + dwID = 6965, + nLevel = 1, + }, + [48] = { + dwID = 6927, + nLevel = 1, + nCount = 2, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [33] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "灏佸収", + dwID = 6998, + }, + [41] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6949, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [49] = { + { + bBuffList = true, + }, + dwID = 6953, + nLevel = 1, + }, + [17] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽嗗垎鏁b槅鍒嗘暎鈽", + dwID = 6564, + }, + [21] = { + tCountdown = { + { + nIcon = 340, + nTime = 13, + szName = "楝奸瓍/鍣瓌鍑虹従", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 0, + 201, + 0, + }, + [1] = { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6869, + }, + [25] = { + { + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6778, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [29] = { + szName = "鐪╂殘", + dwID = 6977, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [34] = { + szName = "閹栬冻", + dwID = 6954, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [42] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6936, + nLevel = 2, + }, + [50] = { + { + bBuffList = true, + }, + dwID = 6956, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + bCenterAlarm = true, + }, + dwID = 7184, + nLevel = 1, + }, + [11] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 51, + 219, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6975, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6708, + }, + [15] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 6549, + }, + [18] = { + tCountdown = { + { + nIcon = 327, + nTime = 17, + szName = "閫g窔婧栧倷锛", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 232, + 9, + 202, + }, + [1] = { + bWhisperChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "鈽嗛仩闆汉缇も槅", + dwID = 6566, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6861, + }, + [26] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7110, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [30] = { + szName = "瀹氳韩", + dwID = 7004, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [36] = { + szName = "绻虫", + dwID = 6992, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [44] = { + nLevel = 1, + col = { + 244, + 252, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "铇囨浖鑾嶲TE", + dwID = 6917, + }, + [52] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 1, + col = { + 234, + 242, + 0, + }, + }, + [51] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [47] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "浠ょ嫄鍌稱TE", + dwID = 5197, + }, + [46] = { + { + bBuffList = true, + }, + dwID = 7871, + nLevel = 2, + }, + [39] = { + { + bBuffList = true, + }, + dwID = 6777, + nLevel = 1, + }, + [43] = { + nLevel = 1, + szName = "绂佺檪", + dwID = 6991, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [37] = { + szName = "绂佺檪", + dwID = 7026, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [45] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6940, + nLevel = 2, + }, + [35] = { + szName = "灏佸収", + dwID = 6935, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + tCountdown = { + { + nIcon = 3415, + nTime = 16, + szName = "涓嬩竴娆$伀鏄", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 240, + 40, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6826, + }, + [19] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6648, + }, + [23] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "鐪", + dwID = 6860, + }, + [31] = { + szName = "鐪╂殘", + dwID = 6955, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [178] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7285, + }, + { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + szName = "閹栬冻", + dwID = 7284, + }, + [4] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7297, + nLevel = 1, + }, + [8] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3398, + nTime = 28, + szName = "杩撮ⅷ鏈涙湀(绌块亷BOSS)", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7413, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [16] = { + nLevel = 1, + szName = "鎭愭嚰", + dwID = 7371, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [17] = { + nLevel = 1, + szName = "閹栬冻", + dwID = 7380, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [9] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7452, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [18] = { + nLevel = 1, + szName = "绻虫", + dwID = 7406, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7296, + nLevel = 1, + col = { + 237, + 0, + 229, + }, + }, + [10] = { + nLevel = 1, + szName = "棰ㄦ", + dwID = 7367, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 245, + 33, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7376, + tCountdown = { + { + nIcon = 4549, + nTime = 50, + szName = "鐥存柗鎯呰吀榛炲悕", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "鎯", + }, + [21] = { + nLevel = 1, + col = { + 234, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鎺ユ敹鍌峰", + dwID = 7554, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7369, + nLevel = 1, + col = { + 0, + 255, + 0, + }, + }, + [22] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "杞夌Щ", + dwID = 6653, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7299, + }, + [6] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7295, + nLevel = 1, + col = { + 0, + 226, + 242, + }, + }, + [12] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7374, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7534, + }, + [7] = { + { + bBuffList = true, + }, + dwID = 7287, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7375, + nLevel = 1, + }, + [23] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6661, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [19] = { + nLevel = 1, + col = { + 0, + 113, + 242, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鐥", + dwID = 7377, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7370, + nLevel = 1, + }, + }, + [182] = { + { + nLevel = 1, + col = { + 233, + 250, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鍏靛偔", + dwID = 7721, + }, + { + nLevel = 1, + col = { + 220, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7720, + tCountdown = { + { + nIcon = 4580, + nTime = 45, + szName = "涓嬩竴娉㈣櫅瀵", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "鍗冲皣璁婅韩", + }, + [4] = { + { + bBuffList = true, + }, + dwID = 7455, + nLevel = 1, + }, + [8] = { + nLevel = 1, + szName = "鐪╂殘", + dwID = 7639, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [16] = { + tCountdown = { + { + nIcon = 4531, + nTime = 50, + szName = "绱呰垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 232, + 0, + 31, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7479, + }, + [17] = { + tCountdown = { + { + nIcon = 4528, + nTime = 50, + szName = "缍犺垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 0, + 212, + 21, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7481, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 7474, + nLevel = 1, + }, + [18] = { + nLevel = 2, + col = { + 15, + 0, + 222, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 3419, + nTime = 50, + szName = "钘嶈垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽嗛仩闆汉缇も槅閬犻洟浜虹兢鈽", + dwID = 7483, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7454, + nLevel = 1, + }, + [10] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7472, + nLevel = 1, + }, + [20] = { + nLevel = 2, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 235, + 237, + 237, + }, + szName = "鐧借垶", + tCountdown = { + { + nIcon = 4494, + nTime = 50, + szName = "鐧借垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽嗛仩闆汉缇も槅閬犻洟浜虹兢鈽", + dwID = 7485, + }, + [21] = { + nLevel = 1, + szName = "鐪╂殘", + dwID = 7540, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [11] = { + tCountdown = { + { + nIcon = 4549, + nTime = 10, + szName = "榄呮儜路涓嬩竴娆¢毃姗熸妧鑳", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 245, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7583, + }, + [22] = { + nLevel = 1, + szName = "灏佸収", + dwID = 7737, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7460, + nLevel = 1, + }, + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7670, + nLevel = 1, + }, + [12] = { + tCountdown = { + { + nIcon = 4495, + nTime = 20, + szName = "鐏墷路涓嬩竴娆¢毃姗熸妧鑳", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nLevel = 1, + dwID = 7476, + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7541, + nLevel = 2, + }, + [25] = { + nLevel = 4, + nCount = 2, + bCheckLevel = true, + [1] = { + bFullScreen = true, + bBuffList = true, + bTeamPanel = true, + }, + col = { + 255, + 0, + 255, + }, + szNote = "鈽呴仩闆汉缇も槄閬犻洟浜虹兢鈽", + dwID = 6927, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7488, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + [26] = { + nLevel = 3, + col = { + 242, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 6964, + }, + [7] = { + { + bBuffList = true, + }, + dwID = 7661, + nLevel = 1, + }, + [14] = { + nLevel = 2, + col = { + 255, + 252, + 252, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "瀹氳韩", + dwID = 7487, + }, + [27] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7501, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7538, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [19] = { + nLevel = 1, + col = { + 64, + 32, + 64, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7480, + tCountdown = { + { + nIcon = 4529, + nTime = 50, + szName = "榛戣垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "榛戣垶", + }, + [15] = { + nLevel = 2, + nCount = 3, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7486, + }, + }, + [184] = { + { + tCountdown = { + { + nIcon = 4576, + nTime = 42, + szName = "婧栧倷QTE", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7607, + nLevel = 1, + [1] = { + bTeamPanel = true, + }, + }, + }, + [190] = { + { + { + bWhisperChannel = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7973, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7962, + }, + }, + [192] = { + { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呰棈", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8174, + }, + { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呯磪", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8027, + }, + [4] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "鎵捐棈钘嶈棈鐞", + szName = "鑱栫値", + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [16] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [17] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "浣犺鐬庡瓙榛炲悕", + szName = "榛炲悕", + }, + [9] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [18] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呭垏鍕垮仛浠讳綍鍕曚綔鈽", + dwID = 8340, + }, + [21] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "鈽呮敞鎰忔帶鍒跺堡鏁糕槄", + szName = "涓夋瘨", + }, + [11] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "鈽呬繚鎸佺Щ鍕曗槄", + dwID = 8199, + }, + [3] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "鎵剧磪绱呯磪鐞", + szName = "瀵掓剰", + }, + [6] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "钘嶁槅钃姳", + }, + [12] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [7] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "绱呪槅钃姳", + }, + [14] = { + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 20, + szName = "姣掕娑屽嫊", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [19] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "娉ㄦ剰琛閲", + dwID = 8313, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + }, + [196] = { + { + { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8369, + nLevel = 1, + }, + { + szName = "鐪╂殘", + dwID = 8308, + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8322, + nLevel = 1, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8332, + nLevel = 1, + }, + }, + [198] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "鈽呮敞鎰忔彌T鈽", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呮簴鍌欐壙鍌封槄", + dwID = 8343, + }, + }, + [200] = { + [6] = { + dwID = 8901, + nLevel = 2, + szName = "閲", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [2] = { + dwID = 8905, + nLevel = 2, + szName = "鍦", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [3] = { + dwID = 8904, + nLevel = 2, + szName = "鐏", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8912, + }, + [4] = { + dwID = 8903, + nLevel = 2, + szName = "姘", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [5] = { + dwID = 8902, + nLevel = 2, + szName = "鏈", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [7] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8948, + nLevel = 1, + }, + }, + [204] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8828, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9024, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8833, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8834, + }, + }, + [206] = { + [27] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "鈽呬繚鎸佺Щ鍕曗槄", + dwID = 8199, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [38] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "娉ㄦ剰琛閲", + dwID = 8313, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8220, + nLevel = 1, + }, + [5] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szNote = "鈽呭揩椹呮暎鈽", + dwID = 8014, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "鎵剧磪绱呯磪鐞", + szName = "瀵掓剰", + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "鎵捐棈钘嶈棈鐞", + szName = "鑱栫値", + }, + [10] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 8240, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8047, + nLevel = 1, + col = { + 255, + 31, + 255, + }, + }, + [20] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "钘嶁槅钃姳", + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [32] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "鈽呮敞鎰忛枊娓涘偡鈽", + dwID = 8215, + }, + [40] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [33] = { + tCountdown = { + { + nIcon = 4504, + nTime = 20, + szName = "姣掕娑屽嫊", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [41] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8319, + nLevel = 2, + }, + [17] = { + { + bBuffList = true, + }, + dwID = 8465, + nLevel = 1, + }, + [21] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "绱呪槅钃姳", + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8823, + szName = "闊虫路闄", + nLevel = 1, + }, + [29] = { + { + bBuffList = true, + }, + dwID = 8198, + nLevel = 1, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [42] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呭垏鍕垮仛浠讳綍鍕曚綔鈽", + dwID = 8340, + }, + [9] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8049, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 8239, + nLevel = 1, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8046, + nLevel = 1, + col = { + 255, + 31, + 255, + }, + }, + [18] = { + tCountdown = { + { + nClass = 1, + szName = "閫g窔", + nIcon = 3449, + nTime = 45, + }, + }, + col = { + 223, + 31, + 31, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8027, + nLevel = 3, + szName = "閫g窔鈽呯磪", + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8822, + szName = "闊虫路闄", + nLevel = 1, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [36] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "浣犺鐬庡瓙榛炲悕", + szName = "榛炲悕", + }, + [44] = { + nLevel = 1, + dwID = 8821, + col = { + 255, + 255, + 31, + }, + }, + [35] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [39] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + [46] = { + nLevel = 1, + dwID = 8356, + }, + [37] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [45] = { + nLevel = 1, + dwID = 8793, + }, + [43] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "鈽呮敞鎰忔帶鍒跺堡鏁糕槄", + szName = "涓夋瘨", + }, + [1] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [19] = { + tCountdown = { + { + nClass = 1, + szName = "閫g窔", + nIcon = 3448, + nTime = 45, + }, + }, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呰棈", + nLevel = 3, + dwID = 8174, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [31] = { + { + bBuffList = true, + }, + dwID = 8206, + nLevel = 1, + }, + }, + [212] = { + { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呰棈", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8174, + }, + { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呯磪", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8027, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "鎵捐棈钘嶈棈鐞", + szName = "鑱栫値", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [17] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "鈽呬繚鎸佺Щ鍕曗槄", + dwID = 8199, + }, + [9] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [31] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szNote = "鈽呭揩椹呮暎鈽", + dwID = 8014, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [10] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "鈽呮敞鎰忛枊娓涘偡鈽", + dwID = 8215, + }, + [30] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "鈽呮敞鎰忔帶鍒跺堡鏁糕槄", + szName = "涓夋瘨", + }, + [21] = { + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 20, + szName = "姣掕娑屽嫊", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [12] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "钘嶁槅钃姳", + }, + [24] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "浣犺鐬庡瓙榛炲悕", + szName = "榛炲悕", + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [25] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [13] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 223, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "绱呪槅钃姳", + }, + [26] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "娉ㄦ剰琛閲", + dwID = 8313, + }, + [27] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "鎵剧磪绱呯磪鐞", + szName = "瀵掓剰", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [29] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呭垏鍕垮仛浠讳綍鍕曚綔鈽", + dwID = 8340, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + }, + [218] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9188, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9032, + }, + }, + [220] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9229, + nLevel = 1, + szName = "鎺ユ敹鈶", + }, + [2] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [38] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [3] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9291, + nLevel = 1, + col = { + 37, + 239, + 2, + }, + }, + [4] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "涓嶈鍐嶄腑绗簩娆", + dwID = 9195, + }, + [5] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [6] = { + nLevel = 1, + dwID = 9244, + }, + [7] = { + dwID = 9239, + tCountdown = { + { + szName = "鐮存暤鍔嶆埃", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "鍗婃湀", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [8] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + col = { + 255, + 2, + 208, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [12] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9196, + }, + [14] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + dwID = 9402, + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + szNote = "涓涓涓涓", + szName = "涓涓涓", + }, + [16] = { + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 2, + 27, + 255, + }, + szName = "涓変笁涓", + nLevel = 1, + szNote = "涓変笁涓変笁", + dwID = 9404, + }, + [20] = { + { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nClass = -1, + szName = "鍚嶇ū", + nIcon = 13, + nTime = 10, + }, + }, + dwID = 9213, + nLevel = 1, + }, + [24] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9224, + szName = "杞夆憼", + nLevel = 1, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9230, + nLevel = 1, + szName = "鎺ユ敹鈶", + }, + [32] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [33] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [17] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [21] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9635, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9225, + szName = "杞夆憽", + nLevel = 1, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9231, + }, + [34] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9371, + }, + [9] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [11] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9122, + }, + [13] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [15] = { + nLevel = 1, + col = { + 255, + 197, + 40, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "浜屼簩浜屼簩", + szName = "浜屼簩浜", + }, + [18] = { + { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9412, + tCountdown = { + { + nIcon = 13, + nTime = 48, + szName = "榛炲悕绲愭潫", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9226, + szName = "杞夆憿", + nLevel = 1, + }, + [30] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [36] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [35] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "濂剁垎", + dwID = 9535, + }, + [1] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + }, + [19] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [23] = { + { + bBuffList = true, + }, + dwID = 9642, + nLevel = 1, + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + }, + [222] = { + [6] = { + szName = "閲", + dwID = 8901, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [2] = { + szName = "鍦", + dwID = 8905, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [3] = { + szName = "鐏", + dwID = 8904, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8912, + }, + [4] = { + szName = "姘", + dwID = 8903, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [5] = { + szName = "鏈", + dwID = 8902, + nLevel = 2, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + }, + [7] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8948, + }, + }, + [224] = { + { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8734, + }, + { + { + bBigFontAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + szNote = "涓嶈绔欐按瑁", + dwID = 8776, + }, + }, + [228] = { + [6] = { + szName = "閹栧畾路鑱栬", + nLevel = 1, + dwID = 8858, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8789, + nLevel = 1, + szName = "瀹氳韩", + }, + [3] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8790, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 8788, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8791, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 9317, + nLevel = 1, + }, + [7] = { + dwID = 8817, + nLevel = 1, + szNote = "閬犻洟浜虹兢", + [1] = { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + }, + }, + [230] = { + { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鐗藉紩", + nLevel = 2, + dwID = 9652, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9662, + nLevel = 2, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nIcon = 7051, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 2, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nIcon = 7054, + szName = "11111", + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nIcon = 7070, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8983, + nLevel = 1, + col = { + 242, + 255, + 2, + }, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8975, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nIcon = 7057, + szName = "44444", + }, + [12] = { + { + bCenterAlarm = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + col = { + 255, + 2, + 2, + }, + }, + [24] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8978, + nLevel = 2, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8985, + nLevel = 2, + col = { + 68, + 224, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + nClass = 1, + szName = "琛岃垷", + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nIcon = 7073, + szName = "33333", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8896, + nLevel = 2, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 8981, + col = { + 2, + 255, + 19, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 2, + }, + }, + [232] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 18, + szName = "涓夌挵閷潠", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nLevel = 1, + [1] = { + bBuffList = true, + }, + szName = "姘h鐖嗙櫦", + dwID = 9585, + nIcon = 4549, + }, + [4] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9291, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 9193, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "涓嶈鍐嶄腑绗簩娆", + dwID = 9195, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9429, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + nLevel = 1, + dwID = 9239, + tCountdown = { + { + nClass = 1, + szName = "鐮存暤鍔嶆埃", + nIcon = 4224, + nTime = 10, + }, + { + nClass = 1, + szName = "鍗婃湀", + nIcon = 2589, + nTime = 21, + }, + }, + [1] = { + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10062"] = true, + ["SKILL#10243"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "涓変笁涓変笁", + szName = "涓変笁涓", + }, + [24] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9225, + szName = "杞夆憽", + }, + [40] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9226, + szName = "杞夆憿", + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + dwID = 9412, + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "榛炲悕绲愭潫", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + col = { + 32, + 255, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9405, + szNote = "鍥涘洓鍥涘洓", + szName = "鍥涘洓鍥", + }, + [25] = { + dwID = 9420, + nLevel = 1, + tCountdown = { + { + nClass = 2, + szName = "涓榧撲綔姘", + nIcon = 2589, + nTime = 8, + }, + { + nClass = 2, + szName = "鍐嶆闅辫韩", + nIcon = 3408, + nTime = 12, + }, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9229, + szName = "鎺ユ敹鈶", + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "涓涓涓", + tCountdown = { + { + nClass = 2, + szName = "涓榧撲綔姘", + nIcon = 2589, + nTime = 6, + }, + { + nClass = 2, + szName = "鐒″爡涓嶆懅", + nIcon = 3409, + nTime = 10, + }, + }, + szNote = "涓涓涓涓", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "浜斾簲浜斾簲", + szName = "浜斾簲浜", + }, + [26] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9231, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9230, + nLevel = 1, + szName = "鎺ユ敹鈶", + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9537, + nLevel = 2, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9535, + szName = "濂剁垎", + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "浜屼簩浜屼簩", + szName = "浜屼簩浜", + }, + [23] = { + dwID = 9423, + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "涓榧撲綔姘", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "椋涜姳涔嬪垉", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "娑呮缍", + nRefresh = 400, + nClass = 1, + }, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憼", + dwID = 9224, + }, + }, + [234] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 18, + szName = "涓夌挵閷潠", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "姘h鐖嗙櫦", + dwID = 9585, + }, + [4] = { + { + bTeamPanel = true, + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 9291, + nLevel = 1, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bPartyBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "涓嶈鍐嶄腑绗簩娆", + dwID = 9195, + }, + [7] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + dwID = 9239, + tCountdown = { + { + szName = "鐮存暤鍔嶆埃", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "鍗婃湀", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10002"] = true, + ["SKILL#10243"] = true, + ["SKILL#10062"] = true, + ["SKILL#10389"] = true, + }, + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "涓変笁涓変笁", + szName = "涓変笁涓", + }, + [24] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憽", + dwID = 9225, + }, + [40] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憿", + dwID = 9226, + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "榛炲悕绲愭潫", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + dwID = 9412, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + col = { + 32, + 255, + 2, + }, + dwID = 9405, + szName = "鍥涘洓鍥", + szNote = "鍥涘洓鍥涘洓", + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + }, + [25] = { + nLevel = 1, + tCountdown = { + { + szName = "涓榧撲綔姘", + nClass = 2, + nIcon = 2589, + nTime = 8, + }, + { + szName = "鍐嶆闅辫韩", + nClass = 2, + nIcon = 3408, + nTime = 12, + }, + }, + dwID = 9420, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [29] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9229, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "涓涓涓", + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + szNote = "涓涓涓涓", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + dwID = 9406, + szNote = "浜斾簲浜斾簲", + szName = "浜斾簲浜", + }, + [26] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + dwID = 9231, + szName = "鎺ユ敹鈶", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9534, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9230, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9536, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "濂剁垎", + dwID = 9535, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "浜屼簩浜屼簩", + szName = "浜屼簩浜", + }, + [23] = { + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "涓榧撲綔姘", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "椋涜姳涔嬪垉", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + dwID = 9423, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憼", + dwID = 9224, + }, + }, + [236] = { + [27] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8988, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "姘h鐖嗙櫦", + dwID = 9585, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10238, + nLevel = 4, + }, + [5] = { + { + bTeamPanel = true, + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 9291, + nLevel = 1, + col = { + 26, + 209, + 2, + }, + }, + [6] = { + { + bPartyBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9193, + nLevel = 1, + col = { + 247, + 2, + 2, + }, + }, + [7] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "涓嶈鍐嶄腑绗簩娆", + dwID = 9195, + }, + [8] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9429, + nLevel = 1, + col = { + 223, + 31, + 255, + }, + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [12] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9245, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [16] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [20] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "浜屼簩浜屼簩", + szName = "浜屼簩浜", + }, + [24] = { + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "涓榧撲綔姘", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "椋涜姳涔嬪垉", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + dwID = 9423, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [32] = { + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "娑呮缍", + nRefresh = 400, + nClass = 1, + }, + }, + dwID = 9224, + szName = "杞夆憼", + }, + [40] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憽", + dwID = 9225, + }, + [41] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9409, + }, + [21] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "涓変笁涓変笁", + szName = "涓変笁涓", + }, + [25] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9422, + nLevel = 1, + }, + [29] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9635, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + szName = "杞夆憿", + dwID = 9226, + }, + [42] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [9] = { + dwID = 9239, + tCountdown = { + { + szName = "鐮存暤鍔嶆埃", + nClass = 1, + nIcon = 4224, + nTime = 10, + }, + { + szName = "鍗婃湀", + nClass = 1, + nIcon = 2589, + nTime = 21, + }, + }, + nLevel = 1, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [15] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9325, + }, + [18] = { + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "榛炲悕绲愭潫", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + dwID = 9412, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [22] = { + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 32, + 255, + 2, + }, + szName = "鍥涘洓鍥", + nLevel = 1, + szNote = "鍥涘洓鍥涘洓", + dwID = 9405, + }, + [26] = { + nLevel = 1, + tCountdown = { + { + szName = "涓榧撲綔姘", + nClass = 2, + nIcon = 2589, + nTime = 8, + }, + { + szName = "鍐嶆闅辫韩", + nClass = 2, + nIcon = 3408, + nTime = 12, + }, + }, + dwID = 9420, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + [30] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [36] = { + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9230, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "濂剁垎", + dwID = 9535, + }, + [35] = { + szName = "鎺ユ敹鈶", + dwID = 9229, + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 18, + szName = "涓夌挵閷潠", + nClass = 1, + }, + }, + dwID = 9155, + }, + [47] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9537, + col = { + 208, + 2, + 255, + }, + }, + [46] = { + { + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9536, + col = { + 255, + 2, + 208, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + szName = "鎺ユ敹鈶", + dwID = 9231, + nLevel = 1, + }, + [45] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9534, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [43] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "涓涓涓", + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + szNote = "涓涓涓涓", + dwID = 9402, + }, + [23] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "浜斾簲浜斾簲", + szName = "浜斾簲浜", + }, + [31] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + }, + [60] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鏈遍洸", + szNote = "蹇幓槎粹槄蹇幓槎", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "娆插悙鍦拌懍", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鐧介湶", + szNote = "蹇幓鐡跺瓙鈽呭揩鍘荤摱瀛", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1882, + szName = "鐮撮潨澶╅杸", + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "閹瓊闀锋洸", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "鏅浮鍏煶", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "榛戞礊", + szNote = "蹇幓鐕堚槄蹇幓鐕", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "纰ф捣", + szNote = "蹇幓灏忚埞鈽呭揩鍘诲皬鑸", + dwID = 1876, + }, + }, + [242] = { + [7] = { + nLevel = 2, + col = { + 238, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nIcon = 339, + szName = "闇滃嵃", + dwID = 10812, + }, + [1] = { + nLevel = 1, + dwID = 10797, + [1] = { + bBuffList = true, + }, + }, + [2] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "榛炲悕", + dwID = 10702, + nIcon = 3431, + }, + [4] = { + nLevel = 1, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10790, + col = { + 255, + 0, + 0, + }, + }, + [8] = { + nLevel = 1, + dwID = 10780, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [9] = { + nLevel = 1, + [1] = { + bBuffList = true, + }, + dwID = 10853, + }, + [5] = { + nLevel = 1, + dwID = 10773, + [1] = { + bBuffList = true, + }, + }, + [3] = { + nLevel = 1, + dwID = 10772, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [6] = { + nLevel = 1, + col = { + 246, + 5, + 255, + }, + szName = "闇滃嵃", + dwID = 10778, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + }, + }, + [244] = { + [7] = { + nLevel = 1, + col = { + 238, + 5, + 255, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 10778, + szName = "闇滃嵃", + }, + [1] = { + { + bBuffList = true, + }, + dwID = 10797, + nLevel = 1, + }, + [2] = { + nLevel = 1, + dwID = 10703, + [1] = { + bBuffList = true, + }, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10772, + nLevel = 1, + }, + [8] = { + nIcon = 339, + col = { + 238, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "闇滃嵃", + nLevel = 2, + dwID = 10812, + }, + [9] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10780, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 10790, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10853, + }, + [3] = { + nIcon = 3431, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + szName = "榛炲悕", + dwID = 10702, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 10773, + nLevel = 1, + }, + }, + [65] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1882, + szName = "鐮撮潨澶╅杸", + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "纰ф捣", + szNote = "蹇幓灏忚埞鈽呭揩鍘诲皬鑸", + dwID = 1876, + }, + [8] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "閹瓊闀锋洸", + dwID = 1884, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鏈遍洸", + szNote = "蹇幓槎粹槄蹇幓槎", + dwID = 1877, + }, + [1] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鐧介湶", + szNote = "蹇幓鐡跺瓙鈽呭揩鍘荤摱瀛", + dwID = 1875, + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "榛戞礊", + szNote = "蹇幓鐕堚槄蹇幓鐕", + dwID = 1878, + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鏅浮鍏煶", + dwID = 1881, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "娆插悙鍦拌懍", + dwID = 1883, + }, + }, + [131] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鏈遍洸", + szNote = "蹇幓槎粹槄蹇幓槎", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "娆插悙鍦拌懍", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鐧介湶", + szNote = "蹇幓鐡跺瓙鈽呭揩鍘荤摱瀛", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鐮撮潨澶╅杸", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "閹瓊闀锋洸", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "鏅浮鍏煶", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "榛戞礊", + szNote = "蹇幓鐕堚槄蹇幓鐕", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "纰ф捣", + szNote = "蹇幓灏忚埞鈽呭揩鍘诲皬鑸", + dwID = 1876, + }, + }, + [133] = { + [6] = { + nIcon = 1435, + dwID = 4001, + nLevel = 1, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 3657, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + }, + dwID = 3971, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + [1] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bScreenHead = true, + }, + nIcon = 371, + dwID = 3773, + }, + [4] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4066, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [5] = { + nLevel = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇よ窇鍕曪紒", + dwID = 3984, + }, + }, + [68] = { + [7] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [1] = { + dwID = 2179, + nLevel = 4, + szNote = "娉ㄦ剰椹呮暎锛", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [2] = { + dwID = 2172, + nLevel = 4, + nCount = 30, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 3877, + nIcon = 1435, + szName = "鍘熺姜绺涚┐琛撻粸鍚", + }, + [8] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇わ紒", + dwID = 2628, + }, + [9] = { + nLevel = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2629, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 917, + nTime = 123, + szName = "铏涘急鍓╅鏅傞枔", + nRefresh = 7, + nClass = 1, + }, + }, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2243, + nLevel = 4, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "蹇叉按姹狅紒", + dwID = 2181, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2231, + nLevel = 4, + col = { + 255, + 255, + 0, + }, + }, + }, + [69] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 2243, + col = { + 255, + 0, + 255, + }, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2632, + }, + [3] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇わ紒", + dwID = 2628, + }, + [1] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3877, + nIcon = 1435, + szName = "鍘熺姜绺涚┐琛撻粸鍚", + }, + [4] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 4, + dwID = 2231, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "蹇叉按姹狅紒", + dwID = 2181, + }, + }, + [70] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 2243, + col = { + 255, + 0, + 255, + }, + }, + [2] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [3] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇わ紒", + dwID = 2628, + }, + [1] = { + nIcon = 1435, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3877, + nLevel = 4, + szName = "鍘熺姜绺涚┐琛撻粸鍚", + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2632, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 4, + dwID = 2231, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "蹇叉按姹狅紒", + dwID = 2181, + }, + }, + [72] = { + [7] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2631, + nLevel = 4, + }, + [1] = { + dwID = 2179, + nLevel = 4, + szNote = "娉ㄦ剰椹呮暎锛", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [2] = { + dwID = 2172, + nLevel = 4, + nCount = 30, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [4] = { + nLevel = 4, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 3877, + nIcon = 1435, + szName = "鍘熺姜绺涚┐琛撻粸鍚", + }, + [8] = { + nLevel = 4, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "蹇仩闆汉缇わ紒", + dwID = 2628, + }, + [9] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2632, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 2243, + nLevel = 4, + col = { + 255, + 0, + 255, + }, + }, + [3] = { + nLevel = 4, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szNote = "蹇叉按姹狅紒", + dwID = 2181, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 2231, + nLevel = 4, + col = { + 255, + 255, + 0, + }, + }, + }, + [155] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4942, + }, + { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4249, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4658, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4318, + }, + [16] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4651, + }, + [17] = { + dwID = 4351, + nLevel = 1, + nRelScrutinyType = 3, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4899, + }, + [18] = { + nIcon = 1435, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "榛炲悕鎾為悩", + nLevel = 1, + dwID = 4378, + }, + [5] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4338, + }, + [10] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [20] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5079, + }, + [21] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 5096, + }, + [11] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + bCheckLevel = true, + dwID = 4309, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + bCheckLevel = true, + dwID = 5096, + }, + [3] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4250, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鍚炴棩鏈堥﹨鏁o紒", + dwID = 4298, + }, + [12] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4310, + }, + [24] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5081, + }, + [25] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5195, + nRelScrutinyType = 3, + tCountdown = { + { + nIcon = 3409, + nTime = 19, + szName = "鏉庡撹櫅寮卞墿椁樻檪闁", + nRefresh = 7, + nClass = 1, + }, + }, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 4637, + }, + [26] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamPanel = true, + }, + dwID = 4403, + }, + [27] = { + nLevel = 2, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4404, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "娉ㄦ剰瑙i櫎鍏ㄥ湗瀹氳韩", + dwID = 4299, + }, + [14] = { + nLevel = 1, + nScrutinyType = 2, + nCount = 6, + col = { + 0, + 0, + 255, + }, + dwID = 4314, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [28] = { + nIcon = 1435, + nScrutinyType = 2, + col = { + 0, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szName = "鐗㈢睜琚帠", + nLevel = 1, + dwID = 5084, + }, + [23] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5157, + }, + [19] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 4460, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 4313, + }, + }, + [165] = { + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5898, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + dwID = 5600, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 6006, + nLevel = 1, + }, + [8] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5579, + nLevel = 2, + col = { + 0, + 255, + 0, + }, + }, + [16] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 5536, + nLevel = 1, + }, + [17] = { + { + bBuffList = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + dwID = 5539, + nLevel = 1, + }, + [9] = { + szName = "鐪╂殘", + dwID = 5578, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [18] = { + szName = "鐪╂殘", + dwID = 5958, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2022, + nTime = 30, + szName = "涓嬩竴娆℃埌鐙奸粸鍚", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 5513, + }, + [5] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5599, + nLevel = 1, + }, + [10] = { + szName = "閹栬冻", + dwID = 5580, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5684, + nLevel = 1, + }, + [30] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5522, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 5713, + }, + [11] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5576, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5688, + nLevel = 1, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5491, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 5493, + nLevel = 1, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5595, + nLevel = 5, + }, + [24] = { + nLevel = 1, + col = { + 245, + 5, + 21, + }, + [1] = { + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "绱", + dwID = 5403, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5712, + nLevel = 1, + }, + [25] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "钘", + dwID = 5404, + }, + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5592, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [26] = { + { + bBuffList = true, + }, + dwID = 5406, + nLevel = 2, + col = { + 0, + 8, + 245, + }, + }, + [27] = { + { + bBuffList = true, + }, + dwID = 5405, + nLevel = 2, + col = { + 245, + 0, + 41, + }, + }, + [7] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5581, + nLevel = 2, + col = { + 255, + 255, + 0, + }, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5593, + nLevel = 4, + }, + [28] = { + { + bBuffList = true, + }, + dwID = 5717, + nLevel = 2, + }, + [23] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5701, + nLevel = 1, + }, + [29] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5516, + nLevel = 1, + }, + [15] = { + dwID = 5546, + nLevel = 1, + szNote = "娌荤檪璜嬪嬁鎺涙寔绾岋紒", + [1] = { + bBuffList = true, + }, + }, + }, + [171] = { + [6] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5329, + nLevel = 1, + }, + [2] = { + dwID = 5871, + nLevel = 1, + szNote = "閬犻洟浜虹兢", + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5476, + nLevel = 1, + }, + [1] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5872, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 5477, + nLevel = 1, + }, + [5] = { + dwID = 5331, + nLevel = 1, + szNote = "閬犻洟浜虹兢鎺掔伀锛", + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [175] = { + [27] = { + { + bBuffList = true, + }, + dwID = 6777, + nLevel = 1, + }, + [2] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE3", + szNote = "鎸夐嵉3333", + dwID = 6877, + }, + [3] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE2", + szNote = "鎸夐嵉2222", + dwID = 6876, + }, + [4] = { + nLevel = 1, + nIcon = 3410, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + }, + szName = "QTE1", + szNote = "鎸夐嵉1111", + dwID = 6875, + }, + [5] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6707, + }, + [6] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 0, + }, + [1] = { + bScreenHead = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = true, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + dwID = 6549, + }, + [7] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽嗗垎鏁b槅鍒嗘暎鈽", + dwID = 6564, + }, + [8] = { + tCountdown = { + { + nIcon = 327, + nTime = 17, + szName = "閫g窔婧栧倷锛", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 232, + 9, + 202, + }, + [1] = { + bWhisperChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "鈽嗛仩闆汉缇も槅", + dwID = 6566, + }, + [10] = { + tCountdown = { + { + nIcon = 340, + nTime = 13, + szName = "楝奸瓍/鍣瓌鍑虹従", + nRefresh = 7, + nClass = 1, + }, + }, + nScrutinyType = 2, + col = { + 0, + 201, + 0, + }, + [1] = { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 6869, + }, + [12] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "鐪", + dwID = 6860, + }, + [14] = { + { + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6778, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [16] = { + szName = "鐪╂殘", + dwID = 6958, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + szName = "瀹氳韩", + dwID = 6923, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [24] = { + szName = "绻虫", + dwID = 6992, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6949, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [32] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "浠ょ嫄鍌稱TE", + dwID = 5197, + }, + [33] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [17] = { + szName = "鐪╂殘", + dwID = 6977, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "灏佸収", + dwID = 6998, + }, + [25] = { + szName = "绂佺檪", + dwID = 7026, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6936, + nLevel = 2, + }, + [34] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 1, + col = { + 234, + 242, + 0, + }, + }, + [9] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bScreenHead = true, + bTeamChannel = true, + bFullScreen = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = true, + [3] = false, + [6] = false, + }, + }, + szNote = "娌荤檪閫熷害濂剁垎锛", + dwID = 6573, + }, + [11] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bCenterAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6861, + }, + [13] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bBuffList = true, + }, + szName = "骞", + dwID = 6859, + }, + [15] = { + szName = "灏佸収", + dwID = 7135, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [18] = { + szName = "瀹氳韩", + dwID = 7004, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [22] = { + szName = "閹栬冻", + dwID = 6954, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [26] = { + nLevel = 1, + nScrutinyType = 2, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "灏佸収", + dwID = 6979, + }, + [30] = { + szName = "绂佺檪", + dwID = 6991, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + szName = "鎿嶄綔QTE", + dwID = 6874, + nLevel = 1, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [19] = { + szName = "鐪╂殘", + dwID = 6955, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [23] = { + szName = "灏佸収", + dwID = 6935, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + col = { + 244, + 252, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "铇囨浖鑾嶲TE", + dwID = 6917, + }, + }, + [177] = { + [13] = { + nLevel = 1, + col = { + 234, + 242, + 0, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鎺ユ敹鍌峰", + dwID = 7554, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7534, + }, + [1] = { + { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7297, + nLevel = 1, + }, + [2] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7296, + nLevel = 1, + col = { + 237, + 0, + 229, + }, + }, + [4] = { + nLevel = 1, + tCountdown = { + { + nIcon = 3398, + nTime = 28, + szName = "杩撮ⅷ鏈涙湀(绌块亷BOSS)", + nRefresh = 7, + nClass = 1, + }, + }, + dwID = 7413, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [8] = { + nLevel = 1, + szName = "鎭愭嚰", + dwID = 7371, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [15] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6661, + nLevel = 2, + col = { + 255, + 0, + 255, + }, + }, + [9] = { + nLevel = 1, + szName = "閹栬冻", + dwID = 7380, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7452, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [10] = { + nLevel = 1, + szName = "绻虫", + dwID = 7406, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7295, + nLevel = 1, + col = { + 0, + 226, + 242, + }, + }, + [11] = { + nLevel = 1, + col = { + 0, + 113, + 242, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鐥", + dwID = 7377, + }, + [6] = { + { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7374, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + nLevel = 1, + col = { + 245, + 33, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7376, + tCountdown = { + { + nIcon = 4549, + nTime = 50, + szName = "鐥存柗鎯呰吀榛炲悕", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "鎯", + }, + [14] = { + nLevel = 1, + col = { + 0, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "杞夌Щ", + dwID = 6653, + }, + }, + [179] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 6929, + }, + }, + [183] = { + [27] = { + nLevel = 1, + szName = "灏佸収", + dwID = 7737, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 6953, + nLevel = 1, + }, + [38] = { + dwID = 6955, + nLevel = 1, + szName = "鐪╂殘", + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 6956, + nLevel = 1, + }, + [4] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 220, + 0, + 245, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7169, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7722, + nLevel = 1, + }, + [6] = { + nLevel = 1, + col = { + 233, + 250, + 0, + }, + [1] = { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鍏靛偔", + dwID = 7721, + }, + [7] = { + nLevel = 1, + col = { + 220, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7720, + tCountdown = { + { + nIcon = 4580, + nTime = 45, + szName = "涓嬩竴娉㈣櫅瀵", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "鍗冲皣璁婅韩", + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7460, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7454, + nLevel = 1, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7661, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 7474, + nLevel = 1, + }, + [16] = { + tCountdown = { + { + nIcon = 4549, + nTime = 10, + szName = "榄呮儜路涓嬩竴娆¢毃姗熸妧鑳", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 245, + 0, + 245, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7583, + }, + [20] = { + nLevel = 2, + nCount = 3, + col = { + 255, + 255, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7486, + }, + [24] = { + nLevel = 1, + col = { + 64, + 32, + 64, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7480, + tCountdown = { + { + nIcon = 4529, + nTime = 50, + szName = "榛戣垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szName = "榛戣垶", + }, + [28] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7538, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [32] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6964, + nLevel = 3, + col = { + 242, + 242, + 0, + }, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7383, + nLevel = 1, + }, + [17] = { + tCountdown = { + { + nIcon = 4495, + nTime = 20, + szName = "鐏墷路涓嬩竴娆¢毃姗熸妧鑳", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = false, + [6] = false, + }, + }, + nLevel = 1, + dwID = 7476, + }, + [21] = { + tCountdown = { + { + nIcon = 4531, + nTime = 50, + szName = "绱呰垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 232, + 0, + 31, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7479, + }, + [25] = { + nLevel = 2, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 235, + 237, + 237, + }, + szName = "鐧借垶", + tCountdown = { + { + nIcon = 4494, + nTime = 50, + szName = "鐧借垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽嗛仩闆汉缇も槅閬犻洟浜虹兢鈽", + dwID = 7485, + }, + [29] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7541, + nLevel = 2, + }, + [34] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7382, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 7455, + nLevel = 1, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7670, + nLevel = 1, + }, + [13] = { + nLevel = 1, + szName = "鐪╂殘", + dwID = 7639, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [15] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7472, + nLevel = 1, + }, + [18] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7488, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + [22] = { + tCountdown = { + { + nIcon = 4528, + nTime = 50, + szName = "缍犺垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + col = { + 0, + 212, + 21, + }, + [1] = { + bFullScreen = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 7481, + }, + [26] = { + nLevel = 1, + szName = "鐪╂殘", + dwID = 7540, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [30] = { + nLevel = 4, + nCount = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bFullScreen = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6927, + }, + [36] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7501, + nLevel = 1, + }, + [37] = { + dwID = 6958, + nLevel = 1, + szName = "鐪╂殘", + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [35] = { + { + bBuffList = true, + }, + dwID = 7513, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6940, + nLevel = 2, + }, + [19] = { + nLevel = 2, + col = { + 255, + 252, + 252, + }, + [1] = { + bWhisperChannel = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "瀹氳韩", + dwID = 7487, + }, + [23] = { + nLevel = 2, + col = { + 15, + 0, + 222, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 3419, + nTime = 50, + szName = "钘嶈垶宸茶Ц鐧", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽嗛仩闆汉缇も槅閬犻洟浜虹兢鈽", + dwID = 7483, + }, + [31] = { + { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7578, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + }, + [187] = { + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7895, + nLevel = 1, + }, + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7896, + nLevel = 1, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7874, + nLevel = 1, + }, + }, + [189] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + bWhisperChannel = true, + }, + [1] = { + bScreenHead = true, + bPartyBuffList = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + szNote = "鍦板埡鍑虹従", + dwID = 7972, + }, + }, + [191] = { + [7] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [5] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呮簴鍌欐壙鍌封槄", + dwID = 8343, + }, + [3] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [6] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + }, + [199] = { + [27] = { + { + bBuffList = true, + }, + dwID = 8306, + nLevel = 1, + }, + [2] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呯磪", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8027, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 8028, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + dwID = 8010, + nLevel = 2, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 8029, + nLevel = 1, + }, + [6] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8036, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + [7] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8040, + szNote = "鎵剧磪绱呯磪鐞", + szName = "瀵掓剰", + }, + [8] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8039, + szNote = "鎵捐棈钘嶈棈鐞", + szName = "鑱栫値", + }, + [10] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8044, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 8239, + nLevel = 1, + }, + [14] = { + { + bBuffList = true, + }, + dwID = 8465, + nLevel = 1, + }, + [16] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 31, + 31, + }, + dwID = 8170, + tCountdown = { + { + nIcon = 3400, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "绱呪槅钃姳", + }, + [20] = { + nLevel = 1, + col = { + 255, + 0, + 0, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "鈽呬繚鎸佺Щ鍕曗槄", + dwID = 8199, + }, + [24] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + }, + szNote = "鈽呮敞鎰忛枊娓涘偡鈽", + dwID = 8215, + }, + [28] = { + nLevel = 1, + col = { + 127, + 31, + 255, + }, + [1] = { + bFullScreen = true, + bBigFontAlarm = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8224, + szNote = "浣犺鐬庡瓙榛炲悕", + szName = "榛炲悕", + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8352, + nLevel = 1, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8319, + nLevel = 2, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7996, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [21] = { + { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + dwID = 8196, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [25] = { + tCountdown = { + { + nIcon = 4504, + key = "姣掕娑屽嫊", + nTime = 20, + szName = "姣掕娑屽嫊", + nRefresh = 0, + nClass = 1, + }, + }, + col = { + 255, + 0, + 0, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8305, + }, + [29] = { + { + bTeamChannel = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8307, + nLevel = 2, + }, + [34] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamChannel = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呭垏鍕垮仛浠讳綍鍕曚綔鈽", + dwID = 8340, + }, + [9] = { + { + bTeamChannel = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8045, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + dwID = 8240, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 8241, + nLevel = 1, + }, + [15] = { + nLevel = 1, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 31, + 63, + 223, + }, + dwID = 8172, + tCountdown = { + { + nIcon = 3401, + nTime = 20, + szName = "钃姳鎸", + nRefresh = 7, + nClass = 1, + }, + }, + szNote = "鈽呴仩闆汉缇も槄", + szName = "钘嶁槅钃姳", + }, + [18] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7992, + nLevel = 1, + }, + [22] = { + { + bBuffList = true, + }, + dwID = 8198, + nLevel = 1, + }, + [26] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8312, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [30] = { + nLevel = 1, + col = { + 0, + 255, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "娉ㄦ剰琛閲", + dwID = 8313, + }, + [36] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "鈽呭揩椹呮暎鈽", + dwID = 8014, + }, + [35] = { + nLevel = 1, + nScrutinyType = 1, + col = { + 0, + 255, + 0, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8347, + szNote = "鈽呮敞鎰忔帶鍒跺堡鏁糕槄", + szName = "涓夋瘨", + }, + [1] = { + nLevel = 1, + col = { + 31, + 63, + 223, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "閫g窔鈽呰棈", + szNote = "鈽呮姳鍦橀粸鎺掔悆鈽", + dwID = 8174, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7993, + nLevel = 1, + }, + [23] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8042, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [31] = { + { + bBuffList = true, + }, + dwID = 8351, + nLevel = 1, + }, + }, + [203] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8734, + }, + { + { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "涓嶈绔欐按瑁", + dwID = 8776, + }, + }, + [205] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "鈽呮敞鎰忔彌T鈽", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呮簴鍌欐壙鍌封槄", + dwID = 8343, + }, + }, + [209] = { + [6] = { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8858, + szName = "閹栧畾路鑱栬", + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8789, + szName = "瀹氳韩", + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8790, + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8788, + }, + [4] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8791, + }, + [5] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9317, + }, + [7] = { + { + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + nLevel = 1, + szNote = "閬犻洟浜虹兢", + dwID = 8817, + }, + }, + [211] = { + [7] = { + { + bBuffList = true, + }, + dwID = 8392, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 8217, + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 8083, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7360, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [8] = { + { + bBuffList = true, + }, + dwID = 7942, + nLevel = 1, + }, + [9] = { + { + bBuffList = true, + }, + dwID = 8346, + nLevel = 1, + }, + [5] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8380, + nLevel = 1, + }, + [10] = { + { + bBuffList = true, + }, + dwID = 8013, + nLevel = 1, + }, + [3] = { + nLevel = 1, + nCount = 5, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + nIcon = 346, + szNote = "鈽呮敞鎰忔彌T鈽", + dwID = 8084, + }, + [6] = { + nLevel = 1, + col = { + 255, + 0, + 255, + }, + [1] = { + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szNote = "鈽呮簴鍌欐壙鍌封槄", + dwID = 8343, + }, + }, + [221] = { + [13] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8975, + }, + [7] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 1, + }, + [1] = { + { + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鐗藉紩", + nLevel = 1, + dwID = 9652, + }, + [2] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9663, + }, + [4] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 8895, + nLevel = 1, + }, + [8] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 8896, + nLevel = 1, + }, + [10] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8983, + nLevel = 1, + col = { + 208, + 255, + 2, + }, + }, + [3] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 161, + 9, + 232, + }, + }, + [6] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 1, + }, + [12] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 2, + 255, + 19, + }, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + }, + [-1] = { + { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + szName = "绻虫", + dwID = 4053, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6756, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8391, + }, + [8] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6426, + nIcon = 4534, + szName = "澶╁湴鏍", + }, + [16] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6394, + nIcon = 3406, + szName = "闆风壒鏁", + }, + [17] = { + nIcon = 2589, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 2584, + nLevel = 1, + szName = "姗欐CD", + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 2911, + nIcon = 1439, + szName = "闆ㄩ泦", + }, + [18] = { + nLevel = 1, + [2] = { + bTeamChannel = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 9299, + }, + [5] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5697, + nLevel = 1, + }, + [10] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8218, + nIcon = 913, + szName = "涓婂厓CD", + }, + [20] = { + tCountdown = { + { + nClass = 1, + szName = "鎸栧CD", + nIcon = 13, + nTime = 60, + }, + }, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "鎸栧CD", + nIcon = 2409, + nLevel = 1, + dwID = 1895, + }, + [21] = { + nLevel = 3, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 10175, + szName = "涓夐紦", + }, + [11] = { + nIcon = 4571, + [1] = { + bBuffList = true, + }, + nLevel = 1, + szName = "涓夌敓CD", + dwID = 6195, + }, + [22] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 219, + 61, + 255, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 10186, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 2316, + }, + [6] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 7656, + nIcon = 4513, + szName = "澶ф紶", + }, + [12] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8509, + nIcon = 3224, + szName = "铦曡倢涔嬪偡", + }, + [13] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 3287, + nIcon = 3237, + szName = "铦曡倢鍖栬", + }, + [7] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 6359, + nIcon = 3242, + szName = "娴佹槦瓒曟湀", + }, + [14] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 3286, + nIcon = 3229, + szName = "濂у鐒$", + }, + [19] = { + dwID = 10050, + nLevel = 1, + }, + [15] = { + nLevel = 1, + szName = "琛屾埃琛", + dwID = 6267, + [1] = { + bBuffList = true, + }, + }, + [23] = { + nLevel = 1, + dwID = 10827, + [1] = { + bBuffList = true, + }, + }, + }, + [225] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8752, + }, + { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8773, + }, + }, + [227] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + dwID = 8828, + nLevel = 1, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9024, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8833, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8834, + nLevel = 1, + }, + }, + [229] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9188, + }, + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9032, + }, + }, + [231] = { + [27] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9213, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9189, + col = { + 255, + 0, + 238, + }, + }, + [38] = { + nLevel = 1, + col = { + 255, + 2, + 217, + }, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + tCountdown = { + { + nIcon = 2589, + key = "涓夌挵閷潠", + nTime = 18, + szName = "涓夌挵閷潠", + nClass = 1, + }, + }, + dwID = 9155, + }, + [3] = { + nIcon = 4549, + [1] = { + bBuffList = true, + }, + szName = "姘h鐖嗙櫦", + dwID = 9585, + nLevel = 1, + }, + [4] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9291, + col = { + 26, + 209, + 2, + }, + }, + [5] = { + { + bTeamPanel = true, + tMark = { + [7] = false, + [1] = false, + [2] = false, + [4] = false, + [8] = false, + [9] = false, + [5] = true, + [10] = false, + [3] = false, + [6] = false, + }, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 9193, + col = { + 247, + 2, + 2, + }, + }, + [6] = { + nLevel = 1, + col = { + 216, + 8, + 8, + }, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "涓嶈鍐嶄腑绗簩娆", + dwID = 9195, + }, + [7] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9429, + col = { + 223, + 31, + 255, + }, + }, + [8] = { + nLevel = 1, + dwID = 9239, + tCountdown = { + { + nClass = 1, + szName = "鐮存暤鍔嶆埃", + nIcon = 4224, + nTime = 10, + }, + { + nClass = 1, + szName = "鍗婃湀", + nIcon = 2589, + nTime = 21, + }, + }, + [1] = { + bWhisperChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9240, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9203, + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9325, + }, + [16] = { + dwID = 9409, + tKungFu = { + ["SKILL#10062"] = true, + ["SKILL#10002"] = true, + ["SKILL#10389"] = true, + ["SKILL#10243"] = true, + }, + nLevel = 1, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [20] = { + nLevel = 1, + col = { + 2, + 27, + 255, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9404, + szNote = "涓変笁涓変笁", + szName = "涓変笁涓", + }, + [24] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9422, + nLevel = 1, + }, + [28] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 9635, + }, + [32] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9225, + szName = "杞夆憽", + }, + [40] = { + { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9898, + }, + [33] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9226, + szName = "杞夆憿", + }, + [41] = { + { + bBigFontAlarm = true, + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9899, + }, + [17] = { + dwID = 9412, + tCountdown = { + { + nIcon = 2589, + nTime = 48, + szName = "榛炲悕绲愭潫", + nRefresh = 0, + nClass = 1, + }, + }, + nLevel = 1, + [1] = { + bTeamChannel = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [21] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 32, + 255, + 2, + }, + dwID = 9405, + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + szNote = "鍥涘洓鍥涘洓", + szName = "鍥涘洓鍥", + }, + [25] = { + dwID = 9420, + nLevel = 1, + tCountdown = { + { + nClass = 2, + szName = "涓榧撲綔姘", + nIcon = 2589, + nTime = 8, + }, + { + nClass = 2, + szName = "鍐嶆闅辫韩", + nIcon = 3408, + nTime = 12, + }, + }, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [29] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9642, + }, + [34] = { + nLevel = 1, + dwID = 9229, + szName = "鎺ユ敹鈶", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [42] = { + { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9778, + }, + [9] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9244, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 9245, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9196, + }, + [15] = { + { + bBuffList = true, + }, + dwID = 9122, + nLevel = 1, + }, + [18] = { + nLevel = 1, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + col = { + 255, + 255, + 255, + }, + szName = "涓涓涓", + tCountdown = { + { + nIcon = 2589, + key = "涓榧撲綔姘", + nTime = 5, + szName = "涓榧撲綔姘", + nClass = 2, + }, + { + nIcon = 3409, + key = "鐒″爡涓嶆懅", + nTime = 10, + szName = "鐒″爡涓嶆懅", + nClass = 2, + }, + }, + szNote = "涓涓涓涓", + dwID = 9402, + }, + [22] = { + nLevel = 1, + col = { + 255, + 2, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9406, + szNote = "浜斾簲浜斾簲", + szName = "浜斾簲浜", + }, + [26] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8988, + }, + [30] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9762, + }, + [36] = { + nLevel = 1, + szName = "鎺ユ敹鈶", + dwID = 9231, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [44] = { + { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9534, + col = { + 255, + 2, + 2, + }, + }, + [35] = { + nLevel = 1, + dwID = 9230, + szName = "鎺ユ敹鈶", + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [39] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9371, + }, + [46] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9537, + nLevel = 2, + col = { + 208, + 2, + 255, + }, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9761, + }, + [45] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 9536, + nLevel = 2, + col = { + 255, + 2, + 208, + }, + }, + [43] = { + nLevel = 2, + col = { + 65, + 255, + 2, + }, + [1] = { + bBigFontAlarm = true, + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9535, + szName = "濂剁垎", + }, + [1] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9562, + }, + [19] = { + nLevel = 1, + col = { + 255, + 187, + 2, + }, + [1] = { + bTeamChannel = true, + bFullScreen = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9403, + szNote = "浜屼簩浜屼簩", + szName = "浜屼簩浜", + }, + [23] = { + dwID = 9423, + tCountdown = { + { + nIcon = 2589, + nTime = 5, + szName = "涓榧撲綔姘", + nRefresh = 50, + nClass = 2, + }, + { + nIcon = 2589, + nTime = 11, + szName = "椋涜姳涔嬪垉", + nRefresh = 50, + nClass = 2, + }, + }, + nLevel = 2, + [1] = { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + }, + [31] = { + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + tCountdown = { + { + nIcon = 13, + nTime = 11, + szName = "娑呮缍", + nRefresh = 400, + nClass = 1, + }, + }, + szName = "杞夆憼", + dwID = 9224, + }, + }, + [233] = { + { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "鐗藉紩", + nLevel = 2, + dwID = 9652, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9662, + nLevel = 2, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nIcon = 7051, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8918, + nLevel = 2, + }, + [17] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nIcon = 7054, + szName = "11111", + }, + [18] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nIcon = 7070, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9664, + nLevel = 1, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8975, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nIcon = 7057, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8978, + nLevel = 2, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 8985, + nLevel = 2, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + nClass = 1, + szName = "琛岃垷", + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nIcon = 7073, + szName = "33333", + }, + [14] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8896, + nLevel = 2, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 8981, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8916, + nLevel = 2, + }, + }, + [235] = { + { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + szName = "鐗藉紩", + dwID = 9652, + nLevel = 2, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9662, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nIcon = 7051, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nLevel = 2, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8918, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nIcon = 7054, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nLevel = 2, + szName = "11111", + }, + [18] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nIcon = 7070, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nLevel = 2, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9664, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8975, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nIcon = 7057, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nLevel = 2, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8978, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8985, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + szName = "琛岃垷", + nClass = 1, + nIcon = 2589, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = false, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nIcon = 7073, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nLevel = 2, + szName = "33333", + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8896, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8916, + }, + }, + [237] = { + { + { + bScreenHead = true, + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + szName = "鐗藉紩", + dwID = 9652, + nLevel = 2, + }, + { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9653, + }, + [4] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 9662, + col = { + 224, + 15, + 179, + }, + }, + [8] = { + nIcon = 7051, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9657, + nLevel = 2, + szName = "22222", + }, + [16] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8918, + }, + [17] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8970, + }, + [9] = { + nIcon = 7054, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9656, + nLevel = 2, + szName = "11111", + }, + [18] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8969, + }, + [5] = { + nIcon = 7070, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9660, + nLevel = 2, + szName = "55555", + }, + [10] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9663, + }, + [20] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 8983, + }, + [21] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8980, + }, + [11] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9664, + col = { + 255, + 2, + 208, + }, + }, + [22] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8975, + nLevel = 1, + col = { + 255, + 2, + 2, + }, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9661, + }, + [6] = { + nIcon = 7057, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9659, + nLevel = 2, + szName = "44444", + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8885, + }, + [24] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + nLevel = 2, + dwID = 8978, + col = { + 1, + 170, + 83, + }, + }, + [25] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8985, + col = { + 78, + 255, + 2, + }, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8895, + }, + [26] = { + tCountdown = { + { + szName = "琛岃垷", + nClass = 1, + nIcon = 13, + nTime = 5, + }, + }, + col = { + 212, + 2, + 255, + }, + [1] = { + bScreenHead = true, + bBigFontAlarm = true, + bTeamPanel = true, + bWhisperChannel = true, + bPartyBuffList = true, + bBuffList = true, + tMark = { + [7] = false, + [1] = true, + [2] = true, + [4] = true, + [8] = false, + [9] = false, + [5] = false, + [10] = false, + [3] = true, + [6] = false, + }, + }, + nLevel = 2, + dwID = 8986, + }, + [7] = { + nIcon = 7073, + nScrutinyType = 1, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 9658, + nLevel = 2, + szName = "33333", + }, + [14] = { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 2, + dwID = 8896, + col = { + 233, + 2, + 255, + }, + }, + [27] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 9387, + }, + [23] = { + { + bPartyBuffList = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8981, + nLevel = 1, + col = { + 255, + 238, + 2, + }, + }, + [19] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8976, + }, + [15] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 8916, + }, + }, + [120] = { + { + { + bBuffList = true, + bScreenHead = true, + }, + nLevel = 1, + dwID = 3416, + col = { + 0, + 255, + 255, + }, + }, + { + { + bFullScreen = true, + bTeamPanel = true, + bCenterAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 3454, + nLevel = 1, + col = { + 255, + 255, + 0, + }, + }, + }, + [66] = { + [6] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鏈遍洸", + szNote = "蹇幓槎粹槄蹇幓槎", + dwID = 1877, + }, + [2] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1883, + szName = "娆插悙鍦拌懍", + }, + [8] = { + nLevel = 3, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "鐧介湶", + szNote = "蹇幓鐡跺瓙鈽呭揩鍘荤摱瀛", + dwID = 1875, + }, + [3] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鐮撮潨澶╅杸", + dwID = 1882, + }, + [1] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1884, + szName = "閹瓊闀锋洸", + }, + [4] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bCenterAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 1881, + szName = "鏅浮鍏煶", + }, + [5] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "榛戞礊", + szNote = "蹇幓鐕堚槄蹇幓鐕", + dwID = 1878, + }, + [7] = { + nLevel = 3, + nScrutinyType = 2, + [1] = { + bWhisperChannel = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "纰ф捣", + szNote = "蹇幓灏忚埞鈽呭揩鍘诲皬鑸", + dwID = 1876, + }, + }, + }, + __meta = { + szLang = "zhcn", + szAuthor = "鑼椾紛", + nTimeStamp = 1565612703, + szServer = "妤撴秶鍙ら幃", + }, + BUFF = { + [122] = { + { + { + bBuffList = true, + }, + dwID = 10450, + nLevel = 1, + }, + }, + [211] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [212] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [182] = { + [6] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7456, + nLevel = 1, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 7677, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 7471, + nLevel = 1, + }, + [1] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7591, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7475, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 7465, + nLevel = 1, + }, + }, + [214] = { + [7] = { + szName = "棣欓洐鍊", + dwID = 10115, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 9474, + szName = "閲嶇疆", + nLevel = 1, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 9473, + szName = "椋涗汉", + nLevel = 3, + }, + [4] = { + szName = "鏈ㄦ潗", + dwID = 9469, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [8] = { + szName = "浣涢洐鍊", + dwID = 10116, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [9] = { + szName = "鏈ㄩ洐鍊", + nLevel = 1, + dwID = 10114, + [1] = { + bBuffList = true, + }, + }, + [5] = { + szName = "棣欑嚟", + dwID = 9470, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [3] = { + szName = "浣涘儚", + dwID = 9471, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [6] = { + szName = "棣欑嚟", + dwID = 9520, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + }, + [183] = { + [6] = { + { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7456, + nLevel = 1, + }, + [2] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 7677, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + dwID = 7471, + nLevel = 1, + }, + [1] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 7591, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7475, + nLevel = 1, + }, + [5] = { + { + bBuffList = true, + }, + dwID = 7465, + nLevel = 1, + }, + }, + [217] = { + { + { + bBuffList = true, + }, + dwID = 10229, + szName = "鍙よ懀", + nLevel = 1, + }, + }, + [155] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5089, + }, + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4836, + }, + }, + [221] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8915, + nScrutinyType = 1, + szName = "闄", + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 8917, + nScrutinyType = 1, + szName = "闄", + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [222] = { + [6] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8967, + }, + [2] = { + szName = "鐏", + dwID = 8909, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + szName = "姘", + dwID = 8908, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + szName = "鍦", + dwID = 8910, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + szName = "鏈", + dwID = 8907, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + szName = "閲", + dwID = 8906, + nLevel = 1, + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + }, + [191] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [192] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [225] = { + { + { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9104, + }, + }, + [164] = { + { + { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5632, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 5486, + }, + }, + [165] = { + { + { + bCenterAlarm = true, + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 5632, + nLevel = 1, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 5486, + }, + }, + [68] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [198] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [230] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [69] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [-9] = { + [7] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7691, + }, + [1] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9433, + nLevel = 3, + }, + [2] = { + { + bBuffList = true, + }, + dwID = 854, + nLevel = 1, + }, + [4] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nIcon = 4601, + dwID = 5994, + }, + [8] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9353, + nLevel = 3, + }, + [9] = { + nIcon = 8043, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "淇緟楝奸潰", + nLevel = 4, + dwID = 8474, + }, + [5] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6385, + nLevel = 1, + }, + [10] = { + nLevel = 1, + dwID = 6176, + }, + [3] = { + nIcon = 4900, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bOnlySelfSrc = true, + }, + dwID = 6381, + nLevel = 1, + szName = "榫嶉牠", + }, + [6] = { + nLevel = 29, + dwID = 631, + }, + }, + [70] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [233] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9665, + nLevel = 1, + }, + }, + [199] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [140] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 0, + 255, + }, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 4836, + }, + }, + [235] = { + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 9665, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBuffList = true, + bBigFontAlarm = true, + bScreenHead = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8917, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8915, + }, + }, + [178] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6681, + szName = "涔", + }, + { + nIcon = 4224, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鍧", + nLevel = 1, + dwID = 6682, + }, + [4] = { + nIcon = 4503, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鑹", + nLevel = 1, + dwID = 6685, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6687, + szName = "宸", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7695, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [17] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7450, + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "浜掓彌", + nIcon = 537, + dwID = 7559, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6684, + szName = "闆", + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6666, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7419, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6688, + szName = "鍏", + }, + [6] = { + nIcon = 4495, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鍧", + nLevel = 1, + dwID = 6683, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7446, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 7447, + nLevel = 1, + }, + [7] = { + nIcon = 3422, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "闇", + nLevel = 1, + dwID = 6686, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7694, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7693, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + }, + [228] = { + { + { + bBuffList = true, + }, + szName = "鐜嬭", + dwID = 8855, + nLevel = 1, + }, + { + szName = "鑱栬", + nLevel = 1, + dwID = 8854, + [1] = { + bBuffList = true, + }, + }, + }, + [72] = { + { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2626, + }, + }, + [237] = { + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bTeamPanel = true, + bBigFontAlarm = true, + bBuffList = true, + bScreenHead = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8915, + }, + { + nLevel = 1, + [2] = { + bCenterAlarm = true, + }, + [1] = { + bScreenHead = true, + bBuffList = true, + bBigFontAlarm = true, + bTeamPanel = true, + }, + szName = "闄", + nScrutinyType = 1, + dwID = 8917, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 9665, + }, + }, + [206] = { + { + { + bBuffList = true, + }, + dwID = 7961, + nLevel = 1, + }, + }, + [175] = { + [6] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6900, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6862, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 6952, + }, + [1] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7226, + }, + [4] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7148, + }, + [5] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6891, + }, + }, + [205] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bScreenHead = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7945, + }, + }, + [176] = { + [6] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6891, + }, + [2] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7226, + }, + [3] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6862, + nLevel = 1, + }, + [1] = { + { + bBuffList = true, + }, + dwID = 7870, + nLevel = 1, + }, + [4] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 2, + dwID = 6952, + }, + [5] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7148, + }, + [7] = { + { + bBuffList = true, + bBigFontAlarm = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6900, + }, + }, + [179] = { + { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6928, + }, + { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 6930, + }, + }, + [177] = { + { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6681, + szName = "涔", + }, + { + nIcon = 4224, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鍧", + nLevel = 1, + dwID = 6682, + }, + [4] = { + nIcon = 4503, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鑹", + nLevel = 1, + dwID = 6685, + }, + [8] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6687, + szName = "宸", + }, + [16] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7695, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [17] = { + { + bBuffList = true, + }, + nScrutinyType = 2, + nLevel = 1, + dwID = 7450, + }, + [9] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "浜掓彌", + nIcon = 537, + dwID = 7559, + }, + [5] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6684, + szName = "闆", + }, + [10] = { + { + bTeamPanel = true, + bPartyBuffList = true, + bBuffList = true, + bScreenHead = true, + }, + dwID = 6666, + nLevel = 1, + col = { + 255, + 0, + 255, + }, + }, + [11] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 7419, + }, + [3] = { + nLevel = 1, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6688, + szName = "鍏", + }, + [6] = { + nIcon = 4495, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "鍧", + nLevel = 1, + dwID = 6683, + }, + [12] = { + { + bBuffList = true, + }, + dwID = 7446, + nLevel = 1, + }, + [13] = { + { + bBuffList = true, + }, + dwID = 7447, + nLevel = 1, + }, + [7] = { + nIcon = 3422, + nScrutinyType = 2, + col = { + 255, + 255, + 0, + }, + [1] = { + bTeamChannel = true, + bBuffList = true, + bTeamPanel = true, + }, + szName = "闇", + nLevel = 1, + dwID = 6686, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7694, + nLevel = 1, + col = { + 0, + 255, + 255, + }, + }, + [15] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 7693, + nLevel = 1, + col = { + 0, + 0, + 255, + }, + }, + }, + [209] = { + { + { + bBuffList = true, + }, + dwID = 8855, + szName = "鐜嬭", + nLevel = 1, + }, + { + { + bBuffList = true, + }, + dwID = 8854, + szName = "鑱栬", + nLevel = 1, + }, + }, + [-1] = { + [33] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6757, + nLevel = 1, + }, + [35] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1170, + }, + [37] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9769, + }, + [39] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 684, + }, + [41] = { + { + bBuffList = true, + }, + dwID = 213, + nLevel = 4, + }, + [43] = { + { + bBuffList = true, + }, + dwID = 1437, + nLevel = 1, + }, + [45] = { + tKungFu = { + ["SKILL#10081"] = true, + ["SKILL#10021"] = true, + ["SKILL#10225"] = true, + ["SKILL#10447"] = true, + ["SKILL#10242"] = true, + ["SKILL#10014"] = true, + ["SKILL#10003"] = true, + ["SKILL#10175"] = true, + }, + dwID = 9770, + nLevel = 1, + [1] = { + bBuffList = true, + }, + }, + [47] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9586, + }, + [49] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8528, + }, + [51] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6419, + }, + [53] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2686, + nLevel = 1, + }, + [55] = { + { + bBuffList = true, + }, + dwID = 9801, + nLevel = 1, + }, + [57] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 399, + }, + [59] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1378, + nLevel = 2, + }, + [61] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2706, + nLevel = 1, + }, + [63] = { + { + bBuffList = true, + bPartyBuffList = true, + }, + dwID = 10208, + nLevel = 1, + }, + [66] = { + { + bBuffList = true, + }, + nLevel = 1, + szName = "闃", + dwID = 10024, + }, + [70] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 395, + }, + [74] = { + { + bBuffList = true, + }, + nLevel = 6, + dwID = 2797, + }, + [78] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 3885, + }, + [82] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 3447, + }, + [86] = { + { + bBuffList = true, + }, + nLevel = 4, + dwID = 3068, + }, + [90] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2849, + }, + [94] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2844, + nLevel = 1, + }, + [98] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6240, + }, + [102] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7700, + nLevel = 1, + }, + [106] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 2065, + }, + [110] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6140, + nLevel = 1, + }, + [114] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 113, + }, + [118] = { + { + bBuffList = true, + }, + dwID = 6265, + nLevel = 1, + }, + [122] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6371, + }, + [126] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 412, + nLevel = 1, + }, + [132] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2778, + }, + [140] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3316, + nLevel = 2, + }, + [148] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6112, + nLevel = 1, + }, + [156] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6299, + }, + [164] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2757, + nLevel = 1, + }, + [172] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9919, + nLevel = 1, + }, + [180] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7802, + }, + [188] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4052, + bCheckLevel = true, + }, + [196] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8300, + }, + [204] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8423, + }, + [212] = { + nLevel = 3, + col = { + 208, + 0, + 255, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "鍑屽啲涓", + dwID = 9502, + }, + [220] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10216, + nLevel = 1, + }, + [228] = { + nLevel = 7, + dwID = 378, + tKungFu = { + ["SKILL#10224"] = true, + ["SKILL#10225"] = true, + ["SKILL#10026"] = true, + ["SKILL#10268"] = true, + ["SKILL#10144"] = true, + ["SKILL#10145"] = true, + ["SKILL#10390"] = true, + }, + [1] = { + bBuffList = true, + }, + }, + [236] = { + nLevel = 6, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "棰ㄧ壒鏁", + dwID = 6360, + }, + [1] = { + dwID = 3682, + szName = "鏈遍泙", + nLevel = 1, + [1] = { + bBuffList = true, + bTeamPanel = true, + }, + }, + [235] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 11, + dwID = 208, + }, + [190] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9909, + }, + [2] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8650, + }, + [133] = { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + szName = "涓榧", + dwID = 10175, + }, + [141] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3281, + nLevel = 1, + }, + [149] = { + { + bBuffList = true, + }, + nLevel = 8, + dwID = 3214, + }, + [157] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 10, + dwID = 1900, + }, + [165] = { + { + bBuffList = true, + }, + dwID = 9949, + nLevel = 1, + }, + [173] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4754, + }, + [181] = { + { + bBuffList = true, + }, + dwID = 6308, + nLevel = 1, + }, + [3] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7979, + nLevel = 1, + }, + [197] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8279, + }, + [205] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8303, + }, + [213] = { + nLevel = 2, + col = { + 126, + 107, + 255, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "鍑屽啲浜", + dwID = 9502, + }, + [221] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9284, + nLevel = 1, + }, + [229] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + dwID = 8607, + szName = "瑾挎伅", + }, + [237] = { + nLevel = 3, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "姘寸壒鏁", + dwID = 4761, + }, + [15] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bOnlySelfSrc = true, + bBigFontAlarm = true, + bBuffList = true, + }, + dwID = 1919, + nIcon = 8034, + szName = "娴績路鍔", + }, + [4] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7983, + nLevel = 1, + }, + [67] = { + { + bBuffList = true, + }, + nLevel = 1, + szName = "鏀", + dwID = 10023, + }, + [71] = { + { + bTeamPanel = true, + bBuffList = true, + bPartyBuffList = true, + }, + nLevel = 1, + dwID = 1242, + }, + [75] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2795, + nLevel = 6, + }, + [5] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "鍏悎", + dwID = 7989, + }, + [83] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2840, + }, + [87] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9873, + }, + [91] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2828, + nLevel = 2, + }, + [6] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8007, + nLevel = 1, + }, + [99] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2704, + nLevel = 1, + }, + [103] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 1802, + }, + [107] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2683, + nLevel = 1, + }, + [7] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7981, + nLevel = 1, + }, + [115] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9933, + nLevel = 1, + }, + [119] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6262, + }, + [123] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1487, + }, + [8] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8087, + nLevel = 1, + }, + [134] = { + nLevel = 2, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + szName = "浜岄紦", + dwID = 10175, + }, + [9] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8085, + nLevel = 1, + }, + [150] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3401, + nLevel = 2, + }, + [10] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 926, + }, + [166] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9906, + }, + [11] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 917, + }, + [182] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 4246, + }, + [12] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 3, + dwID = 4101, + }, + [198] = { + nIcon = 6340, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nLevel = 1, + dwID = 8273, + }, + [13] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 4487, + }, + [214] = { + nLevel = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + col = { + 249, + 124, + 124, + }, + szName = "鍑屽啲涓", + dwID = 9502, + }, + [14] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 2, + dwID = 377, + nLevel = 1, + }, + [230] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 8656, + }, + [238] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + szName = "闆风壒鏁", + dwID = 4759, + }, + [239] = { + { + bBuffList = true, + }, + dwID = 3853, + nLevel = 2, + }, + [16] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1920, + nIcon = 8033, + szName = "钃彲路绶", + }, + [17] = { + nLevel = 3, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "鍚炶櫣", + nIcon = 8037, + dwID = 1912, + }, + [18] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1911, + nIcon = 8038, + szName = "绱緧瀵傚湴", + }, + [19] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1915, + nIcon = 8041, + szName = "鍛ㄦ祦鏄熶綅", + }, + [20] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1916, + nIcon = 8042, + szName = "娣靛井鎸囩巹", + }, + [21] = { + nIcon = 8045, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 6471, + nLevel = 1, + szName = "瑗垮ぉ鑱嗛洩", + }, + [22] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1917, + nIcon = 8026, + szName = "瀵掕伈路瀵傚奖", + }, + [23] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 1913, + nIcon = 8029, + szName = "澧ㄩ", + }, + [24] = { + nIcon = 8046, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + szName = "寮辨按", + nLevel = 1, + szNote = "鐗规晥瑙哥櫦蹇劇闄愭寜闆查", + dwID = 1922, + }, + [25] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3028, + nIcon = 8032, + szName = "绲崇帀鎾ラ洸", + }, + [26] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3488, + nIcon = 8036, + szName = "閫犲寲鐣拌粚", + }, + [27] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 3487, + nIcon = 8035, + szName = "纰庡睆娌夋槦", + }, + [28] = { + nIcon = 8040, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 4930, + nLevel = 3, + szName = "娈樻湀椹氬ぉ", + }, + [29] = { + nLevel = 2, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 4931, + nIcon = 8039, + szName = "鍩锋墜", + }, + [30] = { + nIcon = 8030, + nScrutinyType = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + dwID = 6466, + nLevel = 3, + szName = "娑ⅷ鍢查洦", + }, + [31] = { + nLevel = 1, + [1] = { + bBuffList = true, + bBigFontAlarm = true, + }, + nIcon = 8044, + dwID = 8474, + szName = "鏈辫粧鎳烽泙", + }, + [32] = { + nIcon = 8047, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + }, + szName = "闈掔帀娴", + nLevel = 4, + dwID = 10192, + }, + [34] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6758, + nLevel = 1, + }, + [36] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 538, + }, + [38] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 693, + nLevel = 5, + }, + [40] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3067, + nLevel = 1, + }, + [42] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10121, + nLevel = 1, + }, + [44] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10240, + }, + [46] = { + { + bBuffList = true, + }, + nLevel = 5, + dwID = 677, + }, + [48] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6418, + }, + [50] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2805, + }, + [52] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9835, + }, + [54] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6194, + }, + [56] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 10081, + }, + [58] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 9803, + }, + [60] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6417, + nLevel = 1, + }, + [62] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9828, + }, + [64] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 10209, + }, + [68] = { + szName = "鍥涢櫍", + nLevel = 1, + dwID = 916, + [1] = { + bBuffList = true, + }, + }, + [72] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 6214, + nLevel = 1, + }, + [76] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9809, + nLevel = 1, + }, + [80] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 8080, + nLevel = 1, + }, + [84] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6246, + nLevel = 1, + }, + [88] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9877, + nLevel = 1, + }, + [92] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6243, + nLevel = 1, + }, + [96] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2953, + }, + [100] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7701, + }, + [104] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1728, + nLevel = 1, + }, + [108] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1722, + nLevel = 1, + }, + [112] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 6266, + }, + [116] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5678, + nLevel = 1, + }, + [120] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2719, + }, + [124] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6256, + nLevel = 1, + }, + [128] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 1440, + nLevel = 1, + }, + [136] = { + { + bBuffList = true, + }, + dwID = 7671, + nLevel = 1, + }, + [144] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3443, + nLevel = 1, + }, + [152] = { + { + bBuffList = true, + }, + dwID = 9964, + nLevel = 1, + }, + [160] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7729, + }, + [168] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9910, + }, + [176] = { + nLevel = 4, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4052, + }, + [184] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 4423, + nLevel = 1, + }, + [192] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 5996, + }, + [200] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8253, + }, + [208] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9506, + nLevel = 1, + }, + [216] = { + { + bBuffList = true, + }, + dwID = 9330, + nLevel = 1, + }, + [224] = { + { + bBuffList = true, + }, + dwID = 9509, + nLevel = 1, + }, + [232] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + nScrutinyType = 2, + dwID = 680, + nLevel = 29, + }, + [240] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "娓涘偡澶ф棗", + dwID = 2573, + }, + [175] = { + nLevel = 2, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4937, + }, + [195] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7180, + }, + [231] = { + szName = "涓婂厓", + nLevel = 6, + dwID = 681, + [1] = { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + }, + [227] = { + nLevel = 5, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + tKungFu = { + ["SKILL#10021"] = true, + ["SKILL#10242"] = true, + ["SKILL#10447"] = true, + ["SKILL#10003"] = true, + ["SKILL#10081"] = true, + ["SKILL#10175"] = true, + ["SKILL#10176"] = true, + ["SKILL#10080"] = true, + ["SKILL#10028"] = true, + ["SKILL#10448"] = true, + }, + dwID = 375, + }, + [179] = { + nLevel = 1, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 4937, + }, + [199] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8272, + }, + [223] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9355, + nLevel = 1, + }, + [222] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9329, + nLevel = 1, + }, + [219] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9437, + nLevel = 1, + }, + [183] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9744, + nLevel = 1, + }, + [189] = { + { + bBuffList = true, + }, + dwID = 4052, + nLevel = 1, + bCheckLevel = true, + }, + [215] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 9544, + }, + [211] = { + nLevel = 1, + col = { + 255, + 91, + 91, + }, + [1] = { + bBuffList = true, + }, + bCheckLevel = true, + szName = "鍑屽啲涓", + dwID = 9353, + }, + [187] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 6301, + col = { + 2, + 209, + 22, + }, + }, + [203] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 8422, + }, + [207] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8291, + }, + [206] = { + { + bBuffList = true, + }, + nLevel = 9, + dwID = 8448, + }, + [129] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7657, + }, + [137] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 360, + }, + [145] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3217, + }, + [153] = { + { + bBuffList = true, + bOnlySelfSrc = true, + }, + nScrutinyType = 1, + dwID = 6425, + nLevel = 1, + }, + [161] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 139, + }, + [169] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9911, + }, + [177] = { + { + bBuffList = true, + }, + dwID = 4711, + nLevel = 2, + }, + [185] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 4056, + nLevel = 1, + }, + [193] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10221, + nLevel = 1, + }, + [201] = { + nIcon = 6346, + nScrutinyType = 1, + [1] = { + bBuffList = true, + }, + nLevel = 1, + dwID = 8245, + }, + [209] = { + nLevel = 3, + nScrutinyType = 1, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + dwID = 9353, + col = { + 255, + 0, + 238, + }, + szName = "鍑屽啲涓", + }, + [217] = { + { + bBuffList = true, + bTeamPanel = true, + }, + dwID = 9265, + nLevel = 1, + }, + [225] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9495, + nLevel = 1, + }, + [233] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + dwID = 5693, + nLevel = 1, + }, + [241] = { + nLevel = 1, + nScrutinyType = 1, + [1] = { + bBigFontAlarm = true, + bBuffList = true, + bTeamPanel = true, + }, + szNote = "澶ф棗宸蹭笅锛岀垎鐧煎叏闁嬶紒", + dwID = 2570, + }, + [191] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6821, + nLevel = 1, + }, + [65] = { + { + bBuffList = true, + }, + dwID = 7171, + nLevel = 1, + }, + [69] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nScrutinyType = 1, + dwID = 9830, + nLevel = 1, + }, + [73] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1436, + }, + [77] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 856, + }, + [81] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2946, + }, + [85] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2543, + nLevel = 1, + }, + [89] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 10127, + nLevel = 1, + }, + [93] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 2542, + }, + [97] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 2315, + }, + [101] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 7971, + nLevel = 1, + }, + [105] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 2701, + nLevel = 3, + }, + [109] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 5668, + nLevel = 1, + }, + [113] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 7, + dwID = 6264, + }, + [117] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6255, + nLevel = 1, + }, + [121] = { + { + bBuffList = true, + }, + dwID = 9728, + nLevel = 1, + }, + [125] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 7, + dwID = 122, + }, + [130] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 5, + dwID = 203, + }, + [138] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3203, + }, + [146] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6105, + nLevel = 1, + }, + [154] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 384, + }, + [162] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 2983, + }, + [170] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 4489, + }, + [178] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 4, + dwID = 4244, + }, + [186] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 6, + dwID = 4439, + }, + [194] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 9920, + nLevel = 1, + }, + [202] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 8244, + }, + [210] = { + nLevel = 2, + bCheckLevel = true, + [1] = { + bBuffList = true, + }, + col = { + 157, + 71, + 255, + }, + dwID = 9353, + szName = "鍑屽啲浜", + }, + [218] = { + { + bBuffList = true, + }, + dwID = 9334, + nLevel = 1, + col = { + 255, + 0, + 0, + }, + }, + [226] = { + nLevel = 5, + nScrutinyType = 1, + dwID = 392, + }, + [234] = { + { + bTeamPanel = true, + bOnlySelfSrc = true, + }, + dwID = 631, + nLevel = 29, + }, + [174] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9736, + }, + [171] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + nLevel = 1, + dwID = 4671, + }, + [167] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9908, + }, + [163] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7709, + }, + [159] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 999, + nLevel = 1, + }, + [158] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 1439, + }, + [155] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 613, + nLevel = 2, + }, + [151] = { + { + bBuffList = true, + }, + dwID = 9951, + nLevel = 1, + }, + [147] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 3425, + }, + [143] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3468, + nLevel = 1, + }, + [142] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 3276, + nLevel = 1, + }, + [139] = { + { + bBuffList = true, + }, + dwID = 3254, + nLevel = 1, + }, + [135] = { + { + bBuffList = true, + bTeamPanel = true, + }, + nLevel = 1, + dwID = 367, + }, + [131] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 7655, + }, + [127] = { + { + bBuffList = true, + }, + nLevel = 1, + dwID = 9722, + }, + [111] = { + { + bBuffList = true, + }, + dwID = 9714, + nLevel = 1, + }, + [95] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6221, + nLevel = 1, + }, + [79] = { + { + bBuffList = true, + }, + nScrutinyType = 1, + dwID = 6229, + nLevel = 1, + }, + }, + [200] = { + [6] = { + { + bBuffList = true, + }, + nLevel = 2, + dwID = 8967, + }, + [2] = { + dwID = 8909, + nLevel = 1, + szName = "鐏", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [3] = { + dwID = 8908, + nLevel = 1, + szName = "姘", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [1] = { + dwID = 8910, + nLevel = 1, + szName = "鍦", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [4] = { + dwID = 8907, + nLevel = 1, + szName = "鏈", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + [5] = { + dwID = 8906, + nLevel = 1, + szName = "閲", + [1] = { + bBuffList = true, + bScreenHead = true, + }, + }, + }, + }, +} diff --git a/!src-dist/plib/semver.py b/!src-dist/plib/semver.py index e593150a4..ead7ed109 100644 --- a/!src-dist/plib/semver.py +++ b/!src-dist/plib/semver.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ semver for Python -Based on the Lua version from Boilerplate_!Base/src/lib/Semver.lua +Based on the Lua version from MY_!Base/src/lib/Semver.lua Supports npm-style version constraints like ^, ~, *, etc. """ diff --git a/!src-dist/psd/RgbBorders.psd b/!src-dist/psd/RgbBorders.psd deleted file mode 100644 index 52ac7553b..000000000 Binary files a/!src-dist/psd/RgbBorders.psd and /dev/null differ diff --git a/!src-dist/tools/targetmon-format/README.txt b/!src-dist/tools/targetmon-format/README.txt new file mode 100644 index 000000000..1fe8a87ee --- /dev/null +++ b/!src-dist/tools/targetmon-format/README.txt @@ -0,0 +1 @@ +使用方法:将需要格式化的jx3dat文件拖动到convert.bat文件上即可 \ No newline at end of file diff --git a/!src-dist/tools/targetmon-format/convert.bat b/!src-dist/tools/targetmon-format/convert.bat new file mode 100644 index 000000000..3e4106a96 --- /dev/null +++ b/!src-dist/tools/targetmon-format/convert.bat @@ -0,0 +1,3 @@ +%~d0 +cd %~dp0 +start ../../bin/lua-5.1.exe convert.lua %1 diff --git a/!src-dist/tools/targetmon-format/convert.lua b/!src-dist/tools/targetmon-format/convert.lua new file mode 100644 index 000000000..f835b04b6 --- /dev/null +++ b/!src-dist/tools/targetmon-format/convert.lua @@ -0,0 +1,216 @@ + +local rep = string.rep +local concat = table.concat +local insert = table.insert +local remove = table.remove +local type = type +local next = next +local print = print +local pairs = pairs +local ipairs = ipairs +local tostring = tostring +local byte = string.byte + +function clone(var) + local szType = type(var) + if szType == 'nil' + or szType == 'boolean' + or szType == 'number' + or szType == 'string' then + return var + elseif szType == 'table' then + local t = {} + for key, val in pairs(var) do + key = clone(key) + val = clone(val) + t[key] = val + end + return t + elseif szType == 'function' + or szType == 'userdata' then + return nil + else + return nil + end +end + +local function empty(var) + local szType = type(var) + if szType == 'nil' then + return true + elseif szType == 'boolean' then + return var + elseif szType == 'number' then + return var == 0 + elseif szType == 'string' then + return var == '' + elseif szType == 'function' then + return false + elseif szType == 'table' then + for _, _ in pairs(var) do + return false + end + return true + else + return false + end +end + +local function table_r(var, level, indent) + if level == 3 then + indent = nil + end + local t = {} + local szType = type(var) + if szType == 'nil' then + table.insert(t, 'nil') + elseif szType == 'number' then + table.insert(t, tostring(var)) + elseif szType == 'string' then + table.insert(t, string.format('%q', var)) + elseif szType == 'function' then + local s = string.dump(var) + table.insert(t, 'loadstring("') + -- 'string slice too long' + for i = 1, #s, 2000 do + table.insert(t, table.concat({'', string.byte(s, i, i + 2000 - 1)}, '\\')) + end + table.insert(t, '")') + elseif szType == 'boolean' then + table.insert(t, tostring(var)) + elseif szType == 'table' then + table.insert(t, '{') + local s_tab_equ = '=' + if indent then + s_tab_equ = ' = ' + if not empty(var) then + table.insert(t, '\n') + end + end + local nohash = true + local key, val, lastkey, lastval + local tlist, thash = {}, {} + repeat + key, val = next(var, lastkey) + if key then + -- judge if this is a pure list table + if nohash and ( + type(key) ~= 'number' + or (lastval == nil and key ~= 1) -- first loop and index is not 1 : hash table + or (lastkey and lastkey + 1 ~= key) + ) then + nohash = false + end + -- process to insert to table + if nohash then -- pure list table + if indent then + table.insert(t, string.rep(indent, level + 1)) + end + table.insert(t, table_r(val, level + 1, indent)) + table.insert(t, ',') + if indent then + table.insert(t, '\n') + end + elseif type(key) == 'string' and key:find('^[a-zA-Z_][a-zA-Z0-9_]*$') then -- a = val + if indent then + table.insert(t, string.rep(indent, level + 1)) + end + table.insert(t, key) + table.insert(t, s_tab_equ) --' = ' + table.insert(t, table_r(val, level + 1, indent)) + table.insert(t, ',') + if indent then + table.insert(t, '\n') + end + else -- [10010] = val -- ['.start with or contains special char'] = val + if indent then + table.insert(t, string.rep(indent, level + 1)) + end + table.insert(t, '[') + table.insert(t, table_r(key, level + 1, indent)) + table.insert(t, ']') + table.insert(t, s_tab_equ) --' = ' + table.insert(t, table_r(val, level + 1, indent)) + table.insert(t, ',') + if indent then + table.insert(t, '\n') + end + end + lastkey, lastval = key, val + end + until not key + if not empty(var) then + if indent then -- insert `}` with indent + table.insert(t, string.rep(indent, level)) + else -- remove last comma when no indent + table.remove(t) + end + end + table.insert(t, '}') + else --if (szType == 'userdata') then + table.insert(t, '"') + table.insert(t, tostring(var)) + table.insert(t, '"') + end + return table.concat(t) +end + +function var2str(var, indent, level) + return table_r(var, level or 0, indent) +end + +local str2var +do +local Log = print +local envmeta = {} +function str2var(str, env) + if type(str) ~= 'string' then + Log('[LOADSTRING ERROR]bad argument #1 to str2var, string expected, got ' .. type(str) .. '.') + return + end + local fn, bdata = loadstring('return ' .. str) + if not fn then + fn, bdata = loadstring(str), true + end + if not fn then + Log('[LOADSTRING ERROR]failed on decoding #1 of str2var, plain text is: ' .. str) + return + end + local env, datalist = env or {} + setmetatable(env, envmeta) + setfenv(fn, env) + datalist = {pcall(fn)} + setmetatable(env, nil) + if datalist[1] then + if bdata then + datalist = {env.data} + else + table.remove(datalist, 1) + end + else + Log('[CALL ERROR]str2var("' .. str .. '"): \nERROR:' .. datalist[2]) + end + return unpack(datalist) +end +end + +local function Read(path) + local file = io.open(path, 'rb') + local content = file:read('*a') + file:close() + return content +end + +local function Write(path, content) + local file = io.open(path, 'w') + file:write(content) + file:close() +end + +local content = Read(arg[1]) +local data = str2var(content) or {} +for i, v in ipairs(data) do + v.enable = false +end +local content = 'data = ' .. var2str(data, '\t') +Write(arg[2] or arg[1], content) diff --git a/.7zipignore b/.7zipignore index 21cb00832..abf52aca2 100644 --- a/.7zipignore +++ b/.7zipignore @@ -8,6 +8,6 @@ README.md CHANGELOG.md header.tpl.lua !src-dist -BoilerplateDev_* +MYDev_* */src/ */dist/ diff --git a/.gitattributes b/.gitattributes index f16b2c881..2f9e1ac53 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,5 @@ # export ignore /\!src-dist export-ignore -/BoilerplateDev_* export-ignore +/MYDev_* export-ignore /.* export-ignore /*.py export-ignore diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c3ecb4f0d..764afd1b5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -68,7 +68,7 @@ jobs: python3 \!src-dist/changelog.py --version-type "$VERSION_TYPE" --changelog "$CHANGELOG" # 浠 Base.lua 璇诲彇鏇存柊鍚庣殑鐗堟湰鍙 - NEW_VERSION=$(grep "_VERSION_.*'.*'" Boilerplate_!Base/src/lib/Base.lua | sed -E "s/.*'(.*)'.*/\1/") + NEW_VERSION=$(grep "_VERSION_.*'.*'" MY_!Base/src/lib/Base.lua | sed -E "s/.*'(.*)'.*/\1/") echo "馃摝 鏂扮増鏈彿: $NEW_VERSION" @@ -88,7 +88,7 @@ jobs: echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT # 璇诲彇鐢熸垚鐨勬洿鏂版棩蹇楀唴瀹癸紙浠 CHANGELOG.md 涓彁鍙栨渶鏂版潯鐩級 - PROCESSED_CHANGELOG=$(sed -n '/^## Boilerplate鎻掍欢闆 v'"$NEW_VERSION"'/,/^## Boilerplate鎻掍欢闆 v[0-9]/{ /^## Boilerplate鎻掍欢闆 v[0-9]/!p; /^## Boilerplate鎻掍欢闆 v'"$NEW_VERSION"'/p }' CHANGELOG.md | sed '/^$/d') + PROCESSED_CHANGELOG=$(sed -n '/^## 鑼椾紛鎻掍欢闆 v'"$NEW_VERSION"'/,/^## 鑼椾紛鎻掍欢闆 v[0-9]/{ /^## 鑼椾紛鎻掍欢闆 v[0-9]/!p; /^## 鑼椾紛鎻掍欢闆 v'"$NEW_VERSION"'/p }' CHANGELOG.md | sed '/^$/d') # 璁剧疆姝ラ杈撳嚭 { diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a2379a31e..9c916baa4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -70,7 +70,7 @@ jobs: - name: Get tag from Base.lua id: get_tag run: | - VERSION=$(grep "local _VERSION_" "Boilerplate_!Base/src/lib/Base.lua" | sed -n "s/local _VERSION_.*= *['\"]\\([^'\"]*\\)['\"].*/\\1/p") + VERSION=$(grep "local _VERSION_" "MY_!Base/src/lib/Base.lua" | sed -n "s/local _VERSION_.*= *['\"]\\([^'\"]*\\)['\"].*/\\1/p") if [ -z "$VERSION" ]; then echo "Error: Could not extract version from Base.lua" exit 1 diff --git a/.gitignore b/.gitignore index 4fb7cecbc..5099b4816 100644 --- a/.gitignore +++ b/.gitignore @@ -4,11 +4,13 @@ manifest.dat manifest.key publisher.key __pycache__ -/Boilerplate_CHANGELOG.txt +/MY_CHANGELOG.txt /secret.jx3dat /secret.yaml +/secret.yaml-cache.jx3dat /squishy /*/src.lua /*/src.*.lua /*/dist/ /\!src-dist/dist/ +/\!src-dist/tools/targetmon-format/*.jx3dat diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 000000000..0373614da --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,1667 @@ +ignore = {".*"} +max_line_length = 150 + +globals = { + "MY", + "LM", + "this", + "arg0", + "arg1", + "arg2", + "arg3", + "arg4", + "arg5", + "arg6", + "arg7", + "arg8", + "arg9", + "arg10", + "arg11", + + "WND_BASIC_STATUS", + "ITEM_BASIC_STATUS", + "WNDSIDE", + "ALW", + "ALIGNMENT", + "ITEM_POSITION", + "CURSOR", + "MOVIE", + "SOUND", + "LOAD_LOGIN_REASON", + "IMAGE", + "FILE_OPEN_MODE", + "ANIMATE", + "D3DPT", + "GEOMETRY_TYPE", + "ANI_ACTION", + "ADDON_STATUS", + "BOX_STATE", + "ITEM_EVENT", + "SQLITE3", + "UNQLITE", + "BUTTON_STATUS", + "BUTTON_RUN_STATUS", + "CHECKBOX_STATUS", + "CHECKBOX_RUN_STATUS", + "CODE_PAGE", + "WNDEVENT_FIRETYPE", + "YG_DIRECTION", + "YG_FLEX_DIRECTION", + "YG_FLEX_WRAP", + "YG_JUSTIFY", + "YG_ALIGN", + "GESTURE_STATE", + "GLOBAL", + "PATROL", + "TARGET", + "ATTRIBUTE_TYPE", + "ATTRIBUTE_EFFECT_MODE", + "ITEM_TABLE_TYPE", + "SKILL_EFFECT_TYPE", + "SKILL_CAST_EFFECT_TYPE", + "ADD_ITEM_RESULT_CODE", + "DIAMOND_RESULT_CODE", + "BREAK_EQUIP_RESULT_CODE", + "RESET_EQUIP_MAGIC_RESULT_CODE", + "CHANGE_EQUIP_MAGIC_RESULT_CODE", + "SKILL_RESULT_CODE", + "SKILL_FUNCTION_TYPE", + "SKILL_KIND_TYPE", + "SKILL_RESULT_TYPE", + "SKILL_COMPARE_FLAG", + "BUFF_COMPARE_FLAG", + "ROLE_TYPE", + "QUEST_STATE", + "QUEST_RESULT", + "QUEST_EVENT_TYPE", + "QUEST_DIFFICULTY_LEVEL", + "ROLL_ITEM_CHOICE", + "QUEST_COUNT", + "ALL_CRAFT_TYPE", + "MINI_RADAR_TYPE", + "INVENTORY_INDEX", + "CRAFT_RESULT_CODE", + "CHARACTER_ACTION_TYPE", + "CHARACTER_OTACTION_TYPE", + "ITEM_GENRE", + "EQUIPMENT_SUB", + "WEAPON_DETAIL", + "BULLET_DETAIL", + "COMPARE", + "DIAMOND_SLOT_CHANGE_SUB_TYPE", + "FULL_LEVEL", + "MATERIAL_SUB_TYPE", + "DOMESTICATE_CUB_SUB_TYPE", + "DOMESTICATE_FODDER_SUB_TYPE", + "INVENTORY_TYPE", + "ITEM_BIND", + "ITEM_IGNORE_BIND_TYPE", + "ITEM_USE_TARGET_TYPE", + "BOX_SUB_TYPE", + "QUANTITY_LIMIT_ITEM_SUB_TYPE", + "EQUIPMENT_INVENTORY", + "EQUIPMENT_REPRESENT", + "ITEM_RESULT_CODE", + "USE_ITEM_RESULT_CODE", + "SKILL_CAST_MODE", + "PARTY_NOTIFY_CODE", + "TEAM_AUTHORITY_TYPE", + "PARTY_LOOT_MODE", + "DOODAD_KIND", + "CHARACTER_KIND", + "RELATION_TYPE", + "CAMP", + "CLEAR_TITLE_POINT_REASON", + "SHOP_SYSTEM_RESPOND_CODE", + "TRADING_RESPOND_CODE", + "LOOT_ITEM_RESULT_CODE", + "LOGIN", + "NPC_SPECIES_TYPE", + "MOVE_STATE", + "REVIVE_TYPE", + "PLAYER_TALK_CHANNEL", + "ANNOUNCE_SHOW_TYPE", + "PLAYER_TALK_ERROR", + "MAIL_RESPOND_CODE", + "PLAYER_FELLOWSHIP_RESPOND", + "PLAYER_PREPARE_FELLOWSHIP_RESULT", + "DATE_FORMAT", + "SKILL_ATTACK_WEAK_POS", + "ERROR_CODE_TYPE", + "PEEK_OTHER_PLAYER_RESPOND", + "PK_STATE", + "PK_RESPOND", + "PK_ENDCODE", + "AI_ACTION", + "AI_EVENT", + "AI_THREAT_TYPE", + "AI_TARGET_TYPE", + "AI_FILTER_TYPE", + "PREEMPTIVE_ATTACK", + "FAKE_NAME_STATE", + "SWITCH_MAP", + "BATTLE_FIELD_NOTIFY_TYPE", + "TONG_BATTLE_FIELD_NOTIFY_TYPE", + "ARENA_NOTIFY_TYPE", + "CORPS_OPERATION_TYPE", + "BATTLE_FIELD_RESULT_CODE", + "TONG_BATTLE_FIELD_RESULT_CODE", + "ARENA_RESULT_CODE", + "CORPS_OPERATION_RESULT_CODE", + "SHARE_QUEST", + "SKILL_RECIPE_RESULT_CODE", + "ARENA_TYPE", + "NEW_CAMP_FIGHT_VALUE_TYPE", + "BANISH_CODE", + "ITEM_INFO_TYPE", + "PQ_STATISTICS_INDEX", + "TONG_OPERATION_INDEX", + "TONG_EVENT_CODE", + "TONG_HISTORY_TYPE", + "TONG_HISTORY_JOIN_OR_LEAVE_DESC", + "TONG_STATE", + "AUCTION_SALE_STATE", + "AUCTION_ORDER_TYPE", + "AUCTION_RESPOND_CODE", + "AUCTION_MESSAGE_CODE", + "GAME_CARD_TYPE", + "GAME_CARD_RESPOND_CODE", + "GAME_CARD_ORDER_TYPE", + "CAMP_RESULT_CODE", + "CHARGE_LIMIT_CODE", + "REMOTE_PLAYER_LIMIT_CODE", + "AUCTION_COOL_DOWN_ERROR_CODE", + "TONG_CHANGE_REASON", + "MAP_TYPE", + "MAP_CAMP_TYPE", + "ACHIEVEMENT_ANNOUNCE_TYPE", + "DESIGNATION_ANNOUNCE_TYPE", + "DESIGNATION_NOTIFY_CODE", + "ENCHANT_RESULT_CODE", + "ENCHANT_INDEX", + "HORSE_DETAIL_TYPE", + "HORSE_ENCHANT_DETAIL_TYPE", + "MAIL_TYPE", + "MENTOR_RECORD_STATE", + "DIRECT_MENTOR_RECORD_STATE", + "CHARACTER_GENDER", + "ITEM_EXIST_TYPE", + "CHARGE_MODE", + "PQ_OWNER_TYPE", + "DESIGNATION_PREFIX_TYPE", + "ACTIVITY_STATE", + "CAMP_NPC_TYPE", + "SYSTEM_PUNISH_RESULT_CODE", + "KICK_ACCOUNT_REASON_CODE", + "SKILL_RECIPE_TYPE", + "TONG_DIPLOMACY_RELATION_TYPE", + "TONG_DIPLOMACY_CW_SCRIPT_TYPE", + "TONG_DIPLOMACY_ALLY_SCRIPT_TYPE", + "TONG_DIPLOMACY_RELATION_RESULT_CODE", + "TONG_PUBLICITY_RESULT_CODE", + "TONG_APPLY_JOININ_RESULT_CODE", + "TONG_TECH_NODE_TAG_TYPE", + "HAIR_SHOP_RESPOND_CODE", + "SAFE_LOCK_EFFECT_TYPE", + "HAIR_CHANGE_RESPOND_CODE", + "HAIR_STYLE", + "EXTERIOR_BUY_RESPOND_CODE", + "EXTERIOR_APPLY_RESPOND_CODE", + "EXTERIOR_COLLECT_RESULT_CODE", + "EXTERIOR_PAY_TYPE", + "EXTERIOR_TIME_TYPE", + "EXTERIOR_GENRE", + "EXTERIOR_BUY_SOURCE", + "EXTERIOR_COLLECTION_EXTERIOR_TYPE", + "EXTERIOR_COLLECTION_METHORD", + "EXTERIOR_INDEX_TYPE", + "EXTERIOR_APPLY_FLAG", + "WEAPON_EXTERIOR_BOX_INDEX_TYPE", + "QUEST_TEAM_REQUIRE_MODE", + "FOLLOW_RESULT_CODE", + "FOLLOW_STOP_TYPE", + "FOLLOW_TYPE", + "INVITE_FOLLOW_TYPE", + "DOMESTICATE_OPERATION_RESULT_CODE", + "BUY_CUB_PACKAGE_RESULT_CODE", + "PASSPOD_MODE", + "REWARDS_SHOP_RESPOND_CODE", + "REAL_TIME_RANK_LIST_TYPE", + "WANTED_MAN_RESULT_CODE", + "COIN_BUY_RESPOND_CODE", + "RESET_MAP_RESULT", + "RESTORE_ITEM_RESULT", + "PEER_PAY_TYPE", + "PEER_PAY_STATE", + "PEER_PAY_RESULT_CODE", + "PEER_PAY_PANEL_TYPE", + "COIN_SHOP_PAY_TYPE", + "COIN_SHOP_TIME_LIMIT_TYPE", + "COIN_SHOP_GOODS_TYPE", + "COIN_SHOP_OWN_TYPE", + "COIN_SHOP_DISCOUNT_TYPE", + "COIN_SHOP_FAULT_REASON", + "COIN_SHOP_ERROR_CODE", + "FACE_LIFT_BONE_TYPE", + "FACE_LIFT_DECAL_TYPE", + "FACE_LIFT_ERROR_CODE", + "SELECT_TALENT_RESULT", + "VERIFY_CAPTCHA_RET_CODE", + "ACCOUNT_SECURITY_STATE", + "ACCOUNT_SECURITY_SEND_SMS_RET_CODE", + "TEAM_BIDDING_START_RESULT", + "TEAM_BIDDING_END_RESULT", + "TEAM_BIDDING_RISE_MONEY_RESULT", + "CUSTOM_RECORDING_TYPE", + "VIP_TYPE", + "BUY_VIP_RESULT", + "SNS_BIND_TYPE", + "WEIBO_TYPE", + "WEIBO_NOTIFY_CODE", + "DIAMOND_SLOT_CHANGE_RESULT_CODE", + "TEAM_PUSH_NOTIFY_CODE", + "GIFT_CURRENCY_TYPE", + "GIFT_GET_LIMIT", + "CREATE_GIFT_ERROR_CODE", + "GET_GIFT_ERROR_CODE", + "RELEASE_GIFT_ERROR_CODE", + "EMOTION_ACTION_RESULT", + "BUY_ITEM_ORDER_STATE", + "BUY_ITEM_ORDER_NOTIFY_CODE", + "PLAYER_IDENTITY_TYPE", + "SKILL_BULLET_TYPE", + "SCENE_SFX_ERROR_CODE", + "SELECTABLE_TYPE", + "ADVANCED_DYNAMIC_OBSTACLE_TYPE", + "PLAYER_ARENA_TYPE", + "COIN_SHOP_GOODS_SOURCE", + "COIN_SHOP_LOGIC_BOX_INDEX", + "COIN_SHOP_PRESET_ERROR_CODE", + "COIN_SHOP_CART_ERROR_CODE", + "BULLETSCREEN_SHOWMODE_TYPE", + "REAL_NAME_LIMIT_CODE", + "REAL_NAME_VERIFY_CODE", + "FREEZE_PLAYER_CODE", + "TRADE_MALL_CODE", + "SERVER_TYPE", + "MAP_QUEUE_TYPE", + "FORCE_FIGHT_PLAYER_TYPE", + "BF_MAP_ROLE_INFO_TYPE", + "PEEK_OTHER_PLAYER_TYPE", + "RELATIONSHIP_TYPE", + "RELATIONSHIP_EVENT_CODE", + "RELATIONSHIP_FINISH_STATE", + "ASSIST_NEWBIE_TYPE", + "ASSIST_NEWBIE_FAVOR_LEVEL_TYPE", + "ASSIST_NEWBIE_EVENT_CODE", + "ASP_RESULT_CODE", + "ACCOUNT_SHARED_PACKAGE_SOURCE", + "ACCOUNT_SHARED_PACKAGE_BOX", + "CHAT_GVOICE_TOKEN_TYPE", + "BATTLEFIELD_RANK_TYPE", + "BF_ROLE_DATA_TYPE", + "COIN_SHOP_RECOMMENDATION_DATA_TYPE", + "COIN_SHOP_RECOMMENDATION_ERROR_CODE", + "DUNGEON_SERVER_EVENT_CODE", + "KPENDENT_TYPE", + "QUEST_REWARD_LOOKUP_TYPE", + "QUEST_REWARD_STATE", + "QUEST_REWARD_RESPOND_CODE", + "COIN_SHOP_GROUPON_MEMBER_STATE", + "COIN_SHOP_GROUPON_STATE", + "COIN_SHOP_GROUPON_ERROR_CODE", + "CUSTOM_RECORDING_PLAYER_DATA_TYPE", + "REMOTE_DATA_MANUAL_TYPE", + "DOMESTICATE_EMOTION_TYPE", + "QUIT_MAP_QUEUE_CODE", + "UNION_ACCOUNT_CHANNEL", + "BIDDING_INFO_STATE", + "BIDDING_OPERATION_TYPE", + "BIDDING_INFO_TYPE", + "STREAMING_POST_EVENT_TYPE", + "STREAMING_NETWORK_TYPE", + "PSIMAGE_FILTER", + "CHARACTER_LIGHT", + "CHARACTER_LIGHT_BINDING", + "TRANSFORM", + "TARGET_EX", + "CTCT", + "TIME_PRIORITY", + "WEBURL_TYPE", + "COLOR_DIAMOND_MAX_LEVEL", + "MAIN_SCENE_DOF_DIST_MIN", + "COINSHOP_RECOMMEND_SOURCE", + "COLOR_DIAMOND_MAX_STRENGTHEN_LEVEL", + "FACELIFT_INDEX_START", + "REWARDS_CLASS", + "CASTING_MIN_LEVEL", + "EXTERIOR_SUB_NUMBER", + "RIDE_BOX_COUNT", + "MAX_BAG_PENDANT_SIZE", + "CALENDER_EVENT_START", + "UI_ITEM_SHADOW_POS_TYPE", + "MAX_BACK_CLOAK_SIZE", + "POSE_TYPE", + "COINSHOP_MPAK_ID", + "UI_OBJECT", + "COINSHOP_RIDE_BOX_INDEX", + "UILayer", + "LEVEL_CAN_JOIN_CAMP", + "CAMP_AUCTION", + "EMPTY_TABLE", + "INVENTORY_GUILD_BANK", + "UI_OBJECT_ENCHANT", + "STREAM_GAME", + "INVENTORY_GUILD_PAGE_SIZE", + "UI_OBJECT_SHOP_ITEM", + "UI_OBJECT_SYS_BTN", + "UI_OBJECT_OTER_PLAYER_ITEM", + "HOME_TYPE", + "CALENDER_EVENT_LONG", + "UI_OBJECT_EXTERIOR", + "GLOBAL_HEAD", + "UI_OBJECT_ITEM", + "UI_OBJECT_TRAIN", + "FB_TYPE", + "MAX_L_SHOULDER_SIZE", + "DIAMOND_MAX_LEVEL", + "UI_OBJECT_MOBA_ITEM", + "HORSE_ADORNMENT_COUNT", + "UI_OBJECT_EXTERIOR_WEAPON", + "PARTY_TITLE_MARK_EFFECT_LIST", + "UI_OBJECT_SKILL_RECIPE", + "TYPE_ID_OF_CAR", + "UI_OBJECT_SKILL", + "UI_OBJECT_BUFF", + "UI_OBJECT_MACRO", + "SOCIALPANEL_NAME_DISPLAY", + "UI_OBJECT_PET", + "COINSHOP_TITLE_CLASS", + "UI_OBJECT_MONEY", + "MAIN_SCENE_DOF_AWAY_MIN", + "PARTY_MARK_ICON_PATH", + "LIMIT_SALE_AD_SHOW", + "CALENDER_EVENT_ALLDAY", + "ACTIVITY_UI", + "REPORT_FROM_WHERE", + "COINSHOP_CAN_OPEN_EXP", + "ROAD_CHIVALROUS_SUBMODULE_STATE", + "UI_OBJECT_ITEM_INFO_PLAYER", + "UI_OBJECT_CRAFT", + "UI_OBJECT_MOUNT", + "UI_OBJECT_NOT_NEED_KNOWN", + "UI_OBJECT_ITEM_ONLY_ID", + "CAMP_OB_CONSTANT", + "UI_OBJECT_NONE", + "PARTY_MARK_ICON_FRAME_LIST", + "TITLE_EFFECT_NONE", + "OT_CSS", + "FREEZE_TYPE", + "UI_OBJECT_PENDANT", + "FREE_TRYON_AD_OPERATION", + "SNS_BINDED_CODE", + "LOGIN_LOGO", + "EXTERIOR_CLASS", + "INVITE_FILTER", + "QUEST_PHASE", + "COMMAND_MODE_PLAYER_ROLE", + "MAX_WAIST_SIZE", + "DIAMOND_MAX_STRENGTHEN_LEVEL", + "UI_OBJECT_MEDAL", + "COMMAND_BOARD", + "ENUM_MAP_WND_TYPE", + "FORCE_TYPE", + "MAX_R_SHOULDER_SIZE", + "UI_OBJECT_EMOTION_ACTION", + "MAIN_SCENE_DOF_AWAY_MAX", + "OPERACT_ID", + "MAX_FACE_SIZE", + "CAN_APPLY_JOIN_LEVEL", + "MAX_BACK_SIZE", + "SPEAKER_STATE", + "ROAD_CHIVALROUS_MODULE_STATE", + "HOME_CLASS", + "CALENDER_EVENT_RESET", + "MAIN_SCENE_DOF_NEAR_MIN", + "MIC_STATE", + "ACTIVITY_ID", + "WEB_RQST", + "ARENA_UI_TYPE", + "ONE_PHOTO_ACTVITY_TYPE", + "ROAD_CHIVALROUS_SHARE_ONE_BILLION_AWARD_STATE", + "ROAD_CHIVALROUS_AWARD_STATE", + "ROAD_CHIVALROUS_MODULE_TYPE", + "CALENDER_EVENT_DYNAMIC", + "MAIN_SCENE_DOF_DIST_MAX", + "EXTERIOR_OPEN_SOURCE", + "CRAFT_MIN_LEVEL", + "KUNGFU_TYPE", + "EXTERIOR_LABEL", + "GANPEI_MONEY", + "WEB_DATA_SIGN_RQST", + "GET_STATUS", + "COINSHOP_BOX_INDEX", + "ACTIVITY_STATE", + "OPERACT_REWARD_STATE", + "ARENA_HIGH_LEVEL_DIVIDE", + "XML_LINE_BREAKER", + "UI_OBJECT_ITEM_INFO", + "MENU_DIVIDER", + "ARG_STR", + "GetStateString", + "string", + "IsUILockedMode", + "tostring", + "print", + "GetGuildBankBagPos", + "GetGuildBankPagePos", + "Item_Layout", + "table", + "math", + "_M", + "GetSelfStateString", + "FORMAT_WMSG_RET", + "type", + "pairs", + "next", + "IsObjectItem", + "g_bDebugMode", + "SHOW_TARGET_LEVEL_LIMITS", + "ipairs", + "SetImage", + "SetParyMarkImage", + "_NAME", + "GetCampImageFrame", + "UI_BOX_TYPE", + "Wnd", + "Station", + "_PACKAGE", + "Table_IsSkillShow", + "Table_GetPlayerMiniAvatarsFromType", + "Table_GetShopPanelInfo", + "Table_GetCalenderOfDay", + "Table_GetDungeonClass", + "RegisterUITable", + "Table_GetBookSubSort", + "Table_GetSimpleTipInfo", + "Table_IsMobaBattleFieldMap", + "Table_GetBuffDesc", + "GetAdjustTabPath", + "Table_DoesMapHaveTreasure", + "Table_GetPlayerAwardRemind", + "Table_GetCareerInfo", + "Table_GetBookPageID", + "Table_GetBattleFieldGroupInfo", + "Table_GetServerName", + "Table_GetFieldPQList", + "GetCubAttributeIndex", + "Table_GetCareerMap", + "Table_GetTongActivityList", + "Table_GetPlayerMiniAvatarsFromTypeAndKindID", + "Table_GetChaptersInfo", + "Table_IsTongBattleFieldMap", + "Table_GetMasterBonusRank", + "Table_GetBattlePassRewardInfo", + "Table_GetFellowPet", + "Table_GetCountComboInfo", + "Table_GetWantedRoleavatar", + "Table_IsShowByRelayOnNot", + "Table_BuffNeedShow", + "Table_GetActiviyTipDesc", + "Table_GetMiddleMapCommandNpc", + "Table_GetCreateRoleParam", + "Table_GetMapGroup", + "Table_GetTrolltechHorse", + "Table_GetOperatActFRecall", + "Table_GetBattleFieldDesc", + "Table_GetBookDesc", + "Table_GetQuestSuggest", + "Table_GetPVPMapInfo", + "Table_GetKungfuSkillList", + "Table_GetServantAllCommonActionInfos", + "Table_GetDailyQuestList", + "Table_GetJX3LibraryList", + "Table_IsSpecialItem", + "Table_IsDomesticatePet", + "Table_GetDomesticatePetModel", + "Table_GetDungeonBoss_StepSkill", + "Tagle_IsExitCareerEvent", + "print", + "Table_LoadSceneQuest", + "Table_GetMKungfuBg", + "Table_GetNpcRecoverHP", + "Table_GetAllKBWeekReward", + "Table_GetMiddleMapCommandInfo", + "Table_GetAchievementProgress", + "Table_GetNpcTemplateName", + "Table_GetOperationActUserData", + "Table_GetSegmentName", + "Table_GetAdventureTask", + "Table_GetPanelForbidMap", + "Table_GetCustomBuffList", + "Table_GetSkillEffectBySkill", + "Table_GetTongTechNodeList", + "Table_GetHorseChildAttr", + "Table_IsBattleFieldMap", + "Table_GetRequireAttributeInfo", + "Table_GetPVPLinkDate", + "Table_GetSpecailGift", + "Table_GetWulinShenghuiDuizhenNpcInfo", + "GetJoinLevel", + "Table_GetJX3LibraryContent", + "Table_GetMobaShopItemInfos", + "Table_GetCyclopaediaSkill", + "Table_GetRecipeNameVer2", + "Table_GetNewPQ_NPC_Template", + "Table_OpenSkillLevel", + "Table_GetCraftID", + "Table_GetExteriorSubGenreName", + "Table_GetRecipeList", + "Table_GetMobaBattleNonPlayerInfo", + "TableGetMobaShopPrePurchase", + "Table_GetCalenderActivityQuest", + "Table_GetMobaShopItemInfo", + "Table_GetCareerEvent", + "Table_GetCalenderActivity", + "Table_GetAchievementInfo", + "math", + "Table_GetMobaShopItemUIInfoByID", + "Table_GetDoodadTemplateBarText", + "Table_GetBoss", + "Table_GetFaceDecalsClass", + "Table_GetSkillTeachQixueRecommend", + "Table_GetAutoOpenPanelInfo", + "Table_GetCareerTab", + "Table_GetCampSkill", + "Table_GetActivityList", + "Table_GetChannelInfo", + "Table_GetFAQList", + "Table_GetMapGroupID", + "Table_GetSoundSetting", + "Table_GetBuffName", + "g_SkillNameToID", + "Table_GetPetAvatar", + "Wnd", + "Table_IsActivityPanelQuest", + "Table_GetPersonLabel", + "Table_GetOperationActCounterID", + "Table_FindBoss", + "Table_GetAllSceneQuest", + "Table_GetCampBossInfo", + "Table_GetCastleImgInfo", + "Table_GetBookPageNumber", + "Table_GetDLCAchievementInfo", + "Table_GetGuideSoultion", + "Table_GetCanExteriorDesc", + "Table_GetPLActionBarSkill", + "Table_GetServantInfo", + "Table_GetDLCQuestMapInfo", + "Table_GetMagicAttriStrengthValue", + "Table_GetDLCMainPanelMapInfo", + "Table_GetDecalsAdjust", + "Table_GetLocalActionBarParam", + "Table_GetDLCInfo", + "Table_GetCareerLinkNpcInfo", + "Table_GetDLCMapID", + "Table_GetQuestRpg", + "Table_GetCmdHistoryData", + "Table_GetVoiceTypeData", + "Table_GetMultiStageSkill", + "Table_GetNPCSpeechSounds", + "Table_GetServantSpecialActionInfoByNpcIndex", + "Table_GetMiniAvatarID", + "Table_GetServantCommonActionInfoByActionID", + "CorrectSkillName", + "Table_GetPuppetSkill", + "Table_GetAllReputationRewardItemInfo", + "Table_GetForceUI", + "Table_GetMapBalloonShieldLevel", + "Table_GetChanelList", + "Table_GetSkillPracticeID", + "Table_GetReputationForceMaps", + "Table_GetReputationForceInfo", + "Table_GetIdentityPetWord", + "Table_GetNewPQId", + "Table_GetIdentityInfo", + "Table_GetMapInfoIdxByMapID", + "string", + "Table_GetAllRepuForceGroupInfo", + "Table_GetItemIconID", + "Table_GetGrouponTemplate", + "Table_GetAllPersonLabel", + "Table_GetAutoCorpsNameList", + "Table_GetNewMovieIDByProtocolID", + "Table_GetActivityOfPeriod", + "Table_GetSkillExtCDID", + "Table_GetMapTip", + "Table_GetTypeDecalList", + "Table_GetNewMovieInfo", + "Table_GetRideModelInfo", + "Table_GetPresentExamPrint", + "g_tTable", + "Table_GetParentSkill", + "Table_GetMoviePath", + "Table_GetSkillGuideNext", + "Table_GetSkillSchoolName", + "Table_GetPlayerZombieLevel", + "Table_GetFaceMeshInfo", + "Table_GetProfessionName", + "Table_GetFellowPetIconID", + "Table_BeFliped", + "Table_GetActivitySymbol", + "Table_GetPQStage", + "Table_GetDungeonBossModel", + "Table_GetRoadChivalrousInfo", + "Table_GetDecorationList", + "Table_GetBigKungfuInfo", + "Table_GetTeamInfoByQuestID", + "StringParse_Numbers", + "Table_IsShowOnNewSkill", + "Table_GetCareerTabTitle", + "Table_GetReputationLevelInfo", + "Table_GetRecommendID", + "Table_GetHuaZhaoJieImagePath", + "ilines", + "Table_GetNPCSpeechSoundsBg", + "Table_GetNextTitleRankPoint", + "Table_GettDecoration", + "Table_GetSkillLimitList", + "Table_GetDLCRewardQuestIDs", + "next", + "Table_GetBattleMarkState", + "Table_GetTreasureTeamInfoTitle", + "Table_GetTreasureInfoTitle", + "Table_GetVideoSetting", + "Table_IsArtistWriteExist", + "Table_GetTongActivityContent", + "Table_AutoQuestList", + "Table_GetTeachingAim", + "Table_GetSelfieFilterParamsByLogicIndex", + "Table_GetFaceBoneList", + "Table_BuffIsVisible", + "Table_GetFellowPetSkill", + "Table_GetFBCDBossAvatar", + "Table_GetAllSelfieFilterParams", + "Table_GetFellowPet_SearchList", + "Table_GetSkillDesc", + "Table_GetShopPanelSelector", + "Table_GetSkillIconID", + "Table_GetSelfieResolution", + "Table_GetAllSelfieLightParams", + "Table_GetCraftIconID", + "Table_GetDomesticateEvent", + "Table_GetEnchantQuality", + "Table_GetForceSmallIcon", + "Table_GetArenaLiveMap", + "_M", + "Table_GetCraftBelongName", + "Table_GetDanmakuColor", + "Table_GetBattleFieldHelpInfo", + "Table_GetCubInfo", + "Table_GetMiddleMap", + "Table_GetAllMasterBunusItem", + "Table_GetOneIdentityInfo", + "Table_GetReputationRewardItemInfoByForceID", + "Table_GetPlayerReturnBoxInfo", + "Table_GetMapListByKungfu", + "Table_GetCharInfoMainAttrShow", + "Table_GetFellowPet_Class", + "Table_GetPlayerMiniAvatarsFromKindID", + "Table_GetSmartDialog", + "Table_GetPlayerReturnShowTable", + "Table_GetDesignationGeneration", + "Table_GetFilterInviteInfo", + "Table_GetOfficalFaceList", + "Table_GetUpSkillEffect", + "Table_GetDungeonBoss", + "Table_GetEnchantIconID", + "Table_GetLogoInfo", + "Table_GetSpecialTimeToItemCount", + "tostring", + "Table_GetFirstLoginSkill", + "Table_GetQuestIdentityExp", + "Table_GetActivityOfDay", + "Table_GetCommonEnchantDesc", + "Table_GetMapFontID", + "Table_GetHorseBasicAttributeInfo", + "Table_ViewReplace", + "Table_IsNewcomerBattleFieldMap", + "Table_GetSkillSchoolKungfu", + "Table_GetCopyMap", + "Table_GetActivityHome", + "Table_GetMapMovieID", + "Table_GetCubAttribute", + "ParseNumbers", + "Table_GetFAQContent", + "Table_GetFireBookTypeName", + "Table_GetKungfuData", + "Table_GetSkillGuideList", + "Table_GetCalenderActivityAward", + "ParseCareerEventTab", + "Table_GetFBCountDown", + "Table_GetSkill", + "Table_GetCareerAllEventTitle", + "Table_GetSkillRecipeMirrorSrc", + "Table_GetFellowPet_Medal", + "GetAttribute", + "Table_GetMagicAttributeInfo", + "Table_GetEnchantName", + "Table_GetZhenPaiLinesInfo", + "Table_GetBuffIconID", + "Table_GetFBCountNum", + "Table_GetMinMaxReputationLevel", + "Table_GetArtistReward", + "Table_IsSimplePlayer", + "Table_GetGrowthEquitLevel", + "Table_IsSkillShieldLevelUp", + "Table_GetQixueTeachByList", + "Table_GetChooseStep", + "Table_GetTeamSpecialBuff", + "Table_GetMapGuideCity", + "Table_GetHorseTuJianAttr", + "Table_GetSkillName", + "Table_GetSkillShortDesc", + "Table_GetCharInfoShow", + "Table_GetMapType", + "Table_GetCubEmotion", + "Table_GetSkillEffectByBuff", + "Table_GetTaskToAdvID", + "Table_FindAchievementProgress", + "Table_GetFireBookInfoInfo", + "Table_IsInForbidMap", + "Table_GetAdventure", + "Table_GetGrowInfo", + "Table_GetBidNpcName", + "Table_BuffNeedSparking", + "Table_GetLearnSkillInfo", + "Station", + "Table_GetCampAuctionInfo", + "Table_GetReadMailPanelInfo", + "Table_GetTitleRankTip", + "Table_GetBattleFieldPQOptionInfo", + "Table_GetSkillRecipe", + "Table_GetSkillKungfuDesc", + "Table_GetCDProcessBoss", + "Table_GetCastleInfo", + "Table_GetAllFellowPet", + "Table_GetDungeonEnterTip", + "Table_GetCategoryByAttributeID", + "Table_GetMentorPanelInfo", + "table", + "Table_GetTopmenuButton", + "Table_GetComboSkillInfo", + "Table_GetMKungfuList", + "Table_GetLinkCount", + "Table_GetHorseAttrs", + "Table_GetOneKindAdventure", + "Table_GetNewPQ_AllPos", + "Table_GetNewPQ_ByNPCTemplate", + "Table_GetRecipeName", + "Table_GetExteriorSet", + "Table_GetProgressBar", + "ipairs", + "Table_BuffNeedShowTime", + "Table_GetOperatFRecallImg", + "Table_GetShareOneBillionRoadChivalrousQuestInfo", + "Table_GetChongXiaoMonthlyByMonth", + "Table_GetOperaionActUrl", + "Table_GetBattleFieldRewardIconInfo", + "Table_GetFieldPQ", + "Table_GetOperationActCard", + "Table_GetOperActyDes", + "Table_GetSceneFieldPQ", + "Table_GetBattlePassQuestInfo", + "Table_GetCurrentCareer", + "Table_IsAutoSearchShield", + "Table_GetDungeonList", + "GetAttributeIndex", + "Table_GetDisCoupon", + "Table_GetDungeonInfo", + "ilines_r", + "IsUITableRegister", + "Table_GetVideoSettingSM", + "Table_GetDialogBtn", + "Table_GetOperationActivity", + "Table_GetTeamPosition_KungFu", + "Table_GetTeamRecruitMask", + "Table_GetTeamRecruitForceMask", + "type", + "Table_GetMap", + "Table_GetBookNumber", + "Table_GetChannelKey", + "Table_GetCraftName", + "Table_GetTeamInfoByMapID", + "Table_GetExteriorGenreName", + "Table_GetAnimalAction", + "Table_GetNewPQ_Npc", + "Table_GetTeamInfo", + "Debug_TableSkillCache", + "Table_GetTeamRecruit", + "Table_GetBuffTime", + "Table_GetActivityNoneML", + "LoadExteriorMap", + "Table_GetHorseMagicAttributeInfo", + "Table_IsPVPArenaLiveBan", + "Table_GetSkillSortOrder", + "Table_GetSkillTeach", + "Table_GetOperActyInfo", + "Table_GetItemSoundID", + "Table_GetLandscapeCfg", + "Table_GetBookContent", + "Table_GetPetSkillChange", + "Table_GetCastleByMapID", + "Table_GetMiddleMapSelectNpc", + "Table_GetNpcGuild", + "Table_GetNpcTypeInfoMap", + "Table_GetEquipRecommendKungfus", + "Table_GetDoodadName", + "Table_GetExteriorHome", + "Table_GetAllKBSeasonReward", + "Table_GetAssassinationTaskScrollInfo", + "Table_GetQuestClass", + "Table_GetSkillQixueName", + "Table_GetBookItemIndex", + "Table_GetActivityContent", + "Table_GetLocalActionBarData", + "GetAttributeString", + "Table_GetBookMark", + "Table_GetBattleFieldSubMapID", + "Table_GetRideSubDisplay", + "Table_GetPetSkill", + "Table_GetWantedLimitMap", + "Table_GetHelpSoundName", + "Table_GetTeamRecruitPosMask", + "Table_IsTreasureBattleFieldMap", + "Table_GetSkillRecipeMirror", + "Table_GetDungeonNpcCV", + "Table_GetAllReputationGainDesc", + "Table_GetChanelName", + "GetBinTableTitle", + "Table_GetArtistSkillsInfo", + "Table_GetSfxSize", + "Table_GetDefaultLine", + "Table_IsLegalSkill", + "Table_IsBlackListSkill", + "Table_GetDungeonSkillIcon", + "Table_GetMapMarkForIdentity", + "Table_GetPath", + "pairs", + "Table_GetCraftDesc", + "Table_GetCareerTabName", + "Table_GetSkillSchoolIconID", + "Table_GetIdentityOtherInfo", + "Table_GetBattleFieldSuggest", + "Table_GetShowWord", + "Table_GetDungeonBossNpcListByBossIndex", + "Table_GetReputationGainDescByForceID", + "Table_GetDailyQuestContent", + "Table_GetEnchantDesc", + "Table_GetNewKungfuSkill", + "Table_GetRecipeTip", + "Table_GetNewDungeonList", + "Table_GetFellowPet_Achievement", + "Table_GetFAQClassName", + "Table_IsSkillCombatShow", + "Table_GetFieldPQString", + "Table_IsShowRelayOn", + "GetRequireIndex", + "Table_GetProtocolToAviPath", + "GetRequire", + "Table_GetZhenPaiLinesName", + "Table_GetZhenPaiLines", + "Table_GetDecal", + "Table_IsShieldedNpc", + "Table_GetCopySuggest", + "Table_GetBattleFieldName", + "Table_GetScriptFromCommonTab", + "Table_GetCurrencyList", + "Table_GetAchievement", + "Table_GetSortedDlcList", + "Table_GetStructTypeList", + "Table_GetWarningType", + "Table_GetEnchantTipShow", + "Table_GetBaseAttributeInfo", + "Table_GetAllOutsideFilterParams", + "Table_GetSkillSchoolInfo", + "_PACKAGE", + "Table_GetBookName", + "Table_GetAnnounceImage", + "Table_GetExteriorSetName", + "Table_GetMobaBattleVoiceFilePath", + "Table_IsSkillFormationCaster", + "Table_GetDoodadTemplateType", + "Table_GetSuggestMap", + "Table_GetBranchName", + "Table_GetRewardLevelInfo", + "Table_GetQuestPosInfo", + "Table_GetPlayerMiniAvatars", + "Table_GetItemName", + "Table_GetKungFuName", + "Table_GetCGList", + "Table_GetChongXiaoMonthly", + "Table_LoadSceneFieldPQ", + "Table_GetCalenderActivityAwardIcon", + "Table_GetMapName", + "Table_GetItemDesc", + "Table_GetExteriorArray", + "Table_IsFBBattleFieldMap", + "Table_GetCraftHoleIcon", + "Table_GetActiviyTimeDesc", + "dwQuestID", + "Table_ParseCalenderActivity", + "Table_GetDoodadTemplateName", + "Table_ForceToSchool", + "Table_GetBookSort", + "Table_GetAllDanmakuColor", + "Table_GetQuestStringInfo", + "Table_GetNewPQ", + "Table_SchoolToForce", + "Table_GetCraft", + "Table_IsZombieBattleFieldMap", + "Table_GetTongTechTreeNodeInfo", + "Table_GetBuff", + "Table_MKungfuIsSection", + "Table_GetAllMapIDsWithTreasure", + "_NAME", + "Table_GetForceImageName", + "Debug_TableBuffCache", + "Table_IsSkillFormation", + "Table_GetSkillSpecialDesc", + "Table_GetSFXInfo", + "SKILL_SELECT_POINT_UNNORMAL", + "string", + "QUEST_OPERATION_FINISH", + "ROLE_TYPE_LITTLEGIRL", + "tostring", + "print", + "QUEST_STATE_YELLOW_EXCLAMATION", + "MAX_SKILL_REICPE_COUNT", + "QUEST_WHITE_LEVEL", + "ROLE_TYPE_SEXYFEMALE", + "MAX_USABLE_MENTOR", + "GetQuestIndex", + "QUEST_STATE_NO_MARK", + "QUEST_HIDE_LEVEL", + "pairs", + "_PACKAGE", + "QUEST_STATE_YELLOW_QUESTION", + "ipairs", + "MAX_BATTLE_FIELD_OVERTIME", + "RIDE_FULL_MEASURE", + "BUFF_ON_HORSE", + "MAX_CAMP_PRIZE", + "ROLE_TYPE_INVALID", + "IsPlayerManaHide", + "ROLE_TYPE_STRONGMALE", + "ROLE_TYPE_STANDARDFEMALE", + "QIXUE_TYPE", + "ROLE_TYPE_STANDARDMALE", + "MAX_TONG_BATTLE_FIELD_OVERTIME", + "QUEST_STATE_WHITE_QUESTION", + "QUEST_STATE_BLUE_EXCLAMATION", + "QUEST_STATE_BLUE_QUESTION", + "MAX_QUEST_COUNT", + "QUEST_STATE_WHITE_EXCLAMATION", + "MAX_DAILY_QUEST_COUNT", + "MAX_CAMP_PRESTIGE", + "ROLE_TYPE_LITTLEBOY", + "math", + "_M", + "MAGIC_ATTRI_DEF", + "ITEM_SUBTYPE_DIAMOND_REPAIRE", + "ITEM_SUBTYPE_RECIPE", + "type", + "MAX_BATTLE_FIELD_SIDE_COUNT", + "ITEM_SUBTYPE_SKILL_RECIPE", + "QUEST_STATE_DUN_DIA", + "CONVERT_RAID_PLAYER_MIN_LEVEL", + "table", + "FINAL_TYPE", + "next", + "QUEST_STATE_HIDE", + "_NAME", + "QUEST_OPERATION_ACCEPT", + "MAX_CAMP_LEVEL", + "Wnd", + "Station", + "GetQuestState", + + "math", + "select", + "string", + "table", + "print", + "ipairs", + "pairs", + "tostring", + "tonumber", + "type", + "next", + "assert", + "collectgarbage", + "error", + "unpack", + "pcall", + "xpcall", + "setmetatable", + "count_c", + "pairs_c", + "ipairs_c", + "SetmetaReadonly", + "CAMP", + "GLOBAL", + "FORCE_TYPE", + "KUNGFU_TYPE", + "ITEM_TABLE_TYPE", + "EQUIPMENT_REPRESENT", + "INVENTORY_INDEX", + "INVENTORY_GUILD_BANK", + "INVENTORY_GUILD_PAGE_SIZE", + "GetGuildBankBagPos", + "TARGET", + "ITEM_GENRE", + "ITEM_BIND", + "PLAYER_TALK_CHANNEL", + "ADDON_CATEGORY", + "EQUIPMENT_SUB", + "EQUIPMENT_INVENTORY", + "WEAPON_DETAIL", + "BULLET_DETAIL", + "INVENTORY_TYPE", + "PARTY_LOOT_MODE", + "MOVE_STATE", + "SKILL_EFFECT_TYPE", + "SKILL_CAST_EFFECT_TYPE", + "SKILL_RESULT_CODE", + "SKILL_RECIPE_TYPE", + "SKILL_RESULT_TYPE", + "ROLE_TYPE", + "QUEST_STATE", + "RELATION_TYPE", + "TEAM_AUTHORITY_TYPE", + "REVIVE_TYPE", + "DOODAD_KIND", + "MAP_TYPE", + "MAP_CAMP_TYPE", + "MAIL_TYPE", + "ITEM_EXIST_TYPE", + "CHARACTER_OTACTION_TYPE", + "ARENA_TYPE", + "POSE_TYPE", + "GetVersion", + "GetLogicFrameCount", + "TimeToDate", + "DateToTime", + "GetCurrentTime", + "FormatString", + "LootMoney", + "LootItem", + "RollItem", + "GetMapList", + "GetSkillInfo", + "RegisterCastSkillFun", + "UnRegisterCastSkillFun", + "IsParty", + "Random", + "RepairAllItems", + "GlobelRecipeID2BookID", + "BookID2GlobelRecipeID", + "GetSkillRecipeBaseInfo", + "GetMasterRecipeList", + "Lock_State", + "GetShopItemID", + "GetShopItemBuyOtherInfo", + "GetShopItemReputeLevel", + "GetShopItemRepairPrice", + "GetShopItemSellPrice", + "GetBuyLimitItemCDLeftFrames", + "SellItem", + "BuyItem", + "GetRepairAllItemsPrice", + "GetItemMagicAttrib", + "GetItemSetAttrib", + "GetDesignationPrefixInfo", + "GetItemCoolDown", + "GetColorDiamondInfoFromEnchantID", + "GetItemEnchantAttrib", + "IsRemotePlayer", + "PeekOtherPlayerBook", + "ApplyAchievementData", + "GetBattleFieldPQInfo", + "GetEquipItemCompaireItem", + "GetCorpsInfo", + "GetBFRoleData", + "GetArenaStatistics", + "GetBattleFieldStatistics", + "CharInfoMore_GetShowValue", + "GetCharInfoShowSetting", + "IsPlayerExist", + "GetMapParams", + "IsPlayer", + "IsEnemy", + "IsSelf", + "GetLevelUpData", + "GetReputeLimit", + "GetPingValue", + "GetUserPreferences", + "StorageServer_GetData", + "GetBuffInfo", + "GetBuffTime", + "GetCharacterDistance", + "ApplyCharacterThreatRankList", + "IsNpcExist", + "SetTarget", + "IsNeutrality", + "IsCommonSkill", + "IsAlly", + "SetTeamMark", + "GetFEAInfoByEnchantID", + "GetDiamondInfoFromEnchantID", + "GetCorpsID", + "GetCorpsRoleInfo", + "GetCorpsMemberInfo", + "SyncCorpsBaseData", + "SyncCorpsMemberData", + "ViewInviteToPlayer", + "ViewOtherPlayerChannels", + "ViewOtherZhenPaiSkill", + "GetPeekPlayerID", + "PeekOtherPlayerTalent", + "SetAddonAreaCastMode", + "MD5", + "ApplyDungeonRoleProgress", + "GetDungeonRoleProgress", + "SendGMCommand", + "GetPlayerItem", + "GetItem", + "GetItemInfo", + "GetItemAdvanceBoxKeyInfo", + "GetAuctionClient", + "GetClientPlayer", + "GetControlPlayer", + "GetPlayer", + "GetNpc", + "GetDoodad", + "GetSkill", + "GetQuestInfo", + "GetClientTeam", + "GetTongClient", + "GetFellowshipCardClient", + "GetMailClient", + "GetScene", + "GetDoodadTemplate", + "GetNpcTemplate", + "GetRecipe", + "GetProfession", + "class", + "tweenlite", + "Output", + "UILog", + "BigIntAdd", + "BigIntSub", + "IsOptionOrOptionChildPanelOpened", + "RegisterScrollEvent", + "UnRegisterScrollAllControl", + "RegisterScrollControl", + "GetTargetHandle", + "GetTargetMaxLife", + "GetAttributeString", + "FireUIEvent", + "FireEvent", + "FireHelpEvent", + "DelayCall", + "BreatheCall", + "FrameCall", + "RenderCall", + "BuffMgr", + "RegisterEvent", + "UnRegisterEvent", + "RegisterCustomData", + "PopupMenu", + "PopupMenu_ProcessHotkey", + "IsPopupMenuOpened", + "GetPopupMenu", + "PopupMenuEx", + "InitFrameAutoPosInfo", + "GetLocalTimeText", + "GetWorldMapScale", + "GetTimeText", + "clone", + "var2str", + "SplitString", + "GetFormatText", + "FormatHandle", + "GetFormatImage", + "KeepOneByteFloat", + "KeepTwoByteFloat", + "FixFloat", + "GetIntergerBit", + "Conversion2ChineseNumber", + "IsTableEmpty", + "IsEmpty", + "GetMoneyTipText", + "GetGoldText", + "GetMoneyText", + "GetMoneyPureText", + "GetTimeToHourMinuteSecond", + "UI_GetPlayerMountKungfuID", + "OutputBuffTip", + "GetBuffDesc", + "GetBindBuffDesc", + "FormatLinkString", + "OutputTeamMemberTip", + "OutputActivityTip", + "OutputFieldPQTip", + "OutputQuestTip", + "ColorText", + "UI_GetClientPlayerID", + "GetControlPlayerID", + "OnUseCraft", + "OnBreakEquip", + "BreakEquip", + "OnUpdateCraftState", + "OutputCraftTip", + "OutputBookTipByID", + "GetBookTipByItem", + "GetBookTipByItemInfo", + "OutputRecipeLink", + "OutputEnchantTip", + "OutputEnchantLink", + "OutputDoodadTip", + "GetDoodadQuestTip", + "CheckDistanceAndDirection", + "OpenDoodad", + "InteractDoodad", + "CanSelectDoodad", + "GetQuestState", + "Hand_IsEmpty", + "Hand_Clear", + "Hand_Get", + "Hand_Pick", + "Hand_DropHandObj", + "IsCursorInExclusiveMode", + "GetKeyValue", + "GetKeyName", + "IsShiftKeyDown", + "IsCtrlKeyDown", + "IsAltKeyDown", + "IsKeyDown", + "GetKeyShow", + "AddUILockItem", + "RemoveUILockItem", + "RefreshUILockItem", + "GetUIItemBox", + "g_tReputation", + "GetNpcQuestTip", + "GetNpcQuestState", + "CThreadCoor_Register", + "CThreadCoor_Unregister", + "CThreadCoor_Get", + "RegisterGlobalEsc", + "UnRegisterGlobalEsc", + "UpdateSkillRecipeBoxObject", + "UpdataItemInfoBoxObject", + "UpdataItemBoxObject", + "UpdateItemBoxExtend", + "UpdateMountBoxObject", + "UpdateBoxObject", + "OnSplitBoxItem", + "OnExchangeItem", + "UpdataItemCDProgress", + "OnUseItem", + "OnDestroyItem", + "OnDestroyItemTable", + "GetItemFontColorByQuality", + "GetWeapenType", + "GetItemNameByUIID", + "GetItemPosByItemTypeIndex", + "GetItemPosInPackage", + "PlayItemSound", + "FormatAttributeValue", + "OutputPendantTip", + "GetItemTip", + "GetItemNameByItem", + "GetItemInfoTip", + "GetItemNameByItemInfo", + "OutputItemTip", + "MessageBox", + "CloseLastMessageBox", + "CloseMessageBox", + "OutputMessage", + "IsMonitorMsg", + "RegisterMsgMonitor", + "UnRegisterMsgMonitor", + "GetMsgFontString", + "GetMsgFont", + "SetMsgFontColor", + "OnItemLinkDown", + "OpenHotkeyPanel", + "ParseEmotionCommand", + "LootList_AddonClosePickupAll", + "Addon_AutoRefineDiamond", + "Addon_RegisterPlayerMenu", + "Addon_RegisterTargetMenu", + "Addon_RegisterTraceButtonMenu", + "Addon_RegisterPanel", + "Addon_UnregisterPanel", + "Addon_SwitchCategroy", + "Addon_SwitchTab", + "Addon_OpenPanel", + "Addon_ClosePanel", + "Addon_TogglePanel", + "Addon_ExteriorViewByItemInfo", + "SaveLUAData", + "LoadLUAData", + "LoadLangPack", + "IsMystiqueRecipeRead", + "IsMystiqueSkillRead", + "GetNpcIntensity", + "HideTip", + "OutputTip", + "OutputSkillTip", + "OutputSkillLink", + "OutputSkillRecipeTip", + "UpdataSkillCDProgress", + "UpdateCustomModeWindow", + "GetForceImage", + "GetForceTitle", + "GetFrameAnchor", + "GetFrameAnchorCorner", + "GetFrameAnchorEdge", + "SearchTarget_IsOldVerion", + "SearchTarget_SetOtherSettting", + "SearchTarget_SetAreaSettting", + "GetNpcHeadImage", + "GetHeadTextForceFontColor", + "Target_GetTargetData", + "GetUserInput", + "GetUserInputNumber", + "GetUserPercentage", + "GetUserSetPrice", + "OpenColorTablePanel", + "OutputWarningMessage", + "GetMsgFontColor", + "EditBox_GetChannel", + "OpenArenaCorpsPanel", + "IsBuffDispel", + "Buffer_IsDispel", + "SetCombatTargetToMeSetting", + "SetCombatMeToTargetSetting", + "PlayerChangeSuit", + "SwitchChatChannel", + "Chat_GetMonitorMsg", + "Chat_AddMonitorMsg", + "Chat_RemoveMonitorMsg", + "InsertMarkMenu", + "InsertPlayerMenu", + "InsertEquipOptMenu", + "InsertPlayerCommonMenu", + "InsertDistributeMenu", + "InsertPlayerCampMenu", + "InsertPlayerKungfuMenu", + "InsertTeammateLeaderMenu", + "InsertTeammateMenu", + "InsertInviteTeamMenu", + "InsertTargetMenu", + "Target_AppendAddonMenu", + "Target_GetAddonMenu", + "Player_AppendAddonMenu", + "Player_GetAddonMenu", + "TraceButton_AppendAddonMenu", + "TraceButton_GetAddonMenu", + "OutputAchievementTip", + "OutputDesignationTip", + "TargetPanel_SetOpenState", + "TargetPanel_GetOpenState", + "MoneyToGoldSilverAndCopper", + "GoldSilverAndCopperToMoney", + "SelectMainActionBarPage", + "GetPartyMemberFontColor", + "GetForceFontColor", + "GetKungfuSchoolColor", + "Send_RaidReadyConfirm", + "ApplyMapEnterInfo", + "ApplyMapSaveCopy", + "Raid_SetBufftimeParam", + "Raid_MonitorBuffs", + "Raid_GetConfig", + "Raid_SetConfig", + "Raid_GetMemberHandle", + "OpenRaidPanel", + "CloseRaidPanel", + "OpenUISettingPanel", + "IsBagInSort", + "IsBankInSort", + "FormatMoneyTab", + "MoneyOptCmp", + "MoneyOptAdd", + "MoneyOptSub", + "MoneyOptDiv", + "MoneyOptMult", + "UnpackMoney", + "PackMoney", + "Scene_GetSceneID", + "g_sound", + "UserSelect", + "g_tTable", + "g_tStrings", + "Arena_GetCompetitionIndex", + "BattleField_MatchPlayer", + "ForceIDToKungfuIDs", + "IsActivated", + "GetCenterID", + "GVoiceBase_IsOpen", + "GVoiceBase_GetMicState", + "GVoiceBase_SwitchMicState", + "GVoiceBase_CheckMicState", + "GVoiceBase_GetSpeakerState", + "GVoiceBase_SwitchSpeakerState", + "GVoiceBase_GetSaying", + "GVoiceBase_IsMemberSaying", + "GVoiceBase_IsMemberForbid", + "GVoiceBase_ForbidMember", + "ViewEquip_IsAddOnVersionActivated", + "ViewEquip_SetAddOnVersionActiveState", + "AuctionPanel", + "BigBagPanel", + "CraftReadManagePanel", + "CraftReadComparePanel", + "MainMessageLine", + "MiddleMap", + "OpenMiddleMap", + "IsMiddleMapOpened", + "CloseMiddleMap", + "ZhenPaiSkill", + "Player_GetFrame", + "PostThreadCall", + "Table_GetItemIconID", + "Table_GetItemName", + "Table_GetItemDesc", + "Table_GetSkillRecipe", + "Table_GetRecipeList", + "Table_GetSkill", + "Table_GetSkillIconID", + "Table_GetSkillSchoolName", + "Table_GetSkillSchoolIconID", + "Table_IsSkillFormation", + "Table_IsSkillFormationCaster", + "Table_GetSkillName", + "Table_GetSkillDesc", + "Table_GetSkillShortDesc", + "Table_GetSkillSpecialDesc", + "Table_GetSkillSortOrder", + "Table_IsSkillShow", + "Table_IsSkillCombatShow", + "Table_GetSkillPracticeID", + "Table_GetLearnSkillInfo", + "Table_GetBuff", + "Table_GetBuffIconID", + "Table_GetBuffName", + "Table_GetBuffDesc", + "Table_BuffNeedSparking", + "Table_BuffNeedShowTime", + "Table_BuffNeedShow", + "Table_BuffIsVisible", + "Table_GetForceImageName", + "Table_GetNpcTemplateName", + "Table_GetPetSkill", + "Table_GetPetAvatar", + "Table_GetMapName", + "Table_GetQuestPoint", + "Table_GetMagicAttributeInfo", + "Table_IsTreasureBattleFieldMap", + "Table_IsZombieBattleFieldMap", + "Table_IsMobaBattleFieldMap", + "GetBattleFieldFatherID", + "IsAddonBanMap", + "Table_GetCDProcessBoss", + "Table_GetBoss", + "Table_IsShieldedNpc", + "Table_GetDoodadTemplateName", + "Table_GetMKungfuBg", + "Table_GetMKungfuList", + "Table_GetKungfuSkillList", + "Table_GetNewKungfuSkill", + "Table_GetComboSkillInfo", + "Table_OpenSkillLevel", + "Table_GetSkillTeach", + "Table_GetSkillTeachQixueRecommend", + "Table_GetGuideSoultion", + "Table_SchoolToForce", + "Table_ForceToSchool", + "Trace", + "Log", + "GetRootPath", + "ScreenShot", + "GetSystemCScreen", + "NumberToChinese", + "PlaySound", + "StopSound", + "EncodeComponentsString", + "StringEnerW", + "StringReplaceW", + "StringFindW", + "wstring", + "GetFPS", + "StringLowerW", + "FormatTime", + "GetTime", + "GetTickCount", + "ReInitUI", + "IsFileExist", + "IsLocalFileExist", + "GetPureText", + "FlashTaskBar", + "GetUIIconPath", + "KG_Table", + "Hotkey", + "Station", + "Font", + "Wnd", + "Cursor", + "CPath", + "UI_OBJECT_ITEM", + "UI_OBJECT_SHOP_ITEM", + "UI_OBJECT_OTER_PLAYER_ITEM", + "UI_OBJECT_ITEM_ONLY_ID", + "UI_OBJECT_ITEM_INFO", + "UI_OBJECT_SKILL", + "UI_OBJECT_CRAFT", + "UI_OBJECT_SKILL_RECIPE", + "UI_OBJECT_SYS_BTN", + "UI_OBJECT_MACRO", + "UI_OBJECT_MOUNT", + "UI_OBJECT_ENCHANT", + "UI_OBJECT_NOT_NEED_KNOWN", + "rlcmd", + "ccmd", + "k3dcmd", + "SetGlobalTopHeadFlag", + "GetGlobalTopHeadFlag", + "SetGlobalTopIntelligenceLife", + "GetGlobalTopIntelligenceLife", + "Scene_GetCharacterTopScreenPos", + "Scene_GetCharacterTop", + "Scene_ScenePointToScreenPoint", + "Scene_GameWorldPositionToScenePosition", + "Scene_ScenePositionToGameWorldPosition", + "Scene_GameWorldPositionToScreenPoint", + "SceneObject_SetBrightness", + "Scene_SelectObject", + "Scene_PlaneGameWorldPosToScene", + "SceneObject_SetTitleEffect", + "Player_GetAnimationResource", + "Player_GetEquipResource", + "Player_GetRidesEquipResource", + "Player_GetRidesAnimationResource", + "PlayerEnergyUI_Update", + "PlayerEnergyUI_GetUpdateFunc", + "PlayerEnergyUI_ChangeStyle", + "NPC_GetProtrait", + "NPC_GetHeadImageFile", + "TargetSelection_AttachSceneObject", + "TargetSelection_DetachSceneObject", + "Camera_GetRTParams", + "Camera_GetParams", + "Navigator_SetID", + "Navigator_SetPoint", + "Navigator_Remove", + "ReloadUIAddon", + "EnableDebugEnv", + "OpenDebug", + "IsMultiThread", + "GetOpenFileName", + "SetDataToClip", + "GetOnlineFrameAnchor", + "SetOnlineFrameAnchor", + "GetAddonCustomData", + "SetAddonCustomData", + "CURL_HttpPostEx", + "AnsiToUTF8", + "UTF8ToAnsi", + "ConvertCodePage", + "GetGameCodePage", + "GetAnsiCodePage", + "UrlEncode", + "UrlDecode", + "JsonEncode", + "JsonDecode", + "GetFileCRC", + "GetStringCRC", + "SQLite3_Open", + "UnQLite_Open", + "LoadDataFromFile", + "SaveDataToFile", + "IsEncodedData", + "EncodeData", + "DecodeData", + "EncryptAES", + "DecryptAES", + "RegisterTalkFilter", + "UnRegisterTalkFilter", + "RegisterMsgFilter", + "UnRegisterMsgFilter", + "HookTableFunc", + "UnhookTableFunc", + "GetCurrentProcessID", + "__libexport", + "GetInsideEnv", + "debug", + "_reserve_fun", + "GetUserServer", + "GetUserRoleName", + "IsDebugClient", + "GetServerIP", + "GetServerPort", + "GetUserAccount", + "Login_GetAccount", + "GetGatewayServer", + "GetInterworkingServers", + "OpenBrowser", + "KGUIEncrypt", + "OpenGoldTeam", + "GetUserDataFolder", + "AchievementPanel", +} + +read_globals = {} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 45abe97c6..72c128768 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,4 +12,4 @@ before_install: - luarocks install luacheck script: - - luacheck 'Boilerplate_!Base' Boilerplate_Resource + - luacheck MYDev_Snaplines MYDev_UIEventID MYDev_UITexViewer MYDev_VarWatch 'MY_!Base' MY_BagEx MY_Cataclysm MY_Chat MY_ChatLog MY_CombatText MY_Farbnamen MY_Focus MY_Font MY_FontResource MY_Force MY_GKP MY_LifeBar MY_Logoff MY_MiddleMapMark MY_Recount MY_Resource MY_RoleStatistics MY_RollMonitor MY_ScreenShot MY_Target MY_TargetMon MY_TeamMon MY_TeamTools MY_ThreatRank MY_Toolbox diff --git a/Boilerplate_!Base/src/lib/Base.lua b/Boilerplate_!Base/src/lib/Base.lua deleted file mode 100644 index 55f0ae994..000000000 --- a/Boilerplate_!Base/src/lib/Base.lua +++ /dev/null @@ -1,246 +0,0 @@ --------------------------------------------------------------------------------- --- This file is part of the JX3 Plugin Project. --- @desc : 插件命名空间初始化 --- @copyright: Emil Zhai --------------------------------------------------------------------------------- - --- 游戏语言、游戏运营分支编码、游戏发行版编码、游戏版本号、游戏运行方式 -local szVersion, szVersionLineName, szVersionEx = select(2, GetVersion()) --- 游戏语言 -local _GAME_LANG_ = string.lower(szVersionLineName) -if _GAME_LANG_ == 'classic' then - _GAME_LANG_ = 'zhcn' -end --- 游戏运营分支编码 -local _GAME_BRANCH_ = string.lower(szVersionLineName) -if _GAME_BRANCH_ == 'zhcn' then - _GAME_BRANCH_ = 'remake' -elseif _GAME_BRANCH_ == 'zhtw' then - _GAME_BRANCH_ = 'intl' -end --- 游戏发行版编码 -local _GAME_EDITION_ = string.lower(szVersionLineName .. '_' .. szVersionEx) --- 游戏版本号 -local _GAME_VERSION_ = string.lower(szVersion) --- 游戏运行方式,本地、云端 -local _GAME_PROVIDER_ = 'local' -if SM_IsEnable then - local status, res = pcall(SM_IsEnable) - if status and res then - _GAME_PROVIDER_ = 'remote' - end -end --- 游戏代码分支 -local _GAME_API_BRANCH_ = _GAME_BRANCH_ -if _GAME_API_BRANCH_ == 'intl' then - _GAME_API_BRANCH_ = 'remake' -end - -local DEBUG_LEVEL = { - PM_LOG = 0, - LOG = 1, - WARNING = 2, - ERROR = 3, - DEBUG = 3, - NONE = 4, -} - -local CODE_PAGE = { - UTF8 = 65001, - GBK = 936, -} - -local IETF_BCP_47 = { - zhcn = 'zh-CN', - zhtw = 'zh-TW', -} - -local _NAME_SPACE_ = 'Boilerplate' -local _BUILD_ = '19700101' -local _VERSION_ = '0.0.0' -local _MENU_COLOR_ = {255, 255, 255} -local _INTERFACE_ROOT_ = 'Interface/' -local _ADDON_ROOT_ = _INTERFACE_ROOT_ .. _NAME_SPACE_ .. '/' -local _DATA_ROOT_ = (_GAME_PROVIDER_ == 'remote' and (GetUserDataFolder() .. '/' .. GetUserAccount() .. '/interface/') or _INTERFACE_ROOT_) .. _NAME_SPACE_ .. '#DATA/' -local _FRAMEWORK_ROOT_ = _ADDON_ROOT_ .. _NAME_SPACE_ .. '_!Base/' -local _UI_COMPONENT_ROOT_ = _FRAMEWORK_ROOT_ .. 'ui/components/' -local _LOGO_IMAGE_ = _FRAMEWORK_ROOT_ .. 'img/Logo.UITex' -local _LOGO_MAIN_FRAME_ = 0 -local _LOGO_MENU_FRAME_ = 1 -local _LOGO_MENU_HOVER_FRAME_ = 2 -local _POSTER_IMAGE_LIST_ = { - _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster.UITex', -} -local _DEBUG_LEVEL_ = DEBUG_LEVEL[LoadLUAData(_DATA_ROOT_ .. 'debug.level.jx3dat') or 'NONE'] or DEBUG_LEVEL.NONE -local _LOG_LEVEL_ = math.min(DEBUG_LEVEL[LoadLUAData(_DATA_ROOT_ .. 'log.level.jx3dat') or 'ERROR'] or DEBUG_LEVEL.ERROR, _DEBUG_LEVEL_) - ----@class (partial) Boilerplate_UI -local UI = {} - --- 基础库命名空间 ----@class (partial) Boilerplate -local X = { - UI = UI, - DEBUG_LEVEL = DEBUG_LEVEL, - CODE_PAGE = CODE_PAGE, - PATH_TYPE = { - NORMAL = 0, - DATA = 1, - ROLE = 2, - GLOBAL = 3, - SERVER = 4, - }, - PACKET_INFO = { - NAME_SPACE = _NAME_SPACE_ , - VERSION = _VERSION_ , - BUILD = _BUILD_ , - MENU_COLOR = _MENU_COLOR_ , - INTERFACE_ROOT = _INTERFACE_ROOT_ , - ROOT = _ADDON_ROOT_ , - DATA_ROOT = _DATA_ROOT_ , - FRAMEWORK_ROOT = _FRAMEWORK_ROOT_ , - UI_COMPONENT_ROOT = _UI_COMPONENT_ROOT_ , - LOGO_IMAGE = _LOGO_IMAGE_ , - LOGO_MAIN_FRAME = _LOGO_MAIN_FRAME_ , - LOGO_MENU_FRAME = _LOGO_MENU_FRAME_ , - LOGO_MENU_HOVER_FRAME = _LOGO_MENU_HOVER_FRAME_, - POSTER_IMAGE_LIST = _POSTER_IMAGE_LIST_ , - DEBUG_LEVEL = _DEBUG_LEVEL_ , - LOG_LEVEL = _LOG_LEVEL_ , - }, - ENVIRONMENT = setmetatable({}, { - __index = setmetatable({ - GAME_LANG = _GAME_LANG_, - GAME_LOCALE = IETF_BCP_47[_GAME_LANG_] or 'en-US', - GAME_BRANCH = _GAME_BRANCH_, - GAME_EDITION = _GAME_EDITION_, - GAME_VERSION = _GAME_VERSION_, - GAME_PROVIDER = _GAME_PROVIDER_, - GAME_API_BRANCH = _GAME_API_BRANCH_, - SERVER_ADDRESS = select(7, GetUserServer()), - SOUND_DRIVER = IsFileExist('bin64\\KG3DWwiseSoundX64.dll') - and 'WWISE' - or 'FMOD', - CODE_PAGE = _GAME_BRANCH_ == 'intl' - and CODE_PAGE.UTF8 - or CODE_PAGE.GBK, - RUNTIME_OPTIMIZE = --[[#DEBUG BEGIN]]( - (IsDebugClient() or debug.traceback ~= nil) - and _DEBUG_LEVEL_ == DEBUG_LEVEL.NONE - and _LOG_LEVEL_ == DEBUG_LEVEL.NONE - and not IsLocalFileExist(_ADDON_ROOT_ .. 'secret.jx3dat') - ) and not IsLocalFileExist(_DATA_ROOT_ .. 'no.runtime.optimize.jx3dat') - and true - or --[[#DEBUG END]]false, - }, { __index = GLOBAL }), - __newindex = function() end, - }), - SECRET = setmetatable({}, { - __index = LoadLUAData(_ADDON_ROOT_ .. 'secret.jx3dat') or {}, - __newindex = function() end, - }), - SHARED_MEMORY = PLUGIN_SHARED_MEMORY, -} - -X.IS_REMAKE = X.ENVIRONMENT.GAME_API_BRANCH == 'remake' -X.IS_CLASSIC = X.ENVIRONMENT.GAME_API_BRANCH == 'classic' -X.IS_LOCAL = X.ENVIRONMENT.GAME_PROVIDER == 'local' -X.IS_REMOTE = X.ENVIRONMENT.GAME_PROVIDER == 'remote' -X.IS_EXP = X.ENVIRONMENT.GAME_EDITION:sub(-4) == '_exp' -X.IS_WWISE = X.ENVIRONMENT.SOUND_DRIVER == 'WWISE' -X.IS_FMOD = X.ENVIRONMENT.SOUND_DRIVER == 'FMOD' -X.IS_UTF8 = X.ENVIRONMENT.CODE_PAGE == CODE_PAGE.UTF8 -X.IS_GBK = X.ENVIRONMENT.CODE_PAGE == CODE_PAGE.GBK -X.IS_RUNTIME_OPTIMIZE = X.ENVIRONMENT.RUNTIME_OPTIMIZE - --- 共享内存 -if type(X.SHARED_MEMORY) ~= 'table' then - X.SHARED_MEMORY = {} - PLUGIN_SHARED_MEMORY = X.SHARED_MEMORY -end - -local NS_FORMAT_STRING_CACHE = {} - --- 格式化命名空间模板字符串 ----@param s string @需要格式化的字符串 ----@return string @格式化后的字符串 -function X.NSFormatString(s) - if not NS_FORMAT_STRING_CACHE[s] then - NS_FORMAT_STRING_CACHE[s] = StringReplaceW(s, '{$NS}', _NAME_SPACE_) - end - return NS_FORMAT_STRING_CACHE[s] -end - --- 锁定命名空间 ----@param ns table @需要锁定的命名空间 ----@param szNSString string @需要锁定的命名空间的字符串描述名 ----@param mt table @额外的命名空间元表 ----@return table @命名空间锁定后读写代理对象 -function X.NSLock(ns, szNSString, mt) - local PROXY = {} - for k, v in pairs(ns) do - PROXY[k] = v - ns[k] = nil - end - local t = { - __metatable = true, - __index = PROXY, - __newindex = function() assert(false, 'DO NOT modify ' .. szNSString .. ' after initialized!!!') end, - __tostring = function(t) return szNSString end, - } - if mt then - for k, v in pairs(mt) do - t[k] = v - end - end - setmetatable(ns, t) - return PROXY -end - --- 加载语言包 ----@param szLangFolder string @语言包文件夹 ----@return table @语言包 -function X.LoadLangPack(szLangFolder) - local t0 = LoadLUAData(_FRAMEWORK_ROOT_ .. 'lang/default') or {} - local t1 = LoadLUAData(_FRAMEWORK_ROOT_ .. 'lang/' .. _GAME_LANG_) or {} - for k, v in pairs(t1) do - t0[k] = v - end - if type(szLangFolder) == 'string' then - szLangFolder = string.gsub(szLangFolder,'[/\\]+$','') - local t2 = LoadLUAData(szLangFolder..'/default') or {} - for k, v in pairs(t2) do - t0[k] = v - end - local t3 = LoadLUAData(szLangFolder..'/' .. _GAME_LANG_) or {} - for k, v in pairs(t3) do - t0[k] = v - end - end - setmetatable(t0, { - __index = function(t, k) return k end, - __call = function(t, k, ...) return string.format(t[k], ...) end, - }) - return t0 -end - -local _L = X.LoadLangPack(_FRAMEWORK_ROOT_ .. 'lang/lib/') - -X.PACKET_INFO.NAME = _L.PLUGIN_NAME -X.PACKET_INFO.SHORT_NAME = _L.PLUGIN_SHORT_NAME -X.PACKET_INFO.AUTHOR = _L.PLUGIN_AUTHOR -X.PACKET_INFO.AUTHOR_FEEDBACK = _L.PLUGIN_AUTHOR_FEEDBACK -X.PACKET_INFO.AUTHOR_FEEDBACK_URL = _L.PLUGIN_AUTHOR_FEEDBACK_URL -X.PACKET_INFO.AUTHOR_SIGNATURE = _L.PLUGIN_AUTHOR_SIGNATURE -X.PACKET_INFO.AUTHOR_ROLE_LIST = { - -- { szGlobalID = '0', szHeader = '' }, - -- { szName = '', dwID = 0, szHeader = '' }, - -- { szName = '', dwID = 0, szGlobalID = '0', szHeader = '' }, -} - --- 导出命名空间 ----@class (partial) Boilerplate -Boilerplate = X - ----@class (partial) Boilerplate_UI -Boilerplate_UI = UI diff --git a/Boilerplate_Resource/img/Poster.Tga b/Boilerplate_Resource/img/Poster.Tga deleted file mode 100644 index 9c1e84ef2..000000000 Binary files a/Boilerplate_Resource/img/Poster.Tga and /dev/null differ diff --git a/Boilerplate_Resource/img/Poster.UITex b/Boilerplate_Resource/img/Poster.UITex deleted file mode 100644 index 17610d0f3..000000000 Binary files a/Boilerplate_Resource/img/Poster.UITex and /dev/null differ diff --git a/Boilerplate_Resource/img/Poster.txt b/Boilerplate_Resource/img/Poster.txt deleted file mode 100644 index f011b79c8..000000000 --- a/Boilerplate_Resource/img/Poster.txt +++ /dev/null @@ -1 +0,0 @@ -Farme Left Top Width High File diff --git a/Boilerplate_Resource/info.ini b/Boilerplate_Resource/info.ini deleted file mode 100644 index 1181d3447..000000000 --- a/Boilerplate_Resource/info.ini +++ /dev/null @@ -1,8 +0,0 @@ -[Boilerplate_Resource] -package=Boilerplate -name=资源包 -desc=附加图像、音频等资源文件 -default=1 -version=1.0 -dependence=Boilerplate_!Base -lua_0=src/Boilerplate_Resource.lua diff --git a/Boilerplate_Resource/info.ini.zh_TW b/Boilerplate_Resource/info.ini.zh_TW deleted file mode 100644 index 2b6686599..000000000 --- a/Boilerplate_Resource/info.ini.zh_TW +++ /dev/null @@ -1,8 +0,0 @@ -[Boilerplate_Resource] -package=Boilerplate -name=璩囨簮鍖 -desc=闄勫姞鍦栧儚銆侀煶闋荤瓑璩囨簮鏂囦欢 -default=1 -version=1.0 -dependence=Boilerplate_!Base -lua_0=src/Boilerplate_Resource.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 39ab3f61d..9c85a8705 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,3067 @@ # 鏇存柊鏃ュ織 -## Boilerplate鎻掍欢闆 v0.0.0 +## 鑼椾紛鎻掍欢闆 v29.0.3 -* [缁煎悎] 鏂板 Boilerplate鎻掍欢闆 *(classic, remake)* +* [鑱婂ぉ杩囨护] 淇鑱婂ぉ杩囨护鎶ラ敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v29.0.2 + +* [娓告垙瀛椾綋] 瀛椾綋鍖呭姞杞戒綅缃Щ鍔ㄥ埌鐢ㄦ埛鐩綍 + +## 鑼椾紛鎻掍欢闆 v29.0.1 + +* [鍥㈤槦宸ュ叿] 淇閲嶄激璁板綍鏄剧ず闂 +* [鍥㈤槦鐩戞帶] 淇閲嶈姘斿姴鍒楄〃蹇冩硶鏄剧ず闂 +* [鑳屽寘鍔╂墜] 淇鑳屽寘鍔╂墜鍙兘鎶ラ敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v29.0.0 + +* [鍥㈤槦闈㈡澘] 淇闃熷弸蹇冩硶鍙兘鏄剧ず閿欒鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 瀹屽杽浜戠涓栫晫鏍囪鏈湴鏁版嵁鍔熻兘 +* [鍥㈤槦宸ュ叿] 瀹屽杽浜戠涓栫晫鏍囪鏁版嵁鏀惰棌鍔熻兘 +* [鍥㈤槦宸ュ叿] 淇浜戞爣璁板湴鍥剧瓫閫変笅鎷夋鐐瑰嚮鏃犳晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v28.0.4 + +* [鍩虹搴揮 淇閿欒鍒ゅ畾姣涚幓鐠冪壒鏁堢殑闂 *(classic)* +* [鍥㈤槦宸ュ叿] 淇浜戠鏍囪绮惧噯鎼滅储鏃犳硶鏄剧ず缁撴灉鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v28.0.3 + +* [瑙掕壊缁熻] 淇鐧炬垬寮傞椈褰曠粺璁′笉鏄剧ず鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 淇浜戞爣璁扮晫闈㈡枃鏈彲鑳芥孩鍑虹殑闂 + +## 鑼椾紛鎻掍欢闆 v28.0.2 + +* [鍥㈤槦鐩戞帶] 淇澶撮《鎻愮ず鍦ㄥ灞傚掕鏃舵椂棰滆壊寮傚父鐨勯棶棰 +* [甯哥敤宸ュ叿] 绂佹闈炴弧绾ц鑹蹭娇鐢ㄦ煡鐪嬭鑹插睘鎬у姛鑳 + +## 鑼椾紛鎻掍欢闆 v28.0.1 + +* [鍩虹搴揮 浼樺寲鐩爣蹇冩硶鍥炬爣鏄剧ず +* [甯哥敤宸ュ叿] 瀹屽杽鐩爣灞炴ф煡鐪嬬‘璁ゆ彁绀 + +## 鑼椾紛鎻掍欢闆 v28.0.0 + +* [鍥㈤槦鐩戞帶] 浼樺寲涓嶅悓瀹㈡埛绔洟闃熸皵鍔插垪琛ㄦ帓搴忔樉绀 + +## 鑼椾紛鎻掍欢闆 v27.1.24 + +* [瑙掕壊缁熻] 鏇存柊浠诲姟缁熻澶ф垬鑼堕閰嶇疆椤 *(classic)* + +## 鑼椾紛鎻掍欢闆 v27.1.23 + +* [鍥㈤槦闈㈡澘] 淇娌荤枟鎸佺画鍦ㄧ壒娈婃儏鍐典笅涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v27.1.22 + +* [鑳屽寘鍔╂墜] 灞忚斀涓庡畼鏂归噸澶嶇殑鑳屽寘鍔╂墜鍔熻兘 *(remake)* + +## 鑼椾紛鎻掍欢闆 v27.1.21 + +* [鑳屽寘鍔╂墜] 寤跺悗鍛ㄥ勾搴嗗墠鑳屽寘鐩稿叧鍔熻兘鐨勪笅绾胯鍒 *(remake)* + +## 鑼椾紛鎻掍欢闆 v27.1.20 + +* [鐩爣鐩戞帶] 淇鎷涘紡鐩戞帶鈥滈娴佷簯鏁b濇椂鍐峰嵈鏃堕棿涓嶅噯纭殑闂 +* [鑳屽寘鍔╂墜] 灞忚斀瀹樻柟宸查泦鎴愮殑鑳屽寘銆佷粨搴撴悳绱笌瀵规瘮鍔熻兘 *(remake)* +* [鑳屽寘鍔╂墜] 灞忚斀瀹樻柟宸查泦鎴愮殑鑳屽寘鏁寸悊銆佸爢鍙犮侀攣瀹氬姛鑳 *(remake)* +* [甯哥敤宸ュ叿] 灞忚斀瀹樻柟宸查泦鎴愮殑鍚嶅墤澶т細涓嚜鍔ㄥ彇娑堝睆钄借鑹叉ā鍨嬪姛鑳 *(remake)* + +## 鑼椾紛鎻掍欢闆 v27.1.19 + +* [鑱婂ぉ鍔╂墜] 淇閮ㄥ垎鑱婂ぉ棰戦亾鏃犳硶鏄剧ず鑱婂ぉ澶嶅埗鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.18 + +* [鍥㈤槦鐩戞帶] 淇浜や簰鐗╀欢杩涘叆鍦烘櫙鏃舵姤閿欑殑闂 +* [鑱婂ぉ鍔╂墜] 淇鏂扮増鑱婂ぉ鐣岄潰鍏煎闂 +* [甯哥敤宸ュ叿] 淇鏂扮増鑱婂ぉ鐣岄潰鏃犳硶閿佸畾浣嶇疆闂 + +## 鑼椾紛鎻掍欢闆 v27.1.17 + +* [鍥㈤槦鐩戞帶] 鎸夎姹傞噸鏂板惎鐢ㄥ悕鍓戝ぇ浼氬洟闃熺洃鎺 +* [鍥㈤槦鐩戞帶] 鎸夎姹傜姝㈠湪鍓湰澶栫洃鎺ф潵鑷叾浠栫帺瀹剁殑瑙掕壊鎴樻枟浜嬩欢 + +## 鑼椾紛鎻掍欢闆 v27.1.16 + +* [鍥㈤槦鐩戞帶] 淇甯細棰嗗湴閽撻奔鎻愮ず鏃犳硶鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.15 + +* [鍥㈤槦鐩戞帶] 鎸夎姹傚湪绔炴妧鍦板浘鍐呯鐢ㄥ洟闃熺洃鎺 + +## 鑼椾紛鎻掍欢闆 v27.1.14 + +* [鎴樻枟缁熻] 浼樺寲鎴樻枟缁熻闃熷垪鏁堢巼 +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鐩戞帶鍙互鐩戞帶鍒板鎴樺湴鍥句腑鍏朵粬鐜╁姘斿姴鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.13 + +* [鐩爣閫夋嫨] 淇鍦ㄧ粷澧冩垬鍦轰腑鍙互琚埄鐢ㄧ殑闂 +* [鑳屽寘鍔╂墜] 淇鍦ㄧ粷澧冩垬鍦虹瓑鏂拌儗鍖呭湴鍥句腑鏄剧ず閿欎贡闂 +* [瑙掕壊缁熻] 淇瑁呭缁熻鐣岄潰闂 +* [瑙掕壊缁熻] 浼樺寲鐣岄潰榛樿澶у皬 +* [瑙掕壊缁熻] 淇涓嶆樉绀轰簲琛岀煶鐨勯棶棰 +* [瑙掕壊缁熻] 澧炲姞瑁呭缁熻澶ч檮榄旀樉绀 +* [瑙掕壊缁熻] 淇鏌ョ湅瑁呭涓嶆樉绀洪暥宓屾爮鏁版嵁鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.12 + +* [缁勯槦鍔╂墜] 淇鏂扮増鏈吋瀹规ч棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.11 + +* [鑳屽寘鍔╂墜] 鍏煎瀹樻柟鑳屽寘鏂扮殑灞傜骇淇敼 + +## 鑼椾紛鎻掍欢闆 v27.1.10 + +* [鑳屽寘鍔╂墜] 褰撳瓨鍦ㄥ畼鏂逛粨搴撴悳绱㈠姛鑳芥椂灞忚斀鎻掍欢浠撳簱鎼滅储鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v27.1.9 + +* [鍩虹搴揮 淇鍦ㄨ法鏈嶇姸鎬佷笅涓婄嚎鎶ラ敊鐨勯棶棰 +* [鑳屽寘鍔╂墜] 褰撳瓨鍦ㄥ畼鏂硅儗鍖呮悳绱㈠姛鑳芥椂灞忚斀鎻掍欢鑳屽寘鎼滅储鍔熻兘 +* [甯哥敤宸ュ叿] 淇璺ㄦ湇鎯呯紭鏃犳硶缁戝畾鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇閮ㄥ垎姘斿姴鍥炬爣鏃犳硶姝e父鑾峰彇鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.8 + +* [闂ㄦ淳鏌撹壊] 淇涓澶勬姤閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v27.1.7 + +* [闂ㄦ淳鏌撹壊] 浼樺寲缁熻鏄剧ず鐣岄潰 + +## 鑼椾紛鎻掍欢闆 v27.1.6 + +* [鐣岄潰搴揮 閫氱敤闈㈡澘鏀寔鍏ㄥ眬閫忔槑搴﹁缃 +* [鐣岄潰搴揮 淇鍗曢夋浜掓枼閫昏緫澶辨晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.5 + +* [鍩虹搴揮 閫傞厤鐞夌拑鐣岄潰鍗曢夋銆佸閫夋銆佹粴鍔ㄦ潯銆佹粦鍔ㄦ潯缁勪欢銆佹寜閽佷笅鎷夋绛夌粍浠 *(remake)* +* [鍩虹搴揮 绉诲姩鎷奸煶鏁版嵁鍒拌祫婧愬瓙鎻掍欢涓紭鍖栧熀纭搴撳ぇ灏 +* [闂ㄦ淳鏌撹壊] 榛樿涓嶅啀鍚敤鏈湴瀛樺偍鍔熻兘 *(remake)* +* [闂ㄦ淳鏌撹壊] 鎸夎姹傝В鍐抽棬娲炬煋鑹茬紦瀛樺姛鑳藉湪鏈烘纭洏涓嬪鑷撮】鍗$殑闂 *(remake)* +* [鑱婂ぉ璁板綍] 鎸夎姹傝В鍐宠亰澶╄褰曞湪鏈烘纭洏涓嬪鑷撮】鍗$殑闂 *(remake)* +* [鎴樻枟鏃ュ織] 鎸夎姹傝В鍐虫垬鏂楁棩蹇楀姛鑳藉湪鏈烘纭洏涓嬪鑷撮】鍗$殑闂 *(remake)* +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ鍔╂墜鐣岄潰绂佺敤鐘舵佹樉绀洪棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.4 + +* [鍩虹搴揮 鎼滅储妗嗙晫闈㈢粍浠堕傞厤鐞夌拑椋庢牸 *(remake)* +* [鍩虹搴揮 閫傞厤鐞夌拑椋庢牸鍏抽棴鎸夐挳澶у皬 *(remake)* +* [鑳屽寘鍔╂墜] 鑳屽寘鍏ュ彛浣跨敤鐞夌拑椋庢牸閫傞厤 *(remake)* +* [甯哥敤宸ュ叿] 鎯呯紭鐣岄潰閫傞厤鐞夌拑椋庢牸 *(remake)* +* [甯哥敤宸ュ叿] 淇鍘嗗彶鎷涘紡鍒楄〃绌块忚缃笉鐢熸晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.3 + +* [甯哥敤宸ュ叿] 瀹屽杽浜戠瀹忔寜閽珮搴 +* [甯哥敤宸ュ叿] 淇浜戠瀹忔寜閽姛鑳藉け鏁堢殑闂 +* [瑙掕壊缁熻] 淇琛ㄦ牸鍒楀彸閿偣鍑讳笉寮瑰嚭鑿滃崟鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.1.2 + +* [鍩虹搴揮 鐣岄潰鏈灏忓寲鏃堕殣钘忔瘺鐜荤拑鏁堟灉 *(remake)* + +## 鑼椾紛鎻掍欢闆 v27.1.1 + +* [甯哥敤宸ュ叿] 璇曡。闂撮傞厤鐞夌拑鎸夐挳椋庢牸 *(remake)* +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ澶嶅埗鎶ラ敊鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇缃楃洏鍦ㄧ悏鐠冮鏍间笅閿欎綅鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v27.1.0 + +* [鍩虹搴揮 鍏ㄩ潰閫傞厤鐣岄潰鐞夌拑椋庢牸 *(remake)* +* [鍩虹搴揮 鏇存柊鍒ゆ柇渚犲鐨勬柟寮 *(remake)* +* [鍩虹搴揮 淇瀹樻柟鑾峰彇棰滆壊鍑芥暟鍙兘鎶ラ敊鐨勯棶棰 +* [绯荤粺璁剧疆] 瑙掕壊璁剧疆椤瑰鍔犻珮绾у叡浜柟妗堣缃 +* [鑱婂ぉ鍔╂墜] 鎵撻┈妯″紡鍚姩鏃堕殣钘忚嚜韬垬鏂楃粺璁 +* [鑱婂ぉ璁板綍] 浼樺寲鑱婂ぉ瀵煎嚭鎼滅储鏀寔琛ㄦ儏鎼滅储 +* [鑱婂ぉ璁板綍] 浼樺寲鑱婂ぉ瀵煎嚭鏀寔鏄剧ず鍩虹琛ㄦ儏 +* [鑱婂ぉ璁板綍] 浼樺寲鑱婂ぉ璁板綍瀵煎嚭甯冨眬 +* [鑱婂ぉ璁板綍] 浼樺寲鑱婂ぉ璁板綍瀵煎嚭閲戦挶鏄剧ず +* [鑱婂ぉ璁板綍] 澧炲姞鍒嗛〉鍣ㄤ笌杩囨护鍣ㄤ紭鍖栬亰澶╄褰曞鍑烘煡鐪 +* [鑱婂ぉ璁板綍] 鑱婂ぉ鎼滅储澧炲姞瀹氫綅鑱婂ぉ浣嶇疆鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v27.0.10 + +* [鍥㈤槦鐩戞帶] 鎸夎姹傜姝㈠湪缁濆鎴樺満涓娇鐢 +* [鍥㈤槦宸ュ叿] 淇鎴块棿鍔╂墜涓嶆樉绀鸿姹傚垪琛ㄧ殑闂 + +## 鑼椾紛鎻掍欢闆 v27.0.9 + +* [鍥㈤槦宸ュ叿] 淇 MAC 绔笉鏄剧ず鎵嬫満鍥炬爣鐨勯棶棰 *(remake)* +* [鑱婂ぉ鍔╂墜] 淇闂ㄦ淳鏌撹壊淇℃伅妗嗕笉鍙楄亰澶╂墦鐮佹帶鍒剁殑闂 +* [閲戝洟璁板綍] 榛樿鍏抽棴鎺掗噾鍥㈡嬀鍙栧簭鍔熻兘浠庤屼繚鎸佸拰瀹樻柟涓鑷 +* [閲戝洟璁板綍] 绱у噾妯″紡涓嬮噾鍥㈡嬀鍙栫晫闈篃鏄剧ず鎺ㄨ崘鍥炬爣 +* [閲戝洟璁板綍] 浼樺寲鎶樺彔妯″紡涓嬮噾鍥㈡嬀鍙栫晫闈㈠悕绉版樉绀 +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇鐗屽瓙鏌撹壊涓嶆樉绀虹殑闂 +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇鍒囨崲鎺掑簭鏂瑰紡鏃朵笉鍒锋柊鏁版嵁鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.0.8 + +* [閲戝洟缁熻] 閲戝洟鎷惧彇浼樺寲杩囨护鐗╁搧鎶樺彔鏄剧ず鏁堟灉 +* [閲戝洟缁熻] 閲戝洟鎷惧彇绱у噾妯″紡澧炲姞鍚嶇О鏄剧ず +* [閲戝洟缁熻] 閲戝洟鎷惧彇鍚嶇О杩囨护鏀寔^寮澶寸殑妯″紡鍖归厤 +* [閲戝洟缁熻] 閲戝洟鎷惧彇澧炲姞鎶樺彔鏄剧ず杩囨护鐗╁搧鐨勫姛鑳 +* [甯哥敤宸ュ叿] 鍘嗗彶鎷涘紡鏄剧ず澧炲姞鐣岄潰绌块忛夐」 +* [甯哥敤宸ュ叿] 鍘嗗彶鎷涘紡鍒楄〃澧炲姞杩囨护鎷涘紡閰嶇疆 +* [甯哥敤宸ュ叿] 鍘嗗彶鎷涘紡鍒楄〃榛戝悕鍗曞鍔犳姘忕瓑鏂伴棬娲剧殑鏅氭敾鍑绘嫑寮 + +## 鑼椾紛鎻掍欢闆 v27.0.7 + +* [澶撮《琛鏉 淇澶撮《姘斿姴鎶ヨ鍙兘涓嶆樉绀虹殑闂 *(remake)* +* [鍦板浘鎼滅储] 澧炲姞娓呯┖褰撳墠鍦板浘缂撳瓨鏁版嵁鐨勯夐」 +* [鎴樻枟缁熻] 淇鎴樻枟涓旈闃熷啀杩涚粍鐨勯槦鍙嬬粺璁℃樉绀哄紓甯哥殑闂 + +## 鑼椾紛鎻掍欢闆 v27.0.6 + +* [閲戝洟鎷惧彇] 澧炲姞鎺夎惤鎺掑簭寮鍏 +* [瑙掕壊缁熻] 鏇存柊130绾т换鍔$粺璁 *(remake)* +* [鎴樻枟鏂囧瓧] 榛樿涓嶅啀鍚敤鎻掍欢鎴樻枟娴姩鏂囧瓧 +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦鍊掕鏃朵笉鏄剧ず鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇灏氭湭鎵撳紑鐨勬帀钀戒細琚樉绀虹殑闂 *(classic)* +* [鎴樻枟鏂囧瓧] 淇鎴樻枟鏂囧瓧绮剧畝鏁板兼棤娉曞叧闂殑闂 +* [鑱婂ぉ杩囨护] 淇鍙兘鍘嗗彶鑱婂ぉ鍙兘瀵艰嚧鎶ラ敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.0.5 + +* [鍩虹搴揮 鏇存柊娈垫皬鏋氫妇 *(remake)* +* [鍩虹搴揮 淇鑾峰彇瀹樻柟闂ㄦ淳鏌撹壊閿欒鐨勯棶棰 +* [鎴樻枟鏂囧瓧] 澧炲姞绮剧畝鏁板奸夐」 +* [鑱婂ぉ鏌撹壊] 瑙掕壊甯細鍚嶄粎鍦ㄥ彲浠ヨ幏鍙栨椂鍒锋柊 + +## 鑼椾紛鎻掍欢闆 v27.0.4 + +* [鍥㈤槦鐩戞帶] 涓嶅啀鏄剧ず鍥㈤槦銆佷釜浜烘皵鍔插垪琛 *(classic)* +* [甯哥敤宸ュ叿] 淇鍚嶅墤澶т細鑷姩鍒囨崲棰戦亾鎶ラ敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27.0.3 + +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ鏃堕棿鍦ㄦ煇浜涙儏鍐典笅涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v27.0.2 + +* [鍩虹搴揮 鑱婂ぉ鎺ュ彛澧炲姞淇濆瓨鍙傛暟 *(remake)* +* [鑳屽寘鍔╂墜] 淇鍚孖D缁戝畾涓庝笉缁戝畾鐗╁搧鍫嗗彔鏃舵棤闄愪氦鎹㈢殑闂 +* [鑱婂ぉ鍔╂墜] 瀹屽杽鐐瑰悕璁板綍鍔熻兘涓庡畼鏂瑰啿绐佺殑闂 *(remake)* +* [鑱婂ぉ鍔╂墜] 淇鐐瑰悕璁″叆瀵嗚亰棰戦亾鍑虹幇閲嶅鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 鐐瑰悕鎻愰啋鍔熻兘榛樿鍚敤鐘舵佹敼涓哄叧闂 +* [鑱婂ぉ鍔╂墜] 淇鏈杩戣亰澶╂椂闂存樉绀洪棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍊掕鏃舵潯鏄剧ず闂 *(remake)* +* [鍦板浘鎼滅储] 淇鎼滅储鏃舵姤閿欑殑闂 +* [鍒峰睆灞忚斀] 涓嶅啀鍏佽灞忚斀绯荤粺棰戦亾 +* [瑙掕壊缁熻] 淇绮惧姏鍒楁棤娉曟帓搴忕殑闂 + +## 鑼椾紛鎻掍欢闆 v27.0.1 + +* [鍩虹搴揮 浣跨敤瀹樻柟鎻愪緵鐨勯棬娲捐壊鎺ュ彛 +* [鍩虹搴揮 鏃ュ織璁板綍澧炲姞鍘婚噸闄愬埗鏁伴噺閫昏緫闃叉鍗℃ +* [鍦板浘鎼滅储] 澧炲姞鍚敤寮鍏抽槻姝㈤粯璁ゅ惎鐢ㄥ鑷存姤閿 +* [鑳屽寘鍔╂墜] 淇鏁寸悊鑳屽寘椤哄簭涔辫烦鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 瑙掕壊鏌撹壊鏃犺鍏ㄥ眬ID闃叉鏁版嵁閿欎贡 +* [闂ㄦ淳鐗硅壊] 绉婚櫎骞翠箙澶变慨鏃犳剰涔夌殑鎻掍欢闂ㄦ淳鑳介噺鏉 + +## 鑼椾紛鎻掍欢闆 v27.0.0 + +* [鍩虹搴揮 淇ESC鎻掍欢绠$悊鏃犳硶鎵撳紑鎻掍欢涓荤晫闈㈢殑闂 + +## 鑼椾紛鎻掍欢闆 v26.0.1 + +* [鍩虹搴揮 淇鍒濆鍖栨姤閿欑殑闂 +* [鑳屽寘鍔╂墜] 淇璁剧疆椤规棤娉曞鍏ュ鍑虹殑闂 +* [鑱婂ぉ鍔╂墜] 榛樿鍏抽棴鐐瑰悕璁板綍鍒板瘑鑱婇閬 *(classic)* +* [闂ㄦ淳鏌撹壊] 淇鏌撹壊閿欒鍙樻垚渚犲+鐨勯棶棰 *(classic)* + +## 鑼椾紛鎻掍欢闆 v26.0.0 + +* [鍩虹搴揮 淇鏃楄埌绔棤娉曡幏鍙栬鑹茶澶囦簲琛岀煶浜斿僵鐭充俊鎭殑闂 *(remake)* +* [鍩虹搴揮 淇鏃犳硶鑾峰彇濂藉弸鍦ㄧ嚎鐘舵佺殑闂 *(classic)* +* [鍩虹搴揮 淇鏃犳硶鑾峰彇濂藉弸鎵鍦ㄥ湴鐨勯棶棰 *(classic)* +* [鍩虹搴揮 淇娑堟伅涓績鍏ュ彛涓嶆樉绀虹殑闂 +* [鍩虹搴揮 鑾峰彇濂藉弸淇℃伅鎺ュ彛鏃犳硶鎴愬姛杩斿洖鐨勯棶棰 *(classic)* +* [鍩虹搴揮 璺ㄦ湇鐘舵佺姝㈣幏鍙栧府浼氬悕绉 +* [鎴樻枟缁熻] 澧炲姞鍘嗗彶璁板綍涓嬫媺妗嗘暟閲 +* [鎴樻枟缁熻] 灏嗚鑹插悕绉版煋鑹蹭负闂ㄦ淳鑹插苟澧炲姞闂ㄦ淳鏄剧ず +* [鎴樻枟缁熻] 褰掑睘NPC鍚嶇О鏀逛负褰掑睘鑰呭悗缃柟寮忔樉绀 +* [鎴樻枟缁熻] 鏀寔鍔犺浇鑷畾涔夋垬鏂楃粺璁℃枃浠 +* [浠囨仺缁熻] 褰掑睘NPC鍚嶇О鏀逛负褰掑睘鑰呭悗缃柟寮忔樉绀 +* [鐒︾偣鍒楄〃] 淇鐒︾偣鍒楄〃鎶ラ敊闂 +* [鑱婂ぉ璁板綍] 淇瀵煎叆鍔熻兘鏃犳硶姝e父浣跨敤鐨勯棶棰 +* [鑳屽寘鍔╂墜] 鑳屽寘鏁寸悊灏嗛檺鏃剁墿鍝佹斁鍦ㄦ渶鍚庨潰 +* [闂ㄦ淳鏌撹壊] 淇鏌ョ湅浠栦汉瑁呭涓嶆洿鏂板府浼氫俊鎭殑闂 +* [闂ㄦ淳鐗硅壊] 淇闀挎瓕鍔╂墜鎶ラ敊鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 淇鑴忔暟鎹鑷撮敊璇樉绀洪棬娲剧殑闂 *(classic)* + +## 鑼椾紛鎻掍欢闆 v25.3.1 + +* [甯哥敤宸ュ叿] 淇瑙掕壊澶囨敞璺ㄦ湇鏃犳硶璁剧疆澶氫釜璺ㄦ湇瑙掕壊澶囨敞鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v25.3.0 + +* [鑱婂ぉ鍔╂墜] 钀屾柊棰戦亾绂佹鑱婂ぉ澶嶅埗 +* [鍥㈤槦宸ュ叿] 缁勯槦鍔╂墜鍏煎鏂扮増缁勯槦璇锋眰 + +## 鑼椾紛鎻掍欢闆 v25.2.1 + +* [鐒︾偣鍒楄〃] 淇鍦ㄨ法鏈嶄笅涓嶈兘鐒︾偣濂藉弸鐨勯棶棰 +* [鎴樻枟缁熻] 淇绮剧畝鏄剧ず鏁板间笉鍑嗙‘鐨勯棶棰 +* [鎴樻枟缁熻] 榛樿鏄剧ず妯″紡鏀逛负绮剧畝鏄剧ず鏁板 +* [鎴樻枟缁熻] 淇鑷韩鏈樉绀轰负绮剧畝鏁板奸棶棰 +* [閲戝洟鎷惧彇] 鍏佽鍙抽敭鎷嶅崠鍔熻兘鍦ㄦ媿鍥㈡ā寮忎笅浣跨敤 +* [甯哥敤宸ュ叿] 淇濂藉弸楂樹寒鍦ㄨ法鏈嶇姸鎬佷笅涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v25.2.0 + +* [鍩虹搴揮 淇鑾峰彇甯細鍚嶇О浼犲叆鍙傛暟鍙兘涓嶆纭殑闂 +* [鍩虹搴揮 鎸夊畼鏂硅姹備笉鍐嶆樉绀鸿鑹插敮涓ID淇℃伅 +* [鍥㈤槦宸ュ叿] 淇鎴樻枟浜嬩欢璁板綍璁剧疆鍏ュ彛涓嶆樉绀虹殑闂 +* [鑳屽寘鍔╂墜] 浼樺寲鑳屽寘鏂扮墿鍝佺疆搴曞姛鑳藉鍫嗗彔鏁板彂鐢熷彉鍖栫殑鍒ゆ柇閫昏緫 +* [鎴樻枟缁熻] 澧炲姞绮剧畝鏄剧ず璁板綍鏁板肩殑閫夐」 +* [瑙掕壊缁熻] 绉樺缁熻澧炲姞鎺ㄨ崘绉樺閫夐」 +* [甯哥敤宸ュ叿] 淇瀹犵墿鐧剧鐐瑰嚮鏃犳晥鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇瑙掕壊澶囨敞璺ㄦ湇鎯呭喌涓嬪彲鑳芥姤閿欑殑闂 +* [鐗╁搧鎼滅储] 鏀寔鎸変綇ALT鐐瑰嚮棰勮澶栬 +* [鑱婂ぉ杩囨护] 淇鎷涘嫙杩囨护涓嶅彈鑱婂ぉ杩囨护鎬诲紑鍏虫帶鍒剁殑闂 + +## 鑼椾紛鎻掍欢闆 v25.1.0 + +* [鍩虹搴揮 淇℃伅娴姩鏉″鍔犲垎绂绘ā寮 +* [鍩虹搴揮 瑙掕壊淇℃伅TIP澧炲姞鎸変綇CTRL鏄剧ず鎷奸煶鐨勫姛鑳 +* [閲戝洟鎷惧彇] 淇杩囧浘鍚庣晫闈㈡病鏈夎嚜鍔ㄥ叧闂殑闂 +* [澶撮《琛鏉 淇浼樺厛绾у啿绐佹椂鍙兘鎶ラ敊鐨勯棶棰 +* [瑙掕壊缁熻] 閫氳繃淇℃伅鏉″垎绂绘ā寮忓疄鐜版棫鐗堝叆鍙g粫杞诲姛姘斿姏鐞冨睍绀烘晥鏋 + +## 鑼椾紛鎻掍欢闆 v25.0.3 + +* [鐒︾偣鍒楄〃] 鏄剧ず瑙掕壊澶囨敞淇℃伅 +* [閲戝洟鎷惧彇] 淇鎺夎惤鍏抽棴鍚庡張鑷姩鎵撳紑鐨勯棶棰 +* [瑙掕壊缁熻] 淇瀹犵墿缁熻娴忚鍣ㄦ渶灏忓寲鍚庝粛鐒堕伄鎸$晫闈㈢殑闂 + +## 鑼椾紛鎻掍欢闆 v25.0.2 + +* [鎴樻枟鏂囧瓧] 澧炲姞鑷村懡涓鍑讳紭鍖栨樉绀烘晥鏋 +* [鑱婂ぉ璁板綍] 淇鏃х増鏁版嵁鏇存柊鎻愮ず妗嗘棤娉曠偣鍑荤殑闂 +* [瑙掕壊澶囨敞] 澧炲姞鑱婂ぉ鏍忕帺瀹跺悕瀛楀彸閿彍鍗曞叆鍙 +* [瑙掕壊缁熻] 淇鐢变簬杞诲姛姘斿姏鍊肩悆鏀瑰姩瀵艰嚧鍏ュ彛鏄剧ず鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鐣岄潰鏃犳硶鍏抽棴鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 淇杩滅▼鏌ョ湅瑁呭鍚庡府浼氫俊鎭秷澶辩殑闂 + +## 鑼椾紛鎻掍欢闆 v25.0.1 + +* [瑙掕壊缁熻] 澧炲姞浼戦棽鐐圭粺璁 +* [閲戝洟鎷惧彇] 鍦ㄧ澧冧腑涓嶅啀鑷姩鍏抽棴鎷惧彇绐楀彛 + +## 鑼椾紛鎻掍欢闆 v25.0.0 + +* [鍥㈤槦宸ュ叿] 鍥㈤槦鍊掕鏃跺鍔犲揩鎹烽敭 +* [瑙掕壊缁熻] 淇鐧炬垬缁熻鍙兘鎶ラ敊鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 鎺у埗鏉″鍔犲洟闃熷掕鏃 +* [闂ㄦ淳鏌撹壊] 淇鑱婂ぉ鏍忔寜浣廇LT鐐瑰嚮瑙掕壊鍚嶆棤娉曢瑙堣澶囩殑闂 +* [闂ㄦ淳鏌撹壊] 鑱婂ぉ鍚嶅瓧蹇熸煡鐪嬭澶囨敮鎸佽法鏈嶈鑹叉煡鐪 +* [闂ㄦ淳鏌撹壊] 淇璺ㄦ湇涓嬪彲鑳戒笉鏄剧ず瑙掕壊闂ㄦ淳鏌撹壊鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 鎴块棿鍔╂墜澧炲姞鑷姩閫氳繃闃熷弸鐨勯夐」 +* [缁勯槦鍔╂墜] 淇鏌ョ湅瑁呭鎸夐挳鎶ラ敊鐨勯棶棰 +* [瑙掕壊澶囨敞] 鏀寔澶囨敞瑙掕壊鍔犲叆鎴块棿鏃舵彁绀 +* [瑙掕壊澶囨敞] 鏀寔瀵硅法鏈嶈鑹插鍔犲娉 +* [闂ㄦ淳鏌撹壊] 淇璺ㄦ湇鏃舵湰鏈嶇帺瀹跺府浼氭秷澶辩殑闂 + +## 鑼椾紛鎻掍欢闆 v24.0.1 + +* [鎴樻枟缁熻] 淇瑙掕壊鍚嶅寘鍚獲鏃朵緺瀹㈠悕绉版樉绀哄紓甯哥殑闂 +* [鎴樻枟缁熻] 淇涓澶勬姤閿欑殑闂 +* [闂ㄦ淳鏌撹壊] 鑱婂ぉ棰戦亾鏀寔鍙戣█瑙掕壊鍚嶅疄鏃舵煋鑹 +* [闂ㄦ淳鏌撹壊] 瑙掕壊鍚嶆煋鑹叉敮鎸佽法鏈嶈鑹叉煋鑹 +* [鍥㈤槦宸ュ叿] 鎴块棿缁熻鏀寔鏌ョ湅鍏朵粬渚犲+瑁呭 + +## 鑼椾紛鎻掍欢闆 v24.0.0 + +* [鍥㈤槦宸ュ叿] 澧炲姞鎴块棿/鍥㈤槦鍒囨崲閫夐」浣块儴鍒嗗姛鑳芥敮鎸佹埧闂寸粺璁 + +## 鑼椾紛鎻掍欢闆 v23.0.2 + +* [鍩虹搴揮 淇璁剧疆椤瑰鍏ュ鍑烘姤閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v23.0.1 + +* [鍥㈤槦宸ュ叿] 淇鏌ョ湅鍏朵粬鐜╁瑁呭鏃堕暥宓岀煶澶翠笉鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v23.0.0 + +* [鍥㈤槦妗嗘灦] 澧炲姞鍙闃熷弸鎸夐挳 +* [鑱婂ぉ璁板綍] 榛樿杩囨护闈炲綋鍓嶇帺瀹舵垚灏辩О鍙锋秷鎭 + +## 鑼椾紛鎻掍欢闆 v22.0.5 + +* [鍩虹搴揮 淇澶嶉夋鑷姩瀹藉害鏃犳硶鏄剧ず鏈鍚庝竴涓瓧绗︾殑闂 +* [鍥㈤槦宸ュ叿] 淇鎴愬氨鐘舵佹棤娉曟悳绱㈢殑闂 +* [鐩爣鐩戞帶] 鐩戞帶绂佹浣跨敤鎻愮ず璇敼涓轰粎鑱婂ぉ棰戦亾鏄剧ず + +## 鑼椾紛鎻掍欢闆 v22.0.4 + +* [鑱婂ぉ璁板綍] 鎸夎姹傛殏鏃剁鐢ㄨ亰澶╄鑹插悕绉板鍒跺姛鑳 + +## 鑼椾紛鎻掍欢闆 v22.0.3 + +* [鍩虹搴揮 淇澶嶉夋楂樺害閿欒瀵艰嚧鍥炬爣鍙樺皬鐨勯棶棰 +* [鐩爣鐩戞帶] 鎸夎姹傜姝㈡棤鐣屽績娉曞湪绔炴妧绫诲湴鍥句笅浣跨敤鐩爣鐩戞帶 +* [鍥㈤槦鐩戞帶] 鎸夎姹傜姝㈡棤鐣屽績娉曞湪绔炴妧绫诲湴鍥句笅浣跨敤鍥㈤槦鐩戞帶 +* [鍥㈤槦闈㈡澘] 鎸夎姹傜姝㈡棤鐣屽績娉曞湪绔炴妧绫诲湴鍥句笅浣跨敤姘斿姴鐩戞帶妯″潡 + +## 鑼椾紛鎻掍欢闆 v22.0.2 + +* [鑱婂ぉ璁板綍] 淇鍒濆鍖栧彲鑳戒細鎶ラ敊鐨勯棶棰 +* [鎴樻枟缁熻] 灏嗕緺瀹㈡暟鎹粠鐜╁缁熻涓垎绂诲紑 + +## 鑼椾紛鎻掍欢闆 v22.0.1 + +* [璁剧疆鐣岄潰] 寰皟浼樺寲璁剧疆鐣岄潰缁勪欢澶у皬浣嶇疆鏁板 + +## 鑼椾紛鎻掍欢闆 v22.0.0 + +* [鍩虹搴揮 淇鎸夐挳缁勪欢鑷姩瀹藉害涓㈠け閮ㄥ垎鏂囧瓧鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v21.0.7 + +* [鑱婂ぉ鍔╂墜] 闂ㄦ淳鏌撹壊缁熻鏍囬澧炲姞鏈嶅姟鍣ㄥ悕绉版樉绀 + +## 鑼椾紛鎻掍欢闆 v21.0.6 + +* [鑱婂ぉ鍔╂墜] 淇闂ㄦ淳鏌撹壊缁熻鎸夐挳鏍峰紡 + +## 鑼椾紛鎻掍欢闆 v21.0.5 + +* [鑱婂ぉ鍔╂墜] 淇鏃х増鑱婂ぉ鏌撹壊鏁版嵁杞崲鍚庡府浼氬悕涔辩爜鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v21.0.4 + +* [鑱婂ぉ璁板綍] 鐣岄潰鏀寔鎷栨嫿绐楀彛澶у皬 +* [鑱婂ぉ璁板綍] 鏀寔鑷畾涔夐閬 +* [鑳屽寘鍔╂墜] 纭妗嗗湪鐣岄潰鍏抽棴鍚庤嚜鍔ㄩ殣钘 +* [鑳屽寘鍔╂墜] 淇浠撳簱鍫嗗彔闄愭椂鐗╁搧鍒ゅ畾闂 + +## 鑼椾紛鎻掍欢闆 v21.0.3 + +* [鍥㈤槦鍛婄ず] 淇鎴块棿鍛婄ず鐣岄潰涓嬫柟瀛樺湪蹇嵎鍔熻兘鎸夐挳鍏ュ彛鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v21.0.2 + +* [鍩虹搴揮 淇鑾峰彇濂藉弸淇℃伅鏃跺彲鑳借幏鍙栧け璐ョ殑闂 +* [鑳屽寘鍔╂墜] 淇鍫嗗彔閬囧埌闄愭椂鐗╁搧鍙兘浼氬崱浣忕殑闂 +* [鑳屽寘鍔╂墜] 淇闄愭椂浜ゆ槗鐗╁搧瀵艰嚧鑳屽寘鍫嗗彔鍗′綇鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦鍛婄ず鍏ュ彛閲嶅鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 淇瑙掕壊鍦ㄥ洟闃熶腑涓婄嚎鏃跺洟闃熷憡绀轰細鎵撳紑鑱婂ぉ閿佺晫闈㈢殑闂 + +## 鑼椾紛鎻掍欢闆 v21.0.1 + +* [鍩虹搴揮 淇鐗堟湰鍙峰尮閰嶉棶棰 + +## 鑼椾紛鎻掍欢闆 v21.0.0 + +* [鍩虹搴揮 姊崇悊濂藉弸鍒楄〃鐩稿叧鎺ュ彛鍑芥暟淇鍔熻兘闂 +* [甯哥敤宸ュ叿] 淇鍓戜緺鎯呯紭澶村儚绛夊熀纭淇℃伅鏄剧ず闂 +* [甯哥敤宸ュ叿] 淇鍓戜緺鎯呯紭缁戝畾鐗╁搧鏃犳硶鎿嶄綔鐨勯棶棰 +* [甯哥敤宸ュ叿] 瀹屽杽鍓戜緺鎯呯紭鍦ㄨ法鏈嶄笅缁戝畾鏌ョ湅鐨勯昏緫 +* [甯哥敤宸ュ叿] 淇鍔ㄦ佺墿鍝佹爮鎿嶄綔鍑芥暟閫昏緫鎶ラ敊鐨勯棶棰 +* [甯哥敤宸ュ叿] 鍔ㄦ佺墿鍝佹爮鏀寔鏀惧叆鐜╁叿 *(remake)* +* [鍥㈤槦宸ュ叿] 鍥㈤槦鍛婄ず澧炲姞鎺ュ叆瀹樻柟鍔熻兘鐨勯昏緫 +* [鑳屽寘鍔╂墜] 淇甯細浠撳簱鏁寸悊浜屾纭璁剧疆鏃犳晥鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鎸佺画鎷惧彇宸茶秴杩囨惡甯︽暟閲忎笂闄愮墿鍝佺殑闂 + +## 鑼椾紛鎻掍欢闆 v20.0.0 + +* [鍥㈤槦鐩戞帶] 鍦板浘绫诲瀷澧炲姞闃佃惀鍦板浘绫诲瀷 +* [鐩爣鐩戞帶] 鍦板浘绫诲瀷澧炲姞闃佃惀鍦板浘绫诲瀷 +* [鑱婂ぉ杩囨护] 澧炲姞杩囨护鎸囧畾甯細鎴愬憳娑堟伅鐨勫姛鑳 +* [鑳屽寘鍔╂墜] 浼樺寲鑳屽寘鏁寸悊浠g爜閫昏緫 +* [鑳屽寘鍔╂墜] 瀹屽杽鑳屽寘甯冨眬瀵煎叆瀵煎嚭鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v19.0.7 + +* [鍓戜緺鎯呯紭] 淇鎯呯紭涓婄嚎鎻愮ず鍦ㄨ法鏈嶅ソ鍙嬩笅鏄剧ず閿欒鐨勯棶棰 *(remake)* +* [鑱婂ぉ鐩戞帶] 淇绯荤粺棰戦亾涓嶅湪棰戦亾璁剧疆閲岀殑闂 +* [鑱婂ぉ璁板綍] 淇浜ゆ槗娴佹按涓嶆樉绀洪儴鍒嗚褰曠殑闂 +* [鑱婂ぉ杩囨护] 淇绯荤粺棰戦亾涓嶅湪棰戦亾璁剧疆閲岀殑闂 +* [鑳屽寘鍔╂墜] 淇甯細浠撳簱鎼滅储鏄剧ず浣嶇疆闂 +* [鑳屽寘鍔╂墜] 澧炲姞鑳屽寘浠撳簱鏁寸悊涓庡爢鍙犱簩娆$‘璁ら夐」 +* [鑳屽寘鍔╂墜] 澧炲姞閿佸畾鐗╁搧鏍煎瓙璺宠繃鏁寸悊鍫嗗彔鐨勫姛鑳 + +## 鑼椾紛鎻掍欢闆 v19.0.6 + +* [鑱婂ぉ鍔╂墜] 蹇熷垏鎹㈤閬撳鍔犳埧闂撮閬 *(remake)* +* [鑱婂ぉ璁板綍] 鑱婂ぉ璁板綍澧炲姞鎴块棿棰戦亾 *(remake)* +* [鐒︾偣鍒楄〃] 淇鐣岄潰閿欒鏄剧ず鍒犻櫎濂藉弸鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鐣岄潰閿欒鏄剧ず鍒犻櫎濂藉弸鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v19.0.5 + +* [閲戝洟鎷惧彇] 淇鍒嗛厤鑰呮ā寮忎笅涓嶈兘鎻掕澶囩殑闂 *(remake)* +* [鍥㈤槦宸ュ叿] 淇鍙抽敭鏌ョ湅濂囩┐涓嶆樉绀虹殑闂 *(remake)* +* [鍥㈤槦闈㈡澘] 淇鍙抽敭鏌ョ湅濂囩┐涓嶆樉绀虹殑闂 *(remake)* +* [甯哥敤宸ュ叿] 鍘嗗彶鎷涘紡鍒楄〃澧炲姞浜戝垁鏅氭敾鍑诲睆钄 + +## 鑼椾紛鎻掍欢闆 v19.0.4 + +* [閲戝洟鎷惧彇] 淇閲嶅埗鐗堟柊鐗堟帀钀芥嬀鍙栨帴鍙f敼鍔ㄥ吋瀹 *(remake)* +* [鍥㈤槦闈㈡澘] 閫傞厤鏂扮増瑙掕壊鍙抽敭鏌ョ湅濂囩┐閫昏緫 *(remake)* +* [甯哥敤宸ュ叿] 淇鏀圭増鍚庝粨搴撳姪鎵嬫墍鍦ㄤ綅缃伄鎸$晫闈㈢殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v19.0.3 + +* [甯哥敤宸ュ叿] 绉婚櫎澶ф垬鎻愮ず鍔熻兘 *(remake)* +* [瑙掕壊缁熻] 鏇存柊鑼堕缁熻淇℃伅 + +## 鑼椾紛鎻掍欢闆 v19.0.2 + +* [鍥㈤槦闈㈡澘] 浼樺寲闈㈡澘璺熼殢瀹樻柟鍒囨崲鏉¢昏緫 *(remake)* +* [閲戝洟鎷惧彇] 缁濆鎴樺満涓皢鑷姩绉婚櫎涓嶅彲浜や簰鐨勬帀钀界晫闈㈡樉绀 + +## 鑼椾紛鎻掍欢闆 v19.0.1 + +* [鎴樻枟缁熻] 淇鎻掍欢鍔犺浇涓嶅畬鍏ㄧ殑鎯呭喌涓嬫棤娉曟墦寮澶村儚鍙抽敭鑿滃崟鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇鐣岄潰娌℃湁璺熼殢鍥㈤槦灏忛槦鍒囨崲鐣岄潰浣嶇疆鐨勯棶棰 *(remake)* +* [閲戝洟鎷惧彇] 淇鍦ㄧ粷澧冩垬鍦轰腑涓嶆樉绀轰笉鍙氦浜掔殑鎺夎惤娌℃湁鐢熸晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v19.0.0 + +* [鍥㈤槦闈㈡澘] 澧炲姞鏂扮増鍥㈤槦/鎴块棿鍒囨崲鏉″吋瀹 +* [甯哥敤宸ュ叿] 淇鐮哥綈瀛愬仠姝㈠悗閿欒鎻愮ず鍏戞崲娓呴浂鎻愮ず璇 +* [鎴樻枟鏃ュ織] 淇鐜╁鏃ュ織鏂囦欢鍋跺皵淇濆瓨澶辫触鐨勯棶棰 +* [鎴樻枟鏃ュ織] 淇鑾峰彇鏈┛瑁呭闃熷弸淇℃伅瀵艰嚧椤垮崱鐨勯棶棰 +* [鎴樻枟缁熻] 浣跨敤鎴樻枟浜嬩欢璁板綍鏇挎崲鎴樻枟澶嶇洏 +* [鎴樻枟缁熻] 鐣岄潰涓嶅啀鏄剧ず鐜╁鍚嶇О鍚庣紑 +* [鐩爣鐩戞帶] 鍦板浘鍒嗙被澧炲姞甯細棰嗗湴 +* [鑱婂ぉ杩囨护] 鍥㈤槦鎷涘嫙杩囨护鍏佽杩囨护鍙戝竷鑰呭悕绉 +* [閲戝洟鎷惧彇] 鍦ㄧ粷澧冩垬鍦轰腑涓嶅啀鏄剧ず涓嶅彲浜や簰鐨勬帀钀 + +## 鑼椾紛鎻掍欢闆 v19.0.0-alpha.0 + +* [鍩虹搴揮 鍏煎鏂扮増濂藉弸璺ㄦ湇鐩稿叧閫昏緫 *(remake)* + +## 鑼椾紛鎻掍欢闆 v18.1.3 + +* [鐩爣鐩戞帶] 淇钘忓墤鐩爣鐩戞帶涓嶆樉绀虹殑闂 +* [鐩爣鐩戞帶] 淇鐩爣NPC绫诲瀷鐩戞帶涓嶆樉绀虹殑闂 +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ澶嶅埗閬囧埌瓒呴暱鍐呭鍙兘鎶ラ敊鐨勯棶棰 +* [瑙掕壊缁熻] 淇浠诲姟缁熻鍒犻櫎鍒楀悗鏃犳硶娣诲姞鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v18.1.2 + +* [鐩爣鐩戞帶] 澧炲姞鐩爣蹇冩硶鍓嶇疆杩囨护閫昏緫浼樺寲鍚屾椂婵娲绘潯鐩暟閲 + +## 鑼椾紛鎻掍欢闆 v18.1.1 + +* [鐩爣鐩戞帶] 鏈澶ф暟閲忎笂闄愭敼涓 2000 鏉 +* [鐩爣鐩戞帶] 淇钃幈瀹氭尝鐮ユ緶鐘舵佷笉鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v18.1.0 + +* [鍥㈤槦宸ュ叿] 澧炲姞鍥㈤槦鍊掕鏃跺姛鑳 + +## 鑼椾紛鎻掍欢闆 v18.0.7 + +* [鍥㈤槦鐩戞帶] 淇瀵煎嚭鍗曡妯″紡鏂囦欢鏍煎紡闂 + +## 鑼椾紛鎻掍欢闆 v18.0.6 + +* [鐩爣鐩戞帶] 澧炲姞鐩戞帶鏉$洰鏁伴噺闄愬埗鏄剧ず瑙e喅鏁版嵁杩囧瀵艰嚧椤垮崱鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v18.0.5 + +* [鍩虹搴揮 浼樺寲鏁版嵁瀛樼洏鏁堢巼 + +## 鑼椾紛鎻掍欢闆 v18.0.4 + +* [浠诲姟缁熻] 淇鍒楄〃鍙抽敭鍒犻櫎鎶ラ敊鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 淇蹇冩硶鎬昏鐣岄潰瓒呭嚭鍖哄煙鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇瀹跺洯鍦板浘鍒ゅ畾澶辨晥鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇澶ф垬鎻愰啋鍦ㄩ儴鍒嗗ぇ鎴樼澧冧笅涓嶆樉绀虹殑闂 +* [鎴樻枟缁熻] 澧炲姞鏁板兼樉绀哄尯鍩熷搴﹂槻姝㈣秴鍑鸿寖鍥 +* [瑙掕壊缁熻] 鏇存柊鐑傛煰灞遍樀钀ユ棩甯镐换鍔 + +## 鑼椾紛鎻掍欢闆 v18.0.3 + +* [瑙掕壊缁熻] 浠诲姟缁熻鏇存柊鑼堕浠诲姟鏁版嵁 +* [瑙掕壊缁熻] 浠诲姟缁熻鏇存柊澶ф垬浠诲姟淇℃伅 +* [甯哥敤宸ュ叿] 澶ф垬鎻愰啋鏇存柊澶ф垬浠诲姟淇℃伅 + +## 鑼椾紛鎻掍欢闆 v18.0.2 + +* [澶撮《琛鏉 淇鎶ラ敊瀵艰嚧鏂囧瓧鍒锋柊鍗′綇鐨勯棶棰 +* [鑱婂ぉ灞忚斀] 澧炲姞鍥㈤槦鎷涘嫙鍏抽敭瀛楀睆钄界殑閫夐」 +* [鐩爣鐩戞帶] 淇绉樺鍦板浘鐢熸晥璁剧疆鎶ラ敊瀵艰嚧鐣岄潰涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v18.0.1 + +* [鍥㈤槦鐩戞帶] 淇鏀惰棌鏁版嵁鏃犳硶鍔犺浇鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇閮ㄥ垎瀹㈡埛绔暟鎹棤娉曚笅杞借闃呯殑闂 +* [鐒︾偣鍒楄〃] 淇鍦ㄧ澧冧腑鏄剧ず濂藉弸鐨勯棶棰 +* [鐩爣鐩戞帶] 鍥炬爣閫夋嫨鍣ㄩ粯璁ゆ樉绀哄綋鍓嶅凡閫夊浘鏍 +* [绀句氦鍔╂墜] 淇鍚屼箻鍔╂墜涓澶勭炕璇戠己澶遍棶棰 + +## 鑼椾紛鎻掍欢闆 v18.0.0 + +* [鍥㈤槦鐩戞帶] 淇璁㈤槄鐣岄潰椤电爜鏄剧ず閿欒鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇閮ㄥ垎鏁版嵁涓嬭浇鎻愮ず瑙g爜澶辫触鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 鎸夎姹備慨澶嶅悕鍓戝ぇ浼氬彲浠ヤ娇鐢ㄩ儴鍒嗗姛鑳界殑闂 +* [鐩爣鐩戞帶] 淇璁㈤槄鐣岄潰椤电爜鏄剧ず閿欒鐨勯棶棰 +* [鐩爣鐩戞帶] 澧炲姞鏁版嵁闆嗕粎鍦ㄦ寚瀹氬湴鍥惧惎鐢ㄧ殑閫夐」 +* [鐩爣鐩戞帶] 澧炲姞鐩戞帶椤瑰彸閿揩閫熺Щ鍔ㄥ埌椤堕儴搴曢儴鐨勯夐」 +* [鐩爣鐩戞帶] 瀹屽杽灞傛暟鍒ゅ畾姣旇緝绗﹂昏緫 +* [鐩爣鐩戞帶] 榛樿璁剧疆涓嶅啀鍕鹃夊叏瑙掕壊鍏辩敤閫夐」 + +## 鑼椾紛鎻掍欢闆 v17.0.7 + +* [鍩虹搴揮 澧炲姞涓囩伒蹇冩硶缂╁啓 +* [鐣岄潰搴揮 淇鐣岄潰鎷栨嫿鍙兘浼氬崱鍦ㄩ紶鏍囦笂鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇涓嬫媺鑿滃崟鐐瑰嚮鍚庤彍鍗曚笉娑堝け鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇鎷栨嫿鎺掑簭鏃舵嫋鍒版妧鑳芥爮鏉惧紑鍥炬爣瀵艰嚧鐣岄潰鍗′綇鐨勯棶棰 +* [鐩爣鐩戞帶] 浼樺寲鏁版嵁闆嗙増鏈彿涓庝綔鑰呭悕鐣岄潰鎺掑垪浣嶇疆 *(remake)* +* [鐩爣鐩戞帶] 淇鎷栨嫿鎺掑簭鏃舵嫋鍒版妧鑳芥爮鏉惧紑鍥炬爣瀵艰嚧鐣岄潰鍗′綇鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鎷涘紡鍥炬爣鏄剧ず寮傚父鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鏁版嵁闆嗛娇杞笅鎷夎彍鍗曠偣鍑诲悗鑿滃崟涓嶆秷澶辩殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鏂板鐩戞帶椤瑰嚭鐜板湪鍊掓暟绗簩涓綅缃殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鏃犳硶閫夋嫨浣跨敤13鍙峰浘鏍囩殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鑾峰彇鏍囪鍙兘浼氭姤閿欑殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞澶囨敞鍐呭棰勮鍖哄煙瀹藉害渚夸簬鏄剧ず鏇村鍐呭 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞娓呯┖鍏ㄩ儴鏁版嵁鐨勯夐」 *(remake)* +* [鐩爣鐩戞帶] 瀵煎叆鐣岄潰鍏佽鍕鹃夊鍏ラ儴鍒嗘暟鎹潯鐩 *(remake)* +* [鐩爣鐩戞帶] 鏃х増鏁版嵁鍏煎浼樺寲鍐呭涓庨鑹茬殑鑾峰彇鏂瑰紡 *(remake)* +* [鐩爣鐩戞帶] 鏃х増鏁版嵁鍏煎浼樺寲鍥炬爣鐨勮幏鍙栨柟寮 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞鐩爣鐩戞帶瀛愭彃浠 *(classic)* + +## 鑼椾紛鎻掍欢闆 v17.0.6 + +* [鐩爣鐩戞帶] 澧炲姞瀵煎叆鏃х増鏁版嵁鎸夐挳 *(remake)* +* [鐩爣鐩戞帶] 淇鎼滅储缁撴灉閿欒鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鍘嗗彶鏁版嵁灞傛暟涓虹┖鏃舵棤娉曞吋瀹圭殑闂 *(remake)* +* [鐩爣鐩戞帶] 鐩戞帶鏉$洰璁剧疆椤瑰鍔犲彸閿彃鍏ユ柟寮忔柊寤烘暟鎹」 *(remake)* + +## 鑼椾紛鎻掍欢闆 v17.0.5 + +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶鍘嗗彶鏁版嵁鐩爣蹇冩硶鍒ゆ柇鍏煎闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v17.0.4 + +* [甯哥敤宸ュ叿] 閲嶅埗鐗堜笉鍐嶉渶瑕佹彁渚涢槻姝㈤粦绁炶鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 鎭㈠鐩爣鐩戞帶榛樿鏂囧瓧棰滆壊涓洪粍鑹 *(remake)* +* [鐩爣鐩戞帶] 淇鍙樉绀鸿嚜宸辩殑鐩戞帶璁剧疆鍒ゅ畾闂 *(remake)* +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶椤圭晫闈㈠叧闂椂鎶ラ敊鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇瀹屽杽鐩爣鐩戞帶鍚岀粍鍙樉绀轰竴涓殑閫昏緫 *(remake)* +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶蹇嵎閿洿鏂板嚱鏁版姤閿欑殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶涓嶆樉绀哄悕绉伴夐」鏃犳晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 鐩爣鐩戞帶鍥炬爣涓洪粯璁ゅお鏋佸浘鏃朵紭鍏堟樉绀虹洃鎺у埌鐨勫浘鏍 *(remake)* +* [鐩爣鐩戞帶] 鐩爣鐩戞帶璁剧疆鐣岄潰鎻愮ず鍐呭棰滆壊璁剧疆椤瑰鍔犻粯璁ゅ兼覆鏌 *(remake)* +* [鍥㈤槦鐩戞帶] 璁剧疆闈㈡澘鎻愮ず璇綅缃Щ鍔ㄥ埌鍙冲乏鏄剧ず闃叉閬尅鐣岄潰 + +## 鑼椾紛鎻掍欢闆 v17.0.3 + +* [甯哥敤宸ュ叿] 淇姣忔杩囧浘閮戒細鏄剧ず瑙掕壊妯″瀷鐨勯棶棰 +* [鐩爣鐩戞帶] 鐩爣鐩戞帶澧炲姞姘斿姴灞傛暟闄愬埗閫夐」 + +## 鑼椾紛鎻掍欢闆 v17.0.2 + +* [甯哥敤宸ュ叿] 淇闅忚韩渚跨鍔犺浇澶辫触鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇棣栨鐧诲綍涓嶆樉绀 NPC 鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v17.0.1 + +* [鑱婂ぉ鍔╂墜] 淇澹版湜瓒呴摼鎺ヨ亰澶╁鍒舵覆鏌撶殑闂 *(remake)* +* [鑱婂ぉ鍔╂墜] 瀹屽杽鍚嶅墤澶т細銆佹垬鍦哄姪鎵嬭嚜鍔ㄦ樉绀烘ā鍨嬪姛鑳 *(classic)* + +## 鑼椾紛鎻掍欢闆 v17.0.0 + +* [鍩虹搴揮 闂ㄦ淳蹇冩硶鏋氫妇澧炲姞琛嶅ぉ銆佸垁瀹 +* [鎴樻枟鏃ュ織] 淇NPC淇℃伅鏃犳硶鑾峰彇鐨勯棶棰 +* [鐗╁搧鐧剧] 淇鏈澶у寲鍚庡叧闂獥鍙d笅娆℃墦寮绐椾綋灏哄寮傚父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v16.3.8 + +* [鑱婂ぉ鍔╂墜] 淇棰戦亾鍙戣█娆℃暟鏄剧ず鏁伴噺涓嶆纭殑闂 *(classic)* + +## 鑼椾紛鎻掍欢闆 v16.3.7 + +* [鑱婂ぉ鐩戞帶] 淇閮ㄥ垎鎻愮ず闊抽煶閲忚繃澶х殑闂 *(remake)* +* [鎴樻枟鏂囧瓧] 淇鎴樻枟鏂囧瓧鍙楀埌浼ゅ妯℃澘瀛楃涓茶鍙栭敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v16.3.6 + +* [鑱婂ぉ鍔╂墜] 淇鐗规畩鎯呭喌涓嬪嚭鐜颁贡鐮佺殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v16.3.5 + +* [鎴樻枟鏃ュ織] 淇鍚嶅墤澶т細涓嶅仠鎻愮ず瀵规柟灏氭湭鍔犲叆闂ㄦ淳鐨勬彁绀 *(classic)* +* [鍥㈤槦鐩戞帶] 鍏煎鏃楄埌鐗堥煶棰戞挱鏀 *(remake)* +* [甯哥敤宸ュ叿] 澧炲姞缁濆鎴樺満涓樉绀鸿鑹叉ā鍨嬬殑閫夐」 *(remake)* + +## 鑼椾紛鎻掍欢闆 v16.3.4 + +* [鐣岄潰搴揮 淇涓昏缃晫闈㈠閫夋瀹藉害鏄剧ず寮傚父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v16.3.3 + +* [鑱婂ぉ杈呭姪] 淇閬囧埌鐗规畩瀛楃鏃惰亰澶╂樉绀哄紓甯哥殑闂 + +## 鑼椾紛鎻掍欢闆 v16.3.2 + +* [鍩虹搴揮 澧炲姞涓囩伒闂ㄦ淳鐩稿叧淇℃伅 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鐗规晥鏄剧ず閿欎綅鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v16.3.1 + +* [鍥㈤槦鐩戞帶] 淇璁剧疆鐣岄潰椤规樉绀洪敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v16.3.0 + +* [鍥㈤槦鐩戞帶] 灞忚斀涓ぎ鏂囧瓧銆佹皵鍔插垪琛紝淇濈暀鏃堕棿杞存樉绀 *(classic)* + +## 鑼椾紛鎻掍欢闆 v16.2.1 + +* [鍥㈤槦鐩戞帶] 淇鏃犳硶鍚戦槦鍙嬪悓姝ユ暟鎹殑闂 + +## 鑼椾紛鎻掍欢闆 v16.2.0 + +* [鎴樻枟鏂囧瓧] 浼樺寲鍏崚琛¢壌鍦板浘涓垬鏂楁枃瀛楁樉绀 + +## 鑼椾紛鎻掍欢闆 v16.1.0 + +* [鎴樻枟鏂囧瓧] 淇鎴樻枟鏂囧瓧鏁伴噺杩囧瀵艰嚧鍒锋棩蹇楃殑闂 +* [鎴樻枟璁板綍] 淇澶т緺闃熷弸淇℃伅鑾峰彇寮傚父瀵艰嚧鍒锋棩蹇楃殑闂 + +## 鑼椾紛鎻掍欢闆 v16.0.0 + +* [甯哥敤宸ュ叿] 鐢变簬鎬ц兘闂闂ㄦ淳鑳介噺鏉′笉鍐嶅尯鍒嗚棌鍓戝弻蹇冩硶 *(remake)* +* [鐩爣鐩戞帶] 鐢变簬鎬ц兘闂姘斿姴鐩戞帶涓嶅啀鍖哄垎钘忓墤鍙屽績娉 *(remake)* +* [鍥㈤槦闈㈡澘] 鐢变簬鎬ц兘闂鍥㈤槦闈㈡澘鐩爣鐩戞帶涓嶅啀鍖哄垎钘忓墤鍙屽績娉 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.6.2 + +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦闈㈡澘姘斿姴鐩戞帶鏁版嵁鏄剧ず闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.6.1 + +* [鍥㈤槦鐩戞帶] 淇瀵煎叆鏁版嵁寮傚父鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.6.0 + +* [瑙掕壊缁熻] 绉婚櫎鏂扮増鏈棤娉曚娇鐢ㄧ殑瀹犵墿缁熻妯″潡 *(remake)* +* [瑙掕壊缁熻] 鎺ュ叆鏋奖鎻掍欢闆嗗疄鐜扮殑濂囬亣缁熻妯″潡 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.5.2 + +* [鍥㈤槦鐩戞帶] 淇姘旇鍐呭姏鏃堕棿杞磋В鏋愬け璐ョ殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.5.1 + +* [鍥㈤槦鐩戞帶] 涓存椂灞忚斀鑷畾涔夎闊冲寘鍔熻兘鐢ㄦ埛绔湶鍑 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.5.0 + +* [鍥㈤槦鐩戞帶] 璇煶鍖呬笅杞界晫闈㈠鍔犻瑙堣瘯鍚叆鍙f寜閽 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.4.0 + +* [鍥㈤槦鐩戞帶] 澧炲姞璇煶鎶ヨ鍔熻兘 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.3.0 + +* [瑙掕壊缁熻] 澧炲姞鍏崚琛¢壌濂栧姳缁熻椤 *(classic)* + +## 鑼椾紛鎻掍欢闆 v15.2.1 + +* [瑙掕壊缁熻] 淇濂囬亣瀹屾垚鐘舵佹樉绀哄紓甯哥殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鑷韩姘斿姴鍒楄〃澶у皬璁剧疆涓嶅疄鏃剁敓鏁堢殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.2.0 + +* [瑙掕壊缁熻] 澧炲姞鐧炬垬缁熻 *(remake)* +* [瑙掕壊缁熻] 鏇存柊鍥介檯鏈嶆暟鎹 *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.1.0 + +* [鐒︾偣鍒楄〃] 澧炲姞鐧炬垬鍦板浘鐩爣绮惧姏鑰愬姏鏄剧ず *(remake)* + +## 鑼椾紛鎻掍欢闆 v15.0.3 + +* [鍥㈤槦鐩戞帶] 浼樺寲鐧诲綍鍔犺浇鏃舵ц兘寮閿 *(remake)* +* [瑙掕壊缁熻] 鐔斿祵瀛旈暥宓屼俊鎭娇鐢ㄨ澶囨爮淇℃伅 +* [鑳屽寘缁熻] 鐔斿祵瀛旈暥宓屼俊鎭娇鐢ㄨ澶囨爮淇℃伅 +* [瑙掕壊缁熻] 绮剧偧绛夌骇浣跨敤瑁呭鏍忕簿鐐肩瓑绾 +* [鑳屽寘缁熻] 绮剧偧绛夌骇浣跨敤瑁呭鏍忕簿鐐肩瓑绾 + +## 鑼椾紛鎻掍欢闆 v15.0.2 + +* [鍦板浘鎼滅储] 淇瀛楃涓叉煡鎵炬帴鍙f洿鏂板鑷存悳绱㈢粨鏋滃け鏁堢殑闂 +* [鐣岄潰瀛椾綋] 淇瀛楃涓叉煡鎵炬帴鍙f洿鏂板鑷存棤娉曟樉绀哄瓧浣撳垪琛ㄩ夐」鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇瀛楃涓叉煡鎵炬帴鍙f洿鏂板鑷磋亰澶╃洃鎺т笉鑳藉疄鏃跺埛鏂扮殑闂 + +## 鑼椾紛鎻掍欢闆 v15.0.1 + +* [瑙掕壊缁熻] 淇瀹樻柟瀛楃涓叉煡鎵惧嚱鏁颁慨澶嶅弬鏁伴棶棰樺悗鎻掍欢閿欒璋冪敤瀵艰嚧鍔熻兘鏄剧ず寮傚父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v15.0.0 + +* [甯哥敤宸ュ叿] 瑙e喅鏌ョ湅瑁呭鐣岄潰鍔犺浇浼樺寲涓庡畼鏂瑰姞杞戒紭鍖栧啿绐佺殑闂 + +## 鑼椾紛鎻掍欢闆 v14.2.3 + +* [鍩虹搴揮 浜屾鍖呰瀛楃涓叉煡鎵惧嚱鏁帮紝闃叉瀹樻柟鍑芥暟寮傚父瀵艰嚧鍔熻兘鍑虹幇闂 +* [鍩虹搴揮 澧炲姞瀹樻柟瀛楃涓叉煡鎵惧嚱鏁板紓甯告椂鑷姩浜屾鍥炶惤鍒板叾瀹冨瓧绗︿覆鏌ユ壘鍑芥暟鐨勯昏緫 +* [瑙掕壊缁熻] 鏇挎崲鑳屽寘缁熻鍏ュ彛鍥炬爣璧勬簮 +* [瑙掕壊缁熻] 淇敼濂囬亣缁熻鍏ュ彛涓哄疇鐗╁浘鏍 *(remake)* + +## 鑼椾紛鎻掍欢闆 v14.2.2 + +* [鎴樻枟鏃ュ織] 淇鑾峰彇瑙掕壊淇℃伅棰戞闄愬埗闂 + +## 鑼椾紛鎻掍欢闆 v14.2.1 + +* [闂ㄦ淳鐗硅壊] 淇閰嶇疆鐣岄潰鎶ラ敊鐨勯棶棰 +* [瑙掕壊缁熻] 淇閰嶇疆瀵煎嚭鏄剧ず闂 +* [甯哥敤宸ュ叿] 淇鎯呯紭涓婄嚎鎻愮ず鏂囧瓧棰滆壊閿欒鐨勯棶棰 *(remake)* +* [鎴樻枟鏂囧瓧] 澧炲姞鍚屽睆鍐掕鏄剧ず鏁伴噺闄愬埗 +* [鎴樻枟鏃ュ織] 淇璁剧疆椤规樉绀轰笉姝e父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v14.2.0 + +* [鍩虹搴揮 鏇存柊澶ф垬淇℃伅 +* [闂ㄦ淳鐗硅壊] 榛樿绂佺敤浜旀瘨瀹犵墿娑堝け鎻愰啋 +* [瑙掕壊缁熻] 瀹犵墿鏁版嵁澧炲姞宀佸瞾銆佸啣鍐ャ佺储绱 *(remake)* +* [鎴樻枟鏂囧瓧] 淇鎴樻枟鏂囧瓧閰嶇疆椤归鑹茶缃棶棰 + +## 鑼椾紛鎻掍欢闆 v14.1.2 + +* [鎴樻枟鏃ュ織] 淇涓澶勫彲鑳藉鑷存姤閿欑殑閫昏緫鍒ゆ柇闂 + +## 鑼椾紛鎻掍欢闆 v14.1.1 + +* [鎴樻枟鏂囧瓧] 淇鍒濆鍖栧嚭閿欓棶棰 + +## 鑼椾紛鎻掍欢闆 v14.1.0 + +* [鍩虹搴揮 澧炲姞鍒瀹楅厤鑹蹭笌蹇冩硶鏄剧ず *(remake)* + +## 鑼椾紛鎻掍欢闆 v14.0.2 + +* [鍩虹搴揮 淇璺ㄦ湇鐘舵佷笅鍒濆鍖栧紓甯哥殑闂 +* [鎴樻枟鏂囧瓧] 澧炲姞绮剧涓庤愬姏绫诲瀷鏀寔 *(remake)* + +## 鑼椾紛鎻掍欢闆 v14.0.1 + +* [鍩虹搴揮 鏇存柊鏃ュ父浠诲姟鏁版嵁 +* [鍥㈤槦鐩戞帶] 淇姘旇鍐呭姏鍙樺寲鍊掕鏃朵笉鑳借Е鍙戠殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇杩涘叆鎴樻枟鍊掕鏃舵潯绂诲紑鎴樻枟鏃朵笉鑳借嚜鍔ㄦ竻闄ょ殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v14.0.0 + +* [鍩虹搴揮 鏍囧噯鍖栬幏鍙栨牸寮忓寲鏃堕棿鐩稿叧鎺ュ彛閫昏緫 +* [鍥㈤槦鐩戞帶] 淇姘旀捣鍐呭姏鍊掕鏃剁紪杈戞閿欒鎻愮ず閫昏緫闂 *(remake)* +* [鍥㈤槦闈㈡澘] 淇鑾峰彇鍥㈤槦鐩戞帶鈥滃洟闃熼潰鏉挎潯浠剁洃鎺р濅紭鍏堢骇娆″簭鍙嶈浆鐨勯棶棰 +* [瑙掕壊缁熻] 淇瑙掕壊缁熻涓嶈兘閲嶇疆鍐峰嵈鐨勯昏緫闂 +* [鐩爣鐩戞帶] 鎸夊畼鏂硅姹傜洰鏍囩洃鎺ч檷浣庡埛鏂伴鐜囦负姣忎袱甯т竴娆 *(remake)* + +## 鑼椾紛鎻掍欢闆 v13.0.2 + +* [鍩虹搴揮 淇娴姩鍏ュ彛涓庨氱煡涓績鍒濆鍖栭棶棰 +* [鍩虹搴揮 淇瑙掕壊閰嶇疆鏂规鏃犳硶鏂板鐨勯棶棰 +* [鍩虹搴揮 淇宸ュ叿搴撳鍏ㄥ眬鐨勬薄鏌撶殑闂 +* [鍩虹搴揮 淇娓告垙缁撴潫鏃舵敞鍐屽嚱鏁板彲鑳藉鑷村紓甯哥殑闂 +* [鎴樻枟缁熻] 淇鎴樻枟缁熻鍒濆鍖栨姤閿欓棶棰 +* [瑙掕壊缁熻] 淇濂囬亣缁熻娆℃暟涓嶈兘瀛樼洏鐨勯棶棰 +* [瑙掕壊缁熻] 淇瀹犵墿瀹惧瀵硅瘽璁℃暟鍣ㄤ笉鏇存柊鐨勯棶棰 *(remake)* +* [甯哥敤宸ュ叿] 淇鍔ㄦ佺墿鍝佹爮鍒濆鍖栭棶棰 +* [甯哥敤宸ュ叿] 淇瑙掕壊楂樹寒閫鍑烘椂鍙兘鎶涘嚭寮傚父鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鐩戞帶鏍囪鐩爣鍦ㄦ煇浜涚壒娈婃儏鍐典笅涓嶇敓鏁堢殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v13.0.1 + +* [鎴樻枟缁熻] 淇鎴樻枟缁熻閰嶈壊閿欒繃鍒濆鍖栫殑闂 + +## 鑼椾紛鎻掍欢闆 v13.0.0 + +* [鍩虹搴揮 浣跨敤鏂版帴鍙d紭鍖栨彃浠跺姞杞介熷害 +* [瑙掕壊缁熻] 淇濂囬亣缁熻涓嶄繚瀛樼殑闂 +* [瑙掕壊缁熻] 淇瑙掕壊缁熻涓嶄繚瀛樼殑闂 + +## 鑼椾紛鎻掍欢闆 v12.0.1 + +* [瑙掕壊缁熻] 淇绉樺缁熻鍏ュ彛鏄剧ず闂 +* [瑙掕壊缁熻] 淇绉樺缁熻鎮诞妗嗕笉鏄剧ず鍛ㄥ父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v12.0.0 + +* [鍩虹搴揮 浼樺寲瀛愭ā鍧楀垵濮嬪寲閫熷害 +* [鍥㈤槦鐩戞帶] 淇涓澶勭晫闈㈡姤閿欓棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鐩戞帶瑙﹀彂鍣ㄩ瑙堟樉绀洪棶棰 *(remake)* +* [甯哥敤宸ュ叿] 浼樺寲闄剁綈鍔╂墜鍒濆鍖栭熷害 +* [绯荤粺瀛椾綋] 淇瀛椾綋璁剧疆鏃犳硶璁剧疆瀹屽叏鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v11.0.3 + +* [鍥㈤槦闈㈡澘] 淇杩愬姛鐘舵佹樉绀哄紓甯哥殑闂 + +## 鑼椾紛鎻掍欢闆 v11.0.2 + +* [鍥㈤槦闈㈡澘] 淇鐣岄潰鍒锋柊寮傚父鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v11.0.1 + +* [瑙掕壊缁熻] 鍒犻櫎鐩戞湰鍗版枃銆佸悕鍓戝竵銆佹睙婀栬础鐚肩粺璁 *(remake)* + +## 鑼椾紛鎻掍欢闆 v11.0.0 + +* [鍩虹搴揮 淇鍥炬爣閫夋嫨鍣ㄦ棤娉曟樉绀哄簭鍙疯秴杩 10000 鐨勫浘鏍囩殑闂 +* [鍩虹搴揮 鑾峰彇瑙掕壊瑁呭銆佸績娉曘佸绌存暟鎹敼涓哄紓姝ユā寮忎慨澶嶉】鍗¢棶棰 +* [鐣岄潰搴揮 澧炲姞琛ㄦ牸鍩虹缁勪欢 +* [鍥㈤槦闈㈡澘] 榛樿姣忕鍒锋柊娆℃暟闄嶄綆涓哄師鏉ョ殑 1/4 鍑忓皯寮閿 +* [澶撮《琛鏉 鍥犳ц兘鑰冭檻鎻掍欢涓嶅啀缁樺埗澶撮《锛屽畼鏂圭粺涓鎺ョ澶撮《琛鏉℃覆鏌 *(remake)* +* [鎴樻枟缁熻] 淇鑾峰彇鐜╁瑁呭鍙兘娆℃暟杩囧鐨勯棶棰 +* [娓告垙瀛椾綋] 澧炲姞瑙掕壊澶撮《瀛椾綋璁剧疆 +* [鐩爣鐩戞帶] 淇鍊掕鏃舵潯鏃堕棿灏忔暟鐐逛笉鏄剧ず鐨勯棶棰 *(remake)* +* [鑱婂ぉ鍔╂墜] 浣跨敤鏂扮殑娑堟伅鑾峰彇鎺ュ彛瀹炵幇鑱婂ぉ澶嶅埗鍔熻兘 +* [瑙掕壊缁熻] 浣跨敤琛ㄦ牸缁勪欢閲嶆瀯 +* [瑙掕壊缁熻] 姊崇悊鍒濆鍖栭昏緫鍑忓皯鍗¢】 +* [瑙掕壊缁熻] 琛ㄦ牸鍒楁敮鎸佹嫋鎷芥帓搴忥紝浼樺寲鎿嶄綔浣撻獙 +* [瑙掕壊缁熻] 琛ㄦ牸鍒楁敮鎸佹棤闄愭按骞虫粴鍔紝涓嶅啀闄愬埗灞曠ず鍒楁暟閲 +* [瑙掕壊缁熻] 瑙掕壊鍚嶇О鍒楁敮鎸侀潬宸﹀浐瀹氬垪灞曠ず + +## 鑼椾紛鎻掍欢闆 v10.0.2 + +* [鍩虹搴揮 淇鑾峰彇鍥剧墖鍦板潃鍙兘鎶ラ敊鐨勯棶棰 +* [鍩虹搴揮 淇鑾峰彇绛夌骇涓嶅悓鐨勬嫑寮忓悕绉伴敊璇繑鍥炵浉鍚屽唴瀹圭殑闂 +* [鍩虹搴揮 寮瑰嚭鑿滃崟澧炲姞鎵撳紑鍏抽棴鏁堟灉闊 +* [鍥㈤槦鐩戞帶] 淇鍙互鏍囪绂佹鐒︾偣 NPC 鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 鍊掕鏃惰缃寜浣 CTRL 鍙樉绀哄敮涓鏍囪瘑绗︽柟渚跨紪杈 *(remake)* +* [澶撮《琛鏉 淇鍑虹幇閿欒鐨勮皟璇曡緭鍑虹殑闂 *(remake)* +* [鐩爣鐩戞帶] 浣跨敤鍥㈤槦鐩戞帶鍊掕鏃舵潯椋庢牸浼樺寲鏄剧ず鏁堟灉 *(remake)* + +## 鑼椾紛鎻掍欢闆 v10.0.1 + +* [澶撮《琛鏉 淇琛鏉¢鑹插紓甯哥殑闂 *(remake)* +* [瑙掕壊缁熻] 鏇存柊瀹犵墿闆椋熴佸畨瀹夈佽繜杩熸暟鎹 *(remake)* + +## 鑼椾紛鎻掍欢闆 v10.0.0 + +* [閫氱敤] 浼樺寲鍏ㄥ眬鏁版嵁鍒濆鍖栭昏緫 +* [鍥㈤槦闈㈡澘] 淇閫鍑烘垬鍦/鍚嶅墤澶т細鍚庢湁鍑犵巼鍑虹幇涓や釜鍥㈤槦闈㈡澘鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ澶嶅埗鏂囧瓧棰滆壊鍙兘閿欒鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 鑱婂ぉ澶嶅埗鍙抽敭蹇嵎澶嶅埗澧炲姞鍔熻兘寮鍏冲苟榛樿鍏抽棴 + +## 鑼椾紛鎻掍欢闆 v9.0.18 + +* [鍥㈤槦闈㈡澘] 淇鍒濆鍖栨姤閿欑殑闂 +* [鍥㈤槦鍛婄ず] 澧炲姞鏁忔劅瀛楀睆钄 +* [鍦板浘鎼滅储] 淇榧犳爣绉诲叆鎻愮ず妗嗗彲鑳芥姤閿欑殑闂 +* [闄剁綈鍔╂墜] 鐮稿畬涓娆″悗绛夊緟鍒嗘暟鍒锋柊闃叉澶氫綑浣跨敤閬撳叿 + +## 鑼椾紛鎻掍欢闆 v9.0.17 + +* [甯哥敤宸ュ叿] 鐩爣鐩戞帶鍙栨秷璧锋皵鍔插揩鎹烽敭鍏佽鍦ㄥ府浼氶鍦扮瓑闈炵珵鎶鍦板浘浣跨敤 + +## 鑼椾紛鎻掍欢闆 v9.0.16 + +* [鑱婂ぉ鍔╂墜] 淇鏃犳硶鑾峰彇鏈棩鍙戣█娆℃暟闄愬埗鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 澧炲姞 PARTY_RESET 浜嬩欢鐩戝惉鍒锋柊闈㈡澘 + +## 鑼椾紛鎻掍欢闆 v9.0.15 + +* [甯哥敤宸ュ叿] 淇鐐瑰悕璁板綍鍒板瘑鑱婂姛鑳介敊璇褰曞悓鍚嶆嫑寮忕殑闂 +* [鑳屽寘缁熻] 淇鑾峰彇鑳屽寘鐗╁搧鏁版嵁鍦ㄦ氮瀹㈣涓暟鎹敊璇殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v9.0.14 + +* [鍩虹搴揮 淇鑱婂ぉ閿佺姸鎬佸垽瀹氶敊璇鑷存姤閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v9.0.13 + +* [鍩虹搴揮 寰皟鑽畻闂ㄦ淳棰滆壊 + +## 鑼椾紛鎻掍欢闆 v9.0.12 + +* [鍩虹搴揮 鏇存柊鍖楀ぉ鑽畻鐩稿叧鏁版嵁 +* [鍩虹搴揮 淇闄愬埗鍦板浘涓棤娉曢夋嫨闃熷弸鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v9.0.11 + +* [鍥㈤槦鐩戞帶] 淇鍊掕鏃舵潯鍦ㄦ椂闀胯秴杩囦竴鍒嗛挓鏃舵椂闂存樉绀洪敊璇殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v9.0.10 + +* [鍩虹搴揮 淇鍔熻兘闄愬埗鍦板浘鍐呭彲浠ラ氳繃鑱婂ぉ鏍忓悕瀛楅夋嫨鐩爣鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v9.0.9 + +* [瑙掕壊缁熻] 淇绉樺缁熻鎺掑簭绠楁硶鍒濆鍖栨湁姒傜巼鍑洪敊瀵艰嚧涓嶆樉绀烘暟鎹棶棰 + +## 鑼椾紛鎻掍欢闆 v9.0.8 + +* [鍥㈤槦闈㈡澘] 淇涓嶅悓灞傛暟鐨勭浉鍚屾皵鍔叉樉绀哄紓甯哥殑闂 + +## 鑼椾紛鎻掍欢闆 v9.0.7 + +* [鍥㈤槦闈㈡澘] 淇姘斿姴璁剧疆瀛樺湪灞傛暟闄愬埗鏃舵姤閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v9.0.6 + +* [鍥㈤槦闈㈡澘] 姘斿姴鎺掑簭褰撲紭鍏堢骇涓鑷存椂鍏堣幏寰楃殑闈犲乏鏄剧ず +* [鍥㈤槦闈㈡澘] 淇姘斿姴鎺掑簭浼樺厛绾уけ鏁堢殑闂 +* [鍥㈤槦鐩戞帶] 淇璁剧疆鐣岄潰鍙兘鎶ラ敊鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v9.0.5 + +* [鎴樻枟鏂囧瓧] 淇鎴樻枟鏂囧瓧鍙兘棰滆壊鎶ラ敊鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇閲戝洟鎷惧彇鍙兘鎶ラ敊鐨勯棶棰 +* [閲戝洟璁板綍] 淇娆犲鸿褰曞寘鍚郴缁熼噾閽卞彉鍖栫殑闂 +* [閲戝洟璁板綍] 淇閲戝洟璁板綍鍦ㄤ氦鏄撹繃绋嬩腑鑾峰緱绯荤粺閲戦挶鏁伴浼氶敊璇绠楀埌鐜╁浜ゆ槗涓殑闂 +* [閲戝洟璁板綍] 淇閲戝洟璁板綍绯荤粺璁板綍鎶ラ敊闂 +* [閲戝洟璁板綍] 淇閲戦挶璁板綍鍠婅瘽鏈夋椂鍊欎細鍑虹幇0閲戝枈璇濈殑闂 + +## 鑼椾紛鎻掍欢闆 v9.0.4 + +* [鍥㈤槦鐩戞帶] 淇鍒囨崲鍦板浘鍚庡湴鍥鹃檺瀹氭暟鎹病鏈夊埛鏂扮殑闂 *(remake)* +* [澶撮《琛鏉 姘旇鏄剧ず澧炲姞浠呮樉绀烘弧琛鐩爣鐨勫姛鑳 *(remake)* +* [缁勯槦鍔╂墜] 鎷掔粷鏈弧绾ч敊璇嫆缁濆凡婊$骇瑙掕壊鐨勯棶棰 +* [閲戝洟璁板綍] 澧炲姞閲戝洟鎷惧彇寮鍏宠缃 +* [閲戝洟璁板綍] 寮鍚噾閽卞彉鍔ㄥ枈璇濆鍔犱粎褰撹嚜宸辨垨瀵规柟涓哄垎閰嶈呮椂閫夐」 + +## 鑼椾紛鎻掍欢闆 v9.0.3 + +* [鍥㈤槦闈㈡澘] 淇姘斿姴鍕捐竟鏄剧ず鍋跺皵寮傚父鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇鍊掕鏃舵潯澶氭樉绀轰竴绉掔殑闂 *(remake)* +* [閲囬泦鎷惧彇] 淇涓嶈兘鑷姩鎵撳紑鎺夎惤闂 +* [閲囬泦鎷惧彇] 淇閮ㄥ垎鐗╀欢灏忓湴鍥句綅缃笉鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v9.0.2 + +* [鍥㈤槦鍛婄ず] 浼樺寲搴曢儴鎸夐挳甯冨眬瀵归綈闂 +* [鍥㈤槦宸ュ叿] 淇闂ㄦ淳鐗规晥姝﹀櫒鍦ㄥ洟闃熸鍐典腑涓嶆樉绀虹殑闂 +* [瑙掕壊澶囨敞] 淇缂栬緫瑙掕壊澶囨敞鍚庤缃晫闈㈡病鏈夊埛鏂扮殑闂 +* [閲戝洟璁板綍] 淇鍙戝竷鎬绘媿鍥㈡眹鎬绘椂涓嶈兘鑷姩骞宠处鐨勯棶棰 +* [閲戝洟璁板綍] 淇鍚屾鏁版嵁鏃舵姤閿欑殑闂 +* [閲戝洟璁板綍] 淇鎷嶅崠缁撴灉鏄剧ず鐣岄潰鍔ㄧ敾涓嶆樉绀虹殑闂 +* [閲戝洟璁板綍] 鏃犳媿鍗栧垎閰嶆椂涓嶅啀鏄剧ず鍙戝竷宸ヨ祫鎸夐挳 + +## 鑼椾紛鎻掍欢闆 v9.0.1 + +* [閫氱敤] 姊崇悊瀛愭彃浠跺悕绉颁笌鎻忚堪鏂囨 +* [鍥㈤槦闈㈡澘] 淇姘斿姴鐩戞帶鍔熻兘灞忚斀闂 +* [鍥㈤槦闈㈡澘] 淇浜旀瘨閱夎垶鎻愮ず鍔熻兘灞忚斀闂 +* [甯哥敤宸ュ叿] 淇鍚嶅墤澶т細鍔╂墜鍔熻兘灞忚斀闂 + +## 鑼椾紛鎻掍欢闆 v9.0.0 + +* [澶撮《琛鏉 澧炲姞鍚勭被鏂囧瓧璺濈浠呭綋鍓嶇洰鏍囩殑閫夐」 *(remake)* +* [澶撮《琛鏉 澧炲姞鍚勯厤缃粎褰撳墠鐩爣鐨勯夐」 *(remake)* +* [澶撮《琛鏉 璺濈澧炲姞浠呮樉绀哄綋鍓嶇洰鏍囩殑閫夐」 *(remake)* +* [甯哥敤宸ュ叿] 浼樺寲鍔ㄦ佺墿鍝佹爮璁剧疆鐣岄潰 +* [甯哥敤宸ュ叿] 浼樺寲鍘嗗彶鎷涘紡鍒楄〃鏍煎瓙澶у皬 +* [甯哥敤宸ュ叿] 浼樺寲鐣岄潰浣嶇疆閿佸畾璁剧疆鎸夐挳浣嶇疆 +* [甯哥敤宸ュ叿] 浼樺寲鑷姩鍑哄敭璁剧疆鐣岄潰 +* [甯哥敤宸ュ叿] 鍘嗗彶鎷涘紡鍒楄〃澧炲姞鑳屾櫙鏍煎瓙 +* [鐒︾偣鍒楄〃] 淇鍙兘鎶ラ敊鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 鍚堝苟鑱婂ぉ鐩稿叧鍔熻兘鍒拌亰澶╁姪鎵嬩腑 +* [閲囬泦澶撮《] 淇鍕鹃夊叾瀹冪墿鍝佸悗璺爣绛夌墿浠朵篃浼氭樉绀虹殑闂 +* [閲囬泦鎷惧彇] 鎷惧彇鍔╂墜鍦板浘寮鍏虫敼涓哄嬀閫夊惎鐢ㄤ究浜庣悊瑙 +* [閲囬泦鎷惧彇] 姊崇悊澶撮《鐢熸椿鎶鑹哄垎绫 + +## 鑼椾紛鎻掍欢闆 v8.0.2 + +* [閲囬泦鍔╂墜] 淇鎵撴柇閲囬泦鍚庢病鏈夊皢鍏朵粠鏈杩戦噰闆嗕腑娓呴櫎鐨勯棶棰 +* [閲囬泦鎷惧彇] 淇涓嶅仠閲嶅鎵撳紑鍚屼竴鎺夎惤鐨勯棶棰 +* [閲囬泦鎷惧彇] 淇鎷惧彇鍙簴涓佺墿鍝佹帀钀芥椂瑙掕壊鍗″姩浣滅殑闂 +* [閲囬泦鎷惧彇] 淇鎷惧彇鎺夎惤鏃朵細灏嗗叾鍔犲叆鏈杩戦噰闆嗙墿鍝佺殑闂 +* [閲囬泦鎷惧彇] 淇鎷惧彇鏃堕敊璇彁绀鸿窛绂诲お杩滅殑闂 +* [閲囬泦鎷惧彇] 淇鏈杩戦噰闆嗘樉绀哄湪鎷惧彇鐗╁搧鍚庢秷澶辩殑闂 +* [閲囬泦鎷惧彇] 淇鏈杩戦噰闆嗙墿鍝佸寘鍚帀钀芥椂涓嶆樉绀哄ご椤剁殑闂 +* [閲囬泦鎷惧彇] 淇閲囬泦鐗╁搧娌℃湁鍦ㄩ噰闆嗗紑濮嬮噰闆嗘椂绔嬪嵆鏄剧ず澶撮《鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v8.0.1 + +* [閲囬泦鎷惧彇] 鎷惧彇鍔╂墜鎸夊搧绾ф嬀鍙栧鍔犳诲紑鍏 +* [閲囬泦鎷惧彇] 閲囬泦澶撮《杩涗竴姝ョ粏鍖栫墿鍝佸垎绫婚夐」 +* [鐩爣鐩戞帶] 淇缂栬緫鍒楄〃鏃犳硶姝e父灞曠ず鐨勯棶棰 *(remake)* +* [鍦板浘鎼滅储] 鍦板浘鏍囪鐐规诞绐楁枃瀛楀鍔犵閾槸鍚﹀凡璇绘樉绀 +* [閲囬泦鍔╂墜] 閲囬泦鐗╁搧澶撮《鏄剧ず澧炲姞纰戦摥鏄惁宸茶鏄剧ず +* [閲囬泦鍔╂墜] 淇閲囬泦鍔╂墜鏈杩戦噰闆嗙墿鍝侀夐」瀵艰嚧搴栦竵鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v8.0.0 + +* [鍩虹搴揮 璁剧疆鐢ㄦ埛鏁版嵁澧炲姞缂撳瓨瀵规瘮鍑忓皯鏃犳剰涔夌殑瀛樺偍璇锋眰 +* [璇█鏂囦欢] 缁熶竴瑙勮寖鍖栤滃悕鍓戝ぇ浼氣濇枃妗 +* [澶撮《琛鏉 琛ュ叏鑷姩闅愯棌鑱婂ぉ娉℃场鐨勬彁绀鸿 *(remake)* +* [鑱婂ぉ杩囨护] 淇缂栬緫棰戦亾鏃舵姤閿欏鑷存棤娉曚慨鏀硅缃」鐨勯棶棰 +* [甯哥敤宸ュ叿] 鎷嗗垎鍚嶅墤澶т細銆佹垬鍦鸿嚜鍔ㄥ彇娑堝睆钄借鑹叉ā鍨嬮夐」 + +## 鑼椾紛鎻掍欢闆 v7.0.2 + +* [鍥㈤槦宸ュ叿] 鍚屼箻鍔╂墜澧炲姞鑷姩閫氳繃闃熷弸鐨勯夐」 +* [澶撮《琛鏉 淇澶氬紑瀹㈡埛绔椂鏈澶у寲绐楀彛琛鏉″ぇ灏忓紓甯哥殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇闅愯棌璋冩伅瀹屾垚鎷涘紡鏃犳晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇闈炲厖鑳芥嫑寮忎篃鏄剧ず1灞傚厖鑳界殑闂 *(remake)* +* [閲囬泦鎷惧彇] 閲囬泦澶撮《澧炲姞缂╂斁涓庡瓧浣撹缃 +* [閲戝洟鎷惧彇] 淇闈㈡澘浣嶇疆涓鐩存仮澶嶉粯璁ょ殑闂 + +## 鑼椾紛鎻掍欢闆 v7.0.1 + +* [閲戝洟鎷惧彇] 淇敼鍒嗛〉鍚嶇О涓洪噰闆嗘嬀鍙 +* [鎴樻枟鏂囧瓧] 淇鎴樻枟娴姩鏂囧瓧鍕鹃夋湁鏁堝煎悗璐綋娌荤枟涓嶆樉绀虹殑闂 +* [鍥㈤槦闈㈡澘] 淇闈炶ˉ澶╄瘈蹇冩硶閱夎垶鑼冨洿涓嶆樉绀虹殑闂 +* [甯哥敤宸ュ叿] 淇鐐瑰悕鎻愰啋鍏抽棴娌℃湁绔嬪嵆鐢熸晥鐨勯棶棰 +* [甯哥敤宸ュ叿] 璋冩暣甯哥敤鍒嗙被鎻掍欢鎺掑垪椤哄簭涓庡浘鏍 +* [甯哥敤宸ュ叿] 淇椹吇鎻愰啋娌℃湁鍒ゆ柇鏄惁鏃犻┋鍏荤殑闂 +* [甯哥敤宸ュ叿] 椹吇鎻愰啋澧炲姞鍙敹鑾锋彁閱 +* [甯哥敤宸ュ叿] 淇閿佸畾闈㈡澘璁剧疆椤规棤娉曚繚瀛樼殑闂 +* [瑙掕壊缁熻] 鑳屽寘缁熻榛樿閫変腑褰撳墠瑙掕壊 +* [瑙掕壊缁熻] 淇鑳屽寘缁熻浠撳簱鐗╁搧鍙兘閲嶅鐨勯棶棰 +* [瑙掕壊缁熻] 淇鑳屽寘缁熻浠撳簱鏁伴噺鏄剧ず閿欒鐨勯棶棰 +* [瑙掕壊缁熻] 淇浠诲姟缁熻鍒濆鍖栨姤閿欓棶棰 +* [鐩爣鐩戞帶] 淇鍏呰兘瀹屾垚鍚庝笉鏄剧ず鍏呰兘灞傛暟鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v7.0.0 + +* [澶撮《琛鏉 淇鍏ㄥ眬缂╂斁鍙兘浼氭棤绔敼鍙樼殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇姝﹀鎷涘紡鐩戞帶鏄剧ず鐩爣鍚嶇О鏃犳晥鐨勯棶棰 *(remake)* +* [甯哥敤宸ュ叿] 淇闂ㄦ淳鐗硅壊閫夐」寮鍏虫枃瀛楅噸鍙犵殑闂 +* [鍦板浘鎼滅储] 淇鏃х増鏁版嵁杞崲缂撴參鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 淇鏃х増鏁版嵁杞崲缂撴參鐨勯棶棰 +* [鍦板浘鎼滅储] 淇鎻愮ず璇炕璇戦棶棰 + +## 鑼椾紛鎻掍欢闆 v6.0.0 + +* [瑙掕壊缁熻] 瑁呭缁熻澧炲姞璁板綍闈炲綋鍓嶈澶囧姛鑳 +* [瑙掕壊缁熻] 澧炲姞璐﹀彿绮惧姏涓庤鑹茬簿鍔涚粺璁 +* [瑙掕壊缁熻] 鑳屽寘缁熻浼樺寲 TIP 鏄剧ず涓庤澶囩簿鐐肩瓑绾ф樉绀 +* [瑙掕壊缁熻] 鑳屽寘缁熻澧炲姞闅愯棌韬笂瑁呭鐨勯夐」 +* [瑙掕壊缁熻] 鑳屽寘缁熻鏀寔鎸夊垎绫绘悳绱 +* [鑱婂ぉ璁板綍] 淇鏁版嵁涓婚敭鍙兘涓虹┖瀵艰嚧鎶ラ敊鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 淇鍒濆鍖栨姤閿欓棶棰 +* [澶撮《琛鏉 淇涓澶勬枃妗堢炕璇戦棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v5.1.4 + +* [澶撮《琛鏉 鍚勪笅鎷夐夐」澧炲姞绉樺涓殣钘忕殑閫夐」 *(remake)* +* [鑱婂ぉ鍔╂墜] 浼樺寲鏁版嵁瀛樺偍鏃舵満鍑忓皯娑堣 +* [瑙掕壊缁熻] 淇绉樺缁熻閿欒鏄剧ず闈炵粺璁$姸鎬佽繘搴︾澧冪殑闂 +* [瑙掕壊缁熻] 浼樺寲绉樺缁熻杩涘害鑾峰彇澶勭悊 +* [甯哥敤宸ュ叿] 淇娌℃湁椹吇鏃堕敊璇彁绀洪ゥ楗跨殑闂 +* [閲戝洟璁板綍] 淇閲戦涓嶈兘鍨傜洿灞呬腑鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v5.1.3 + +* [鍩虹搴揮 閫傞厤缂樿捣瀹㈡埛绔 *(classic)* + +## 鑼椾紛鎻掍欢闆 v212 + +* [甯哥敤宸ュ叿] 椹吇鍔╂墜鏀寔璁剧疆楗遍搴︿负绌烘椂鎻愰啋 +* [甯哥敤宸ュ叿] 椹吇鍔╂墜鍦ㄦ垬鏂椾腑涓嶅啀寮瑰嚭鎻愮ず +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦鍛婄ず鎷栧姩鍗¢】鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇鎸夎窛绂绘煋鑹查鑹叉棤娉曚繚瀛樼殑闂 +* [鐒︾偣鍒楄〃] 淇鐒︾偣鍒楄〃鎷栧姩鍗¢】鐨勯棶棰 +* [鑱婂ぉ鐩戞帶] 淇涓嬫媺妗嗕竴娆″彧鑳戒慨鏀逛竴涓厤缃」鐨勯棶棰 +* [澶撮《琛鏉 淇璁剧疆椤硅彍鍗曚竴娆″彧鑳戒慨鏀逛竴涓殑闂 *(remake)* +* [閲戝洟璁板綍] 淇缂栬緫琛ヨ创鏂规鏃犳硶淇濆瓨鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v211 + +* [鍩虹搴揮 淇瑙掕壊鐙珛璁剧疆澶辨晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v210 + +* [鍩虹搴揮 鏇挎崲搴曞眰瀛樺偍椹卞姩淇澶氬紑瀹㈡埛绔椂璁剧疆椤规棤娉曞姞杞芥棤娉曚慨鏀圭殑闂 +* [浠囨仺缁熻] 淇鐣岄潰鍒濆浣嶇疆璁剧疆閿欒鐨勯棶棰 +* [鍏ㄥ眬璁剧疆] 淇閲嶆柊杞藉叆娌℃湁鍒锋柊褰撳墠鐣岄潰鍕鹃夐」鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇鍔犺浇缃戠粶鏁版嵁鏃舵姤閿欑殑闂 *(remake)* +* [鍥㈤槦闈㈡澘] 淇鍔犺浇鏃х増鏁版嵁鍙兘鍑洪敊鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇鍥㈤槦姘斿姴璁剧疆鏃犳硶淇濆瓨鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇璺濈绛夌骇涓嶈兘鑷畾涔夌殑闂 +* [鑱婂ぉ鏌撹壊] 淇鏌撹壊杩囩▼鍙兘鎶ラ敊鐨勯棶棰 +* [瑙掕壊缁熻] 淇澶氬紑瀹㈡埛绔椂瑁呭缁熻鏃犳硶鏄剧ず鐨勯棶棰 +* [瑙掕壊缁熻] 淇鑳屽寘缁熻浠呮煡鐪嬫寚瀹氳鑹叉寜閽秷澶辩殑闂 +* [瑙掕壊缁熻] 鑳屽寘缁熻榛樿甯冨眬鏀逛负绱у噾妯″紡 + +## 鑼椾紛鎻掍欢闆 v209 + +* [鐣岄潰搴揮 淇涓嬫媺妗嗙粍浠舵枃瀛楁樉绀轰笉鍏ㄧ殑闂 +* [鐣岄潰搴揮 淇鑿滃崟鎻愮ず妗嗙Щ鍑哄悗娌℃湁鍙婃椂闅愯棌鐨勯棶棰 +* [鍏ㄥ眬璁剧疆] 浼樺寲瑙掕壊閰嶇疆鎸夐挳甯冨眬渚夸簬鐞嗚В +* [鍏ㄥ眬璁剧疆] 淇鍏辩敤璁剧疆椤瑰叏灞璁剧疆娌℃湁闅旂瀵艰嚧浜掔浉骞叉壈鐨勯棶棰 +* [鍏ㄥ眬璁剧疆] 澧炲姞瑙掕壊閰嶇疆鏂规鎻愮ず璇 +* [鍏ㄥ眬璁剧疆] 瑙掕壊鏁版嵁鏂规澧炲姞璁句负榛樿鏂规鐨勯夐」 +* [浠囨仺缁熻] 淇鍒囨崲鍏ㄥ眬棰勮鏂规鍚庢病鏈夊埛鏂扮晫闈㈡樉绀虹殑闂 +* [淇℃伅鏄剧ず] 浣跨敤鍩虹搴撶粺涓閰嶇疆瀛樺偍绠$悊鎺ュ彛閲嶆瀯璁剧疆瀛樺偍 +* [鍠婅瘽璋冧緝] 浠呭厑璁稿洟闃熶腑鐨勬寚瀹氶棬娲惧苟澧炲姞鍐峰嵈鏃堕棿 +* [鍥㈤槦闈㈡澘] 閰嶇疆瀛樺偍鏀逛负鍩虹搴撶粺涓绠$悊瑙e喅棰勮鏂规涔嬮棿浜掔浉骞叉壈鐨勯棶棰 +* [澶撮《琛鏉 淇鍦ㄥ垏鎹㈣鑹查璁炬柟妗堟椂涓嶈兘鍒锋柊鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 閰嶇疆瀛樺偍鏀逛负鍩虹搴撶粺涓绠$悊瑙e喅棰勮鏂规涔嬮棿浜掔浉骞叉壈鐨勯棶棰 *(remake)* +* [鎴樻枟缁熻] 淇鍒濆鍖栨姤閿欓棶棰 +* [鐒︾偣鍒楄〃] 淇鍒濆鍖栨姤閿欑殑闂 +* [鑱婂ぉ鍔╂墜] 淇浣跨敤棰勮閰嶇疆鍚庝粖鏃ユ暟閲忕粺璁¢敊璇殑闂 +* [鑱婂ぉ鍔╂墜] 淇浣跨敤棰勮閰嶇疆鍚庢渶杩戝瘑鑱婃暟鎹敊璇殑闂 +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ鐐瑰悕璁板綍鍒板瘑鑱婂姛鑳介棶棰 +* [瑁呭涓瑙圿 瀹屽杽骞跺悎骞跺埌瑙掕壊缁熻瀛愭彃浠朵腑 +* [瑙掕壊缁熻] 浠婃棩鏁板煎鍔犺鑹叉暟鎹爣璁 +* [瑙掕壊缁熻] 淇浣跨敤棰勮閰嶇疆鍚庝粖鏃ユ暟鍊煎彉鍖栨彁绀洪敊璇殑闂 +* [瑙掕壊缁熻] 淇娌℃湁鐩戝惉鏁版嵁棰勮鏂规鍙樺寲鐨勯棶棰 +* [瑙掕壊缁熻] 淇鑳屽寘缁熻娌℃湁缁熻韬笂瑁呭鐨勯棶棰 +* [瑙掕壊缁熻] 澧炲姞瑙掕壊瑁呭缁熻鍔熻兘 +* [瑙掕壊缁熻] 绉樺缁熻澧炲姞绉樺 CD 鏄剧ず +* [瑙掕壊缁熻] 绉樺杩涘害澧炲姞鏁版嵁鑾峰彇鏍囪浣嶈В鍐充繚瀛樺埌鏈悓姝ョ殑鑴忔暟鎹棶棰 + +## 鑼椾紛鎻掍欢闆 v208 + +* [鍩虹搴揮 淇杩涘埗杞崲鍑芥暟鍙兘鍗℃鐨勯棶棰 +* [鐣岄潰搴揮 淇鍔ㄦ佺獥鍙h繘鍏ヨ嚜瀹氫箟鐣岄潰鏃朵笉鑳芥嫋鍔ㄧ殑闂 +* [瑙掕壊缁熻] 绉樺缁熻澧炲姞鍒楀鑷姩骞冲潎甯冨眬鐨勫姛鑳介昏緫 + +## 鑼椾紛鎻掍欢闆 v207 + +* [鎴樻枟鏂囧瓧] 淇閲嶅鏄剧ず鐨勯棶棰 +* [瑙掕壊缁熻] 淇缁熻鍒楅厤缃繚瀛樺け璐ョ殑闂 +* [浠囨仺缁熻] 淇浠囨仺缁熻鐣岄潰鍒濆鍖栧け璐ョ殑闂 +* [甯哥敤宸ュ叿] 淇鑷姩鍞崠鏃犳硶绂佺敤鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇瑙掕壊棰勮鐣岄潰鏀惧ぇ鎸夐挳涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v206 + +* [鍩虹搴揮 淇璐﹀彿璁¤垂鍓╀綑涓嶆樉绀虹殑闂 +* [鍏ㄥ眬璁剧疆] 澧炲姞鏈湴鏁版嵁鍏辩敤棰勮鏂规鍔熻兘 +* [瑙掕壊缁熻] 淇绉樺缁熻杩涘害涓嶈兘鍙婃椂鍒锋柊鐨勯棶棰 +* [瑙掕壊缁熻] 淇敼绉樺杩涘害鍥炬爣澧炲姞鍖哄垎搴 +* [瑙掕壊缁熻] 鏇存柊閬楁紡鐨勮窡瀹犳暟鎹 +* [瑙掕壊缁熻] 淇娴绗哄綋鍓嶆暟鍊兼樉绀洪棶棰 +* [瑙掕壊缁熻] 淇娴绗哄懆涓婇檺鑾峰彇闂 +* [瑙掕壊缁熻] 淇鑼堕浠诲姟缁熻鏃犳硶浣跨敤鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鍦ㄦ媿鍥㈡ā寮忎笅闈炲垎閰嶈呬笉鑳介殣钘忓畼鏂圭晫闈㈢殑闂 +* [鑱婂ぉ鍔╂墜] 淇缁熶竴琛ㄦ儏灏哄鍦ㄧ獥鍙eぇ灏忓彉鍖栨椂缂╂斁澶辨晥鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 绂佺敤鑱婂ぉ琛屽鍒堕摼鎺ヤ腑閿偣鍑诲姛鑳 +* [淇℃伅鏄剧ず] 澧炲姞绌哄兼枃妗堝紑鍏冲厑璁搁殣钘忔棤鏁板兼椂鐨勬枃妗 + +## 鑼椾紛鎻掍欢闆 v205 + +* [甯哥敤宸ュ叿] 瀹屽杽婧呭皠鍔╂墜閫忔槑搴﹀拰棰滆壊璁剧疆 +* [鑱婂ぉ璁板綍] 淇璐﹀彿濂藉弸瀵嗚亰鑱婂ぉ鍐呭涓嶈兘璁板綍鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 淇鏌撹壊浼氬皢璐﹀彿濂藉弸澶勭悊涓烘湰鏈嶅悓鍚嶇帺瀹剁殑闂 + +## 鑼椾紛鎻掍欢闆 v204 + +* [鍥㈤槦鐩戞帶] 搴旇姹備笉鍐嶆樉绀烘柊鐗堟暟鎹彁绀烘 *(remake)* +* [鍥㈤槦鐩戞帶] 淇涓嬭浇鎸夐挳鏍峰紡涓嶆樉绀虹殑闂 *(remake)* +* [鍥㈤槦闈㈡澘] 淇婧呭皠鍔╂墜璺濈鍒ゅ畾闂 +* [甯哥敤宸ュ叿] 淇瀵嗕繚瑙i攣鎻愮ず鍙兘鎶ラ敊鐨勯棶棰 +* [澶撮《琛鏉 淇涓嶆樉绀虹帺瀹跺墽鎯呴閬撹亰澶╃殑闂 *(remake)* +* [澶撮《琛鏉 淇鏄剧ず鐗规畩NPC澶撮《姘旇鍊肩殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v203 + +* [娓告垙瀛椾綋] 淇鐗╁搧鍚嶇О鈥滄剶鐩稿啝鈥濇棤娉曟樉绀虹殑闂 +* [鍥㈤槦宸ュ叿] 淇涓澶勫洟闃熸暟鎹幏鍙栧彲鑳芥姤閿欑殑闂 +* [鍥㈤槦鐩戞帶] 淇敼鏁版嵁璁㈤槄鏇存柊鎻愮ず閫昏緫鍑忓皯鎻愮ず娆℃暟 *(remake)* + +## 鑼椾紛鎻掍欢闆 v202 + +* [鍩虹搴揮 鏇存柊娴琛屽湴鍥惧垪琛 +* [甯哥敤宸ュ叿] 淇娣诲姞濂藉弸鎻愮ず妗嗘寜閽敊浣嶉棶棰 +* [鍥㈤槦闈㈡澘] 淇閮ㄥ垎璁剧疆椤瑰閫夋鏈甯告樉绀虹殑闂 +* [澶撮《琛鏉 淇鐗规畩NPC琛鏉℃樉绀哄垽鏂敊璇殑闂 *(remake)* +* [鐒︾偣鍒楄〃] 淇鏂板彿鏃犳硶閫夋嫨涓嶄娇鐢ㄧ劍鐐瑰垪琛ㄧ殑闂 +* [鐒︾偣鍒楄〃] 淇鐒︾偣鍒楄〃浜や簰鐗╀欢鏈夋鐜囬敊璇樉绀鸿閲忕殑闂 +* [甯哥敤宸ュ叿] 淇璇曡。闂存寜閽け鏁堢殑闂 + +## 鑼椾紛鎻掍欢闆 v201 + +* [鍩虹搴揮 淇鑷姩瀹屾垚杈撳叆妗嗘嫾闊抽瀛楁瘝妫绱㈠け鏁堢殑闂 +* [鍥㈤槦鐩戞帶] 淇鍚屾鍥㈤槦鏁版嵁鍙兘鍚屾鍒版棫鏁版嵁鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 绉婚櫎涓嬭浇鏁版嵁鍚庣殑鍊掕鏃跺脊妗嗘彁绀 *(remake)* +* [鍥㈤槦宸ュ叿] 淇璁剧疆鐣岄潰甯冨眬閿欎綅鐨勯棶棰 +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ妗嗘暟閲忓浜庡崄涓椂鏃犳硶浣跨敤鑱婂ぉ鏍忔竻绌哄姛鑳界殑闂 +* [鑱婂ぉ杩囨护] 淇鑱婂ぉ杩囨护涓嶈兘灞忚斀琛ㄦ儏鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇琛嶅ぉ瀹楅缚钂欏ぉ绂佸悗浠嶇劧鍙互鏄剧ず濂藉弸楂樹寒鐨勯棶棰 +* [澶撮《琛鏉 搴斿畼鏂硅姹傚彇娑堝ご椤惰鏉$壒娈奛PC鏄剧ず鍔熻兘 *(remake)* + +## 鑼椾紛鎻掍欢闆 v200 + +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鐩戞帶鏁版嵁涓嬭浇鍒楄〃鏃犳硶鍔犺浇鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v199 + +* [鍘嗗彶鎷涘紡] 淇鍒楄〃鏄剧ず瀛愭嫑寮忕殑闂 +* [鑱婂ぉ鐩戞帶] 淇鏁版嵁杩囬暱鍚庤秴鍑哄睆骞曞鑷存棤娉曞垹闄ょ殑闂 + +## 鑼椾紛鎻掍欢闆 v198 + +* [鍩虹搴揮 淇鑱婂ぉ鍐呭瑙f瀽鍙兘瀵艰嚧鍑虹幇閿欒鎹㈣鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v197 + +* [鎴樻枟缁熻] 淇璺ㄦ湇鍚庤繃鍥惧彲鑳戒細鍗¢】鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v196 + +* [鍩虹搴揮 淇鑺变环鍒嗕韩閫昏緫闂 +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦宸ュ叿璁剧疆椤垫帓搴忛敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v195 + +* [鍩虹搴揮 淇鍒风郴缁熸棩蹇楃殑闂 + +## 鑼椾紛鎻掍欢闆 v194 + +* [閫氱敤鍔熻兘] 淇鍩虹搴撲笌瀛愬簱鐨勭炕璇戦棶棰 +* [甯哥敤宸ュ叿] 淇鑺变环鏌ヨ鏃犳暟鎹殑闂 + +## 鑼椾紛鎻掍欢闆 v193 + +* [甯哥敤宸ュ叿] 淇鍔熻兘灞忚斀鍦板浘涓粛鐒跺彲浠ヤ娇鐢ㄥソ鍙嬮珮浜姛鑳界殑闂 + +## 鑼椾紛鎻掍欢闆 v192 + +* [鐒︾偣鍒楄〃] 淇鍒风郴缁熸棩蹇楃殑闂 +* [鍥㈤槦鐩戞帶] 淇绯荤粺鐩戞帶闃熷弸鍚嶅瓧閫氶厤绗﹀尮閰嶅け鏁堢殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v191 + +* [鍩虹搴揮 淇鑺变环鏃犳硶鏄剧ず澶氭湇鍔″櫒涓嬪綋鍓嶈鑹叉墍鍦ㄦ湇鍔″櫒鍚嶇О鐨勯棶棰 +* [鍥㈤槦鐩戞帶] 淇绯荤粺娑堟伅鏁版嵁浼樺厛绾ч敊璇殑闂锛屽簲鎸夌収鍦板浘銆佸湴鍥剧粍銆侀氱敤椤哄簭鍖归厤鏁版嵁 *(remake)* + +## 鑼椾紛鎻掍欢闆 v190 + +* [鍩虹搴揮 淇鑺变环鍦ㄥ悎鏈嶄腑鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v189 + +* [鍩虹搴揮 淇閲嶈姘斿姴鍒楄〃鏃犳硶鏄剧ず闃熷弸姘旇閲忕殑闂 + +## 鑼椾紛鎻掍欢闆 v188 + +* [鍩虹搴揮 淇鎻掍欢閰嶇疆鏈夊嚑鐜囦繚瀛樺け璐ョ殑闂 +* [鐒︾偣鍒楄〃] 淇涓栫晫棣栭姘旇鏄剧ず閿欒闂 + +## 鑼椾紛鎻掍欢闆 v187 + +* [瑙掕壊缁熻] 鏇存柊澶ф垬銆侀樀钀ャ侀棬娲炬棩甯告暟鎹 +* [鍥㈤槦闈㈡澘] 鏇存柊琛嶅ぉ瀹楀洟闃熷績娉曞浘鏍 +* [瑙掕壊缁熻] 鏇存柊璺熷疇鏁版嵁 +* [瑙掕壊缁熻] 澧炲姞濂囬亣娴姩妗嗛殣钘忓凡瀹屾垚鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v186 + +* [鍩虹搴揮 澧炲姞琛嶅ぉ瀹楅厤鑹茬浉鍏虫暟鎹 +* [鍥㈤槦闈㈡澘] 澧炲姞琛嶅ぉ瀹楀績娉曟枃瀛楀浘鏍 + +## 鑼椾紛鎻掍欢闆 v185 + +* [鐗╁搧鐧剧] 淇鐗╁搧鐧剧寮鍏冲け鏁堢殑闂 + +## 鑼椾紛鎻掍欢闆 v184 + +* [鎴樻枟缁熻] 涓嶅啀淇濆瓨澶嶇洏璁板綍鍔熻兘寮鍏崇姸鎬 +* [闂ㄦ淳鐗硅壊] 淇浜旀瘨瀹犵墿娑堝け鎻愰啋瀵瑰叾浠栭棬娲句篃鐢熸晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v183 + +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ鍋跺皵鍑虹幇閲嶅鍐呭鏈鍒峰睆灞忚斀杩囨护鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v182 + +* [鑱婂ぉ鍔╂墜] 浼樺寲鍒峰睆灞忚斀瀵逛簬琛ㄦ儏鐨勮В鏋 +* [甯哥敤宸ュ叿] 淇鍑哄敭鍔╂墜鏃犳硶淇濇姢鐏拌壊鐗╁搧闂 +* [甯哥敤宸ュ叿] 澧炲姞鍑哄敭鍔╂墜浜屾纭妗嗛槻姝㈡剰澶栧嚭鍞 +* [鍥㈤槦鐩戞帶] 淇鍠婅瘽鐩戞帶鍙互鑷畾涔夐槦浼嶅瘑鑱婃姤璀﹀唴瀹圭殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v181 + +* [鍥㈤槦鐩戞帶] 澧炲姞杩囧浘绯荤粺娑堟伅 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦闈㈡澘姘斿姴鐩戞帶鏁版嵁涓嶆樉绀虹殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v180 + +* [鍩虹搴揮 澧炲己瀵屾枃鏈В鏋愬櫒绋冲畾鎬 +* [闂ㄦ淳鏌撹壊] 淇鐢变簬瀵屾枃鏈В鏋愬け璐ュ鑷村鍥摼鎺ュ嚭閿欑殑闂 +* [鍥㈤槦鐩戞帶] 澧炲姞閲庡鍦板浘鍒嗙被 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鐒︾偣鍒楄〃銆佸洟闃熸皵鍔叉暟鎹湪鍒嗙被鍦板浘涓棤鏁堢殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇绂佹鐩戝惉鑱婂ぉ鐩戞帶娑堟伅瀵艰嚧閮ㄥ垎绯荤粺娑堟伅琚灏佺殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v179 + +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ鍐呭瑙f瀽鍑洪敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v178 + +* [闂ㄦ淳鏌撹壊] 淇闂ㄦ淳鏌撹壊澶辨晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v177 + +* [鍩虹搴揮 淇鐗堟湰鍏煎鎬у嚱鏁板嚭閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v176 + +* [鐒︾偣鍒楄〃] 淇瑙f瀽鍥㈤槦鐩戞帶鏁版嵁鏃跺嚭閿欑殑闂 +* [閲戝洟璁板綍] 淇鎵嬪姩鍔犺浇鍘嗗彶璁板綍鎶ラ敊鐨勯棶棰 +* [甯哥敤宸ュ叿] 鑺辨湞鑺傚璇濇娓叉煋瑙掕壊鍚嶄笉鍐嶆洿鏀归鑹 +* [鍥㈤槦鐩戞帶] 淇鏁版嵁闃熶紞鍒嗕韩鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 澧炲姞娓呯┖鏁版嵁鍏ュ彛閫夐」 *(remake)* +* [鍥㈤槦鐩戞帶] 姊崇悊鏁版嵁鍒嗙被閫昏緫 *(remake)* +* [鍥㈤槦鐩戞帶] 澧炲姞娴琛屾暟鎹垎绫绘樉绀 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍒ゆ柇鍦板浘鏄惁鏄富鍩庣殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鐩戞帶鍙互閫氳繃鑱婂ぉ鐩戞帶鐩戝惉绂佹鐩戞帶NPC鍠婅瘽鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 娉℃场澧炲姞Y杞村亸绉昏缃 *(remake)* +* [澶撮《琛鏉 澧炲姞鑷姩闅愯棌瀹樻柟澶撮《鍔熻兘鐨勫紑鍏 *(remake)* + +## 鑼椾紛鎻掍欢闆 v175 + +* [鍩虹搴揮 淇寮瑰嚭鑿滃崟鍙兘閲嶅奖鐨勯棶棰 +* [鍩虹搴揮 淇姘斿姴鍙鐘舵佸垽瀹氶敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v174 + +* [涓荤晫闈 璋冩暣鐣岄潰澶у皬浣垮叾涓庡畼鏂瑰姛鑳界晫闈㈠ぇ灏忎竴鑷 +* [瑙掕壊缁熻] 寮哄埗鍒锋柊鎵鏈夎鑹茬粺璁$姸鎬佷负灏氭湭鎺堟潈 +* [瑙掕壊缁熻] 澧炲姞涓荤晫闈㈠叆鍙i〉 +* [瑙掕壊缁熻] 娓呯┖鏁版嵁搴撹В鍐冲巻鍙查仐鐣欒褰曠殑闂 +* [鎴樻枟澶嶇洏] 浣跨敤寮傛瀛樺偍鎺ュ彛浼樺寲鏁版嵁瀛樺偍鏁堢巼 +* [瑙掕壊缁熻] 涓嶅啀榛樿灏嗗叆鍙g洿鎺ユ樉绀哄湪娓告垙涓荤晫闈 +* [澶撮《琛鏉 澧炲姞瀹樻柟鑱婂ぉ娉℃场浜掓枼鑷姩澶勭悊閫昏緫 *(remake)* +* [鎴樻枟缁熻] 淇涓澶勫埛鏃ュ織鐨勯棶棰 +* [鑳屽寘鎼滅储] 淇杩囧浘鍚庢悳绱㈢粨鏋滄樉绀洪敊璇殑闂 +* [鍦板浘鎼滅储] 璋冩暣鎼滅储鐣岄潰鎺т欢甯冨眬浣垮叾鏇寸編瑙 +* [鐗╁搧鎼滅储] 澧炲姞杩涘害鏉″垎娈垫煡鎵鹃昏緫鏀瑰杽鎼滅储鍗¢】闂 + +## 鑼椾紛鎻掍欢闆 v173 + +* [閲戝洟璁板綍] 澧炲姞榛樿浣跨敤鏂版棫鐗堟媿鍗栫晫闈㈢殑璁剧疆椤 +* [閲戝洟璁板綍] 淇鍒嗛厤璧锋媿浠风紪杈戝け鏁堢殑闂 +* [鍩虹搴揮 榛樿涓嶅啀鏄剧ず灏忓湴鍥炬秷鎭腑蹇冨叆鍙 +* [鍥㈤槦鐩戞帶] 淇鏁版嵁璁㈤槄鍦╓eGame瀹㈡埛绔笅鏃犳硶鍔犺浇鐨勯棶棰 *(remake)* +* [甯哥敤宸ュ叿] 浼樺寲璁剧疆鐣岄潰鎺т欢甯冨眬銆佺嫭绔嬮儴鍒嗗姛鑳介夐」 +* [甯哥敤宸ュ叿] 鐙珛闂ㄦ淳鐗硅壊鐩稿叧鍔熻兘鍒板瓙鎻掍欢涓 +* [甯哥敤宸ュ叿] 鎷嗗垎鑱婂ぉ鐩稿叧鍔熻兘鍒拌亰澶╁姪鎵嬪瓙鎻掍欢涓 +* [娓告垙瀛椾綋] 淇瀛椾綋涓嶆樉绀烘牨澹告枃瀛楃殑闂 +* [鍥㈤槦鐩戞帶] 淇鍊掕鏃舵潯CDKEY娓呯┖閫昏緫閿欒闂 *(remake)* +* [鎴樻枟鏃ュ織] 淇鐣岄潰鍙兘椋炲嚭瀹㈡埛绔彲瑙佸尯鍩熺殑闂 +* [瑙掕壊缁熻] 棣栨鎵撳紑缁熻鐣岄潰寮瑰嚭鎻愮ず鍔熻兘寮鍚殑瀵硅瘽妗 +* [澶撮《琛鏉 澧炲姞褰撳墠鐩爣缃《鏄剧ず鐨勯夐」 *(remake)* +* [閫氱敤鍔熻兘] 瑙勮寖绉樺鏂囨鎺緸绉婚櫎鎵鏈夊壇鏈啓娉 +* [绉樺缁熻] 浼樺寲寮瑰嚭淇℃伅鏄剧ず椤哄簭銆佹寜鐓х澧冧汉鏁板綊绫绘帓鍒 +* [鐒︾偣鍒楄〃] 淇浜や簰鐗╀欢鍧愭爣鎸囩ず鍣ㄦ樉绀轰负鏁屽绾㈣壊鐨勯棶棰 +* [缁勯槦鍔╂墜] 淇妫娴嬪伐浣滃閫昏緫瀵艰嚧閮ㄥ垎瑙掕壊缁勯槦涓嶆樉绀虹殑闂 +* [瑙掕壊缁熻] 澧炲姞鍥畢甯佹暟鍊肩粺璁 +* [鑱婂ぉ娉℃场] 淇澶撮《琛鏉℃场娉″彲鑳藉崱閫忔槑搴︾殑闂 +* [鑱婂ぉ娉℃场] 淇澶撮《琛鏉℃场娉″皬涓夎鍙兘瓒呭嚭鐣岄潰鐨勯棶棰 +* [鑱婂ぉ娉℃场] 淇澶撮《琛鏉℃场娉¤秴闀垮害娌℃湁鎹㈣鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v172 + +* [閲戝洟鎷惧彇] 淇鎷惧彇闈㈡澘鑿滃崟鍒囨崲鏍峰紡鎸夐挳鎶ラ敊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v171 + +* [鍩虹搴揮 鏇存柊浼樺寲JSON瑙f瀽鍣ㄨВ鐮侀昏緫 +* [鍥㈤槦闈㈡澘] 淇鍥㈤槦姘斿姴璁剧疆鎵撳紑鎶ラ敊骞跺崱姝荤殑闂 +* [澶撮《琛鏉 淇鍦ㄧ粯鍒舵暟閲忎笉瓒冲崟杞笂闄愭椂鍗曡疆缁樺埗閬楁紡缁樺埗闃熷垪璧峰鐐规暟鎹殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鑾峰彇杩滅▼鏁版嵁寮傚父鏃舵病鏈夋樉绀洪敊璇唴瀹圭殑闂 *(remake)* +* [鎴樻枟缁熻] 淇敼闀挎瓕闂ㄩ粯璁ら鑹蹭娇鍏跺拰绾槼鏈夋墍鍖哄垎 + +## 鑼椾紛鎻掍欢闆 v170 + +* [鐩爣鐩戞帶] 淇瀹樻柟鑾峰彇蹇冩硶銆佸璺笌瀛愭妧鑳界浉鍏虫帴鍙f敼鍔ㄥ鑷村垵濮嬪寲鎶ラ敊鐨勯棶棰 *(remake)* +* [鑱婂ぉ杩囨护] 鍏抽敭瀛椾笅鎷夎彍鍗曞鍔犵紪杈戝姛鑳 +* [鑱婂ぉ鐩戞帶] 鍏抽敭瀛椾笅鎷夎彍鍗曞鍔犵紪杈戝姛鑳 +* [鍥㈤槦鐩戞帶] 澧炲姞璁㈤槄鏁版嵁涓閿鍑虹殑閫夐」 *(remake)* +* [鍥㈤槦鐩戞帶] 澧炲姞涓閿埛鏂版墍鏈夎闃呮暟鎹殑鎸夐挳 *(remake)* +* [鍥㈤槦鍠婅瘽] 淇绡℃敼淇濆瓨鍠婅瘽鏁版嵁鍙兘瀵艰嚧鍙戦侀潪娉曞埛灞忓枈璇濈殑闂 +* [甯哥敤宸ュ叿] 璋冩暣鍘嗗彶鎷涘紡鍒楄〃鐣岄潰鍔ㄧ敾鍚勯」鍙傛暟澧炲己鎴樻枟鎵撳嚮鎰 +* [甯哥敤宸ュ叿] 淇鍘嗗彶鎷涘紡鍒楄〃鍦ㄥ悓鏃堕噴鏀句袱涓嫑寮忔椂鍔ㄧ敾閿欎贡鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v169 + +* [鍩虹搴揮 淇鍐呯疆娴忚鍣ㄦ爣棰樺彲鑳借秴鍑虹晫闈㈢殑闂 +* [鍩虹搴揮 淇鍐呯疆娴忚鍣ㄥ湴鍧鏍忓け鐒︽椂鍏夋爣浣嶇疆娌℃湁閲嶇疆鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇椹吇楗ラタ搴﹁鍛婂姛鑳藉け鏁堢殑闂 +* [鎴樻枟缁熻] 淇閰嶈壊閫忔槑搴﹂敊璇鑷存暣浣撳亸鏆楃殑闂 +* [閲戝洟璁板綍] 浼樺寲鏁版嵁閫氱煡浜嬩欢銆佸鍔犺褰曠紦瀛樻満鍒跺噺灏戝崱椤 + +## 鑼椾紛鎻掍欢闆 v168 + +* [鍩虹搴揮 鏇存敼闂ㄦ淳榛樿鑳屾櫙鑹蹭负瀹樻柟鎺ㄨ崘鏁版嵁 +* [鑱婂ぉ鐩戞帶] 淇棰戦亾鍕鹃夎缃棤鏁堢殑闂 +* [鎴樻枟缁熻] 淇鍋跺皵鍑虹幇璁板綍涓㈠け鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鍔熻兘寮傚父鐣岄潰涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v167 + +* [鍥㈤槦鐩戞帶] 鎸夎鑼冭姹傜姝㈢洃鎺ч儴鍒嗙郴缁熻鑹茬殑鍠婅瘽 *(remake)* +* [鍥㈤槦鐩戞帶] 鍊掕鏃舵渶鍚庝竴绉掓樉绀哄皬鏁扮偣鍑忓皯鍗¢】鎰 *(remake)* +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦闈㈡澘灏忛槦涓嶆樉绀哄洟闃熷伐鍏峰叆鍙g殑闂 +* [鍥㈤槦鍛婄ず] 灏忛槦妯″紡涓嬩篃鍙娇鐢ㄥ洟闃熷憡绀轰簡 +* [鍥㈤槦鐣岄潰] 浼樺寲宸ュ叿鏍忓搴 澧炲姞榧犳爣绉诲叆绉诲嚭鍔ㄧ敾鏁堟灉 +* [瑙掕壊缁熻] 淇閮ㄥ垎鏂囨閿欏埆瀛楃殑闂 +* [鑱婂ぉ鐩戞帶] 浼樺寲鐣岄潰甯冨眬鏄剧ず浣垮叾鏇寸編瑙 +* [鑱婂ぉ鐩戞帶] 淇缂栬緫鑱婂ぉ鐩戞帶鍏抽敭璇嶅湪閮ㄥ垎瀹㈡埛绔笅鍑虹幇鐧藉睆鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v166 + +* [鍩虹搴揮 绂佹鑾峰彇绛夌骇涓0鐨勬妧鑳介槻姝㈤昏緫鍒锋棩蹇 +* [鎴樻枟缁熻] 鏃犺闆跺奸夐」姘歌繙鏄剧ず閮ㄥ垎濡傞晣灞辨渤銆佹鑺变笁寮勭瓑閲嶈闂ㄦ淳鎶鑳 +* [鍥㈤槦鍔╂墜] 淇缁勯槦鍔熻兘鏈夊嚑鐜囧嚭閿欑殑闂 +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦鍛婄ず鍜屽洟闃熸鏋剁晫闈㈠墠寰鍥㈤槦宸ュ叿鐨勫叆鍙f寜閽 +* [鍥㈤槦鐩戞帶] 淇鍦ㄥ鍩庣氭捣涓儴鍒嗗姛鑳藉彲鐢ㄧ殑闂銆佸苟鎸夎姹傚湪闈炲壇鏈鐢ㄦ垬鏂楃浉鍏崇洃鎺 *(remake)* +* [浠囨仺缁熻] 淇娴姩绐楀彛寮瑰嚭鑿滃崟涓鐩磋Е鍙戦噸缁樺鑷存棤娉曠偣鍑荤殑闂 +* [鑱婂ぉ杩囨护] 淇杩囨护璁剧疆棰戦亾鍕鹃変笉淇濆瓨鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v165 + +* [鎴樻枟缁熻] 鍥炴粴涓嶅畬鍠勭殑娌荤枟鐩剧粺璁¢昏緫瀵艰嚧濂舵瓕杩囧己鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v164 + +* [鐣岄潰搴揮 淇鎸夐挳缁勪欢鏂囧瓧榛樿娌℃湁灞呬腑鐨勯棶棰 +* [鍩虹鏁版嵁] 鏇存柊澶ф垬鍓湰淇℃伅 +* [寮瑰嚭鑿滃崟] 淇瀹藉害涓嶈冻瀵艰嚧婊氬姩鏉℃棤娉曟嫋鎷界殑闂 +* [浠囨仺鍒楄〃] 淇鍙兘鎶ラ敊鐨勯棶棰 +* [鎴樻枟缁熻] 浼樺寲鎴樻枟澶勭悊閫昏緫璧勬簮鍥炴敹娆℃暟 +* [鎴樻枟缁熻] 灏嗛暱姝屾鑺变笁寮勫綊绫讳负娌荤枟鎶鑳 +* [鎴樻枟缁熻] 灏嗛暱姝屾鑺变笁寮勭浘鍖栬В鐨勪激瀹冲綊涓烘不鐤楅噺 +* [鎴樻枟缁熻] 闄愬埗澶嶇洏璁板綍鍘嗗彶閫夐」涓嬫媺鏁伴噺闃叉鍗¢】 +* [鎴樻枟缁熻] 淇鍦ㄦ垬鏂楁椂鍙戝竷缁熻鏃堕棿涓鸿礋鏁扮殑闂 +* [閲戝洟缁熻] 淇閲戝洟涓浜涚炕璇戠己澶辩殑闂 +* [閲戝洟鎷惧彇] 澧炲姞鏈澶ч珮搴︽粴鍔ㄦ潯鏈哄埗闃叉瓒呭嚭灞忓箷 +* [閲戝洟鎷惧彇] 淇鐭跨煶閲囬泦澶撮《鏄剧ず鍕鹃夋棤鏁堢殑闂 +* [閲戝洟鎷惧彇] 淇鎺夎惤浣嶇疆鏄剧ず鍒锋柊缂撴參瀵艰嚧瑙嗚椤垮崱鐨勯棶棰 +* [甯哥敤宸ュ叿] 榛樿鍏抽棴杩涘叆鎴樺満鏄剧ず妯″瀷鍔熻兘 +* [甯哥敤宸ュ叿] 澶ф垬鎻愮ず澧炲姞娌℃帴澶ф垬杩涙湰鎻愮ず +* [鐗╁搧鎼滅储] 淇鎼滅储鏁版嵁浼氭姤閿欑殑闂 +* [瑙掕壊缁熻] 淇鍒犻櫎鎸夐挳鍙兘澶辫触鐨勯棶棰 +* [瑙掕壊缁熻] 澧炲姞閲戦挶銆侀氬疂绛夋眹鎬荤殑鍔熻兘 +* [鑱婂ぉ鎵撻┈] 鏀寔瀵瑰ご椤惰鏉″府浼氬悕杩涜鎵撻┈ +* [鐩爣鐩戞帶] 淇鐩爣蹇冩硶閫夋嫨NPC鏃犳晥鐨勯棶棰 *(remake)* +* [鐒︾偣鍒楄〃] 澧炲姞淇℃伅鏄剧ず鍦ㄥ睆骞曞彸涓嬭鐨勯夐」 +* [澶撮《琛鏉 澧炲姞涓嶆樉绀鸿窡瀹犵殑閰嶇疆椤 *(remake)* +* [鍥㈤槦闈㈡澘] 澧炲姞淇℃伅鏄剧ず鍦ㄥ睆骞曞彸涓嬭鐨勯夐」 +* [鍥㈤槦鐩戞帶] 淇鍦ㄥ悓涓涓洟闃熶腑涓嶅悓瑙掕壊鍥㈤槦姘斿姴鏄剧ず椤哄簭涓嶄竴鑷寸殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v163 + +* [甯哥敤宸ュ叿] 淇绯荤粺鍔ㄦ佹妧鑳芥爮澶嶇敤鍛藉悕绌洪棿瀵艰嚧淇濆瓨浣嶇疆鍑洪敊鐨勯棶棰 +* [瑙掕壊缁熻] 榛樿涓嶅啀缁熻鏂拌鑹 +* [鑱婂ぉ鐩戞帶] 淇敼璁剧疆鎸夐挳鏍峰紡缇庡寲鏄剧ず鏁堟灉 +* [娓告垙瀛椾綋] 淇瀛椾綋鏂囦欢閮ㄥ垎鍐呯爜鏄犲皠鍏崇郴閿欒鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v162 + +* [鑳屽寘缁熻] 淇浠撳簱鏈鍚庝竴鏍兼病鏈夎褰曠殑闂 +* [瀛椾綋璧勬簮] 绉婚櫎鍙版湇涓撶敤闆呯棡浣撳瓧浣撴枃浠 +* [瑙掕壊缁熻] 淇澶氳鑹查鍑烘父鎴忔椂鏁版嵁鍙樺寲鎻愮ず閿欒鐨勯棶棰 +* [閲戝洟璁板綍] 淇娌℃湁鍒嗛厤鏉冮檺鏃惰繛缁偣鍑诲垎閰嶉噸澶嶅脊鍑鸿鍛婃鐨勯棶棰 +* [瑙掕壊缁熻] 瑙掕壊浠诲姟缁熻澧炲姞鍛ㄥ父缁熻鏄剧ず锛堟鏋楅氶壌绯诲垪锛 + +## 鑼椾紛鎻掍欢闆 v161 + +* [鑱婂ぉ澶嶅埗] 淇鍟嗗煄涓鍒惰亰澶╁嚭閿欑殑闂 +* [鎴樻枟澶嶇洏] 淇鎼滅储瑙掕壊鍚嶄笉鏄剧ず閲嶄激璁板綍鐨勯棶棰 +* [瑙掕壊缁熻] 鍚勬ā鍧楀鍔犳槸鍚︾粺璁″綋鍓嶈鑹茬殑閫夐」 +* [瑙掕壊缁熻] 浼樺寲鏋舵瀯灏嗚嚜韬暟鎹紦瀛樺湪鍐呭瓨涓檷浣庣鐩樺紑閿 +* [鑱婂ぉ澶嶅埗] 淇閬囧埌閲戦挶鍥炬爣鏃舵棤娉曞鍒跺鑷存暟瀛楄繛涓叉棤娉曢槄璇荤殑闂 +* [閲戝洟璁板綍] 澧炲姞鏄惁鍚屾绯荤粺閲戝洟鐨勫紑鍏充緵鐢ㄦ埛鑷富閫夋嫨 +* [瑙掕壊缁熻] 淇婊氬姩鏉¢敊浣嶇殑闂 +* [瑙掕壊缁熻] 娴姩鎸夐挳鐐瑰嚮鍙洿杈惧垎椤佃鎯 + +## 鑼椾紛鎻掍欢闆 v160 + +* [鍩虹搴揮 淇鑳屽寘閬嶅巻鍦ㄩ儴鍒嗗湴鍥鹃昏緫閿欒鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鑷姩鎷惧彇寤惰繜鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鑷姩鎷惧彇浼氬鑷村簴涓佺殑闂 +* [鎴樻枟缁熻] 榛樿涓嶅啀鍚敤鍔熻兘闃叉瀹樻柟鏁版嵁澶瀵艰嚧浣庣鏈洪】鍗 + +## 鑼椾紛鎻掍欢闆 v159 + +* [鍏ㄥ眬閰嶈壊] 寰皟涓浜涢厤鑹插湪浜戞父鎴忎腑鐨勬樉绀 +* [璁¤垂鏄剧ず] 淇鍦ㄧ偣鍗℃湀鍗″悓鏃跺瓨鍦ㄦ椂鏄剧ず閿欒鐨勯棶棰 +* [閲戝洟鍒嗛厤] 淇鎵嬪姩娣诲姞琛ヨ创娌℃湁鑷姩瀹屾垚浠锋牸鐨勯棶棰 +* [閲戝洟鎷惧彇] 鍒犻櫎宸插け鏁堢殑鑷姩搴栦竵鎻愮ず璇 +* [鍥㈤槦闈㈡澘] 淇鏃犳硶鎵撳紑閲戝洟鐨勯棶棰 +* [鍥㈤槦鍛婄ず] 淇閲戝洟璁板綍鎸夐挳鏃犳晥鐨勯棶棰 +* [鍥㈤槦宸ュ叿] 淇鎴樻枟淇℃伅澶╁鏉ュ鍑绘潃鏄剧ず閿欒鐨勯棶棰 +* [鎴樻枟缁熻] 淇閲嶅璁板綍杩涙垬鐬棿鎶鑳界殑闂 +* [鎴樻枟缁熻] 淇鍘嗗彶璁板綍鑿滃崟澶暱瓒呭嚭灞忓箷鐨勯棶棰 +* [瑙掕壊缁熻] 澧炲姞濂囬亣缁熻鐣岄潰 +* [瑙掕壊缁熻] 淇涓嬬嚎鎻愮ず鏁板煎彉鍖栧涓睘鎬т箣闂寸己灏戦楀彿鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v158 + +* [閲戝洟璁板綍] 淇鍘嗗彶鎺掑簭鍙兘鎶ラ敊鐨勯棶棰 +* [鎴樻枟缁熻] 淇榛樿涓嶅嬀閫変繚瀛樺巻鍙叉暟鎹椂浠嶇劧瀛樼洏鏁版嵁鐨勯棶棰 +* [鎴樻枟缁熻] 淇鍘嗗彶璁板綍鍑虹幇閲嶅鐨勯棶棰 +* [鎴樻枟缁熻] 澧炲姞涓嶄繚瀛樺鐩樻暟鎹殑閫夐」骞堕粯璁ゅ嬀閫 +* [鎴樻枟缁熻] 澧炲姞鑴辩鎴樻枟鏃朵繚瀛樻垬鏂楃粺璁$殑閫夐」骞堕粯璁ゅ叧闂 + +## 鑼椾紛鎻掍欢闆 v157 + +* [鍥㈤槦闈㈡澘] 淇娌℃湁鍔犺浇鍥㈤槦宸ュ叿鏃堕《閮ㄦ寜閽姤閿欑殑闂 +* [閲戝洟璁板綍] 淇閲戦挶璁板綍鍠婅瘽鍔熻兘寮傚父鐨勯棶棰 +* [閲戝洟璁板綍] 淇鎷惧彇鐗╁搧鍦ㄥ埌杈惧彲鎷惧彇涓婇檺鏃剁郴缁熸秷鎭埛灞忕殑闂 +* [閲戝洟璁板綍] 淇鎷惧彇杩囨护宸叉湁涔︾睄鏃舵病鏈夊垽鏂粨搴撲腑宸叉湁鐨勯棶棰 +* [閲戝洟璁板綍] 淇鎺夌嚎鍚庡洟闀夸娇鐢ㄧ郴缁熼噾鍥㈡彃鍑虹殑瑁呭娌℃湁鍚屾鐨勯棶棰 +* [閲戝洟璁板綍] 淇鏀跺叆缁熻浼氬悓姝ュ埌绯荤粺閲戝洟寰堝0閲戜氦鏄撶殑闂 +* [閲戝洟璁板綍] 淇閲戝洟璁板綍閫掑綊鍗℃瀵艰嚧鑱婂ぉ鍒峰睆鐨勯棶棰 +* [瑙掕壊缁熻] 姣忓懆鍒锋柊鐨勬暟鎹鏈懆渚犱箟涓婇檺鍦ㄨ法鍛ㄥ悗鏄剧ず涓烘湭鐭 +* [鎴樻枟缁熻] 鏁版嵁缁撴瀯鏀逛负鏁扮粍褰㈠紡鍑忓皯鍐呭瓨鍗犵敤鍜屾暟鎹枃浠朵綋绉 +* [鎴樻枟缁熻] 淇鍕鹃夊悎骞跺悓鍚峃PC/鎶鑳介夐」 鎴樻枟缁撴潫鍚庡彇娑堝嬀閫変笉鑳藉埛鏂版暟鎹殑闂 + +## 鑼椾紛鎻掍欢闆 v156 + +* [甯哥敤宸ュ叿] 淇瀵艰嚧娌夋蹈寮忓璇濆悗鐣岄潰娑堝け鐨勯棶棰 +* [閲戝洟璁板綍] 澧炲姞绯荤粺閲戝洟鏁版嵁鑷姩鍚屾鍔熻兘 +* [閲戝洟璁板綍] 澧炲姞璁剧疆鏍囬鎸夐挳 +* [閲戝洟璁板綍] 淇鏌愪簺鎯呭喌涓嬬墿鍝佸垪琛ㄥ搧绾у叏閮ㄦ樉绀洪粍鑹茬殑闂 +* [閲戝洟璁板綍] 鍘嗗彶鑿滃崟澧炲姞鍒犻櫎鎸夐挳 +* [閲戝洟璁板綍] 鏌ョ湅鍘嗗彶璁板綍涓嶅啀闇瑕佽鐩栧綋鍓嶈褰 +* [瑙掕壊缁熻] 淇鍓湰缁熻鍦ㄥ壇鏈唴涓嬬嚎涓嶅埛鏂版暟鎹殑闂 +* [瑙掕壊缁熻] 鍓湰缁熻澧炲姞鍛ㄥ父姝︽灄閫氶壌鐨勯夐」 + +## 鑼椾紛鎻掍欢闆 v155 + +* [閲戝洟璁板綍] 浜戠涓嬪鍔犲巻鍙茶褰曟暟閲忛檺鍒 +* [閲戝洟鎷惧彇] 淇鎵撳紑鎺夎惤鍚庝竴鐩村崱鐫鎷惧彇鍔ㄤ綔鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇寮瑰嚭妗嗚繘鍏ヨ缃晫闈㈤敊璇烦杞埌閲戝洟璁板綍璁剧疆鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鐐瑰嚮鍒囨崲鏍峰紡鍙兘瀵艰嚧鐧藉睆鐨勯棶棰 +* [閲戝洟鎷惧彇] 淇鍚冮浮鍙互杩滅▼鏌ョ湅鍦伴潰瑁呭鎺夎惤鐨勯棶棰 +* [鑱婂ぉ璁板綍] 浜戠瀹㈡埛绔姝娇鐢ㄦ暟鎹鍑哄姛鑳 +* [鐩爣鐩戞帶] 浜戠瀹㈡埛绔姝娇鐢ㄦ暟鎹鍑哄姛鑳 *(remake)* +* [瑙掕壊缁熻] 淇鑳屽寘缁熻鍚嶇О鍕鹃変笉鑳戒繚瀛樼殑闂 +* [瑙掕壊缁熻] 淇鏍囩椤靛垏鎹㈠悗鏁版嵁涓嶈兘鍒锋柊鐨勯棶棰 +* [瑙掕壊缁熻] 淇鎵撳紑鐣岄潰鏃跺伓灏斾細瀵艰嚧瀹㈡埛绔棤鍝嶅簲鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v154 + +* [鑱婂ぉ璁板綍] 浜戠瀹㈡埛绔檺鍒惰褰曞瓨鍌ㄦ暟閲忛槻姝㈡暟鎹枃浠惰繃澶 +* [甯哥敤宸ュ叿] 淇鍦ㄥ睆钄藉湴鍥句腑濂藉弸甯細楂樹寒鍙互鐪嬭鐩爣浣嶇疆鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v153 + +* [鍩虹搴揮 澧炲姞浜戞父鎴忓吋瀹 +* [澶撮《琛鏉 淇鍙兘鎶ラ敊鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 澧炲姞鑱婂ぉ鍔╂墜鍚嶇О鎵撶爜鑱斿姩 *(remake)* +* [鍥㈤槦闈㈡澘] 澧炲姞鑱婂ぉ鍔╂墜鍚嶇О鎵撶爜鑱斿姩 +* [鎴樻枟缁熻] 澧炲姞鑱婂ぉ鍔╂墜鍚嶇О鎵撶爜鑱斿姩 +* [瑙掕壊缁熻] 澧炲姞鑱婂ぉ鍔╂墜鍚嶇О鎵撶爜鑱斿姩 +* [瑙掕壊缁熻] 鎶界缁熻鍔熻兘鍒扮嫭绔嬪瓙鎻掍欢涓 +* [閲戝洟璁板綍] 淇閲戝洟鐣岄潰鑳屾櫙闂 +* [閲戝洟鎷惧彇] 澧炲姞鐗╁搧鏄剧ず杩囨护鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v152 + +* [鍩虹搴揮 淇娌℃湁鐜茬彂瀵嗕繚閿佽鍒や负閿佸畾鐘舵佺殑闂 +* [甯哥敤宸ュ叿] 淇鐧诲綍鍙兘閫犳垚鐧藉睆鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇鏄庢暀鑳介噺鏉℃樉绀哄嚭閿欑殑闂 +* [甯哥敤宸ュ叿] 淇娌℃湁鍔犺浇鑳屽寘鍔╂墜鏃跺父鐢ㄥ伐鍏疯缃晫闈㈡姤閿欑殑闂 +* [閲戝洟鎷惧彇] 淇鐢变簬鏁版嵁闂瀵艰嚧鍔熻兘鍑洪敊鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鏁版嵁搴撻泦缇よ妭鐐规枃浠跺彈鎹熸椂绯荤粺涓嶈兘鑷姩鑷垜淇鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v151 + +* [閲戝洟鎷惧彇] 搴旇姹傞粯璁ょ鐢ㄥ姛鑳藉紑鍏 +* [閲戝洟鎷惧彇] 淇鍒嗛厤鐣岄潰鎵撳紑鎶ラ敊鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇瀛ゅ煄鐎氭捣姝讳骸鍚庝笉鑳藉垏鎹㈣瑙掔殑闂 +* [甯哥敤宸ュ叿] 淇閫昏緫閿欒瀵艰嚧涓鐩村悆榧庣殑闂 +* [骞村吔闄剁綈] 閲嶆瀯鎷惧彇杩囨护璁剧疆椤归昏緫鏀寔鑷畾涔夊悕绉 +* [鑳屽寘浠撳簱] 淇鎼滅储蹇嵎閿棶棰 +* [鍥㈤槦闈㈡澘] 淇涓澶勭炕璇戦仐婕忛棶棰 +* [骞村吔闄剁綈] 缁嗗寲鍚勯」鍒嗘暟璁剧疆椤逛娇鎼厤鏇磋嚜鐢 + +## 鑼椾紛鎻掍欢闆 v150 + +* [鍩虹搴揮 鏇存柊鍑岄洩闃侀粯璁ら厤鑹 +* [鑳屽寘缁熻] 淇鏃犳硶鎼滅储浠撳簱鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鏌愪簺鎯呭喌涓嬫暟鎹嚭閿欐椂鏃犳硶鑷姩淇鐨勯棶棰 +* [閲戝洟璁板綍] 澧炲姞鑱婂ぉ閿佹娴嬩笌閲嶅彂鏈哄埗闃叉閿佸畾鐘舵佷笅鍚屾澶辫触鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鑱婂ぉ璁板綍鏈瓨鐩橀儴鍒嗘棤娉曞睍绀虹殑闂 +* [鑱婂ぉ璁板綍] 淇鑱婂ぉ璁板綍鍦ㄧ箒浣撳鎴风涓嬬炕椤甸敊璇殑闂 +* [鍥㈤槦鍛婄ず] 淇闈為槦闀夸篃鑳戒慨鏀瑰憡绀哄唴瀹圭殑闂 +* [鍥㈤槦鍛婄ず] 淇閫闃熸椂娌℃湁鑷姩娓呯┖瀵艰嚧閿欒鏄剧ず鍦ㄦ柊鍥㈤槦涓殑闂 +* [甯哥敤宸ュ叿] 淇鍞愰棬闂ㄦ淳鑳介噺鏉′笉鍒锋柊鐨勯棶棰 +* [闅忚韩渚跨] 鎷栨嫿澶у皬鏃朵笉鍐嶆樉绀烘爣棰樻爮 +* [鍥㈤槦鍛婄ず] 鏀寔鑷畾涔夋嫋鎷藉ぇ灏 +* [鍥㈤槦鍛婄ず] 淇鐐瑰嚮鍙戝竷鍋跺皵娌″弽搴斾互鍙婇閬撳彿涓嶈兘淇濆瓨鐨勯棶棰 +* [鍥㈤槦鍛婄ず] 闃熷憳澧炲姞澶嶅埗棰戦亾鍙风殑鎸夐挳閫夐」 +* [鍥㈤槦鍛婄ず] 棰戦亾杈撳叆妗嗕粎鍏佽杈撳叆鏁板瓧 +* [閲戝洟璁板綍] 鎷嗙鎷惧彇妗嗗拰璁′环妗嗗惎鐢ㄥ紑鍏 +* [閲戝洟鎷惧彇] 澧炲姞涓嶅悓鍦板浘寮鍏崇殑閫夐」 +* [閲戝洟鎷惧彇] 淇鍒嗛厤鏁d欢鑰佹澘鏃朵細灏嗚窡瀹犱篃鍒嗛厤鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v149 + +* [鍩虹搴揮 浼樺寲BUFF鑾峰彇鎺ュ彛鏁堢巼 +* [鍥㈤槦闈㈡澘] 淇娌荤枟鍥㈤槦HOT鏃堕棿涓嶅埛鏂扮殑闂 + +## 鑼椾紛鎻掍欢闆 v148 + +* [鍩虹搴揮 淇瑙掕壊璁剧疆淇濆瓨椤瑰湪鐗瑰畾鎯呭喌涓嬪嚭閿欑殑闂 +* [鍥㈤槦闈㈡澘] 淇鎷嶅崠妯″紡涓嬮噾鍥㈠叆鍙d笉鏄剧ず鐨勯棶棰 +* [鐩爣鐩戞帶] 淇棣栨杩涘叆娓告垙鏃惰缃棤娉曚繚瀛樼殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v147 + +* [鍥㈤槦闈㈡澘] 澧炲姞绯荤粺閲戝洟鍏ュ彛 +* [鍑岄洩钘忛攱] 澧炲姞鍑岄洩闃佸績娉曞悕绉板強閰嶈壊鏁版嵁 + +## 鑼椾紛鎻掍欢闆 v146 + +* [閲戝洟浜や簰] 鎸夎姹傚睆钄介噾鍥㈡嬀鍙栬嚜鍔ㄩ噰闆嗙殑鍔熻兘 +* [鍥㈤槦闈㈡澘] 淇钃幈蹇冩硶鏄剧ず涓轰緺鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v145 + +* [閲戝洟浜や簰] 淇鍦ㄥ姛鑳藉睆钄藉湴鍥句粛鐒跺彲鏄剧ず浜や簰鐗╀欢灏忓湴鍥句綅缃殑闂 + +## 鑼椾紛鎻掍欢闆 v144 + +* [鍩虹搴揮 鑱婂ぉ妗嗗揩閫熼変腑鐩爣鍔熻兘鍦ㄥ睆钄藉湴鍥句腑涓嶅啀鍏佽浣跨敤 + +## 鑼椾紛鎻掍欢闆 v143 + +* [閲戝洟璁板綍] 淇閲戝洟浜や簰鍦ㄥ姛鑳界姝㈠湴鍥句笂浠嶈兘浣跨敤鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇鍒濆鍖栨姤閿欏鑷存彃浠惰缃棤娉曟垚鍔熷姞杞界殑闂 + +## 鑼椾紛鎻掍欢闆 v142 + +* [涓荤晫闈 淇璁¤垂绯荤粺鍓╀綑鏃堕棿鏄剧ず涓鸿礋鏁扮殑闂 +* [鍩虹搴揮 淇閮ㄥ垎绯荤粺涓嬪鎴风鍔犺浇鎻掍欢浼氬畷鏈虹殑闂 +* [鍩虹搴揮 淇鍖垮悕浜嬩欢娉ㄥ唽鏃犳晥瀵艰嚧杩斿洖瑙掕壊閫夋嫨鐣岄潰鏃犳硶淇濆瓨鎻掍欢璁剧疆鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鏃犳硶璁板綍闈炶鑹插彂瑷鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鏃犳硶璁板綍鑱婂ぉ鐩戞帶鐨勯棶棰 +* [鑱婂ぉ鐩戞帶] 鏀寔閫氳繃涓嫭鍙峰寘瑁硅亰澶╅閬撴寚瀹氳鐩戞帶鐨勬秷鎭潵婧愮殑鍔熻兘 +* [鑱婂ぉ璁板綍] 鏃堕棿鎴虫彁绀鸿涓嶅啀鏄剧ず鏃犳剰涔夌殑涓敭鍒犻櫎閫夐」 +* [娑堟伅涓績] 澧炲姞绂佹娑堟伅鑷姩娑堝け鐨勯夐」 +* [娑堟伅涓績] 澧炲姞浼樺厛鏄剧ず鏂版秷鎭殑閫嗗簭鏄剧ず閫夐」 +* [甯哥敤宸ュ叿] 淇闂ㄦ淳鑳介噺鏉′笉鑳芥嫋鍔ㄧ殑闂 +* [鍥㈢洃閲戝洟] 淇閲戝洟鍜屽洟鐩戦儴鍒嗗浘鏍囬紶鏍囩姸鎬侀棶棰 +* [鍥㈤槦鐩戞帶] 鏀寔鐒︾偣浜や簰鐗╀欢 *(remake)* +* [鍥㈤槦鐩戞帶] 鏇存柊涓浜涗笓鏈夊悕璇嶇炕璇 *(remake)* +* [鍥㈤槦鐩戞帶] 淇姘斿姴鏄剧ず缈昏瘧闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇姘斿姴瀵硅薄鍚嶇О鑾峰彇鍙兘澶辫触鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v141 + +* [鐒︾偣鍒楄〃] 淇鐩爣鍚嶇О璺ㄦ湇鍚庡啿绐佸鑷存樉绀洪敊璇殑闂 +* [澶撮《琛鏉 淇鐩爣鍚嶇О璺ㄦ湇鍚庡啿绐佸鑷存樉绀洪敊璇殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 鏁版嵁涓嬭浇浣跨敤jsdelivr鎻愪緵鐨刢dn鍔犻熷噺灏戝け璐ュ彲鑳 *(remake)* + +## 鑼椾紛鎻掍欢闆 v140 + +* [鍥㈤槦闈㈡澘] 淇鏄剧ず鐩爣璇绘潯鐨勯棶棰 +* [閲戝洟璁板綍] 淇涓浜涘彉閲忛敊璇棶棰 +* [閲戝洟鎷惧彇] 涓嶅啀鏄剧ず鏃犳硶澶勭悊鐨凴OLL鐐圭墿鍝佸拰鎷嶅崠鐗╁搧 +* [鎴樻枟缁熻] 淇涓嶆樉绀烘棤鏁板兼妧鑳藉悗璇︽儏椤甸潰鏁伴噺閿欒鐨勯棶棰 +* [浠囨仺缁熻] 淇鍚敤鍚庝竴鐩存姤閿欓棶棰 +* [鑱婂ぉ璁板綍] 淇瀵煎嚭璁板綍鏃堕棿鏄剧ず闂 +* [鐩爣鎸囩ず] 淇鐩爣璺濈鍗曚綅鏄剧ず涓鸿嫳鏂囩殑闂 +* [鑱婂ぉ澶嶅埗] 淇鏂囨湰缂栬緫鍣ㄤ笉鑳芥甯告樉绀烘枃瀛楃殑闂 +* [鍥㈤槦鐩戞帶] 淇鍓湰棣栭闅愯韩鍚庢妧鑳界洃鎺уけ鏁堥棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇绯荤粺瑙掕壊鎶ヨ鍚嶇О鏄剧ず閿欒鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 瑙掕壊鍐呭姏琛閲忓彉鍖栦簨浠跺鍔犳柟鍚戦檺鍒剁 *(remake)* +* [鍥㈤槦鐩戞帶] 淇琛閲忔椂闂磋酱鏂囧瓧杩囨护瑙f瀽鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 鍊掕鏃惰缃鍔犱娇鐢ㄥ府鍔╄鏄庢枃瀛 *(remake)* + +## 鑼椾紛鎻掍欢闆 v139 + +* [鐩爣鐩戞帶] 淇瀵煎叆榛樿鏁版嵁涓嶆樉绀虹殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇敼涓浜涗娇鐢ㄨ鏄庢枃瀛 *(remake)* +* [鐒︾偣鍒楄〃] 淇璺濈闄愬埗鏃犳晥鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇杩囧浘鍚庢病鏈夊埛鏂扮殑闂 +* [鍥㈤槦鐩戞帶] 淇$team绛夋ā寮忎覆瑙f瀽闂 *(remake)* +* [鑱婂ぉ璁板綍] 娓告垙鎰忓鏂嚎鏃朵笉鍐嶆鏌ヨ褰曞畬鏁存ц屾槸鐩存帴涓㈠純鏈繚瀛樻暟鎹槻姝㈣浠ヤ负鎻掍欢瀵艰嚧鎺夌嚎 +* [閲戝洟鎷惧彇] 淇鍋跺皵浼氬嚭鐜伴噸澶嶇殑鎷惧彇鐣岄潰鐨勯棶棰 +* [閲戝洟鎷惧彇] 鑷姩鎷惧彇澧炲姞鑷姩鎷惧彇浠诲姟鐗╁搧閫夐」 + +## 鑼椾紛鎻掍欢闆 v138 + +* [澶撮《琛鏉 淇棰滆壊鏄剧ず寮傚父鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鑾峰彇鏁版嵁鐣岄潰鎸夐挳娌″埛鏂扮殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鏃堕棿杞存坊鍔犳寜閽姤閿欑殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍒嗘鏃堕棿杞存棤鏁堢殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 鏃堕棿杞翠腑鍚嶇О妯″紡涓蹭笉鍐嶈鍏ュ瓧鏁伴檺鍒 *(remake)* +* [鑱婂ぉ璁板綍] 淇鏌ョ湅鐣岄潰棰戦亾澶嶉夋涓嶇敓鏁堢殑闂 + +## 鑼椾紛鎻掍欢闆 v137 + +* [鑱婂ぉ璁板綍] 淇棣栨鍒濆鍖栨姤閿欑殑闂 +* [鑱婂ぉ璁板綍] 淇浠庢湭鎵撳紑鐣岄潰鐨勬儏鍐典笅閫鍑烘父鎴忔棤娉曚繚瀛樻柊璁板綍鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇鐩爣杩愬姛杩涘害鏄剧ず +* [鍥㈤槦闈㈡澘] 鍘婚櫎姘斿姴鐩戞帶杈撳叆妗嗛暱搴﹂檺瀹 +* [鍥㈤槦鐩戞帶] 寰皟鍚勭晫闈㈤粯璁や綅缃槻姝㈤伄鎸″満鏅 *(remake)* +* [鍥㈤槦鐩戞帶] 鏃堕棿杞磋缃姛鑳藉鍔犱竴浜涜鏄庢枃瀛 *(remake)* +* [鍥㈤槦鐩戞帶] 鑷畾涔夋枃瀛楀鍔犻氳繃鎶鑳姐佺洰鏍嘔D鑾峰彇鍚嶅瓧鐨勬ā寮忎覆 *(remake)* +* [鍥㈤槦鐩戞帶] 娣诲姞鏁版嵁鏃惰嚜鍔ㄦ粴鍔ㄩ変腑鐨勫湴鍥惧垪琛ㄥ埌瑙嗙獥涓 *(remake)* +* [鍥㈤槦鐩戞帶] 淇杩滅▼鏁版嵁鐣岄潰涓嶈兘婊氬姩鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦鎶ヨ鍐呭涓虹┖鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇敼姘旇鍐呭姏鏃堕棿杞磋缃彁绀鸿 *(remake)* +* [鍥㈤槦鐩戞帶] 淇绯荤粺瑙掕壊杩涘叆鎴樻枟鏃堕棿杞翠細涓嶆柇瑙﹀彂鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇绯荤粺瑙掕壊杩涘叆鎴樻枟瑙﹀彂鐨勫掕鏃惰劚鎴樻病鏈夎嚜鍔ㄦ秷澶辩殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v136 + +* [鐒︾偣鍒楄〃] 淇澶氫釜鏉′欢鍐茬獊鏃跺鑷翠竴涓兘涓嶈兘鏄剧ず鐨勯棶棰 +* [鐒︾偣鍒楄〃] 鑷畾涔夋枃鏈鍔犳晱鎰熻瘝灞忚斀 +* [鐒︾偣鍒楄〃] 淇鍦ㄨ繃鍥惧悗涓嶄細鑷姩鍔犺浇鏂板湴鍥炬暟鎹殑闂 +* [鑱婂ぉ鐩戞帶] 淇鏃堕棿鏄剧ず閿欒鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鏃х増鏁版嵁鍗囩骇鍚庢棤娉曟樉绀虹殑闂 +* [鑱婂ぉ璁板綍] 淇澶氶夊彸閿垹闄ゅ悗璁板綍鏈秷澶辩殑闂 +* [瀛椾綋璁剧疆] 淇璁剧疆鑷畾涔夋父鎴忓瓧浣撲細鎶ラ敊鐨勯棶棰 +* [鐩爣鐩戞帶] 淇姘斿姴鍓╀綑鏃堕棿鍋跺皵鍑虹幇璐熸暟鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 闄勫姞鎶ヨ鍐呭鏀逛负澶囨敞鍐呭骞跺彇娑堟樉绀 *(remake)* +* [鍥㈤槦闈㈡澘] 淇鍥㈤槦闈㈡澘璇煶鐘舵佹樉绀洪敊璇殑闂 +* [鍥㈤槦鐩戞帶] 淇鏃犳硶鎺ㄩ丅UFF鍥炬爣鍒板洟闃熼潰鏉跨殑闂 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鍥㈤槦閲嶈BUFF鐣岄潰鐐瑰嚮闃熷弸鍚嶅瓧涓嶈兘閫変腑鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 淇鏌ョ湅鍘熷鏁版嵁閫夐」鍑洪敊鐨勯棶棰 *(remake)* +* [鍥㈤槦鐩戞帶] 鍚堝苟鐒︾偣璁剧疆鍒癗PC鏍囩椤典腑鏂逛究缁熶竴璁剧疆 *(remake)* +* [鍥㈤槦鐩戞帶] 鍚勯」鑷畾涔夋枃鏈鍔犻暱搴﹂檺鍒跺拰鏁忔劅璇嶈繃婊ゅ姛鑳 *(remake)* +* [鍥㈤槦鐩戞帶] 璁剧疆鐣岄潰澧炲姞鍦板浘杩囨护鍣ㄨ緭鍏ユ *(remake)* +* [鍥㈤槦鐩戞帶] 浣跨敤鍏ㄦ柊鐨勫湴鍥惧垪琛ㄧ晫闈㈡牱寮 *(remake)* +* [鍥㈤槦鐩戞帶] 璁剧疆鐣岄潰鍏ㄩ儴鏁版嵁澧炲姞鍙抽敭涓閿竻绌洪夐」 *(remake)* + +## 鑼椾紛鎻掍欢闆 v135 + +* [鎻掍欢璧勬簮] 鏁村悎闈炲繀椤诲浘鍍忚祫婧愬埌璧勬簮鍖呬腑鍑忓皯鍩虹搴撳ぇ灏 +* [鑱婂ぉ鐩戞帶] 榛樿涓嶅啀鍕鹃夎繃婊ょ浉鍚屽唴瀹 +* [鑱婂ぉ澶嶅埗] 鏃堕棿瀛楃棰滆壊鏀逛负鍜屽悗缁唴瀹归鑹蹭竴鑷 +* [鑱婂ぉ璁板綍] 淇鑱婂ぉ璁板綍鏃犳硶瀵煎叆鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇鎸夐挳鑳屾櫙娑堝け鐨勯棶棰 +* [鑱婂ぉ璁板綍] 淇婊氬姩閿佸畾闂骞跺鍔犳柊娑堟伅鑷姩鍒锋柊鏈哄埗 +* [鑱婂ぉ璁板綍] 閲嶆瀯鑱婂ぉ璁板綍鏁版嵁搴撻泦缇ゅ紩鎿庤В鍐宠褰曡繃澶氶】鍗$殑闂 +* [娓告垙瀛椾綋] 瀛椾綋鏈慨鏀规椂涓嶅啀璁剧疆瀛椾綋鍑忓皯寮閿 +* [瑙掕壊澶囧繕] 搴旇姹傜Щ闄ゅ皬鏈湰閫氱敤鏁版嵁銆佸鍏ュ鍑虹殑鍔熻兘 +* [闂ㄦ淳鏌撹壊] 淇闂ㄦ淳鏌撹壊鍙兘鎶ラ敊鐨勯棶棰 +* [鐩爣鐩戞帶] 搴旇姹傜Щ闄ゅ唴缃粯璁ょ洰鏍囩洃鎺ф暟鎹 *(remake)* +* [鐩爣鐩戞帶] 淇璁剧疆鐣岄潰涓嶈兘姝e父鏄剧ず鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鑷畾涔夌晫闈笉鏄剧ず鏍囬鐨勯棶棰 *(remake)* +* [鍥㈤槦闈㈡澘] 搴斿畼鏂规ц兘瑕佹眰绉婚櫎榛樿鏁版嵁 +* [鑳屽寘鎼滅储] 淇鎸夐挳鑳屾櫙娑堝け鐨勯棶棰 +* [閲戝洟璁板綍] 淇鎷惧彇鐣岄潰涓嶈兘鍒ゆ柇閮ㄥ垎鐜勬櫠鍜屽皬閾佺殑闂 +* [閲戝洟璁板綍] 閲戝洟鎷惧彇绗簩蹇冩硶閫傜敤鐨勮澶囧彲浣跨敤榛勮壊鍕炬彁閱 +* [鐒︾偣鍒楄〃] 搴旇姹傜Щ闄ょ劍鐐瑰垪琛ㄥ唴缃暟鎹拰閫氱敤鏁版嵁瀵煎叆鍔熻兘 +* [鐒︾偣鍒楄〃] 搴旇姹傚睆钄介氳繃瑕嗙洊鐒︾偣閰嶇疆鏂囦欢杈惧埌瀵煎叆瀵煎嚭鐨勬柟娉 + +## 鑼椾紛鎻掍欢闆 v134 + +* [鍦板浘鎼滅储] 淇涓湴鍥炬悳绱笉鏄剧ず鐨勯棶棰 +* [鍦板浘鎼滅储] 淇涓湴鍥句笉鑳借嚜鍔ㄥ~鍐欒緭鍏ユ鐨勯棶棰 +* [鐩爣鐩戞帶] 澧炲姞鍒犻櫎鍐呯疆鐩戞帶鐨勫姛鑳 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞榛樿鏁版嵁瀵煎叆鍔熻兘 *(remake)* +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇鎶ラ敊鐨勯棶棰 +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇鍏戞崲鐗岀鍚堝績娉曞垽鏂棶棰 +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇鍒ゆ柇鏄惁绗﹀悎蹇冩硶鐨勯棶棰 +* [閲戝洟璁板綍] 閲戝洟璁板綍褰曞叆鐣岄潰鏀寔鍚屾椂璁板綍澶氫釜鍒嗛厤 +* [閲戝洟璁板綍] 澧炲姞璁板綍鐗╁搧鍜岀墿鍝佺粍涓婃鍒嗛厤瀵硅薄鐨勫姛鑳 +* [閲戝洟璁板綍] 淇閲戝洟鎷嶅崠鍑轰环鐣岄潰鍒嗛厤鎸夐挳澶辨晥鐨勯棶棰 +* [閲戝洟璁板綍] 閲戝洟鎷惧彇澧炲姞鎵归噺鍒嗛厤鍔熻兘 +* [閲戝洟璁板綍] 淇閲戝洟鎷惧彇姝﹀櫒鍒嗙被鍒ゆ柇閿欒鐨勯棶棰 +* [閲戝洟璁板綍] 閲戝洟鎷惧彇鍒嗛厤鑰呮ā寮忓鍔犺烦杩囪褰曠晫闈㈢殑鎻愮ず璇 + +## 鑼椾紛鎻掍欢闆 v133 + +* [鍩虹搴揮 鏇存柊鏂拌禌瀛e唴缃瓸UFF绛夋暟鎹 +* [鑱婂ぉ鍔╂墜] 淇鐣岄潰鑳屾櫙鍥鹃敊涔辩殑闂 +* [鐒︾偣鍒楄〃] 淇鐜╁鐒︾偣璺ㄦ湇鍔″櫒鍐茬獊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v132 + +* [鍩虹搴揮 澧炲姞缁熶竴鍑芥暟鍒ゆ柇鎻掍欢绂佺敤鍦板浘 +* [閲戝洟璁板綍] 鏄剧ず瑁呭鏄惁鍚堥傜殑鏄剧ず +* [閲戝洟鎷惧彇] 澧炲姞宸茶涔︾睄杩囨护鐨勯夐」 +* [閲戝洟鎷惧彇] 澧炲姞閫傚悎浠ュ強鏇村ソ瑁呭鐨勬彁绀 +* [閲戝洟鎷惧彇] 鎺夎惤鐗╁搧鎸夌収涓瀹氳鍒欐帓搴忔樉绀 +* [閲戝洟鎷惧彇] 鍒嗛厤澧炲姞鐗╁搧闇浜屾纭鐨勭被鍨嬭缃」 + +## 鑼椾紛鎻掍欢闆 v131 + +* [鍩虹搴揮 淇涓浜涙彃浠舵暟鎹畨鍏ㄦч棶棰 +* [缁勯槦鍔╂墜] 淇鍦ㄦ煇浜涙儏鍐典笅杩囨护鍔熻兘鏃犳晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v130 + +* [鍥㈤槦鍛婄ず] 淇杩囧浘鍚庢秷澶辩殑闂 +* [鑳屽寘鍔╂墜] 淇鑳屽寘瀵规瘮鍕鹃夋娑堝け鐨勯棶棰 +* [鑳屽寘鍔╂墜] 淇鑳屽寘鎼滅储鍏ュ彛娑堝け鐨勯棶棰 +* [閲戝洟璁板綍] 淇鍙戝竷娆犳鎸夐挳鍙兘鐐瑰嚮涓娆$殑闂 +* [閲戝洟璁板綍] 淇涓嶈兘姝g‘鍚屾鍥㈤暱鏁版嵁鐨勯棶棰 +* [缁勯槦鍔╂墜] 淇鍋跺皵鏄剧ず绌哄垪琛ㄦ鏋堕犳垚鍗¢】閿欒鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v129 + +* [鍩虹鏁版嵁] 鏇存柊100绾х巹鏅舵暟鎹 +* [鐒︾偣鍒楄〃] 浣嶇疆缂╂斁绛夌晫闈㈢浉鍏宠缃敼涓鸿鑹茬嫭绔 +* [鎴樻枟缁熻] 淇璁剧疆涓嶈兘淇濆瓨鐨勯棶棰 +* [澶撮《琛鏉 淇瑙掕壊姣忔鐧婚檰閮戒細璇㈤棶椋庢牸鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 淇鍦ㄦ湭鍕鹃夌郴缁熺晫闈㈠悓姝ユ湇鍔″櫒閫夐」鏃朵笉鍚岃处鍙风缉鏀句笉涓鑷寸殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v128 + +* [鍩虹搴揮 淇涓澶勮瑷缈昏瘧闂 +* [鐒︾偣鍒楄〃] 搴斿畼鏂硅姹傜姝㈢偣閫変笉鍙変腑鐨勭洰鏍 +* [鐒︾偣鍒楄〃] 淇鍒囨崲瑙掕壊鏃惰缃」浼氳閲嶇疆鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇瀵煎叆鑷姩瀵煎叆鏃х増鏁版嵁鐨勯棶棰 +* [娓告垙瀛椾綋] 鐙珛瀛椾綋璧勬簮 +* [娓告垙瀛椾綋] 瀛椾綋閫夋嫨鑷姩杩囨护鏃犳晥瀛椾綋 +* [缁勯槦鍔╂墜] 淇鑷姩鍚屾剰缁勯槦鏃犳晥鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇涓嶆樉绀虹洰鏍囩殑鐩爣鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v127 + +* [璇█鍖匽 澧炲姞鍙版湇鎻掍欢鎻忚堪鏂囦欢 +* [璇█鍖匽 淇鍘嗗彶閬楃暀鐨勮瑷缈昏瘧闂 +* [鎴樻枟鏂囧瓧] 杩涘叆鍗忚鍔ㄧ敾鏃堕殣钘忔垬鏂楁枃瀛 +* [鑱婂ぉ鍔╂墜] 淇鏈杩戣亰澶╀笉鑳借褰曠殑闂 +* [澶撮《琛鏉 杩涘叆鍗忚鍔ㄧ敾鏃堕殣钘忓ご椤惰鏉 *(remake)* +* [澶撮《琛鏉 鏁翠綋缂╂斁鏄剧ず鏁板间笉鍐嶉殢鐣岄潰缂╂斁鏀瑰彉 *(remake)* +* [鐒︾偣鍒楄〃] 淇閿欒鏄剧ず鐜╁蹇冩硶鍒癗PC涓婄殑闂 +* [鐒︾偣鍒楄〃] 浼樺寲缂╂斁淇濇寔閮ㄥ垎鍖哄煙姣斾緥鍥哄畾 +* [鐒︾偣鍒楄〃] 澧炲姞鏍峰紡鍒囨崲閫夐」骞惰浆涓哄叏灞璁剧疆 +* [鐒︾偣鍒楄〃] 淇灏忔湰鏈劍鐐硅仈鍔ㄥ湪澧炲姞鍒犻櫎鏃跺悓姝ラ棶棰 + +## 鑼椾紛鎻掍欢闆 v126 + +* [鐒︾偣鍒楄〃] 淇榛樿鐒︾偣鏁版嵁閿欒鐨勯棶棰 +* [澶撮《琛鏉 淇钃幈榛樿棰滆壊鐨勯棶棰 *(remake)* +* [鎴樻枟缁熻] 淇鍏ㄥ眬閰嶈壊鏃犳硶閫夋嫨鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v125 + +* [鍩虹搴揮 淇敼鍏ㄥ眬閰嶈壊鍜屽叏灞璁剧疆鐨勫浘鏍 +* [鍩虹搴揮 淇敼鍏ㄥ眬榛樿闂ㄦ淳鑳屾櫙閰嶈壊 +* [鎴樻枟缁熻] 淇棰滆壊閫夐」鑿滃崟鏂囧瓧閿欒鐨勯棶棰 +* [澶撮《琛鏉 淇琛鏉″湪鍟嗗煄涓繃鍥惧悗娑堝け鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v124 + +* [鍩虹搴揮 鏇存柊榛樿鏁版嵁 +* [鍩虹搴揮 寰皟钃幈閰嶈壊 +* [灏忔湰鏈琞 淇鍔犲叆闃熶紞鏃朵笉浼氭彁绀虹殑闂 +* [鎴樻枟缁熻] 閰嶈壊澧炲姞鍏ㄥ眬閰嶈壊鐨勯夐」 +* [闅忚韩渚跨] 澧炲姞瀛椾綋璁剧疆 +* [澶撮《琛鏉 搴斿畼鏂硅姹傜鐢ㄦ樉绀虹壒娈奛PC鐨勫姛鑳 *(remake)* +* [澶撮《琛鏉 璁剧疆椤圭粺涓澧炲姞鑴辨垬闅愯棌鐨勯夐」 *(remake)* +* [鐩爣鐩戞帶] 灏濊瘯淇鐩爣BUFF鍒锋柊鏃堕棿閿欒鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇璁剧疆椤瑰彸閿彃鍏ヤ綅缃敊璇殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v123 + +* [澶撮《琛鏉 淇缁樺埗鍦ㄨ繃鍥炬椂鍙兘鍋滄鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 淇鑷繁鍜屽綋鍓嶇洰鏍囪鏉″欢杩熺殑闂 *(remake)* +* [澶撮《琛鏉 淇鏁版嵁璺ㄦ湇鍚屾鏈畬鎴愭椂琛閲忔樉绀-1鐨勯棶棰 *(remake)* +* [鐗╁搧鎼滅储] 淇闈㈡澘鍑洪敊鏃犳硶浣跨敤鐨勯棶棰 +* [鐩爣鐩戞帶] 淇閮ㄥ垎瀹㈡埛绔缃晫闈㈡姤閿欎笉鏄剧ず鐨勯棶棰 *(remake)* +* [鎴樻枟鏂囧瓧] 瀛椾綋鎸夐挳澧炲姞褰撳墠瀛椾綋鎻愮ず +* [澶撮《琛鏉 淇闃熷弸璺熷疇鍒ゆ柇涓烘櫘閫歂PC鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v122 + +* [鍩虹搴揮 鏇存柊榛樿鏁版嵁 +* [鍏ㄥ眬璁剧疆] 淇鍏ㄥ眬闂ㄦ淳閰嶈壊鎭㈠榛樿鏃犳晥鐨勯棶棰 +* [鐩爣鐩戞帶] 鐙珛鍥炬爣鏂囧瓧缂╂斁璁剧疆閫夐」 *(remake)* +* [鐩爣鐩戞帶] 淇鏃犳硶鎷栧姩浣嶇疆鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鐣岄潰鍧愭爣鍙兘闅忔満婕傜Щ鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鐩戞帶鏄剧ず姣旂郴缁熷欢杩熶竴甯х殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鍥炬爣鍦ㄦ煇浜涙儏鍐典笅涓嶆樉绀虹殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇璁剧疆椤瑰彸閿彍鍗曚腑涓婁笅绉讳笉姝g‘鐨勯棶棰 *(remake)* +* [澶撮《琛鏉 浼樺寲缁樺埗鏂瑰紡闄嶄綆CPU寮閿 *(remake)* +* [甯哥敤宸ュ叿] 淇瀵硅瘽妗嗗悕瀛楁煋鑹叉姤閿欑殑闂 +* [鍥㈤槦宸ュ叿] 淇鏌ョ湅浠栦汉灞炴у姛鑳戒笉鍦ㄤ竴涓槦浼嶆椂鏃犳晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v121 + +* [鍩虹搴揮 鏇存柊榛樿鏁版嵁 +* [鐩爣鐩戞帶] 淇鍙冲榻愬拰灞呬腑瀵归綈鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鍒犻櫎璧勬簮鍖呭悗浼氬嚭鐜版湭鍛藉悕鏁版嵁鐨勯棶棰 *(remake)* +* [甯哥敤宸ュ叿] 淇杩涘叆鎴樺満绔炴妧鍦烘湁鍑犵巼鍑虹幇鏄剧ず鏃犲ご妯″瀷鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v120 + +* [鍩虹搴揮 绉诲姩榛樿鏁版嵁鍒板瓙鎻掍欢璧勬簮鍖呬腑鏂逛究闆嗕腑鏇存柊 +* [鐩爣鐩戞帶] 淇蹇嵎閿彇娑圔UFF鐨勫姛鑳 *(remake)* +* [鐩爣鐩戞帶] 淇鍗曡鏁伴噺闄愬埗鍙兘澶辨晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇璁剧疆鐣岄潰鐩戞帶椤瑰彸閿棤娉曟墦寮鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 閲嶇疆鏈湴鐩爣鐩戞帶鑴忔暟鎹鑷村叏閮ㄦ樉绀虹殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞涓浜涘嚱鏁板吋瀹归槻姝㈠嚭閿 *(remake)* + +## 鑼椾紛鎻掍欢闆 v119 + +* [鍩虹搴揮 涓築UFF鍜屾妧鑳界浉鍏冲嚱鏁板鍔犵紦瀛樻満鍒堕檷浣庡紑閿 +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [鑱婂ぉ璁板綍] 淇鏈鏂拌褰曟樉绀轰笉瀹屾暣鐨勯棶棰 +* [鑱婂ぉ璁板綍] 澧炲姞棰戦亾鍏ㄩ夋寜閽 +* [鑱婂ぉ璁板綍] 鍏抽棴鑱婂ぉ鐩稿叧瀹炴椂鍏ュ簱鍔熻兘闃叉纾佺洏IO鍗℃ +* [鑱婂ぉ璁板綍] 鏀寔鐩存帴浠庡唴瀛樹腑璇诲彇鏈繚瀛樼殑璁板綍浼樺寲IO鎬ц兘鐡堕 +* [鎵佸钩琛鏉 淇琛鏉″伓灏斾細閬尅鎶鑳芥爮鐨勯棶棰 +* [鎵佸钩琛鏉 淇鍔垮姏鍏崇郴鍒ゆ柇鍦ㄦ煇浜涙儏鍐典笅鎶婄孩鍚峃PC鍒ゆ柇涓虹豢鍚嶇殑闂 +* [鐩爣鐩戞帶] 淇鏂囧瓧缂╂斁瀵艰嚧鐭埆鍚嶅彲鑳借閬尅鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇缁撴潫鏃跺垎娈电壒鏁堥棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇BUFF涓庢妧鑳紺D鏃嬭浆鏂瑰悜閿欒闂 *(remake)* +* [鐩爣鐩戞帶] 淇BUFF涓庢妧鑳芥椂闂磋酱杩涘害鏂瑰悜閿欒闂 *(remake)* +* [鐩爣鐩戞帶] 淇璁剧疆鍥炬爣鑳屾櫙鏃犳晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇姣忚鏄剧ず涓涓棤娉曠敓鏁堢殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞褰撳墠闇鐩戞帶鐨勭洰鏍囩被鍨嬫帴鍙e噺灏戣绠楀紑閿 *(remake)* +* [鐩爣鐩戞帶] 淇璺濈杩囨护鍣ㄦ棤鏁堢殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞鍦板浘杩囨护鍣ㄩ檷浣嶤PU寮閿 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞婵娲荤姸鎬佺壒鏁堟鏄剧ず鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 鑾峰彇鑷韩褰撳墠蹇冩硶鍙敤鎶鑳藉嚱鏁板鍔犵紦瀛樻満鍒堕檷浣庡紑閿 *(remake)* +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶鍥炬爣鏄剧ず鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞鏃犲埆鍚嶆椂鏄剧ず鍘熷鍚嶇О鐨勯夐」 *(remake)* +* [鐩爣鐩戞帶] 淇鍊掕鏃跺瓧浣撻棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇蹇冩硶杩囨护鍣ㄩ棶棰 *(remake)* +* [鐩爣鐩戞帶] 蹇冩硶閫夋嫨鍣ㄦ敮鎸佽摤鑾遍棬娲惧績娉 *(remake)* +* [鐩爣鐩戞帶] 淇璁句负榛樿鏁版嵁鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 淇瀵煎叆瀵煎嚭鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 淇闀跨煭鍒悕涓嶈兘鍒犻櫎娓呯┖鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鍚岄槦浼嶇浉鍚屽績娉曢槦鍙婤UFF浼氶《鎺夎嚜宸辩殑BUFF鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞姣忔潯鏁版嵁鍙樉绀鸿嚜宸辩殑鎺у埗閫夐」 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞姣忔潯鏁版嵁涓嶆樉绀烘秷澶辨暟鎹殑鎺у埗閫夐」 *(remake)* +* [鐩爣鐩戞帶] 淇鑷姩鎹曡幏鍙兘浼氭崟鑾峰埌閿欒缂撳瓨鏁版嵁鐨勯棶棰 *(remake)* +* [鎴樻枟缁熻] 淇鎵夸激鏁版嵁璇︽儏涓嶆樉绀虹殑闂 +* [鐩爣杈呭姪] 搴旇姹傚叧闂彧鍏佽瀹樻柟鍒朵綔鐨勫ご椤惰繛绾垮姛鑳 +* [鍥㈤槦宸ュ叿] 澧炲姞钃幈闂ㄦ淳鍒扮粺璁″垪琛ㄤ腑骞舵敮鎸佽嚜鍔ㄦ墿鍏呮柊闂ㄦ淳 +* [鐒︾偣鍒楄〃] 淇鐩爣绫诲瀷杩囨护鍣ㄤ笉鏄剧ず鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇鍔垮姏鍏崇郴鍒ゆ柇鍦ㄦ煇浜涙儏鍐典笅鎶婄孩鍚峃PC鍒ゆ柇涓虹豢鍚嶇殑闂 + +## 鑼椾紛鎻掍欢闆 v118 + +* [鍩虹搴揮 澧炲姞璺濈璁$畻涓夌绠楁硶鐨勮缃 +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [鐩爣鐩戞帶] 淇鍐呯疆鏁版嵁鏇存柊鏃堕儴鍒嗘暟鎹笉鐢熸晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 鍐呭祵鏁版嵁鏀逛负鍝堝笇绱㈠紩鍔犲揩璁$畻鏁堢巼 *(remake)* +* [鐩爣鐩戞帶] 閲嶅啓鍔熻兘浠g爜閫昏緫瀹屾垚MVC鍒嗗眰閲嶆瀯闄嶄綆璧勬簮寮閿 *(remake)* +* [閲戝洟璁板綍] 淇鍘嗗彶鍒楄〃鎺掑簭涓嶆纭殑闂 +* [瑙掕壊鏌撹壊] 淇鐜╁鏂版暟鎹病鏈夋洿鏂扮殑闂 +* [鎵佸钩琛鏉 淇閫鍑哄晢鍩庢椂鍑虹幇绯荤粺琛鏉$殑闂 +* [鎵佸钩琛鏉 淇杩囧墽鎯呭悗浼氭樉绀轰袱涓换鍔″嵎杞寸殑闂 +* [閲戝洟缁熻] 淇鍥㈤槦灏忓憡绀烘绘槸灏戞帀鏈鍚庝竴浣嶇殑闂 +* [鍦板浘鎼滅储] 淇鍦ㄦ煇浜涙儏鍐典笅浼氭姤閿欏鑷存暟鎹棤娉曡褰曠殑闂 +* [鑱婂ぉ璁板綍] 淇鎼滅储鍘嗗彶缁撴灉涓嶅畬鏁寸殑闂 +* [鎴樻枟缁熻] 淇鍋跺皵浼氭樉绀烘棤鏁版嵁鐨勭粺璁$被鍨嬬殑闂 +* [鑳屽寘璁板綍] 淇鏁版嵁缂栫爜閿欒鐨勯棶棰 +* [鐩爣鐩戞帶] 鍒犻櫎浜戝垁鏁版嵁鐩稿叧鏀寔 *(remake)* +* [鎴樻枟缁熻] 瀹屽杽钃幈闂ㄦ淳棰滆壊 +* [鐩爣鐩戞帶] 搴旇姹備笉鍐嶅厑璁稿湪绔炴妧鍦轰腑鐩戞帶闅愯棌BUFF *(remake)* +* [鐩爣鐩戞帶] 淇闅愯棌BUFF鍙互琚彸閿彇娑堝鑷寸殑闂 *(remake)* +* [甯哥敤宸ュ叿] 鏇存柊100绾уぇ鎴樹俊鎭 +* [闂ㄦ淳鏌撹壊] 澧炲姞钃幈闂ㄦ淳棰滆壊璁剧疆 +* [鐩爣鐩戞帶] 鎼滅储妗嗗彲浠ョ洿鎺ヨ緭鍏ユ坊鍔犻」浜 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞鏂囧瓧缂╂斁鐨勫姛鑳 *(remake)* +* [鍘嗗彶鎶鑳絔 鍒楄〃涓笉鍐嶆樉绀鸿摤鑾遍閬ヤ紴鍑 +* [鐒︾偣鍒楄〃] 澧炲姞鐒︾偣瑙勫垯鏁屽鍏崇郴鐨勯夐」 +* [缁勯槦鍔╂墜] 淇杩囨护鏈弧绾ц繘缁勮姹傞敊璇垽鏂瓑绾у鑷100绾т緺澹笉鑳界粍闃熺殑闂 + +## 鑼椾紛鎻掍欢闆 v117 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [闂ㄦ淳鏌撹壊] 澧炲姞涓澶勮瑷缈昏瘧 +* [闂ㄦ淳鏌撹壊] 鍑忓皯澶氬紑瀹㈡埛绔椂鏁版嵁杩炴帴鍑洪敊鐨勫嚑鐜 + +## 鑼椾紛鎻掍欢闆 v116 + +* [闅忚韩渚跨] 淇鏌愪簺鎯呭喌涓嬫姤閿欑殑闂 +* [缁勯槦鍔╂墜] 淇鏌愪簺鎯呭喌涓嬫姤閿欑殑闂 +* [鑱婂ぉ鍒囨崲] 淇瀵嗚亰鎸夐挳鏈夊彲鑳芥寕鎺夌殑闂 +* [鎵佸钩琛鏉 淇鍋跺皵琛鏉′笉鏄剧ず鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 浼樺寲鏁版嵁杩炴帴鍋跺皵澶辫触鐨勯棶棰 +* [闂ㄦ淳鏌撹壊] 淇鏂扮殑鍚屽悕瑙掕壊鏁版嵁鏃犳硶瑕嗙洊鏃ф暟鎹殑闂 +* [闂ㄦ淳鏌撹壊] 淇鑱婂ぉ鏍忚鑹蹭俊鎭樉绀轰笉鑳芥纭幏鍙栧府浼氬悕绉扮殑闂 +* [闂ㄦ淳鏌撹壊] 淇杩囧浘/閫闃熷悗閲戝洟鍊掕鏃朵笉鍋滄鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v115 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [鍥㈤槦鍛婄ず] 鐐瑰嚮鍙戝竷鎸夐挳鏃 鍛婄ず璇︽儏涔熶細鍙戝竷涓娆′簡 + +## 鑼椾紛鎻掍欢闆 v114 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 + +## 鑼椾紛鎻掍欢闆 v113 + +* [璇█鍖匽 閲嶆柊鏁寸悊缈昏瘧绻佷綋璇█鍖呫佸ⅷ闆緞鏍℃ +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF銆佺洰鏍囩洃鎺ф暟鎹 + +## 鑼椾紛鎻掍欢闆 v112 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 + +## 鑼椾紛鎻掍欢闆 v111 + +* [鍥㈤槦闈㈡澘] 娌℃湁鍚敤鍥㈤槦闈㈡澘鏃朵笉鍐嶅脊鍑洪鏍奸夋嫨妗 +* [鎵佸钩琛鏉 澧炲姞鐣岄潰闅愯棌鏃跺欎粛鐒舵樉绀虹殑閫夐」 +* [鎵佸钩琛鏉 淇琛鏉″湪杩涘叆鍟嗗煄鏃舵病鏈夐殣钘忕殑闂 +* [鎴浘鍔╂墜] 淇鑷姩闅愯棌澶撮《瀵规墎骞宠鏉′笉鐢熸晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v110 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [鎵佸钩琛鏉 鏇存柊榛樿璁剧疆椤圭殑缂╂斁涓庨厤鑹蹭娇鍏舵洿缇庤 + +## 鑼椾紛鎻掍欢闆 v109 + +* [鍩虹搴揮 淇涓澶勫埛鏃ュ織鐨勯棶棰 +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [甯哥敤宸ュ叿] 淇璁板綍鐐瑰悕鍒板瘑鑱婇閬撳彲鑳介噸澶嶆樉绀轰袱涓殑闂 +* [鐒︾偣鍒楄〃] 淇鍚敤涓夌淮鍧愭爣璁$畻鏃惰窛绂婚檺鍒惰〃鐜颁笉姝g‘鐨勯棶棰 +* [鎵佸钩琛鏉 淇琛岄珮涓嶈兘鑷姩缂╂斁鐨勯棶棰 +* [鎵佸钩琛鏉 鍦ㄧ郴缁熺晫闈㈤殣钘忔椂鍊欎篃鑳芥樉绀轰簡 +* [鎵佸钩琛鏉 榛樿璁剧疆灏嗕笉鍐嶅彈鐢ㄦ埛鑷畾涔夌晫闈㈢缉鏀惧奖鍝嶅緱鍒颁笉鍚屾樉绀烘晥鏋滀簡 +* [鍥㈤槦闈㈡澘] 榧犳爣鍒掕繃BUFF鍥炬爣灏嗘樉绀烘潵婧愪俊鎭 +* [鍥㈤槦闈㈡澘] 淇鍚屾椂寮鍚噿浜烘彃浠舵椂鐣岄潰浼氬嚭鐜版湭鐩戞帶BUFF鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v108 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [鍥㈤槦闈㈡澘] 淇鏀惰捣闈㈡澘鏃犳晥鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 淇鐐瑰嚮淇濇寔鐜扮姸鍚庝笅娆′粛鐒朵細寮瑰嚭鐨勯棶棰 +* [鎵佸钩琛鏉 淇杩囧浘鍚庢爣璁颁細鍑虹幇澶氫釜閲嶅彔鐨勯棶棰 +* [鎵佸钩琛鏉 淇杩涘叆閫鍑洪槦浼嶆椂鍥㈤槦鏍囪娌℃湁鍒锋柊鐨勯棶棰 +* [鎵佸钩琛鏉 淇杩涘叆鎴樻枟鏃跺畼鏂硅鏉″彲鑳戒細鍑虹幇鐨勯棶棰 +* [鐩爣鐩戞帶] 淇鍙栨秷BUFF蹇嵎閿湪澶ф垬鏈笉鑳戒娇鐢ㄧ殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v107 + +* [榛樿鏁版嵁] 鏇存柊榛樿鍓湰鐒︾偣銆佸洟闃烞UFF鏁版嵁 +* [娑堟伅涓績] 淇娑堟伅涓績楂樺害涓嶆纭殑闂 +* [鍥㈤槦闈㈡澘] 灏忛槦妯″紡涔熷厑璁告姌鍙犻潰鏉夸簡 +* [鍥㈤槦闈㈡澘] 琛閲忛粯璁ゆ敼涓烘樉绀虹簿绠鏁板 +* [鍥㈤槦闈㈡澘] 淇鍒囨崲璁剧疆鏃舵病鏈夌珛鍗冲埛鏂扮敓鏁堢殑闂 +* [鎵佸钩琛鏉 澧炲姞鐣岄潰缂╂斁鐨勯夐」 +* [鎵佸钩琛鏉 澧炲姞鑷韩琛鏉℃绘槸澶勪簬鏈鍓嶇殑寮鍏 +* [鎵佸钩琛鏉 淇鐜╁琛鏉¢鑹茶缃姤閿欑殑闂 +* [鎵佸钩琛鏉 淇杩囧浘鍚庤嚜韬笉鍦ㄦ渶鍓嶇殑闂 +* [鎵佸钩琛鏉 淇鍐呰竟妗嗚繃澶у鑷存拺鍑鸿竟妗嗙殑闂 +* [鎵佸钩琛鏉 浼樺寲鏍规嵁浣嶇疆璋冩暣閬尅椤哄簭鐨勬ц兘娑堣 +* [鎵佸钩琛鏉 浼樺寲琛鏉″紑鍚椂澶撮《鏍囪鍥炬爣閲嶇粯閫熷害 +* [鎵佸钩琛鏉 澧炲姞澶撮《鏍囪鍗疯酱绔栫洿鍋忕Щ鍜岀缉鏀鹃夐」 +* [鑱婂ぉ鐩戞帶] 鏀寔鐩戞帶鍖呮嫭鍙戝竷鑰呭悕瀛楀湪鍐呯殑鎵鏈夊唴瀹逛簡 +* [鐒︾偣鍒楄〃] 浼樺寲鐒︾偣鍒楄〃鍒犻櫎閫昏緫 瑙e喅鏃犳硶鍒犻櫎鐒︾偣鐨勯棶棰 +* [鐒︾偣鍒楄〃] 榧犳爣鍒掕繃鐒︾偣鐣岄潰灏嗗湪鍙充笅瑙掓樉绀虹洰鏍囧拰鐒︾偣鏉ユ簮淇℃伅 + +## 鑼椾紛鎻掍欢闆 v106 + +* [鍩虹搴揮 鏇存柊榛樿鏁版嵁 +* [鐒︾偣鍒楄〃] 绉婚櫎澶辨晥鐨勫垹闄ゆ寜閽 +* [鍥㈤槦鍛婄ず] 淇鍙互鎷栧嚭鐣岄潰瀵艰嚧鏃犳硶鐐瑰嚮鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v105 + +* [鐩爣鐩戞帶] 鏇存柊榛樿鍓湰鏁版嵁 *(remake)* +* [鍥㈤槦宸ュ叿] 澧炲姞鍥㈤槦鍓湰CD淇℃伅鏌ョ湅 +* [鎵佸钩琛鏉 淇濊瘉鑷繁姘歌繙鍦ㄦ渶鍓 +* [鎵佸钩琛鏉 淇敼榛樿璁剧疆浣垮叾鏇寸編瑙 +* [鎵佸钩琛鏉 澧炲姞瀛楅棿璺濆拰缂╂斁璁剧疆 +* [鎵佸钩琛鏉 澧炲姞鎻忚竟瀹藉害鍜岄鑹茶缃 +* [鎵佸钩琛鏉 澧炲姞鏈澶ч珮搴﹀樊璁剧疆闃叉鐪嬪埌鍦颁笅绌垮澶撮《 +* [鎵佸钩琛鏉 淇璺濈闄愬埗娌℃湁璁$畻Z杞寸殑闂 +* [鎵佸钩琛鏉 淇鍋跺皵涓嶆樉绀洪儴鍒嗙帺瀹惰鏉$殑闂 +* [鍥㈤槦闈㈡澘] 涓嶅啀浣跨敤绐佸厐鐨勫ご椤舵姤璀 +* [澶撮《鎶ヨ] 鍒犻櫎绐佸厐鐨勫ご椤舵姤璀︽ā鍧 +* [鐒︾偣鍒楄〃] 淇涓嶈兘鏈灏忓寲鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇灏氭湭鍚屾瀹屾垚鐨勭帺瀹跺悕瀛楀彲鑳芥樉绀轰负鏁板瓧鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v104 + +* [鍩虹搴揮 鍥炬爣閫夋嫨鍣ㄤ笉鑳芥樉绀哄叏閮ㄥ浘鏍囩殑闂 +* [榛樿鏁版嵁] 鏇存柊鏂拌禌瀛e唴缃瓸UFF绛夋暟鎹 +* [鍥㈤槦闈㈡澘] 浜旀瘨閱夎垶鑼冨洿鍔熻兘瀹屽杽 +* [鐒︾偣鍒楄〃] 琛閲忓唴鍔涙暟鍊兼敼涓虹簿绠鏄剧ず妯″紡 +* [甯哥敤宸ュ叿] 淇鑷姩闅愯棌鑱婂ぉ鏍忎笉鑳藉彇娑堢殑闂 + +## 鑼椾紛鎻掍欢闆 v103 + +* [鎵佸钩琛鏉 淇鍙兘涓嶆樉绀洪儴鍒嗗ご椤剁殑闂 +* [鍘嗗彶鎶鑳絔 淇鍒楄〃涓嶆樉绀洪氶亾鎶鑳界殑闂 +* [娑堟伅涓績] 淇敼鐣岄潰鐨勪袱涓寜閽娇鍏舵洿缇庤 +* [鍥㈤槦闈㈡澘] 淇鐣岄潰缂╂斁鍚庣壒鏁堝ぇ灏忎笉姝g‘鐨勯棶棰 +* [鎴樻枟鏂囧瓧] 淇闀挎瓕鎺у埗浠栦汉鍚庢樉绀轰笉姝g‘鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇娌荤枟杈呭姪閫昏緫闂 +* [鍥㈤槦闈㈡澘] 鍥㈤槦BUFF澧炲姞鍙樉绀鸿嚜宸辩殑閫夐」 +* [鍥㈤槦闈㈡澘] 淇璀﹀憡鐘舵佸嚭鍚屾鑼冨洿鍥炴潵鐗规晥涓嶆秷澶辩殑闂 +* [鍘嗗彶鎶鑳絔 灞忚斀闀挎瓕鏅氭敾鍑荤殑鏄剧ず +* [鍥㈤槦闈㈡澘] 淇鎸変綇ALT鐐瑰嚮涓嶈兘閫変腑闃熷弸鐨勯棶棰 +* [鐒︾偣鍒楄〃] 淇瀛ゅ煄鐎氭捣涓彲浠ラ氳繃鐣岄潰妗嗘灦鍒ゆ柇闄勮繎鏈夋病鏈変汉鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v102 + +* [鐩爣鐩戞帶] 鏇存柊閮ㄥ垎BUFF鏁版嵁 *(remake)* +* [鐩爣鐩戞帶] 淇鍙抽敭鑿滃崟鍙兘鎶ラ敊鐨勯棶棰 *(remake)* +* [鎵佸钩琛鏉 灏濊瘯淇杩囧浘鍋跺皵閮ㄥ垎澶撮《娑堝け鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v101 + +* [娑堟伅涓績] 鏇存柊娑堟伅涓績鍏ュ彛鏄剧ず浣嶇疆 +* [鑱婂ぉ鐩戞帶] 淇鐩戞帶鏁伴噺鎶佃揪涓婇檺鏃舵樉绀洪敊涔辩殑闂 +* [鑱婂ぉ鐩戞帶] 淇鏃堕棿鎬绘樉绀轰负褰撳墠鏃堕棿鑰屼笉鏄秷鎭椂闂寸殑闂 +* [鐩爣鐩戞帶] 蹇冩硶瑕佹眰澧炲姞NPC绫诲瀷 *(remake)* +* [鐩爣鐩戞帶] 淇鍒囨崲蹇冩硶鏃跺垪琛ㄦ病鏈夊埛鏂扮殑闂 *(remake)* +* [鎴樻枟缁熻] 璋冩暣鐣岄潰瀹藉害涓庣郴缁熺晫闈㈠榻愭不鎰堝己杩棁 +* [BUFF鏁版嵁] 娣诲姞杩涙垬鍚庣殑[姊簯绾礭BUFF +* [BUFF鏁版嵁] 娣诲姞鑽昏姳鍗爾姊2娈佃烦鍚庣殑[閫冮伩]BUFF +* [BUFF鏁版嵁] 娣诲姞鐨囧[鍐伴瓌]BUFF +* [BUFF鏁版嵁] 淇閫愯檸椹辩嫾[鍦g値][瀵掓剰]BUFF鍥㈤槦闈㈡澘涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v100 + +* [鑱婂ぉ鐩戞帶] 淇鐩戞帶鏁伴噺杈惧埌璁剧疆涓婇檺鏃 涓嶄細鐩戞帶鏂板唴瀹圭殑闂 +* [娑堟伅涓績] 澧炲姞濂囬亣鏁版嵁鍒嗕韩寮鍏充互闃插鏃犻渶姹備緺澹犳垚鍥版壈 鏈夊織涔嬪+鍙墠寰鎻掍欢涓荤晫闈㈡墜鍔ㄥ紑鍚鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v99 + +* [鎻掍欢鏁版嵁] 鏇存柊閮ㄥ垎BUFF鏁版嵁 +* [鑱婂ぉ鐩戞帶] 淇婊氬姩鏉″伓灏斾細閿欎贡闂 +* [鍥㈤槦闈㈡澘] 淇鏈灏忓寲鏃舵柊灏忛槦鎴愬憳浼氭樉绀哄嚭鏉ョ殑闂 +* [鍥㈤槦闈㈡澘] 鍥㈤槦瑙f暎鏃惰嚜鍔ㄥ彇娑堟敹璧风姸鎬佷慨澶嶅啀娆¤繘缁勪笉鑳芥煡鐪嬬殑闂 + +## 鑼椾紛鎻掍欢闆 v98 + +* [鍥㈤槦鐩戞帶] 淇閮ㄥ垎鏁堟灉鍚嶇О閿欏埆瀛楅棶棰 *(remake)* +* [鎵佸钩琛鏉 鍒犻櫎鍥犳帴鍙i檺鍒跺け鏁堝凡涔呯殑鐩爣璇绘潯鏄剧ず鍔熻兘 +* [鐩爣鐩戞帶] 淇浠呬慨鏀圭洃鎺ч鑹叉椂瀵煎嚭鍐嶅鍏ヤ細涓㈠け鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v97 + +* [鍥㈤槦鐩戞帶] 鏇存柊BUFF鏁版嵁 *(remake)* +* [鐩爣鐩戞帶] 淇娌℃湁鐩爣鏃跺績娉曠洃鎺ф樉绀虹殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v96 + +* [鍩虹搴揮 淇绯荤粺娑堟伅涓嶈窡闅忕敤鎴疯亰澶╅厤鑹叉绘槸榛勮壊鐨勯棶棰 +* [鐩爣鐩戞帶] 淇涓嶅瓨鍦ㄧ殑BUFF浼氭樉绀烘渶鍚庢椂闂村拰灞傛暟鐨勯棶棰 *(remake)* + +## 鑼椾紛鎻掍欢闆 v95 + +* [鐩爣鐩戞帶] 璁剧疆鐣岄潰澧炲姞鎼滅储鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 淇蹇冩硶涓嶇鐨勭洃鎺т篃浼氭樉绀虹殑闂 *(remake)* +* [鍥㈤槦闈㈡澘] 澧炲姞ALT鏌ョ湅瑁呭鐨勫紑鍏 +* [鍥㈤槦闈㈡澘] 淇瀹樻柟鏍峰紡涓嬬绾块槦鍙嬭摑鏉′笉鏄剧ず鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 澧炲姞BUFF鎸変綇ALT鐐瑰嚮蹇熷彂甯冨埌鍥㈤槦鐨勯夐」 +* [鍦板浘鎼滅储] 淇涓嶈兘鏄剧ずNPC绉板彿鐨勯棶棰 +* [鍦板浘鎼滅储] 淇鎼滅储鍏朵粬鍦板浘鏃朵細鏄剧ず褰撳墠缂撳瓨鍦板浘鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v94 + +* [鐩爣鐩戞帶] 淇蹇冩硶閫夋嫨涓嶈兘澶氶夌殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞闀挎潯鍊掕鏃舵椂闂存樉绀虹殑寮鍏 *(remake)* +* [鑱婂ぉ璁板綍] 淇鑱婂ぉ璁板綍瀵煎嚭鎶ラ敊鐨勯棶棰 +* [鎴樻枟鏃ュ織] 淇鍋忕闂伩绛夎褰曟暟閲忔樉绀轰笉姝g‘鐨勯棶棰 +* [鍥㈤槦闈㈡澘] 鍙抽敭澧炲姞鍔犲叆鐒︾偣鐨勯夐」 +* [鍥㈤槦闈㈡澘] 榛樿涓嶈兘鍦ㄦ垬鏂椾腑ALT鏌ョ湅瑁呭闃叉璇Е +* [鍥㈤槦闈㈡澘] 淇鎸変綇ALT鍦˙UFF涓婁笉鑳芥嫋鎷借皟闃熺殑闂 +* [鍥㈤槦闈㈡澘] 淇璁剧疆鍋跺皵浼氶噸缃殑闂 浼樺寲璁剧疆鐣岄潰甯冨眬 +* [鍥㈤槦闈㈡澘] 淇娌荤枟杈呭姪涓嬮暱姝屾湰浣撶偣鍑讳笉鑳介攣瀹氶棶棰 +* [鍥㈤槦闈㈡澘] 淇鏂伴槦鍙嬭繘鍏ュ満鏅椂鐨凚UFF涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v93 + +* [鑳屽寘鎼滅储] 淇涓嶈兘鍒犻櫎鍘嗗彶瑙掕壊鏁版嵁鐨勯棶棰 +* [閲戝洟璁板綍] 淇閲戝洟璁板綍鍔犺浇鍘嗗彶璁板綍鍒楄〃鍙兘鍑洪敊鐨勯棶棰 +* [鎵佸钩琛鏉 鑷繁鐨勫悕瀛楅粯璁ゅ湪鏈鍓嶉潰 +* [鐩爣鐩戞帶] 瓒呰繃涓灏忔椂鐨凚UFF涓嶅啀鏄剧ず鏃堕棿 *(remake)* +* [鐩爣鐩戞帶] 淇敼鐩爣鐩戞帶蹇冩硶璁剧疆鏂瑰紡 闃叉钘忓墤鍒囧績娉曢】鍗 *(remake)* +* [鍥㈤槦闈㈡澘] 鍥㈤槦闈㈡澘澧炲姞BOSS鐐瑰悕璀﹀憡 +* [鍥㈤槦闈㈡澘] 鏍囬鏍忓鍔犲洟闃熷伐鍏峰拰鍥㈤槦灏忓憡绀轰互鍙婃姌鍙犳寜閽 +* [鍥㈤槦闈㈡澘] 鎸変綇ALT鐐瑰嚮闈㈡澘涓婄殑BUFF鍙互蹇熷彂甯冨埌鍥㈤槦棰戦亾 +* [鍥㈤槦闈㈡澘] 璇讳笉鍒板績娉曟椂涓嶅啀鏄剧ず濂囨殑鍥炬爣鏀逛负鏄剧ず闂彿 +* [鍥㈤槦闈㈡澘] BUFF璁剧疆鏀逛负鐣岄潰閰嶇疆鍚屾椂鏀寔鍘熸枃鏈厤缃 +* [鍥㈤槦闈㈡澘] 澧炲姞BUFF閬尅鍐呭姏銆佽閲忓皬鏁扮偣銆佸悕瀛楄閲忓榻愭柟寮忕瓑璁剧疆 +* [鍥㈤槦闈㈡澘] 淇瀛ゅ煄鐎氭捣姝讳骸鍚庝笉鑳藉垏鎹㈣瑙掔殑闂 +* [鎴樻枟缁熻] 淇鍛戒腑鏁伴噺鏄剧ず涓嶆纭殑闂 +* [鎴樻枟缁熻] 淇鎴樻枟缁熻璇︽儏闈㈡澘璺宠浆鍏朵粬缁熻鏍囬涓嶆纭殑闂 +* [涓湴鍥炬悳绱 涓嶅啀璁板綍璺ㄦ湇涓殑鍦板浘鐗╁搧濡傜珵鎶鍦恒佹垬鍦轰腑 + +## 鑼椾紛鎻掍欢闆 v92 + +* [鍥㈤槦宸ュ叿] 澧炲姞璁剧疆闈㈡澘 +* [鍥㈤槦宸ュ叿] 鍥㈤槦灏忓憡绀哄吋瀹规噿浜烘暟鎹 +* [鍥㈤槦宸ュ叿] 淇鏌ョ湅灞炴IP鏄剧ず涓嶆纭殑闂 +* [鍥㈤槦妗嗘灦] 澧炲姞鏄剧ず瀹樻柟闈㈡澘鏁版嵁鍔熻兘 +* [鍥㈤槦妗嗘灦] 澧炲姞鍒犻櫎榛樿鏁版嵁鏉$洰鐨勯厤缃 +* [鍥㈤槦妗嗘灦] 鍥㈤槦璀﹀憡鑹插拰璀﹀憡鐗规晥澧炲姞寮鍏 +* [鍥㈤槦妗嗘灦] 鍒犻櫎榛樿BUFF鏁版嵁涓殑鐢熸伅绛 +* [鍥㈤槦妗嗘灦] 淇闃熷弸鍒囧績娉曞姩鐢讳笉鏄剧ず鐨勯棶棰 +* [鍥㈤槦妗嗘灦] 淇娌荤枟杈呭姪榧犳爣蹇熸粦鍔ㄥ埌BUFF涓婃棤娉曢変腑鐩爣鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v91 + +* [鐣岄潰搴揮 淇閮ㄥ垎鎸夐挳涓嶆樉绀鸿儗鏅殑闂 +* [鍏ㄥ眬閰嶈壊] 澧炲姞鎻掍欢鍏ㄥ眬閰嶈壊璁剧疆 +* [闂ㄦ淳鏌撹壊] 闂ㄦ淳鏌撹壊浣跨敤鎻掍欢鍏ㄥ眬閰嶈壊 +* [閲戝洟璁板綍] 瀹屽杽鎷惧彇闈㈡澘鏁d欢鑰佹澘鎸夐挳鎻愮ず璇 +* [閲戝洟璁板綍] 淇鎷惧彇鐣岄潰鍙抽敭鎷嶅崠鍔熻兘鏃犳晥鐨勯棶棰 +* [閲戝洟璁板綍] 淇閲戝洟璁板綍淇濆瓨鏃舵枃浠跺悕涓嶆槸璁板綍寮濮嬫椂闂寸殑闂 +* [閲戝洟璁板綍] 淇濆瓨鏃跺鍔犺褰曞紑濮嬪湴鍥惧悕绉版柟渚挎棩鍚庢煡璇 +* [鐒︾偣鍒楄〃] 澧炲姞寰幆閫夋嫨蹇嵎閿 +* [鐒︾偣鍒楄〃] 淇鍙互姘镐箙鐒︾偣鏁屾柟闀挎瓕鐨勯棶棰 +* [鎵佸钩琛鏉 淇鏁屾柟闀挎瓕鍜屽叾浠朜PC琛鏉¤〃鐜颁笉涓鑷村鑷村鏄撹闆嗙伀鐨勯棶棰 +* [鎴樻枟缁熻] 璇︽儏闈㈡澘鐐瑰嚮鍚嶅瓧鍙抽敭鍙互蹇熸煡鐪嬭鐩爣鐨勬暟鎹簡 +* [鎴樻枟缁熻] 鍙互鍖哄垎HOT涓嶥OT浜 +* [鎴樻枟缁熻] 澧炲姞鍖哄垎鍚屽悕鎶鑳/鐩爣鐨勯夐」 +* [鎴樻枟缁熻] 淇璇︽儏椤电櫨鍒嗘瘮灏忔暟鐐规案杩滄槸0鐨勯棶棰 +* [鐩爣鐩戞帶] 淇鍒囨崲蹇冩硶鐣岄潰娌℃湁鍒锋柊鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鍓湰涓揩鎹烽敭鐐规帀BUFF鍔熻兘鏃犳晥鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇鑷韩鎶鑳界洃鎺ч湼鍒鏁f祦闇炰笉浼氳嚜鍔ㄦ仮澶嶇偣鐨勯棶棰 *(remake)* +* [鍥㈤槦妗嗘灦] 鍚嶅瓧鍜岃鏉′娇鐢ㄦ彃浠跺叏灞閰嶈壊 +* [鍥㈤槦妗嗘灦] 淇鍒囨崲鏍峰紡涓嶈兘绔嬪嵆鐢熸晥鐨勯棶棰 +* [鍥㈤槦妗嗘灦] 淇Ctrl+鐐瑰嚮鍥㈤槦鎴愬憳涓嶈兘璐村悕瀛楃殑闂 +* [鍥㈤槦妗嗘灦] 淇绔炴妧鍦鸿繃鍥惧畬鎴愬悗鍙兘鍔犺浇涓嶆甯哥殑闂 +* [鍥㈤槦妗嗘灦] 瀹屽杽鍥㈤槦妗嗘灦銆佽皟鏁寸粏鑺傘佷慨澶嶅寘鎷不鐤楄緟鍔╁湪鍐呯殑澶氶」闂 + +## 鑼椾紛鎻掍欢闆 v90 + +* [鐩爣鐩戞帶] 淇鍙抽敭鐐瑰嚮BUFF鐩戞帶涓嶈兘鍙栨秷BUFF鐨勯棶棰 *(remake)* +* [浠囨仺缁熻] 淇浠囨仺缁熻鏈鍚庝竴濂桿I鏄剧ず闂 +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶鍦ㄧ獥鍙eぇ灏忔敼鍙樻椂鎶ラ敊鐨勯棶棰 *(remake)* +* [鍥㈤槦宸ュ叿] 淇鍥㈤槦宸ュ叿涓嶈兘鏄剧ず纾ㄧ煶TIP鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v89 + +* [鎴樻枟鏂囧瓧] 浼樺寲璁剧疆鐣岄潰鐨勫竷灞 +* [鎴樻枟鏂囧瓧] 淇璁剧疆鏍煎紡鍚庝笉鏄剧ず鐨勯棶棰 +* [鐒︾偣鍒楄〃] 绂佹鐒︾偣鏁屾柟闀挎瓕娓呯粷褰辨瓕 +* [鑱婂ぉ杩囨护] 淇璁剧疆鐣岄潰鎬绘槸鏄剧ず涓烘湭鍚敤鐨勯棶棰 +* [鐩爣鐩戞帶] 淇闀垮埆鍚嶆棤娉曚繚瀛樼殑闂 *(remake)* +* [鐩爣鐩戞帶] 澧炲姞鑷姩鎹曡幏鐩戞帶ID鐨勯夐」 *(remake)* +* [鐩爣鐩戞帶] 淇鑷姩鎹曡幏鐩戞帶ID鏃舵绘槸榛樿鍚敤鐨勯棶棰 *(remake)* +* [鐩爣鐩戞帶] 淇娣诲姞鐩戞帶鏁堟灉绛夌骇涓嶈繛缁椂璁剧疆椤规棤娉曟樉绀虹殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v88 + +* [鎴樻枟鏂囧瓧] 鍚堝苟鍘熻強鑺辨垬鏂楁枃瀛 +* [浠囨仺缁熻] 鍚堝苟鍘熻強鑺变粐鎭ㄧ粺璁 +* [鍥㈤槦鎻掍欢] 鍚堝苟鍘熻強鑺卞洟闃熸彃浠 +* [鐩爣鐩戞帶] 澧炲姞鑷畾涔夊瓧浣撻鑹茬殑鍔熻兘 *(remake)* +* [鐩爣鐩戞帶] 璁剧疆鐣岄潰澧炲姞鎵嬪姩鐩存帴娣诲姞ID鐨勫姛鑳 *(remake)* +* [鐩爣鐩戞帶] 鐩爣鐩戞帶鍙互鍖哄垎涓嶅悓绛夌骇鐨凚UFF浜 *(remake)* +* [鐒︾偣鍒楄〃] 绂佹鍦ㄧ珵鎶鍦轰腑鐒︾偣鏁屾柟闀挎瓕鍒囧墤鏈綋 +* [鎴樻枟缁熻] 澧炲姞鍙戝竷鎴樻枟璇︽儏鍒拌亰澶╅閬撶殑鍔熻兘 +* [鎴樻枟缁熻] 鍙戝竷鍒拌亰澶╅閬撴椂鏀逛负鍗虫椂閫夋嫨鍙戝竷鏁伴噺 +* [鎵佸钩琛鏉 鍙栨秷鑷姩鏄剧ず鏁屾柟娓呯粷姝屽奖澶撮《鐨勫姛鑳 +* [閲戝洟璁板綍] 淇鐗╁搧鍒嗛厤鍚庨噾鍥㈡嬀鍙栫晫闈笉浼氳嚜鍔ㄥ埛鏂扮殑闂 +* [閲戝洟璁板綍] 娓呯┖璁板綍鏃跺皢鑷姩淇濆瓨鍒板巻鍙茶褰 +* [閲戝洟璁板綍] 淇娣诲姞鐣岄潰鍘熷洜杈撳叆妗嗕笅鎷夌偣鍑绘棤鏁堢殑闂 +* [閲戝洟璁板綍] 澧炲姞鍒嗛厤鑰呭悓姝ヨ褰曠粰鍥㈤槦鐨勯夐」 + +## 鑼椾紛鎻掍欢闆 v87 + +* [閲戝洟璁板綍] 淇鏃犳硶鍒嗛厤鐗╁搧鐨勯棶棰 +* [閲戝洟璁板綍] 淇鎵嬪姩娣诲姞璁板綍鏃朵細鍑虹幇閲嶅鐨勪袱鏉¤褰曠殑闂 +* [閲戝洟璁板綍] 褰撳叧闂噾鍥㈣褰曞惎鐢ㄥ紑鍏冲悗灏嗕笉鍐嶅脊鍑洪噾鍥㈡嬀鍙栫晫闈 + +## 鑼椾紛鎻掍欢闆 v86 + +* [閲戝洟璁板綍] 閲嶆柊缁樺埗鎷惧彇鐣岄潰浣垮叾鏇寸編瑙 + +## 鑼椾紛鎻掍欢闆 v85 + +* [鎻掍欢鐣岄潰] 淇鐣岄潰杩囧皬鏃堕《閮ㄨ儗鏅秴鍑虹殑闂 +* [澶撮《琛鏉 搴旇姹傚湪瀛ゅ煄鐎氭捣妯″紡涓鐢ㄥご椤惰鏉℃樉绀 *(remake)* +* [鑱婂ぉ璁板綍] 淇鑱婂ぉ璁板綍寮傚父鏄剧ず鍑烘崲琛岀殑闂 +* [鑱婂ぉ璁板綍] 淇閮ㄥ垎瑙掕壊鑱婂ぉ璁板綍鐣岄潰閿欎贡鐨勯棶棰 +* [甯哥敤宸ュ叿] 淇澶ф垬娌′氦鎻愮ず涓嶈兘鏄剧ず鐨勯棶棰 +* [閲戝洟璁板綍] 鎺ョ鑿婅姳閲戝洟璁板綍寮濮嬫彁渚涙棩鍚庣淮鎶ゅ伐浣 + +## 鑼椾紛鎻掍欢闆 v84 + +* [鎻掍欢鐣岄潰] 閲嶅埗骞惰皟鏁寸晫闈㈣祫婧 + +## 鑼椾紛鎻掍欢闆 v83 + +* [鐒︾偣鍒楄〃] 澧炲姞鏄惁鏄剧ず涓轰笁缁村潗鏍囪窛绂荤殑寮鍏 +* [鑳屽寘鎼滅储] 淇甯細浠撳簱鎼滅储澶辨晥鐨勯棶棰 +* [鑱婂ぉ杩囨护] 淇杩囨护璁剧疆涓嶈兘鏄剧ず鐨勯棶棰 +* [鑱婂ぉ鐩戞帶] 淇鐩戞帶鏄剧ず鐣岄潰鏂囧瓧閲嶅彔鐨勯棶棰 +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶鍙冲榻愪細瓒呭嚭鐣岄潰鐨勯棶棰 *(remake)* +* [鑱婂ぉ鍔╂墜] 淇鑱婂ぉ棰戦亾鍒囨崲鏉″ぇ灏忎笉姝g‘瀵艰嚧鎹㈣鐨勯棶棰 +* [鍦板浘鎼滅储] 淇鍒囨崲鍦板浘鍚庢病鏈夐噸鏂扮粯鍒舵悳绱㈢粨鏋滅殑闂 +* [鎻掍欢鐣岄潰] 淇蹇熻繛缁墦寮鎻掍欢涓荤晫闈細瀵艰嚧鐣岄潰鍗′綇鐨勯棶棰 +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶寮鍚厑璁告嫋鍔ㄥ悗浣嶇疆澶у皬涓嶆纭殑闂 *(remake)* +* [鐩爣鐩戞帶] 淇鐩爣鐩戞帶璁剧疆椤逛腑鐨勬妧鑳芥晥鏋滃浘鏍囨樉绀洪敊涔辩殑闂 *(remake)* + +## 鑼椾紛鎻掍欢闆 v82 + +* [鐩爣鐩戞帶]瓒呰繃涓灏忔椂鐨凚UFF鏃堕棿涓嶅啀鏄剧ず绉掓暟 *(remake)* +* [鐩爣鐩戞帶]浼樺寲浠g爜鏁堢巼浠ュ強鐣岄潰鎺掑竷浣垮叾鏇寸編瑙傚ソ鐢 *(remake)* +* [鏁版嵁鍚屾]淇敼閮ㄥ垎鐣岄潰璁剧疆淇濆瓨鍒版湇鍔$ +* [鑱婂ぉ璁板綍]淇鑱婂ぉ璁板綍涓嶈兘瀵煎叆鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v81 + +* [鐩爣鐩戞帶] 搴旂瓥鍒掗渶姹傚睆钄藉彇娑圔UFF蹇嵎閿殑鍔熻兘 *(remake)* + +## 鑼椾紛鎻掍欢闆 v80 + +* [BUFF鐩戞帶] 浼樺寲浣嶇疆淇濆瓨涓庤鍙栫殑閫昏緫 +* [BUFF鐩戞帶] 淇鍕鹃夐殣钘忔秷澶盉UFF鏃剁晫闈㈡樉绀轰笉姝g‘鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v79 + +* [鑱婂ぉ鐩戞帶]淇鏃堕棿涓嶆樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v78 + +* [鎻掍欢鐗堟湰]鍚屾闄嗘湇鎻掍欢鐗堟湰鍙 + +## 鑼椾紛鎻掍欢闆 v77 + +* [BUFF鐩戞帶]淇鍒囨崲蹇冩硶鍗¢】鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v76 + +* [鐒︾偣鍒楄〃]淇鍒囨崲鍦板浘鐒︾偣渚濇棫鍦ㄥ睆骞曚笂鐨勯棶棰 +* [鑳屽寘鎼滅储]澧炲姞鎼滅储缁撴灉鏁伴噺鏄剧ず +* [鑱婂ぉ杩囨护]淇鍒峰睆灞忚斀鐩稿悓鍐呭鐨勬彃浠跺枈璇濆け鏁堢殑闂 + +## 鑼椾紛鎻掍欢闆 v75 + +* [鑳屽寘鎼滅储]鑳屽寘鎼滅储瑙掕壊鍒楄〃瓒呭嚭婊氬姩鍖哄煙鐨勯棶棰 +* [鑳屽寘鎼滅储]鑳屽寘鎼滅储澧炲姞鍒犻櫎鎸囧畾瑙掕壊鏁版嵁鐨勬寜閽 +* [鐒︾偣鍒楄〃]鐒︾偣鍒楄〃澧炲姞浠呭湪鍏叡鍦板浘鑷姩鐒︾偣鐨勯夐」 + +## 鑼椾紛鎻掍欢闆 v74 + +* [鍘嗗彶鎶鑳絔淇鏌愪簺鎯呭喌涓嬫妧鑳藉姩鐢讳細鍗′綇鐨勯棶棰 +* [鐒︾偣鍒楄〃]鐒︾偣閿佸畾鍔熻兘鍦ㄧ洰鏍囧洖鍒伴檮杩戞椂缁х画閿佸畾 +* [甯哥敤宸ュ叿]瑙e喅JJC鑷姩鏄剧ず鐜╁涓庢捣槌楁敾闃插睆钄藉啿绐佺殑闂 + +## 鑼椾紛鎻掍欢闆 v73 + +* [鐒︾偣鍒楄〃]淇涓嶈兘鐒︾偣鐜╁鐨勯棶棰 +* [甯哥敤宸ュ叿]鏂板杩涘叆绔炴妧鍦烘垬鍦鸿嚜鍔ㄥ彇娑堝睆钄界殑鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v72 + +* [甯哥敤宸ュ叿]淇閮ㄥ垎瑙掕壊璁剧疆鐣岄潰鍔犺浇涓嶅畬鍏ㄧ殑闂 + +## 鑼椾紛鎻掍欢闆 v71 + +* [鑱婂ぉ鐩戞帶]淇鐩戞帶鍏抽敭瀛椾笉鑳戒繚瀛樼殑闂 + +## 鑼椾紛鎻掍欢闆 v70 + +* [鍩虹搴揮瑙e喅绗竴娆¤繘鍏ユ父鎴忔彁绀烘棤娉曡繛鎺ユ暟鎹簱鐨勯棶棰 +* [鑱婂ぉ璁板綍]寮鍚疄鏃跺叆搴撻夐」鍚 鏂扮殑鑱婂ぉ浼氬疄鏃跺埛鏂板埌鐣岄潰涓 +* [鑳屽寘鎼滅储]浠庡父鐢ㄥ伐鍏蜂腑鍒嗙鍑烘潵 鍙互鎸夐渶鍔犺浇璇ュ瓙鎻掍欢 + +## 鑼椾紛鎻掍欢闆 v69 + +* [鑱婂ぉ璁板綍]鏁版嵁鍒嗚〃瀛樺偍浼樺寲鎬ц兘瑙e喅閲忓ぇ椤垮崱鐨勯棶棰 +* [鑱婂ぉ璁板綍]淇鏌愪簺鎯呭喌涓嬪垹闄ゅけ璐ョ殑闂 +* [鑱婂ぉ璁板綍]澧炲姞浼樺寲鍘嬬缉鏁版嵁搴撶殑鍔熻兘鎸夐挳 +* [鑱婂ぉ璁板綍]澧炲姞浠庢枃浠跺鍏ヨ亰澶╂暟鎹殑鍔熻兘 +* [鑱婂ぉ璁板綍]淇鑱婂ぉ璁板綍鎼滅储涓嶅叏鐨勯棶棰 +* [鑱婂ぉ璁板綍]娣诲姞閲嶅缓绱㈠紩淇鍘嗗彶璁板綍鎼滅储鐨勬寜閽 +* [鑱婂ぉ璁板綍]鏀寔鎸変綇SHIFT鍜孋TRL澶氶夊垹闄よ褰曠殑鍔熻兘 +* [鑱婂ぉ璁板綍]澧炲姞鑱婂ぉ鐩戞帶璁板綍鐨勯閬 +* [鑱婂ぉ璁板綍]澧炲姞妫娴嬫暟鎹畬鏁存у苟鑷姩淇鎰忓閫鍑烘父鎴忓鑷存暟鎹彈鎹熺殑鍔熻兘 +* [鑱婂ぉ璁板綍]浼樺寲鍔犺浇閫昏緫瑙e喅鍙兘閫犳垚鐧诲綍椤垮崱鐨勯棶棰 +* [鑱婂ぉ璁板綍]澧炲姞瀹炴椂鍏ュ簱閰嶇疆椤逛緵鏈哄櫒杈冨ソ鐨勭帺瀹朵娇鐢 +* [鍦板浘鎼滅储]浼樺寲浠g爜瑙e喅涓浜涜褰曟悳绱笉鍒扮殑闂 + +## 鑼椾紛鎻掍欢闆 v68 + +* [鑱婂ぉ杩囨护]鏌愪簺瀵嗚亰甯細鑱婂ぉ涓嶈兘灞忚斀鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v67 + +* [鍩虹搴揮BOSS鍒楄〃姣忔閮戒細閲嶆柊鐢熸垚鐨勯棶棰 +* [鑱婂ぉ璁板綍]鍙兘缈诲埌绗0椤电殑闂 +* [鑱婂ぉ璁板綍]璁╄亰澶╄褰曢粯璁ら〉鎬绘槸缈诲埌鏈鍚庝竴椤 +* [鑱婂ぉ璁板綍]璁颁綇鍕鹃夌殑棰戦亾涓嬫鎵撳紑淇濇寔鍘熸牱 +* [鑱婂ぉ璁板綍]鏌愪簺鎯呭喌涓嬩笉鑳藉彸閿鍒剁殑闂 + +## 鑼椾紛鎻掍欢闆 v66 + +* [闂ㄦ淳鏌撹壊]淇闂ㄦ淳鏌撹壊涓嶆樉绀虹殑闂 +* [鑱婂ぉ璁板綍]浼樺寲鑱婂ぉ璁板綍瑙e喅娓告垙涓】鍗$殑闂 +* [鑱婂ぉ璁板綍]鑱婂ぉ璁板綍涓敮鎸佸悕瀛楀拰閾炬帴鐐瑰嚮鐨勫姛鑳 +* [鑱婂ぉ璁板綍]鏂板澶村儚鍙抽敭鍏ュ彛鍜屽揩鎹烽敭寮鍏 +* [鑱婂ぉ璁板綍]鎵撳紑鍚庨粯璁ゆ樉绀哄湪鏈鍚庝竴椤靛嵆鏈鏂颁綅缃 +* [鑱婂ぉ璁板綍]鏂板涓閿煡鐪嬪崟鐙閬撶殑鍔熻兘 +* [闂ㄦ淳鏌撹壊]淇娓呯┖鏁版嵁鎸夐挳澶辨晥鐨勯棶棰 +* [鑱婂ぉ鐩戞帶]淇鑱婂ぉ鐩戞帶澹伴煶涓嶈兘鎾斁鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v65 + +* [鑱婂ぉ杩囨护]娣诲姞閬楁紡鐨勭郴缁熼閬 +* [寮у舰琛鏉闇稿垁闂ㄦ淳涓嶅啀鏄剧ず鍐呭姏鏉 +* [鑱婂ぉ璁板綍]涓存椂绂佺敤閲嶄激璁板綍鍜屼氦鏄撴祦姘撮槻姝㈤】鍗 +* [闂ㄦ淳鏌撹壊]涓㈠純鏃х増缂撳瓨鏁版嵁闃叉瀹㈡埛绔姞杞界紦鎱 +* [鑱婂ぉ璁板綍]鏂板鎸夐挳鍙互涓閿煡鐪嬪崟涓閬撹褰 +* [鑱婂ぉ璁板綍]鐣岄潰浣嶇疆缁忓父鎭㈠鍒版父鎴忎腑澶殑闂 + +## 鑼椾紛鎻掍欢闆 v64 + +* [缁撴瀯璋冩暣]澶ч噺閲嶆瀯浠g爜 浼樺寲鎬ц兘 +* [鎴樻枟缁熻]闇稿垁棰滆壊鏄剧ず閿欒鐨勯棶棰 +* [闂ㄦ淳鏌撹壊]閲嶆瀯闂ㄦ淳鏌撹壊浠g爜 瑙e喅瀵艰嚧涓诲煄椤垮崱鐨勯棶棰 +* [鑱婂ぉ璁板綍]閲嶆瀯鑱婂ぉ璁板綍 澧炲姞鑱婂ぉ璁板綍鎼滅储鐨勫姛鑳 +* [甯哥敤宸ュ叿]鍘嗗彶鎶鑳藉垪琛ㄦ樉绀轰腑灞忚斀闇稿垁鐨勬櫘閫氭敾鍑 +* [鐒︾偣鍒楄〃]鏂板娌荤枟杈呭姪鐨勫姛鑳 鍙互涓嶇敤鐐瑰嚮鍗冲彲閫変腑鐩爣 +* [鏁版嵁鍌ㄥ瓨]璋冩暣瑙掕壊閰嶇疆鏁版嵁瀛樺偍浣嶇疆 鏂逛究鍒犻櫎鏁版嵁 +* [鍦板浘鎼滅储]浼樺寲璁板綍瀛樺偍鏂瑰紡 澶уぇ鍔犲揩鎼滅储閫熷害 +* [鑱婂ぉ杩囨护]閲嶅啓鑱婂ぉ杩囨护涓烘暟鎹眰杩囨护 鏀寔璁剧疆涓嶈繃婊ゅソ鍙嬭亰澶 +* [鑱婂ぉ璁板綍]澧炲姞閲嶄激璁板綍鍜屼氦鏄撴祦姘磋褰曠殑鍔熻兘 + +## 鑼椾紛鎻掍欢闆 v63 + +* [鑱婂ぉ杩囨护]淇蹇界暐绌烘牸澶辨晥鐨勯棶棰 +* [鑱婂ぉ杩囨护]澧炲姞闄岀敓浜哄瘑鑱婇閬撶殑閫夐」 +* [鑱婂ぉ杩囨护]琚繃婊ゆ帀鐨勬秷鎭笉鍐嶆挱鏀惧瘑鑱婃彁绀洪煶 +* [涓湴鍥炬悳绱涓嶅啀璁板綍涓浜涚儫鑺变箣绫荤殑涓存椂鐗╀欢 + +## 鑼椾紛鎻掍欢闆 v62 + +* [涓荤晫闈鏇存柊棣栭〉鍥剧墖 +* [鑱婂ぉ杩囨护]鏂板蹇界暐鍏ㄨ鍗婅鐨勯夐」 +* [鑱婂ぉ鐩戞帶]淇寮瑰嚭鐣岄潰鍦ㄨ嚜瀹氫箟鐣岄潰鏃跺彲鑳芥秷澶辩殑闂 + +## 鑼椾紛鎻掍欢闆 v61 + +* [鑱婂ぉ鍔╂墜]鑱婂ぉ娆℃暟缁熻涓嶈兘姝e父宸ヤ綔鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v60 + +* [鍩虹搴揮浼樺寲鏁版嵁璇锋眰鏁堢巼 +* [鐣岄潰搴揮淇涓浜涘姩鐢诲嚱鏁扮殑BUG +* [鐒︾偣鍒楄〃]鐩爣璺濈澧炲姞Z杞村樊璁$畻 +* [BUFF鐩戞帶]澧炲姞鐩戞帶鎵鏈夊悓鍚岯UFF鐨勯夐」 +* [鑱婂ぉ璁板綍]浠庤亰澶╁姪鎵嬩腑鎶界鍑烘潵 涓嶉渶瑕佹鍔熻兘鐨勪緺澹彲閫夋嫨涓嶅姞杞 +* [鑱婂ぉ杩囨护]澧炲姞蹇界暐绌烘牸鐨勯夐」 鍙互闃叉骞垮憡淇℃伅閫氳繃娣诲姞绌烘牸楗惰繃灞忚斀瑙勫垯 + +## 鑼椾紛鎻掍欢闆 v59 + +* [甯哥敤宸ュ叿]淇甯細鎴愬憳楂樹寒涓嶄細娑堝け鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v58 + +* [甯哥敤宸ュ叿]濂藉弸楂樹寒涓庡府浼氭垚鍛橀珮浜笉浼氭秷澶辩殑闂 + +## 鑼椾紛鎻掍欢闆 v57 + +* [鑱婂ぉ鍒囨崲]淇缁熻娓呯┖鏃剁殑涓澶凚UG + +## 鑼椾紛鎻掍欢闆 v56 + +* [鐣岄潰搴揮澶嶉夋鏄剧ず涓嶆纭殑闂 +* [鐣岄潰搴揮鏁村悎鎵鏈夐槾褰辩粯鍒剁浉鍏充唬鐮侀泦涓鐞 +* [鑱婂ぉ鐩戞帶]娣诲姞鑱婂ぉ灞忚斀杩囨护鐨勯夐」 +* [鑱婂ぉ璁板綍]娣诲姞鑱婂ぉ灞忚斀杩囨护鐨勯夐」 +* [鑱婂ぉ鍒囨崲]棰戦亾鍙戣█缁熻鍒锋柊鏃堕棿鏀逛负姣忓ぉ涓婂崍7鐐 +* [甯哥敤宸ュ叿]澧炲姞楂樹寒闄勮繎甯細鎴愬憳鐨勫姛鑳 +* [甯哥敤宸ュ叿]鑳屽寘鎼滅储鍦ㄤ粨搴撴暣鐞嗘椂鍙兘閫犳垚椤垮崱鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v55 + +* [鑱婂ぉ璁板綍]閲嶅缓绱㈠紩鐨勯夐」鍙兘瀵艰嚧涓㈠け鑱婂ぉ璁板綍鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v54 + +* [甯哥敤宸ュ叿]鑱婂ぉ鏍忛殣钘忓湪鏈夋柊娑堟伅鏃朵笉鑳借嚜鍔ㄦ樉绀虹殑闂 + +## 鑼椾紛鎻掍欢闆 v53 + +* [鑱婂ぉ鍔╂墜]鍒峰睆灞忚斀鍔熻兘澶辨晥鐨勯棶棰 +* [鑱婂ぉ鍔╂墜]瀵嗚亰棰勮澧炲姞鏃ユ湡鏃堕棿鎴 +* [鑱婂ぉ鍔╂墜]鑱婂ぉ缁熻鍜孋D鏄剧ず澶辨晥鐨勯棶棰 +* [鎴樻枟缁熻]澧炲姞鏄剧ず鏃犳暟鎹槦鍙嬬殑閫夐」 + +## 鑼椾紛鎻掍欢闆 v52 + +* [鎻掍欢鐗堟湰]鍚屾闄嗘湇鎻掍欢鐗堟湰鍙 + +## 鑼椾紛鎻掍欢闆 v51 + +* [鍒峰睆灞忚斀]涓嶅啀灞忚斀绾〃鎯呯殑鑱婂ぉ +* [鑱婂ぉ鍔╂墜]瀵嗚亰棰戦亾鏄剧ず鏈杩戝瘑鑱婇瑙 +* [鑱婂ぉ鍔╂墜]瀵嗚亰棰戦亾鏈杩戝瘑鑱婂垪琛ㄦ牴鎹棬娲炬煋鑹蹭簡 +* [鑱婂ぉ鍔╂墜]淇鐐瑰嚮瀵嗚亰棰戦亾鏃朵笉鑳芥纭繘鍏ュ瘑鑱婄姸鎬佺殑闂 +* [闂ㄦ淳鏌撹壊]璁剧疆鐣岄潰鍔犲叆鍚敤閫夐」闃叉绂佺敤鍚庢棤娉曞惎鐢 +* [鎴樻枟璁板綍]鎴樻枟璁板綍鍛藉悕浼樺厛浠ュ弬涓庢垬鏂楃殑鏁屽鐩爣鍛藉悕 + +## 鑼椾紛鎻掍欢闆 v50 + +* [搴撳嚱鏁癩绫讳技$zj鐨勬ā绯婂尮閰嶅け鏁堝鑷磋亰澶╃洃鎺у箍鍛婂睆钄戒竴浜涘姛鑳戒笉姝e父鐨勯棶棰 +* [鑱婂ぉ杈呭姪]鑱婂ぉ鍒囨崲闈㈡澘澧炲姞鎷栧姩浣嶇疆鎻愮ず + +## 鑼椾紛鎻掍欢闆 v49 + +* [BUFF鐩戞帶]鏀寔閲嶅悕BUFF鐩戞帶 +* [鑱婂ぉ杈呭姪]閲嶆瀯浠g爜浼樺寲鎬ц兘 +* [鑱婂ぉ杈呭姪]鏂板鏄剧ず棰戦亾CD鐨勫姛鑳 +* [鑱婂ぉ杈呭姪]鏂板鏄剧ず棰戦亾褰撴棩璁℃暟鐨勫姛鑳 +* [鑱婂ぉ杈呭姪]鏂板瀵嗚亰棰戦亾蹇熷垏鎹㈢殑鎸夐挳 + +## 鑼椾紛鎻掍欢闆 v48 + +* [BUFF鐩戞帶]浠庡父鐢ㄥ伐鍏蜂腑鎷嗗垎鍑烘潵 +* [BUFF鐩戞帶]鏀寔鏄剧ずBUFF鍚嶇О浜 +* [BUFF鐩戞帶]鏀寔鑷畾涔夌簿搴︽潯椋庢牸浜 +* [BUFF鐩戞帶]淇閮ㄥ垎BUFF鎬绘椂闂磋绠椾笉姝g‘鐨勯棶棰樺瀛ゅ奖鍖栧弻 + +## 鑼椾紛鎻掍欢闆 v47 + +* [鍩虹搴揮淇浜嬩欢娉ㄩ攢鏃跺彲鑳芥姤閿欑殑闂 +* [BUFF鐩戞帶]淇CD鍒锋柊鏃嬭浆鏂瑰悜閿欒鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v46 + +* [鑱婂ぉ杩囨护]鏀寔杩囨护鎸囧畾鐨勮亰澶╅閬撲簡 +* [鑱婂ぉ杩囨护]杩囨护鑻辨枃鏃跺伓灏斾細鍖归厤閿欒鐨勯棶棰 +* [寮у舰琛鏉鏈紑鍚姬褰㈣鏉℃椂 鐩爣璇绘潯浠嶇劧鏄剧ず鐨勯棶棰 +* [甯哥敤宸ュ叿]澧炲姞閫鍑烘父鎴忔椂澶ф垬娌′氦鐨勬彁绀 +* [鐒︾偣鍒楄〃]澧炲姞闃熶紞鏍囪鐨勬樉绀哄拰璁剧疆鐨勫姛鑳 +* [鍠婅瘽杈呭姪]澧炲姞1绉掑彧鑳藉枈璇濅竴娆$殑闄愬埗闃叉杩戣亰鍒峰睆 +* [闂ㄦ淳鏌撹壊]閲嶅啓鏁版嵁缁撴瀯浼樺寲杩愯鏁堢巼 +* [闂ㄦ淳鏌撹壊]鍗曠嚎绋嬪鎴风鏃犳硶鑾峰彇甯細鐨勯棶棰 +* [鎴樻枟璁℃椂]绔炴妧鍦烘垬鏂楄鏃舵敼涓轰粠绔炴妧鍦哄紑濮 +* [瀛椾綋閫夋嫨]鏀寔鐐瑰嚮鎸夐挳鐩存帴閫夋嫨瀛椾綋鏂囦欢浜 +* [鑳屽寘鎼滅储]鏄剧ず鐗╁搧杩囨护涓嶈兘姝e父鎼滅储鐨勯棶棰 +* [BUFF鐩戞帶]閲嶆瀯浠g爜鏀寔璁剧疆鍗曡鏈澶ф樉绀烘暟閲 +* [BUFF鐩戞帶]鏂板涓濂楃晫闈㈡柟妗堝苟澧炲姞鑻ュ共甯冨眬閫夐」 + +## 鑼椾紛鎻掍欢闆 v45 + +* [鐣岄潰搴揮鏂板璋冭壊鏉 鏇村棰滆壊閫夋嫨 +* [淇℃伅鏄剧ず]榛樿涓嶅啀寮鍚垬鏂楁椂闂存樉绀 +* [鑳屽寘鎼滅储]浼樺寲鑳屽寘鎼滅储閫熷害 鏀寔澶氭潯浠惰仈鍚堟悳绱 +* [鍦板浘鎼滅储]涓嶅啀璁板綍姝讳骸NPC鐨勫潗鏍囦俊鎭 +* [鑱婂ぉ鎵撶爜]涓嶆墦鐮佸悕瀛楀垪琛ㄤ笉鐢熸晥鐨勯棶棰 +* [鎴樻枟缁熻]鏂板闀挎瓕闂ㄩ鑹 +* [鑱婂ぉ鐩戞帶]鏇存柊棰戦亾鍒楄〃 + +## 鑼椾紛鎻掍欢闆 v44 + +* [闂ㄦ淳鏌撹壊]娣诲姞闀挎瓕闂ㄧ殑榛樿棰滆壊 +* [寮у舰琛鏉淇鑻嶄簯鎬掓皵涓嶈兘鏄剧ず鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v43 + +* [寮у舰琛鏉闆嗘垚瀛愭彃浠跺姬褰㈣鏉 +* [鐒︾偣鍒楄〃]鏀寔鑷畾涔夌晫闈㈢缉鏀炬瘮渚 +* [鐒︾偣鍒楄〃]鏂板鍔犲叆姘镐箙鐒︾偣鐨勫姛鑳 +* [鐐规暟鐩戞帶]鏂板鎸夋椂闂寸瓫閫夌偣鏁扮殑鍔熻兘 +* [闂ㄦ淳鏌撹壊]杩滅▼棰勮鐜╁鏃朵篃浼氱紦瀛樻暟鎹簡 +* [闂ㄦ淳鏌撹壊]淇鐜╁甯細鍙兘鑾峰彇澶辫触鏄剧ず涓虹┖鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v42 + +* [鏍稿績搴揮淇鍒ゆ柇鍦板浘鏄惁涓哄壇鏈粨鏋滀笉姝g‘鐨勯棶棰 +* [淇℃伅鏄剧ず]璋冩暣淇℃伅鏉$殑榛樿鏄剧ず浣嶇疆 +* [鑱婂ぉ鐩戞帶]鏂板鏃堕棿鎴虫牸寮忚缃殑閫夐」 +* [鑱婂ぉ鍔╂墜]闆嗘垚鑱婂ぉ鎵撶爜寮鍏冲彲蹇熷垏鎹㈢姸鎬佹柟渚挎埅鍥 + +## 鑼椾紛鎻掍欢闆 v41 + +* [鍩虹搴揮淇鏌愪簺鎯呭喌涓嬪鎴风鍒稬OG鐨勯棶棰 +* [鍩虹搴揮鑳屾櫙閫氳鍦ㄩ亣鍒扮壒瀹氭暟鎹椂浼氶敊涔辩殑闂 +* [蹇熺櫥鍑篯鎻愪緵鍐嶆鐐瑰嚮鐧诲嚭鍒欏彇娑堢櫥鍑烘父鎴忕殑鍔熻兘 +* [鑱婂ぉ鏃堕棿]淇鏈縺娲荤殑鏍囩椤佃亰澶╂椂闂翠笉姝g‘鐨勯棶棰 +* [鑱婂ぉ璁板綍]瑙e喅娓告垙闂绛夌壒娈婃儏鍐典笅鑱婂ぉ璁板綍鍙兘涓㈠け鐨勯棶棰 +* [闂ㄦ淳鏌撹壊]鐜╁淇℃伅鏀瑰彉鏃舵煋鑹茬紦瀛樹笉鑳芥洿鏂扮殑闂 +* [闂ㄦ淳鏌撹壊]浼樺寲鏂版暟鎹姣斿鐞嗛昏緫鍑忓皯璇诲彇鏁版嵁鐨勭鐩樻秷鑰 + +## 鑼椾紛鎻掍欢闆 v40 + +* [鍩虹搴揮淇鏌愪簺鎯呭喌涓嬪欢杩熷嚱鏁颁笉鑳芥墽琛岀殑闂 +* [鐣岄潰搴揮淇鑷姩瀹屾垚鎺т欢鎻忚堪鏂囧瓧鏄剧ず涓嶆甯哥殑闂 +* [瑁呭棰勮]棰勮浠栦汉瑁呭澶辫触鏃跺皢鍦ㄥ睆骞曚腑澶彁绀轰簡 +* [浠撳簱鎼滅储]淇甯細浠撳簱鎼滅储鏃跺彲鑳界粨鏋滈敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v39 + +* [鑱屼笟鏌撹壊]鑱婂ぉ鏍忓悕瀛楁寜浣廇lt鐐瑰嚮鍙互鏌ョ湅瑁呭 +* [鑱屼笟鏌撹壊]鑱婂ぉ鏍忓悕瀛楁寜浣廠hift鐐瑰嚮鍙互蹇熼変腑 +* [鐒︾偣鍒楄〃]闅愯棌閲嶄激鍒楄〃鏃舵渶澶ф暟閲忚绠楅敊璇殑闂 +* [鐒︾偣鍒楄〃]浼樺厛鏄剧ず杩戣窛绂荤洰鏍囪缃笉鑳戒繚瀛樼殑闂 + +## 鑼椾紛鎻掍欢闆 v38 + +* [鑱婂ぉ澶嶅埗]淇涓庢捣槌楄亰澶╁鍒跺啿绐佸鑷磋〃鎯呬笉鑳芥纭鍒剁殑闂 +* [鑱婂ぉ杩囨护]涓嶅啀杩囨护绾〃鎯呯函閾炬帴鍐呭鐨勮亰澶 +* [闅忚韩渚跨]瑙e喅涓嶈兘杈撳叆鍥炶溅鎹㈣鐨勯棶棰 +* [鑱婂ぉ璁板綍]鍦ㄦ煇浜涙儏鍐典笅鍙兘鍑虹幇鐨勪繚瀛樿亰澶╄褰曞け璐ュ鑷磋褰曚涪澶辩殑闂 +* [瀛椾綋璁剧疆]鏂板瀛椾綋璁剧疆鍔熻兘鍙互鏂逛究鑷敱鐨勬敼鍙樻父鎴忓瓧浣 +* [鑱婂ぉ鐩戞帶]灏忕獥鍙g偣鍑讳笉鑳芥縺娲婚潰鏉跨殑闂 +* [鐒︾偣鍒楄〃]鏇存柊浜嗕竴浜涢粯璁ょ劍鐐规暟鎹 + +## 鑼椾紛鎻掍欢闆 v37 + +* [鐣岄潰搴揮鎸夐挳閲嶅鍝嶅簲鐐瑰嚮浜嬩欢鐨勯棶棰 +* [鑱婂ぉ鐩戞帶]涓嶈兘寮濮嬬洃鎺х殑闂 +* [鐐规暟鐩戞帶]鐐瑰嚮涓娆℃寜閽噸澶嶅彂閫佷袱娆$粨鏋滅殑闂 +* [鑱婂ぉ娓呭睆]绉诲姩鎸夐挳浣嶇疆鍒板揩閫熷垏鎹㈤閬撴潯涓婂苟璁剧疆鍔熻兘寮鍏 + +## 鑼椾紛鎻掍欢闆 v36 + +* [鐣岄潰搴揮淇杈撳叆妗嗛変腑瀛椾綋涓嶆纭殑闂 +* [鐣岄潰搴揮鎵鏈夊崟琛岃緭鍏ユ涓緭鍏ュ洖杞﹀皢缁撴潫杈撳叆 +* [鏍稿績搴揮涓澶勫瓧绗︿覆瑙f瀽鍙兘瀵艰嚧瀹㈡埛绔崱姝荤殑闂 +* [涓荤晫闈鍦ㄩ紶鏍囦笉鍙鏃舵墦寮鐣岄潰涓嶅啀鎶㈣緭鍏ョ劍鐐逛簡 +* [鎴樻枟缁熻]鏀寔浣跨敤瀹樻柟鏃堕棿绠楁硶锛堥傚悎鎾告湪妗╋級 +* [鎴樻枟缁熻]绔炴妧鍦烘垬鍦轰腑涔熻兘缁熻瀵圭珛鐜╁鐨勮緭鍑轰簡 +* [鎴樻枟缁熻]涓嶅啀璁板綍绌虹櫧鐨勬垬鏂楁暟鎹紙濡傜敓浜10鍒嗛挓鐨勫お鏋侊級 +* [鎴樻枟缁熻]绔炴妧鍦轰腑鎴樻枟鏃堕棿鏄剧ず杩涘叆鍦板浘鐨勬绘椂闂 +* [鑳屽寘鎼滅储]鏁寸悊鑳屽寘鏃跺彲鑳介犳垚瀹㈡埛绔】鍗$殑闂 +* [鑱婂ぉ鐩戞帶]淇鏈鍚庝竴涓瓧绗︿负鍒嗗彿鏃舵墍鏈夎亰澶╅兘琚褰曠殑闂 +* [鑱婂ぉ鐩戞帶]涓嬫鐧诲綍鏃朵笂娆$殑璁板綍鏁版嵁涓嶄細鍐嶄涪澶变簡 +* [鑱婂ぉ灞忚斀]鏂扮殑灞忚斀榛樿鎻掑叆鍦ㄨ缃晫闈㈢殑绗竴鏉′簡 +* [鑱婂ぉ鍔╂墜]鏂板榧犳爣涓棿鍗曞嚮鍙垹闄ゅ綋鍓嶈亰澶╄鐨勫姛鑳介傚悎鎴浘浣跨敤 +* [鑱婂ぉ鍔╂墜]鏂板娓呯┖鑱婂ぉ鏍忕殑鍔熻兘 +* [鑳屽寘鎼滅储]鏀寔CTRL+F蹇嵎閿揩閫熸悳绱 +* [鎵佸钩琛鏉澧炲姞蹇嵎閿紑鍏宠鏉 +* [鎵佸钩琛鏉淇閮ㄥ垎鐜╁涓嶈兘鏄剧ず浠囦汉澶撮《鐨勯棶棰 +* [鑱屼笟鏌撹壊]閲嶆瀯鏁版嵁瀛樺偍缁撴瀯 涓嶅啀鏈夋渶澶ф暟閲忛檺鍒朵簡 +* [鑱屼笟鏌撹壊]浼氬湪榧犳爣绉诲叆鐨勫皬TIP涓樉绀烘槸鍚︽槸闃熷弸浜 +* [鑱屼笟鏌撹壊]璺ㄦ湇鏁版嵁涓嶅啀璁板綍鍒版湰鍦版暟鎹腑浜 +* [鑱屼笟鏌撹壊]鐜╁鍦ㄩ檮杩戞椂ALT+宸﹂敭鍗曞嚮鍚嶅瓧鍙互蹇熼変腑鐜╁浜 +* [鑱婂ぉ璁板綍]鑱婂ぉ璁板綍涓嶅啀鏈夋潯鏁伴檺鍒 鍙互鏃犻檺鍔犺浇鍘嗗彶璁板綍浜 +* [鍦板浘鎼滅储]浼樺寲鎼滅储鏂瑰紡闃叉鏁版嵁閲忚繃澶ф椂鎼滅储鍗¢】 + +## 鑼椾紛鎻掍欢闆 v35 + +* [鍩虹搴揮瀛楃涓插尮閰嶆敮鎸佷娇鐢$zj,$gh鍖归厤鑷繁鐨処D鍜屽府浼氬悕绉颁簡 +* [鍩虹搴揮鑾峰彇甯細濂藉弸鍒楄〃淇鑾峰彇澶辫触鐨勯棶棰樺苟澧炲姞缂撳瓨澶勭悊 +* [鍩虹搴揮閲嶆瀯涓婚潰鏉夸簨浠跺搷搴斿嚱鏁 鎻愰珮浠g爜鎬ц兘 +* [鍩虹搴揮淇Xml瑙g爜鐨勪竴澶勫彲鑳藉鑷磋В鐮佹贩涔辩殑闂 +* [鍩虹搴揮棰滆壊閫夋嫨鍣ㄦ敮鎸佽嚜瀹氫箟棰滆壊浜 +* [鑳屽寘鎼滅储]鏀寔鐗╁搧鎻忚堪鍏ㄦ枃妫绱簡 +* [鑳屽寘鎼滅储]浼樺寲鎼滅储浠g爜澧炲姞缂撳瓨鍔犲揩妫绱㈤熷害 +* [淇℃伅鏄剧ず]鏂板鏄剧ず缃戠粶寤惰繜 +* [鑱婂ぉ鍔╂墜]鏂板鍒峰睆灞忚斀閫夐」 +* [鑱婂ぉ鍔╂墜]榛樿寮鍚鍒剁郴缁熻亰澶 +* [鑱婂ぉ鍔╂墜]鎻愪緵鑱婂ぉ鏍忔埅鍥惧墠濮撳悕鎵撶爜鐨勫姛鑳 +* [鑱婂ぉ鍔╂墜]瑙e喅鏁版嵁鍔犺浇澶辫触瀵艰嚧鑱婂ぉ灞忚斀娓呯┖鐨勯棶棰 +* [鑱婂ぉ鐩戞帶]浼樺寲閮ㄥ垎浠g爜閫昏緫 鍑忓皯閰嶇疆鏂囦欢璇诲彇娆℃暟 +* [鎴樻枟缁熻]淇钘忓墤DPS缁熻浼氬紓甯搁珮鐨勯棶棰 +* [鎴樻枟缁熻]澧炲姞璁$畻DPS鏃舵槸鍚﹂櫎鍘绘殏绂绘椂闂寸殑閫夐」 +* [甯哥敤宸ュ叿]鐧诲綍娓告垙2鍒嗛挓鎻愮ず瑙i攣瀵嗕繚閿侊紙浠呴檺鏅氬瘑淇濓級 +* [鎵佸钩琛鏉浼樺寲浠g爜 鍔犲揩杩愯閫熷害 +* [鎵佸钩琛鏉淇杩囧浘鏃跺彲鑳藉嚭鐜扮殑鍚勭闂 +* [鎵佸钩琛鏉鏀寔鍗曠嫭璁剧疆浠囦汉琛鏉¢厤缃 +* [鐒︾偣鍒楄〃]淇鍕鹃夐殣钘忛噸浼ょ洰鏍囨椂鐩爣澶嶆椿涓嶈兘鐒︾偣鐨勯棶棰 +* [鍠婅瘽杈呭姪]閲嶆瀯浠g爜 淇涓嶈兘璋冩垙灏忛槦闃熷弸鐨勯棶棰 +* [闅忚韩渚跨]鏀瑰彉澶у皬鏂瑰紡鏀逛负鎷栨嫿绐楀彛鍙充笅瑙 + +## 鑼椾紛鎻掍欢闆 v34 + +* [鏍稿績搴揮鎴樻枟杈圭晫鍒ゅ畾鐨勪竴澶勫鑷存垬鏂椾腑涓婄嚎鎴樻枟鏃堕棿涓嶆纭殑闂 +* [鎴樻枟缁熻]鍥㈤槦鐜╁姝讳骸/绂荤嚎鏃跺皢浼氭湁鏆傜璁板綍 鏆傜鐘舵佷笅璇ョ帺瀹剁殑鎴樻枟缁熻鏁板煎皢涓嶅啀鎸佺画鍒锋柊骞朵笖鐜╁鍚嶇О浠ョ伆鑹叉樉绀 +* [鎴樻枟缁熻]閲嶅悕鐨勬妧鑳藉拰BUFF(DOT/HOT)閫犳垚鐨勪激瀹/鐤椾激灏嗗垎寮鏄剧ず浜 +* [鎴樻枟缁熻]鎺掑悕鏂囧瓧浣跨敤鑹烘湳瀛楁樉绀 +* [鎴樻枟缁熻]鏍峰紡閰嶇疆鏀寔绾疪GBA棰滆壊琛ㄤ簡 +* [鎴樻枟缁熻]璋冩暣榛樿閰嶈壊(娌¢敊鍞愰棬搴旇鏄摑鑹蹭簲姣掓槸绱壊) +* [鎴樻枟缁熻]榧犳爣绉诲叆TIP澧炲姞鏄剧ず鏆傜璁板綍骞舵寜鐓ф暟鍊艰繘琛屾帓搴忎簡 + +## 鑼椾紛鎻掍欢闆 v33 + +* [鏍稿績搴揮鍙栨秷鏁版嵁淇濆瓨鏃剁殑Json搴忓垪鍖栨搷浣 + +## 鑼椾紛鎻掍欢闆 v32 + +* [鐣岄潰搴揮杈撳叆妗嗕笉鑳借緭鍏ユ枃瀛楃殑闂 + +## 鑼椾紛鎻掍欢闆 v31 + +* [鏍稿績搴揮鏇存敼瑙掕壊閰嶇疆鏂囦欢璺緞鐢熸垚鏂瑰紡 +* [鐒︾偣鍒楄〃]涓嶈兘灞忚斀閮ㄥ垎姝绘帀鐨凬PC鐨勯棶棰 +* [鎵佸钩琛鏉淇鐢变簬涓浜涙灇涓句涪澶卞鑷村嚭閿欑殑闂 + +## 鑼椾紛鎻掍欢闆 v30 + +* [鐣岄潰搴揮鑷姩瀹屾垚鎺т欢榧犳爣澶辩劍浼樺寲 +* [鑱婂ぉ鍔╂墜]灏忛槦娉℃场鍏煎CTM銇強鑺 +* [鑱婂ぉ澶嶅埗]澧炲姞鍜屾捣槌楄亰澶╁啿绐佺殑澶勭悊 +* [鍦板浘鎼滅储]瑙e喅缁樺埗鐐硅秴鍑哄湴鍥惧尯鍩熺殑闂 +* [鑱婂ぉ杩囨护]涓嶈兘杩囨护绫讳技"1-89"瀛楃鐨勯棶棰 +* [鑱婂ぉ杩囨护]璁剧疆椤电偣鍑诲彲澶嶅埗鍒版柊瑙勫垯杈撳叆妗 + +## 鑼椾紛鎻掍欢闆 v29 + +* [鏍稿績搴揮寮瑰嚭鐜╁鍙抽敭鑿滃崟鍙兘澶辫触鐨勯棶棰 +* [鑱婂ぉ澶嶅埗]閲嶇疆/鏂板缓鑱婂ぉ鏍忔椂涓嶅啀闇瑕佸皬閫鐢熸晥浜 + +## 鑼椾紛鎻掍欢闆 v28 + +* [鎴樻枟璁板綍]鍙戝竷鏃堕粯璁ゅ彂甯冩湁鏁堝 +* [鎴樻枟璁板綍]鎴樻枟涓竻绌 鏃堕棿娌℃湁閲嶇疆鐨勯棶棰 +* [鐒︾偣鍒楄〃]鏂板浼樺厛鏄剧ず杩戣窛绂荤洰鏍囩殑閫夐」 +* [鑱婂ぉ璁板綍]涓嶈兘璁板綍灏忛槦鑱婂ぉ鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v27 + +* [涓荤晫闈鏀寔鏈澶у寲鐣岄潰 +* [鎶鑳借褰昡鐣岄潰鏄剧ず涓嶆甯哥殑闂 +* [濂藉弸楂樹寒]涓嶈兘姝g‘鏄剧ず鐨勯棶棰 +* [濂藉弸楂樹寒]鎵撳紑鍚庝笉鑳藉叧闂殑闂 +* [闅忚韩渚跨]閫傚綋鎻愰珮浜嗙晫闈寒搴 +* [闅忚韩渚跨]鏀寔鏈灏忓寲鏈澶у寲 +* [鑱婂ぉ杩囨护]瑙e喅涓嶈兘杩囨护澶у啓瀛楁瘝鐨勯棶棰 +* [鎴樻枟缁熻]榧犳爣绉诲嚭鐣岄潰鏃堕殣钘廡IP + +## 鑼椾紛鎻掍欢闆 v26 + +* [鑱婂ぉ璁板綍]鏂板杩囨护甯細涓婁笅绾挎彁绀虹殑閫夐」 +* [鑱婂ぉ杩囨护]浣跨敤涓庤亰澶╃洃鎺х浉鍚岀殑瀛楃涓插尮閰嶈娉 +* [鍦板浘鎼滅储]鍦ㄦ煇浜涙儏鍐典笅鏁版嵁涓嶈兘淇濆瓨鐨勯棶棰 +* [鑳屽寘鎼滅储]鍑忓皯寮閿淇涓浜涚畻娉曢敊璇 +* [鑳屽寘鎼滅储]鏂板浠撳簱鑳屽寘涓閿姣旂殑鍔熻兘 +* [鐒︾偣鍒楄〃]鏂板鍐呭姛蹇冩硶鍜岄樀钀ュ浘鏍囨樉绀 +* [鎵佸钩琛鏉鏂板褰撳墠闃佃惀璁剧疆鐨勯夐」 +* [鎵佸钩琛鏉鏂板浠呭湪鎸囧畾绫诲瀷鍦板浘鍚敤鐨勯夐」 +* [BUFF鐩戞帶]鏂拌处鍙蜂笉鑳芥柊澧炵洃鎺ф暟鎹殑闂 + +## 鑼椾紛鎻掍欢闆 v25 + +* [鏍稿績搴揮浼樺寲鏁版嵁鏂囦欢鍔犺浇淇濆瓨 +* [鍦板浘鎼滅储]娣诲姞涓浜涜姳鐩嗗拰姘斿満铔婇紟绛夋ā鏉垮睆钄 +* [鑱婂ぉ鍔╂墜]鑱婂ぉ鏃堕棿鍙兘鏄剧ず鎴愮櫧鑹茬殑闂 +* [鐒︾偣鍒楄〃]浠庣珵鎶鍦哄嚭鏉ユ椂鍙兘鐒︾偣鑷繁鐨勯棶棰 +* [鎴樻枟缁熻]澧炲姞閫鍑烘椂淇濆瓨鍘嗗彶璁板綍鐨勯夐」 +* [甯哥敤宸ュ叿]杩涘嚭鎴樺満/绔炴妧鍦烘椂鑷姩鍒囨崲鑱婂ぉ棰戦亾 + +## 鑼椾紛鎻掍欢闆 v24 + +* [鏍稿績搴揮闆嗕腑璺緞閰嶇疆鍒颁富搴撲腑 +* [涓荤晫闈浼樺寲鏀瑰杽鐣岄潰娉ㄥ唽閫昏緫 +* [甯哥敤宸ュ叿]璁剧疆鐣岄潰鎷嗗垎璋冩暣 +* [鐣岄潰鍒嗙被]璋冩暣瀛愭彃浠舵敞鍐岄潰鏉垮垎绫 +* [鑱婂ぉ杩囨护]鏁村悎璁剧疆鐣岄潰鍚堝苟鍒颁富鐣岄潰 +* [鑳屽寘鎼滅储]瑙e喅闄愭椂鎼滅储鏂囧瓧娑堝け鐨勯棶棰 +* [鎴樻枟缁熻]瑙e喅NPC鍚嶅瓧杩囬暱浼氬鑷村垪琛ㄦ棤闄愭坊鍔犵殑闂 + +## 鑼椾紛鎻掍欢闆 v23 + +* [鑱婂ぉ鍔╂墜]瑙e喅瀵艰嚧瀹㈡埛绔崱姝荤殑涓ラ噸闂 +* [鎴樻枟璁板綍]瑙e喅鍚嶅瓧澶暱浼氬鑷村垪琛ㄦ棤闄愭坊鍔犵殑闂 +* [鎵佸钩琛鏉淇涓澶勫彲鑳藉鑷磋鏉″崱浣忎笉鍒锋柊鐨勯棶棰 +* [鎵佸钩琛鏉瑙e喅涓澶勫鑷寸帺瀹跺悕瀛楀彲鑳戒笉鏄剧ず鐨勯棶棰 +* [鎵佸钩琛鏉瑙e喅涓婄嚎鏃跺彲鑳藉鑷村畼鏂瑰ご椤舵秷澶辩殑闂 +* [鎵佸钩琛鏉鍥㈤槦琛閲忕敤闃熶紞鏂瑰紡鑾峰彇 鏇村噯纭 +* [BUFF鐩戞帶]淇涓浜涢粯璁ゆ暟鎹敊璇殑闂 + +## 鑼椾紛鎻掍欢闆 v22 + +* [鎵佸钩琛鏉瑙e喅鍜岀郴缁熻鏉¤缃啿绐佺殑闂 + +## 鑼椾紛鎻掍欢闆 v21 + +* [鏍稿績搴揮淇JSON缂栫爜瑙g爜鍙兘鍑虹幇涓嬫爣閿欒鐨勯棶棰 +* [闂ㄦ淳鏌撹壊]榛樿鏈澶х紦瀛樿皟鏁翠负2000浜 +* [鐒︾偣鍒楄〃]鏂板闅愯棌閲嶄激鐩爣鐨勯夐」 +* [鎵佸钩琛鏉浼樺寲鑷姩璋冩暣绯荤粺澶撮《鐘舵佺殑鏉′欢 + +## 鑼椾紛鎻掍欢闆 v20 + +* [鏍稿績搴揮BreatheCall鍦ㄥ垏鍥剧殑鏃跺欏彲鑳藉仠姝㈢殑闂 +* [鎴樻枟缁熻]瑙e喅娌℃湁璁板綍鍒拌繘鎴樼灛闂存妧鑳界殑闂 +* [鎴樻枟缁熻]瑙e喅璇嗙牬琚噸澶嶇粺璁′负鍛戒腑鐨勯棶棰 +* [鎴樻枟缁熻]瑙e喅鎺掑簭鏁板瓧娌℃湁瀹炴椂鍒锋柊鐨勯棶棰 +* [鎴樻枟缁熻]淇鑿滃崟涓竴澶勬椂闂存樉绀洪棶棰 +* [鎴樻枟缁熻]鏂板鍘嗗彶璁板綍鍒犻櫎鎸囧畾鏉$洰锛堜竴涓弶锛 +* [鎴樻枟缁熻]鏂板榧犳爣婊戣繃Tip鏄剧ず +* [鐒︾偣鍒楄〃]涓板瘜鍙抽敭鑿滃崟 +* [鎵佸钩琛鏉瑙e喅琛鏉″湪鍑虹幇鏃惰儗鏅壊鍏堢粯鍒1甯у鑷磋瑙夐棯鐑佺殑闂 +* [鎵佸钩琛鏉瑙e喅鏌愪簺鎯呭喌涓嬬帺瀹惰鏉′笉鑳芥樉绀虹殑闂 +* [鑱婂ぉ鍔╂墜]淇褰撹亰澶╂爮鑷姩闅愯棌鏃惰亰澶╅閬撳垏鎹㈠け鏁堢殑闂 +* [鑱婂ぉ鍔╂墜]娓呴櫎鑷姩鍥炲鐘舵佷笉鎴愬姛鐨勯棶棰 +* [鑱婂ぉ鍔╂墜]瑙e喅闅愯棌鑱婂ぉ鏍忔椂澶嶅埗鑱婂ぉ鑱婂ぉ鏍忔湭鍑虹幇鐨勯棶棰 +* [鎵佸钩琛鏉寮鍚/鍏抽棴琛鏉℃椂灏嗚嚜鍔ㄥ垏鎹㈢郴缁熻鏉″紑鍚姸鎬 + +## 鑼椾紛鎻掍欢闆 v19 + +* [鐣岄潰搴揮淇鍗曢夋琛ㄧ幇涓嶆纭殑闂 +* [鑱婂ぉ鍔╂墜]淇涓嶅畬鍏ㄦ樉绀鸿亰澶╁垏鎹㈡椂闈㈡澘澶у皬涓嶆纭殑闂 +* [鑱婂ぉ鍔╂墜]鏂板涓嶆樉绀洪潰鏉跨殑閫夐」 +* [闂ㄦ淳鏌撹壊]浼樺寲浠g爜 鍑忓皯浠g爜鍐椾綑 澧炲姞鏁堢巼 +* [闂ㄦ淳鏌撹壊]淇娓告垙鐩存帴澶ч鏁版嵁涓嶄繚瀛樼殑闂 +* [甯哥敤宸ュ叿]閲嶅啓鎴樻枟鏃堕棿绠楁硶 鍓湰涓浜′笉浼氫腑鏂椂闂寸粺璁 +* [甯哥敤宸ュ叿]淇璁剧疆闈㈡澘涓澶勫ぇ灏忎笉姝g‘鐨勯棶棰 +* [鍠婅瘽杈呭姪]淇闃熶紞棰戦亾棰滆壊涓嶆纭殑闂 +* [鎴樻枟缁熻]鏂板鎴樻枟缁熻瀛愭彃浠 +* [鎵佸钩琛鏉淇姘斿満鍚嶇О绛夋棤娉曟纭樉绀虹殑闂 +* [BUFF鐩戞帶]淇涓嶈兘璁剧疆鑻嶄簯鐨凚UFF鐩戞帶鐨勯棶棰 +* [鐒︾偣鍒楄〃]鏂板鑷姩鐒︾偣鏁屽鐜╁鐨勯夐」 + +## 鑼椾紛鎻掍欢闆 v18 + +* [鏍稿績搴揮鍘嬬缉搴撴枃浠跺ぇ灏 鍑忓皯鏇存柊澶辫触鐨勫彲鑳 +* [鐒︾偣鍒楄〃]鏂板鏄剧ず鐩爣鐨勭洰鏍 +* [鐒︾偣鍒楄〃]鍒犻櫎蹇樿鍒犻櫎鐨勯粯璁ょ劍鐐规祴璇曟暟鎹 +* [甯哥敤宸ュ叿]搴斿畼鏂硅姹傚拰璋愪節瀹嚜鍔ㄨ绠椻 +* [鐒︾偣鍒楄〃]鏂板鑷姩鐒︾偣濂藉弸鍜屽府浼氭垚鍛樼殑閫夐」 +* [鍦板浘鎼滅储]浠庡父鐢ㄥ伐鍏蜂腑鎶界鍑烘潵鐙珛瀛愭彃浠 +* [鍦板浘鎼滅储]浼樺寲鎼滅储绠楁硶 闃叉UI鍗′綇 +* [闂ㄦ淳鏌撹壊]鍔犲叆鑻嶄簯榛樿棰滆壊 +* [闂ㄦ淳鏌撹壊]瑙e喅闂ㄦ淳鏌撹壊鎭㈠榛樿璁剧疆涓嶈兘淇濆瓨鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v17 + +* [甯哥敤宸ュ叿]淇濂藉弸楂樹寒涓嶆樉绀虹殑闂 +* [鑱婂ぉ鐩戞帶]鏀寔鐩戞帶鍏ㄩ閬撳NPC鍠婅瘽绛変俊鎭 +* [鑱婂ぉ鐩戞帶]淇鍔犺浇瀹屾垚鏃跺皬绐楀彛涓嶆秷澶辩殑闂 +* [甯哥敤宸ュ叿]BUFF鐩戞帶绐楀彛瀹氫綅鏀逛负宸﹀榻 +* [鐒︾偣鍒楄〃]鏂板鐒︾偣鍒楄〃瀛愭彃浠 +* [甯哥敤宸ュ叿]浼樺寲闃叉绁炶鍗冮噷CD琚悆鐨勪唬鐮侀昏緫 + +## 鑼椾紛鎻掍欢闆 v16 + +* [鐣岄潰搴揮淇鍔ㄦ佸垱寤篐andle鏃剁涓涓瓙鍏冪礌瀹氫綅涓嶆纭殑闂 +* [甯哥敤宸ュ叿]淇鎴樻枟璁℃椂涓嶆甯稿伐浣滅殑闂 +* [甯哥敤宸ュ叿]淇渚跨涓嶈兘鏄剧ず鐨勯棶棰 +* [甯哥敤宸ュ叿]鏂板涓湴鍥綨PC鍜孌oodad璁板綍鍜屾煡璇㈢殑鍔熻兘 +* [甯哥敤宸ュ叿]淇闄勮繎濂藉弸楂樹寒涓嶆甯告樉绀虹殑闂 +* [甯哥敤宸ュ叿]淇鎶鑳藉彲瑙嗗寲涓嶈兘鏄剧ず鐨勯棶棰 +* [甯哥敤宸ュ叿]瑙e喅澶氭牳妯″紡涓嬩節瀹姪鎵嬩笉鑳戒娇鐢ㄧ殑闂 +* [鑱婂ぉ鐩戞帶]浼樺寲鑱婂ぉ鐩戞帶寮瑰嚭绐楀湪榧犳爣绉讳笂鍘绘椂鐨勭敤鎴蜂綋楠 + +## 鑼椾紛鎻掍欢闆 v15 + +* [鐣岄潰搴揮寰皟閮ㄥ垎鎺т欢缁撴瀯浼樺寲鐣岄潰 +* [涓婚潰鏉縘淇涓浜涚晫闈㈠ぇ灏忛敊璇殑闂 +* [甯哥敤宸ュ叿]淇灏忔湰瀛愮郴缁熸彁绀烘病鏈夋崲琛岀殑闂 +* [闂ㄦ淳鏌撹壊]鏀寔鑻嶄簯浠ュ強浠ュ悗鍙兘鍑虹幇鏂伴棬娲剧殑鏌撹壊 +* [甯哥敤宸ュ叿]浼樺寲璇曠偧涔嬪湴-涔濆杩峰眬鍔╂墜 +* [BUFF鐩戞帶]鏂板鏄惁鍏佽闅忔椂鎷栧姩鐨勯夐」 + +## 鑼椾紛鎻掍欢闆 v14 + +* [鐣岄潰搴揮淇澶嶉夋璁剧疆瀹藉害鍧愭爣瀹氫綅閿欒鐨勯棶棰 +* [甯哥敤宸ュ叿]淇缂栬緫鐜╁鏍囩鐣岄潰鍒濆鍖栧彲鑳藉鑷存父鎴忓穿婧冪殑闂 +* [甯哥敤宸ュ叿]鍔犲叆闃叉绁炶琚粦鐨勫姛鑳介夐」 +* [鎵佸钩琛鏉淇鏌愪簺鎯呭喌涓嬭鏉℃覆鏌撴姤閿欑殑闂 +* [BUFF鐩戞帶]淇BUFF鐩戞帶鍦ㄦ煇浜涙儏鍐典笅鍗D鏃堕棿鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v13 + +* [鑱婂ぉ鐩戞帶]淇鐐瑰嚮涓嶈兘婵娲婚潰鏉跨殑闂 +* [鎵佸钩琛鏉涓嶅啀鏄剧ず绾暟瀛楀悕瀛楃殑NPC +* [鐐规暟鐩戞帶]淇鍠婅瘽鍙樻垚鑻辨枃鐨勯棶棰 +* [鑱婂ぉ鐩戞帶]鐐瑰嚮鑷姩瀹屾垚鎺т欢鐨勪笅鎷夋寜閽皢鏄剧ず鍏ㄩ儴缁撴灉 +* [BUFF鐩戞帶]淇鍒囨崲蹇冩硶鏃剁晫闈笉鍒锋柊鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v12 + +* [鐣岄潰]绮惧績闆曠悽鍏ㄦ柊鐣岄潰锛屾洿娓呮櫚鏇村彜椋庢洿濂界敤銆 +* [鏍稿績搴揮閲嶆瀯鑱婂ぉ瑙f瀽妯″潡锛屾敮鎸佹墍鏈変綅缃鍚嶆煋鑹层 +* [鐐规暟鐩戞帶]鏁村悎鑱屼笟鏌撹壊涓庤亰澶╁鍒躲 +* [鑱婂ぉ鍔╂墜]淇鐢变簬鍚嶇О鏌撹壊瀵艰嚧鑱婂ぉ澶嶅埗棰滆壊鍒ゆ柇閿欒鐨勯棶棰樸 +* [鏍稿績搴揮鏂板XML瑙f瀽妯″潡锛岀粺涓閾炬帴娓叉煋鎺ュ彛銆 +* [鑱婂ぉ鐩戞帶]閲嶆瀯鑱婂ぉ鐩戞帶锛屼慨澶嶅澶勯棶棰樸 +* [鑱婂ぉ鐩戞帶]淇CTRL+閾炬帴鍦ㄦ煇浜涙儏鍐典笅閲嶅澶嶅埗鐨勯棶棰樸 +* [鑱婂ぉ鐩戞帶]鏂板涓嶆樉绀洪噸澶嶆秷鎭殑閫夐」銆 +* [鑱婂ぉ鐩戞帶]閲嶅啓娑堟伅鍝堝笇绠楁硶锛岃В鍐虫煇浜涙儏鍐典笅涓嶈兘杩囨护閲嶅娑堟伅鐨勯棶棰樸 +* [鏍稿績搴揮鏂板鑷姩瀹屾垚鎺т欢銆 +* [鑱婂ぉ鐩戞帶]浣跨敤鑷姩瀹屾垚鎺т欢鏇挎崲涓嬫媺杈撳叆妗嗭紝澧炲己鐢ㄦ埛浣撻獙銆 +* [甯哥敤宸ュ叿]鎶鑳藉彲瑙嗗寲杩囨护鏅氭敾鍑伙紝澧炲姞楠戝尽鎶鑳芥樉绀恒 +* [甯哥敤宸ュ叿]鎶鑳藉彲瑙嗗寲淇鍚屾椂閲婃斁鎶鑳藉彧鏄剧ず绗竴涓殑闂銆 +* [甯哥敤宸ュ叿]鎶鑳藉彲瑙嗗寲鎶鑳介噴鏀15绉掑悗鍥炬爣娓愰殣娑堝け銆 +* [鑱屼笟鏌撹壊]鎻愬崌鏌撹壊鏈澶х紦瀛樻暟閲忓苟澧炲姞楂樿缃鍛婃彁绀恒 +* [鑱婂ぉ鍔╂墜]淇鑱婂ぉ瀛楃涓瞖ventlink瑙f瀽閿欒瀵艰嚧澶嶅埗澶辨晥鐨勯棶棰樸 +* [澶撮《琛鏉浼樺寲浠g爜锛屼富鍩庨昏緫CPU鍗犵敤闄嶄綆10%銆 *(remake)* + +## 鑼椾紛鎻掍欢闆 v11 + +* [甯哥敤宸ュ叿]淇℃伅鏉℃柊澧炲瓧浣撻鑹插強闅愯棌鏍囬璁剧疆 +* [鎻掍欢鍏ュ彛]鍔犲叆榻胯疆鎸夐挳 +* [鐐规暟鐩戞帶]鎺ュ彛璋冩暣 +* [鐐规暟鐩戞帶]涓嶨KP閲戝洟璁板綍瀵规帴鎺ュ彛 + +## 鑼椾紛鎻掍欢闆 v10 + +* 淇鍠婅瘽澧炲己鍜屼究绗哄琛屾枃鏈笉鑳戒繚瀛樼殑闂 +* 淇蹇熺櫥鍑哄揩鎹烽敭閿欒鐨勯棶棰 +* 浼樺寲鎵佸钩琛鏉¤幏鍙栨棤甯細鐜╁甯細淇℃伅鐨勯昏緫 +* 闄愬埗鍠婅瘽澧炲己瀛楁暟闃叉鍒峰睆 +* 鑱屼笟鏌撹壊鏀寔鑷畾涔夐鑹茶缃 +* 鎻掍欢鍏ュ彛鏁村悎 + +## 鑼椾紛鎻掍欢闆 v9 + +* [鑱婂ぉ鐩戞帶]鏀寔璁剧疆蹇嵎閿紑鍏崇洃鎺х姸鎬 +* [鑱婂ぉ鐩戞帶]鏂板杈撳嚭鑱婂ぉ鏍忛夐」锛屽嬀閫夊悗鐩戞帶鍒扮殑淇℃伅浼氳緭鍑哄埌鑱婂ぉ鏍忕郴缁熼閬 +* [鑱婂ぉ鐩戞帶]鐣岄潰鏂板閭璇峰叆甯紝娣诲姞濂藉弸绛 +* [鑱婂ぉ鐩戞帶]鏂板寮鍚鍒欒〃杈惧紡妯″紡纭鎻愮ず闃叉璇搷浣 +* [鑱婂ぉ鐩戞帶]鑷姩淇濆瓨褰撳墠鐩戞帶寮鍚姸鎬侊紝涓嬫鐧诲綍鍙嚜鍔ㄧ户缁洃鎺 +* [甯哥敤宸ュ叿]浼樺寲鑳屽寘杩囨护鎬ц兘 +* [甯哥敤宸ュ叿]鍙栨秷鎴樻枟鍙鍖栧浘鏍囬棯鐑 +* [甯哥敤宸ュ叿]淇BUFF鐩戞帶鐩爣涓㈠け鏃剁洃鎺т笉鍒锋柊鐨勯棶棰 +* [甯哥敤宸ュ叿]淇BUFF鐩戞帶鍒囧湴鍥炬槸鏈夋椂澶辨晥鐨勯棶棰 + +## 鑼椾紛鎻掍欢闆 v8 + +* 鏂板鑳屽寘/浠撳簱鏌ユ壘杩囨护鍔熻兘锛屾敮鎸侀珮浜樉绀洪檺鏃剁墿鍝併 +* 鏂板甯哥敤宸ュ叿-BUFF鐩戞帶鍔熻兘锛屽彲浠ヨ缃嚜韬拰鐩爣鐨凚UFF鐩戞帶銆 +* 鎵佸钩琛鏉℃柊澧炶劚鎴橀殣钘忚閲忕櫨鍒嗘瘮鏄剧ず璁惧畾鍜岄殣钘忓皬鏁扮偣璁惧畾銆 +* 鎵佸钩琛鏉℃柊澧炶嚜鍔ㄨ皟鏁村ご椤惰鏉″墠鍚庝綅缃殑閫夐」锛岄粯璁ゅ叧闂紝寮鍚皢澧炲姞绯荤粺寮閿銆 +* 涓荤晫闈㈤粯璁ゅ嚭鐜板湪鑽у箷涓ぎ锛屽苟淇涓浜涘皬闂銆 +* 淇鑱屼笟鏌撹壊鍦ㄧ紦瀛樺崰婊$殑鎯呭喌涓嬩笉鑳借褰曟柊鏁版嵁鐨勯棶棰樸 +* 甯哥敤宸ュ叿鏂板鎶鑳藉彲瑙嗗寲锛堟垬鏂楄褰曪級鍔熻兘銆 +* 淇涓浜沀I閿欒鍜屽簱鍑芥暟閿欒锛岄噸鏋勪紭鍖栦簡閮ㄥ垎搴撳嚱鏁般 +* 淇鎵佸钩琛鏉PC绉板彿璁剧疆涓嶇敓鏁堢殑闂銆 + +## 鑼椾紛鎻掍欢闆 v7 + +* 淇鎵佸钩琛鏉″府浼/绉板彿涓嶅埛鏂扮殑闂 +* 淇鎵佸钩琛鏉℃煇浜涙儏鍐典笅涓嶆樉绀哄悕瀛楃殑闂 +* 淇鎵佸钩琛鏉″垽鏂帺瀹舵槸鍚︽浜℃椂鍚嶇О棰滆壊涓嶅彉鐨勯棶棰 +* 瀹屽杽鍚勪釜瀛愭彃浠惰瑷鍖 + +## 鑼椾紛鎻掍欢闆 v6 + +* 淇鎵佸钩琛鏉″洜鑾峰彇璇绘潯瀵艰嚧鐩爣鍒囨崲鐨勯棶棰 +* 閲嶆瀯鎵佸钩琛鏉 +* 鏂板鎵佸钩琛鏉¤鏉℃墦鏂彉绾 +* 鎵佸钩琛鏉¤鏉$粨鏉熸笎闅 +* 淇鎵佸钩琛鏉¢嗚鏉$粨鏉熷垽瀹氶敊璇殑闂 +* 淇鎵佸钩琛鏉′汉鏁拌繃澶氬鑷村悕绉颁笉鏄剧ず鐨勯棶棰 +* 淇鎵佸钩琛鏉$帺瀹跺府浼/绉板彿鍙樺寲鏃舵病鏈夋洿鏂扮殑闂 +* 鑱婂ぉ鍒囨崲鍚屼竴璐﹀彿涓嶅啀鍏变韩鐣岄潰浣嶇疆璁惧畾 +* 浼樺寲搴撳嚱鏁 + +## 鑼椾紛鎻掍欢闆 v5 + +* 澶撮《琛鏉℃樉绀轰紭鍖 +* 鏂板閫嗚鏉℃樉绀 + +## 鑼椾紛鎻掍欢闆 v4 + +* 浼樺寲鍏冪礌閫夋嫨鍣ㄦц兘 +* 鏀寔鑷畾涔夎祫婧愭枃浠跺澹伴煶鏂囦欢(鏂规硶锛氬皢鍚屽悕鏂囦欢鏀惧叆/MY/@Custom/鏂囦欢澶逛腑) +* 鏂板棰滆壊閫夋嫨鍣ㄥ拰瀛椾綋閫夋嫨鍣ㄦ柟娉 +* 淇涓荤獥浣撻珮搴﹁缃笉姝g‘瀵艰嚧閮ㄥ垎鐣岄潰涓嶈兘閫変腑鐨勯棶棰 +* 淇涓浜涚炕璇戦敊璇 +* 鎵佸钩琛鏉¤缃叏闈㈢晫闈㈠寲 +* 鎵佸钩琛鏉″姞鍏ュご椤惰鏉″姛鑳 +* 鐩爣璺濈淇℃伅鏉$簿纭埌灏忔暟鐐瑰悗涓浣 +* 淇敼涓嬫媺妗嗘牱寮忚〃 鐣岄潰鏇村姞缇庤濂界敤 + +## 鑼椾紛鎻掍欢闆 v3 + +* 鍔犲叆绯荤粺淇℃伅鏉 +* 鍔犲叆鎴樻枟璁℃椂鏄剧ず +* 鍔犲叆鐩爣璺濈鏄剧ず +* 鍔犲叆妗傝姳鍜岃棔鍒锋柊鍊掕鏃 +* 淇鑱屼笟鏌撹壊涓嶈兘姝e父鏌撹壊鐨勯棶棰 +* 璋冩暣鎵佸钩琛鏉¢忔槑搴 + +## 鑼椾紛鎻掍欢闆 v2 + +* 鍔犲叆澶撮《鏂囧瓧鍔熻兘 +* 鍔犲叆鎴浘鍔╂墜鍔熻兘 +* 淇棰戦亾鍒囨崲灏忛槦鎸夐挳涓嶅彲鐢ㄧ殑闂 +* 淇棰戦亾鍒囨崲鏉′綅缃笉淇濆瓨鐨勯棶棰 +* 淇鑱婂ぉ澶嶅埗鏃惰亰澶╄〃鎯呭嚭閿欑殑闂 +* 淇鑱婂ぉ鐩戞帶涓嶈兘鐩戞帶绯荤粺棰戦亾鐨勯棶棰 +* 淇鍓湰涓鏌ュ叡鎴樿鍒ょ殑闂 +* 鑱婂ぉ澶嶅埗鍔犲叆鍏佽澶嶅埗绯荤粺娑堟伅鐨勯夐」 +* 鑱屼笟鏌撹壊鍑忓皯榛樿瑙掕壊缂撳瓨鏁伴噺锛屼紭鍖栨ц兘 +* 淇鑾峰彇闄勮繎NPC鏃讹紝閮ㄥ垎NPC鍚嶅瓧涓虹┖鐨勯棶棰 +* 淇敼鍜屽畬鍠勯儴鍒嗘ā鍧楄瑷鍖 + +## 鑼椾紛鎻掍欢闆 v1 + +* 鏀圭増鍚庣涓鐗堝彂甯 diff --git a/LICENSE b/LICENSE index 1488afff2..98ce76540 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2009, SeasunGame +Copyright (c) 2012, Emil Zhai All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/MYDev_Snaplines/info.ini b/MYDev_Snaplines/info.ini new file mode 100644 index 000000000..204122cc1 --- /dev/null +++ b/MYDev_Snaplines/info.ini @@ -0,0 +1,8 @@ +[MYDev_Snaplines] +name=辅助线工具 +desc=[开发者工具] Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_Snaplines.lua +package=MY \ No newline at end of file diff --git a/MYDev_Snaplines/info.ini.zh_TW b/MYDev_Snaplines/info.ini.zh_TW new file mode 100644 index 000000000..f9c264cbd --- /dev/null +++ b/MYDev_Snaplines/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MYDev_Snaplines] +name=杓斿姪绶氬伐鍏 +desc=[闁嬬櫦鑰呭伐鍏穄 Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_Snaplines.lua +package=MY \ No newline at end of file diff --git a/MYDev_Snaplines/lang/zhcn.jx3dat b/MYDev_Snaplines/lang/zhcn.jx3dat new file mode 100644 index 000000000..0f392171e --- /dev/null +++ b/MYDev_Snaplines/lang/zhcn.jx3dat @@ -0,0 +1,16 @@ +return { + ['MYDev_Snaplines'] = '元素辅助', + ['Snaplines'] = '元素辅助', + ['Snaplines - ShowTip'] = '元素辅助 - 显示信息', + ['Snaplines - ShowData'] = '元素辅助 - 显示数据', + ['enable tree path view'] = '启用UI元素辅助线与信息显示', + ['show wnd tip'] = '显示WND信息', + ['show item tip'] = '显示ITEM信息', + ['show tip'] = '显示信息', + ['show data'] = '显示数据', + ['font'] = '字体', + ['show wnd snaplines'] = '显示窗体辅助线', + ['show item snaplines'] = '显示组件容器辅助线', + ['auto detect box'] = '自动查找鼠标滑过的Box', + ['auto scale'] = '自动缩放', +} diff --git a/MYDev_Snaplines/lang/zhtw.jx3dat b/MYDev_Snaplines/lang/zhtw.jx3dat new file mode 100644 index 000000000..9fc724d53 --- /dev/null +++ b/MYDev_Snaplines/lang/zhtw.jx3dat @@ -0,0 +1,16 @@ +return { + ['MYDev_Snaplines'] = '鍏冪礌杓斿姪', + ['Snaplines'] = '鍏冪礌杓斿姪', + ['Snaplines - ShowTip'] = '鍏冪礌杓斿姪 - 椤ず淇℃伅', + ['Snaplines - ShowData'] = '鍏冪礌杓斿姪 - 椤ず鏁告摎', + ['enable tree path view'] = '鍟熺敤UI鍏冪礌杓斿姪绶氳垏淇℃伅椤ず', + ['show wnd tip'] = '椤ずWND淇℃伅', + ['show item tip'] = '椤ずITEM淇℃伅', + ['show tip'] = '椤ず淇℃伅', + ['show data'] = '椤ず鏁告摎', + ['font'] = '瀛楅珨', + ['show wnd snaplines'] = '椤ず绐楅珨杓斿姪绶', + ['show item snaplines'] = '椤ず绲勪欢瀹瑰櫒杓斿姪绶', + ['auto detect box'] = '鑷嫊鏌ユ壘婊戦紶婊戦亷鐨凚ox', + ['auto scale'] = '鑷嫊绺斁', +} diff --git a/MYDev_Snaplines/src/MYDev_Snaplines.lua b/MYDev_Snaplines/src/MYDev_Snaplines.lua new file mode 100644 index 000000000..30c366294 --- /dev/null +++ b/MYDev_Snaplines/src/MYDev_Snaplines.lua @@ -0,0 +1,662 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 开发者工具 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MYDev_Snaplines/MYDev_Snaplines' +local PLUGIN_NAME = 'MYDev_Snaplines' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MYDev_Snaplines' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +-- 数据存储 +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MYDev_Snaplines', { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['enable tree path view'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bDetectBox = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['auto detect box'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowWndSnaplines = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show wnd snaplines'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowWndTip = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show wnd tip'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowItemTip = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show item tip'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowItemSnaplines = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show item snaplines'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTip = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show tip'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowData = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show data'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgbWndSnaplines = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show wnd snaplines'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = {0, 0, 0}, + }, + rgbItemSnaplines = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show item snaplines'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = {0, 255, 0}, + }, + rgbTip = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['show tip'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = {255, 255, 0}, + }, + nTipFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 40, + }, + bAutoScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_Snaplines'], + szDescription = X.MakeCaption({ + _L['auto scale'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) + +MYDev_Snaplines = {} +-------------------------------------------------------------------------- +-- 本地函数 +-------------------------------------------------------------------------- +local function var2str(var, indent, level) + local exists = {} + local function table_r(var, level, indent) + local t = {} + local szType = type(var) + if szType == 'nil' then + table.insert(t, 'nil') + elseif szType == 'number' then + table.insert(t, tostring(var)) + elseif szType == 'string' then + table.insert(t, string.format('%q', var)) + -- elseif szType == 'function' then + -- local s = string.dump(var) + -- table.insert(t, 'loadstring('') + -- -- 'string slice too long' + -- for i = 1, #s, 2000 do + -- table.insert(t, table.concat({'', string.byte(s, i, i + 2000 - 1)}, '\\')) + -- end + -- table.insert(t, '')') + elseif szType == 'boolean' then + table.insert(t, tostring(var)) + elseif szType == 'table' then + if exists [var] then + table.insert(t, '"[[recursive table]]"') + else + exists[var] = true + table.insert(t, '{') + local s_tab_equ = ']=' + if indent then + s_tab_equ = '] = ' + if not X.IsEmpty(var) then + table.insert(t, '\n') + end + end + for key, val in pairs(var) do + if indent then + table.insert(t, string.rep(indent, level + 1)) + end + table.insert(t, '[') + table.insert(t, table_r(key, level + 1, indent)) + table.insert(t, s_tab_equ) --'] = ' + table.insert(t, table_r(val, level + 1, indent)) + table.insert(t, ',') + if indent then + table.insert(t, '\n') + end + end + if indent and not X.IsEmpty(var) then + table.insert(t, string.rep(indent, level)) + end + table.insert(t, '}') + end + else --if (szType == 'userdata') then + table.insert(t, '"') + table.insert(t, tostring(var)) + table.insert(t, '"') + end + return table.concat(t) + end + return table_r(var, level or 0, indent) +end + +local function InsertElementBasicTip(hElem, tTip) + local nAbsX, nAbsY = hElem:GetAbsPos() + local nRelX, nRelY = hElem:GetRelPos() + local nW, nH = hElem:GetSize() + + table.insert(tTip, _L('Name: %s', hElem:GetName())) + table.insert(tTip, _L('Type: %s', hElem:GetType())) + table.insert(tTip, _L('Path: %s', X.UI.GetTreePath(hElem))) + table.insert(tTip, _L('X: %s, %s', nRelX, nAbsX)) + table.insert(tTip, _L('Y: %s, %s', nRelY, nAbsY)) + table.insert(tTip, _L('W: %s', nW)) + table.insert(tTip, _L('H: %s', nH)) +end + +local function InsertElementDetailTip(hElem, tTip) + local szType = hElem:GetType() + if szType == 'Text' then + table.insert(tTip, _L('FontScheme: %s', hElem:GetFontScheme())) + table.insert(tTip, _L('Text: %s', hElem:GetText())) + table.insert(tTip, _L('TextLen: %s', hElem:GetTextLen())) + table.insert(tTip, _L('VAlign: %s', hElem:GetVAlign())) + table.insert(tTip, _L('HAlign: %s', hElem:GetHAlign())) + table.insert(tTip, _L('RowSpacing: %s', hElem:GetRowSpacing())) + table.insert(tTip, _L('IsMultiLine: %s', tostring(hElem:IsMultiLine()))) + table.insert(tTip, _L('IsCenterEachLine: %s', tostring(hElem.IsCenterEachLine and tostring(hElem:IsCenterEachLine()) or 'N/A'))) + table.insert(tTip, _L('FontSpacing: %s', hElem:GetFontSpacing())) + table.insert(tTip, _L('IsRichText: %s', tostring(hElem:IsRichText()))) + table.insert(tTip, _L('FontScale: %s', hElem:GetFontScale())) + table.insert(tTip, _L('FontID: %s', hElem:GetFontID())) + table.insert(tTip, _L('FontColor: %s', table.concat({ hElem:GetFontColor() }, ', '))) + table.insert(tTip, _L('FontBoder: %s', hElem:GetFontBoder())) + table.insert(tTip, _L('FontProjection: %s', hElem:GetFontProjection())) + table.insert(tTip, _L('TextExtent: %s', hElem:GetTextExtent())) + table.insert(tTip, _L('TextPosExtent: %s', hElem:GetTextPosExtent())) + table.insert(tTip, _L('Index: %s', hElem:GetIndex())) + elseif szType == 'Image' then + local szPath, nFrame = hElem:GetImagePath() + table.insert(tTip, _L('Image: %s', szPath or '')) + if nFrame then + table.insert(tTip, _L('Frame: %s', nFrame)) + end + table.insert(tTip, _L('ImageType: %s', hElem:GetImageType())) + table.insert(tTip, _L('ImageID: %s', hElem:GetImageID())) + table.insert(tTip, _L('Index: %s', hElem:GetIndex())) + elseif szType == 'Shadow' then + table.insert(tTip, _L('ShadowColor: %s', table.concat({ hElem:GetShadowColor() }, ', '))) + table.insert(tTip, _L('ColorRGB: %s', table.concat({ hElem:GetColorRGB() }, ', '))) + table.insert(tTip, _L('IsTriangleFan: %s', tostring(hElem:IsTriangleFan()))) + table.insert(tTip, _L('Index: %s', hElem:GetIndex())) + elseif szType == 'Animate' then + table.insert(tTip, _L('IsFinished: %s', tostring(hElem:IsFinished()))) + table.insert(tTip, _L('Index: %s', hElem:GetIndex())) + elseif szType == 'Box' then + table.insert(tTip, _L('BoxIndex: %s', hElem:GetBoxIndex())) + -- table.insert(tTip, _L('Object: %s', hElem:GetObject())) + table.insert(tTip, _L('ObjectType: %s', hElem:GetObjectType())) + table.insert(tTip, _L('ObjectData: %s', table.concat({hElem:GetObjectData()}, ', '))) + table.insert(tTip, _L('IsEmpty: %s', tostring(hElem:IsEmpty()))) + if not hElem:IsEmpty() then + table.insert(tTip, _L('IsObjectEnable: %s', tostring(hElem:IsObjectEnable()))) + table.insert(tTip, _L('IsObjectCoolDown: %s', tostring(hElem:IsObjectCoolDown()))) + table.insert(tTip, _L('IsObjectSelected: %s', tostring(hElem:IsObjectSelected()))) + table.insert(tTip, _L('IsObjectMouseOver: %s', tostring(hElem:IsObjectMouseOver()))) + table.insert(tTip, _L('IsObjectPressed: %s', tostring(hElem:IsObjectPressed()))) + table.insert(tTip, _L('CoolDownPercentage: %s', hElem:GetCoolDownPercentage())) + table.insert(tTip, _L('ObjectIcon: %s', hElem:GetObjectIcon())) + table.insert(tTip, _L('OverText%s: [Font]%s [Pos]%s [Text]%s', 0, hElem:GetOverTextFontScheme(0), hElem:GetOverTextPosition(0), hElem:GetOverText(0))) + table.insert(tTip, _L('OverText%s: [Font]%s [Pos]%s [Text]%s', 1, hElem:GetOverTextFontScheme(1), hElem:GetOverTextPosition(1), hElem:GetOverText(1))) + table.insert(tTip, _L('OverText%s: [Font]%s [Pos]%s [Text]%s', 2, hElem:GetOverTextFontScheme(2), hElem:GetOverTextPosition(2), hElem:GetOverText(2))) + table.insert(tTip, _L('OverText%s: [Font]%s [Pos]%s [Text]%s', 3, hElem:GetOverTextFontScheme(3), hElem:GetOverTextPosition(3), hElem:GetOverText(3))) + table.insert(tTip, _L('OverText%s: [Font]%s [Pos]%s [Text]%s', 4, hElem:GetOverTextFontScheme(4), hElem:GetOverTextPosition(4), hElem:GetOverText(4))) + end + table.insert(tTip, _L('Index: %s', hElem:GetIndex())) + elseif szType == 'WndButton' then + table.insert(tTip, _L('ImagePath: %s', hElem:GetAnimatePath() or '')) + table.insert(tTip, _L('Normal: %d', hElem:GetAnimateGroupNormal())) + table.insert(tTip, _L('Over: %d', hElem:GetAnimateGroupMouseOver())) + table.insert(tTip, _L('Down: %d', hElem:GetAnimateGroupMouseDown())) + table.insert(tTip, _L('Disable: %d', hElem:GetAnimateGroupDisable())) + end +end + +local function InsertElementDataTip(hElem, tTip) + local data = {} + for k, v in pairs(hElem) do + if type(v) ~= 'function' then + data[k] = v + end + end + table.insert(tTip, _L('data: %s', var2str(data, ' '))) +end + +local function InsertElementTip(hElem, tTip) + if O.bShowTip + or O.bShowData then + InsertElementBasicTip(hElem, tTip) + end + if O.bShowTip then + InsertElementDetailTip(hElem, tTip) + end + if O.bShowData then + InsertElementDataTip(hElem, tTip) + end +end + +-------------------------------------------------------------------------- +-- 界面事件响应 +-------------------------------------------------------------------------- +function MYDev_Snaplines.OnFrameCreate() + local W, H = Station.GetClientSize() + -- Wnd辅助线 + if O.bShowWndSnaplines then + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndLeft' ):SetColorRGB(unpack(O.rgbWndSnaplines)) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndRight' ):SetColorRGB(unpack(O.rgbWndSnaplines)) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndTop' ):SetColorRGB(unpack(O.rgbWndSnaplines)) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndBottom'):SetColorRGB(unpack(O.rgbWndSnaplines)) + else + this:Lookup('', 'Handle_Snaplines_Wnd'):Hide() + end + -- Item辅助线 + if O.bShowItemSnaplines then + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemLeft' ):SetColorRGB(unpack(O.rgbItemSnaplines)) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemRight' ):SetColorRGB(unpack(O.rgbItemSnaplines)) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemTop' ):SetColorRGB(unpack(O.rgbItemSnaplines)) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemBottom'):SetColorRGB(unpack(O.rgbItemSnaplines)) + else + this:Lookup('', 'Handle_Snaplines_Item'):Hide() + end + -- 文字 + this:Lookup('', 'Handle_Tip/Text_HoverTip'):SetFontScheme(O.nTipFont) + this:Lookup('', 'Handle_Tip/Text_HoverTip'):SetFontColor(unpack(O.rgbTip)) + + MYDev_Snaplines.OnEvent('UI_SCALED') +end + +function MYDev_Snaplines.OnFrameBreathe() + local hWnd, hItem = Station.GetMouseOverWindow() + if hWnd then + -- Wnd + local nClientW, nClientH = Station.GetClientSize() + local nCursorX, nCursorY = Cursor.GetPos() + local nWndX , nWndY = hWnd:GetAbsPos() + local nWndW , nWndH = hWnd:GetSize() + local hText = this:Lookup('', 'Handle_Tip/Text_HoverTip') + -- Wnd信息 + local tTip = {} + table.insert(tTip, _L('CursorX: %s', nCursorX)) + table.insert(tTip, _L('CursorY: %s', nCursorY)) + if O.bShowWndTip then + InsertElementTip(hWnd, tTip) + end + -- Wnd辅助线位置 + if O.bShowWndSnaplines then + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndLeft' ):SetAbsPos(nWndX - 2 , 0) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndRight' ):SetAbsPos(nWndX + nWndW, 0) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndTop' ):SetAbsPos(0, nWndY - 2 ) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndBottom'):SetAbsPos(0, nWndY + nWndH) + end + -- 检测鼠标所在Box信息 + if O.bDetectBox and not (hItem and hItem:GetType() == 'Box') then + X.UI(hWnd):Find('.Box'):Each(function() + if this:PtInItem(nCursorX, nCursorY) then + table.insert(tTip, '---------------------') + InsertElementTip(this, tTip) + end + end) + end + -- Item + if hItem then + -- Item信息 + local nItemX, nItemY = hItem:GetAbsPos() + local nItemW, nItemH = hItem:GetSize() + table.insert(tTip, _L['-------------------']) + if O.bShowItemTip then + InsertElementTip(hItem, tTip) + end + -- Item辅助线位置 + if O.bShowItemSnaplines then + this:Lookup('', 'Handle_Snaplines_Item'):Show() + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemLeft' ):SetAbsPos(nItemX - 2 , 0) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemRight' ):SetAbsPos(nItemX + nItemW, 0) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemTop' ):SetAbsPos(0, nItemY - 2 ) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemBottom'):SetAbsPos(0, nItemY + nItemH) + end + else + this:Lookup('', 'Handle_Snaplines_Item'):Hide() + end + hText:SetText(table.concat(tTip, '\n')) + + -- 缩放 + if O.bAutoScale then + -- hText:EnableScale(true) + hText:SetFontScale(1) + hText:AutoSize() + local nTextW, nTextH = hText:GetSize() + local fScale = math.min( nClientW / nTextW, nClientH / nTextH ) + if fScale < 1 then + hText:SetFontScale(fScale) + hText:AutoSize() + end + end + + -- 位置 + local nTextW, nTextH = hText:GetSize() + local nTextX, nTextY + nTextX = nWndX + 5 + if nTextX + nTextW > nClientW then + nTextX = nClientW - nTextW + elseif nTextX < 0 then + nTextX = 0 + end + + local bReAdjustX + if nWndY >= nTextH then -- 顶部可以显示的下 + nTextY = nWndY - nTextH + elseif nWndY + nWndH + 1 + nTextH <= nClientH then -- 底部显示的下 + nTextY = nWndY + nWndH + 1 + elseif nWndY + nTextH <= nClientH then -- 中间开始显示的下 + nTextY = nWndY + 20 + bReAdjustX = true + else + nTextY = 5 + bReAdjustX = true + end + if bReAdjustX then + if nWndX >= nTextW + 5 then -- 左侧显示的下 + nTextX = nWndX - nTextW - 5 + elseif nWndX + nWndW + nTextW + 5 <= nClientW then -- 右侧显示的下 + nTextX = nWndX + nWndW + 5 + end + end + hText:SetAbsPos(nTextX, nTextY) + end + this:BringToTop() +end + +function MYDev_Snaplines.OnEvent(event) + if event == 'UI_SCALED' then + local W, H = Station.GetClientSize() + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndLeft' ):SetSize(2, H) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndRight' ):SetSize(2, H) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndTop' ):SetSize(W, 2) + this:Lookup('', 'Handle_Snaplines_Wnd/Shadow_HoverWndBottom' ):SetSize(W, 2) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemLeft' ):SetSize(2, H) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemRight' ):SetSize(2, H) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemTop' ):SetSize(W, 2) + this:Lookup('', 'Handle_Snaplines_Item/Shadow_HoverItemBottom'):SetSize(W, 2) + end +end + +-------------------------------------------------------------------------- +-- 控制部分 +-------------------------------------------------------------------------- +-- 重载界面 +MYDev_Snaplines.ReloadUI = function() + X.UI.CloseFrame('MYDev_Snaplines') + if O.bEnable then + X.UI.OpenFrame(X.PACKET_INFO.ROOT .. 'MYDev_Snaplines/ui/MYDev_Snaplines.ini', 'MYDev_Snaplines') + end +end +X.RegisterInit('MYDEV_SNAPLINES', MYDev_Snaplines.ReloadUI) + +local PS = {} + +function PS.IsRestricted() + return not X.IsDebugging('Dev_Snaplines') +end + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 300, h = 25, + text = _L['enable tree path view'], + checked = O.bEnable or false, + onCheck = function(bCheck) + O.bEnable = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show tip'], + checked = O.bShowTip or false, + onCheck = function(bCheck) + O.bShowTip = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nX = nX + 200 + + ui:Append('Shadow', { + x = nX, y = nY + 3, w = 20, h = 20, + color = O.rgbTip or {255, 255, 255}, + onClick = function() + local me = this + X.UI.OpenColorPicker(function(r, g, b) + X.UI(me):Color(r, g, b) + O.rgbTip = {r, g, b} + MYDev_Snaplines.ReloadUI() + end) + end + }) + nX = nX + 40 + + ui:Append('WndButton', { + x = nX, y = nY, h = 25, + text = _L['font'], + onClick = function() + X.UI.OpenFontPicker(function(f) + O.nTipFont = f + MYDev_Snaplines.ReloadUI() + end) + end + }) + nX = nPaddingX + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show data'], + checked = O.bShowData or false, + onCheck = function(bCheck) + O.bShowData = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show wnd tip'], + checked = O.bShowWndTip or false, + onCheck = function(bCheck) + O.bShowWndTip = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show item tip'], + checked = O.bShowItemTip or false, + onCheck = function(bCheck) + O.bShowItemTip = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show wnd snaplines'], + checked = O.bShowWndSnaplines or false, + onCheck = function(bCheck) + O.bShowWndSnaplines = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nX = nX + 200 + + ui:Append('Shadow', { + x = nX, y = nY + 3, w = 20, h = 20, + color = O.rgbWndSnaplines or {255, 255, 255}, + onClick = function() + local me = this + X.UI.OpenColorPicker(function(r, g, b) + X.UI(me):Color(r, g, b) + O.rgbWndSnaplines = {r, g, b} + MYDev_Snaplines.ReloadUI() + end) + end + }) + nX = nPaddingX + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['show item snaplines'], + checked = O.bShowItemSnaplines or false, + onCheck = function(bCheck) + O.bShowItemSnaplines = bCheck + MYDev_Snaplines.ReloadUI() + end + }) + nX = nX + 200 + + ui:Append('Shadow', { + x = nX, y = nY + 3, w = 20, h = 20, + color = O.rgbItemSnaplines or {255, 255, 255}, + onClick = function() + local me = this + X.UI.OpenColorPicker(function(r, g, b) + X.UI(me):Color(r, g, b) + O.rgbItemSnaplines = {r, g, b} + MYDev_Snaplines.ReloadUI() + end) + end + }) + nX = nPaddingX + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['auto detect box'], + checked = O.bDetectBox or false, + onCheck = function(bCheck) + O.bDetectBox = bCheck + end + }) + nY = nY + 40 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, h = 25, + text = _L['auto scale'], + checked = O.bAutoScale, + onCheck = function(bCheck) + O.bAutoScale = bCheck + end + }) + nY = nY + 40 + + ui:Append('Text', { + x = nW - 140, y = 20, w = 140, h = 25, + color = {255, 255, 0}, + text = _L['>> set hotkey <<'], + onClick = function() X.SetHotKey() end + }) +end + +-- 注册面板 +X.Panel.Register(_L['Development'], 'Dev_Snaplines', _L['Snaplines'], 'ui/Image/UICommon/PlugIn.UITex|1', PS) + +-- 注册快捷键 +X.RegisterHotKey('MY_Dev_Snaplines' , _L['Snaplines'] , function() O.bEnable = not O.bEnable MYDev_Snaplines.ReloadUI() end, nil) +X.RegisterHotKey('MY_Dev_Snaplines_ShowTip' , _L['Snaplines - ShowTip'] , function() O.bShowTip = not O.bShowTip MYDev_Snaplines.ReloadUI() end, nil) +X.RegisterHotKey('MY_Dev_Snaplines_ShowData', _L['Snaplines - ShowData'], function() O.bShowData = not O.bShowData MYDev_Snaplines.ReloadUI() end, nil) +-- For Debug +if IsDebugClient and IsDebugClient() then + X.RegisterInit('Dev_Snaplines_Hotkey', function() + X.SetHotKey('MY_Dev_Snaplines', 121) + X.SetHotKey('MY_Dev_Snaplines_ShowTip', 122) + X.SetHotKey('MY_Dev_Snaplines_ShowData', 123) + end) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MYDev_Snaplines/ui/MYDev_Snaplines.ini b/MYDev_Snaplines/ui/MYDev_Snaplines.ini new file mode 100644 index 000000000..ed5b8430c --- /dev/null +++ b/MYDev_Snaplines/ui/MYDev_Snaplines.ini @@ -0,0 +1,133 @@ +[MYDev_Snaplines] +._WndType=WndFrame +._Parent=Topmost2 +Left=0 +Top=0 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 +MousePenetrable=1 +ShowWhenHideUI=1 + +[Handle_Total] +._WndType=Handle +._Parent=MYDev_Snaplines +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Snaplines_Wnd] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_HoverWndLeft] +._WndType=Shadow +._Parent=Handle_Snaplines_Wnd +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverWndRight] +._WndType=Shadow +._Parent=Handle_Snaplines_Wnd +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverWndTop] +._WndType=Shadow +._Parent=Handle_Snaplines_Wnd +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverWndBottom] +._WndType=Shadow +._Parent=Handle_Snaplines_Wnd +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Handle_Snaplines_Item] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_HoverItemLeft] +._WndType=Shadow +._Parent=Handle_Snaplines_Item +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverItemRight] +._WndType=Shadow +._Parent=Handle_Snaplines_Item +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverItemTop] +._WndType=Shadow +._Parent=Handle_Snaplines_Item +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Shadow_HoverItemBottom] +._WndType=Shadow +._Parent=Handle_Snaplines_Item +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=255 + +[Handle_Tip] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 + +[Text_HoverTip] +._WndType=Text +._Parent=Handle_Tip +PosType=8 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text= +MultiLine=1 + diff --git a/MYDev_UIEventID/info.ini b/MYDev_UIEventID/info.ini new file mode 100644 index 000000000..694ecaa68 --- /dev/null +++ b/MYDev_UIEventID/info.ini @@ -0,0 +1,8 @@ +[MYDev_UIEventID] +name=UI事件ID计算 +desc=[开发者工具] Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_UIEventID.lua +package=MY diff --git a/MYDev_UIEventID/info.ini.zh_TW b/MYDev_UIEventID/info.ini.zh_TW new file mode 100644 index 000000000..c7e9188dc --- /dev/null +++ b/MYDev_UIEventID/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MYDev_UIEventID] +name=UI浜嬩欢ID瑷堢畻 +desc=[闁嬬櫦鑰呭伐鍏穄 Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_UIEventID.lua +package=MY diff --git a/MYDev_UIEventID/lang/zhcn.jx3dat b/MYDev_UIEventID/lang/zhcn.jx3dat new file mode 100644 index 000000000..b9ce93566 --- /dev/null +++ b/MYDev_UIEventID/lang/zhcn.jx3dat @@ -0,0 +1,25 @@ +return { + ['UIEventID' ] = '界面事件', + ['OnKeyDown' ] = '键盘按下', + ['OnKeyUp' ] = '键盘弹起', + ['OnLButtonDown' ] = '左键按下', + ['OnLButtonUp' ] = '左键弹起', + ['OnLButtonClick' ] = '左键点击', + ['OnLButtonDbClick' ] = '左键双击', + ['OnLButtonDrag' ] = '左键拖拽', + ['OnRButtonDown' ] = '右键按下', + ['OnRButtonUp' ] = '右键弹起', + ['OnRButtonClick' ] = '右键点击', + ['OnRButtonDbClick' ] = '右键双击', + ['OnRButtonDrag' ] = '右键拖拽', + ['OnMButtonDown' ] = '中键按下', + ['OnMButtonUp' ] = '中键弹起', + ['OnMButtonClick' ] = '中键点击', + ['OnMButtonDbClick' ] = '中键双击', + ['OnMButtonDrag' ] = '中键拖拽', + ['OnMouseEnterLeave'] = '鼠标进出', + ['OnMouseArea' ] = '鼠标区域', + ['OnMouseMove' ] = '鼠标移动', + ['OnMouseHover' ] = '鼠标悬停', + ['OnScroll' ] = '滚轮事件', +} diff --git a/MYDev_UIEventID/lang/zhtw.jx3dat b/MYDev_UIEventID/lang/zhtw.jx3dat new file mode 100644 index 000000000..269b253a5 --- /dev/null +++ b/MYDev_UIEventID/lang/zhtw.jx3dat @@ -0,0 +1,25 @@ +return { + ['UIEventID' ] = '鐣岄潰浜嬩欢', + ['OnKeyDown' ] = '閸电洡鎸変笅', + ['OnKeyUp' ] = '閸电洡褰堣捣', + ['OnLButtonDown' ] = '宸﹂嵉鎸変笅', + ['OnLButtonUp' ] = '宸﹂嵉褰堣捣', + ['OnLButtonClick' ] = '宸﹂嵉榛炴搳', + ['OnLButtonDbClick' ] = '宸﹂嵉闆欐搳', + ['OnLButtonDrag' ] = '宸﹂嵉鎷栨嫿', + ['OnRButtonDown' ] = '鍙抽嵉鎸変笅', + ['OnRButtonUp' ] = '鍙抽嵉褰堣捣', + ['OnRButtonClick' ] = '鍙抽嵉榛炴搳', + ['OnRButtonDbClick' ] = '鍙抽嵉闆欐搳', + ['OnRButtonDrag' ] = '鍙抽嵉鎷栨嫿', + ['OnMButtonDown' ] = '涓嵉鎸変笅', + ['OnMButtonUp' ] = '涓嵉褰堣捣', + ['OnMButtonClick' ] = '涓嵉榛炴搳', + ['OnMButtonDbClick' ] = '涓嵉闆欐搳', + ['OnMButtonDrag' ] = '涓嵉鎷栨嫿', + ['OnMouseEnterLeave'] = '婊戦紶閫插嚭', + ['OnMouseArea' ] = '婊戦紶鍗鍩', + ['OnMouseMove' ] = '婊戦紶绉诲嫊', + ['OnMouseHover' ] = '婊戦紶鎳稿仠', + ['OnScroll' ] = '婊捐吉浜嬩欢', +} diff --git a/MYDev_UIEventID/src/MYDev_UIEventID.lua b/MYDev_UIEventID/src/MYDev_UIEventID.lua new file mode 100644 index 000000000..48df631de --- /dev/null +++ b/MYDev_UIEventID/src/MYDev_UIEventID.lua @@ -0,0 +1,118 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : UI事件ID计算 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MYDev_UIEventID/MYDev_UIEventID' +local PLUGIN_NAME = 'MYDev_UIEventID' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MYDev_UIEventID' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local _C = {} +_C.tEventIndex = { + { text = _L['OnKeyDown' ], bit = 13 }, + { text = _L['OnKeyUp' ], bit = 14 }, + + { text = _L['OnLButtonDown' ], bit = 1 }, + { text = _L['OnLButtonUp' ], bit = 3 }, + { text = _L['OnLButtonClick' ], bit = 5 }, + { text = _L['OnLButtonDbClick' ], bit = 7 }, + { text = _L['OnLButtonDrag' ], bit = 20 }, + + { text = _L['OnRButtonDown' ], bit = 2 }, + { text = _L['OnRButtonUp' ], bit = 4 }, + { text = _L['OnRButtonClick' ], bit = 6 }, + { text = _L['OnRButtonDbClick' ], bit = 8 }, + { text = _L['OnRButtonDrag' ], bit = 19 }, + + { text = _L['OnMButtonDown' ], bit = 15 }, + { text = _L['OnMButtonUp' ], bit = 16 }, + { text = _L['OnMButtonClick' ], bit = 17 }, + { text = _L['OnMButtonDbClick' ], bit = 18 }, + { text = _L['OnMButtonDrag' ], bit = 21 }, + + { text = _L['OnMouseEnterLeave'], bit = 9 }, + { text = _L['OnMouseArea' ], bit = 10 }, + { text = _L['OnMouseMove' ], bit = 11 }, + { text = _L['OnMouseHover' ], bit = 22 }, + { text = _L['OnScroll' ], bit = 12 }, +} +_C.nEventID = 0 + +_C.GetEventID = function(ui) + local t = {} + for i, event in ipairs(_C.tEventIndex) do + if ui:Children('#Event_' .. event.bit):Check() then + t[event.bit] = 1 + else + t[event.bit] = 0 + end + end + return X.Bitmap2Number(t) +end + +_C.SetEventID = function(ui, nEventID) + local t = X.Number2Bitmap(nEventID) + for i, event in ipairs(_C.tEventIndex) do + ui:Children('#Event_' .. event.bit):Check(t[event.bit] == 1) + end +end + +X.Panel.Register(_L['Development'], 'Dev_UIEventID', _L['UIEventID'], 'ui/Image/UICommon/BattleFiled.UITex|7', { +IsRestricted = function() + return not X.IsDebugging('Dev_UIEventID') +end, +OnPanelActive = function(wnd) + local ui = X.UI(wnd) + local x, y = 10, 30 + + ui:Append('WndEditBox', { + x = x, y = y, w = 150, h = 25, + name = 'WndEdit', + text = _C.nEventID, + font = 201, color = { 255, 255, 255 }, + onChange = function(text) + local nEventID = tonumber(text) + if nEventID and nEventID ~= _C.nEventID then + _C.SetEventID(ui, nEventID) + end + end, + }) + + x, y = 5, y + 35 + for k, event in ipairs(_C.tEventIndex) do + ui:Append('WndCheckBox', { + name = 'Event_' .. event.bit, + text = event.text, x = x, y = y, w = 120, + onCheck = function(bCheck) + if bCheck then + ui:Children('#Event_' .. event.bit):Color(255, 128, 0 ) + else + ui:Children('#Event_' .. event.bit):Color(255, 255, 255) + end + _C.nEventID = _C.GetEventID(ui) + ui:Children('#WndEdit'):Text(_C.nEventID) + end, + }) + x = x + 90 + + if(k - 1) % 5 == 1 or k == 2 then + x, y = 5, y + 25 + end + end + + _C.SetEventID(ui, _C.nEventID) +end}) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MYDev_UITexViewer/data/data.jx3dat b/MYDev_UITexViewer/data/data.jx3dat new file mode 100644 index 000000000..76f1cd4c8 --- /dev/null +++ b/MYDev_UITexViewer/data/data.jx3dat @@ -0,0 +1,7138 @@ +return { + "ui/Image/Active/chunjie", + "ui/Image/Active/huachaojie", + "ui/Image/button/CGButton", + "ui/Image/button/CommonButton_1", + "ui/Image/button/FrendNPartyButton", + "ui/Image/button/ShopButton", + "ui/Image/button/SystemButton", + "ui/Image/button/SystemButton_1", + "ui/Image/CampMaps/BigArrow1", + "ui/Image/CampMaps/BigThing", + "ui/Image/CampMaps/BigThing2", + "ui/Image/CampMaps/BigThing3", + "ui/Image/CampMaps/CampLine", + "ui/Image/CampMaps/CampMaps", + "ui/Image/CampMaps/CampMaps2", + "ui/Image/CampMaps/CityBlongSmallICon", + "ui/Image/CampMaps/EndOfBattle1", + "ui/Image/CampMaps/EndOfBattle2", + "ui/Image/CampMaps/EndOfBattle3", + "ui/Image/CampMaps/EndOfBattle4", + "ui/Image/CampMaps/Wheels", + "ui/Image/ChannelsPanel/Channels5", + "ui/Image/ChannelsPanel/Channels9", + "ui/Image/ChannelsPanel/NewChannels", + "ui/Image/ChannelsPanel/NewChannels2", + "ui/Image/ChatPanel/EditBox", + "ui/Image/Common/Animate", + "ui/Image/Common/BlueFire", + "ui/Image/Common/Box", + "ui/Image/Common/CommonPanel", + "ui/Image/Common/CoverShadow", + "ui/Image/Common/DialogueIcon", + "ui/Image/Common/DialogueLabel", + "ui/Image/Common/FirstPayLeft", + "ui/Image/Common/FirstPayRight", + "ui/Image/Common/GreenFire", + "ui/Image/Common/KeyNotesPanel", + "ui/Image/Common/load", + "ui/Image/Common/Logo", + "ui/Image/Common/MainPanel_1", + "ui/Image/Common/MatrixAni", + "ui/Image/Common/MatrixAni_1", + "ui/Image/Common/MatrixAni_2", + "ui/Image/Common/Money", + "ui/Image/Common/Number", + "ui/Image/Common/PlayerFight", + "ui/Image/Common/ProgressBar", + "ui/Image/Common/QingGong1", + "ui/Image/Common/QingGong2", + "ui/Image/Common/QingGong3", + "ui/Image/Common/QingGong4", + "ui/Image/Common/QingGong5", + "ui/Image/Common/RedFire", + "ui/Image/Common/SprintGreenPower1", + "ui/Image/Common/SprintGreenPower2", + "ui/Image/Common/SprintNewPower", + "ui/Image/Common/SprintPower", + "ui/Image/Common/SprintYellowPower1", + "ui/Image/Common/SprintYellowPower2", + "ui/Image/Common/TempBox", + "ui/Image/Common/TextShadow", + "ui/Image/Common/VideoShadow", + "ui/Image/Common/YellowFire", + "ui/Image/cursor/ArrowImg", + "ui/Image/denglu/Sign1", + "ui/Image/denglu/Sign10", + "ui/Image/denglu/Sign11", + "ui/Image/denglu/Sign12", + "ui/Image/denglu/Sign13", + "ui/Image/denglu/Sign14", + "ui/Image/denglu/Sign15", + "ui/Image/denglu/Sign16", + "ui/Image/denglu/Sign18", + "ui/Image/denglu/Sign19", + "ui/Image/denglu/Sign2", + "ui/Image/denglu/Sign20", + "ui/Image/denglu/Sign21", + "ui/Image/denglu/Sign22", + "ui/Image/denglu/Sign23", + "ui/Image/denglu/Sign24", + "ui/Image/denglu/Sign25", + "ui/Image/denglu/Sign26", + "ui/Image/denglu/Sign27", + "ui/Image/denglu/Sign28", + "ui/Image/denglu/Sign29", + "ui/Image/denglu/Sign3", + "ui/Image/denglu/Sign4", + "ui/Image/denglu/Sign5", + "ui/Image/denglu/Sign6", + "ui/Image/denglu/Sign7", + "ui/Image/denglu/Sign8", + "ui/Image/denglu/Sign9", + "ui/Image/Dungeon/Background/ChiGuoHuiYi", + "ui/Image/Dungeon/Background/ChiGuoTianWang", + "ui/Image/Dungeon/Background/ChunMingMen", + "ui/Image/Dungeon/Background/daminggong", + "ui/Image/Dungeon/Background/DiHuaGong", + "ui/Image/Dungeon/Background/DiHuaHouShan", + "ui/Image/Dungeon/Background/DiHuaQianShan", + "ui/Image/Dungeon/Background/DiHuaShengDian", + "ui/Image/Dungeon/Background/dushendian", + "ui/Image/Dungeon/Background/fawangku", + "ui/Image/Dungeon/Background/FengXueDXC", + "ui/Image/Dungeon/Background/FengYuDXC", + "ui/Image/Dungeon/Background/GongZhongShenWu", + "ui/Image/Dungeon/Background/guangmingdingmidao", + "ui/Image/Dungeon/Background/huaqinggong", + "ui/Image/Dungeon/Background/HuaQingGongHuiYi", + "ui/Image/Dungeon/Background/huizhantangmen", + "ui/Image/Dungeon/Background/jianzhong", + "ui/Image/Dungeon/Background/jimieting", + "ui/Image/Dungeon/Background/kongwufeng", + "ui/Image/Dungeon/Background/lingxiaoxia", + "ui/Image/Dungeon/Background/liulidao", + "ui/Image/Dungeon/Background/longyuanze", + "ui/Image/Dungeon/Background/mojiamidian", + "ui/Image/Dungeon/Background/nanzhaohuanggong", + "ui/Image/Dungeon/Background/QinHuangLin", + "ui/Image/Dungeon/Background/rilunshancheng", + "ui/Image/Dungeon/Background/sancaizhen", + "ui/Image/Dungeon/Background/TangMenMiShi", + "ui/Image/Dungeon/Background/tiangongfang", + "ui/Image/Dungeon/Background/tianzifeng", + "ui/Image/Dungeon/Background/wulianggong", + "ui/Image/Dungeon/Background/wuyandao", + "ui/Image/Dungeon/Background/XianZhongLin", + "ui/Image/Dungeon/Background/xuezhantiance", + "ui/Image/Dungeon/Background/YanMenGuanZhiYi", + "ui/Image/Dungeon/Background/YeShouGuCheng", + "ui/Image/Dungeon/Background/yixiantian", + "ui/Image/Dungeon/Background/zhanbaojialan", + "ui/Image/Dungeon/Background/zhanbaojunxieku", + "ui/Image/Dungeon/Background/zhichengmen", + "ui/Image/Dungeon/Background/ZhuHuQuLang", + "ui/Image/Dungeon/Background/zhulongdian", + "ui/Image/Dungeon/BackgroundBar/ChangjingSmallBG_1", + "ui/Image/Dungeon/BackgroundBar/ChangjingSmallBG_2", + "ui/Image/Dungeon/BackgroundBar/ChangjingSmallBG_3", + "ui/Image/Dungeon/BossImage/portrait1", + "ui/Image/Dungeon/BossImage/portrait2", + "ui/Image/Dungeon/BossImage/portrait3", + "ui/Image/Dungeon/BossImage/portrait4", + "ui/Image/Dungeon/BossImage/portrait5", + "ui/Image/Dungeon/BossImage/portrait6", + "ui/Image/Dungeon/BossImage/portrait7", + "ui/Image/Dungeon/BossImage/portrait8", + "ui/Image/Dungeon/DungeonImage/ChiGuoHuiYiLu", + "ui/Image/Dungeon/DungeonImage/ChiGuoTianWang", + "ui/Image/Dungeon/DungeonImage/ChunMingMen", + "ui/Image/Dungeon/DungeonImage/daminggong", + "ui/Image/Dungeon/DungeonImage/dihuadongku", + "ui/Image/Dungeon/DungeonImage/DiHuaHouShan", + "ui/Image/Dungeon/DungeonImage/DiHuaQianShan", + "ui/Image/Dungeon/DungeonImage/dihuashengdian", + "ui/Image/Dungeon/DungeonImage/dushendian", + "ui/Image/Dungeon/DungeonImage/fawangku", + "ui/Image/Dungeon/DungeonImage/FengXueDXC", + "ui/Image/Dungeon/DungeonImage/FengYuDXC", + "ui/Image/Dungeon/DungeonImage/GongZhongShenWu", + "ui/Image/Dungeon/DungeonImage/guangmingdingmidao", + "ui/Image/Dungeon/DungeonImage/huaqinggong", + "ui/Image/Dungeon/DungeonImage/HuaQingGongHuiYi", + "ui/Image/Dungeon/DungeonImage/huizhantangmen", + "ui/Image/Dungeon/DungeonImage/jianzhong", + "ui/Image/Dungeon/DungeonImage/jimieting", + "ui/Image/Dungeon/DungeonImage/kongwufeng", + "ui/Image/Dungeon/DungeonImage/lingxiaoxia", + "ui/Image/Dungeon/DungeonImage/LiuLiDao", + "ui/Image/Dungeon/DungeonImage/longyuanze", + "ui/Image/Dungeon/DungeonImage/mojiamidian", + "ui/Image/Dungeon/DungeonImage/nanzhaohuanggong", + "ui/Image/Dungeon/DungeonImage/QinHuangLin", + "ui/Image/Dungeon/DungeonImage/rilunshancheng", + "ui/Image/Dungeon/DungeonImage/sancaizhen", + "ui/Image/Dungeon/DungeonImage/TangMenMiShi", + "ui/Image/Dungeon/DungeonImage/tiangongfang", + "ui/Image/Dungeon/DungeonImage/tianzifeng", + "ui/Image/Dungeon/DungeonImage/wulianggong", + "ui/Image/Dungeon/DungeonImage/wuyandao", + "ui/Image/Dungeon/DungeonImage/xianzonglin", + "ui/Image/Dungeon/DungeonImage/XueZhanTianCe", + "ui/Image/Dungeon/DungeonImage/YanMenGuanZhiYi", + "ui/Image/Dungeon/DungeonImage/YeShouGuCheng", + "ui/Image/Dungeon/DungeonImage/yixiantian", + "ui/Image/Dungeon/DungeonImage/zhanbaojialan", + "ui/Image/Dungeon/DungeonImage/zhanbaojunxieku", + "ui/Image/Dungeon/DungeonImage/zhichengmen", + "ui/Image/Dungeon/DungeonImage/ZhuHuQuLang", + "ui/Image/Dungeon/DungeonImage/zhulongdian", + "ui/Image/ExteriorPic/MoonCake", + "ui/Image/ExteriorPic/PicBG", + "ui/Image/ExteriorPic/PicTip", + "ui/Image/GMPanel/GM1", + "ui/Image/GMPanel/GM2", + "ui/Image/GMPanel/GM3", + "ui/Image/GMPanel/GM4", + "ui/Image/GMPanel/GM5", + "ui/Image/GMPanel/GM6", + "ui/Image/GMPanel/GM7", + "ui/Image/GMPanel/GM8", + "ui/Image/GMPanel/GMBg", + "ui/Image/Helper/7080级世界地图小指引", + "ui/Image/Helper/flopbg", + "ui/Image/Helper/Help", + "ui/Image/Helper/HelpMsg", + "ui/Image/Helper/HelpQuest", + "ui/Image/Helper/HelpTip", + "ui/Image/Helper/HelpTip2", + "ui/Image/Helper/HelpTip3", + "ui/Image/Helper/Help—Bg", + "ui/Image/Helper/test", + "ui/Image/icon/68_waizhuang", + "ui/Image/icon/68_zhufa", + "ui/Image/icon/animalstuff01", + "ui/Image/icon/animalstuff02", + "ui/Image/icon/animalstuff03", + "ui/Image/icon/animalstuff04", + "ui/Image/icon/animalstuff07", + "ui/Image/icon/animalstuff08", + "ui/Image/icon/animalstuff09", + "ui/Image/icon/animalstuff10", + "ui/Image/icon/animalstuff11", + "ui/Image/icon/animalstuff12", + "ui/Image/icon/animalstuff14", + "ui/Image/icon/animalstuff15", + "ui/Image/icon/animalstuff16", + "ui/Image/icon/animalstuff17", + "ui/Image/icon/animalstuff18", + "ui/Image/icon/animalstuff19", + "ui/Image/icon/animalstuff20", + "ui/Image/icon/animalstuff21", + "ui/Image/icon/animalstuff22", + "ui/Image/icon/animalstuff25", + "ui/Image/icon/animalstuff26", + "ui/Image/icon/animalstuff27", + "ui/Image/icon/animalstuff28", + "ui/Image/icon/animalstuff29", + "ui/Image/icon/animalstuff30", + "ui/Image/icon/animalstuff31", + "ui/Image/icon/animalstuff32", + "ui/Image/icon/animalstuff33", + "ui/Image/icon/animalstuff35", + "ui/Image/icon/animalstuff36", + "ui/Image/icon/animalstuff37", + "ui/Image/icon/animalstuff39", + "ui/Image/icon/animalstuff40", + "ui/Image/icon/animalstuff41", + "ui/Image/icon/animalstuff43", + "ui/Image/icon/animalstuff50", + "ui/Image/icon/animalstuff52", + "ui/Image/icon/animalstuff53", + "ui/Image/icon/animalstuff54", + "ui/Image/icon/animalstuff55", + "ui/Image/icon/animalstuff56", + "ui/Image/icon/animalstuff57", + "ui/Image/icon/animalstuff58", + "ui/Image/icon/anqi01", + "ui/Image/icon/anqi02", + "ui/Image/icon/bag01", + "ui/Image/icon/bag02", + "ui/Image/icon/bag03", + "ui/Image/icon/bag22", + "ui/Image/icon/bagNew01a", + "ui/Image/icon/bagNew01b", + "ui/Image/icon/bagNew02a", + "ui/Image/icon/bagNew02b", + "ui/Image/icon/bagNew03a", + "ui/Image/icon/bagNew03b", + "ui/Image/icon/bagNew04a", + "ui/Image/icon/bagNew04b", + "ui/Image/icon/bagNew05a", + "ui/Image/icon/bagNew05b", + "ui/Image/icon/bagNew06a", + "ui/Image/icon/bagNew06b", + "ui/Image/icon/bagNew07a", + "ui/Image/icon/bagNew07b", + "ui/Image/icon/bagNew08a", + "ui/Image/icon/bagNew08b", + "ui/Image/icon/baibuchuanyang", + "ui/Image/icon/baibuchuanyang2", + "ui/Image/icon/baicaoyuan01", + "ui/Image/icon/baicaoyuan02", + "ui/Image/icon/baicaoyuan03", + "ui/Image/icon/baicaoyuan04", + "ui/Image/icon/baicaoyuan05", + "ui/Image/icon/baicaoyuan06", + "ui/Image/icon/baicaoyuan07", + "ui/Image/icon/baicaoyuan08", + "ui/Image/icon/baicaoyuan09", + "ui/Image/icon/baicaoyuan10", + "ui/Image/icon/baicaoyuan11", + "ui/Image/icon/baicaoyuan12", + "ui/Image/icon/baicaoyuan13", + "ui/Image/icon/baicaoyuan14", + "ui/Image/icon/baihuzi", + "ui/Image/icon/banghui_01", + "ui/Image/icon/banghui_02", + "ui/Image/icon/banghui_03", + "ui/Image/icon/banghui_04", + "ui/Image/icon/banghui_05", + "ui/Image/icon/banghui_06", + "ui/Image/icon/banghui_07", + "ui/Image/icon/banghui_08", + "ui/Image/icon/banghui_09", + "ui/Image/icon/banghui_10", + "ui/Image/icon/banghui_11", + "ui/Image/icon/banghui_12", + "ui/Image/icon/banghui_13", + "ui/Image/icon/banghui_14", + "ui/Image/icon/banghui_15", + "ui/Image/icon/banghui_16", + "ui/Image/icon/banghui_17", + "ui/Image/icon/banghui_18", + "ui/Image/icon/banghui_19", + "ui/Image/icon/banghui_20", + "ui/Image/icon/banghui_21", + "ui/Image/icon/banghui_22", + "ui/Image/icon/banghui_23", + "ui/Image/icon/banghui_24", + "ui/Image/icon/banghui_25", + "ui/Image/icon/banghui_26", + "ui/Image/icon/banghui_27", + "ui/Image/icon/banghui_28", + "ui/Image/icon/bangh_tgs_01_1", + "ui/Image/icon/bangh_tgs_01_2", + "ui/Image/icon/bangh_tgs_02_1", + "ui/Image/icon/bangh_tgs_02_2", + "ui/Image/icon/bangh_tgs_03_1", + "ui/Image/icon/bangh_tgs_03_2", + "ui/Image/icon/bangh_tgs_04_1", + "ui/Image/icon/bangh_tgs_04_2", + "ui/Image/icon/bangh_tgs_05_1", + "ui/Image/icon/bangh_tgs_05_2", + "ui/Image/icon/bangh_tgs_06_1", + "ui/Image/icon/bangh_tgs_06_2", + "ui/Image/icon/bangh_tgs_07_1", + "ui/Image/icon/bangh_tgs_07_2", + "ui/Image/icon/bangh_tgs_08_1", + "ui/Image/icon/bangh_tgs_08_2", + "ui/Image/icon/bangh_tgs_09_1", + "ui/Image/icon/bangh_tgs_09_2", + "ui/Image/icon/bangh_tgs_100", + "ui/Image/icon/bangh_tgs_10_1", + "ui/Image/icon/bangh_tgs_10_2", + "ui/Image/icon/bangh_tgs_11_1", + "ui/Image/icon/bangh_tgs_11_2", + "ui/Image/icon/bangh_tgs_12_1", + "ui/Image/icon/bangh_tgs_12_2", + "ui/Image/icon/bangh_tgs_13_1", + "ui/Image/icon/bangh_tgs_13_2", + "ui/Image/icon/bangh_tgs_14_1", + "ui/Image/icon/bangh_tgs_14_2", + "ui/Image/icon/bangh_tgs_15_1", + "ui/Image/icon/bangh_tgs_15_2", + "ui/Image/icon/bangh_tgs_16_1", + "ui/Image/icon/bangh_tgs_16_2", + "ui/Image/icon/bangh_tgs_17_1", + "ui/Image/icon/bangh_tgs_17_2", + "ui/Image/icon/bangh_tgs_18_1", + "ui/Image/icon/bangh_tgs_18_2", + "ui/Image/icon/bangh_tgs_19_1", + "ui/Image/icon/bangh_tgs_19_2", + "ui/Image/icon/bangh_tgs_20_1", + "ui/Image/icon/bangh_tgs_20_2", + "ui/Image/icon/bangh_tgs_21_1", + "ui/Image/icon/bangh_tgs_21_2", + "ui/Image/icon/bangh_tgs_22_1", + "ui/Image/icon/bangh_tgs_22_2", + "ui/Image/icon/bangh_tgs_23_1", + "ui/Image/icon/bangh_tgs_23_2", + "ui/Image/icon/bangh_tgs_24_1", + "ui/Image/icon/bangh_tgs_24_2", + "ui/Image/icon/bangh_tgs_25_1", + "ui/Image/icon/bangh_tgs_25_2", + "ui/Image/icon/bangh_tgs_26_1", + "ui/Image/icon/bangh_tgs_26_2", + "ui/Image/icon/bangh_tgs_27_1", + "ui/Image/icon/bangh_tgs_27_2", + "ui/Image/icon/bangh_tgs_28", + "ui/Image/icon/bangh_tgs_29", + "ui/Image/icon/bangh_tgs_30", + "ui/Image/icon/bangh_tgs_31", + "ui/Image/icon/bangh_tgs_32", + "ui/Image/icon/bangh_tgs_33", + "ui/Image/icon/bangh_tgs_34", + "ui/Image/icon/bangh_tgs_35", + "ui/Image/icon/bangh_tgs_36", + "ui/Image/icon/bangh_tgs_37", + "ui/Image/icon/bangh_tgs_38", + "ui/Image/icon/bangh_tgs_39", + "ui/Image/icon/bangh_tgs_40", + "ui/Image/icon/bangh_tgs_41", + "ui/Image/icon/bangh_tgs_42", + "ui/Image/icon/bangh_tgs_43", + "ui/Image/icon/bangh_tgs_44", + "ui/Image/icon/bangh_tgs_45", + "ui/Image/icon/bangh_tgs_46", + "ui/Image/icon/bangh_tgs_47", + "ui/Image/icon/bangh_tgs_48", + "ui/Image/icon/bangh_tgs_49", + "ui/Image/icon/bangh_tgs_50", + "ui/Image/icon/bangh_tgs_51", + "ui/Image/icon/bangh_tgs_52", + "ui/Image/icon/bangh_tgs_53", + "ui/Image/icon/bangh_tgs_54", + "ui/Image/icon/bangh_tgs_55", + "ui/Image/icon/bangh_tgs_56", + "ui/Image/icon/bangh_tgs_57", + "ui/Image/icon/bangh_tgs_58", + "ui/Image/icon/bangh_tgs_59", + "ui/Image/icon/bangh_tgs_60", + "ui/Image/icon/bangh_tgs_61", + "ui/Image/icon/bangh_tgs_62", + "ui/Image/icon/bangh_tgs_63", + "ui/Image/icon/bangh_tgs_64", + "ui/Image/icon/bangh_tgs_65", + "ui/Image/icon/bangh_tgs_66", + "ui/Image/icon/bangh_tgs_67", + "ui/Image/icon/bangh_tgs_68", + "ui/Image/icon/bangh_tgs_69", + "ui/Image/icon/bangh_tgs_70", + "ui/Image/icon/bangh_tgs_71", + "ui/Image/icon/bangh_tgs_72", + "ui/Image/icon/bangh_tgs_73", + "ui/Image/icon/bangh_tgs_74", + "ui/Image/icon/bangh_tgs_75", + "ui/Image/icon/bangh_tgs_76", + "ui/Image/icon/bangh_tgs_77", + "ui/Image/icon/bangh_tgs_78", + "ui/Image/icon/bangh_tgs_79", + "ui/Image/icon/bangh_tgs_80", + "ui/Image/icon/bangh_tgs_81", + "ui/Image/icon/bangh_tgs_82", + "ui/Image/icon/bangh_tgs_83", + "ui/Image/icon/bangh_tgs_84", + "ui/Image/icon/bangh_tgs_85", + "ui/Image/icon/bangh_tgs_86", + "ui/Image/icon/bangh_tgs_87", + "ui/Image/icon/bangh_tgs_88", + "ui/Image/icon/bangh_tgs_89", + "ui/Image/icon/bangh_tgs_90", + "ui/Image/icon/bangh_tgs_91", + "ui/Image/icon/bangh_tgs_92", + "ui/Image/icon/bangh_tgs_93", + "ui/Image/icon/bangh_tgs_94", + "ui/Image/icon/bangh_tgs_95", + "ui/Image/icon/bangh_tgs_96", + "ui/Image/icon/bangh_tgs_97", + "ui/Image/icon/bangh_tgs_98", + "ui/Image/icon/bangh_tgs_99", + "ui/Image/icon/baoxiang01", + "ui/Image/icon/baoxiang02", + "ui/Image/icon/baoxiang03", + "ui/Image/icon/baoxiang04", + "ui/Image/icon/baoxiang05", + "ui/Image/icon/baoxiang06", + "ui/Image/icon/baoxiang07", + "ui/Image/icon/baoxiang08", + "ui/Image/icon/baoxiang09", + "ui/Image/icon/baoxiang10", + "ui/Image/icon/baoxiang11", + "ui/Image/icon/baoxiang12", + "ui/Image/icon/baoxiang13", + "ui/Image/icon/baoxiang14", + "ui/Image/icon/BgWanhua", + "ui/Image/icon/biaoju09", + "ui/Image/icon/biaoq_01", + "ui/Image/icon/biaoq_02", + "ui/Image/icon/biaoq_03", + "ui/Image/icon/biaoq_04", + "ui/Image/icon/biaoq_05", + "ui/Image/icon/biaoq_06", + "ui/Image/icon/bihuan", + "ui/Image/icon/bone01", + "ui/Image/icon/book01", + "ui/Image/icon/book02", + "ui/Image/icon/book05", + "ui/Image/icon/book07", + "ui/Image/icon/book10", + "ui/Image/icon/bubujingxin", + "ui/Image/icon/cangjian_book_1", + "ui/Image/icon/cangjian_book_2", + "ui/Image/icon/cangjian_book_3", + "ui/Image/icon/cangjian_book_4", + "ui/Image/icon/cangjian_book_5", + "ui/Image/icon/cangjian_jzf_1", + "ui/Image/icon/cangjian_jzf_2", + "ui/Image/icon/cangjian_jzf_3", + "ui/Image/icon/cangjian_jzf_4", + "ui/Image/icon/cangjian_jzf_5", + "ui/Image/icon/cangjian_jzf_6", + "ui/Image/icon/cangjian_jzf_7", + "ui/Image/icon/cangjian_lfjs_1", + "ui/Image/icon/cangjian_lfjs_2", + "ui/Image/icon/cangjian_lfjs_3", + "ui/Image/icon/cangjian_lfjs_4", + "ui/Image/icon/cangjian_lfjs_5", + "ui/Image/icon/cangjian_lfjs_6", + "ui/Image/icon/cangjian_neigong_1", + "ui/Image/icon/cangjian_neigong_2", + "ui/Image/icon/cangjian_pt_1", + "ui/Image/icon/cangjian_shuliandu_1", + "ui/Image/icon/cangjian_shuliandu_2", + "ui/Image/icon/cangjian_shuliandu_3", + "ui/Image/icon/cangjian_taolu_1", + "ui/Image/icon/cangjian_taolu_2", + "ui/Image/icon/cangjian_taolu_3", + "ui/Image/icon/cangjian_taolu_4", + "ui/Image/icon/cangjian_xsjf_1", + "ui/Image/icon/cangjian_xsjf_2", + "ui/Image/icon/cangjian_xsjf_3", + "ui/Image/icon/cangjian_xsjf_4", + "ui/Image/icon/cangjian_xsjf_5", + "ui/Image/icon/cangjian_xsjf_6", + "ui/Image/icon/cangjian_xzq_1", + "ui/Image/icon/cangjian_xzq_2", + "ui/Image/icon/cangjian_xzq_3", + "ui/Image/icon/cangjian_xzq_4", + "ui/Image/icon/cangjian_xzq_5", + "ui/Image/icon/cangjian_xzq_6", + "ui/Image/icon/chengjiu01", + "ui/Image/icon/chengjiu02", + "ui/Image/icon/chengjiu03", + "ui/Image/icon/chengjiu04", + "ui/Image/icon/chengjiu05", + "ui/Image/icon/chengjiu06", + "ui/Image/icon/chengjiu07", + "ui/Image/icon/chengjiu08", + "ui/Image/icon/chengjiu09", + "ui/Image/icon/chengjiu10", + "ui/Image/icon/chengsedaoju01", + "ui/Image/icon/chengsedaoju02", + "ui/Image/icon/chess_a", + "ui/Image/icon/chess_b", + "ui/Image/icon/chess_c", + "ui/Image/icon/chess_d", + "ui/Image/icon/chess_qipan_1", + "ui/Image/icon/chess_turn", + "ui/Image/icon/chess_turn2", + "ui/Image/icon/chongfengxianzhen", + "ui/Image/icon/chongw_01", + "ui/Image/icon/chongw_02", + "ui/Image/icon/chongw_68_hou", + "ui/Image/icon/chunjiehuodon13", + "ui/Image/icon/chunjiehuodong01", + "ui/Image/icon/chunjiehuodong02", + "ui/Image/icon/chunjiehuodong03", + "ui/Image/icon/chunjiehuodong04", + "ui/Image/icon/chunjiehuodong05", + "ui/Image/icon/chunjiehuodong06", + "ui/Image/icon/chunjiehuodong07", + "ui/Image/icon/chunjiehuodong08", + "ui/Image/icon/chunjiehuodong09", + "ui/Image/icon/chunjiehuodong10", + "ui/Image/icon/chunjiehuodong11", + "ui/Image/icon/chunjiehuodong12", + "ui/Image/icon/chunjiehuodong13", + "ui/Image/icon/chunjiehuodong14", + "ui/Image/icon/chunjiehuodong15", + "ui/Image/icon/chunjiehuodong16", + "ui/Image/icon/chunjiehuodong17", + "ui/Image/icon/chunjiehuodong18", + "ui/Image/icon/chunjiehuodong19", + "ui/Image/icon/chunjiehuodong20", + "ui/Image/icon/chunjiehuodong21", + "ui/Image/icon/chunjiehuodong22", + "ui/Image/icon/chunjiehuodong23", + "ui/Image/icon/chunjiehuodong24", + "ui/Image/icon/chunjiehuodong25", + "ui/Image/icon/chunjiehuodong26", + "ui/Image/icon/chunjiehuodong27", + "ui/Image/icon/chunyang_book_1", + "ui/Image/icon/chunyang_book_2", + "ui/Image/icon/chunyang_book_3", + "ui/Image/icon/chunyang_book_4", + "ui/Image/icon/chunyang_book_5", + "ui/Image/icon/chunyang_shuliandu_1", + "ui/Image/icon/chunyang_shuliandu_2", + "ui/Image/icon/chunyang_shuliandu_3", + "ui/Image/icon/CHW_01", + "ui/Image/icon/CHW_02", + "ui/Image/icon/CHW_03", + "ui/Image/icon/CHW_04", + "ui/Image/icon/CHW_05", + "ui/Image/icon/CHW_06", + "ui/Image/icon/CHW_07", + "ui/Image/icon/CHW_08", + "ui/Image/icon/CHW_09", + "ui/Image/icon/CHW_10", + "ui/Image/icon/CHW_11", + "ui/Image/icon/CHW_12", + "ui/Image/icon/CHW_13", + "ui/Image/icon/CHW_14", + "ui/Image/icon/CHW_15", + "ui/Image/icon/CHW_16", + "ui/Image/icon/CHW_17", + "ui/Image/icon/CHW_18", + "ui/Image/icon/CHW_19", + "ui/Image/icon/CHW_20", + "ui/Image/icon/CHW_21", + "ui/Image/icon/CHW_22", + "ui/Image/icon/CHW_23", + "ui/Image/icon/CHW_24", + "ui/Image/icon/CHW_25", + "ui/Image/icon/chw_T9_1", + "ui/Image/icon/chw_T9_2", + "ui/Image/icon/chw_T9_3", + "ui/Image/icon/chw_T9_4", + "ui/Image/icon/cloth01", + "ui/Image/icon/cloth03", + "ui/Image/icon/cloth04", + "ui/Image/icon/cloth07", + "ui/Image/icon/cloth08", + "ui/Image/icon/cloth10", + "ui/Image/icon/cloth11", + "ui/Image/icon/cloth12", + "ui/Image/icon/cloth13", + "ui/Image/icon/cloth19", + "ui/Image/icon/CL_0417_01", + "ui/Image/icon/CL_0417_02", + "ui/Image/icon/CL_0417_03", + "ui/Image/icon/coin01", + "ui/Image/icon/coin02", + "ui/Image/icon/coin03", + "ui/Image/icon/coin04", + "ui/Image/icon/coin05", + "ui/Image/icon/coin06", + "ui/Image/icon/cookspecial01", + "ui/Image/icon/cookspecial02", + "ui/Image/icon/cookspecial03", + "ui/Image/icon/cookspecial04", + "ui/Image/icon/cookspecial05", + "ui/Image/icon/cookspecial06", + "ui/Image/icon/CraftAS_001", + "ui/Image/icon/CraftAS_002", + "ui/Image/icon/CraftAS_003", + "ui/Image/icon/CraftAS_004", + "ui/Image/icon/CraftAS_005", + "ui/Image/icon/CraftAS_006", + "ui/Image/icon/CraftAS_007", + "ui/Image/icon/CraftAS_008", + "ui/Image/icon/CraftAS_009", + "ui/Image/icon/CraftAS_010", + "ui/Image/icon/CraftAS_011", + "ui/Image/icon/CraftAS_012", + "ui/Image/icon/CraftAS_013", + "ui/Image/icon/CraftAS_014", + "ui/Image/icon/CraftAS_015", + "ui/Image/icon/CraftAS_016", + "ui/Image/icon/CraftAS_017", + "ui/Image/icon/CraftAS_018", + "ui/Image/icon/CraftAS_019", + "ui/Image/icon/CraftAS_020", + "ui/Image/icon/CraftAS_021", + "ui/Image/icon/CraftAS_022", + "ui/Image/icon/CraftAS_023", + "ui/Image/icon/CraftAS_024", + "ui/Image/icon/CraftAS_025", + "ui/Image/icon/CraftAS_026", + "ui/Image/icon/CraftAS_027", + "ui/Image/icon/CraftAS_028", + "ui/Image/icon/CraftAS_029", + "ui/Image/icon/CraftAS_030", + "ui/Image/icon/CraftAS_031", + "ui/Image/icon/CraftAS_032", + "ui/Image/icon/CraftAS_033", + "ui/Image/icon/CraftAS_034", + "ui/Image/icon/CraftAS_035", + "ui/Image/icon/CraftAS_036", + "ui/Image/icon/CraftAS_037", + "ui/Image/icon/CraftAS_038", + "ui/Image/icon/CraftAS_039", + "ui/Image/icon/CraftAS_040", + "ui/Image/icon/CraftAS_041", + "ui/Image/icon/CraftAS_042", + "ui/Image/icon/CraftAS_043", + "ui/Image/icon/CraftAS_044", + "ui/Image/icon/CraftAS_045", + "ui/Image/icon/CraftAS_046", + "ui/Image/icon/CraftAS_047", + "ui/Image/icon/CraftAS_048", + "ui/Image/icon/CraftAS_049", + "ui/Image/icon/CraftAS_050", + "ui/Image/icon/CraftAS_051", + "ui/Image/icon/CraftAS_052", + "ui/Image/icon/CraftAS_053", + "ui/Image/icon/CraftAS_054", + "ui/Image/icon/CraftAS_055", + "ui/Image/icon/CraftAS_056", + "ui/Image/icon/CraftAS_057", + "ui/Image/icon/CraftAS_058", + "ui/Image/icon/CraftAS_059", + "ui/Image/icon/CraftAS_060", + "ui/Image/icon/CraftAS_061", + "ui/Image/icon/CraftAS_062", + "ui/Image/icon/CraftAS_063", + "ui/Image/icon/CraftAS_064", + "ui/Image/icon/CraftAS_065", + "ui/Image/icon/CraftAS_066", + "ui/Image/icon/CraftAS_067", + "ui/Image/icon/CraftAS_068", + "ui/Image/icon/CraftAS_069", + "ui/Image/icon/CraftAS_070", + "ui/Image/icon/CraftAS_071", + "ui/Image/icon/CraftAS_072", + "ui/Image/icon/CraftAS_073", + "ui/Image/icon/CraftAS_074", + "ui/Image/icon/CraftAS_075", + "ui/Image/icon/CraftAS_076", + "ui/Image/icon/CraftAS_077", + "ui/Image/icon/CraftAS_078", + "ui/Image/icon/CraftAS_079", + "ui/Image/icon/CraftAS_080", + "ui/Image/icon/CraftAS_081", + "ui/Image/icon/CraftAS_082", + "ui/Image/icon/CraftAS_083", + "ui/Image/icon/CraftAS_084", + "ui/Image/icon/CraftAS_085", + "ui/Image/icon/CraftAS_086", + "ui/Image/icon/CraftAS_087", + "ui/Image/icon/CraftAS_088", + "ui/Image/icon/CraftAS_089", + "ui/Image/icon/CraftAS_090", + "ui/Image/icon/CraftAS_091", + "ui/Image/icon/CraftAS_092", + "ui/Image/icon/CraftAS_093", + "ui/Image/icon/CraftAS_094", + "ui/Image/icon/CraftAS_095", + "ui/Image/icon/CraftAS_096", + "ui/Image/icon/CraftAS_097", + "ui/Image/icon/CraftAS_098", + "ui/Image/icon/CraftAS_099", + "ui/Image/icon/CraftAS_100", + "ui/Image/icon/CraftAS_101", + "ui/Image/icon/CraftAS_102", + "ui/Image/icon/CraftAS_103", + "ui/Image/icon/CraftAS_104", + "ui/Image/icon/CraftAS_105", + "ui/Image/icon/CraftAS_106", + "ui/Image/icon/CraftAS_107", + "ui/Image/icon/CraftAS_108", + "ui/Image/icon/CraftAS_109", + "ui/Image/icon/CraftAS_110", + "ui/Image/icon/CraftAS_111", + "ui/Image/icon/CraftAS_112", + "ui/Image/icon/CraftAS_113", + "ui/Image/icon/CraftAS_114", + "ui/Image/icon/CraftAS_115", + "ui/Image/icon/CraftAS_116", + "ui/Image/icon/CraftAS_117", + "ui/Image/icon/CraftAS_118", + "ui/Image/icon/CraftAS_119", + "ui/Image/icon/CraftAS_120", + "ui/Image/icon/CraftAS_121", + "ui/Image/icon/CraftAS_122", + "ui/Image/icon/CraftAS_123", + "ui/Image/icon/CraftAS_124", + "ui/Image/icon/CraftAS_125", + "ui/Image/icon/CraftAS_126", + "ui/Image/icon/CraftAS_127", + "ui/Image/icon/CraftAS_128", + "ui/Image/icon/CraftAS_129", + "ui/Image/icon/CraftAS_130", + "ui/Image/icon/CraftAS_131", + "ui/Image/icon/CraftAS_132", + "ui/Image/icon/CraftAS_133", + "ui/Image/icon/CraftAS_134", + "ui/Image/icon/CraftAS_135", + "ui/Image/icon/CraftAS_136", + "ui/Image/icon/CraftAS_137", + "ui/Image/icon/CraftAS_138", + "ui/Image/icon/CraftAS_139", + "ui/Image/icon/CraftAS_140", + "ui/Image/icon/CraftAS_141", + "ui/Image/icon/CraftAS_142", + "ui/Image/icon/CraftAS_143", + "ui/Image/icon/CraftAS_144", + "ui/Image/icon/CraftAS_145", + "ui/Image/icon/CraftAS_146", + "ui/Image/icon/CraftAS_147", + "ui/Image/icon/CraftAS_148", + "ui/Image/icon/CraftAS_149", + "ui/Image/icon/CraftAS_150", + "ui/Image/icon/CraftAS_151", + "ui/Image/icon/CraftAS_152", + "ui/Image/icon/CraftAS_153", + "ui/Image/icon/CraftAS_154", + "ui/Image/icon/CraftAS_155", + "ui/Image/icon/CraftAS_156", + "ui/Image/icon/CraftAS_157", + "ui/Image/icon/CraftAS_158", + "ui/Image/icon/CraftAS_159", + "ui/Image/icon/CraftAS_160", + "ui/Image/icon/CraftAS_161", + "ui/Image/icon/CraftAS_162", + "ui/Image/icon/CraftAS_163", + "ui/Image/icon/CraftAS_164", + "ui/Image/icon/CraftAS_165", + "ui/Image/icon/CraftAS_166", + "ui/Image/icon/CraftAS_167", + "ui/Image/icon/CraftAS_168", + "ui/Image/icon/CraftAS_169", + "ui/Image/icon/CraftAS_170", + "ui/Image/icon/CraftAS_171", + "ui/Image/icon/CraftAS_172", + "ui/Image/icon/CraftAS_173", + "ui/Image/icon/CraftAS_174", + "ui/Image/icon/CraftAS_175", + "ui/Image/icon/CraftAS_176", + "ui/Image/icon/CraftAS_177", + "ui/Image/icon/CraftAS_178", + "ui/Image/icon/CraftAS_179", + "ui/Image/icon/CraftAS_180", + "ui/Image/icon/CraftAS_181", + "ui/Image/icon/CraftAS_182", + "ui/Image/icon/CraftAS_183", + "ui/Image/icon/CraftAS_184", + "ui/Image/icon/CraftAS_185", + "ui/Image/icon/CraftAS_186", + "ui/Image/icon/CraftAS_187", + "ui/Image/icon/CraftAS_188", + "ui/Image/icon/CraftAS_189", + "ui/Image/icon/CraftAS_190", + "ui/Image/icon/CraftAS_191", + "ui/Image/icon/CraftAS_192", + "ui/Image/icon/CraftAS_193", + "ui/Image/icon/CraftAS_194", + "ui/Image/icon/CraftAS_195", + "ui/Image/icon/CraftAS_196", + "ui/Image/icon/CraftAS_197", + "ui/Image/icon/CraftAS_198", + "ui/Image/icon/CraftAS_199", + "ui/Image/icon/CraftAS_200", + "ui/Image/icon/CraftAS_201", + "ui/Image/icon/CraftAS_202", + "ui/Image/icon/CraftAS_203", + "ui/Image/icon/CraftAS_204", + "ui/Image/icon/CraftAS_205", + "ui/Image/icon/CraftAS_206", + "ui/Image/icon/CraftAS_207", + "ui/Image/icon/CraftAS_208", + "ui/Image/icon/CraftAS_209", + "ui/Image/icon/CraftAS_210", + "ui/Image/icon/CraftAS_211", + "ui/Image/icon/CraftAS_212", + "ui/Image/icon/CraftAS_213", + "ui/Image/icon/CraftAS_214", + "ui/Image/icon/CraftAS_215", + "ui/Image/icon/CraftAS_216", + "ui/Image/icon/CraftAS_217", + "ui/Image/icon/CraftAS_218", + "ui/Image/icon/CraftAS_219", + "ui/Image/icon/CraftAS_220", + "ui/Image/icon/CraftAS_221", + "ui/Image/icon/CraftAS_222", + "ui/Image/icon/CraftAS_223", + "ui/Image/icon/CraftAS_224", + "ui/Image/icon/CraftAS_225", + "ui/Image/icon/CraftAS_226", + "ui/Image/icon/CraftAS_227", + "ui/Image/icon/CraftAS_228", + "ui/Image/icon/CraftAS_229", + "ui/Image/icon/craftstuff_01", + "ui/Image/icon/craftstuff_02", + "ui/Image/icon/craftstuff_03", + "ui/Image/icon/craftstuff_04", + "ui/Image/icon/craftstuff_05", + "ui/Image/icon/craftstuff_06", + "ui/Image/icon/craftstuff_07", + "ui/Image/icon/craftstuff_08", + "ui/Image/icon/craftstuff_09", + "ui/Image/icon/craftstuff_10", + "ui/Image/icon/craftstuff_11", + "ui/Image/icon/craftstuff_12", + "ui/Image/icon/craftstuff_13", + "ui/Image/icon/craftstuff_14", + "ui/Image/icon/craftstuff_15", + "ui/Image/icon/craftstuff_16", + "ui/Image/icon/craftstuff_17", + "ui/Image/icon/craftstuff_18", + "ui/Image/icon/craftstuff_19", + "ui/Image/icon/craftstuff_20", + "ui/Image/icon/craftstuff_21", + "ui/Image/icon/craftstuff_22", + "ui/Image/icon/craftstuff_23", + "ui/Image/icon/craftstuff_24", + "ui/Image/icon/craftstuff_25", + "ui/Image/icon/craftstuff_26", + "ui/Image/icon/craftstuff_27", + "ui/Image/icon/craftstuff_28", + "ui/Image/icon/craftstuff_29", + "ui/Image/icon/craftstuff_30", + "ui/Image/icon/craftstuff_31", + "ui/Image/icon/craftstuff_32", + "ui/Image/icon/craftstuff_33", + "ui/Image/icon/craftstuff_34", + "ui/Image/icon/craftstuff_35", + "ui/Image/icon/craftstuff_36", + "ui/Image/icon/craftstuff_37", + "ui/Image/icon/craftstuff_38", + "ui/Image/icon/craftstuff_39", + "ui/Image/icon/craftstuff_40", + "ui/Image/icon/craftstuff_41", + "ui/Image/icon/craftstuff_42", + "ui/Image/icon/craftstuff_43", + "ui/Image/icon/craftstuff_44", + "ui/Image/icon/craftstuff_45", + "ui/Image/icon/craftstuff_46", + "ui/Image/icon/craft_tailor01", + "ui/Image/icon/craft_tailor02", + "ui/Image/icon/craft_tailor03", + "ui/Image/icon/craft_tailor04", + "ui/Image/icon/craft_tailor05", + "ui/Image/icon/craft_tailor06", + "ui/Image/icon/craft_tailor07", + "ui/Image/icon/craft_tailor08", + "ui/Image/icon/craft_tailor09", + "ui/Image/icon/craft_tailor10", + "ui/Image/icon/cute_01", + "ui/Image/icon/CW_0317_1", + "ui/Image/icon/CW_0317_2", + "ui/Image/icon/CW_0317_3", + "ui/Image/icon/CW_0317_4", + "ui/Image/icon/CW_0317_5", + "ui/Image/icon/CW_0317_6", + "ui/Image/icon/CW_0318", + "ui/Image/icon/CW_0318._2", + "ui/Image/icon/CW_0318_1", + "ui/Image/icon/CW_0318_2", + "ui/Image/icon/CW_0324_1", + "ui/Image/icon/CW_0324_2", + "ui/Image/icon/CW_0324_3", + "ui/Image/icon/cw_0527_01", + "ui/Image/icon/cw_0613_1", + "ui/Image/icon/cw_07_14_01", + "ui/Image/icon/cw_07_14_02", + "ui/Image/icon/cw_07_14_03", + "ui/Image/icon/cw_07_14_04", + "ui/Image/icon/cw_07_14_05", + "ui/Image/icon/cw_07_14_06", + "ui/Image/icon/cw_07_14_07", + "ui/Image/icon/CW_630_01", + "ui/Image/icon/CW_630_02", + "ui/Image/icon/CW_630_03", + "ui/Image/icon/CW_630_04", + "ui/Image/icon/CW_630_05", + "ui/Image/icon/CW_630_06", + "ui/Image/icon/CW_630_07", + "ui/Image/icon/CW_630_08", + "ui/Image/icon/CW_630_09", + "ui/Image/icon/CW_630_10", + "ui/Image/icon/CW_630_11", + "ui/Image/icon/CW_630_12", + "ui/Image/icon/CW_630_13", + "ui/Image/icon/CW_630_14", + "ui/Image/icon/CW_630_15", + "ui/Image/icon/CW_630_16", + "ui/Image/icon/CW_630_17", + "ui/Image/icon/CW_630_18", + "ui/Image/icon/CW_630_19", + "ui/Image/icon/CW_630_20", + "ui/Image/icon/CW_630_21", + "ui/Image/icon/CW_630_22", + "ui/Image/icon/CW_630_23", + "ui/Image/icon/CW_630_24", + "ui/Image/icon/CW_630_25", + "ui/Image/icon/daoj_1124_01", + "ui/Image/icon/daoj_1124_02", + "ui/Image/icon/daoj_1124_03", + "ui/Image/icon/daoj_1124_04", + "ui/Image/icon/daoj_1124_05", + "ui/Image/icon/daoj_1124_06", + "ui/Image/icon/daoj_1124_07", + "ui/Image/icon/daoj_1124_08", + "ui/Image/icon/daoj_1124_09", + "ui/Image/icon/daoj_1124_10", + "ui/Image/icon/daoj_1124_11", + "ui/Image/icon/daoj_1124_12", + "ui/Image/icon/daoj_1124_13", + "ui/Image/icon/daoj_1124_14", + "ui/Image/icon/daoj_1124_15", + "ui/Image/icon/daoj_1124_16", + "ui/Image/icon/daoj_1124_17", + "ui/Image/icon/daoj_1124_18", + "ui/Image/icon/daoj_1124_19", + "ui/Image/icon/daoj_1124_20", + "ui/Image/icon/daoj_1124_21", + "ui/Image/icon/daoj_1124_22", + "ui/Image/icon/daoj_1124_23", + "ui/Image/icon/daoj_1124_24", + "ui/Image/icon/daoj_1124_25", + "ui/Image/icon/daoj_1124_26", + "ui/Image/icon/daoj_1124_27", + "ui/Image/icon/daoj_1124_28", + "ui/Image/icon/daoj_1124_29", + "ui/Image/icon/daoj_1124_30", + "ui/Image/icon/daoj_1124_31", + "ui/Image/icon/daoj_1124_32", + "ui/Image/icon/daoj_1124_33", + "ui/Image/icon/daoj_1124_34", + "ui/Image/icon/daoj_1124_35", + "ui/Image/icon/daoj_1124_36", + "ui/Image/icon/daoj_1124_37", + "ui/Image/icon/daoj_1124_38", + "ui/Image/icon/daoj_1124_39", + "ui/Image/icon/def_0224_1", + "ui/Image/icon/def_0224_2", + "ui/Image/icon/def_200_1", + "ui/Image/icon/def_681_1", + "ui/Image/icon/def_681_2", + "ui/Image/icon/def_681_3", + "ui/Image/icon/def_681_4", + "ui/Image/icon/def_681_5", + "ui/Image/icon/def_681_6", + "ui/Image/icon/def_68DM_1", + "ui/Image/icon/def_68DM_2", + "ui/Image/icon/def_68DM_3", + "ui/Image/icon/def_68DM_4", + "ui/Image/icon/def_68DM_5", + "ui/Image/icon/def_68DM_6", + "ui/Image/icon/def_belt01", + "ui/Image/icon/def_belt02", + "ui/Image/icon/def_belt03", + "ui/Image/icon/def_belt04", + "ui/Image/icon/def_belt05", + "ui/Image/icon/def_belt06", + "ui/Image/icon/def_belt07", + "ui/Image/icon/def_belt08", + "ui/Image/icon/def_belt09", + "ui/Image/icon/def_belt10", + "ui/Image/icon/def_belt11", + "ui/Image/icon/def_belt12", + "ui/Image/icon/def_belt13", + "ui/Image/icon/def_belt14", + "ui/Image/icon/def_belt15", + "ui/Image/icon/def_belt16", + "ui/Image/icon/def_belt17", + "ui/Image/icon/def_belt18", + "ui/Image/icon/def_belt19", + "ui/Image/icon/def_belt20", + "ui/Image/icon/def_belt21", + "ui/Image/icon/def_belt22", + "ui/Image/icon/def_belt23", + "ui/Image/icon/def_belt24", + "ui/Image/icon/def_cangjianT6_01", + "ui/Image/icon/def_cangjianT6_02", + "ui/Image/icon/def_cangjianT6_03", + "ui/Image/icon/def_cangjianT6_h_01", + "ui/Image/icon/def_cangjianT6_h_02", + "ui/Image/icon/def_cangjianT6_h_03", + "ui/Image/icon/def_cangjianT6_s_01", + "ui/Image/icon/def_cangjianT6_s_02", + "ui/Image/icon/def_cangjianT6_s_03", + "ui/Image/icon/def_cangjianT6_W_01", + "ui/Image/icon/def_cangjianT6_W_02", + "ui/Image/icon/def_cangjianT6_W_03", + "ui/Image/icon/def_cangjian_001_01", + "ui/Image/icon/def_cangjian_001_02", + "ui/Image/icon/def_cangjian_001_03", + "ui/Image/icon/def_cangjian_001_04", + "ui/Image/icon/def_cangjian_001_05", + "ui/Image/icon/def_cangjian_001_06", + "ui/Image/icon/def_cangjian_002_01", + "ui/Image/icon/def_cangjian_002_02", + "ui/Image/icon/def_cangjian_002_03", + "ui/Image/icon/def_cangjian_002_04", + "ui/Image/icon/def_cangjian_002_05", + "ui/Image/icon/def_cangjian_002_06", + "ui/Image/icon/def_cangjian_003_01", + "ui/Image/icon/def_cangjian_003_02", + "ui/Image/icon/def_cangjian_003_03", + "ui/Image/icon/def_cangjian_003_04", + "ui/Image/icon/def_cangjian_003_05", + "ui/Image/icon/def_cangjian_003_06", + "ui/Image/icon/def_cangjian_004_01", + "ui/Image/icon/def_cangjian_004_02", + "ui/Image/icon/def_cangjian_004_03", + "ui/Image/icon/def_cangjian_004_04", + "ui/Image/icon/def_cangjian_004_05", + "ui/Image/icon/def_cangjian_004_06", + "ui/Image/icon/def_cangjian_T6_b_01", + "ui/Image/icon/def_cangjian_T6_b_02", + "ui/Image/icon/def_cangjian_T6_b_03", + "ui/Image/icon/def_cangjian_T6_p_01", + "ui/Image/icon/def_cangjian_T6_p_02", + "ui/Image/icon/def_cangjian_T6_p_03", + "ui/Image/icon/def_cangjT8_1", + "ui/Image/icon/def_cangjT8_2", + "ui/Image/icon/def_cangjT8_3", + "ui/Image/icon/def_cangjT8_4", + "ui/Image/icon/def_cangjT8_5", + "ui/Image/icon/def_cangjT8_6", + "ui/Image/icon/def_cangy_01_01", + "ui/Image/icon/def_cangy_01_02", + "ui/Image/icon/def_cangy_01_03", + "ui/Image/icon/def_cangy_01_04", + "ui/Image/icon/def_cangy_01_05", + "ui/Image/icon/def_cangy_01_06", + "ui/Image/icon/def_cangy_02_01", + "ui/Image/icon/def_cangy_02_02", + "ui/Image/icon/def_cangy_02_03", + "ui/Image/icon/def_cangy_02_04", + "ui/Image/icon/def_cangy_02_05", + "ui/Image/icon/def_cangy_02_06", + "ui/Image/icon/def_chunyangT6_11", + "ui/Image/icon/def_chunyangT6_12", + "ui/Image/icon/def_chunyangT6_13", + "ui/Image/icon/def_chunyangT6_21", + "ui/Image/icon/def_chunyangT6_22", + "ui/Image/icon/def_chunyangT6_23", + "ui/Image/icon/def_chunyangT6_31", + "ui/Image/icon/def_chunyangT6_32", + "ui/Image/icon/def_chunyangT6_33", + "ui/Image/icon/def_chunyangT6_41", + "ui/Image/icon/def_chunyangT6_42", + "ui/Image/icon/def_chunyangT6_43", + "ui/Image/icon/def_chunyangT6_51", + "ui/Image/icon/def_chunyangT6_52", + "ui/Image/icon/def_chunyangT6_53", + "ui/Image/icon/def_chunyangT6_61", + "ui/Image/icon/def_chunyangT6_62", + "ui/Image/icon/def_chunyangT6_63", + "ui/Image/icon/def_chunyang_m_001_1", + "ui/Image/icon/def_chunyang_m_001_2", + "ui/Image/icon/def_chunyang_m_001_3", + "ui/Image/icon/def_chunyang_m_001_4", + "ui/Image/icon/def_chunyang_m_001_5", + "ui/Image/icon/def_chunyang_m_002_1", + "ui/Image/icon/def_chunyang_m_002_2", + "ui/Image/icon/def_chunyang_m_002_3", + "ui/Image/icon/def_chunyang_m_002_4", + "ui/Image/icon/def_chunyang_m_002_5", + "ui/Image/icon/def_chunyang_w_001_1", + "ui/Image/icon/def_chunyang_w_001_2", + "ui/Image/icon/def_chunyang_w_001_3", + "ui/Image/icon/def_chunyang_w_001_4", + "ui/Image/icon/def_chunyang_w_001_5", + "ui/Image/icon/def_chunyang_w_002_1", + "ui/Image/icon/def_chunyang_w_002_2", + "ui/Image/icon/def_chunyang_w_002_3", + "ui/Image/icon/def_chunyang_w_002_4", + "ui/Image/icon/def_chunyang_w_002_5", + "ui/Image/icon/def_chunyT8_1", + "ui/Image/icon/def_chunyT8_2", + "ui/Image/icon/def_chunyT8_3", + "ui/Image/icon/def_chunyT8_4", + "ui/Image/icon/def_chunyT8_5", + "ui/Image/icon/def_chunyT8_6", + "ui/Image/icon/def_cj_0408_01", + "ui/Image/icon/def_cj_0408_02", + "ui/Image/icon/def_cj_0408_03", + "ui/Image/icon/def_cj_0408_04", + "ui/Image/icon/def_cj_0408_05", + "ui/Image/icon/def_cj_0408_06", + "ui/Image/icon/def_CJ_11_01", + "ui/Image/icon/def_CJ_11_02", + "ui/Image/icon/def_CJ_11_03", + "ui/Image/icon/def_CJ_11_04", + "ui/Image/icon/def_CJ_11_05", + "ui/Image/icon/def_CJ_11_06", + "ui/Image/icon/def_cj_T9_1", + "ui/Image/icon/def_cj_T9_10", + "ui/Image/icon/def_cj_T9_11", + "ui/Image/icon/def_cj_T9_12", + "ui/Image/icon/def_cj_T9_13", + "ui/Image/icon/def_cj_T9_14", + "ui/Image/icon/def_cj_T9_15", + "ui/Image/icon/def_cj_T9_16", + "ui/Image/icon/def_cj_T9_17", + "ui/Image/icon/def_cj_T9_18", + "ui/Image/icon/def_cj_T9_2", + "ui/Image/icon/def_cj_T9_3", + "ui/Image/icon/def_cj_T9_4", + "ui/Image/icon/def_cj_T9_5", + "ui/Image/icon/def_cj_T9_6", + "ui/Image/icon/def_cj_T9_7", + "ui/Image/icon/def_cj_T9_8", + "ui/Image/icon/def_cj_T9_9", + "ui/Image/icon/def_coat01", + "ui/Image/icon/def_coat02", + "ui/Image/icon/def_coat03", + "ui/Image/icon/def_coat04", + "ui/Image/icon/def_coat05", + "ui/Image/icon/def_coat06", + "ui/Image/icon/def_coat07", + "ui/Image/icon/def_coat08", + "ui/Image/icon/def_coat09", + "ui/Image/icon/def_coat10", + "ui/Image/icon/def_coat11", + "ui/Image/icon/def_coat12", + "ui/Image/icon/def_coat13", + "ui/Image/icon/def_coat14", + "ui/Image/icon/def_coat15", + "ui/Image/icon/def_coat16", + "ui/Image/icon/def_coat17", + "ui/Image/icon/def_coat18", + "ui/Image/icon/def_coat19", + "ui/Image/icon/def_coat20", + "ui/Image/icon/def_coat21", + "ui/Image/icon/def_coat22", + "ui/Image/icon/def_coat23", + "ui/Image/icon/def_coat24", + "ui/Image/icon/def_coat25", + "ui/Image/icon/def_coat26", + "ui/Image/icon/def_coat27", + "ui/Image/icon/def_coat28", + "ui/Image/icon/def_coat29", + "ui/Image/icon/def_coat30", + "ui/Image/icon/def_coat31", + "ui/Image/icon/def_coat32", + "ui/Image/icon/def_coat33", + "ui/Image/icon/def_coat34", + "ui/Image/icon/def_coat35", + "ui/Image/icon/def_coat36", + "ui/Image/icon/def_cuff01", + "ui/Image/icon/def_cuff02", + "ui/Image/icon/def_cuff03", + "ui/Image/icon/def_cuff04", + "ui/Image/icon/def_cuff05", + "ui/Image/icon/def_cuff06", + "ui/Image/icon/def_cuff07", + "ui/Image/icon/def_cuff08", + "ui/Image/icon/def_cuff09", + "ui/Image/icon/def_cuff10", + "ui/Image/icon/def_cuff11", + "ui/Image/icon/def_cuff12", + "ui/Image/icon/def_cuff13", + "ui/Image/icon/def_cuff14", + "ui/Image/icon/def_cuff15", + "ui/Image/icon/def_cuff16", + "ui/Image/icon/def_cuff17", + "ui/Image/icon/def_cuff18", + "ui/Image/icon/def_cuff19", + "ui/Image/icon/def_cuff20", + "ui/Image/icon/def_cuff21", + "ui/Image/icon/def_cuff22", + "ui/Image/icon/def_cuff23", + "ui/Image/icon/def_cuff24", + "ui/Image/icon/def_cuff25", + "ui/Image/icon/def_cuff26", + "ui/Image/icon/def_cuff27", + "ui/Image/icon/def_cuff28", + "ui/Image/icon/def_cuff29", + "ui/Image/icon/def_cuff30", + "ui/Image/icon/def_cuff31", + "ui/Image/icon/def_cuff32", + "ui/Image/icon/def_cuff33", + "ui/Image/icon/def_cuff34", + "ui/Image/icon/def_cuff35", + "ui/Image/icon/def_cuff36", + "ui/Image/icon/def_cuff37", + "ui/Image/icon/def_cuff38", + "ui/Image/icon/def_cuff39", + "ui/Image/icon/def_cuff40", + "ui/Image/icon/def_cuff41", + "ui/Image/icon/def_cuff42", + "ui/Image/icon/def_cuff43", + "ui/Image/icon/def_cuff44", + "ui/Image/icon/def_cuff45", + "ui/Image/icon/def_cuff46", + "ui/Image/icon/def_cuff47", + "ui/Image/icon/def_cuff48", + "ui/Image/icon/def_cy_0408_01", + "ui/Image/icon/def_cy_0408_02", + "ui/Image/icon/def_cy_0408_03", + "ui/Image/icon/def_cy_0408_04", + "ui/Image/icon/def_cy_0408_05", + "ui/Image/icon/def_cy_0408_06", + "ui/Image/icon/def_CY_11_01", + "ui/Image/icon/def_CY_11_02", + "ui/Image/icon/def_CY_11_03", + "ui/Image/icon/def_CY_11_04", + "ui/Image/icon/def_CY_11_05", + "ui/Image/icon/def_CY_11_06", + "ui/Image/icon/def_cy_T9_1", + "ui/Image/icon/def_cy_T9_10", + "ui/Image/icon/def_cy_T9_11", + "ui/Image/icon/def_cy_T9_12", + "ui/Image/icon/def_cy_T9_13", + "ui/Image/icon/def_cy_T9_14", + "ui/Image/icon/def_cy_T9_15", + "ui/Image/icon/def_cy_T9_16", + "ui/Image/icon/def_cy_T9_17", + "ui/Image/icon/def_cy_T9_18", + "ui/Image/icon/def_cy_T9_2", + "ui/Image/icon/def_cy_T9_3", + "ui/Image/icon/def_cy_T9_4", + "ui/Image/icon/def_cy_T9_5", + "ui/Image/icon/def_cy_T9_6", + "ui/Image/icon/def_cy_T9_7", + "ui/Image/icon/def_cy_T9_8", + "ui/Image/icon/def_cy_T9_9", + "ui/Image/icon/def_daoju_T0", + "ui/Image/icon/def_daoju_T1", + "ui/Image/icon/def_daoju_T2", + "ui/Image/icon/def_daoju_T3", + "ui/Image/icon/def_daoz_001_01", + "ui/Image/icon/def_daoz_001_02", + "ui/Image/icon/def_daoz_001_03", + "ui/Image/icon/def_daoz_001_04", + "ui/Image/icon/def_daoz_001_05", + "ui/Image/icon/def_duplicate_m_renz1_4", + "ui/Image/icon/def_duplicate_m_renz1_5", + "ui/Image/icon/def_duplicate_m_renz_2", + "ui/Image/icon/def_duplicate_w_renz1_2", + "ui/Image/icon/def_duplicate_w_renz1_4", + "ui/Image/icon/def_duplicate_w_renz1_5", + "ui/Image/icon/def_eren_001_01", + "ui/Image/icon/def_eren_001_02", + "ui/Image/icon/def_eren_001_03", + "ui/Image/icon/def_eren_001_04", + "ui/Image/icon/def_eren_001_05", + "ui/Image/icon/def_fanhua_meng", + "ui/Image/icon/def_FB_0408_01", + "ui/Image/icon/def_FB_0408_02", + "ui/Image/icon/def_FB_0408_03", + "ui/Image/icon/def_FB_0408_04", + "ui/Image/icon/def_FB_0408_05", + "ui/Image/icon/def_FB_0408_06", + "ui/Image/icon/def_fuzhuang01", + "ui/Image/icon/def_fuzhuang010", + "ui/Image/icon/def_fuzhuang011", + "ui/Image/icon/def_fuzhuang012", + "ui/Image/icon/def_fuzhuang013", + "ui/Image/icon/def_fuzhuang014", + "ui/Image/icon/def_fuzhuang015", + "ui/Image/icon/def_fuzhuang016", + "ui/Image/icon/def_fuzhuang017", + "ui/Image/icon/def_fuzhuang018", + "ui/Image/icon/def_fuzhuang019", + "ui/Image/icon/def_fuzhuang02", + "ui/Image/icon/def_fuzhuang020", + "ui/Image/icon/def_fuzhuang021", + "ui/Image/icon/def_fuzhuang03", + "ui/Image/icon/def_fuzhuang04", + "ui/Image/icon/def_fuzhuang05", + "ui/Image/icon/def_fuzhuang06", + "ui/Image/icon/def_fuzhuang07", + "ui/Image/icon/def_fuzhuang08", + "ui/Image/icon/def_fuzhuang09", + "ui/Image/icon/def_gaib1_1", + "ui/Image/icon/def_gaib1_2", + "ui/Image/icon/def_gaib1_3", + "ui/Image/icon/def_gaib1_4", + "ui/Image/icon/def_gaib1_5", + "ui/Image/icon/def_gaib1_6", + "ui/Image/icon/def_gaib2_1", + "ui/Image/icon/def_gaib2_2", + "ui/Image/icon/def_gaib2_3", + "ui/Image/icon/def_gaib2_4", + "ui/Image/icon/def_gaib2_5", + "ui/Image/icon/def_gaib2_6", + "ui/Image/icon/def_gaib3_1", + "ui/Image/icon/def_gaib3_2", + "ui/Image/icon/def_gaib3_3", + "ui/Image/icon/def_gaib3_4", + "ui/Image/icon/def_gaib3_5", + "ui/Image/icon/def_gaib3_6", + "ui/Image/icon/def_gaib4_1", + "ui/Image/icon/def_gaib4_2", + "ui/Image/icon/def_gaib4_3", + "ui/Image/icon/def_gaib4_4", + "ui/Image/icon/def_gaib4_5", + "ui/Image/icon/def_gaib4_6", + "ui/Image/icon/def_gb_0408_01", + "ui/Image/icon/def_gb_0408_02", + "ui/Image/icon/def_gb_0408_03", + "ui/Image/icon/def_gb_0408_04", + "ui/Image/icon/def_gb_0408_05", + "ui/Image/icon/def_gb_0408_06", + "ui/Image/icon/def_GB_11_01", + "ui/Image/icon/def_GB_11_02", + "ui/Image/icon/def_GB_11_03", + "ui/Image/icon/def_GB_11_04", + "ui/Image/icon/def_GB_11_05", + "ui/Image/icon/def_GB_11_06", + "ui/Image/icon/def_gb_T9_1", + "ui/Image/icon/def_gb_T9_10", + "ui/Image/icon/def_gb_T9_11", + "ui/Image/icon/def_gb_T9_12", + "ui/Image/icon/def_gb_T9_13", + "ui/Image/icon/def_gb_T9_14", + "ui/Image/icon/def_gb_T9_15", + "ui/Image/icon/def_gb_T9_16", + "ui/Image/icon/def_gb_T9_17", + "ui/Image/icon/def_gb_T9_18", + "ui/Image/icon/def_gb_T9_19", + "ui/Image/icon/def_gb_T9_2", + "ui/Image/icon/def_gb_T9_20", + "ui/Image/icon/def_gb_T9_21", + "ui/Image/icon/def_gb_T9_22", + "ui/Image/icon/def_gb_T9_23", + "ui/Image/icon/def_gb_T9_24", + "ui/Image/icon/def_gb_T9_3", + "ui/Image/icon/def_gb_T9_4", + "ui/Image/icon/def_gb_T9_5", + "ui/Image/icon/def_gb_T9_6", + "ui/Image/icon/def_gb_T9_7", + "ui/Image/icon/def_gb_T9_8", + "ui/Image/icon/def_gb_T9_9", + "ui/Image/icon/def_haoqi_001_01", + "ui/Image/icon/def_haoqi_001_02", + "ui/Image/icon/def_haoqi_001_03", + "ui/Image/icon/def_haoqi_001_04", + "ui/Image/icon/def_haoqi_001_05", + "ui/Image/icon/def_head01", + "ui/Image/icon/def_head02", + "ui/Image/icon/def_head03", + "ui/Image/icon/def_head04", + "ui/Image/icon/def_head05", + "ui/Image/icon/def_head06", + "ui/Image/icon/def_head07", + "ui/Image/icon/def_head08", + "ui/Image/icon/def_head09", + "ui/Image/icon/def_head10", + "ui/Image/icon/def_head11", + "ui/Image/icon/def_head12", + "ui/Image/icon/def_head13", + "ui/Image/icon/def_head14", + "ui/Image/icon/def_head15", + "ui/Image/icon/def_head16", + "ui/Image/icon/def_head20", + "ui/Image/icon/def_head21", + "ui/Image/icon/def_head22", + "ui/Image/icon/def_head23", + "ui/Image/icon/def_head24", + "ui/Image/icon/def_head25", + "ui/Image/icon/def_head26", + "ui/Image/icon/def_head27", + "ui/Image/icon/def_head28", + "ui/Image/icon/def_head29", + "ui/Image/icon/def_head30", + "ui/Image/icon/def_head31", + "ui/Image/icon/def_head32", + "ui/Image/icon/def_head33", + "ui/Image/icon/def_head34", + "ui/Image/icon/def_head35", + "ui/Image/icon/def_head36", + "ui/Image/icon/def_head37", + "ui/Image/icon/def_head38", + "ui/Image/icon/def_head39", + "ui/Image/icon/def_head40", + "ui/Image/icon/def_head41", + "ui/Image/icon/def_head42", + "ui/Image/icon/def_head43", + "ui/Image/icon/def_head44", + "ui/Image/icon/def_head45", + "ui/Image/icon/def_head46", + "ui/Image/icon/def_head47", + "ui/Image/icon/def_head48", + "ui/Image/icon/def_head49", + "ui/Image/icon/def_head50", + "ui/Image/icon/def_head51", + "ui/Image/icon/def_head52", + "ui/Image/icon/def_head53", + "ui/Image/icon/def_head54", + "ui/Image/icon/def_head55", + "ui/Image/icon/def_head56", + "ui/Image/icon/def_head57", + "ui/Image/icon/def_head58", + "ui/Image/icon/def_hongyijiao_001_01", + "ui/Image/icon/def_hongyijiao_001_02", + "ui/Image/icon/def_hongyijiao_001_03", + "ui/Image/icon/def_hongyijiao_001_04", + "ui/Image/icon/def_hongyijiao_001_05", + "ui/Image/icon/def_hongyijiao_001_06", + "ui/Image/icon/def_hongyijiao_002_01", + "ui/Image/icon/def_hongyijiao_002_02", + "ui/Image/icon/def_hongyijiao_002_03", + "ui/Image/icon/def_hongyijiao_002_04", + "ui/Image/icon/def_hongyijiao_002_05", + "ui/Image/icon/def_hongyijiao_002_06", + "ui/Image/icon/def_hongyijiao_003_01", + "ui/Image/icon/def_hongyijiao_003_02", + "ui/Image/icon/def_hongyijiao_003_03", + "ui/Image/icon/def_hongyijiao_003_04", + "ui/Image/icon/def_hongyijiao_003_05", + "ui/Image/icon/def_hongyijiao_003_06", + "ui/Image/icon/def_hongyijiao_004_01", + "ui/Image/icon/def_hongyijiao_004_02", + "ui/Image/icon/def_hongyijiao_004_03", + "ui/Image/icon/def_hongyijiao_004_04", + "ui/Image/icon/def_hongyijiao_004_05", + "ui/Image/icon/def_hongyijiao_004_06", + "ui/Image/icon/def_hs_T9_1", + "ui/Image/icon/def_hs_T9_10", + "ui/Image/icon/def_hs_T9_11", + "ui/Image/icon/def_hs_T9_12", + "ui/Image/icon/def_hs_T9_2", + "ui/Image/icon/def_hs_T9_3", + "ui/Image/icon/def_hs_T9_4", + "ui/Image/icon/def_hs_T9_5", + "ui/Image/icon/def_hs_T9_6", + "ui/Image/icon/def_hs_T9_7", + "ui/Image/icon/def_hs_T9_8", + "ui/Image/icon/def_hs_T9_9", + "ui/Image/icon/def_jh1_0408_01", + "ui/Image/icon/def_jh1_0408_02", + "ui/Image/icon/def_jh1_0408_03", + "ui/Image/icon/def_jh1_0408_04", + "ui/Image/icon/def_jh1_0408_05", + "ui/Image/icon/def_jh1_0408_06", + "ui/Image/icon/def_jh2_0408_01", + "ui/Image/icon/def_jh2_0408_02", + "ui/Image/icon/def_jh2_0408_03", + "ui/Image/icon/def_jh2_0408_04", + "ui/Image/icon/def_jh2_0408_05", + "ui/Image/icon/def_jh2_0408_06", + "ui/Image/icon/def_JH_01_01", + "ui/Image/icon/def_JH_01_02", + "ui/Image/icon/def_JH_01_03", + "ui/Image/icon/def_JH_01_04", + "ui/Image/icon/def_JH_01_05", + "ui/Image/icon/def_JH_01_06", + "ui/Image/icon/def_jh_T9_1", + "ui/Image/icon/def_jh_T9_10", + "ui/Image/icon/def_jh_T9_100", + "ui/Image/icon/def_jh_T9_11", + "ui/Image/icon/def_jh_T9_12", + "ui/Image/icon/def_jh_T9_13", + "ui/Image/icon/def_jh_T9_14", + "ui/Image/icon/def_jh_T9_15", + "ui/Image/icon/def_jh_T9_16", + "ui/Image/icon/def_jh_T9_17", + "ui/Image/icon/def_jh_T9_18", + "ui/Image/icon/def_jh_T9_19", + "ui/Image/icon/def_jh_T9_2", + "ui/Image/icon/def_jh_T9_20", + "ui/Image/icon/def_jh_T9_21", + "ui/Image/icon/def_jh_T9_22", + "ui/Image/icon/def_jh_T9_23", + "ui/Image/icon/def_jh_T9_24", + "ui/Image/icon/def_jh_T9_25", + "ui/Image/icon/def_jh_T9_26", + "ui/Image/icon/def_jh_T9_27", + "ui/Image/icon/def_jh_T9_28", + "ui/Image/icon/def_jh_T9_29", + "ui/Image/icon/def_jh_T9_3", + "ui/Image/icon/def_jh_T9_30", + "ui/Image/icon/def_jh_T9_31", + "ui/Image/icon/def_jh_T9_32", + "ui/Image/icon/def_jh_T9_33", + "ui/Image/icon/def_jh_T9_34", + "ui/Image/icon/def_jh_T9_35", + "ui/Image/icon/def_jh_T9_36", + "ui/Image/icon/def_jh_T9_37", + "ui/Image/icon/def_jh_T9_38", + "ui/Image/icon/def_jh_T9_39", + "ui/Image/icon/def_jh_T9_4", + "ui/Image/icon/def_jh_T9_40", + "ui/Image/icon/def_jh_T9_41", + "ui/Image/icon/def_jh_T9_42", + "ui/Image/icon/def_jh_T9_43", + "ui/Image/icon/def_jh_T9_44", + "ui/Image/icon/def_jh_T9_45", + "ui/Image/icon/def_jh_T9_46", + "ui/Image/icon/def_jh_T9_47", + "ui/Image/icon/def_jh_T9_48", + "ui/Image/icon/def_jh_T9_49", + "ui/Image/icon/def_jh_T9_5", + "ui/Image/icon/def_jh_T9_50", + "ui/Image/icon/def_jh_T9_51", + "ui/Image/icon/def_jh_T9_52", + "ui/Image/icon/def_jh_T9_53", + "ui/Image/icon/def_jh_T9_54", + "ui/Image/icon/def_jh_T9_55", + "ui/Image/icon/def_jh_T9_56", + "ui/Image/icon/def_jh_T9_57", + "ui/Image/icon/def_jh_T9_58", + "ui/Image/icon/def_jh_T9_59", + "ui/Image/icon/def_jh_T9_6", + "ui/Image/icon/def_jh_T9_60", + "ui/Image/icon/def_jh_T9_61", + "ui/Image/icon/def_jh_T9_62", + "ui/Image/icon/def_jh_T9_63", + "ui/Image/icon/def_jh_T9_64", + "ui/Image/icon/def_jh_T9_65", + "ui/Image/icon/def_jh_T9_66", + "ui/Image/icon/def_jh_T9_67", + "ui/Image/icon/def_jh_T9_68", + "ui/Image/icon/def_jh_T9_69", + "ui/Image/icon/def_jh_T9_7", + "ui/Image/icon/def_jh_T9_70", + "ui/Image/icon/def_jh_T9_71", + "ui/Image/icon/def_jh_T9_72", + "ui/Image/icon/def_jh_T9_73", + "ui/Image/icon/def_jh_T9_74", + "ui/Image/icon/def_jh_T9_75", + "ui/Image/icon/def_jh_T9_76", + "ui/Image/icon/def_jh_T9_77", + "ui/Image/icon/def_jh_T9_78", + "ui/Image/icon/def_jh_T9_79", + "ui/Image/icon/def_jh_T9_8", + "ui/Image/icon/def_jh_T9_80", + "ui/Image/icon/def_jh_T9_81", + "ui/Image/icon/def_jh_T9_82", + "ui/Image/icon/def_jh_T9_83", + "ui/Image/icon/def_jh_T9_84", + "ui/Image/icon/def_jh_T9_85", + "ui/Image/icon/def_jh_T9_86", + "ui/Image/icon/def_jh_T9_87", + "ui/Image/icon/def_jh_T9_88", + "ui/Image/icon/def_jh_T9_89", + "ui/Image/icon/def_jh_T9_9", + "ui/Image/icon/def_jh_T9_90", + "ui/Image/icon/def_jh_T9_91", + "ui/Image/icon/def_jh_T9_92", + "ui/Image/icon/def_jh_T9_93", + "ui/Image/icon/def_jh_T9_94", + "ui/Image/icon/def_jh_T9_95", + "ui/Image/icon/def_jh_T9_96", + "ui/Image/icon/def_jh_T9_97", + "ui/Image/icon/def_jh_T9_98", + "ui/Image/icon/def_jh_T9_99", + "ui/Image/icon/def_jianghu1_w_ud_belt", + "ui/Image/icon/def_jianghu1_w_ud_coat", + "ui/Image/icon/def_jianghu1_w_ud_cuff", + "ui/Image/icon/def_jianghu1_w_ud_head", + "ui/Image/icon/def_jianghu1_w_ud_pants", + "ui/Image/icon/def_jianghu1_w_ud_shoes", + "ui/Image/icon/def_jianghu2_w_ud_belt", + "ui/Image/icon/def_jianghu2_w_ud_coat", + "ui/Image/icon/def_jianghu2_w_ud_cuff", + "ui/Image/icon/def_jianghu2_w_ud_head", + "ui/Image/icon/def_jianghu2_w_ud_pants", + "ui/Image/icon/def_jianghu2_w_ud_shoes", + "ui/Image/icon/def_jianghu3_w_ud_belt", + "ui/Image/icon/def_jianghu3_w_ud_coat", + "ui/Image/icon/def_jianghu3_w_ud_cuff", + "ui/Image/icon/def_jianghu3_w_ud_head", + "ui/Image/icon/def_jianghu3_w_ud_pants", + "ui/Image/icon/def_jianghu3_w_ud_shoes", + "ui/Image/icon/def_kunlun_001_01", + "ui/Image/icon/def_kunlun_001_02 ", + "ui/Image/icon/def_kunlun_001_03", + "ui/Image/icon/def_kunlun_001_04", + "ui/Image/icon/def_kunlun_001_05", + "ui/Image/icon/def_lxl_001_01", + "ui/Image/icon/def_lxl_001_02", + "ui/Image/icon/def_lxl_001_03", + "ui/Image/icon/def_lxl_001_04", + "ui/Image/icon/def_lxl_001_05", + "ui/Image/icon/def_lxl_001_06", + "ui/Image/icon/def_mingjiaoT2_11", + "ui/Image/icon/def_mingjiaoT2_12", + "ui/Image/icon/def_mingjiaoT2_13", + "ui/Image/icon/def_mingjiaoT2_21", + "ui/Image/icon/def_mingjiaoT2_22", + "ui/Image/icon/def_mingjiaoT2_23", + "ui/Image/icon/def_mingjiaoT2_31", + "ui/Image/icon/def_mingjiaoT2_32", + "ui/Image/icon/def_mingjiaoT2_33", + "ui/Image/icon/def_mingjiaoT2_41", + "ui/Image/icon/def_mingjiaoT2_42", + "ui/Image/icon/def_mingjiaoT2_43", + "ui/Image/icon/def_mingjiaoT2_51", + "ui/Image/icon/def_mingjiaoT2_52", + "ui/Image/icon/def_mingjiaoT2_53", + "ui/Image/icon/def_mingjiaoT2_61", + "ui/Image/icon/def_mingjiaoT2_62", + "ui/Image/icon/def_mingjiaoT2_63", + "ui/Image/icon/def_mingjiao_01", + "ui/Image/icon/def_mingjiao_010", + "ui/Image/icon/def_mingjiao_011", + "ui/Image/icon/def_mingjiao_012", + "ui/Image/icon/def_mingjiao_013", + "ui/Image/icon/def_mingjiao_014", + "ui/Image/icon/def_mingjiao_015", + "ui/Image/icon/def_mingjiao_016", + "ui/Image/icon/def_mingjiao_017", + "ui/Image/icon/def_mingjiao_018", + "ui/Image/icon/def_mingjiao_02", + "ui/Image/icon/def_mingjiao_03", + "ui/Image/icon/def_mingjiao_04", + "ui/Image/icon/def_mingjiao_05", + "ui/Image/icon/def_mingjiao_06", + "ui/Image/icon/def_mingjiao_07", + "ui/Image/icon/def_mingjiao_08", + "ui/Image/icon/def_mingjiao_09", + "ui/Image/icon/def_mingjT8_1", + "ui/Image/icon/def_mingjT8_2", + "ui/Image/icon/def_mingjT8_3", + "ui/Image/icon/def_mingjT8_4", + "ui/Image/icon/def_mingjT8_5", + "ui/Image/icon/def_mingjT8_6", + "ui/Image/icon/def_mj_0408_01", + "ui/Image/icon/def_mj_0408_02", + "ui/Image/icon/def_mj_0408_03", + "ui/Image/icon/def_mj_0408_04", + "ui/Image/icon/def_mj_0408_05", + "ui/Image/icon/def_mj_0408_06", + "ui/Image/icon/def_MJ_11_01", + "ui/Image/icon/def_MJ_11_02", + "ui/Image/icon/def_MJ_11_03", + "ui/Image/icon/def_MJ_11_04", + "ui/Image/icon/def_MJ_11_05", + "ui/Image/icon/def_MJ_11_06", + "ui/Image/icon/def_mj_T9_1", + "ui/Image/icon/def_mj_T9_10", + "ui/Image/icon/def_mj_T9_11", + "ui/Image/icon/def_mj_T9_12", + "ui/Image/icon/def_mj_T9_13", + "ui/Image/icon/def_mj_T9_14", + "ui/Image/icon/def_mj_T9_15", + "ui/Image/icon/def_mj_T9_16", + "ui/Image/icon/def_mj_T9_17", + "ui/Image/icon/def_mj_T9_18", + "ui/Image/icon/def_mj_T9_2", + "ui/Image/icon/def_mj_T9_3", + "ui/Image/icon/def_mj_T9_4", + "ui/Image/icon/def_mj_T9_5", + "ui/Image/icon/def_mj_T9_6", + "ui/Image/icon/def_mj_T9_7", + "ui/Image/icon/def_mj_T9_8", + "ui/Image/icon/def_mj_T9_9", + "ui/Image/icon/def_nanzhao_11", + "ui/Image/icon/def_nanzhao_12", + "ui/Image/icon/def_nanzhao_13", + "ui/Image/icon/def_nanzhao_21", + "ui/Image/icon/def_nanzhao_22", + "ui/Image/icon/def_nanzhao_23", + "ui/Image/icon/def_nanzhao_31", + "ui/Image/icon/def_nanzhao_32", + "ui/Image/icon/def_nanzhao_33", + "ui/Image/icon/def_nanzhao_41", + "ui/Image/icon/def_nanzhao_42", + "ui/Image/icon/def_nanzhao_43", + "ui/Image/icon/def_nanzhao_51", + "ui/Image/icon/def_nanzhao_52", + "ui/Image/icon/def_nanzhao_53", + "ui/Image/icon/def_nanzhao_61", + "ui/Image/icon/def_nanzhao_62", + "ui/Image/icon/def_nanzhao_63", + "ui/Image/icon/def_pants01", + "ui/Image/icon/def_pants02", + "ui/Image/icon/def_pants03", + "ui/Image/icon/def_pants04", + "ui/Image/icon/def_pants05", + "ui/Image/icon/def_pants06", + "ui/Image/icon/def_pants07", + "ui/Image/icon/def_pants08", + "ui/Image/icon/def_pants09", + "ui/Image/icon/def_pants10", + "ui/Image/icon/def_pants11", + "ui/Image/icon/def_pants12", + "ui/Image/icon/def_pants13", + "ui/Image/icon/def_pants14", + "ui/Image/icon/def_pants15", + "ui/Image/icon/def_pants16", + "ui/Image/icon/def_pants17", + "ui/Image/icon/def_pants18", + "ui/Image/icon/def_pants19", + "ui/Image/icon/def_pants20", + "ui/Image/icon/def_pants21", + "ui/Image/icon/def_pants22", + "ui/Image/icon/def_pants23", + "ui/Image/icon/def_pants24", + "ui/Image/icon/def_pants25", + "ui/Image/icon/def_pants26", + "ui/Image/icon/def_pants27", + "ui/Image/icon/def_pants28", + "ui/Image/icon/def_pants29", + "ui/Image/icon/def_pants30", + "ui/Image/icon/def_pants31", + "ui/Image/icon/def_pants32", + "ui/Image/icon/def_pants33", + "ui/Image/icon/def_pants34", + "ui/Image/icon/def_pants35", + "ui/Image/icon/def_pants36", + "ui/Image/icon/def_pants37", + "ui/Image/icon/def_pants38", + "ui/Image/icon/def_pants39", + "ui/Image/icon/def_pants40", + "ui/Image/icon/def_pants41", + "ui/Image/icon/def_pants42", + "ui/Image/icon/def_pants43", + "ui/Image/icon/def_pants44", + "ui/Image/icon/def_qixiuT6_1", + "ui/Image/icon/def_qixiuT6_2", + "ui/Image/icon/def_qixiuT6_3", + "ui/Image/icon/def_qixiuT6_4", + "ui/Image/icon/def_qixiuT6_5", + "ui/Image/icon/def_qixiuT6_6", + "ui/Image/icon/def_qixiuT8_1", + "ui/Image/icon/def_qixiuT8_2", + "ui/Image/icon/def_qixiuT8_3", + "ui/Image/icon/def_qixiuT8_4", + "ui/Image/icon/def_qixiuT8_5", + "ui/Image/icon/def_qixiuT8_6", + "ui/Image/icon/def_qixiu_001_01", + "ui/Image/icon/def_qixiu_001_02", + "ui/Image/icon/def_qixiu_001_03", + "ui/Image/icon/def_qixiu_001_04", + "ui/Image/icon/def_qixiu_001_05", + "ui/Image/icon/def_qixiu_002_01", + "ui/Image/icon/def_qixiu_002_02", + "ui/Image/icon/def_qixiu_002_03", + "ui/Image/icon/def_qixiu_002_04", + "ui/Image/icon/def_qixiu_002_05", + "ui/Image/icon/def_qixiu_003_01", + "ui/Image/icon/def_qixiu_003_02", + "ui/Image/icon/def_qixiu_003_03", + "ui/Image/icon/def_qixiu_003_04", + "ui/Image/icon/def_qixiu_003_05", + "ui/Image/icon/def_qixiu_003_06", + "ui/Image/icon/def_qixiu_004_01", + "ui/Image/icon/def_qixiu_004_02", + "ui/Image/icon/def_qixiu_004_03", + "ui/Image/icon/def_qixiu_004_04", + "ui/Image/icon/def_qixiu_004_05", + "ui/Image/icon/def_qixiu_004_06", + "ui/Image/icon/def_qx_0408_01", + "ui/Image/icon/def_qx_0408_02", + "ui/Image/icon/def_qx_0408_03", + "ui/Image/icon/def_qx_0408_04", + "ui/Image/icon/def_qx_0408_05", + "ui/Image/icon/def_qx_0408_06", + "ui/Image/icon/def_QX_11_01", + "ui/Image/icon/def_QX_11_02", + "ui/Image/icon/def_QX_11_03", + "ui/Image/icon/def_QX_11_04", + "ui/Image/icon/def_QX_11_05", + "ui/Image/icon/def_QX_11_06", + "ui/Image/icon/def_qx_T9_1", + "ui/Image/icon/def_qx_T9_10", + "ui/Image/icon/def_qx_T9_11", + "ui/Image/icon/def_qx_T9_12", + "ui/Image/icon/def_qx_T9_2", + "ui/Image/icon/def_qx_T9_3", + "ui/Image/icon/def_qx_T9_4", + "ui/Image/icon/def_qx_T9_5", + "ui/Image/icon/def_qx_T9_6", + "ui/Image/icon/def_qx_T9_7", + "ui/Image/icon/def_qx_T9_8", + "ui/Image/icon/def_qx_T9_9", + "ui/Image/icon/def_shaolinT6_1", + "ui/Image/icon/def_shaolinT6_11", + "ui/Image/icon/def_shaolinT6_12", + "ui/Image/icon/def_shaolinT6_13", + "ui/Image/icon/def_shaolinT6_2", + "ui/Image/icon/def_shaolinT6_21", + "ui/Image/icon/def_shaolinT6_22", + "ui/Image/icon/def_shaolinT6_23", + "ui/Image/icon/def_shaolinT6_3", + "ui/Image/icon/def_shaolinT6_31", + "ui/Image/icon/def_shaolinT6_32", + "ui/Image/icon/def_shaolinT6_33", + "ui/Image/icon/def_shaolinT6_4", + "ui/Image/icon/def_shaolinT6_41", + "ui/Image/icon/def_shaolinT6_42", + "ui/Image/icon/def_shaolinT6_43", + "ui/Image/icon/def_shaolinT6_5", + "ui/Image/icon/def_shaolinT6_51", + "ui/Image/icon/def_shaolinT6_52", + "ui/Image/icon/def_shaolinT6_53", + "ui/Image/icon/def_shaolinT6_6", + "ui/Image/icon/def_shaolinT6_61", + "ui/Image/icon/def_shaolinT6_62", + "ui/Image/icon/def_shaolinT6_63", + "ui/Image/icon/def_shaolinT8_1", + "ui/Image/icon/def_shaolinT8_2", + "ui/Image/icon/def_shaolinT8_3", + "ui/Image/icon/def_shaolinT8_4", + "ui/Image/icon/def_shaolinT8_5", + "ui/Image/icon/def_shaolinT8_6", + "ui/Image/icon/def_shaolin_001_01", + "ui/Image/icon/def_shaolin_001_02", + "ui/Image/icon/def_shaolin_001_03", + "ui/Image/icon/def_shaolin_001_04", + "ui/Image/icon/def_shaolin_001_05", + "ui/Image/icon/def_shaolin_002_01", + "ui/Image/icon/def_shaolin_002_02", + "ui/Image/icon/def_shaolin_002_03", + "ui/Image/icon/def_shaolin_002_04", + "ui/Image/icon/def_shaolin_002_05", + "ui/Image/icon/def_shaolin_003_01", + "ui/Image/icon/def_shaolin_003_02", + "ui/Image/icon/def_shaolin_003_03", + "ui/Image/icon/def_shaolin_003_04", + "ui/Image/icon/def_shaolin_003_05", + "ui/Image/icon/def_shaolin_004_01", + "ui/Image/icon/def_shaolin_004_02", + "ui/Image/icon/def_shaolin_004_03", + "ui/Image/icon/def_shaolin_004_04", + "ui/Image/icon/def_shaolin_004_05", + "ui/Image/icon/def_shaolin_belt1_w", + "ui/Image/icon/def_shaolin_belt2_w", + "ui/Image/icon/def_shaolin_belt3_w", + "ui/Image/icon/def_shaolin_coat1_w", + "ui/Image/icon/def_shaolin_coat2_w", + "ui/Image/icon/def_shaolin_coat3_w", + "ui/Image/icon/def_shaolin_cuff1_w", + "ui/Image/icon/def_shaolin_cuff2_w", + "ui/Image/icon/def_shaolin_cuff3_w", + "ui/Image/icon/def_shaolin_head1_w", + "ui/Image/icon/def_shaolin_pants1_w", + "ui/Image/icon/def_shaolin_shoes1_w", + "ui/Image/icon/def_shaolin_shoes2_w", + "ui/Image/icon/def_shaolin_shoes3_w", + "ui/Image/icon/def_shenghuo_10", + "ui/Image/icon/def_shenghuo_11", + "ui/Image/icon/def_shenghuo_12", + "ui/Image/icon/def_shenghuo_13", + "ui/Image/icon/def_shenghuo_5", + "ui/Image/icon/def_shenghuo_6", + "ui/Image/icon/def_shenghuo_7", + "ui/Image/icon/def_shenghuo_8", + "ui/Image/icon/def_shenghuo_9", + "ui/Image/icon/def_shoes01", + "ui/Image/icon/def_shoes02", + "ui/Image/icon/def_shoes03", + "ui/Image/icon/def_shoes04", + "ui/Image/icon/def_shoes05", + "ui/Image/icon/def_shoes06", + "ui/Image/icon/def_shoes07", + "ui/Image/icon/def_shoes08", + "ui/Image/icon/def_shoes09", + "ui/Image/icon/def_shoes10", + "ui/Image/icon/def_shoes11", + "ui/Image/icon/def_shoes12", + "ui/Image/icon/def_shoes13", + "ui/Image/icon/def_shoes14", + "ui/Image/icon/def_shoes15", + "ui/Image/icon/def_shoes16", + "ui/Image/icon/def_shoes17", + "ui/Image/icon/def_shoes18", + "ui/Image/icon/def_shoes19", + "ui/Image/icon/def_shoes20", + "ui/Image/icon/def_shoes21", + "ui/Image/icon/def_shoes22", + "ui/Image/icon/def_shoes23", + "ui/Image/icon/def_shoes24", + "ui/Image/icon/def_shoes25", + "ui/Image/icon/def_shoes26", + "ui/Image/icon/def_shoes27", + "ui/Image/icon/def_shoes28", + "ui/Image/icon/def_shoes29", + "ui/Image/icon/def_shoes30", + "ui/Image/icon/def_sl_0408_01", + "ui/Image/icon/def_sl_0408_02", + "ui/Image/icon/def_sl_0408_03", + "ui/Image/icon/def_sl_0408_04", + "ui/Image/icon/def_sl_0408_05", + "ui/Image/icon/def_sl_0408_06", + "ui/Image/icon/def_SL_11_01", + "ui/Image/icon/def_SL_11_02", + "ui/Image/icon/def_SL_11_03", + "ui/Image/icon/def_SL_11_04", + "ui/Image/icon/def_SL_11_05", + "ui/Image/icon/def_SL_11_06", + "ui/Image/icon/def_tangmenT8_1", + "ui/Image/icon/def_tangmenT8_2", + "ui/Image/icon/def_tangmenT8_3", + "ui/Image/icon/def_tangmenT8_4", + "ui/Image/icon/def_tangmenT8_5", + "ui/Image/icon/def_tangmenT8_6", + "ui/Image/icon/def_tangm_01_01", + "ui/Image/icon/def_tangm_01_02", + "ui/Image/icon/def_tangm_01_03", + "ui/Image/icon/def_tangm_01_04", + "ui/Image/icon/def_tangm_01_05", + "ui/Image/icon/def_tangm_01_06", + "ui/Image/icon/def_tangm_02_01", + "ui/Image/icon/def_tangm_02_02", + "ui/Image/icon/def_tangm_02_03", + "ui/Image/icon/def_tangm_02_04", + "ui/Image/icon/def_tangm_02_05", + "ui/Image/icon/def_tangm_02_06", + "ui/Image/icon/def_tangm_03_01", + "ui/Image/icon/def_tangm_03_02", + "ui/Image/icon/def_tangm_03_03", + "ui/Image/icon/def_tangm_03_04", + "ui/Image/icon/def_tangm_03_05", + "ui/Image/icon/def_tangm_03_06", + "ui/Image/icon/def_tangm_04_01", + "ui/Image/icon/def_tangm_04_02", + "ui/Image/icon/def_tangm_04_03", + "ui/Image/icon/def_tangm_04_04", + "ui/Image/icon/def_tangm_04_05", + "ui/Image/icon/def_tangm_04_06", + "ui/Image/icon/def_tc_0408_01", + "ui/Image/icon/def_tc_0408_02", + "ui/Image/icon/def_tc_0408_03", + "ui/Image/icon/def_tc_0408_04", + "ui/Image/icon/def_tc_0408_05", + "ui/Image/icon/def_tc_0408_06", + "ui/Image/icon/def_TC_11_01", + "ui/Image/icon/def_TC_11_02", + "ui/Image/icon/def_TC_11_03", + "ui/Image/icon/def_TC_11_04", + "ui/Image/icon/def_TC_11_05", + "ui/Image/icon/def_TC_11_06", + "ui/Image/icon/def_tc_T9_1", + "ui/Image/icon/def_tc_T9_10", + "ui/Image/icon/def_tc_T9_11", + "ui/Image/icon/def_tc_T9_12", + "ui/Image/icon/def_tc_T9_13", + "ui/Image/icon/def_tc_T9_14", + "ui/Image/icon/def_tc_T9_15", + "ui/Image/icon/def_tc_T9_16", + "ui/Image/icon/def_tc_T9_17", + "ui/Image/icon/def_tc_T9_18", + "ui/Image/icon/def_tc_T9_2", + "ui/Image/icon/def_tc_T9_3", + "ui/Image/icon/def_tc_T9_4", + "ui/Image/icon/def_tc_T9_5", + "ui/Image/icon/def_tc_T9_6", + "ui/Image/icon/def_tc_T9_7", + "ui/Image/icon/def_tc_T9_8", + "ui/Image/icon/def_tc_T9_9", + "ui/Image/icon/def_tianceT6_11", + "ui/Image/icon/def_tianceT6_12", + "ui/Image/icon/def_tianceT6_13", + "ui/Image/icon/def_tianceT6_21", + "ui/Image/icon/def_tianceT6_22", + "ui/Image/icon/def_tianceT6_23", + "ui/Image/icon/def_tianceT6_31", + "ui/Image/icon/def_tianceT6_32", + "ui/Image/icon/def_tianceT6_33", + "ui/Image/icon/def_tianceT6_41", + "ui/Image/icon/def_tianceT6_42", + "ui/Image/icon/def_tianceT6_43", + "ui/Image/icon/def_tianceT6_51", + "ui/Image/icon/def_tianceT6_52", + "ui/Image/icon/def_tianceT6_53", + "ui/Image/icon/def_tianceT6_61", + "ui/Image/icon/def_tianceT6_62", + "ui/Image/icon/def_tianceT6_63", + "ui/Image/icon/def_tianceT8_1", + "ui/Image/icon/def_tianceT8_2", + "ui/Image/icon/def_tianceT8_3", + "ui/Image/icon/def_tianceT8_4", + "ui/Image/icon/def_tianceT8_5", + "ui/Image/icon/def_tianceT8_6", + "ui/Image/icon/def_tiance_m_001_1", + "ui/Image/icon/def_tiance_m_001_2", + "ui/Image/icon/def_tiance_m_001_3", + "ui/Image/icon/def_tiance_m_001_4", + "ui/Image/icon/def_tiance_m_001_5", + "ui/Image/icon/def_tiance_m_002_1", + "ui/Image/icon/def_tiance_m_002_2", + "ui/Image/icon/def_tiance_m_002_3", + "ui/Image/icon/def_tiance_m_002_4", + "ui/Image/icon/def_tiance_m_002_5", + "ui/Image/icon/def_tiance_w_001_1", + "ui/Image/icon/def_tiance_w_001_2", + "ui/Image/icon/def_tiance_w_001_3", + "ui/Image/icon/def_tiance_w_001_4", + "ui/Image/icon/def_tiance_w_001_5", + "ui/Image/icon/def_tiance_w_002_1", + "ui/Image/icon/def_tiance_w_002_2", + "ui/Image/icon/def_tiance_w_002_3", + "ui/Image/icon/def_tiance_w_002_4", + "ui/Image/icon/def_tiance_w_002_5", + "ui/Image/icon/def_tianyi_01", + "ui/Image/icon/def_tianyi_02", + "ui/Image/icon/def_tianyi_03", + "ui/Image/icon/def_tianyi_04", + "ui/Image/icon/def_tianyi_05", + "ui/Image/icon/def_tianyi_06", + "ui/Image/icon/def_tm_0408_01", + "ui/Image/icon/def_tm_0408_02", + "ui/Image/icon/def_tm_0408_03", + "ui/Image/icon/def_tm_0408_04", + "ui/Image/icon/def_tm_0408_05", + "ui/Image/icon/def_tm_0408_06", + "ui/Image/icon/def_TM_11_01", + "ui/Image/icon/def_TM_11_02", + "ui/Image/icon/def_TM_11_03", + "ui/Image/icon/def_TM_11_04", + "ui/Image/icon/def_TM_11_05", + "ui/Image/icon/def_TM_11_06", + "ui/Image/icon/def_tm_T9_1", + "ui/Image/icon/def_tm_T9_10", + "ui/Image/icon/def_tm_T9_11", + "ui/Image/icon/def_tm_T9_12", + "ui/Image/icon/def_tm_T9_13", + "ui/Image/icon/def_tm_T9_14", + "ui/Image/icon/def_tm_T9_15", + "ui/Image/icon/def_tm_T9_16", + "ui/Image/icon/def_tm_T9_17", + "ui/Image/icon/def_tm_T9_18", + "ui/Image/icon/def_tm_T9_2", + "ui/Image/icon/def_tm_T9_3", + "ui/Image/icon/def_tm_T9_4", + "ui/Image/icon/def_tm_T9_5", + "ui/Image/icon/def_tm_T9_6", + "ui/Image/icon/def_tm_T9_7", + "ui/Image/icon/def_tm_T9_8", + "ui/Image/icon/def_tm_T9_9", + "ui/Image/icon/def_uni_belt1_w", + "ui/Image/icon/def_uni_belt2_w", + "ui/Image/icon/def_uni_belt3_w", + "ui/Image/icon/def_uni_belt4_w", + "ui/Image/icon/def_uni_coat1_w", + "ui/Image/icon/def_uni_coat2_w", + "ui/Image/icon/def_uni_coat3_w", + "ui/Image/icon/def_uni_coat4_w", + "ui/Image/icon/def_uni_coat5_w", + "ui/Image/icon/def_uni_coat6_w", + "ui/Image/icon/def_uni_cuff1_w", + "ui/Image/icon/def_uni_cuff2_w", + "ui/Image/icon/def_uni_cuff3_w", + "ui/Image/icon/def_uni_cuff4_w", + "ui/Image/icon/def_uni_head1_w", + "ui/Image/icon/def_uni_head2_w", + "ui/Image/icon/def_uni_head3_w", + "ui/Image/icon/def_uni_pants1_w", + "ui/Image/icon/def_uni_pants2_w", + "ui/Image/icon/def_uni_pants3_w", + "ui/Image/icon/def_uni_shoes1_w", + "ui/Image/icon/def_uni_shoes2_w", + "ui/Image/icon/def_uni_shoes3_w", + "ui/Image/icon/def_uni_shoes4_w", + "ui/Image/icon/def_wanhuaT6_11", + "ui/Image/icon/def_wanhuaT6_12", + "ui/Image/icon/def_wanhuaT6_13", + "ui/Image/icon/def_wanhuaT6_21", + "ui/Image/icon/def_wanhuaT6_22", + "ui/Image/icon/def_wanhuaT6_23", + "ui/Image/icon/def_wanhuaT6_31", + "ui/Image/icon/def_wanhuaT6_32", + "ui/Image/icon/def_wanhuaT6_33", + "ui/Image/icon/def_wanhuaT6_41", + "ui/Image/icon/def_wanhuaT6_42", + "ui/Image/icon/def_wanhuaT6_43", + "ui/Image/icon/def_wanhuaT6_51", + "ui/Image/icon/def_wanhuaT6_52", + "ui/Image/icon/def_wanhuaT6_53", + "ui/Image/icon/def_wanhuaT6_61", + "ui/Image/icon/def_wanhuaT6_62", + "ui/Image/icon/def_wanhuaT6_63", + "ui/Image/icon/def_wanhuaT8_1", + "ui/Image/icon/def_wanhuaT8_2", + "ui/Image/icon/def_wanhuaT8_3", + "ui/Image/icon/def_wanhuaT8_4", + "ui/Image/icon/def_wanhuaT8_5", + "ui/Image/icon/def_wanhuaT8_6", + "ui/Image/icon/def_wanhua_belt1_w", + "ui/Image/icon/def_wanhua_belt2_w", + "ui/Image/icon/def_wanhua_belt3_w", + "ui/Image/icon/def_wanhua_coat1_w", + "ui/Image/icon/def_wanhua_coat2_w", + "ui/Image/icon/def_wanhua_coat3_w", + "ui/Image/icon/def_wanhua_cuff1_w", + "ui/Image/icon/def_wanhua_cuff2_w", + "ui/Image/icon/def_wanhua_cuff3_w", + "ui/Image/icon/def_wanhua_head1_w", + "ui/Image/icon/def_wanhua_head2_w", + "ui/Image/icon/def_wanhua_head3_w", + "ui/Image/icon/def_wanhua_m_001_1", + "ui/Image/icon/def_wanhua_m_001_2", + "ui/Image/icon/def_wanhua_m_001_3", + "ui/Image/icon/def_wanhua_m_001_4", + "ui/Image/icon/def_wanhua_m_001_5", + "ui/Image/icon/def_wanhua_m_002_1", + "ui/Image/icon/def_wanhua_m_002_2", + "ui/Image/icon/def_wanhua_m_002_3", + "ui/Image/icon/def_wanhua_m_002_4", + "ui/Image/icon/def_wanhua_m_002_5", + "ui/Image/icon/def_wanhua_m_shoes1_5", + "ui/Image/icon/def_wanhua_pants1_w", + "ui/Image/icon/def_wanhua_shoes1_w", + "ui/Image/icon/def_wanhua_shoes2_w", + "ui/Image/icon/def_wanhua_shoes3_w", + "ui/Image/icon/def_wanhua_w_001_1", + "ui/Image/icon/def_wanhua_w_001_2", + "ui/Image/icon/def_wanhua_w_001_3", + "ui/Image/icon/def_wanhua_w_001_4", + "ui/Image/icon/def_wanhua_w_001_5", + "ui/Image/icon/def_wanhua_w_002_1", + "ui/Image/icon/def_wanhua_w_002_2", + "ui/Image/icon/def_wanhua_w_002_3", + "ui/Image/icon/def_wanhua_w_002_4", + "ui/Image/icon/def_wanhua_w_002_5", + "ui/Image/icon/def_wanhua_w_shoes1_5", + "ui/Image/icon/def_wd_0408_01", + "ui/Image/icon/def_wd_0408_02", + "ui/Image/icon/def_wd_0408_03", + "ui/Image/icon/def_wd_0408_04", + "ui/Image/icon/def_wd_0408_05", + "ui/Image/icon/def_wd_0408_06", + "ui/Image/icon/def_WD_11_01", + "ui/Image/icon/def_WD_11_02", + "ui/Image/icon/def_WD_11_03", + "ui/Image/icon/def_WD_11_04", + "ui/Image/icon/def_WD_11_05", + "ui/Image/icon/def_WD_11_06", + "ui/Image/icon/def_wd_T9_1", + "ui/Image/icon/def_wd_T9_10", + "ui/Image/icon/def_wd_T9_11", + "ui/Image/icon/def_wd_T9_12", + "ui/Image/icon/def_wd_T9_13", + "ui/Image/icon/def_wd_T9_14", + "ui/Image/icon/def_wd_T9_15", + "ui/Image/icon/def_wd_T9_16", + "ui/Image/icon/def_wd_T9_17", + "ui/Image/icon/def_wd_T9_18", + "ui/Image/icon/def_wd_T9_2", + "ui/Image/icon/def_wd_T9_3", + "ui/Image/icon/def_wd_T9_4", + "ui/Image/icon/def_wd_T9_5", + "ui/Image/icon/def_wd_T9_6", + "ui/Image/icon/def_wd_T9_7", + "ui/Image/icon/def_wd_T9_8", + "ui/Image/icon/def_wd_T9_9", + "ui/Image/icon/def_wh_0408_01", + "ui/Image/icon/def_wh_0408_02", + "ui/Image/icon/def_wh_0408_03", + "ui/Image/icon/def_wh_0408_04", + "ui/Image/icon/def_wh_0408_05", + "ui/Image/icon/def_wh_0408_06", + "ui/Image/icon/def_WH_11_01", + "ui/Image/icon/def_WH_11_02", + "ui/Image/icon/def_WH_11_03", + "ui/Image/icon/def_WH_11_04", + "ui/Image/icon/def_WH_11_05", + "ui/Image/icon/def_WH_11_06", + "ui/Image/icon/def_wh_T9_1", + "ui/Image/icon/def_wh_T9_10", + "ui/Image/icon/def_wh_T9_11", + "ui/Image/icon/def_wh_T9_12", + "ui/Image/icon/def_wh_T9_13", + "ui/Image/icon/def_wh_T9_14", + "ui/Image/icon/def_wh_T9_15", + "ui/Image/icon/def_wh_T9_16", + "ui/Image/icon/def_wh_T9_17", + "ui/Image/icon/def_wh_T9_18", + "ui/Image/icon/def_wh_T9_2", + "ui/Image/icon/def_wh_T9_3", + "ui/Image/icon/def_wh_T9_4", + "ui/Image/icon/def_wh_T9_5", + "ui/Image/icon/def_wh_T9_6", + "ui/Image/icon/def_wh_T9_7", + "ui/Image/icon/def_wh_T9_8", + "ui/Image/icon/def_wh_T9_9", + "ui/Image/icon/def_wuduT6_11", + "ui/Image/icon/def_wuduT6_12", + "ui/Image/icon/def_wuduT6_13", + "ui/Image/icon/def_wuduT6_21", + "ui/Image/icon/def_wuduT6_22", + "ui/Image/icon/def_wuduT6_23", + "ui/Image/icon/def_wuduT6_31", + "ui/Image/icon/def_wuduT6_32", + "ui/Image/icon/def_wuduT6_33", + "ui/Image/icon/def_wuduT6_41", + "ui/Image/icon/def_wuduT6_42", + "ui/Image/icon/def_wuduT6_43", + "ui/Image/icon/def_wuduT6_51", + "ui/Image/icon/def_wuduT6_52", + "ui/Image/icon/def_wuduT6_53", + "ui/Image/icon/def_wuduT6_61", + "ui/Image/icon/def_wuduT6_62", + "ui/Image/icon/def_wuduT6_63", + "ui/Image/icon/def_wuduT8_1", + "ui/Image/icon/def_wuduT8_2", + "ui/Image/icon/def_wuduT8_3", + "ui/Image/icon/def_wuduT8_4", + "ui/Image/icon/def_wuduT8_5", + "ui/Image/icon/def_wuduT8_6", + "ui/Image/icon/def_wudu_001_01", + "ui/Image/icon/def_wudu_001_02", + "ui/Image/icon/def_wudu_001_03", + "ui/Image/icon/def_wudu_001_04", + "ui/Image/icon/def_wudu_001_05", + "ui/Image/icon/def_wudu_001_06", + "ui/Image/icon/def_wudu_002_01", + "ui/Image/icon/def_wudu_002_02", + "ui/Image/icon/def_wudu_002_03", + "ui/Image/icon/def_wudu_002_04", + "ui/Image/icon/def_wudu_002_05", + "ui/Image/icon/def_wudu_002_06", + "ui/Image/icon/def_wudu_003_01", + "ui/Image/icon/def_wudu_003_02", + "ui/Image/icon/def_wudu_003_03", + "ui/Image/icon/def_wudu_003_04", + "ui/Image/icon/def_wudu_003_05", + "ui/Image/icon/def_wudu_003_06", + "ui/Image/icon/def_wudu_004_01", + "ui/Image/icon/def_wudu_004_02", + "ui/Image/icon/def_wudu_004_03", + "ui/Image/icon/def_wudu_004_04", + "ui/Image/icon/def_wudu_004_05", + "ui/Image/icon/def_wudu_004_06", + "ui/Image/icon/def_wz_0415_01", + "ui/Image/icon/def_wz_0415_02", + "ui/Image/icon/def_wz_120", + "ui/Image/icon/def_xinshou_w_m_coat", + "ui/Image/icon/def_xinshou_w_m_pants", + "ui/Image/icon/def_yangchun_xue", + "ui/Image/icon/def_zhanbao_001_01", + "ui/Image/icon/def_zhanbao_001_02", + "ui/Image/icon/def_zhanbao_001_03", + "ui/Image/icon/def_zhanbao_001_04", + "ui/Image/icon/def_zhanbao_001_05", + "ui/Image/icon/def_zhanbao_002_01", + "ui/Image/icon/def_zhanbao_002_02", + "ui/Image/icon/def_zhanbao_002_03", + "ui/Image/icon/def_zhanbao_002_04", + "ui/Image/icon/def_zhanbao_002_05", + "ui/Image/icon/denglong_01", + "ui/Image/icon/denglong_02", + "ui/Image/icon/denglong_03", + "ui/Image/icon/dihuagongrenwu0", + "ui/Image/icon/dihuagongrenwu01", + "ui/Image/icon/dihuagongrenwu02", + "ui/Image/icon/dihuagongrenwu02_2_1", + "ui/Image/icon/dihuagongrenwu02_3", + "ui/Image/icon/dihuagongrenwu02_4_2", + "ui/Image/icon/dihuagongrenwu02_5", + "ui/Image/icon/dihuagongrenwu02_6_3", + "ui/Image/icon/dihuagongrenwu03", + "ui/Image/icon/dihuagongrenwu04", + "ui/Image/icon/dihuagongrenwu04_2", + "ui/Image/icon/dihuagongrenwu04_3", + "ui/Image/icon/dihuagongrenwu04_4_5", + "ui/Image/icon/dihuagongrenwu04_5", + "ui/Image/icon/dihuagongrenwu04_6_6", + "ui/Image/icon/dihuagongrenwu04_7", + "ui/Image/icon/dihuagongrenwu05", + "ui/Image/icon/dihuagongrenwu06", + "ui/Image/icon/dihuagongrenwu06_2_7", + "ui/Image/icon/dihuagongrenwu06_3", + "ui/Image/icon/dihuagongrenwu06_5", + "ui/Image/icon/dihuagongrenwu06_7", + "ui/Image/icon/dihuagongrenwu07", + "ui/Image/icon/dihuagongrenwu08", + "ui/Image/icon/dihuagongrenwu09", + "ui/Image/icon/dihuagongrenwu10", + "ui/Image/icon/DJ_01", + "ui/Image/icon/DJ_02", + "ui/Image/icon/DJ_03", + "ui/Image/icon/DJ_04", + "ui/Image/icon/DJ_0414_01", + "ui/Image/icon/DJ_0414_02", + "ui/Image/icon/DJ_0414_04", + "ui/Image/icon/DJ_0414_05", + "ui/Image/icon/DJ_0414_06", + "ui/Image/icon/DJ_0414_07", + "ui/Image/icon/DJ_0418_01", + "ui/Image/icon/DJ_0418_02", + "ui/Image/icon/DJ_05", + "ui/Image/icon/DJ_06", + "ui/Image/icon/DJ_07", + "ui/Image/icon/DJ_08", + "ui/Image/icon/DJ_09", + "ui/Image/icon/DJ_10", + "ui/Image/icon/DJ_11", + "ui/Image/icon/DJ_12", + "ui/Image/icon/DJ_13", + "ui/Image/icon/DJ_13_11_1", + "ui/Image/icon/DJ_13_11_10", + "ui/Image/icon/DJ_13_11_11", + "ui/Image/icon/DJ_13_11_12", + "ui/Image/icon/DJ_13_11_13", + "ui/Image/icon/DJ_13_11_14", + "ui/Image/icon/DJ_13_11_15", + "ui/Image/icon/DJ_13_11_16", + "ui/Image/icon/DJ_13_11_17", + "ui/Image/icon/DJ_13_11_18", + "ui/Image/icon/DJ_13_11_2", + "ui/Image/icon/DJ_13_11_3", + "ui/Image/icon/DJ_13_11_4", + "ui/Image/icon/DJ_13_11_5", + "ui/Image/icon/DJ_13_11_6", + "ui/Image/icon/DJ_13_11_7", + "ui/Image/icon/DJ_13_11_8", + "ui/Image/icon/DJ_13_11_9", + "ui/Image/icon/DJ_14", + "ui/Image/icon/DJ_15", + "ui/Image/icon/DJ_16", + "ui/Image/icon/DJ_17", + "ui/Image/icon/DJ_18", + "ui/Image/icon/DJ_19", + "ui/Image/icon/DJ_1_1", + "ui/Image/icon/DJ_1_10", + "ui/Image/icon/DJ_1_11", + "ui/Image/icon/DJ_1_12", + "ui/Image/icon/DJ_1_13", + "ui/Image/icon/DJ_1_2", + "ui/Image/icon/DJ_1_3", + "ui/Image/icon/DJ_1_4", + "ui/Image/icon/DJ_1_5", + "ui/Image/icon/DJ_1_6", + "ui/Image/icon/DJ_1_7", + "ui/Image/icon/DJ_1_8", + "ui/Image/icon/DJ_1_9", + "ui/Image/icon/DJ_20", + "ui/Image/icon/DJ_21", + "ui/Image/icon/DropItemNew01", + "ui/Image/icon/DropItemNew02", + "ui/Image/icon/DropItemNew03", + "ui/Image/icon/DropItemNew04", + "ui/Image/icon/DropItemNew05", + "ui/Image/icon/DropItemNew06", + "ui/Image/icon/DropItemNew07", + "ui/Image/icon/DropItemNew08", + "ui/Image/icon/DropItemNew09", + "ui/Image/icon/DropItemNew10", + "ui/Image/icon/DropItemNew11", + "ui/Image/icon/DropItemNew12", + "ui/Image/icon/DropItemNew13", + "ui/Image/icon/DropItemNew14", + "ui/Image/icon/DropItemNew15", + "ui/Image/icon/DropItemNew16", + "ui/Image/icon/DropItemNew17", + "ui/Image/icon/DropItemNew18", + "ui/Image/icon/DropItemNew19", + "ui/Image/icon/DropItemNew20", + "ui/Image/icon/DropItemNew21", + "ui/Image/icon/DropItemNew22", + "ui/Image/icon/DropItemNew23", + "ui/Image/icon/DropItemNew24", + "ui/Image/icon/DropItemNew25", + "ui/Image/icon/DropItemNew26", + "ui/Image/icon/DropItemNew27", + "ui/Image/icon/DropItemNew28", + "ui/Image/icon/DropItemNew29", + "ui/Image/icon/DropItemNew30", + "ui/Image/icon/DropItemNew31", + "ui/Image/icon/DropItemNew32", + "ui/Image/icon/DropItemNew33", + "ui/Image/icon/DropItemNew34", + "ui/Image/icon/DropItemNew35", + "ui/Image/icon/DropItemNew36", + "ui/Image/icon/DropItemNew37", + "ui/Image/icon/DropItemNew38", + "ui/Image/icon/DropItemNew39", + "ui/Image/icon/DropItemNew40", + "ui/Image/icon/DropItemNew41", + "ui/Image/icon/DropItemNew42", + "ui/Image/icon/DropItemNew43", + "ui/Image/icon/DropItemNew44", + "ui/Image/icon/DropItemNew45", + "ui/Image/icon/DropItemNew46", + "ui/Image/icon/DropItemNew47", + "ui/Image/icon/DropItemNew48", + "ui/Image/icon/DropItemNew49", + "ui/Image/icon/DropItemNew50", + "ui/Image/icon/DropItemNew51", + "ui/Image/icon/DropItemNew52", + "ui/Image/icon/DropItemNew53", + "ui/Image/icon/DropItemNew54", + "ui/Image/icon/DropItemNew55", + "ui/Image/icon/DropItemNew56", + "ui/Image/icon/DropItemNew57", + "ui/Image/icon/DropItemNew58", + "ui/Image/icon/DropItemNew59", + "ui/Image/icon/DropItemNew60", + "ui/Image/icon/DropItemNew61", + "ui/Image/icon/DropItemNew62", + "ui/Image/icon/DropItemNew63", + "ui/Image/icon/DropItemNew64", + "ui/Image/icon/DropItemNew65", + "ui/Image/icon/DropItemNew66", + "ui/Image/icon/DropItemNew67", + "ui/Image/icon/DropItemNew68", + "ui/Image/icon/DropItemNew69", + "ui/Image/icon/DropItemNew70", + "ui/Image/icon/DropItemNew71", + "ui/Image/icon/DropItemNew72", + "ui/Image/icon/DropItemNew73", + "ui/Image/icon/DropItemNew74", + "ui/Image/icon/DropItemNew75", + "ui/Image/icon/DropItemNew76", + "ui/Image/icon/DropItemNew77", + "ui/Image/icon/DropItemNew78", + "ui/Image/icon/DropItemNew79", + "ui/Image/icon/DropItemNew80", + "ui/Image/icon/dulunche_1", + "ui/Image/icon/dye01", + "ui/Image/icon/dye02", + "ui/Image/icon/dye03", + "ui/Image/icon/eba02", + "ui/Image/icon/eba03", + "ui/Image/icon/enchant_tailor01", + "ui/Image/icon/enchant_tailor02", + "ui/Image/icon/enchant_tailor03", + "ui/Image/icon/enchant_tailor04", + "ui/Image/icon/enchant_tailor05", + "ui/Image/icon/enchant_tailor06", + "ui/Image/icon/enchant_tailor07", + "ui/Image/icon/enchant_tailor08", + "ui/Image/icon/enchant_tailor09", + "ui/Image/icon/enchant_tailor10", + "ui/Image/icon/enchant_tailor11", + "ui/Image/icon/enchant_tailor12", + "ui/Image/icon/enchant_tailor13", + "ui/Image/icon/extend01", + "ui/Image/icon/extend02", + "ui/Image/icon/extend03", + "ui/Image/icon/extend04", + "ui/Image/icon/extend05", + "ui/Image/icon/extend06", + "ui/Image/icon/extend07", + "ui/Image/icon/extend08", + "ui/Image/icon/extend09", + "ui/Image/icon/extend10", + "ui/Image/icon/extend_0224_1", + "ui/Image/icon/extend_0408_01", + "ui/Image/icon/extend_0408_02", + "ui/Image/icon/extend_0408_03", + "ui/Image/icon/extend_0408_04", + "ui/Image/icon/extend_0408_05", + "ui/Image/icon/extend_0408_06", + "ui/Image/icon/extend_0408_07", + "ui/Image/icon/extend_0414_01", + "ui/Image/icon/extend_0414_02", + "ui/Image/icon/extend_0414_03", + "ui/Image/icon/extend_0414_04", + "ui/Image/icon/extend_0414_05", + "ui/Image/icon/extend_0414_06", + "ui/Image/icon/extend_0414_07", + "ui/Image/icon/extend_0414_08", + "ui/Image/icon/extend_0414_09", + "ui/Image/icon/extend_0414_10", + "ui/Image/icon/extend_0414_11", + "ui/Image/icon/extend_0414_12", + "ui/Image/icon/extend_1021_1", + "ui/Image/icon/extend_14_1_1", + "ui/Image/icon/extend_14_1_2", + "ui/Image/icon/extend_14_1_3", + "ui/Image/icon/extend_14_1_4", + "ui/Image/icon/extend_14_1_s", + "ui/Image/icon/extend_68_1", + "ui/Image/icon/extend_68_10", + "ui/Image/icon/extend_68_11", + "ui/Image/icon/extend_68_12", + "ui/Image/icon/extend_68_13", + "ui/Image/icon/extend_68_14", + "ui/Image/icon/extend_68_15", + "ui/Image/icon/extend_68_16", + "ui/Image/icon/extend_68_17", + "ui/Image/icon/extend_68_18", + "ui/Image/icon/extend_68_19", + "ui/Image/icon/extend_68_2", + "ui/Image/icon/extend_68_20", + "ui/Image/icon/extend_68_21", + "ui/Image/icon/extend_68_22", + "ui/Image/icon/extend_68_23", + "ui/Image/icon/extend_68_24", + "ui/Image/icon/extend_68_25", + "ui/Image/icon/extend_68_26", + "ui/Image/icon/extend_68_27", + "ui/Image/icon/extend_68_28", + "ui/Image/icon/extend_68_29", + "ui/Image/icon/extend_68_3", + "ui/Image/icon/extend_68_30", + "ui/Image/icon/extend_68_31", + "ui/Image/icon/extend_68_32", + "ui/Image/icon/extend_68_33", + "ui/Image/icon/extend_68_34", + "ui/Image/icon/extend_68_4", + "ui/Image/icon/extend_68_5", + "ui/Image/icon/extend_68_6", + "ui/Image/icon/extend_68_7", + "ui/Image/icon/extend_68_8", + "ui/Image/icon/extend_68_9", + "ui/Image/icon/extend_916_1", + "ui/Image/icon/extend_916_2", + "ui/Image/icon/extend_back43", + "ui/Image/icon/extend_back44", + "ui/Image/icon/extend_back45", + "ui/Image/icon/extend_back46", + "ui/Image/icon/extend_back47", + "ui/Image/icon/extend_back48", + "ui/Image/icon/extend_back49", + "ui/Image/icon/extend_back50", + "ui/Image/icon/extend_Back_01", + "ui/Image/icon/extend_Back_02", + "ui/Image/icon/extend_Back_03", + "ui/Image/icon/extend_Back_04", + "ui/Image/icon/extend_Back_05", + "ui/Image/icon/extend_Back_06", + "ui/Image/icon/extend_Back_07", + "ui/Image/icon/extend_Back_08", + "ui/Image/icon/extend_back_09", + "ui/Image/icon/extend_Back_10", + "ui/Image/icon/extend_Back_11", + "ui/Image/icon/extend_Back_12", + "ui/Image/icon/extend_Back_13", + "ui/Image/icon/extend_Back_14", + "ui/Image/icon/extend_Back_15", + "ui/Image/icon/extend_Back_16", + "ui/Image/icon/extend_Back_19", + "ui/Image/icon/extend_back_20", + "ui/Image/icon/extend_back_21", + "ui/Image/icon/extend_back_22", + "ui/Image/icon/extend_back_23", + "ui/Image/icon/extend_back_24", + "ui/Image/icon/extend_back_25", + "ui/Image/icon/extend_back_26", + "ui/Image/icon/extend_back_27", + "ui/Image/icon/extend_back_28", + "ui/Image/icon/extend_back_29", + "ui/Image/icon/extend_back_30", + "ui/Image/icon/extend_back_31", + "ui/Image/icon/extend_back_32", + "ui/Image/icon/extend_back_33", + "ui/Image/icon/extend_back_34", + "ui/Image/icon/extend_back_35", + "ui/Image/icon/extend_back_36", + "ui/Image/icon/extend_back_37", + "ui/Image/icon/extend_back_38", + "ui/Image/icon/extend_back_39", + "ui/Image/icon/extend_back_40", + "ui/Image/icon/extend_back_41", + "ui/Image/icon/extend_back_42", + "ui/Image/icon/extend_T9_1", + "ui/Image/icon/extend_T9_10", + "ui/Image/icon/extend_T9_11", + "ui/Image/icon/extend_T9_12", + "ui/Image/icon/extend_T9_14", + "ui/Image/icon/extend_T9_15", + "ui/Image/icon/extend_T9_16", + "ui/Image/icon/extend_T9_17", + "ui/Image/icon/extend_T9_18", + "ui/Image/icon/extend_T9_19", + "ui/Image/icon/extend_T9_2", + "ui/Image/icon/extend_T9_3", + "ui/Image/icon/extend_T9_4", + "ui/Image/icon/extend_T9_5", + "ui/Image/icon/extend_T9_6", + "ui/Image/icon/extend_T9_7", + "ui/Image/icon/extend_T9_8", + "ui/Image/icon/extend_Waist33", + "ui/Image/icon/extend_Waist34", + "ui/Image/icon/extend_Waist35", + "ui/Image/icon/extend_Waist36", + "ui/Image/icon/extend_Waist37", + "ui/Image/icon/extend_Waist38", + "ui/Image/icon/extend_Waist_01", + "ui/Image/icon/extend_Waist_02", + "ui/Image/icon/extend_Waist_03", + "ui/Image/icon/extend_Waist_04", + "ui/Image/icon/extend_Waist_05", + "ui/Image/icon/extend_Waist_06", + "ui/Image/icon/extend_Waist_07", + "ui/Image/icon/extend_Waist_08", + "ui/Image/icon/extend_Waist_09", + "ui/Image/icon/extend_Waist_10", + "ui/Image/icon/extend_Waist_11", + "ui/Image/icon/extend_Waist_12", + "ui/Image/icon/extend_Waist_13", + "ui/Image/icon/extend_Waist_14", + "ui/Image/icon/extend_Waist_15", + "ui/Image/icon/extend_Waist_16", + "ui/Image/icon/extend_Waist_17", + "ui/Image/icon/extend_Waist_18", + "ui/Image/icon/extend_Waist_19", + "ui/Image/icon/extend_Waist_20", + "ui/Image/icon/extend_waist_21", + "ui/Image/icon/extend_waist_22", + "ui/Image/icon/extend_waist_23", + "ui/Image/icon/extend_waist_24", + "ui/Image/icon/extend_waist_25", + "ui/Image/icon/extend_waist_26", + "ui/Image/icon/extend_waist_27", + "ui/Image/icon/extend_waist_28", + "ui/Image/icon/extend_waist_29", + "ui/Image/icon/extend_waist_30", + "ui/Image/icon/extend_waist_31", + "ui/Image/icon/extend_waist_32", + "ui/Image/icon/F1_001", + "ui/Image/icon/F1_002", + "ui/Image/icon/F1_003", + "ui/Image/icon/F1_004", + "ui/Image/icon/F1_005", + "ui/Image/icon/F1_006", + "ui/Image/icon/F1_007", + "ui/Image/icon/F1_008", + "ui/Image/icon/F1_009", + "ui/Image/icon/F1_010", + "ui/Image/icon/F1_011", + "ui/Image/icon/F1_012", + "ui/Image/icon/F1_013", + "ui/Image/icon/F1_014", + "ui/Image/icon/F1_015", + "ui/Image/icon/F1_016", + "ui/Image/icon/F1_017", + "ui/Image/icon/F1_018", + "ui/Image/icon/F1_019", + "ui/Image/icon/F1_020", + "ui/Image/icon/F1_021", + "ui/Image/icon/F1_022", + "ui/Image/icon/F1_023", + "ui/Image/icon/F1_024", + "ui/Image/icon/F1_025", + "ui/Image/icon/F1_026", + "ui/Image/icon/F1_027", + "ui/Image/icon/F1_028", + "ui/Image/icon/F1_029", + "ui/Image/icon/F1_030", + "ui/Image/icon/F1_chuncai001", + "ui/Image/icon/F1_chuncai002", + "ui/Image/icon/F1_chuncai003", + "ui/Image/icon/F1_chuncai004", + "ui/Image/icon/F1_chuncai005", + "ui/Image/icon/F1_chuncai006", + "ui/Image/icon/F1_chuncai007", + "ui/Image/icon/F1_chuncai008", + "ui/Image/icon/F1_chuncai009", + "ui/Image/icon/F1_jichu001", + "ui/Image/icon/F1_jichu002", + "ui/Image/icon/F1_jichu003", + "ui/Image/icon/F1_jichu004", + "ui/Image/icon/F1_meimao001", + "ui/Image/icon/F1_meimao002", + "ui/Image/icon/F1_meimao003", + "ui/Image/icon/F1_meimao004", + "ui/Image/icon/F1_meimao005", + "ui/Image/icon/F1_meimao006", + "ui/Image/icon/F1_meimao007", + "ui/Image/icon/F1_meimao008", + "ui/Image/icon/F1_meimao009", + "ui/Image/icon/F1_meimao010", + "ui/Image/icon/F1_meimao011", + "ui/Image/icon/F1_meimao012", + "ui/Image/icon/F1_meimao013", + "ui/Image/icon/F1_meimao014", + "ui/Image/icon/F1_meimao015", + "ui/Image/icon/F1_meimao016", + "ui/Image/icon/F1_meimao1", + "ui/Image/icon/F1_meimao2", + "ui/Image/icon/F1_meimao3", + "ui/Image/icon/F1_meimao4", + "ui/Image/icon/F1_meimao5", + "ui/Image/icon/F1_yanxian001", + "ui/Image/icon/F1_yanxian002", + "ui/Image/icon/F1_yanxian003", + "ui/Image/icon/F1_yanxian004", + "ui/Image/icon/F1_yanxian005", + "ui/Image/icon/F1_yanxian006", + "ui/Image/icon/F1_yanxian007", + "ui/Image/icon/F1_yanxian008", + "ui/Image/icon/F1_yanxian009", + "ui/Image/icon/F1_yanxian010", + "ui/Image/icon/F1_yanying001", + "ui/Image/icon/F1_yanying002", + "ui/Image/icon/F1_yanying003", + "ui/Image/icon/F1_yanying004", + "ui/Image/icon/F1_yanying005", + "ui/Image/icon/F1_yanying006", + "ui/Image/icon/F1_yanying007", + "ui/Image/icon/F1_yanying008", + "ui/Image/icon/F1_yanying009", + "ui/Image/icon/F1_yanying010", + "ui/Image/icon/F1_yanying011", + "ui/Image/icon/F2_001", + "ui/Image/icon/F2_002", + "ui/Image/icon/F2_003", + "ui/Image/icon/F2_004", + "ui/Image/icon/F2_005", + "ui/Image/icon/F2_006", + "ui/Image/icon/F2_007", + "ui/Image/icon/F2_008", + "ui/Image/icon/F2_009", + "ui/Image/icon/F2_010", + "ui/Image/icon/F2_011", + "ui/Image/icon/F2_012", + "ui/Image/icon/F2_013", + "ui/Image/icon/F2_014", + "ui/Image/icon/F2_015", + "ui/Image/icon/F2_016", + "ui/Image/icon/F2_017", + "ui/Image/icon/F2_018", + "ui/Image/icon/F2_019", + "ui/Image/icon/F2_020", + "ui/Image/icon/F2_021", + "ui/Image/icon/F2_022", + "ui/Image/icon/F2_023", + "ui/Image/icon/F2_024", + "ui/Image/icon/F2_025", + "ui/Image/icon/F2_026", + "ui/Image/icon/F2_027", + "ui/Image/icon/F2_028", + "ui/Image/icon/F2_029", + "ui/Image/icon/F2_030", + "ui/Image/icon/F2_031", + "ui/Image/icon/F2_034", + "ui/Image/icon/F2_chuncai001", + "ui/Image/icon/F2_chuncai002", + "ui/Image/icon/F2_chuncai003", + "ui/Image/icon/F2_chuncai004", + "ui/Image/icon/F2_chuncai005", + "ui/Image/icon/F2_chuncai006", + "ui/Image/icon/F2_chuncai007", + "ui/Image/icon/F2_chuncai008", + "ui/Image/icon/F2_chuncai009", + "ui/Image/icon/F2_chuncai010", + "ui/Image/icon/F2_chuncai011", + "ui/Image/icon/F2_Default", + "ui/Image/icon/F2_jichu001", + "ui/Image/icon/F2_jichu002", + "ui/Image/icon/F2_jichu003", + "ui/Image/icon/F2_jichu004", + "ui/Image/icon/F2_jichu005", + "ui/Image/icon/F2_jichu006", + "ui/Image/icon/F2_meimao001", + "ui/Image/icon/F2_meimao002", + "ui/Image/icon/F2_meimao003", + "ui/Image/icon/F2_meimao004", + "ui/Image/icon/F2_meimao005", + "ui/Image/icon/F2_meimao006", + "ui/Image/icon/F2_meimao007", + "ui/Image/icon/F2_meimao008", + "ui/Image/icon/F2_meimao009", + "ui/Image/icon/F2_meimao010", + "ui/Image/icon/F2_meimao011", + "ui/Image/icon/F2_meimao012", + "ui/Image/icon/F2_meimao013", + "ui/Image/icon/F2_meimao014", + "ui/Image/icon/F2_meimao1", + "ui/Image/icon/F2_meimao2", + "ui/Image/icon/F2_meimao3", + "ui/Image/icon/F2_meimao4", + "ui/Image/icon/F2_meimao5", + "ui/Image/icon/F2_saihong001", + "ui/Image/icon/F2_saihong002", + "ui/Image/icon/F2_saihong003", + "ui/Image/icon/F2_saihong004", + "ui/Image/icon/F2_saihong005", + "ui/Image/icon/F2_saihong006", + "ui/Image/icon/F2_saihong007", + "ui/Image/icon/F2_saihong008", + "ui/Image/icon/F2_tongkong001", + "ui/Image/icon/F2_tongkong002", + "ui/Image/icon/F2_tongkong003", + "ui/Image/icon/F2_tongkong004", + "ui/Image/icon/F2_tongkong005", + "ui/Image/icon/F2_tongkong006", + "ui/Image/icon/F2_tongkong007", + "ui/Image/icon/F2_tongkong008", + "ui/Image/icon/F2_yanshenguang001", + "ui/Image/icon/F2_yanshenguang002", + "ui/Image/icon/F2_yanshenguang003", + "ui/Image/icon/F2_yanshenguang004", + "ui/Image/icon/F2_yanshenguang005", + "ui/Image/icon/F2_yanshenguang006", + "ui/Image/icon/F2_yanshenguang007", + "ui/Image/icon/F2_yanshenguang008", + "ui/Image/icon/F2_yanshenguang009", + "ui/Image/icon/F2_yanshenguang010", + "ui/Image/icon/F2_yanshenguang011", + "ui/Image/icon/F2_yanshenguang012", + "ui/Image/icon/F2_yanshenguang013", + "ui/Image/icon/F2_yanxian001", + "ui/Image/icon/F2_yanxian002", + "ui/Image/icon/F2_yanxian003", + "ui/Image/icon/F2_yanxian004", + "ui/Image/icon/F2_yanxian005", + "ui/Image/icon/F2_yanxian006", + "ui/Image/icon/F2_yanxian007", + "ui/Image/icon/F2_yanxian008", + "ui/Image/icon/F2_yanxian009", + "ui/Image/icon/F2_yanxian010", + "ui/Image/icon/F2_yanxian011", + "ui/Image/icon/F2_yanying001", + "ui/Image/icon/F2_yanying002", + "ui/Image/icon/F2_yanying003", + "ui/Image/icon/F2_yanying004", + "ui/Image/icon/F2_yanying005", + "ui/Image/icon/F2_yanying006", + "ui/Image/icon/F2_yanying007", + "ui/Image/icon/F2_yanying008", + "ui/Image/icon/F2_yanying009", + "ui/Image/icon/F2_yanying010", + "ui/Image/icon/F2_yanying011", + "ui/Image/icon/F2_yanying012", + "ui/Image/icon/fengche02", + "ui/Image/icon/five_element_stone_10a", + "ui/Image/icon/five_element_stone_10b", + "ui/Image/icon/five_element_stone_10c", + "ui/Image/icon/five_element_stone_10d", + "ui/Image/icon/five_element_stone_10e", + "ui/Image/icon/five_element_stone_1a", + "ui/Image/icon/five_element_stone_1b", + "ui/Image/icon/five_element_stone_1c", + "ui/Image/icon/five_element_stone_1d", + "ui/Image/icon/five_element_stone_1e", + "ui/Image/icon/five_element_stone_2a", + "ui/Image/icon/five_element_stone_2b", + "ui/Image/icon/five_element_stone_2c", + "ui/Image/icon/five_element_stone_2d", + "ui/Image/icon/five_element_stone_2e", + "ui/Image/icon/five_element_stone_3a", + "ui/Image/icon/five_element_stone_3b", + "ui/Image/icon/five_element_stone_3c", + "ui/Image/icon/five_element_stone_3d", + "ui/Image/icon/five_element_stone_3e", + "ui/Image/icon/five_element_stone_4a", + "ui/Image/icon/five_element_stone_4b", + "ui/Image/icon/five_element_stone_4c", + "ui/Image/icon/five_element_stone_4d", + "ui/Image/icon/five_element_stone_4e", + "ui/Image/icon/five_element_stone_5a", + "ui/Image/icon/five_element_stone_5b", + "ui/Image/icon/five_element_stone_5c", + "ui/Image/icon/five_element_stone_5d", + "ui/Image/icon/five_element_stone_5e", + "ui/Image/icon/five_element_stone_6a", + "ui/Image/icon/five_element_stone_6b", + "ui/Image/icon/five_element_stone_6c", + "ui/Image/icon/five_element_stone_6d", + "ui/Image/icon/five_element_stone_6e", + "ui/Image/icon/five_element_stone_7a", + "ui/Image/icon/five_element_stone_7b", + "ui/Image/icon/five_element_stone_7c", + "ui/Image/icon/five_element_stone_7d", + "ui/Image/icon/five_element_stone_7e", + "ui/Image/icon/five_element_stone_8a", + "ui/Image/icon/five_element_stone_8b", + "ui/Image/icon/five_element_stone_8c", + "ui/Image/icon/five_element_stone_8d", + "ui/Image/icon/five_element_stone_8e", + "ui/Image/icon/five_element_stone_9a", + "ui/Image/icon/five_element_stone_9b", + "ui/Image/icon/five_element_stone_9c", + "ui/Image/icon/five_element_stone_9d", + "ui/Image/icon/five_element_stone_9e", + "ui/Image/icon/five_element_stone_broken_1", + "ui/Image/icon/five_element_stone_dust_1", + "ui/Image/icon/five_element_stone_dust_10", + "ui/Image/icon/five_element_stone_dust_2", + "ui/Image/icon/five_element_stone_dust_3", + "ui/Image/icon/five_element_stone_dust_4", + "ui/Image/icon/five_element_stone_dust_5", + "ui/Image/icon/five_element_stone_dust_6", + "ui/Image/icon/five_element_stone_dust_7", + "ui/Image/icon/five_element_stone_dust_8", + "ui/Image/icon/five_element_stone_dust_9", + "ui/Image/icon/five_element_stone_fire_1", + "ui/Image/icon/five_element_stone_fire_10", + "ui/Image/icon/five_element_stone_fire_2", + "ui/Image/icon/five_element_stone_fire_3", + "ui/Image/icon/five_element_stone_fire_4", + "ui/Image/icon/five_element_stone_fire_5", + "ui/Image/icon/five_element_stone_fire_6", + "ui/Image/icon/five_element_stone_fire_7", + "ui/Image/icon/five_element_stone_fire_8", + "ui/Image/icon/five_element_stone_fire_9", + "ui/Image/icon/five_element_stone_gold_1", + "ui/Image/icon/five_element_stone_gold_10", + "ui/Image/icon/five_element_stone_gold_2", + "ui/Image/icon/five_element_stone_gold_3", + "ui/Image/icon/five_element_stone_gold_4", + "ui/Image/icon/five_element_stone_gold_5", + "ui/Image/icon/five_element_stone_gold_6", + "ui/Image/icon/five_element_stone_gold_7", + "ui/Image/icon/five_element_stone_gold_8", + "ui/Image/icon/five_element_stone_gold_9", + "ui/Image/icon/five_element_stone_water_1", + "ui/Image/icon/five_element_stone_water_10", + "ui/Image/icon/five_element_stone_water_2", + "ui/Image/icon/five_element_stone_water_3", + "ui/Image/icon/five_element_stone_water_4", + "ui/Image/icon/five_element_stone_water_5", + "ui/Image/icon/five_element_stone_water_6", + "ui/Image/icon/five_element_stone_water_7", + "ui/Image/icon/five_element_stone_water_8", + "ui/Image/icon/five_element_stone_water_9", + "ui/Image/icon/five_element_stone_wood_1", + "ui/Image/icon/five_element_stone_wood_10", + "ui/Image/icon/five_element_stone_wood_2", + "ui/Image/icon/five_element_stone_wood_3", + "ui/Image/icon/five_element_stone_wood_4", + "ui/Image/icon/five_element_stone_wood_5", + "ui/Image/icon/five_element_stone_wood_6", + "ui/Image/icon/five_element_stone_wood_7", + "ui/Image/icon/five_element_stone_wood_8", + "ui/Image/icon/five_element_stone_wood_9", + "ui/Image/icon/flag01", + "ui/Image/icon/flag02", + "ui/Image/icon/flag03", + "ui/Image/icon/flag04", + "ui/Image/icon/flag05", + "ui/Image/icon/food01", + "ui/Image/icon/food02", + "ui/Image/icon/food03", + "ui/Image/icon/food04", + "ui/Image/icon/food05", + "ui/Image/icon/food06", + "ui/Image/icon/food07", + "ui/Image/icon/food08", + "ui/Image/icon/food09", + "ui/Image/icon/food10", + "ui/Image/icon/food11", + "ui/Image/icon/food12", + "ui/Image/icon/food13", + "ui/Image/icon/food17", + "ui/Image/icon/food19", + "ui/Image/icon/food24", + "ui/Image/icon/food25", + "ui/Image/icon/food26", + "ui/Image/icon/food27", + "ui/Image/icon/foodPackage01", + "ui/Image/icon/foodPackage02", + "ui/Image/icon/foodPackage03", + "ui/Image/icon/foodPackage04", + "ui/Image/icon/foodPackage05", + "ui/Image/icon/forcedrop01", + "ui/Image/icon/forcedrop03", + "ui/Image/icon/forcedrop04", + "ui/Image/icon/forcedrop06", + "ui/Image/icon/forcedrop07", + "ui/Image/icon/forcedrop08", + "ui/Image/icon/forcedrop09", + "ui/Image/icon/forcedrop10", + "ui/Image/icon/forcedrop11", + "ui/Image/icon/forcedrop13", + "ui/Image/icon/forcedrop14", + "ui/Image/icon/forcedrop15", + "ui/Image/icon/forcedrop18", + "ui/Image/icon/forcedrop20", + "ui/Image/icon/forcedrop21", + "ui/Image/icon/forcedrop26", + "ui/Image/icon/forcedrop27", + "ui/Image/icon/forcedrop29", + "ui/Image/icon/Formation_01", + "ui/Image/icon/Formation_01A", + "ui/Image/icon/Formation_cangjian_01", + "ui/Image/icon/Formation_cangjian_01A", + "ui/Image/icon/Formation_cangjian_02", + "ui/Image/icon/Formation_cangjian_03", + "ui/Image/icon/Formation_cangjian_04", + "ui/Image/icon/Formation_cangjian_05", + "ui/Image/icon/Formation_cangjian_06", + "ui/Image/icon/Formation_cangjian_07", + "ui/Image/icon/Formation_cangjian_10", + "ui/Image/icon/Formation_cangjian_10A", + "ui/Image/icon/Formation_chunyang_01", + "ui/Image/icon/Formation_chunyang_01A", + "ui/Image/icon/Formation_chunyang_10", + "ui/Image/icon/Formation_chunyang_10A", + "ui/Image/icon/Formation_mingjiao_01", + "ui/Image/icon/Formation_mingjiao_02", + "ui/Image/icon/Formation_mingjiao_03", + "ui/Image/icon/Formation_mingjiao_04", + "ui/Image/icon/Formation_mingjiao_05", + "ui/Image/icon/Formation_qixiu_01", + "ui/Image/icon/Formation_qixiu_01A", + "ui/Image/icon/Formation_qixiu_10", + "ui/Image/icon/Formation_qixiu_10A", + "ui/Image/icon/Formation_shaolin_01", + "ui/Image/icon/Formation_shaolin_01A", + "ui/Image/icon/Formation_shaolin_10", + "ui/Image/icon/Formation_shaolin_10A", + "ui/Image/icon/Formation_tangm_01", + "ui/Image/icon/Formation_tangm_01A", + "ui/Image/icon/Formation_tangm_02", + "ui/Image/icon/Formation_tangm_03", + "ui/Image/icon/Formation_tangm_04", + "ui/Image/icon/Formation_tangm_05", + "ui/Image/icon/Formation_tangm_06", + "ui/Image/icon/Formation_tangm_07", + "ui/Image/icon/Formation_tangm_10", + "ui/Image/icon/Formation_tangm_10A", + "ui/Image/icon/Formation_tiance_01", + "ui/Image/icon/Formation_tiance_01A", + "ui/Image/icon/Formation_tiance_10", + "ui/Image/icon/Formation_tiance_10A", + "ui/Image/icon/Formation_wanhua_01", + "ui/Image/icon/Formation_wanhua_01A", + "ui/Image/icon/Formation_wanhua_10", + "ui/Image/icon/Formation_wanhua_10A", + "ui/Image/icon/formation_wudu_01", + "ui/Image/icon/formation_wudu_01A", + "ui/Image/icon/formation_wudu_02", + "ui/Image/icon/formation_wudu_03", + "ui/Image/icon/formation_wudu_04", + "ui/Image/icon/formation_wudu_05", + "ui/Image/icon/formation_wudu_06", + "ui/Image/icon/formation_wudu_07", + "ui/Image/icon/formation_wudu_10", + "ui/Image/icon/formation_wudu_10A", + "ui/Image/icon/foundingNew01a", + "ui/Image/icon/foundingNew01b", + "ui/Image/icon/foundingNew01c", + "ui/Image/icon/foundingNew01d", + "ui/Image/icon/foundingNew02a", + "ui/Image/icon/foundingNew02b", + "ui/Image/icon/foundingNew02c", + "ui/Image/icon/foundingNew02d", + "ui/Image/icon/foundingNew03a", + "ui/Image/icon/foundingNew03b", + "ui/Image/icon/foundingNew03c", + "ui/Image/icon/foundingNew03d", + "ui/Image/icon/foundingNew04a", + "ui/Image/icon/foundingNew04b", + "ui/Image/icon/foundingNew04c", + "ui/Image/icon/foundingNew04d", + "ui/Image/icon/foundingNew05a", + "ui/Image/icon/foundingNew05b", + "ui/Image/icon/foundingNew05c", + "ui/Image/icon/foundingNew05d", + "ui/Image/icon/foundingNew06", + "ui/Image/icon/foundingNew07", + "ui/Image/icon/foundingNew08", + "ui/Image/icon/foundingNew09a", + "ui/Image/icon/foundingNew09b", + "ui/Image/icon/foundingNew09c", + "ui/Image/icon/foundry01", + "ui/Image/icon/foundry02", + "ui/Image/icon/foundry05", + "ui/Image/icon/foundry08", + "ui/Image/icon/foundry09", + "ui/Image/icon/foundry14", + "ui/Image/icon/foundry17", + "ui/Image/icon/foundry19", + "ui/Image/icon/foundry20", + "ui/Image/icon/foundry21", + "ui/Image/icon/foundry25", + "ui/Image/icon/foundry26", + "ui/Image/icon/foundry27", + "ui/Image/icon/foundry29", + "ui/Image/icon/foundry30", + "ui/Image/icon/friend_01", + "ui/Image/icon/friend_02", + "ui/Image/icon/friend_03", + "ui/Image/icon/friend_04", + "ui/Image/icon/friend_05", + "ui/Image/icon/gaoyao", + "ui/Image/icon/gj_0527_01", + "ui/Image/icon/gj_0527_02", + "ui/Image/icon/gj_0527_03", + "ui/Image/icon/gj_0527_04", + "ui/Image/icon/gj_0527_05", + "ui/Image/icon/GJ_0728_01", + "ui/Image/icon/gj_0804_01", + "ui/Image/icon/GJ_0819_1", + "ui/Image/icon/GJ_0819_1_j", + "ui/Image/icon/GJ_0819_1_q", + "ui/Image/icon/GJ_0819_1_x", + "ui/Image/icon/GJ_0819_1_y", + "ui/Image/icon/GJ_0819_2", + "ui/Image/icon/GJ_0819_3", + "ui/Image/icon/GJ_0819_4", + "ui/Image/icon/GJ_0819_5", + "ui/Image/icon/GJ_0819_6", + "ui/Image/icon/GJ_0819_7", + "ui/Image/icon/GJ_0819_8", + "ui/Image/icon/GJ_0903_1", + "ui/Image/icon/GJ_0903_2", + "ui/Image/icon/GJ_0929_01", + "ui/Image/icon/GJ_0929_02", + "ui/Image/icon/GJ_0929_03", + "ui/Image/icon/GJ_0929_04", + "ui/Image/icon/GJ_0929_05", + "ui/Image/icon/GJ_0929_06", + "ui/Image/icon/GJ_0929_07", + "ui/Image/icon/GJ_0929_08", + "ui/Image/icon/gongdeng", + "ui/Image/icon/guajian_chilun", + "ui/Image/icon/guajian_niao", + "ui/Image/icon/guajian_quxiao", + "ui/Image/icon/guanchongjian", + "ui/Image/icon/hanguo_01", + "ui/Image/icon/HD_630_01", + "ui/Image/icon/HD_630_02", + "ui/Image/icon/HD_630_03", + "ui/Image/icon/HD_630_04", + "ui/Image/icon/hehuadeng_01", + "ui/Image/icon/heihuzi", + "ui/Image/icon/horse_01", + "ui/Image/icon/horse_02", + "ui/Image/icon/horse_03", + "ui/Image/icon/horse_04", + "ui/Image/icon/Horse_0415", + "ui/Image/icon/horse_05", + "ui/Image/icon/horse_06", + "ui/Image/icon/horse_07", + "ui/Image/icon/horse_08", + "ui/Image/icon/horse_09", + "ui/Image/icon/horse_10", + "ui/Image/icon/horse_11", + "ui/Image/icon/horse_bag_01", + "ui/Image/icon/horse_bag_02", + "ui/Image/icon/horse_belt_01", + "ui/Image/icon/horse_belt_02", + "ui/Image/icon/horse_belt_03", + "ui/Image/icon/horse_belt_04", + "ui/Image/icon/horse_belt_05", + "ui/Image/icon/horse_hand_01", + "ui/Image/icon/horse_hand_02", + "ui/Image/icon/horse_hand_03", + "ui/Image/icon/horse_hand_04", + "ui/Image/icon/horse_hand_05", + "ui/Image/icon/horse_leg_01", + "ui/Image/icon/horse_leg_02", + "ui/Image/icon/horse_leg_03", + "ui/Image/icon/horse_leg_04", + "ui/Image/icon/horse_leg_05", + "ui/Image/icon/horse_skill_01", + "ui/Image/icon/horse_skill_02", + "ui/Image/icon/horse_skill_03", + "ui/Image/icon/horse_skill_04", + "ui/Image/icon/horse_skill_05", + "ui/Image/icon/horse_skill_06", + "ui/Image/icon/horse_skill_07", + "ui/Image/icon/horse_skill_08", + "ui/Image/icon/horse_skill_09", + "ui/Image/icon/horse_skill_10", + "ui/Image/icon/horse_skill_11", + "ui/Image/icon/horse_skill_12", + "ui/Image/icon/horse_skill_13", + "ui/Image/icon/horse_skill_14", + "ui/Image/icon/horse_skill_15", + "ui/Image/icon/horse_skill_16", + "ui/Image/icon/horse_skill_17", + "ui/Image/icon/horse_skill_18", + "ui/Image/icon/horse_skill_19", + "ui/Image/icon/horse_skill_20", + "ui/Image/icon/horse_skill_21", + "ui/Image/icon/horse_skill_22", + "ui/Image/icon/horse_skill_23", + "ui/Image/icon/horse_skill_24", + "ui/Image/icon/horse_skill_25", + "ui/Image/icon/horse_skill_26", + "ui/Image/icon/horse_skill_27", + "ui/Image/icon/horse_skill_28", + "ui/Image/icon/horse_skill_29", + "ui/Image/icon/horse_skill_30", + "ui/Image/icon/horse_skill_31", + "ui/Image/icon/horse_skill_32", + "ui/Image/icon/horse_skill_33", + "ui/Image/icon/horse_skill_34", + "ui/Image/icon/horse_skill_35", + "ui/Image/icon/horse_skill_36", + "ui/Image/icon/horse_skill_37", + "ui/Image/icon/horse_skill_38", + "ui/Image/icon/horse_skill_39", + "ui/Image/icon/horse_skill_40", + "ui/Image/icon/horse_skill_41", + "ui/Image/icon/horse_skill_42", + "ui/Image/icon/horse_skill_43", + "ui/Image/icon/horse_skill_44", + "ui/Image/icon/horse_skill_45", + "ui/Image/icon/horse_skill_46", + "ui/Image/icon/horse_skill_47", + "ui/Image/icon/huodongchoujiang_san", + "ui/Image/icon/huodong_01", + "ui/Image/icon/huodong_01_01", + "ui/Image/icon/huodong_01_02", + "ui/Image/icon/huodong_01_03", + "ui/Image/icon/huodong_01_04", + "ui/Image/icon/huodong_01_05", + "ui/Image/icon/huodong_01_20_1", + "ui/Image/icon/huodong_01_20_2", + "ui/Image/icon/huodong_01_20_3", + "ui/Image/icon/huodong_01_20_4", + "ui/Image/icon/huodong_01_20_5", + "ui/Image/icon/huodong_01_20_6", + "ui/Image/icon/huodong_01_20_7", + "ui/Image/icon/huodong_01_20_8", + "ui/Image/icon/huodong_01_20_9", + "ui/Image/icon/huodong_02", + "ui/Image/icon/huodong_03", + "ui/Image/icon/huodong_0512_1", + "ui/Image/icon/huodong_0512_2", + "ui/Image/icon/huodong_cz_01", + "ui/Image/icon/huodong_cz_02", + "ui/Image/icon/huodong_cz_03", + "ui/Image/icon/huodong_cz_04", + "ui/Image/icon/huodong_cz_05", + "ui/Image/icon/huodong_cz_06", + "ui/Image/icon/huodong_cz_07", + "ui/Image/icon/huodong_cz_08", + "ui/Image/icon/huodong_cz_09", + "ui/Image/icon/huodong_cz_10", + "ui/Image/icon/huodong_dz_01", + "ui/Image/icon/huodong_dz_02", + "ui/Image/icon/huodong_mrt_01", + "ui/Image/icon/huodong_mrt_02", + "ui/Image/icon/huodong_mrt_03", + "ui/Image/icon/huodong_mrt_04", + "ui/Image/icon/huodong_mrt_05", + "ui/Image/icon/huodong_mrt_06", + "ui/Image/icon/huodong_mrt_07", + "ui/Image/icon/huodong_mrt_08", + "ui/Image/icon/huodong_mrt_09", + "ui/Image/icon/huodong_mrt_10", + "ui/Image/icon/huodong_mrt_11", + "ui/Image/icon/huodong_mrt_12", + "ui/Image/icon/huodong_mrt_13", + "ui/Image/icon/huodong_mrt_14", + "ui/Image/icon/huodong_mrt_15", + "ui/Image/icon/huodong_mrt_16", + "ui/Image/icon/huodong_mrt_17", + "ui/Image/icon/huodong_mrt_18", + "ui/Image/icon/huodong_mrt_19", + "ui/Image/icon/huodong_mrt_20", + "ui/Image/icon/huodong_mrt_21", + "ui/Image/icon/huodong_mrt_22", + "ui/Image/icon/huodong_mrt_23", + "ui/Image/icon/huodong_mrt_24", + "ui/Image/icon/huodong_mrt_25", + "ui/Image/icon/huodong_mrt_26", + "ui/Image/icon/huodong_wabao_01", + "ui/Image/icon/huodong_wabao_02", + "ui/Image/icon/huodong_wabao_03", + "ui/Image/icon/huodong_wabao_04", + "ui/Image/icon/huodong_wabao_05", + "ui/Image/icon/huodong_wabao_06", + "ui/Image/icon/huodong_wabao_07", + "ui/Image/icon/huodong_wabao_08", + "ui/Image/icon/huodong_wabao_09", + "ui/Image/icon/huodong_wabao_10", + "ui/Image/icon/huodong_wabao_11", + "ui/Image/icon/huodong_wabao_12", + "ui/Image/icon/huodong_wabao_13", + "ui/Image/icon/huodong_wabao_14", + "ui/Image/icon/huodong_wabao_15", + "ui/Image/icon/huodong_wabao_16", + "ui/Image/icon/huodong_wabao_17", + "ui/Image/icon/huodong_wabao_18", + "ui/Image/icon/huodong_wabao_19", + "ui/Image/icon/huodong_wabao_20", + "ui/Image/icon/huodong_wabao_21", + "ui/Image/icon/huodong_wabao_22", + "ui/Image/icon/huodong_wabao_23", + "ui/Image/icon/huodong_wabao_24", + "ui/Image/icon/huodong_wabao_25", + "ui/Image/icon/huodong_wabao_26", + "ui/Image/icon/huodong_wabao_27", + "ui/Image/icon/huodong_wabao_28", + "ui/Image/icon/huodong_wabao_29", + "ui/Image/icon/huodong_wabao_30", + "ui/Image/icon/huodong_wabao_31", + "ui/Image/icon/huod_jineng1", + "ui/Image/icon/huod_jineng2", + "ui/Image/icon/hushengangqi", + "ui/Image/icon/huxu001", + "ui/Image/icon/huxu002", + "ui/Image/icon/huxu003", + "ui/Image/icon/huxu004", + "ui/Image/icon/huxu005", + "ui/Image/icon/huxu006", + "ui/Image/icon/huxu007", + "ui/Image/icon/huxu008", + "ui/Image/icon/huxu009", + "ui/Image/icon/huxu010", + "ui/Image/icon/huxu011", + "ui/Image/icon/huxu012", + "ui/Image/icon/huzi01", + "ui/Image/icon/ingot01", + "ui/Image/icon/ingot02", + "ui/Image/icon/ingot04", + "ui/Image/icon/ingot05", + "ui/Image/icon/ingot06", + "ui/Image/icon/JD_14_3_31_1", + "ui/Image/icon/JD_14_3_31_2", + "ui/Image/icon/JD_14_3_31_3", + "ui/Image/icon/JD_14_3_31_4", + "ui/Image/icon/JD_14_3_31_5", + "ui/Image/icon/JD_14_3_31_6", + "ui/Image/icon/JD_14_3_31_7", + "ui/Image/icon/JD_14_3_31_8", + "ui/Image/icon/JD_14_3_31_9", + "ui/Image/icon/jiantou04", + "ui/Image/icon/jiantou05", + "ui/Image/icon/jiantou06", + "ui/Image/icon/jiantou_xia1", + "ui/Image/icon/jiantou_xia2", + "ui/Image/icon/jieriqixi01", + "ui/Image/icon/jieri_01", + "ui/Image/icon/jieri_02", + "ui/Image/icon/jieri_03", + "ui/Image/icon/jieri_04", + "ui/Image/icon/jieri_05", + "ui/Image/icon/jieri_06", + "ui/Image/icon/jieri_07", + "ui/Image/icon/jieri_chunjie_01", + "ui/Image/icon/jieri_chunjie_02", + "ui/Image/icon/jieri_chunjie_03", + "ui/Image/icon/jiguantiejia", + "ui/Image/icon/jihuoma_01", + "ui/Image/icon/jion_01", + "ui/Image/icon/jion_0101", + "ui/Image/icon/jion_02", + "ui/Image/icon/jion_03", + "ui/Image/icon/jion_04", + "ui/Image/icon/jion_05", + "ui/Image/icon/jion_06", + "ui/Image/icon/jion_07", + "ui/Image/icon/jion_08", + "ui/Image/icon/jion_10", + "ui/Image/icon/join_09", + "ui/Image/icon/KaishanKnife01", + "ui/Image/icon/KaishanKnife02", + "ui/Image/icon/KaishanKnife03", + "ui/Image/icon/KaishanKnife04", + "ui/Image/icon/KaishanKnife05", + "ui/Image/icon/KaishanKnife06", + "ui/Image/icon/KaishanKnife07", + "ui/Image/icon/KaishanKnife08", + "ui/Image/icon/KaishanKnife09", + "ui/Image/icon/KaishanKnife10", + "ui/Image/icon/KaishanKnife11", + "ui/Image/icon/KaishanKnife12", + "ui/Image/icon/KaishanKnife13", + "ui/Image/icon/KaishanKnife14", + "ui/Image/icon/KaishanKnife15", + "ui/Image/icon/KaishanKnife16", + "ui/Image/icon/KaishanKnife17", + "ui/Image/icon/KaishanKnife18", + "ui/Image/icon/KaishanKnife19", + "ui/Image/icon/KaishanKnife20", + "ui/Image/icon/KaishanKnife21", + "ui/Image/icon/KaishanKnife22", + "ui/Image/icon/KaishanKnife23", + "ui/Image/icon/KaishanKnife24", + "ui/Image/icon/KaishanKnife25", + "ui/Image/icon/KaishanKnife26", + "ui/Image/icon/KaishanKnife27", + "ui/Image/icon/KaishanKnife28", + "ui/Image/icon/KaishanKnife29", + "ui/Image/icon/KaishanKnife30", + "ui/Image/icon/KaishanKnife31", + "ui/Image/icon/KaishanKnife32", + "ui/Image/icon/KaishanKnife33", + "ui/Image/icon/KaishanKnife34", + "ui/Image/icon/KaishanKnife35", + "ui/Image/icon/KaishanKnife36", + "ui/Image/icon/KaishanKnife37", + "ui/Image/icon/KaishanKnife38", + "ui/Image/icon/KaishanKnife39", + "ui/Image/icon/KaishanKnife40", + "ui/Image/icon/KaishanKnife41", + "ui/Image/icon/KaishanKnife42", + "ui/Image/icon/KaishanKnife43", + "ui/Image/icon/KaishanKnife44", + "ui/Image/icon/KaishanKnife45", + "ui/Image/icon/KaishanKnife46", + "ui/Image/icon/KaishanKnife47", + "ui/Image/icon/KaishanKnife48", + "ui/Image/icon/key_jin", + "ui/Image/icon/key_tie", + "ui/Image/icon/key_tong", + "ui/Image/icon/key_xi", + "ui/Image/icon/key_yin", + "ui/Image/icon/kfcangjian", + "ui/Image/icon/kfchunyang", + "ui/Image/icon/kfjianghu", + "ui/Image/icon/kfmingjiao", + "ui/Image/icon/kfqixiu", + "ui/Image/icon/kfshaolin", + "ui/Image/icon/kftangmen", + "ui/Image/icon/kftiance", + "ui/Image/icon/kfwanhua", + "ui/Image/icon/kfwudu", + "ui/Image/icon/koudao_cangbaotu_2", + "ui/Image/icon/kuaimajiabian", + "ui/Image/icon/kun_01", + "ui/Image/icon/kun_02", + "ui/Image/icon/kun_03", + "ui/Image/icon/kun_04", + "ui/Image/icon/kun_05", + "ui/Image/icon/kun_06", + "ui/Image/icon/kun_07", + "ui/Image/icon/kun_08", + "ui/Image/icon/kun_09", + "ui/Image/icon/kun_10", + "ui/Image/icon/kun_11", + "ui/Image/icon/kun_12", + "ui/Image/icon/kun_13", + "ui/Image/icon/kun_14", + "ui/Image/icon/kun_15", + "ui/Image/icon/kun_16", + "ui/Image/icon/kun_17", + "ui/Image/icon/kun_18", + "ui/Image/icon/kun_19", + "ui/Image/icon/kun_20", + "ui/Image/icon/kun_21", + "ui/Image/icon/kun_22", + "ui/Image/icon/kun_23", + "ui/Image/icon/kun_24", + "ui/Image/icon/kun_25", + "ui/Image/icon/kun_26", + "ui/Image/icon/leather01", + "ui/Image/icon/leather02", + "ui/Image/icon/leather04", + "ui/Image/icon/leather05", + "ui/Image/icon/leather09", + "ui/Image/icon/leather11", + "ui/Image/icon/leatherNew01", + "ui/Image/icon/leatherNew02", + "ui/Image/icon/leatherNew03", + "ui/Image/icon/leatherNew04", + "ui/Image/icon/leatherNew05", + "ui/Image/icon/leatherNew06", + "ui/Image/icon/leatherNew07", + "ui/Image/icon/leatherNew08", + "ui/Image/icon/leatherNew09", + "ui/Image/icon/leatherNew10", + "ui/Image/icon/leatherNew11", + "ui/Image/icon/leatherNew12", + "ui/Image/icon/lianhuanwu05", + "ui/Image/icon/lianhuanwu19", + "ui/Image/icon/lianhuanwu36", + "ui/Image/icon/little_girl_icon", + "ui/Image/icon/M1_001", + "ui/Image/icon/M1_002", + "ui/Image/icon/M1_003", + "ui/Image/icon/M1_004", + "ui/Image/icon/M1_005", + "ui/Image/icon/M1_006", + "ui/Image/icon/M1_007", + "ui/Image/icon/M1_008", + "ui/Image/icon/M1_009", + "ui/Image/icon/M1_010", + "ui/Image/icon/M1_011", + "ui/Image/icon/M1_012", + "ui/Image/icon/M1_013", + "ui/Image/icon/M1_014", + "ui/Image/icon/M1_015", + "ui/Image/icon/M1_016", + "ui/Image/icon/M1_017", + "ui/Image/icon/M1_018", + "ui/Image/icon/M1_019", + "ui/Image/icon/M1_020", + "ui/Image/icon/M1_021", + "ui/Image/icon/M1_022", + "ui/Image/icon/M1_023", + "ui/Image/icon/M1_024", + "ui/Image/icon/M1_025", + "ui/Image/icon/M1_026", + "ui/Image/icon/M1_chuncai001", + "ui/Image/icon/M1_chuncai002", + "ui/Image/icon/M1_chuncai003", + "ui/Image/icon/M1_chuncai004", + "ui/Image/icon/M1_chuncai005", + "ui/Image/icon/M1_chuncai006", + "ui/Image/icon/M1_chuncai007", + "ui/Image/icon/M1_chuncai008", + "ui/Image/icon/M1_chuncai009", + "ui/Image/icon/M1_chuncai010", + "ui/Image/icon/M1_chuncai011", + "ui/Image/icon/M1_huxu001", + "ui/Image/icon/M1_huxu002", + "ui/Image/icon/M1_huxu003", + "ui/Image/icon/M1_huxu004", + "ui/Image/icon/M1_huxu007", + "ui/Image/icon/M1_huxu008", + "ui/Image/icon/M1_huxu012", + "ui/Image/icon/M1_huxu013", + "ui/Image/icon/M1_huxu014", + "ui/Image/icon/M1_jichu001", + "ui/Image/icon/M1_jichu002", + "ui/Image/icon/M1_jichu003", + "ui/Image/icon/M1_jichu004", + "ui/Image/icon/M1_meimao001", + "ui/Image/icon/M1_meimao002", + "ui/Image/icon/M1_meimao003", + "ui/Image/icon/M1_meimao004", + "ui/Image/icon/M1_meimao005", + "ui/Image/icon/M1_meimao006", + "ui/Image/icon/M1_meimao007", + "ui/Image/icon/M1_meimao008", + "ui/Image/icon/M1_meimao009", + "ui/Image/icon/M1_meimao010", + "ui/Image/icon/M1_meimao011", + "ui/Image/icon/M1_meimao012", + "ui/Image/icon/M1_meimao013", + "ui/Image/icon/M1_meimao014", + "ui/Image/icon/M1_meimao1", + "ui/Image/icon/M1_meimao2", + "ui/Image/icon/M1_meimao3", + "ui/Image/icon/M1_meimao4", + "ui/Image/icon/M1_meimao5", + "ui/Image/icon/M1_yanxian001", + "ui/Image/icon/M1_yanxian002", + "ui/Image/icon/M1_yanxian003", + "ui/Image/icon/M1_yanxian004", + "ui/Image/icon/M1_yanxian005", + "ui/Image/icon/M1_yanxian006", + "ui/Image/icon/M1_yanxian007", + "ui/Image/icon/M1_yanxian008", + "ui/Image/icon/M1_yanxian009", + "ui/Image/icon/M1_yanxian010", + "ui/Image/icon/M1_yanying001", + "ui/Image/icon/M1_yanying002", + "ui/Image/icon/M1_yanying003", + "ui/Image/icon/M1_yanying004", + "ui/Image/icon/M1_yanying005", + "ui/Image/icon/M1_yanying006", + "ui/Image/icon/M1_yanying007", + "ui/Image/icon/M1_yanying008", + "ui/Image/icon/M1_yanying009", + "ui/Image/icon/M1_yanying010", + "ui/Image/icon/M1_yanying011", + "ui/Image/icon/M2_001", + "ui/Image/icon/M2_002", + "ui/Image/icon/M2_003", + "ui/Image/icon/M2_004", + "ui/Image/icon/M2_005", + "ui/Image/icon/M2_006", + "ui/Image/icon/M2_007", + "ui/Image/icon/M2_008", + "ui/Image/icon/M2_009", + "ui/Image/icon/M2_010", + "ui/Image/icon/M2_011", + "ui/Image/icon/M2_012", + "ui/Image/icon/M2_013", + "ui/Image/icon/M2_014", + "ui/Image/icon/M2_015", + "ui/Image/icon/M2_016", + "ui/Image/icon/M2_017", + "ui/Image/icon/M2_018", + "ui/Image/icon/M2_019", + "ui/Image/icon/M2_020", + "ui/Image/icon/M2_021", + "ui/Image/icon/M2_022", + "ui/Image/icon/M2_023", + "ui/Image/icon/M2_024", + "ui/Image/icon/M2_025", + "ui/Image/icon/M2_026", + "ui/Image/icon/M2_chuncai001", + "ui/Image/icon/M2_chuncai002", + "ui/Image/icon/M2_chuncai003", + "ui/Image/icon/M2_chuncai004", + "ui/Image/icon/M2_chuncai005", + "ui/Image/icon/M2_chuncai006", + "ui/Image/icon/M2_chuncai007", + "ui/Image/icon/M2_chuncai008", + "ui/Image/icon/M2_chuncai009", + "ui/Image/icon/M2_chuncai010", + "ui/Image/icon/M2_chuncai011", + "ui/Image/icon/M2_chuncai012", + "ui/Image/icon/M2_Default", + "ui/Image/icon/M2_huxu001", + "ui/Image/icon/M2_huxu002", + "ui/Image/icon/M2_huxu003", + "ui/Image/icon/M2_huxu004", + "ui/Image/icon/M2_huxu005", + "ui/Image/icon/M2_huxu006", + "ui/Image/icon/M2_huxu007", + "ui/Image/icon/M2_huxu008", + "ui/Image/icon/M2_huxu009", + "ui/Image/icon/M2_huxu010", + "ui/Image/icon/M2_huxu011", + "ui/Image/icon/M2_huxu012", + "ui/Image/icon/M2_huxu13", + "ui/Image/icon/M2_huxu14", + "ui/Image/icon/M2_huxu15", + "ui/Image/icon/M2_huxu16", + "ui/Image/icon/M2_huxu17", + "ui/Image/icon/M2_jichu001", + "ui/Image/icon/M2_jichu002", + "ui/Image/icon/M2_jichu003", + "ui/Image/icon/M2_jichu004", + "ui/Image/icon/M2_jichu005", + "ui/Image/icon/M2_jichu006", + "ui/Image/icon/M2_meimao001", + "ui/Image/icon/M2_meimao002", + "ui/Image/icon/M2_meimao003", + "ui/Image/icon/M2_meimao004", + "ui/Image/icon/M2_meimao005", + "ui/Image/icon/M2_meimao006", + "ui/Image/icon/M2_meimao007", + "ui/Image/icon/M2_meimao008", + "ui/Image/icon/M2_meimao009", + "ui/Image/icon/M2_meimao010", + "ui/Image/icon/M2_meimao011", + "ui/Image/icon/M2_meimao012", + "ui/Image/icon/M2_meimao013", + "ui/Image/icon/M2_meimao1", + "ui/Image/icon/M2_meimao2", + "ui/Image/icon/M2_meimao3", + "ui/Image/icon/M2_meimao4", + "ui/Image/icon/M2_meimao5", + "ui/Image/icon/M2_tongkong001", + "ui/Image/icon/M2_tongkong004", + "ui/Image/icon/M2_yanxian001", + "ui/Image/icon/M2_yanxian002", + "ui/Image/icon/M2_yanxian003", + "ui/Image/icon/M2_yanxian004", + "ui/Image/icon/M2_yanxian005", + "ui/Image/icon/M2_yanxian006", + "ui/Image/icon/M2_yanxian007", + "ui/Image/icon/M2_yanxian008", + "ui/Image/icon/M2_yanxian009", + "ui/Image/icon/M2_yanxian010", + "ui/Image/icon/M2_yanxian011", + "ui/Image/icon/M2_yanying001", + "ui/Image/icon/M2_yanying002", + "ui/Image/icon/M2_yanying003", + "ui/Image/icon/M2_yanying004", + "ui/Image/icon/M2_yanying005", + "ui/Image/icon/M2_yanying006", + "ui/Image/icon/M2_yanying007", + "ui/Image/icon/M2_yanying008", + "ui/Image/icon/M2_yanying009", + "ui/Image/icon/m4new01", + "ui/Image/icon/m4new02", + "ui/Image/icon/m4new03", + "ui/Image/icon/m4new04", + "ui/Image/icon/m4new05", + "ui/Image/icon/m4new06", + "ui/Image/icon/m4new07", + "ui/Image/icon/m4new08", + "ui/Image/icon/m4new09", + "ui/Image/icon/m4new10", + "ui/Image/icon/m4new11", + "ui/Image/icon/m4new12", + "ui/Image/icon/m4new13", + "ui/Image/icon/m4new14", + "ui/Image/icon/m4new15", + "ui/Image/icon/m4new16", + "ui/Image/icon/m4new17", + "ui/Image/icon/m5wanhua01", + "ui/Image/icon/m5wanhua02", + "ui/Image/icon/m5wanhua03", + "ui/Image/icon/m5wanhua04", + "ui/Image/icon/m5wanhua05", + "ui/Image/icon/m5wanhua06", + "ui/Image/icon/m5wanhua07", + "ui/Image/icon/m5wanhua08", + "ui/Image/icon/m5wanhua09", + "ui/Image/icon/m5wanhua10", + "ui/Image/icon/m5wanhua11", + "ui/Image/icon/m5wanhua12", + "ui/Image/icon/m5wanhua13", + "ui/Image/icon/m5wanhua14", + "ui/Image/icon/m5wanhua15", + "ui/Image/icon/m5wanhua16", + "ui/Image/icon/m5yangzhou01", + "ui/Image/icon/m5yangzhou02", + "ui/Image/icon/m5yangzhou03", + "ui/Image/icon/m5yangzhou04", + "ui/Image/icon/m5yangzhou05", + "ui/Image/icon/m5yangzhou06", + "ui/Image/icon/m5yangzhou07", + "ui/Image/icon/m5yangzhou08", + "ui/Image/icon/m5yangzhou09", + "ui/Image/icon/m5yangzhou10", + "ui/Image/icon/m5yangzhou11", + "ui/Image/icon/m5yangzhou12", + "ui/Image/icon/m5yangzhou13", + "ui/Image/icon/m5yangzhou14", + "ui/Image/icon/m5yangzhou15", + "ui/Image/icon/m6shaolin01", + "ui/Image/icon/m6shaolin02", + "ui/Image/icon/m6shaolin03", + "ui/Image/icon/m6shaolin04", + "ui/Image/icon/m6shaolin05", + "ui/Image/icon/m6shaolin06", + "ui/Image/icon/m6shaolin07", + "ui/Image/icon/m6shaolin08", + "ui/Image/icon/m6shaolin09", + "ui/Image/icon/m6shaolin10", + "ui/Image/icon/m6shaolin11", + "ui/Image/icon/m6shaolin12", + "ui/Image/icon/m6shaolin13", + "ui/Image/icon/m6shaolin14", + "ui/Image/icon/m8changan01", + "ui/Image/icon/m8changan02", + "ui/Image/icon/m8changan03", + "ui/Image/icon/m8changan04", + "ui/Image/icon/m8changan05", + "ui/Image/icon/m8changan06", + "ui/Image/icon/m8changan07", + "ui/Image/icon/m8changan08", + "ui/Image/icon/m8qixiu01", + "ui/Image/icon/m8qixiu02", + "ui/Image/icon/m8qixiu03", + "ui/Image/icon/mail01", + "ui/Image/icon/mail02", + "ui/Image/icon/mail03", + "ui/Image/icon/mail04", + "ui/Image/icon/mapdrop06", + "ui/Image/icon/mapdrop07", + "ui/Image/icon/mapdrop14", + "ui/Image/icon/mapdrop15", + "ui/Image/icon/mashi_gu", + "ui/Image/icon/matouzhang", + "ui/Image/icon/meat01", + "ui/Image/icon/meat02", + "ui/Image/icon/meat03", + "ui/Image/icon/meat04", + "ui/Image/icon/meat07", + "ui/Image/icon/meat10", + "ui/Image/icon/meat13", + "ui/Image/icon/medic01", + "ui/Image/icon/medic02", + "ui/Image/icon/medic03", + "ui/Image/icon/medic04", + "ui/Image/icon/medic05", + "ui/Image/icon/medic06", + "ui/Image/icon/medic07", + "ui/Image/icon/medic08", + "ui/Image/icon/medic09", + "ui/Image/icon/medic10", + "ui/Image/icon/medic11", + "ui/Image/icon/medic12", + "ui/Image/icon/medic13", + "ui/Image/icon/medic14", + "ui/Image/icon/medic15", + "ui/Image/icon/medic16", + "ui/Image/icon/medic19", + "ui/Image/icon/medic21", + "ui/Image/icon/medic22", + "ui/Image/icon/medic24", + "ui/Image/icon/medic25", + "ui/Image/icon/medic26", + "ui/Image/icon/medic27", + "ui/Image/icon/medic28", + "ui/Image/icon/medic29", + "ui/Image/icon/medic30", + "ui/Image/icon/medic31", + "ui/Image/icon/medicNew01a", + "ui/Image/icon/medicNew01b", + "ui/Image/icon/medicNew01c", + "ui/Image/icon/medicNew01d", + "ui/Image/icon/medicNew02a", + "ui/Image/icon/medicNew02b", + "ui/Image/icon/medicNew02c", + "ui/Image/icon/medicNew02d", + "ui/Image/icon/medicNew03a", + "ui/Image/icon/medicNew03b", + "ui/Image/icon/medicNew03c", + "ui/Image/icon/medicNew03d", + "ui/Image/icon/medicNew04a", + "ui/Image/icon/medicNew04b", + "ui/Image/icon/medicNew04c", + "ui/Image/icon/medicNew04d", + "ui/Image/icon/medicNew05a", + "ui/Image/icon/medicNew05b", + "ui/Image/icon/medicNew05c", + "ui/Image/icon/medicNew05d", + "ui/Image/icon/medicNew06a", + "ui/Image/icon/medicNew06b", + "ui/Image/icon/medicNew06c", + "ui/Image/icon/medicNew06d", + "ui/Image/icon/medicNew07a", + "ui/Image/icon/medicNew07b", + "ui/Image/icon/medicNew07c", + "ui/Image/icon/medicNew07d", + "ui/Image/icon/medicNew08a", + "ui/Image/icon/medicNew08b", + "ui/Image/icon/medicNew08c", + "ui/Image/icon/medicNew08d", + "ui/Image/icon/medicNew09a", + "ui/Image/icon/medicNew09b", + "ui/Image/icon/medicNew09c", + "ui/Image/icon/medicNew09d", + "ui/Image/icon/medicNew10a", + "ui/Image/icon/medicNew10b", + "ui/Image/icon/medicNew10c", + "ui/Image/icon/medicNew10d", + "ui/Image/icon/medicNew11a", + "ui/Image/icon/medicNew11b", + "ui/Image/icon/medicNew11c", + "ui/Image/icon/medicNew11d", + "ui/Image/icon/medicNew12a", + "ui/Image/icon/medicNew12b", + "ui/Image/icon/medicNew12c", + "ui/Image/icon/medicNew12d", + "ui/Image/icon/medicNew13", + "ui/Image/icon/medicNew14", + "ui/Image/icon/medicNew15", + "ui/Image/icon/medic_craft01", + "ui/Image/icon/medic_craft02", + "ui/Image/icon/medic_craft03", + "ui/Image/icon/medic_craft04", + "ui/Image/icon/medic_craft05", + "ui/Image/icon/meigui", + "ui/Image/icon/mianjv01", + "ui/Image/icon/mianjv02", + "ui/Image/icon/mingjiao06", + "ui/Image/icon/mingjiao_chengrennan", + "ui/Image/icon/mingjiao_chengrennv", + "ui/Image/icon/mingjiao_luoli", + "ui/Image/icon/mingjiao_taolu_1", + "ui/Image/icon/mingjiao_taolu_2", + "ui/Image/icon/mingjiao_taolu_3", + "ui/Image/icon/mingjiao_taolu_4", + "ui/Image/icon/mingjiao_taolu_5", + "ui/Image/icon/mingjiao_taolu_6", + "ui/Image/icon/mingjiao_taolu_7", + "ui/Image/icon/mingjiao_taolu_8", + "ui/Image/icon/MRT_07_14_WHZT", + "ui/Image/icon/MRT_CAY_F1", + "ui/Image/icon/MRT_CAY_F2", + "ui/Image/icon/MRT_CAY_m1", + "ui/Image/icon/MRT_CAY_m2", + "ui/Image/icon/MRT_CY_m1", + "ui/Image/icon/naoren_1", + "ui/Image/icon/NormalGirl", + "ui/Image/icon/paomajiantou_Lift", + "ui/Image/icon/paomajiantou_Right", + "ui/Image/icon/paomajiantou_UP", + "ui/Image/icon/pic01", + "ui/Image/icon/potion01", + "ui/Image/icon/potion03", + "ui/Image/icon/potion04", + "ui/Image/icon/potion05", + "ui/Image/icon/potion07", + "ui/Image/icon/potion09", + "ui/Image/icon/potion12", + "ui/Image/icon/potion12_1", + "ui/Image/icon/potion12_2", + "ui/Image/icon/potion13", + "ui/Image/icon/potion28", + "ui/Image/icon/potion30", + "ui/Image/icon/potion32", + "ui/Image/icon/potion35", + "ui/Image/icon/potion37", + "ui/Image/icon/potion39", + "ui/Image/icon/potion41", + "ui/Image/icon/potion42", + "ui/Image/icon/potion48", + "ui/Image/icon/potion50", + "ui/Image/icon/potion54", + "ui/Image/icon/potion55", + "ui/Image/icon/PrettyGirl", + "ui/Image/icon/Puzzle_cy_01", + "ui/Image/icon/Puzzle_cy_02", + "ui/Image/icon/Puzzle_cy_03", + "ui/Image/icon/Puzzle_cy_04", + "ui/Image/icon/Puzzle_cy_05", + "ui/Image/icon/Puzzle_cy_06", + "ui/Image/icon/Puzzle_cy_07", + "ui/Image/icon/Puzzle_cy_08", + "ui/Image/icon/Puzzle_cy_09", + "ui/Image/icon/Puzzle_qx_01", + "ui/Image/icon/Puzzle_qx_02", + "ui/Image/icon/Puzzle_qx_03", + "ui/Image/icon/Puzzle_qx_04", + "ui/Image/icon/Puzzle_qx_05", + "ui/Image/icon/Puzzle_qx_06", + "ui/Image/icon/Puzzle_qx_07", + "ui/Image/icon/Puzzle_qx_08", + "ui/Image/icon/Puzzle_qx_09", + "ui/Image/icon/qifu_lazhu01", + "ui/Image/icon/qifu_lazhu02", + "ui/Image/icon/qingminglihuazhi", + "ui/Image/icon/qita01", + "ui/Image/icon/qita06", + "ui/Image/icon/qixiu04", + "ui/Image/icon/qixiu07", + "ui/Image/icon/qixiu09", + "ui/Image/icon/qixiu_book_1", + "ui/Image/icon/qixiu_book_2", + "ui/Image/icon/qixiu_book_3", + "ui/Image/icon/qixiu_book_4", + "ui/Image/icon/qixiu_book_5", + "ui/Image/icon/qixiu_shuliandu_1", + "ui/Image/icon/qixiu_shuliandu_2", + "ui/Image/icon/qixiu_shuliandu_3", + "ui/Image/icon/QuestItem", + "ui/Image/icon/QuestPuzzle01", + "ui/Image/icon/QuestPuzzle02", + "ui/Image/icon/QuestPuzzle03", + "ui/Image/icon/QuestPuzzle04", + "ui/Image/icon/QuestPuzzle05", + "ui/Image/icon/QuestPuzzle06", + "ui/Image/icon/QuestPuzzle07", + "ui/Image/icon/QuestPuzzle08", + "ui/Image/icon/QuestPuzzle09", + "ui/Image/icon/QuestPuzzle10", + "ui/Image/icon/QuestQixiuMenpai", + "ui/Image/icon/questwanhua160_1", + "ui/Image/icon/questwanhua160_2", + "ui/Image/icon/questwanhua160_3", + "ui/Image/icon/questwanhua172_1", + "ui/Image/icon/questwanhua172_2", + "ui/Image/icon/questwanhua172_3", + "ui/Image/icon/questwanhua172_4", + "ui/Image/icon/questwanhua172_5", + "ui/Image/icon/questwanhua172_6", + "ui/Image/icon/questwanhua172_7", + "ui/Image/icon/quest_7201", + "ui/Image/icon/quest_7202", + "ui/Image/icon/quest_7203", + "ui/Image/icon/quest_7204", + "ui/Image/icon/quest_7205", + "ui/Image/icon/quest_7206", + "ui/Image/icon/quest_7207", + "ui/Image/icon/quest_7208", + "ui/Image/icon/quest_7209", + "ui/Image/icon/quest_7210", + "ui/Image/icon/quest_7211", + "ui/Image/icon/quest_7212", + "ui/Image/icon/quest_7213", + "ui/Image/icon/quest_7214", + "ui/Image/icon/quest_7215", + "ui/Image/icon/quest_7216", + "ui/Image/icon/quest_7217", + "ui/Image/icon/quest_chengbutang_1", + "ui/Image/icon/quest_chengbutang_2", + "ui/Image/icon/quest_chengbutang_3", + "ui/Image/icon/quest_chengbutang_4", + "ui/Image/icon/quest_chengbutang_5", + "ui/Image/icon/quest_chengbutang_6", + "ui/Image/icon/quest_chengbutang_7", + "ui/Image/icon/quest_chunyang612_1", + "ui/Image/icon/quest_chunyang612_2", + "ui/Image/icon/quest_cloth04", + "ui/Image/icon/quest_cookspecial02", + "ui/Image/icon/quest_cookspecial03", + "ui/Image/icon/quest_cookspecial04", + "ui/Image/icon/quest_cookspecial05", + "ui/Image/icon/quest_jingmaitu", + "ui/Image/icon/quest_jinshui_chengbutang", + "ui/Image/icon/quest_jinshui_huzuo", + "ui/Image/icon/quest_jinshui_linbaixuan", + "ui/Image/icon/quest_jinshui_lituhu", + "ui/Image/icon/quest_jinshui_luoxuan", + "ui/Image/icon/quest_jinshui_wangshi", + "ui/Image/icon/quest_jinshui_wuhui", + "ui/Image/icon/quest_jinshui_xiaojiaohua", + "ui/Image/icon/quest_jinshui_xiuru", + "ui/Image/icon/quest_jinshui_yanxiaoxia", + "ui/Image/icon/quest_jinshui_zhangtuhu", + "ui/Image/icon/quest_longmen_jiguan1", + "ui/Image/icon/quest_longmen_jiguan2", + "ui/Image/icon/quest_longmen_jiguan3", + "ui/Image/icon/quest_longmen_jiguan4", + "ui/Image/icon/quest_longmen_jiguan5", + "ui/Image/icon/quest_longmen_jiguan5_kick", + "ui/Image/icon/quest_longmen_sha_bai", + "ui/Image/icon/quest_longmen_sha_hei", + "ui/Image/icon/quest_longmen_sha_hong", + "ui/Image/icon/quest_longmen_sha_huang", + "ui/Image/icon/quest_longmen_sha_lan", + "ui/Image/icon/quest_longmen_sha_wuse", + "ui/Image/icon/quest_longmen_shudu_baihu", + "ui/Image/icon/quest_longmen_shudu_bg", + "ui/Image/icon/quest_longmen_shudu_check", + "ui/Image/icon/quest_longmen_shudu_p11", + "ui/Image/icon/quest_longmen_shudu_p13", + "ui/Image/icon/quest_longmen_shudu_p21", + "ui/Image/icon/quest_longmen_shudu_p23", + "ui/Image/icon/quest_longmen_shudu_p31", + "ui/Image/icon/quest_longmen_shudu_p33", + "ui/Image/icon/quest_longmen_shudu_p41", + "ui/Image/icon/quest_longmen_shudu_p43", + "ui/Image/icon/quest_longmen_shudu_qinglong", + "ui/Image/icon/quest_longmen_shudu_xuanwu", + "ui/Image/icon/quest_longmen_shudu_zhuque", + "ui/Image/icon/Quest_qipan", + "ui/Image/icon/Quest_qipan_blue", + "ui/Image/icon/Quest_qipan_red", + "ui/Image/icon/quest_yxtzf_controlall", + "ui/Image/icon/QW_0414_01", + "ui/Image/icon/readingStuff01", + "ui/Image/icon/readingStuff02", + "ui/Image/icon/readingStuff03", + "ui/Image/icon/readingStuff04", + "ui/Image/icon/readingStuff05", + "ui/Image/icon/readingStuff06", + "ui/Image/icon/readingStuff07", + "ui/Image/icon/readingStuff08", + "ui/Image/icon/reading_01", + "ui/Image/icon/reading_02", + "ui/Image/icon/reading_03", + "ui/Image/icon/reading_04", + "ui/Image/icon/reading_05", + "ui/Image/icon/reading_06", + "ui/Image/icon/reading_07", + "ui/Image/icon/reading_08", + "ui/Image/icon/reading_09", + "ui/Image/icon/reading_10", + "ui/Image/icon/reading_11", + "ui/Image/icon/reading_12", + "ui/Image/icon/reading_13", + "ui/Image/icon/reading_14", + "ui/Image/icon/reading_15", + "ui/Image/icon/reading_16", + "ui/Image/icon/reading_17", + "ui/Image/icon/reading_18", + "ui/Image/icon/reading_19", + "ui/Image/icon/reading_20", + "ui/Image/icon/reading_21", + "ui/Image/icon/reading_22", + "ui/Image/icon/reading_23", + "ui/Image/icon/reading_24", + "ui/Image/icon/reading_25", + "ui/Image/icon/reading_26", + "ui/Image/icon/reading_27", + "ui/Image/icon/reading_28", + "ui/Image/icon/reading_29", + "ui/Image/icon/reading_30", + "ui/Image/icon/reading_31", + "ui/Image/icon/reading_32", + "ui/Image/icon/reading_33", + "ui/Image/icon/reading_34", + "ui/Image/icon/reading_35", + "ui/Image/icon/reading_36", + "ui/Image/icon/reading_37", + "ui/Image/icon/reading_38", + "ui/Image/icon/recipe01", + "ui/Image/icon/recipe02", + "ui/Image/icon/recipe03", + "ui/Image/icon/recipebook04", + "ui/Image/icon/recipebook69", + "ui/Image/icon/recipebook70", + "ui/Image/icon/recipebook71", + "ui/Image/icon/Rec_cangjian_01", + "ui/Image/icon/Rec_cangjian_02", + "ui/Image/icon/Rec_cangjian_03", + "ui/Image/icon/Rec_cangjian_04", + "ui/Image/icon/Rec_cangjian_05", + "ui/Image/icon/Rec_cangjian_06", + "ui/Image/icon/Rec_cangjian_07", + "ui/Image/icon/Rec_cangjian_08", + "ui/Image/icon/Rec_cangjian_09", + "ui/Image/icon/Rec_cangjian_10", + "ui/Image/icon/Rec_cangjian_11", + "ui/Image/icon/Rec_cangyun_01", + "ui/Image/icon/Rec_cangyun_02", + "ui/Image/icon/Rec_cangyun_03", + "ui/Image/icon/Rec_cangyun_04", + "ui/Image/icon/Rec_cangyun_05", + "ui/Image/icon/Rec_cangyun_06", + "ui/Image/icon/Rec_cangyun_07", + "ui/Image/icon/Rec_cangyun_08", + "ui/Image/icon/Rec_cangyun_09", + "ui/Image/icon/Rec_cangyun_10", + "ui/Image/icon/Rec_cangyun_11", + "ui/Image/icon/Rec_chunyang_01", + "ui/Image/icon/Rec_chunyang_02", + "ui/Image/icon/Rec_chunyang_03", + "ui/Image/icon/Rec_chunyang_04", + "ui/Image/icon/Rec_chunyang_05", + "ui/Image/icon/Rec_chunyang_06", + "ui/Image/icon/Rec_chunyang_07", + "ui/Image/icon/Rec_chunyang_08", + "ui/Image/icon/Rec_chunyang_09", + "ui/Image/icon/Rec_chunyang_10", + "ui/Image/icon/Rec_chunyang_11", + "ui/Image/icon/Rec_chunyang_Item_01", + "ui/Image/icon/Rec_chunyang_Item_02", + "ui/Image/icon/Rec_chunyang_Item_03", + "ui/Image/icon/Rec_chunyang_Skill_01", + "ui/Image/icon/Rec_chunyang_Skill_02", + "ui/Image/icon/Rec_chunyang_Skill_03", + "ui/Image/icon/Rec_GB_01", + "ui/Image/icon/Rec_GB_02", + "ui/Image/icon/Rec_GB_03", + "ui/Image/icon/Rec_GB_04", + "ui/Image/icon/Rec_GB_05", + "ui/Image/icon/Rec_GB_06", + "ui/Image/icon/Rec_GB_07", + "ui/Image/icon/Rec_GB_08", + "ui/Image/icon/Rec_GB_09", + "ui/Image/icon/Rec_GB_10", + "ui/Image/icon/Rec_GB_11", + "ui/Image/icon/Rec_jianghu_01", + "ui/Image/icon/Rec_jianghu_02", + "ui/Image/icon/Rec_jianghu_03", + "ui/Image/icon/Rec_jianghu_04", + "ui/Image/icon/Rec_jianghu_05", + "ui/Image/icon/Rec_jianghu_06", + "ui/Image/icon/Rec_jianghu_07", + "ui/Image/icon/Rec_jianghu_08", + "ui/Image/icon/Rec_jianghu_09", + "ui/Image/icon/Rec_jianghu_10", + "ui/Image/icon/Rec_jianghu_11", + "ui/Image/icon/Rec_jianghu_Item_01", + "ui/Image/icon/Rec_jianghu_Item_02", + "ui/Image/icon/Rec_jianghu_Item_03", + "ui/Image/icon/Rec_jianghu_Skill_01", + "ui/Image/icon/Rec_jianghu_Skill_02", + "ui/Image/icon/Rec_jianghu_Skill_03", + "ui/Image/icon/Rec_mingjiao_01", + "ui/Image/icon/Rec_mingjiao_02", + "ui/Image/icon/Rec_mingjiao_03", + "ui/Image/icon/Rec_mingjiao_04", + "ui/Image/icon/Rec_mingjiao_05", + "ui/Image/icon/Rec_mingjiao_06", + "ui/Image/icon/Rec_mingjiao_07", + "ui/Image/icon/Rec_mingjiao_08", + "ui/Image/icon/Rec_mingjiao_09", + "ui/Image/icon/Rec_mingjiao_10", + "ui/Image/icon/Rec_mingjiao_11", + "ui/Image/icon/Rec_qixiu_01", + "ui/Image/icon/Rec_qixiu_02", + "ui/Image/icon/Rec_qixiu_03", + "ui/Image/icon/Rec_qixiu_04", + "ui/Image/icon/Rec_qixiu_05", + "ui/Image/icon/Rec_qixiu_06", + "ui/Image/icon/Rec_qixiu_07", + "ui/Image/icon/Rec_qixiu_08", + "ui/Image/icon/Rec_qixiu_09", + "ui/Image/icon/Rec_qixiu_10", + "ui/Image/icon/Rec_qixiu_11", + "ui/Image/icon/Rec_qixiu_Item_01", + "ui/Image/icon/Rec_qixiu_Item_02", + "ui/Image/icon/Rec_qixiu_Item_03", + "ui/Image/icon/Rec_qixiu_Skill_01", + "ui/Image/icon/Rec_qixiu_Skill_02", + "ui/Image/icon/Rec_qixiu_Skill_03", + "ui/Image/icon/Rec_shaolin_01", + "ui/Image/icon/Rec_shaolin_02", + "ui/Image/icon/Rec_shaolin_03", + "ui/Image/icon/Rec_shaolin_04", + "ui/Image/icon/Rec_shaolin_05", + "ui/Image/icon/Rec_shaolin_06", + "ui/Image/icon/Rec_shaolin_07", + "ui/Image/icon/Rec_shaolin_08", + "ui/Image/icon/Rec_shaolin_09", + "ui/Image/icon/Rec_shaolin_10", + "ui/Image/icon/Rec_shaolin_11", + "ui/Image/icon/Rec_shaolin_Item_01", + "ui/Image/icon/Rec_shaolin_Item_02", + "ui/Image/icon/Rec_shaolin_Item_03", + "ui/Image/icon/Rec_shaolin_Skill_01", + "ui/Image/icon/Rec_shaolin_Skill_02", + "ui/Image/icon/Rec_shaolin_Skill_03", + "ui/Image/icon/Rec_tangm_01", + "ui/Image/icon/Rec_tangm_02", + "ui/Image/icon/Rec_tangm_03", + "ui/Image/icon/Rec_tangm_04", + "ui/Image/icon/Rec_tangm_05", + "ui/Image/icon/Rec_tangm_06", + "ui/Image/icon/Rec_tangm_07", + "ui/Image/icon/Rec_tangm_08", + "ui/Image/icon/Rec_tangm_09", + "ui/Image/icon/Rec_tangm_10", + "ui/Image/icon/Rec_tangm_11", + "ui/Image/icon/Rec_tiance_01", + "ui/Image/icon/Rec_tiance_02", + "ui/Image/icon/Rec_tiance_03", + "ui/Image/icon/Rec_tiance_04", + "ui/Image/icon/Rec_tiance_05", + "ui/Image/icon/Rec_tiance_06", + "ui/Image/icon/Rec_tiance_07", + "ui/Image/icon/Rec_tiance_08", + "ui/Image/icon/Rec_tiance_09", + "ui/Image/icon/Rec_tiance_10", + "ui/Image/icon/Rec_tiance_11", + "ui/Image/icon/Rec_tiance_Item_01", + "ui/Image/icon/Rec_tiance_Item_02", + "ui/Image/icon/Rec_tiance_Item_03", + "ui/Image/icon/Rec_tiance_Skill_01", + "ui/Image/icon/Rec_tiance_Skill_02", + "ui/Image/icon/Rec_tiance_Skill_03", + "ui/Image/icon/Rec_wanhua_01", + "ui/Image/icon/Rec_wanhua_02", + "ui/Image/icon/Rec_wanhua_03", + "ui/Image/icon/Rec_wanhua_04", + "ui/Image/icon/Rec_wanhua_05", + "ui/Image/icon/Rec_wanhua_06", + "ui/Image/icon/Rec_wanhua_07", + "ui/Image/icon/Rec_wanhua_08", + "ui/Image/icon/Rec_wanhua_09", + "ui/Image/icon/Rec_wanhua_10", + "ui/Image/icon/Rec_wanhua_11", + "ui/Image/icon/Rec_wanhua_Item_01", + "ui/Image/icon/Rec_wanhua_Item_02", + "ui/Image/icon/Rec_wanhua_Item_03", + "ui/Image/icon/Rec_wanhua_Skill_01", + "ui/Image/icon/Rec_wanhua_Skill_02", + "ui/Image/icon/Rec_wanhua_Skill_03", + "ui/Image/icon/Rec_wudu_01", + "ui/Image/icon/Rec_wudu_02", + "ui/Image/icon/Rec_wudu_03", + "ui/Image/icon/Rec_wudu_04", + "ui/Image/icon/Rec_wudu_05", + "ui/Image/icon/Rec_wudu_06", + "ui/Image/icon/Rec_wudu_07", + "ui/Image/icon/Rec_wudu_08", + "ui/Image/icon/Rec_wudu_09", + "ui/Image/icon/Rec_wudu_10", + "ui/Image/icon/Rec_wudu_11", + "ui/Image/icon/renwu_01", + "ui/Image/icon/renwu_02", + "ui/Image/icon/renwu_03", + "ui/Image/icon/renwu_04", + "ui/Image/icon/renwu_05", + "ui/Image/icon/renwu_06", + "ui/Image/icon/reputation_01", + "ui/Image/icon/reputation_02", + "ui/Image/icon/reputation_03", + "ui/Image/icon/reputation_04", + "ui/Image/icon/rl_bg", + "ui/Image/icon/rl_j", + "ui/Image/icon/rl_jbyw", + "ui/Image/icon/rl_mjb", + "ui/Image/icon/rl_ww", + "ui/Image/icon/rl_xyz", + "ui/Image/icon/rl_zjjf", + "ui/Image/icon/Sc_chunyang01", + "ui/Image/icon/Sc_chunyang02", + "ui/Image/icon/Sc_chunyang03", + "ui/Image/icon/Sc_chunyang04", + "ui/Image/icon/Sc_chunyang05", + "ui/Image/icon/Sc_chunyang06", + "ui/Image/icon/Sc_chunyang07", + "ui/Image/icon/Sc_chunyang08", + "ui/Image/icon/Sc_koudao01", + "ui/Image/icon/Sc_koudao02", + "ui/Image/icon/Sc_koudao03", + "ui/Image/icon/Sc_luodao01", + "ui/Image/icon/Sc_luodao02", + "ui/Image/icon/Sc_luodao03", + "ui/Image/icon/Sc_luodao04", + "ui/Image/icon/Sc_luodao05", + "ui/Image/icon/Sc_luodao06", + "ui/Image/icon/Sc_luodao07", + "ui/Image/icon/Sc_luodao08", + "ui/Image/icon/Sc_luodao09", + "ui/Image/icon/Sc_luodao10", + "ui/Image/icon/Sc_luodao11", + "ui/Image/icon/shangyangjian", + "ui/Image/icon/shaochongjian", + "ui/Image/icon/shaolin01", + "ui/Image/icon/shaolin05", + "ui/Image/icon/shaolin_book_1", + "ui/Image/icon/shaolin_book_2", + "ui/Image/icon/shaolin_book_3", + "ui/Image/icon/shaolin_book_4", + "ui/Image/icon/shaolin_book_5", + "ui/Image/icon/shaolin_shuliandu_1", + "ui/Image/icon/shaolin_shuliandu_2", + "ui/Image/icon/shaolin_shuliandu_3", + "ui/Image/icon/shaoshangjian", + "ui/Image/icon/shaozejian", + "ui/Image/icon/shaozi", + "ui/Image/icon/shenghuo", + "ui/Image/icon/shirupozhu", + "ui/Image/icon/SHJN_07_14_01", + "ui/Image/icon/SHJN_07_14_02", + "ui/Image/icon/SHJN_07_14_03", + "ui/Image/icon/SHJN_07_14_04", + "ui/Image/icon/SHJN_07_14_05", + "ui/Image/icon/SHJN_07_14_06", + "ui/Image/icon/SHJN_07_14_07", + "ui/Image/icon/SHJN_07_14_08", + "ui/Image/icon/SHJN_07_14_09", + "ui/Image/icon/SHJN_07_14_10", + "ui/Image/icon/SHJN_07_14_11", + "ui/Image/icon/SHJN_07_14_12", + "ui/Image/icon/SHJN_07_14_13", + "ui/Image/icon/SHJN_07_14_14", + "ui/Image/icon/SHJN_07_14_15", + "ui/Image/icon/SHJN_07_14_16", + "ui/Image/icon/SHJN_07_14_17", + "ui/Image/icon/SHJN_07_14_18", + "ui/Image/icon/SHJN_07_14_19", + "ui/Image/icon/SHJN_07_14_20", + "ui/Image/icon/SHJN_07_14_21", + "ui/Image/icon/SHJN_07_14_22", + "ui/Image/icon/SHJN_07_14_23", + "ui/Image/icon/SHJN_07_14_24", + "ui/Image/icon/SHJN_07_14_25", + "ui/Image/icon/SHJN_07_14_26", + "ui/Image/icon/SHJN_07_14_27", + "ui/Image/icon/SHJN_07_14_28", + "ui/Image/icon/SHJN_07_14_29", + "ui/Image/icon/SHJN_07_14_30", + "ui/Image/icon/SHJN_07_14_31", + "ui/Image/icon/SHJN_07_14_32", + "ui/Image/icon/SHJN_07_14_33", + "ui/Image/icon/SHJN_07_14_34", + "ui/Image/icon/SHJN_07_14_35", + "ui/Image/icon/SHJN_07_14_36", + "ui/Image/icon/SHJN_07_14_37", + "ui/Image/icon/SHJN_07_14_38", + "ui/Image/icon/SHJN_07_14_39", + "ui/Image/icon/SHJN_07_14_40", + "ui/Image/icon/SHJN_07_14_41", + "ui/Image/icon/SHJN_07_14_42", + "ui/Image/icon/SHJN_07_14_43", + "ui/Image/icon/SHJN_07_14_44", + "ui/Image/icon/SHJN_07_14_45", + "ui/Image/icon/SHJN_07_14_46", + "ui/Image/icon/SHJN_07_14_47", + "ui/Image/icon/SHJN_07_14_48", + "ui/Image/icon/SHJN_07_14_49", + "ui/Image/icon/SHJN_07_14_50", + "ui/Image/icon/SHJN_07_14_51", + "ui/Image/icon/SHJN_07_14_52", + "ui/Image/icon/SHJN_07_14_53", + "ui/Image/icon/SHJN_07_14_54", + "ui/Image/icon/SHJN_07_14_55", + "ui/Image/icon/SHJN_07_14_56", + "ui/Image/icon/SHJN_07_14_57", + "ui/Image/icon/SHJN_07_14_58", + "ui/Image/icon/SHJN_07_14_59", + "ui/Image/icon/SHJN_07_14_60", + "ui/Image/icon/SHJN_07_14_61", + "ui/Image/icon/SHJN_07_14_62", + "ui/Image/icon/SHJN_07_14_63", + "ui/Image/icon/SHJN_07_14_64", + "ui/Image/icon/SHJN_07_14_65", + "ui/Image/icon/SHJN_07_14_66", + "ui/Image/icon/SHJN_07_14_67", + "ui/Image/icon/SHJN_07_14_68", + "ui/Image/icon/SHJN_07_14_69", + "ui/Image/icon/SHJN_07_14_70", + "ui/Image/icon/SHJN_07_14_71", + "ui/Image/icon/SHJN_07_14_72", + "ui/Image/icon/SHJN_07_14_73", + "ui/Image/icon/SHJN_07_14_74", + "ui/Image/icon/SHJN_07_14_75", + "ui/Image/icon/SHJN_07_14_76", + "ui/Image/icon/SHJN_07_14_77", + "ui/Image/icon/SHJN_07_14_78", + "ui/Image/icon/SHJN_07_14_79", + "ui/Image/icon/SHJN_07_14_80", + "ui/Image/icon/SHJN_07_14_81", + "ui/Image/icon/SHJN_07_14_82", + "ui/Image/icon/SHJN_07_14_83", + "ui/Image/icon/SHJN_07_14_84", + "ui/Image/icon/SHJN_07_14_85", + "ui/Image/icon/SHJN_07_14_86", + "ui/Image/icon/SHJN_07_14_87", + "ui/Image/icon/SHJN_07_14_88", + "ui/Image/icon/SHJN_07_14_89", + "ui/Image/icon/SHJN_07_14_90", + "ui/Image/icon/SHJN_07_14_91", + "ui/Image/icon/SHJN_07_14_92", + "ui/Image/icon/SHJN_07_14_93", + "ui/Image/icon/SHJN_07_14_94", + "ui/Image/icon/SHJN_07_14_95", + "ui/Image/icon/SHJN_07_14_96", + "ui/Image/icon/SHJN_07_14_97", + "ui/Image/icon/shjn_srtq", + "ui/Image/icon/shjn_xm", + "ui/Image/icon/shuiniu", + "ui/Image/icon/shuzhi", + "ui/Image/icon/skill_01", + "ui/Image/icon/skill_02", + "ui/Image/icon/skill_03", + "ui/Image/icon/skill_04", + "ui/Image/icon/skill_05", + "ui/Image/icon/skill_06", + "ui/Image/icon/skill_07", + "ui/Image/icon/skill_08", + "ui/Image/icon/skill_09", + "ui/Image/icon/skill_10", + "ui/Image/icon/skill_100", + "ui/Image/icon/skill_101", + "ui/Image/icon/skill_102", + "ui/Image/icon/skill_103", + "ui/Image/icon/skill_104", + "ui/Image/icon/skill_105", + "ui/Image/icon/skill_106", + "ui/Image/icon/skill_107", + "ui/Image/icon/skill_108", + "ui/Image/icon/skill_109", + "ui/Image/icon/skill_11", + "ui/Image/icon/skill_110", + "ui/Image/icon/skill_111", + "ui/Image/icon/skill_112", + "ui/Image/icon/skill_113", + "ui/Image/icon/skill_114", + "ui/Image/icon/skill_115", + "ui/Image/icon/skill_116", + "ui/Image/icon/skill_117", + "ui/Image/icon/skill_118", + "ui/Image/icon/skill_119", + "ui/Image/icon/skill_12", + "ui/Image/icon/skill_120", + "ui/Image/icon/skill_121", + "ui/Image/icon/skill_122", + "ui/Image/icon/skill_123", + "ui/Image/icon/skill_124", + "ui/Image/icon/skill_125", + "ui/Image/icon/skill_126", + "ui/Image/icon/skill_127", + "ui/Image/icon/skill_128", + "ui/Image/icon/skill_129", + "ui/Image/icon/skill_13", + "ui/Image/icon/skill_130", + "ui/Image/icon/skill_131", + "ui/Image/icon/skill_132", + "ui/Image/icon/skill_133", + "ui/Image/icon/skill_134", + "ui/Image/icon/skill_135", + "ui/Image/icon/skill_136", + "ui/Image/icon/skill_137", + "ui/Image/icon/skill_138", + "ui/Image/icon/skill_139", + "ui/Image/icon/skill_14", + "ui/Image/icon/skill_140", + "ui/Image/icon/skill_141", + "ui/Image/icon/skill_142", + "ui/Image/icon/skill_143", + "ui/Image/icon/skill_144", + "ui/Image/icon/skill_145", + "ui/Image/icon/skill_146", + "ui/Image/icon/skill_147", + "ui/Image/icon/skill_148", + "ui/Image/icon/skill_149", + "ui/Image/icon/skill_15", + "ui/Image/icon/skill_150", + "ui/Image/icon/skill_16", + "ui/Image/icon/skill_17", + "ui/Image/icon/skill_18", + "ui/Image/icon/skill_19", + "ui/Image/icon/skill_20", + "ui/Image/icon/skill_21", + "ui/Image/icon/skill_22", + "ui/Image/icon/skill_23", + "ui/Image/icon/skill_24", + "ui/Image/icon/skill_25", + "ui/Image/icon/skill_26", + "ui/Image/icon/skill_27", + "ui/Image/icon/skill_28", + "ui/Image/icon/skill_29", + "ui/Image/icon/skill_30", + "ui/Image/icon/skill_31", + "ui/Image/icon/skill_32", + "ui/Image/icon/skill_33", + "ui/Image/icon/skill_34", + "ui/Image/icon/skill_35", + "ui/Image/icon/skill_36", + "ui/Image/icon/skill_37", + "ui/Image/icon/skill_38", + "ui/Image/icon/skill_39", + "ui/Image/icon/skill_40", + "ui/Image/icon/skill_41", + "ui/Image/icon/skill_42", + "ui/Image/icon/skill_43", + "ui/Image/icon/skill_44", + "ui/Image/icon/skill_45", + "ui/Image/icon/skill_46", + "ui/Image/icon/skill_47", + "ui/Image/icon/skill_48", + "ui/Image/icon/skill_49", + "ui/Image/icon/skill_50", + "ui/Image/icon/skill_51", + "ui/Image/icon/skill_52", + "ui/Image/icon/skill_53", + "ui/Image/icon/skill_54", + "ui/Image/icon/skill_55", + "ui/Image/icon/skill_56", + "ui/Image/icon/skill_57", + "ui/Image/icon/skill_58", + "ui/Image/icon/skill_59", + "ui/Image/icon/skill_60", + "ui/Image/icon/skill_61", + "ui/Image/icon/skill_62", + "ui/Image/icon/skill_63", + "ui/Image/icon/skill_64", + "ui/Image/icon/skill_65", + "ui/Image/icon/skill_66", + "ui/Image/icon/skill_67", + "ui/Image/icon/skill_68", + "ui/Image/icon/skill_69", + "ui/Image/icon/skill_70", + "ui/Image/icon/skill_71", + "ui/Image/icon/skill_72", + "ui/Image/icon/skill_73", + "ui/Image/icon/skill_74", + "ui/Image/icon/skill_75", + "ui/Image/icon/skill_76", + "ui/Image/icon/skill_77", + "ui/Image/icon/skill_78", + "ui/Image/icon/skill_79", + "ui/Image/icon/skill_80", + "ui/Image/icon/skill_81", + "ui/Image/icon/skill_82", + "ui/Image/icon/skill_83", + "ui/Image/icon/skill_84", + "ui/Image/icon/skill_85", + "ui/Image/icon/skill_86", + "ui/Image/icon/skill_87", + "ui/Image/icon/skill_88", + "ui/Image/icon/skill_89", + "ui/Image/icon/skill_90", + "ui/Image/icon/skill_91", + "ui/Image/icon/skill_92", + "ui/Image/icon/skill_93", + "ui/Image/icon/skill_94", + "ui/Image/icon/skill_95", + "ui/Image/icon/skill_96", + "ui/Image/icon/skill_97", + "ui/Image/icon/skill_98", + "ui/Image/icon/skill_99", + "ui/Image/icon/Skill_CangY_01", + "ui/Image/icon/Skill_CangY_02", + "ui/Image/icon/Skill_CangY_03", + "ui/Image/icon/Skill_CangY_04", + "ui/Image/icon/Skill_CangY_05", + "ui/Image/icon/Skill_CangY_06", + "ui/Image/icon/Skill_CangY_07", + "ui/Image/icon/Skill_CangY_08", + "ui/Image/icon/Skill_CangY_09", + "ui/Image/icon/Skill_CangY_10", + "ui/Image/icon/Skill_CangY_100", + "ui/Image/icon/Skill_CangY_101", + "ui/Image/icon/Skill_CangY_102", + "ui/Image/icon/Skill_CangY_103", + "ui/Image/icon/Skill_CangY_11", + "ui/Image/icon/Skill_CangY_12", + "ui/Image/icon/Skill_CangY_13", + "ui/Image/icon/skill_cangy_135", + "ui/Image/icon/Skill_CangY_14", + "ui/Image/icon/Skill_CangY_15", + "ui/Image/icon/Skill_CangY_16", + "ui/Image/icon/Skill_CangY_17", + "ui/Image/icon/Skill_CangY_18", + "ui/Image/icon/Skill_CangY_19", + "ui/Image/icon/Skill_CangY_20", + "ui/Image/icon/Skill_CangY_21", + "ui/Image/icon/Skill_CangY_22", + "ui/Image/icon/Skill_CangY_23", + "ui/Image/icon/Skill_CangY_24", + "ui/Image/icon/Skill_CangY_25", + "ui/Image/icon/Skill_CangY_26", + "ui/Image/icon/Skill_CangY_27", + "ui/Image/icon/Skill_CangY_28", + "ui/Image/icon/Skill_CangY_29", + "ui/Image/icon/Skill_CangY_30", + "ui/Image/icon/Skill_CangY_31", + "ui/Image/icon/Skill_CangY_32", + "ui/Image/icon/Skill_CangY_33", + "ui/Image/icon/Skill_CangY_34", + "ui/Image/icon/Skill_CangY_35", + "ui/Image/icon/Skill_CangY_36", + "ui/Image/icon/Skill_CangY_37", + "ui/Image/icon/Skill_CangY_38", + "ui/Image/icon/Skill_CangY_39", + "ui/Image/icon/Skill_CangY_40", + "ui/Image/icon/Skill_CangY_41", + "ui/Image/icon/Skill_CangY_42", + "ui/Image/icon/Skill_CangY_43", + "ui/Image/icon/Skill_CangY_44", + "ui/Image/icon/Skill_CangY_45", + "ui/Image/icon/Skill_CangY_46", + "ui/Image/icon/Skill_CangY_47", + "ui/Image/icon/Skill_CangY_48", + "ui/Image/icon/Skill_CangY_49", + "ui/Image/icon/Skill_CangY_50", + "ui/Image/icon/Skill_CangY_51", + "ui/Image/icon/Skill_CangY_52", + "ui/Image/icon/Skill_CangY_53", + "ui/Image/icon/Skill_CangY_54", + "ui/Image/icon/Skill_CangY_55", + "ui/Image/icon/Skill_CangY_56", + "ui/Image/icon/Skill_CangY_57", + "ui/Image/icon/Skill_CangY_58", + "ui/Image/icon/Skill_CangY_59", + "ui/Image/icon/Skill_CangY_60", + "ui/Image/icon/Skill_CangY_61", + "ui/Image/icon/Skill_CangY_62", + "ui/Image/icon/Skill_CangY_63", + "ui/Image/icon/Skill_CangY_64", + "ui/Image/icon/Skill_CangY_65", + "ui/Image/icon/Skill_CangY_66", + "ui/Image/icon/Skill_CangY_67", + "ui/Image/icon/Skill_CangY_68", + "ui/Image/icon/Skill_CangY_69", + "ui/Image/icon/Skill_CangY_70", + "ui/Image/icon/Skill_CangY_71", + "ui/Image/icon/Skill_CangY_72", + "ui/Image/icon/Skill_CangY_73", + "ui/Image/icon/skill_cangy_74", + "ui/Image/icon/skill_cangy_75", + "ui/Image/icon/skill_cangy_76", + "ui/Image/icon/skill_cangy_77", + "ui/Image/icon/skill_cangy_78", + "ui/Image/icon/skill_cangy_79", + "ui/Image/icon/skill_cangy_80", + "ui/Image/icon/skill_cangy_81", + "ui/Image/icon/skill_cangy_82", + "ui/Image/icon/skill_cangy_83", + "ui/Image/icon/skill_cangy_84", + "ui/Image/icon/skill_cangy_85", + "ui/Image/icon/skill_cangy_86", + "ui/Image/icon/skill_cangy_87", + "ui/Image/icon/skill_cangy_88", + "ui/Image/icon/skill_cangy_89", + "ui/Image/icon/skill_cangy_90", + "ui/Image/icon/skill_cangy_91", + "ui/Image/icon/skill_cangy_92", + "ui/Image/icon/skill_cangy_93", + "ui/Image/icon/skill_cangy_94", + "ui/Image/icon/skill_cangy_95", + "ui/Image/icon/skill_cangy_96", + "ui/Image/icon/Skill_CangY_97", + "ui/Image/icon/Skill_CangY_98", + "ui/Image/icon/Skill_CangY_99", + "ui/Image/icon/skill_chongw", + "ui/Image/icon/skill_chunyang01", + "ui/Image/icon/skill_chunyang02", + "ui/Image/icon/skill_chunyang03", + "ui/Image/icon/skill_chunyang04", + "ui/Image/icon/skill_chunyang05", + "ui/Image/icon/skill_chunyang06", + "ui/Image/icon/skill_chunyang07", + "ui/Image/icon/skill_chunyang08", + "ui/Image/icon/skill_chunyang09", + "ui/Image/icon/skill_chunyang10", + "ui/Image/icon/skill_chunyang11", + "ui/Image/icon/skill_chunyang12", + "ui/Image/icon/skill_chunyang13", + "ui/Image/icon/skill_chunyang14", + "ui/Image/icon/skill_chunyang15", + "ui/Image/icon/skill_chunyang16", + "ui/Image/icon/skill_chunyang17", + "ui/Image/icon/skill_chunyang18", + "ui/Image/icon/skill_chunyang19", + "ui/Image/icon/skill_chunyang20", + "ui/Image/icon/skill_chunyang21", + "ui/Image/icon/skill_chunyang22", + "ui/Image/icon/skill_chunyang23", + "ui/Image/icon/skill_chunyang24", + "ui/Image/icon/skill_chunyang25", + "ui/Image/icon/skill_chunyang26", + "ui/Image/icon/skill_chunyang27", + "ui/Image/icon/skill_chunyang28", + "ui/Image/icon/skill_chunyang29", + "ui/Image/icon/skill_chunyang30", + "ui/Image/icon/skill_chunyang31", + "ui/Image/icon/skill_chunyang32", + "ui/Image/icon/skill_chunyang33", + "ui/Image/icon/skill_chunyang34", + "ui/Image/icon/skill_chunyang35", + "ui/Image/icon/skill_chunyang36", + "ui/Image/icon/skill_chunyang37", + "ui/Image/icon/skill_chunyang38", + "ui/Image/icon/skill_chunyang39", + "ui/Image/icon/skill_chunyang40", + "ui/Image/icon/skill_chunyang41", + "ui/Image/icon/skill_chunyang42", + "ui/Image/icon/skill_GB_01", + "ui/Image/icon/skill_GB_02", + "ui/Image/icon/skill_GB_03", + "ui/Image/icon/skill_GB_04", + "ui/Image/icon/skill_GB_05", + "ui/Image/icon/skill_GB_06", + "ui/Image/icon/skill_GB_07", + "ui/Image/icon/skill_GB_08", + "ui/Image/icon/skill_GB_09", + "ui/Image/icon/skill_GB_10", + "ui/Image/icon/skill_GB_11", + "ui/Image/icon/skill_GB_12", + "ui/Image/icon/skill_GB_13", + "ui/Image/icon/skill_GB_14", + "ui/Image/icon/skill_GB_15", + "ui/Image/icon/skill_GB_16", + "ui/Image/icon/skill_GB_17", + "ui/Image/icon/skill_GB_18", + "ui/Image/icon/skill_GB_19", + "ui/Image/icon/skill_GB_20", + "ui/Image/icon/skill_GB_21", + "ui/Image/icon/skill_GB_22", + "ui/Image/icon/skill_GB_23", + "ui/Image/icon/skill_GB_24", + "ui/Image/icon/skill_GB_25", + "ui/Image/icon/skill_GB_26", + "ui/Image/icon/skill_GB_27", + "ui/Image/icon/skill_GB_28", + "ui/Image/icon/skill_GB_29", + "ui/Image/icon/skill_GB_30", + "ui/Image/icon/skill_GB_31", + "ui/Image/icon/skill_GB_32", + "ui/Image/icon/skill_GB_33", + "ui/Image/icon/skill_GB_34", + "ui/Image/icon/skill_GB_35", + "ui/Image/icon/skill_GB_36", + "ui/Image/icon/skill_GB_37", + "ui/Image/icon/skill_GB_38", + "ui/Image/icon/skill_GB_39", + "ui/Image/icon/skill_GB_40", + "ui/Image/icon/skill_GB_41", + "ui/Image/icon/skill_GB_42", + "ui/Image/icon/skill_GB_43", + "ui/Image/icon/skill_GB_44", + "ui/Image/icon/skill_GB_45", + "ui/Image/icon/skill_GB_46", + "ui/Image/icon/skill_GB_47", + "ui/Image/icon/skill_GB_48", + "ui/Image/icon/skill_GB_49", + "ui/Image/icon/skill_GB_50", + "ui/Image/icon/skill_GB_51", + "ui/Image/icon/skill_GB_52", + "ui/Image/icon/skill_GB_53", + "ui/Image/icon/skill_GB_54", + "ui/Image/icon/skill_GB_55", + "ui/Image/icon/skill_GB_56", + "ui/Image/icon/skill_GB_57", + "ui/Image/icon/skill_GB_58", + "ui/Image/icon/skill_GB_59", + "ui/Image/icon/skill_GB_60", + "ui/Image/icon/skill_GB_61", + "ui/Image/icon/skill_GB_62", + "ui/Image/icon/skill_GB_63", + "ui/Image/icon/skill_GB_64", + "ui/Image/icon/skill_GB_65", + "ui/Image/icon/skill_GB_66", + "ui/Image/icon/skill_GB_67", + "ui/Image/icon/skill_GB_68", + "ui/Image/icon/skill_GB_69", + "ui/Image/icon/skill_jianghu01", + "ui/Image/icon/skill_jianghu02", + "ui/Image/icon/skill_jianghu03", + "ui/Image/icon/skill_jianghu04", + "ui/Image/icon/skill_jianghu05", + "ui/Image/icon/skill_jianghu06", + "ui/Image/icon/skill_jianghu07", + "ui/Image/icon/skill_jianghu08", + "ui/Image/icon/skill_jianghu09", + "ui/Image/icon/skill_jianghu10", + "ui/Image/icon/Skill_jianghu11", + "ui/Image/icon/skill_jianghu12", + "ui/Image/icon/Skill_jianghu13", + "ui/Image/icon/Skill_jianghu14", + "ui/Image/icon/Skill_jianghu15", + "ui/Image/icon/Skill_jianghu16", + "ui/Image/icon/Skill_jianghu17", + "ui/Image/icon/Skill_jianghu18", + "ui/Image/icon/Skill_jianghu19", + "ui/Image/icon/Skill_jianghu20", + "ui/Image/icon/Skill_jianghu21", + "ui/Image/icon/Skill_jianghu22", + "ui/Image/icon/Skill_jianghu23", + "ui/Image/icon/Skill_jianghu24", + "ui/Image/icon/Skill_jianghu25", + "ui/Image/icon/Skill_jianghu26", + "ui/Image/icon/Skill_jianghu27", + "ui/Image/icon/Skill_jianghu28", + "ui/Image/icon/Skill_jianghu29", + "ui/Image/icon/Skill_jianghu30", + "ui/Image/icon/Skill_jianghu31", + "ui/Image/icon/Skill_jianghu32", + "ui/Image/icon/Skill_jianghu33", + "ui/Image/icon/Skill_jianghu33_03", + "ui/Image/icon/Skill_jianghu33_05", + "ui/Image/icon/Skill_jianghu33_07", + "ui/Image/icon/skill_jianghu34", + "ui/Image/icon/skill_jianghu35", + "ui/Image/icon/skill_jianghu_anqigongji", + "ui/Image/icon/skill_jianghu_bigongji", + "ui/Image/icon/skill_jianghu_erduantiao", + "ui/Image/icon/skill_jianghu_erduantiao_04", + "ui/Image/icon/skill_jianghu_erduantiao_07", + "ui/Image/icon/skill_jianghu_erduantiao_10", + "ui/Image/icon/skill_jianghu_erduantiao_13", + "ui/Image/icon/skill_jianghu_gungongji", + "ui/Image/icon/skill_jianghu_jiangongji", + "ui/Image/icon/skill_jianghu_jichuanqi", + "ui/Image/icon/skill_jianghu_jichubifa", + "ui/Image/icon/skill_jianghu_jichugunfa", + "ui/Image/icon/skill_jianghu_jichujianfa", + "ui/Image/icon/skill_jianghu_jichuneigong", + "ui/Image/icon/skill_jianghu_jichuqiangfa", + "ui/Image/icon/skill_jianghu_jichuquanzhang", + "ui/Image/icon/skill_jianghu_jichushuangbing", + "ui/Image/icon/skill_jianghu_neigongdazuo", + "ui/Image/icon/skill_jianghu_qianggongji", + "ui/Image/icon/skill_jianghu_qinggong", + "ui/Image/icon/skill_jianghu_quanzhanggongji", + "ui/Image/icon/skill_jianghu_shuangbinggongji", + "ui/Image/icon/skill_jianghu_taolu_xinshou", + "ui/Image/icon/skill_mingjiao1", + "ui/Image/icon/skill_mingjiao10", + "ui/Image/icon/skill_mingjiao11", + "ui/Image/icon/skill_mingjiao12", + "ui/Image/icon/skill_mingjiao13", + "ui/Image/icon/skill_mingjiao14", + "ui/Image/icon/skill_mingjiao15", + "ui/Image/icon/skill_mingjiao16", + "ui/Image/icon/skill_mingjiao17", + "ui/Image/icon/skill_mingjiao18", + "ui/Image/icon/skill_mingjiao19", + "ui/Image/icon/skill_mingjiao2", + "ui/Image/icon/skill_mingjiao20", + "ui/Image/icon/skill_mingjiao21", + "ui/Image/icon/skill_mingjiao22", + "ui/Image/icon/skill_mingjiao23", + "ui/Image/icon/skill_mingjiao24", + "ui/Image/icon/skill_mingjiao25", + "ui/Image/icon/skill_mingjiao26", + "ui/Image/icon/skill_mingjiao27", + "ui/Image/icon/skill_mingjiao28", + "ui/Image/icon/skill_mingjiao29", + "ui/Image/icon/skill_mingjiao3", + "ui/Image/icon/skill_mingjiao30", + "ui/Image/icon/skill_mingjiao31", + "ui/Image/icon/skill_mingjiao32", + "ui/Image/icon/skill_mingjiao33", + "ui/Image/icon/skill_mingjiao34", + "ui/Image/icon/skill_mingjiao35", + "ui/Image/icon/skill_mingjiao36", + "ui/Image/icon/skill_mingjiao37", + "ui/Image/icon/skill_mingjiao38", + "ui/Image/icon/skill_mingjiao39", + "ui/Image/icon/skill_mingjiao4", + "ui/Image/icon/skill_mingjiao40", + "ui/Image/icon/skill_mingjiao41", + "ui/Image/icon/skill_mingjiao5", + "ui/Image/icon/skill_mingjiao6", + "ui/Image/icon/skill_mingjiao7", + "ui/Image/icon/skill_mingjiao8", + "ui/Image/icon/skill_mingjiao9", + "ui/Image/icon/skill_qg_01", + "ui/Image/icon/skill_qg_02", + "ui/Image/icon/skill_qg_03", + "ui/Image/icon/skill_qg_04", + "ui/Image/icon/skill_qg_05", + "ui/Image/icon/skill_qg_06", + "ui/Image/icon/skill_qg_07", + "ui/Image/icon/skill_qg_08", + "ui/Image/icon/skill_qg_09", + "ui/Image/icon/skill_qg_10", + "ui/Image/icon/skill_qixiu01", + "ui/Image/icon/skill_qixiu02", + "ui/Image/icon/skill_qixiu03", + "ui/Image/icon/skill_qixiu04", + "ui/Image/icon/skill_qixiu05", + "ui/Image/icon/skill_qixiu06", + "ui/Image/icon/skill_qixiu07", + "ui/Image/icon/skill_qixiu08", + "ui/Image/icon/skill_qixiu09", + "ui/Image/icon/skill_qixiu10", + "ui/Image/icon/skill_qixiu11", + "ui/Image/icon/skill_qixiu12", + "ui/Image/icon/skill_qixiu13", + "ui/Image/icon/skill_qixiu14", + "ui/Image/icon/skill_qixiu15", + "ui/Image/icon/skill_qixiu16", + "ui/Image/icon/skill_qixiu17", + "ui/Image/icon/skill_qixiu18", + "ui/Image/icon/skill_qixiu19", + "ui/Image/icon/skill_qixiu20", + "ui/Image/icon/skill_qixiu21", + "ui/Image/icon/skill_qixiu22", + "ui/Image/icon/skill_qixiu23", + "ui/Image/icon/skill_qixiu24", + "ui/Image/icon/skill_qixiu25", + "ui/Image/icon/skill_qixiu26", + "ui/Image/icon/skill_qixiu27", + "ui/Image/icon/skill_qixiu28", + "ui/Image/icon/skill_qixiu29", + "ui/Image/icon/skill_qixiu30", + "ui/Image/icon/skill_qixiu31", + "ui/Image/icon/skill_qixiu32", + "ui/Image/icon/skill_qixiu33", + "ui/Image/icon/skill_qixiu34", + "ui/Image/icon/skill_qixiu35", + "ui/Image/icon/skill_qixiu36", + "ui/Image/icon/skill_qixiu37", + "ui/Image/icon/skill_qixiu38", + "ui/Image/icon/skill_qixiu39", + "ui/Image/icon/skill_qixiu40", + "ui/Image/icon/skill_qixiu41", + "ui/Image/icon/skill_qixiu42", + "ui/Image/icon/skill_qixiu43", + "ui/Image/icon/skill_qixiu44", + "ui/Image/icon/skill_qixiu45", + "ui/Image/icon/skill_qixiu46", + "ui/Image/icon/skill_qx_sz", + "ui/Image/icon/skill_shaolin01", + "ui/Image/icon/skill_shaolin02", + "ui/Image/icon/skill_shaolin03", + "ui/Image/icon/skill_shaolin04", + "ui/Image/icon/skill_shaolin05", + "ui/Image/icon/skill_shaolin06", + "ui/Image/icon/skill_shaolin07", + "ui/Image/icon/skill_shaolin08", + "ui/Image/icon/skill_shaolin09", + "ui/Image/icon/skill_shaolin10", + "ui/Image/icon/skill_shaolin11", + "ui/Image/icon/skill_shaolin12", + "ui/Image/icon/skill_shaolin13", + "ui/Image/icon/skill_shaolin14", + "ui/Image/icon/skill_shaolin15", + "ui/Image/icon/skill_shaolin16", + "ui/Image/icon/skill_shaolin17", + "ui/Image/icon/skill_shaolin18", + "ui/Image/icon/skill_shaolin19", + "ui/Image/icon/skill_shaolin20", + "ui/Image/icon/skill_shaolin21", + "ui/Image/icon/skill_shaolin22", + "ui/Image/icon/skill_shaolin23", + "ui/Image/icon/skill_shaolin24", + "ui/Image/icon/skill_shaolin25", + "ui/Image/icon/skill_shaolin26", + "ui/Image/icon/skill_shaolin27", + "ui/Image/icon/skill_shaolin28", + "ui/Image/icon/skill_shaolin29", + "ui/Image/icon/skill_shaolin30", + "ui/Image/icon/skill_shaolin31", + "ui/Image/icon/skill_shaolin32", + "ui/Image/icon/skill_shaolin33", + "ui/Image/icon/skill_shaolin34", + "ui/Image/icon/skill_shaolin35", + "ui/Image/icon/skill_shaolin36", + "ui/Image/icon/skill_tangm_01", + "ui/Image/icon/skill_tangm_02", + "ui/Image/icon/skill_tangm_03", + "ui/Image/icon/skill_tangm_04", + "ui/Image/icon/skill_tangm_05", + "ui/Image/icon/skill_tangm_06", + "ui/Image/icon/skill_tangm_07", + "ui/Image/icon/skill_tangm_08", + "ui/Image/icon/skill_tangm_09", + "ui/Image/icon/skill_tangm_10", + "ui/Image/icon/skill_tangm_11", + "ui/Image/icon/skill_tangm_12", + "ui/Image/icon/skill_tangm_13", + "ui/Image/icon/skill_tangm_14", + "ui/Image/icon/skill_tangm_15", + "ui/Image/icon/skill_tangm_16", + "ui/Image/icon/skill_tangm_17", + "ui/Image/icon/skill_tangm_18", + "ui/Image/icon/skill_tangm_19", + "ui/Image/icon/skill_tangm_20", + "ui/Image/icon/skill_tangm_21", + "ui/Image/icon/skill_tangm_22", + "ui/Image/icon/skill_tangm_23", + "ui/Image/icon/skill_tangm_24", + "ui/Image/icon/skill_tangm_25", + "ui/Image/icon/skill_tangm_26", + "ui/Image/icon/skill_tangm_27", + "ui/Image/icon/skill_tangm_28", + "ui/Image/icon/skill_tangm_29", + "ui/Image/icon/skill_tangm_30", + "ui/Image/icon/skill_tangm_31", + "ui/Image/icon/skill_tangm_32", + "ui/Image/icon/skill_tangm_33", + "ui/Image/icon/skill_tangm_34", + "ui/Image/icon/skill_tangm_35", + "ui/Image/icon/skill_tangm_36", + "ui/Image/icon/skill_tangm_37", + "ui/Image/icon/skill_tangm_38", + "ui/Image/icon/skill_tangm_39", + "ui/Image/icon/skill_tangm_40", + "ui/Image/icon/skill_tangm_41", + "ui/Image/icon/skill_tangm_42", + "ui/Image/icon/skill_tangm_43", + "ui/Image/icon/skill_tangm_44", + "ui/Image/icon/skill_tangm_45", + "ui/Image/icon/skill_tangm_46", + "ui/Image/icon/skill_tangm_47", + "ui/Image/icon/skill_tangm_48", + "ui/Image/icon/skill_tangm_49", + "ui/Image/icon/skill_tangm_50", + "ui/Image/icon/skill_tangm_51", + "ui/Image/icon/skill_tangm_52", + "ui/Image/icon/skill_tangm_53", + "ui/Image/icon/skill_tangm_54", + "ui/Image/icon/skill_tangm_55", + "ui/Image/icon/skill_tangm_56", + "ui/Image/icon/skill_tangm_57", + "ui/Image/icon/skill_tangm_58", + "ui/Image/icon/skill_tangm_59", + "ui/Image/icon/skill_tangm_60", + "ui/Image/icon/skill_tangm_61", + "ui/Image/icon/skill_tangm_62", + "ui/Image/icon/skill_tangm_63", + "ui/Image/icon/skill_tangm_64", + "ui/Image/icon/skill_tangm_65", + "ui/Image/icon/skill_tiance01", + "ui/Image/icon/skill_tiance02", + "ui/Image/icon/skill_tiance03", + "ui/Image/icon/skill_tiance04", + "ui/Image/icon/skill_tiance05", + "ui/Image/icon/skill_tiance06", + "ui/Image/icon/skill_tiance07", + "ui/Image/icon/skill_tiance08", + "ui/Image/icon/skill_tiance09", + "ui/Image/icon/skill_tiance10", + "ui/Image/icon/skill_tiance11", + "ui/Image/icon/skill_tiance12", + "ui/Image/icon/skill_tiance13", + "ui/Image/icon/skill_tiance14", + "ui/Image/icon/skill_tiance15", + "ui/Image/icon/skill_tiance16", + "ui/Image/icon/skill_tiance17", + "ui/Image/icon/skill_tiance18", + "ui/Image/icon/skill_tiance19", + "ui/Image/icon/skill_tiance20", + "ui/Image/icon/skill_tiance21", + "ui/Image/icon/skill_tiance22", + "ui/Image/icon/skill_tiance23", + "ui/Image/icon/skill_tiance24", + "ui/Image/icon/skill_tiance25", + "ui/Image/icon/skill_tiance26", + "ui/Image/icon/skill_tiance27", + "ui/Image/icon/skill_tiance28", + "ui/Image/icon/skill_tiance29", + "ui/Image/icon/skill_tiance30", + "ui/Image/icon/skill_tiance31", + "ui/Image/icon/skill_tiance32", + "ui/Image/icon/skill_tiance33", + "ui/Image/icon/skill_uni01", + "ui/Image/icon/skill_uni02", + "ui/Image/icon/skill_uni03", + "ui/Image/icon/skill_uni04", + "ui/Image/icon/skill_uni05", + "ui/Image/icon/skill_uni06", + "ui/Image/icon/skill_uni07", + "ui/Image/icon/skill_uni08", + "ui/Image/icon/skill_uni09", + "ui/Image/icon/skill_uni10", + "ui/Image/icon/skill_uni11", + "ui/Image/icon/skill_uni12", + "ui/Image/icon/Skill_venation01", + "ui/Image/icon/Skill_venation02", + "ui/Image/icon/Skill_venation03", + "ui/Image/icon/Skill_venation04", + "ui/Image/icon/Skill_venation04_03", + "ui/Image/icon/Skill_venation04_05", + "ui/Image/icon/Skill_venation05", + "ui/Image/icon/Skill_venation06", + "ui/Image/icon/Skill_venation07", + "ui/Image/icon/Skill_venation08", + "ui/Image/icon/Skill_venation09", + "ui/Image/icon/Skill_venation09_02", + "ui/Image/icon/Skill_venation09_03", + "ui/Image/icon/Skill_venation10", + "ui/Image/icon/Skill_venation11", + "ui/Image/icon/Skill_venation12", + "ui/Image/icon/Skill_venation13", + "ui/Image/icon/Skill_venation13_03", + "ui/Image/icon/Skill_venation13_05", + "ui/Image/icon/Skill_venation13_07", + "ui/Image/icon/Skill_venation13_09", + "ui/Image/icon/Skill_venation14", + "ui/Image/icon/Skill_venation15", + "ui/Image/icon/Skill_venation16", + "ui/Image/icon/Skill_venation16_04", + "ui/Image/icon/Skill_venation16_07", + "ui/Image/icon/Skill_venation16_10", + "ui/Image/icon/Skill_venation16_13", + "ui/Image/icon/Skill_venation17", + "ui/Image/icon/Skill_venation18", + "ui/Image/icon/skill_wanhua01", + "ui/Image/icon/skill_wanhua02", + "ui/Image/icon/skill_wanhua03", + "ui/Image/icon/skill_wanhua04", + "ui/Image/icon/skill_wanhua05", + "ui/Image/icon/skill_wanhua06", + "ui/Image/icon/skill_wanhua07", + "ui/Image/icon/skill_wanhua08", + "ui/Image/icon/skill_wanhua09", + "ui/Image/icon/skill_wanhua10", + "ui/Image/icon/skill_wanhua11", + "ui/Image/icon/skill_wanhua12", + "ui/Image/icon/skill_wanhua13", + "ui/Image/icon/skill_wanhua14", + "ui/Image/icon/skill_wanhua15", + "ui/Image/icon/skill_wanhua16", + "ui/Image/icon/skill_wanhua17", + "ui/Image/icon/skill_wanhua18", + "ui/Image/icon/skill_wanhua19", + "ui/Image/icon/skill_wanhua20", + "ui/Image/icon/skill_wanhua21", + "ui/Image/icon/skill_wanhua22", + "ui/Image/icon/skill_wanhua23", + "ui/Image/icon/skill_wanhua24", + "ui/Image/icon/skill_wanhua25", + "ui/Image/icon/skill_wanhua26", + "ui/Image/icon/skill_wanhua27", + "ui/Image/icon/skill_wanhua28", + "ui/Image/icon/skill_wanhua29", + "ui/Image/icon/skill_wanhua30", + "ui/Image/icon/skill_wanhua31", + "ui/Image/icon/skill_wanhua32", + "ui/Image/icon/skill_wanhua33", + "ui/Image/icon/skill_wanhua34", + "ui/Image/icon/skill_wanhua35", + "ui/Image/icon/skill_wanhua36", + "ui/Image/icon/skill_wanhua37", + "ui/Image/icon/skill_wanhua38", + "ui/Image/icon/skill_wanhua39", + "ui/Image/icon/skill_wanhua40", + "ui/Image/icon/skill_wanhua41", + "ui/Image/icon/skill_wanhua42", + "ui/Image/icon/skill_wanhua_bimianneigong", + "ui/Image/icon/skill_wanhua_dianxueshanghai", + "ui/Image/icon/skill_wanhua_fuhuo", + "ui/Image/icon/skill_wanhua_hot", + "ui/Image/icon/skill_wanhua_hot_02", + "ui/Image/icon/skill_wanhua_hot_03", + "ui/Image/icon/skill_wanhua_hot_04", + "ui/Image/icon/skill_wanhua_huifushaoliang", + "ui/Image/icon/skill_wanhua_huifutuanti", + "ui/Image/icon/skill_wanhua_huifutuanti_03", + "ui/Image/icon/skill_wanhua_huifutuanti_04", + "ui/Image/icon/skill_wanhua_huifutuanti_05", + "ui/Image/icon/skill_wanhua_huixinyiji", + "ui/Image/icon/skill_wanhua_jiedu", + "ui/Image/icon/skill_wanhua_jiexue", + "ui/Image/icon/skill_wanhua_maxue", + "ui/Image/icon/skill_wanhua_neigongshunfa", + "ui/Image/icon/skill_wanhua_neigongyinchang", + "ui/Image/icon/skill_wanhua_neilinixing", + "ui/Image/icon/skill_wanhua_neilitisheng", + "ui/Image/icon/skill_wanhua_qianghuajingmai", + "ui/Image/icon/skill_wanhua_qunliao", + "ui/Image/icon/skill_wanhua_qunliao_02", + "ui/Image/icon/skill_wanhua_qunliao_03", + "ui/Image/icon/skill_wanhua_wanhuaxue", + "ui/Image/icon/skill_wanhua_wufashifang", + "ui/Image/icon/skill_wanhua_xiaoxue", + "ui/Image/icon/skill_wanhua_zengjianeili", + "ui/Image/icon/skill_wanhua_zengjiashangxian", + "ui/Image/icon/skill_wanhua_zengjiazhiliao", + "ui/Image/icon/skill_wanhua_zhixue", + "ui/Image/icon/skill_wanhua_zifengjingmai", + "ui/Image/icon/skill_wanhua_zouxue", + "ui/Image/icon/standard_female_icon", + "ui/Image/icon/strong_male_icon", + "ui/Image/icon/system01", + "ui/Image/icon/system02", + "ui/Image/icon/system03", + "ui/Image/icon/system04", + "ui/Image/icon/system05", + "ui/Image/icon/system06", + "ui/Image/icon/system07", + "ui/Image/icon/system08", + "ui/Image/icon/system09", + "ui/Image/icon/system10", + "ui/Image/icon/system11", + "ui/Image/icon/system12", + "ui/Image/icon/system13", + "ui/Image/icon/system14", + "ui/Image/icon/system15", + "ui/Image/icon/system16", + "ui/Image/icon/tailorNew01", + "ui/Image/icon/tailorNew02", + "ui/Image/icon/tailorNew03", + "ui/Image/icon/tailorNew04", + "ui/Image/icon/tailorNew05", + "ui/Image/icon/tailorNew06", + "ui/Image/icon/tailorNew07", + "ui/Image/icon/tailorNew08", + "ui/Image/icon/tailorNew09", + "ui/Image/icon/tailorNew10", + "ui/Image/icon/tailorNew11", + "ui/Image/icon/tailorNew12", + "ui/Image/icon/tailorNew13", + "ui/Image/icon/tangmms_01", + "ui/Image/icon/tangmms_02", + "ui/Image/icon/tangmms_03", + "ui/Image/icon/tangmms_04", + "ui/Image/icon/tangmms_05", + "ui/Image/icon/tangmms_06", + "ui/Image/icon/tangmms_07", + "ui/Image/icon/tangmms_08", + "ui/Image/icon/tangmms_09", + "ui/Image/icon/tf_cangjian_10", + "ui/Image/icon/tf_cangjian_1002_BW", + "ui/Image/icon/tf_cangjian_13", + "ui/Image/icon/tf_cangjian_1302_BW", + "ui/Image/icon/tf_cangjian_17", + "ui/Image/icon/tf_cangjian_1702_BW", + "ui/Image/icon/tf_cangjian_21", + "ui/Image/icon/tf_cangjian_2102_BW", + "ui/Image/icon/tf_cangjian_22", + "ui/Image/icon/tf_cangjian_2202_BW", + "ui/Image/icon/tf_cangjian_24", + "ui/Image/icon/tf_cangjian_2402_BW", + "ui/Image/icon/tf_cangjian_25", + "ui/Image/icon/tf_cangjian_2502_BW", + "ui/Image/icon/tf_cangjian_27", + "ui/Image/icon/tf_cangjian_2702_BW", + "ui/Image/icon/tf_cangjian_35", + "ui/Image/icon/tf_cangjian_3502_BW", + "ui/Image/icon/tf_cangjian_9", + "ui/Image/icon/tf_cangjian_902_BW", + "ui/Image/icon/tf_cangjian_T1", + "ui/Image/icon/tf_cangjian_T102_BW", + "ui/Image/icon/tf_cangjian_T2", + "ui/Image/icon/tf_cangjian_T202_BW", + "ui/Image/icon/tf_cangjian_T3", + "ui/Image/icon/tf_cangjian_T302_BW", + "ui/Image/icon/tf_cangjian_T4", + "ui/Image/icon/tf_cangjian_T402_BW", + "ui/Image/icon/tf_cangjian_T5", + "ui/Image/icon/tf_cangjian_T502_BW", + "ui/Image/icon/tf_cangjian_T6", + "ui/Image/icon/tf_cangjian_T602_BW", + "ui/Image/icon/tf_cangjian_T7", + "ui/Image/icon/tf_cangjian_T702_BW", + "ui/Image/icon/tf_cangjian_T8", + "ui/Image/icon/tf_cangjian_T802_BW", + "ui/Image/icon/tf_cangjian_T9", + "ui/Image/icon/tf_cangjian_T902_BW", + "ui/Image/icon/tf_chunyang_12", + "ui/Image/icon/tf_chunyang_1202_BW", + "ui/Image/icon/tf_chunyang_14", + "ui/Image/icon/tf_chunyang_1402_BW", + "ui/Image/icon/tf_chunyang_17", + "ui/Image/icon/tf_chunyang_1702_BW", + "ui/Image/icon/tf_chunyang_24", + "ui/Image/icon/tf_chunyang_2402_BW", + "ui/Image/icon/tf_chunyang_25", + "ui/Image/icon/tf_chunyang_2502_BW", + "ui/Image/icon/tf_chunyang_28", + "ui/Image/icon/tf_chunyang_2802_BW", + "ui/Image/icon/tf_chunyang_35", + "ui/Image/icon/tf_chunyang_3502_BW", + "ui/Image/icon/tf_chunyang_5", + "ui/Image/icon/tf_chunyang_502_BW", + "ui/Image/icon/tf_chunyang_6", + "ui/Image/icon/tf_chunyang_602_BW", + "ui/Image/icon/tf_chunyang_8", + "ui/Image/icon/tf_chunyang_802_BW", + "ui/Image/icon/tf_chunyang_9", + "ui/Image/icon/tf_chunyang_902_BW", + "ui/Image/icon/tf_chunyang_T1", + "ui/Image/icon/tf_chunyang_T102_BW", + "ui/Image/icon/tf_chunyang_T2", + "ui/Image/icon/tf_chunyang_T202_BW", + "ui/Image/icon/tf_chunyang_T3", + "ui/Image/icon/tf_chunyang_T302_BW", + "ui/Image/icon/tf_chunyang_T4", + "ui/Image/icon/tf_chunyang_T402_BW", + "ui/Image/icon/tf_chunyang_T5", + "ui/Image/icon/tf_chunyang_T502_BW", + "ui/Image/icon/tf_chunyang_T6", + "ui/Image/icon/tf_chunyang_T602_BW", + "ui/Image/icon/tf_chunyang_T7", + "ui/Image/icon/tf_chunyang_T702_BW", + "ui/Image/icon/tf_chunyang_T8", + "ui/Image/icon/tf_chunyang_T802_BW", + "ui/Image/icon/tf_chunyang_T9", + "ui/Image/icon/tf_chunyang_T902_BW", + "ui/Image/icon/tf_mingjiao_1", + "ui/Image/icon/tf_mingjiao_10", + "ui/Image/icon/tf_mingjiao_11", + "ui/Image/icon/tf_mingjiao_12", + "ui/Image/icon/tf_mingjiao_13", + "ui/Image/icon/tf_mingjiao_14", + "ui/Image/icon/tf_mingjiao_15", + "ui/Image/icon/tf_mingjiao_16", + "ui/Image/icon/tf_mingjiao_17", + "ui/Image/icon/tf_mingjiao_18", + "ui/Image/icon/tf_mingjiao_19", + "ui/Image/icon/tf_mingjiao_2", + "ui/Image/icon/tf_mingjiao_20", + "ui/Image/icon/tf_mingjiao_21", + "ui/Image/icon/tf_mingjiao_22", + "ui/Image/icon/tf_mingjiao_23", + "ui/Image/icon/tf_mingjiao_24", + "ui/Image/icon/tf_mingjiao_25", + "ui/Image/icon/tf_mingjiao_26", + "ui/Image/icon/tf_mingjiao_27", + "ui/Image/icon/tf_mingjiao_28", + "ui/Image/icon/tf_mingjiao_29", + "ui/Image/icon/tf_mingjiao_3", + "ui/Image/icon/tf_mingjiao_30", + "ui/Image/icon/tf_mingjiao_31", + "ui/Image/icon/tf_mingjiao_32", + "ui/Image/icon/tf_mingjiao_33", + "ui/Image/icon/tf_mingjiao_4", + "ui/Image/icon/tf_mingjiao_5", + "ui/Image/icon/tf_mingjiao_6", + "ui/Image/icon/tf_mingjiao_7", + "ui/Image/icon/tf_mingjiao_8", + "ui/Image/icon/tf_mingjiao_9", + "ui/Image/icon/tf_qixiu_15", + "ui/Image/icon/tf_qixiu_1502_BW", + "ui/Image/icon/tf_qixiu_17", + "ui/Image/icon/tf_qixiu_1702_BW", + "ui/Image/icon/tf_qixiu_21", + "ui/Image/icon/tf_qixiu_2102_BW", + "ui/Image/icon/tf_qixiu_25", + "ui/Image/icon/tf_qixiu_2502_BW", + "ui/Image/icon/tf_qixiu_30", + "ui/Image/icon/tf_qixiu_3002_BW", + "ui/Image/icon/tf_qixiu_34", + "ui/Image/icon/tf_qixiu_3402_BW", + "ui/Image/icon/tf_qixiu_5", + "ui/Image/icon/tf_qixiu_502_BW", + "ui/Image/icon/tf_qixiu_8", + "ui/Image/icon/tf_qixiu_802_BW", + "ui/Image/icon/tf_qixiu_T1", + "ui/Image/icon/tf_qixiu_T102_BW", + "ui/Image/icon/tf_qixiu_T2", + "ui/Image/icon/tf_qixiu_T202_BW", + "ui/Image/icon/tf_qixiu_T3", + "ui/Image/icon/tf_qixiu_T302_BW", + "ui/Image/icon/tf_qixiu_T4", + "ui/Image/icon/tf_qixiu_T402_BW", + "ui/Image/icon/tf_qixiu_T5", + "ui/Image/icon/tf_qixiu_T502_BW", + "ui/Image/icon/tf_qixiu_T6", + "ui/Image/icon/tf_qixiu_T602_BW", + "ui/Image/icon/tf_qixiu_T7", + "ui/Image/icon/tf_qixiu_T702_BW", + "ui/Image/icon/tf_qixiu_T8", + "ui/Image/icon/tf_qixiu_T802_BW", + "ui/Image/icon/tf_qixiu_T9", + "ui/Image/icon/tf_qixiu_T902_BW", + "ui/Image/icon/tf_shaolin_BuGou", + "ui/Image/icon/tf_shaolin_BuGou02_BW", + "ui/Image/icon/tf_shaolin_GuiQuLai", + "ui/Image/icon/tf_shaolin_GuiQuLai02_BW", + "ui/Image/icon/tf_shaolin_HuanShen", + "ui/Image/icon/tf_shaolin_HuanShen02_BW", + "ui/Image/icon/tf_shaolin_JinGangJue", + "ui/Image/icon/tf_shaolin_JinGangJue02_BW", + "ui/Image/icon/tf_shaolin_NiePanShi", + "ui/Image/icon/tf_shaolin_NiePanShi02_BW", + "ui/Image/icon/tf_shaolin_SanShi", + "ui/Image/icon/tf_shaolin_SanShi02_BW", + "ui/Image/icon/tf_shaolin_T1", + "ui/Image/icon/tf_shaolin_T102_BW", + "ui/Image/icon/tf_shaolin_T2", + "ui/Image/icon/tf_shaolin_T202_BW", + "ui/Image/icon/tf_shaolin_T3", + "ui/Image/icon/tf_shaolin_T302_BW", + "ui/Image/icon/tf_shaolin_T4", + "ui/Image/icon/tf_shaolin_T402_BW", + "ui/Image/icon/tf_shaolin_T5", + "ui/Image/icon/tf_shaolin_T502_BW", + "ui/Image/icon/tf_shaolin_T6", + "ui/Image/icon/tf_shaolin_T602_BW", + "ui/Image/icon/tf_shaolin_T7", + "ui/Image/icon/tf_shaolin_T702_BW", + "ui/Image/icon/tf_shaolin_T8", + "ui/Image/icon/tf_shaolin_T802_BW", + "ui/Image/icon/tf_shaolin_T9", + "ui/Image/icon/tf_shaolin_T902_BW", + "ui/Image/icon/tf_shaolin_WuLiang", + "ui/Image/icon/tf_shaolin_WuLiang02_BW", + "ui/Image/icon/tf_shaolin_WuSe", + "ui/Image/icon/tf_shaolin_WuSe02_BW", + "ui/Image/icon/tf_shaolin_XiangMo", + "ui/Image/icon/tf_shaolin_XiangMo02_BW", + "ui/Image/icon/tf_shaolin_ZhenRu", + "ui/Image/icon/tf_shaolin_ZhenRu02_BW", + "ui/Image/icon/tf_shaolin_ZiZai", + "ui/Image/icon/tf_shaolin_ZiZai02_BW", + "ui/Image/icon/tf_tangmen_T1", + "ui/Image/icon/tf_tangmen_T102_BW", + "ui/Image/icon/tf_tangmen_T2", + "ui/Image/icon/tf_tangmen_T202_BW", + "ui/Image/icon/tf_tangmen_T3", + "ui/Image/icon/tf_tangmen_T302_BW", + "ui/Image/icon/tf_tangmen_T4", + "ui/Image/icon/tf_tangmen_T402_BW", + "ui/Image/icon/tf_tangmen_T5", + "ui/Image/icon/tf_tangmen_T502_BW", + "ui/Image/icon/tf_tangmen_T6", + "ui/Image/icon/tf_tangmen_T602_BW", + "ui/Image/icon/tf_tangmen_T7", + "ui/Image/icon/tf_tangmen_T702_BW", + "ui/Image/icon/tf_tangmen_T8", + "ui/Image/icon/tf_tangmen_T802_BW", + "ui/Image/icon/tf_tangmen_T9", + "ui/Image/icon/tf_tangmen_T902_BW", + "ui/Image/icon/tf_tiance_BeiShui", + "ui/Image/icon/tf_tiance_BeiShui02_BW", + "ui/Image/icon/tf_tiance_FengHuo", + "ui/Image/icon/tf_tiance_FengHuo02_BW", + "ui/Image/icon/tf_tiance_LinHu", + "ui/Image/icon/tf_tiance_LinHu02_BW", + "ui/Image/icon/tf_tiance_LiuHou", + "ui/Image/icon/tf_tiance_LiuHou02_BW", + "ui/Image/icon/tf_tiance_LongCheng", + "ui/Image/icon/tf_tiance_LongCheng02_BW", + "ui/Image/icon/tf_tiance_PiLi", + "ui/Image/icon/tf_tiance_PiLi02_BW", + "ui/Image/icon/tf_tiance_QiShe", + "ui/Image/icon/tf_tiance_QiShe02_BW", + "ui/Image/icon/tf_tiance_T1", + "ui/Image/icon/tf_tiance_T102_BW", + "ui/Image/icon/tf_tiance_T2", + "ui/Image/icon/tf_tiance_T202_BW", + "ui/Image/icon/tf_tiance_T3", + "ui/Image/icon/tf_tiance_T302_BW", + "ui/Image/icon/tf_tiance_T4", + "ui/Image/icon/tf_tiance_T402_BW", + "ui/Image/icon/tf_tiance_T5", + "ui/Image/icon/tf_tiance_T502_BW", + "ui/Image/icon/tf_tiance_T6", + "ui/Image/icon/tf_tiance_T602_BW", + "ui/Image/icon/tf_tiance_T7", + "ui/Image/icon/tf_tiance_T702_BW", + "ui/Image/icon/tf_tiance_T8", + "ui/Image/icon/tf_tiance_T802_BW", + "ui/Image/icon/tf_tiance_T9", + "ui/Image/icon/tf_tiance_T902_BW", + "ui/Image/icon/tf_tiance_YeZheng", + "ui/Image/icon/tf_tiance_YeZheng02_BW", + "ui/Image/icon/tf_wanhua_13", + "ui/Image/icon/tf_wanhua_1302_BW", + "ui/Image/icon/tf_wanhua_17", + "ui/Image/icon/tf_wanhua_1702_BW", + "ui/Image/icon/tf_wanhua_23", + "ui/Image/icon/tf_wanhua_2302_BW", + "ui/Image/icon/tf_wanhua_24", + "ui/Image/icon/tf_wanhua_2402_BW", + "ui/Image/icon/tf_wanhua_25", + "ui/Image/icon/tf_wanhua_2502_BW", + "ui/Image/icon/tf_wanhua_26", + "ui/Image/icon/tf_wanhua_2602_BW", + "ui/Image/icon/tf_wanhua_29", + "ui/Image/icon/tf_wanhua_2902_BW", + "ui/Image/icon/tf_wanhua_30", + "ui/Image/icon/tf_wanhua_3002_BW", + "ui/Image/icon/tf_wanhua_32", + "ui/Image/icon/tf_wanhua_3202_BW", + "ui/Image/icon/tf_wanhua_34", + "ui/Image/icon/tf_wanhua_3402_BW", + "ui/Image/icon/tf_wanhua_9", + "ui/Image/icon/tf_wanhua_902_BW", + "ui/Image/icon/tf_wanhua_T1", + "ui/Image/icon/tf_wanhua_T102_BW", + "ui/Image/icon/tf_wanhua_T2", + "ui/Image/icon/tf_wanhua_T202_BW", + "ui/Image/icon/tf_wanhua_T3", + "ui/Image/icon/tf_wanhua_T302_BW", + "ui/Image/icon/tf_wanhua_T4", + "ui/Image/icon/tf_wanhua_T402_BW", + "ui/Image/icon/tf_wanhua_T5", + "ui/Image/icon/tf_wanhua_T502_BW", + "ui/Image/icon/tf_wanhua_T6", + "ui/Image/icon/tf_wanhua_T602_BW", + "ui/Image/icon/tf_wanhua_T7", + "ui/Image/icon/tf_wanhua_T702_BW", + "ui/Image/icon/tf_wanhua_T8", + "ui/Image/icon/tf_wanhua_T802_BW", + "ui/Image/icon/tf_wanhua_T9", + "ui/Image/icon/tf_wanhua_T902_BW", + "ui/Image/icon/tf_wudu_AP", + "ui/Image/icon/tf_wudu_AP02_BW", + "ui/Image/icon/tf_wudu_Bingcan", + "ui/Image/icon/tf_wudu_Bingcan02_BW", + "ui/Image/icon/tf_wudu_GuChong", + "ui/Image/icon/tf_wudu_GuChong02_BW", + "ui/Image/icon/tf_wudu_HpMp", + "ui/Image/icon/tf_wudu_HpMp02_BW", + "ui/Image/icon/tf_wudu_HuanGu", + "ui/Image/icon/tf_wudu_HuanGu02_BW", + "ui/Image/icon/tf_wudu_HuanGuCD", + "ui/Image/icon/tf_wudu_HuanGuCD02_BW", + "ui/Image/icon/tf_wudu_Huixue", + "ui/Image/icon/tf_wudu_Huixue02_BW", + "ui/Image/icon/tf_wudu_JianCD", + "ui/Image/icon/tf_wudu_JianCD02_BW", + "ui/Image/icon/tf_wudu_NvWa", + "ui/Image/icon/tf_wudu_NvWa02_BW", + "ui/Image/icon/tf_wudu_PetAP", + "ui/Image/icon/tf_wudu_PetAP02_BW", + "ui/Image/icon/tf_wudu_ShenShou", + "ui/Image/icon/tf_wudu_ShenShou02_BW", + "ui/Image/icon/tf_wudu_T1", + "ui/Image/icon/tf_wudu_T102_BW", + "ui/Image/icon/tf_wudu_T2", + "ui/Image/icon/tf_wudu_T202_BW", + "ui/Image/icon/tf_wudu_T3", + "ui/Image/icon/tf_wudu_T302_BW", + "ui/Image/icon/tf_wudu_T4", + "ui/Image/icon/tf_wudu_T402_BW", + "ui/Image/icon/tf_wudu_T5", + "ui/Image/icon/tf_wudu_T502_BW", + "ui/Image/icon/tf_wudu_T6", + "ui/Image/icon/tf_wudu_T602_BW", + "ui/Image/icon/tf_wudu_T7", + "ui/Image/icon/tf_wudu_T702_BW", + "ui/Image/icon/tf_wudu_T8", + "ui/Image/icon/tf_wudu_T802_BW", + "ui/Image/icon/tf_wudu_T9", + "ui/Image/icon/tf_wudu_T902_BW", + "ui/Image/icon/tf_wudu_ZhiLiao", + "ui/Image/icon/tf_wudu_ZhiLiao02_BW", + "ui/Image/icon/thread01", + "ui/Image/icon/thread02", + "ui/Image/icon/thread03", + "ui/Image/icon/thread05", + "ui/Image/icon/thread06", + "ui/Image/icon/tiance04", + "ui/Image/icon/tiance11", + "ui/Image/icon/tiance_book_1", + "ui/Image/icon/tiance_book_2", + "ui/Image/icon/tiance_book_3", + "ui/Image/icon/tiance_book_4", + "ui/Image/icon/tiance_book_5", + "ui/Image/icon/tiance_shangma", + "ui/Image/icon/tiance_shuliandu_1", + "ui/Image/icon/tiance_shuliandu_2", + "ui/Image/icon/tiance_shuliandu_3", + "ui/Image/icon/tiance_xiama", + "ui/Image/icon/tianzhu01", + "ui/Image/icon/tianzhu05", + "ui/Image/icon/tiehua_aidai01", + "ui/Image/icon/tiehua_aidai02", + "ui/Image/icon/tiehua_baiyanwei", + "ui/Image/icon/tiehua_beidou01_F2", + "ui/Image/icon/tiehua_beidou01_M2", + "ui/Image/icon/tiehua_beidou02", + "ui/Image/icon/tiehua_cangjian", + "ui/Image/icon/tiehua_chai01", + "ui/Image/icon/tiehua_chunyang", + "ui/Image/icon/tiehua_daoba01", + "ui/Image/icon/tiehua_daoba02", + "ui/Image/icon/tiehua_daoba03", + "ui/Image/icon/tiehua_daoba04", + "ui/Image/icon/tiehua_daoba05", + "ui/Image/icon/tiehua_daoba06", + "ui/Image/icon/tiehua_eshi01", + "ui/Image/icon/tiehua_eshi02", + "ui/Image/icon/tiehua_eshi03", + "ui/Image/icon/tiehua_eshi04", + "ui/Image/icon/tiehua_eshi05", + "ui/Image/icon/tiehua_eshi06", + "ui/Image/icon/tiehua_eshi07", + "ui/Image/icon/tiehua_eshi08", + "ui/Image/icon/tiehua_eshi09", + "ui/Image/icon/tiehua_eshi10", + "ui/Image/icon/tiehua_eshi11", + "ui/Image/icon/tiehua_eshi12", + "ui/Image/icon/tiehua_eshi13yanjing", + "ui/Image/icon/tiehua_eshi14", + "ui/Image/icon/tiehua_eshi15", + "ui/Image/icon/tiehua_eshi16yanjing", + "ui/Image/icon/tiehua_eshi18", + "ui/Image/icon/tiehua_eshi19", + "ui/Image/icon/tiehua_eshiyanjing", + "ui/Image/icon/tiehua_gaibang", + "ui/Image/icon/tiehua_heixian01", + "ui/Image/icon/tiehua_heixian02", + "ui/Image/icon/tiehua_hua01", + "ui/Image/icon/tiehua_hua02", + "ui/Image/icon/tiehua_hua03", + "ui/Image/icon/tiehua_hua04", + "ui/Image/icon/tiehua_hua05", + "ui/Image/icon/tiehua_hua06", + "ui/Image/icon/tiehua_hua07", + "ui/Image/icon/tiehua_hua_hudie", + "ui/Image/icon/tiehua_hua_xin01", + "ui/Image/icon/tiehua_hudie01", + "ui/Image/icon/tiehua_jiaoyin01", + "ui/Image/icon/tiehua_jinyu01", + "ui/Image/icon/tiehua_lalian01", + "ui/Image/icon/tiehua_lei01", + "ui/Image/icon/tiehua_lei02", + "ui/Image/icon/tiehua_lei03", + "ui/Image/icon/tiehua_lianhengxian01", + "ui/Image/icon/tiehua_lianhengxian02", + "ui/Image/icon/tiehua_lianhengxian03", + "ui/Image/icon/tiehua_lianhengxian04", + "ui/Image/icon/tiehua_lianpu01", + "ui/Image/icon/tiehua_lianshuxian01", + "ui/Image/icon/tiehua_maohuzi01", + "ui/Image/icon/tiehua_meirenzhi01", + "ui/Image/icon/tiehua_meishi01", + "ui/Image/icon/tiehua_meishi02", + "ui/Image/icon/tiehua_mianwen", + "ui/Image/icon/tiehua_mingjiao", + "ui/Image/icon/tiehua_mizhiyeti01", + "ui/Image/icon/tiehua_qingjin01", + "ui/Image/icon/tiehua_qita02", + "ui/Image/icon/tiehua_qita_qingshe", + "ui/Image/icon/tiehua_qixiu", + "ui/Image/icon/tiehua_queban01", + "ui/Image/icon/tiehua_saihong_chuan", + "ui/Image/icon/tiehua_shangba", + "ui/Image/icon/tiehua_shanzi01", + "ui/Image/icon/tiehua_shaolin", + "ui/Image/icon/tiehua_shouyin01", + "ui/Image/icon/tiehua_shouyin02", + "ui/Image/icon/tiehua_tangmen", + "ui/Image/icon/tiehua_taozhuang01", + "ui/Image/icon/tiehua_tiance", + "ui/Image/icon/tiehua_tuan_cao01", + "ui/Image/icon/tiehua_wanhua", + "ui/Image/icon/tiehua_wenshen002", + "ui/Image/icon/tiehua_wenshen03_chibang", + "ui/Image/icon/tiehua_wenshen_001", + "ui/Image/icon/tiehua_wenshen_feng01", + "ui/Image/icon/tiehua_wenshen_long01", + "ui/Image/icon/tiehua_wenshen_long02", + "ui/Image/icon/tiehua_wenziwan", + "ui/Image/icon/tiehua_wenzi_fa", + "ui/Image/icon/tiehua_wenzi_qiu", + "ui/Image/icon/tiehua_wenzi_si", + "ui/Image/icon/tiehua_wudu", + "ui/Image/icon/tiehua_xiaoha", + "ui/Image/icon/tiehua_xingxing", + "ui/Image/icon/tiehua_xingxingshuxian", + "ui/Image/icon/tiehua_xiongmaoyan", + "ui/Image/icon/tiehua_xueji01", + "ui/Image/icon/tiehua_yanbushuxian01", + "ui/Image/icon/tiehua_yaoji01", + "ui/Image/icon/tkt_necklace01", + "ui/Image/icon/tkt_necklace02", + "ui/Image/icon/tkt_necklace03", + "ui/Image/icon/tkt_necklace04", + "ui/Image/icon/tkt_necklace05", + "ui/Image/icon/tkt_necklace06", + "ui/Image/icon/tkt_necklace07", + "ui/Image/icon/tkt_necklace08", + "ui/Image/icon/tkt_necklace09", + "ui/Image/icon/tkt_necklace10", + "ui/Image/icon/tkt_necklace11", + "ui/Image/icon/tkt_necklace12", + "ui/Image/icon/tkt_necklace17", + "ui/Image/icon/tkt_necklace18", + "ui/Image/icon/tkt_necklace19", + "ui/Image/icon/tkt_necklace20", + "ui/Image/icon/tkt_necklace21", + "ui/Image/icon/tkt_necklace22", + "ui/Image/icon/tkt_necklace23", + "ui/Image/icon/tkt_necklace24", + "ui/Image/icon/tkt_necklace25", + "ui/Image/icon/tkt_necklace26", + "ui/Image/icon/tkt_necklace27", + "ui/Image/icon/tkt_necklace28", + "ui/Image/icon/tkt_necklace29", + "ui/Image/icon/tkt_pendant01", + "ui/Image/icon/tkt_pendant02", + "ui/Image/icon/tkt_pendant03", + "ui/Image/icon/tkt_pendant04", + "ui/Image/icon/tkt_pendant05", + "ui/Image/icon/tkt_pendant06", + "ui/Image/icon/tkt_pendant07", + "ui/Image/icon/tkt_pendant08", + "ui/Image/icon/tkt_pendant09", + "ui/Image/icon/tkt_pendant10", + "ui/Image/icon/tkt_pendant11", + "ui/Image/icon/tkt_pendant12", + "ui/Image/icon/tkt_pendant13", + "ui/Image/icon/tkt_pendant14", + "ui/Image/icon/tkt_pendant15", + "ui/Image/icon/tkt_pendant16", + "ui/Image/icon/tkt_pendant17", + "ui/Image/icon/tkt_pendant18", + "ui/Image/icon/tkt_pendant19", + "ui/Image/icon/tkt_pendant20", + "ui/Image/icon/tkt_pendant21", + "ui/Image/icon/tkt_pendant22", + "ui/Image/icon/tkt_pendant23", + "ui/Image/icon/tkt_pendant24", + "ui/Image/icon/tkt_pendant25", + "ui/Image/icon/tkt_pendant26", + "ui/Image/icon/tkt_pendant27", + "ui/Image/icon/tkt_pendant28", + "ui/Image/icon/tkt_pendant29", + "ui/Image/icon/tkt_pendant30", + "ui/Image/icon/tkt_pendant31", + "ui/Image/icon/tkt_pendant32", + "ui/Image/icon/tkt_ring01", + "ui/Image/icon/tkt_ring02", + "ui/Image/icon/tkt_ring03", + "ui/Image/icon/tkt_ring04", + "ui/Image/icon/tkt_ring05", + "ui/Image/icon/tkt_ring06", + "ui/Image/icon/tkt_ring07", + "ui/Image/icon/tkt_ring08", + "ui/Image/icon/tkt_ring09", + "ui/Image/icon/tkt_ring10", + "ui/Image/icon/tkt_ring11", + "ui/Image/icon/tkt_ring12", + "ui/Image/icon/tkt_ring13", + "ui/Image/icon/tkt_ring14", + "ui/Image/icon/tkt_ring15", + "ui/Image/icon/tkt_ring16", + "ui/Image/icon/tkt_ring17", + "ui/Image/icon/tkt_ring18", + "ui/Image/icon/tkt_ring19", + "ui/Image/icon/tkt_ring20", + "ui/Image/icon/tkt_ring21", + "ui/Image/icon/tkt_ring22", + "ui/Image/icon/tkt_ring23", + "ui/Image/icon/tkt_ring24", + "ui/Image/icon/tkt_ring25", + "ui/Image/icon/tkt_ring26", + "ui/Image/icon/tkt_ring27", + "ui/Image/icon/tkt_ring28", + "ui/Image/icon/tkt_ring29", + "ui/Image/icon/tome01", + "ui/Image/icon/tome02", + "ui/Image/icon/tome03", + "ui/Image/icon/tome04", + "ui/Image/icon/tome05", + "ui/Image/icon/tome06", + "ui/Image/icon/tome07", + "ui/Image/icon/tome08", + "ui/Image/icon/tome09", + "ui/Image/icon/tome10", + "ui/Image/icon/tome11", + "ui/Image/icon/tome12", + "ui/Image/icon/tome13", + "ui/Image/icon/tome14", + "ui/Image/icon/tome15", + "ui/Image/icon/tome16", + "ui/Image/icon/tool01", + "ui/Image/icon/tool02", + "ui/Image/icon/tool03", + "ui/Image/icon/tool04", + "ui/Image/icon/tool05", + "ui/Image/icon/tool06", + "ui/Image/icon/tool07", + "ui/Image/icon/tool_ASZL_01", + "ui/Image/icon/tool_ASZL_02", + "ui/Image/icon/tool_ASZL_03", + "ui/Image/icon/tool_ASZL_04", + "ui/Image/icon/tool_ASZL_05", + "ui/Image/icon/tool_ASZL_06", + "ui/Image/icon/tool_ASZL_07", + "ui/Image/icon/tool_ASZL_08", + "ui/Image/icon/tool_ASZL_09", + "ui/Image/icon/tool_ASZL_10", + "ui/Image/icon/tool_ASZL_11", + "ui/Image/icon/tool_ASZL_12", + "ui/Image/icon/tool_ASZL_13", + "ui/Image/icon/tool_ASZL_14", + "ui/Image/icon/tool_ASZL_15", + "ui/Image/icon/tool_ASZL_16", + "ui/Image/icon/tool_ASZL_17", + "ui/Image/icon/tool_ASZL_18", + "ui/Image/icon/tool_ASZL_19", + "ui/Image/icon/tool_ASZL_20", + "ui/Image/icon/tool_ASZL_21", + "ui/Image/icon/tool_ASZL_22", + "ui/Image/icon/tool_taoma", + "ui/Image/icon/TQ_01", + "ui/Image/icon/TQ_02", + "ui/Image/icon/TQ_05", + "ui/Image/icon/TQ_08", + "ui/Image/icon/TQ_09", + "ui/Image/icon/TQ_11", + "ui/Image/icon/tubiao_0514_01", + "ui/Image/icon/tubiao_0514_02", + "ui/Image/icon/tubiao_0514_03", + "ui/Image/icon/tubiao_0514_04", + "ui/Image/icon/tubiao_0514_05", + "ui/Image/icon/tubiao_0514_06", + "ui/Image/icon/tubiao_0514_07", + "ui/Image/icon/tubiao_0514_08", + "ui/Image/icon/tubiao_0514_09", + "ui/Image/icon/tubiao_0514_10", + "ui/Image/icon/tubiao_0514_11", + "ui/Image/icon/tubiao_0514_12", + "ui/Image/icon/tubiao_0514_13", + "ui/Image/icon/tubiao_0514_14", + "ui/Image/icon/tubiao_0514_15", + "ui/Image/icon/tubiao_0514_16", + "ui/Image/icon/tubiao_0514_17", + "ui/Image/icon/tubiao_0514_18", + "ui/Image/icon/tubiao_0514_19", + "ui/Image/icon/tubiao_0514_20", + "ui/Image/icon/tubiao_0514_21", + "ui/Image/icon/tubiao_0514_22", + "ui/Image/icon/tubiao_0514_23", + "ui/Image/icon/tubiao_0514_24", + "ui/Image/icon/tubiao_0514_25", + "ui/Image/icon/tubiao_0514_26", + "ui/Image/icon/tubiao_0514_27", + "ui/Image/icon/tubiao_0514_28", + "ui/Image/icon/ty_wudu_01", + "ui/Image/icon/ty_wudu_02", + "ui/Image/icon/ty_wudu_03", + "ui/Image/icon/ty_wudu_04", + "ui/Image/icon/ty_wudu_05", + "ui/Image/icon/ty_wudu_06", + "ui/Image/icon/ty_wudu_07", + "ui/Image/icon/ty_wudu_08", + "ui/Image/icon/ty_wudu_09", + "ui/Image/icon/ty_wudu_10", + "ui/Image/icon/ty_wudu_11", + "ui/Image/icon/ty_wudu_12", + "ui/Image/icon/ty_wudu_13", + "ui/Image/icon/ty_wudu_14", + "ui/Image/icon/undone", + "ui/Image/icon/veget01", + "ui/Image/icon/veget03", + "ui/Image/icon/veget05", + "ui/Image/icon/veget06", + "ui/Image/icon/veget07", + "ui/Image/icon/veget09", + "ui/Image/icon/veget10", + "ui/Image/icon/veget11", + "ui/Image/icon/veget12", + "ui/Image/icon/veget13", + "ui/Image/icon/wallet01", + "ui/Image/icon/wanhua08", + "ui/Image/icon/wanhua12", + "ui/Image/icon/wanhua_book_1", + "ui/Image/icon/wanhua_book_2", + "ui/Image/icon/wanhua_book_3", + "ui/Image/icon/wanhua_book_4", + "ui/Image/icon/wanhua_book_5", + "ui/Image/icon/wanhua_shuliandu_1", + "ui/Image/icon/wanhua_shuliandu_2", + "ui/Image/icon/wanhua_shuliandu_3", + "ui/Image/icon/wine01", + "ui/Image/icon/wine02", + "ui/Image/icon/wine03", + "ui/Image/icon/wine04", + "ui/Image/icon/wine05", + "ui/Image/icon/wpn_1124_01", + "ui/Image/icon/wpn_1124_02", + "ui/Image/icon/wpn_1124_03", + "ui/Image/icon/wpn_1124_04", + "ui/Image/icon/wpn_1124_05", + "ui/Image/icon/wpn_1124_06", + "ui/Image/icon/wpn_1124_07", + "ui/Image/icon/wpn_1124_08", + "ui/Image/icon/wpn_1124_09", + "ui/Image/icon/wpn_1124_10", + "ui/Image/icon/wpn_1124_11", + "ui/Image/icon/wpn_1124_12", + "ui/Image/icon/wpn_1124_13", + "ui/Image/icon/wpn_1124_14", + "ui/Image/icon/wpn_1124_15", + "ui/Image/icon/wpn_1124_16", + "ui/Image/icon/wpn_1124_17", + "ui/Image/icon/wpn_1124_18", + "ui/Image/icon/wpn_1124_19", + "ui/Image/icon/wpn_1124_20", + "ui/Image/icon/wpn_1124_21", + "ui/Image/icon/wpn_1124_22", + "ui/Image/icon/wpn_1124_23", + "ui/Image/icon/wpn_1124_24", + "ui/Image/icon/wpn_1124_25", + "ui/Image/icon/wpn_1124_26", + "ui/Image/icon/wpn_1124_27", + "ui/Image/icon/wpn_1124_28", + "ui/Image/icon/wpn_1124_29", + "ui/Image/icon/wpn_1124_30", + "ui/Image/icon/wpn_1124_31", + "ui/Image/icon/wpn_1124_32", + "ui/Image/icon/wpn_1124_33", + "ui/Image/icon/wpn_1124_34", + "ui/Image/icon/wpn_1124_35", + "ui/Image/icon/wpn_1124_36", + "ui/Image/icon/wpn_1124_37", + "ui/Image/icon/wpn_1124_38", + "ui/Image/icon/wpn_1124_39", + "ui/Image/icon/wpn_1124_40", + "ui/Image/icon/wpn_1124_41", + "ui/Image/icon/wpn_1124_42", + "ui/Image/icon/wpn_1124_43", + "ui/Image/icon/wpn_1124_44", + "ui/Image/icon/wpn_1124_45", + "ui/Image/icon/wpn_1124_46", + "ui/Image/icon/wpn_1124_47", + "ui/Image/icon/wpn_1124_48", + "ui/Image/icon/wpn_1124_49", + "ui/Image/icon/wpn_1124_50", + "ui/Image/icon/wpn_1124_51", + "ui/Image/icon/wpn_1124_52", + "ui/Image/icon/wpn_1124_53", + "ui/Image/icon/wpn_1124_54", + "ui/Image/icon/wpn_1124_55", + "ui/Image/icon/wpn_68_1", + "ui/Image/icon/wpn_68_10", + "ui/Image/icon/wpn_68_11", + "ui/Image/icon/wpn_68_12", + "ui/Image/icon/wpn_68_13", + "ui/Image/icon/wpn_68_14", + "ui/Image/icon/wpn_68_15", + "ui/Image/icon/wpn_68_16", + "ui/Image/icon/wpn_68_17", + "ui/Image/icon/wpn_68_18", + "ui/Image/icon/wpn_68_19", + "ui/Image/icon/wpn_68_2", + "ui/Image/icon/wpn_68_20", + "ui/Image/icon/wpn_68_21", + "ui/Image/icon/wpn_68_22", + "ui/Image/icon/wpn_68_23", + "ui/Image/icon/wpn_68_24", + "ui/Image/icon/wpn_68_25", + "ui/Image/icon/wpn_68_26", + "ui/Image/icon/wpn_68_27", + "ui/Image/icon/wpn_68_28", + "ui/Image/icon/wpn_68_29", + "ui/Image/icon/wpn_68_3", + "ui/Image/icon/wpn_68_30", + "ui/Image/icon/wpn_68_31", + "ui/Image/icon/wpn_68_32", + "ui/Image/icon/wpn_68_33", + "ui/Image/icon/wpn_68_34", + "ui/Image/icon/wpn_68_35", + "ui/Image/icon/wpn_68_36", + "ui/Image/icon/wpn_68_37", + "ui/Image/icon/wpn_68_38", + "ui/Image/icon/wpn_68_39", + "ui/Image/icon/wpn_68_4", + "ui/Image/icon/wpn_68_40", + "ui/Image/icon/wpn_68_41", + "ui/Image/icon/wpn_68_42", + "ui/Image/icon/wpn_68_43", + "ui/Image/icon/wpn_68_44", + "ui/Image/icon/wpn_68_45", + "ui/Image/icon/wpn_68_46", + "ui/Image/icon/wpn_68_47", + "ui/Image/icon/wpn_68_48", + "ui/Image/icon/wpn_68_49", + "ui/Image/icon/wpn_68_5", + "ui/Image/icon/wpn_68_50", + "ui/Image/icon/wpn_68_51", + "ui/Image/icon/wpn_68_52", + "ui/Image/icon/wpn_68_53", + "ui/Image/icon/wpn_68_54", + "ui/Image/icon/wpn_68_55", + "ui/Image/icon/wpn_68_56", + "ui/Image/icon/wpn_68_57", + "ui/Image/icon/wpn_68_58", + "ui/Image/icon/wpn_68_59", + "ui/Image/icon/wpn_68_6", + "ui/Image/icon/wpn_68_60", + "ui/Image/icon/wpn_68_61", + "ui/Image/icon/wpn_68_62", + "ui/Image/icon/wpn_68_63", + "ui/Image/icon/wpn_68_64", + "ui/Image/icon/wpn_68_7", + "ui/Image/icon/wpn_68_8", + "ui/Image/icon/wpn_68_9", + "ui/Image/icon/wpn_brush01", + "ui/Image/icon/wpn_brush02", + "ui/Image/icon/wpn_brush03", + "ui/Image/icon/wpn_brush04", + "ui/Image/icon/wpn_brush05", + "ui/Image/icon/wpn_brush06", + "ui/Image/icon/wpn_brush07", + "ui/Image/icon/wpn_brush08", + "ui/Image/icon/wpn_brush09", + "ui/Image/icon/wpn_brush10", + "ui/Image/icon/wpn_brush11", + "ui/Image/icon/wpn_brush12", + "ui/Image/icon/wpn_brush13", + "ui/Image/icon/wpn_brush14", + "ui/Image/icon/wpn_brush15", + "ui/Image/icon/wpn_brush16", + "ui/Image/icon/wpn_brush17", + "ui/Image/icon/wpn_brush18", + "ui/Image/icon/wpn_brush19", + "ui/Image/icon/wpn_brush20", + "ui/Image/icon/wpn_brush21", + "ui/Image/icon/wpn_brush22", + "ui/Image/icon/wpn_brush23", + "ui/Image/icon/wpn_brush24", + "ui/Image/icon/wpn_brush25", + "ui/Image/icon/wpn_brush26", + "ui/Image/icon/wpn_brush27", + "ui/Image/icon/wpn_brush28", + "ui/Image/icon/wpn_brush29", + "ui/Image/icon/wpn_brush30", + "ui/Image/icon/wpn_brush_b_uni02", + "ui/Image/icon/wpn_brush_w_uni01", + "ui/Image/icon/wpn_brush_w_uni02", + "ui/Image/icon/wpn_bullet01", + "ui/Image/icon/wpn_bullet02", + "ui/Image/icon/wpn_bullet03", + "ui/Image/icon/wpn_bullet04", + "ui/Image/icon/wpn_bullet05", + "ui/Image/icon/wpn_bullet06", + "ui/Image/icon/wpn_bullet07", + "ui/Image/icon/wpn_bullet08", + "ui/Image/icon/wpn_bullet09", + "ui/Image/icon/wpn_bullet10", + "ui/Image/icon/wpn_bullet11", + "ui/Image/icon/wpn_bullet12", + "ui/Image/icon/wpn_bullet13", + "ui/Image/icon/wpn_bullet14", + "ui/Image/icon/wpn_bullet15", + "ui/Image/icon/wpn_bullet_b_05", + "ui/Image/icon/wpn_bullet_w_04", + "ui/Image/icon/wpn_cangjian30", + "ui/Image/icon/wpn_cangjian31", + "ui/Image/icon/wpn_cangjian32", + "ui/Image/icon/wpn_cangjian33", + "ui/Image/icon/wpn_cangjian_01", + "ui/Image/icon/wpn_cangjian_02", + "ui/Image/icon/wpn_cangjian_03", + "ui/Image/icon/wpn_cangjian_04", + "ui/Image/icon/wpn_cangjian_05", + "ui/Image/icon/wpn_cangjian_06", + "ui/Image/icon/wpn_cangjian_07", + "ui/Image/icon/wpn_cangjian_08", + "ui/Image/icon/wpn_cangjian_09", + "ui/Image/icon/wpn_cangjian_10", + "ui/Image/icon/wpn_cangjian_11", + "ui/Image/icon/wpn_cangjian_12", + "ui/Image/icon/wpn_cangjian_13", + "ui/Image/icon/wpn_cangjian_14", + "ui/Image/icon/wpn_cangjian_15", + "ui/Image/icon/wpn_cangjian_16", + "ui/Image/icon/wpn_cangjian_17", + "ui/Image/icon/wpn_cangjian_18", + "ui/Image/icon/wpn_cangjian_19", + "ui/Image/icon/wpn_cangjian_20", + "ui/Image/icon/wpn_cangjian_21", + "ui/Image/icon/wpn_cangjian_22", + "ui/Image/icon/wpn_cangjian_23", + "ui/Image/icon/wpn_cangjian_24", + "ui/Image/icon/wpn_cangjian_25", + "ui/Image/icon/wpn_cangjian_26", + "ui/Image/icon/wpn_cangjian_27", + "ui/Image/icon/wpn_cangjian_28", + "ui/Image/icon/wpn_cangjian_29", + "ui/Image/icon/wpn_cangyun_01", + "ui/Image/icon/wpn_cangyun_02", + "ui/Image/icon/wpn_cangyun_03", + "ui/Image/icon/wpn_cangyun_04", + "ui/Image/icon/wpn_cangyun_05", + "ui/Image/icon/wpn_cangyun_06", + "ui/Image/icon/wpn_cangyun_07", + "ui/Image/icon/wpn_cangyun_08", + "ui/Image/icon/wpn_cangyun_09", + "ui/Image/icon/wpn_cangyun_10", + "ui/Image/icon/wpn_cangyun_11", + "ui/Image/icon/wpn_cangyun_12", + "ui/Image/icon/wpn_cangyun_13", + "ui/Image/icon/wpn_cangyun_14", + "ui/Image/icon/wpn_cangyun_15", + "ui/Image/icon/wpn_cangyun_16", + "ui/Image/icon/wpn_cangyun_17", + "ui/Image/icon/wpn_cangyun_18", + "ui/Image/icon/wpn_cangyun_19", + "ui/Image/icon/wpn_cangyun_20", + "ui/Image/icon/wpn_cangyun_21", + "ui/Image/icon/wpn_cangyun_22", + "ui/Image/icon/wpn_cangyun_23", + "ui/Image/icon/wpn_cangyun_24", + "ui/Image/icon/wpn_cangyun_25", + "ui/Image/icon/wpn_cangyun_26", + "ui/Image/icon/wpn_cangyun_27", + "ui/Image/icon/wpn_cangyun_28", + "ui/Image/icon/wpn_cangyun_29", + "ui/Image/icon/wpn_cangyun_30", + "ui/Image/icon/wpn_cangyun_31", + "ui/Image/icon/wpn_cangyun_32", + "ui/Image/icon/wpn_chengwu_01", + "ui/Image/icon/wpn_chengwu_02", + "ui/Image/icon/wpn_chengwu_03", + "ui/Image/icon/wpn_chengwu_04", + "ui/Image/icon/wpn_chengwu_05", + "ui/Image/icon/wpn_chengwu_06", + "ui/Image/icon/wpn_chengwu_07", + "ui/Image/icon/wpn_chengwu_08", + "ui/Image/icon/wpn_chengwu_09", + "ui/Image/icon/wpn_chengwu_10", + "ui/Image/icon/wpn_chengwu_11", + "ui/Image/icon/wpn_chengwu_12", + "ui/Image/icon/wpn_chengwu_13", + "ui/Image/icon/wpn_chengwu_14", + "ui/Image/icon/wpn_chengwu_15", + "ui/Image/icon/wpn_chengwu_16", + "ui/Image/icon/wpn_chengwu_17", + "ui/Image/icon/wpn_chengwu_18", + "ui/Image/icon/wpn_chengwu_19", + "ui/Image/icon/wpn_chengwu_20", + "ui/Image/icon/wpn_chengwu_21", + "ui/Image/icon/wpn_chengwu_22", + "ui/Image/icon/wpn_chengwu_23", + "ui/Image/icon/wpn_chengwu_24", + "ui/Image/icon/wpn_chengwu_25", + "ui/Image/icon/wpn_chengwu_26", + "ui/Image/icon/wpn_chengwu_27", + "ui/Image/icon/wpn_chengwu_28", + "ui/Image/icon/wpn_chengwu_29", + "ui/Image/icon/wpn_chengwu_30", + "ui/Image/icon/wpn_chengwu_31", + "ui/Image/icon/wpn_chengwu_32", + "ui/Image/icon/wpn_chengwu_33", + "ui/Image/icon/wpn_class_brush1_w", + "ui/Image/icon/wpn_class_brush2_w", + "ui/Image/icon/wpn_class_brush3_w", + "ui/Image/icon/wpn_class_wand1_w", + "ui/Image/icon/wpn_class_wand2_w", + "ui/Image/icon/wpn_class_wand3_w", + "ui/Image/icon/wpn_double01", + "ui/Image/icon/wpn_double02", + "ui/Image/icon/wpn_double03", + "ui/Image/icon/wpn_double04", + "ui/Image/icon/wpn_double05", + "ui/Image/icon/wpn_double06", + "ui/Image/icon/wpn_double07", + "ui/Image/icon/wpn_double08", + "ui/Image/icon/wpn_double09", + "ui/Image/icon/wpn_double10", + "ui/Image/icon/wpn_double11", + "ui/Image/icon/wpn_double12", + "ui/Image/icon/wpn_double13", + "ui/Image/icon/wpn_double14", + "ui/Image/icon/wpn_double15", + "ui/Image/icon/wpn_double16", + "ui/Image/icon/wpn_double17", + "ui/Image/icon/wpn_double18", + "ui/Image/icon/wpn_double19", + "ui/Image/icon/wpn_double20", + "ui/Image/icon/wpn_double21", + "ui/Image/icon/wpn_double22", + "ui/Image/icon/wpn_double22b", + "ui/Image/icon/wpn_double23", + "ui/Image/icon/wpn_double23b", + "ui/Image/icon/wpn_double24", + "ui/Image/icon/wpn_double25", + "ui/Image/icon/wpn_double26", + "ui/Image/icon/wpn_double27", + "ui/Image/icon/wpn_double28", + "ui/Image/icon/wpn_double29", + "ui/Image/icon/wpn_double30", + "ui/Image/icon/wpn_double31", + "ui/Image/icon/wpn_double32", + "ui/Image/icon/wpn_double33", + "ui/Image/icon/wpn_double34", + "ui/Image/icon/wpn_double35", + "ui/Image/icon/wpn_double36", + "ui/Image/icon/wpn_double37", + "ui/Image/icon/wpn_double38", + "ui/Image/icon/wpn_double39", + "ui/Image/icon/wpn_double40", + "ui/Image/icon/wpn_double41", + "ui/Image/icon/wpn_double_b_uni02", + "ui/Image/icon/wpn_double_w_uni01", + "ui/Image/icon/wpn_double_w_uni02", + "ui/Image/icon/wpn_FB_0408_01", + "ui/Image/icon/wpn_FB_0408_02", + "ui/Image/icon/wpn_FB_0408_03", + "ui/Image/icon/wpn_FB_0408_04", + "ui/Image/icon/wpn_FB_0408_05", + "ui/Image/icon/wpn_FB_0408_06", + "ui/Image/icon/wpn_FB_0408_07", + "ui/Image/icon/wpn_FB_0408_08", + "ui/Image/icon/wpn_FB_0408_09", + "ui/Image/icon/wpn_FB_0408_10", + "ui/Image/icon/wpn_FB_0408_11", + "ui/Image/icon/wpn_fist_b_uni02", + "ui/Image/icon/wpn_fist_w_uni01", + "ui/Image/icon/wpn_fist_w_uni02", + "ui/Image/icon/wpn_GB_01", + "ui/Image/icon/wpn_GB_02", + "ui/Image/icon/wpn_GB_03", + "ui/Image/icon/wpn_GB_04", + "ui/Image/icon/wpn_GB_05", + "ui/Image/icon/wpn_GB_06", + "ui/Image/icon/wpn_GB_07", + "ui/Image/icon/wpn_GB_08", + "ui/Image/icon/wpn_GB_09", + "ui/Image/icon/wpn_GB_10", + "ui/Image/icon/wpn_GB_11", + "ui/Image/icon/wpn_GB_12", + "ui/Image/icon/wpn_GB_13", + "ui/Image/icon/wpn_GB_14", + "ui/Image/icon/wpn_GB_15", + "ui/Image/icon/wpn_GB_16", + "ui/Image/icon/wpn_GB_17", + "ui/Image/icon/wpn_GB_18", + "ui/Image/icon/wpn_GB_19", + "ui/Image/icon/wpn_GB_20", + "ui/Image/icon/wpn_GB_21", + "ui/Image/icon/wpn_GB_22", + "ui/Image/icon/wpn_GB_23", + "ui/Image/icon/wpn_GB_24", + "ui/Image/icon/wpn_GB_25", + "ui/Image/icon/wpn_GB_26", + "ui/Image/icon/wpn_GB_27", + "ui/Image/icon/wpn_GB_28", + "ui/Image/icon/wpn_JJC_0408_01", + "ui/Image/icon/wpn_JJC_0408_02", + "ui/Image/icon/wpn_JJC_0408_03", + "ui/Image/icon/wpn_JJC_0408_04", + "ui/Image/icon/wpn_JJC_0408_05", + "ui/Image/icon/wpn_JJC_0408_06", + "ui/Image/icon/wpn_JJC_0408_07", + "ui/Image/icon/wpn_JJC_0408_08", + "ui/Image/icon/wpn_JJC_0408_09", + "ui/Image/icon/wpn_JJC_0408_10", + "ui/Image/icon/wpn_JJC_0408_11", + "ui/Image/icon/wpn_knife1", + "ui/Image/icon/wpn_knife10", + "ui/Image/icon/wpn_knife11", + "ui/Image/icon/wpn_knife12", + "ui/Image/icon/wpn_knife13", + "ui/Image/icon/wpn_knife14", + "ui/Image/icon/wpn_knife15", + "ui/Image/icon/wpn_knife16", + "ui/Image/icon/wpn_knife17", + "ui/Image/icon/wpn_knife18", + "ui/Image/icon/wpn_knife19", + "ui/Image/icon/wpn_knife2", + "ui/Image/icon/wpn_knife20", + "ui/Image/icon/wpn_knife21", + "ui/Image/icon/wpn_knife22", + "ui/Image/icon/wpn_knife23", + "ui/Image/icon/wpn_knife24", + "ui/Image/icon/wpn_knife25", + "ui/Image/icon/wpn_knife3", + "ui/Image/icon/wpn_knife4", + "ui/Image/icon/wpn_knife5", + "ui/Image/icon/wpn_knife6", + "ui/Image/icon/wpn_knife7", + "ui/Image/icon/wpn_knife8", + "ui/Image/icon/wpn_knife9", + "ui/Image/icon/wpn_longdis01", + "ui/Image/icon/wpn_longdis02", + "ui/Image/icon/wpn_longdis03", + "ui/Image/icon/wpn_longdis04", + "ui/Image/icon/wpn_longdis05", + "ui/Image/icon/wpn_longdis06", + "ui/Image/icon/wpn_longdis07", + "ui/Image/icon/wpn_longdis08", + "ui/Image/icon/wpn_longdis09", + "ui/Image/icon/wpn_longdis10", + "ui/Image/icon/wpn_longdis11", + "ui/Image/icon/wpn_longdis12", + "ui/Image/icon/wpn_longdis13", + "ui/Image/icon/wpn_longdis14", + "ui/Image/icon/wpn_longdis15", + "ui/Image/icon/wpn_longdis16", + "ui/Image/icon/wpn_longdis17", + "ui/Image/icon/wpn_longdis18", + "ui/Image/icon/wpn_longdis19", + "ui/Image/icon/wpn_longdis20", + "ui/Image/icon/wpn_longdis21", + "ui/Image/icon/wpn_longdis22", + "ui/Image/icon/wpn_longdis23", + "ui/Image/icon/wpn_longdis24", + "ui/Image/icon/wpn_longdis25", + "ui/Image/icon/wpn_longdis26", + "ui/Image/icon/wpn_longdis27", + "ui/Image/icon/wpn_longdis28", + "ui/Image/icon/wpn_longdis29", + "ui/Image/icon/wpn_longdis_w_07", + "ui/Image/icon/wpn_mingjiao_01", + "ui/Image/icon/wpn_mingjiao_02", + "ui/Image/icon/wpn_mingjiao_03", + "ui/Image/icon/wpn_mingjiao_04", + "ui/Image/icon/wpn_spear01", + "ui/Image/icon/wpn_spear02", + "ui/Image/icon/wpn_spear03", + "ui/Image/icon/wpn_spear04", + "ui/Image/icon/wpn_spear05", + "ui/Image/icon/wpn_spear06", + "ui/Image/icon/wpn_spear07", + "ui/Image/icon/wpn_spear08", + "ui/Image/icon/wpn_spear09", + "ui/Image/icon/wpn_spear10", + "ui/Image/icon/wpn_spear11", + "ui/Image/icon/wpn_spear12", + "ui/Image/icon/wpn_spear13", + "ui/Image/icon/wpn_spear14", + "ui/Image/icon/wpn_spear15", + "ui/Image/icon/wpn_spear16", + "ui/Image/icon/wpn_spear17", + "ui/Image/icon/wpn_spear18", + "ui/Image/icon/wpn_spear19", + "ui/Image/icon/wpn_spear20", + "ui/Image/icon/wpn_spear21", + "ui/Image/icon/wpn_spear22", + "ui/Image/icon/wpn_spear23", + "ui/Image/icon/wpn_spear24", + "ui/Image/icon/wpn_spear25", + "ui/Image/icon/wpn_spear26", + "ui/Image/icon/wpn_spear27", + "ui/Image/icon/wpn_spear28", + "ui/Image/icon/wpn_spear29", + "ui/Image/icon/wpn_spear30", + "ui/Image/icon/wpn_spear31", + "ui/Image/icon/wpn_spear32", + "ui/Image/icon/wpn_spear33", + "ui/Image/icon/wpn_spear_b_uni02", + "ui/Image/icon/wpn_spear_w_uni01", + "ui/Image/icon/wpn_spear_w_uni02", + "ui/Image/icon/wpn_sword01", + "ui/Image/icon/wpn_sword02", + "ui/Image/icon/wpn_sword03", + "ui/Image/icon/wpn_sword04", + "ui/Image/icon/wpn_sword05", + "ui/Image/icon/wpn_sword06", + "ui/Image/icon/wpn_sword07", + "ui/Image/icon/wpn_sword08", + "ui/Image/icon/wpn_sword09", + "ui/Image/icon/wpn_sword10", + "ui/Image/icon/wpn_sword11", + "ui/Image/icon/wpn_sword12", + "ui/Image/icon/wpn_sword13", + "ui/Image/icon/wpn_sword14", + "ui/Image/icon/wpn_sword15", + "ui/Image/icon/wpn_sword16", + "ui/Image/icon/wpn_sword17", + "ui/Image/icon/wpn_sword18", + "ui/Image/icon/wpn_sword19", + "ui/Image/icon/wpn_sword20", + "ui/Image/icon/wpn_sword21", + "ui/Image/icon/wpn_sword22", + "ui/Image/icon/wpn_sword23", + "ui/Image/icon/wpn_sword24", + "ui/Image/icon/wpn_sword25", + "ui/Image/icon/wpn_sword26", + "ui/Image/icon/wpn_sword27", + "ui/Image/icon/wpn_sword28", + "ui/Image/icon/wpn_sword29", + "ui/Image/icon/wpn_sword30", + "ui/Image/icon/wpn_sword31", + "ui/Image/icon/wpn_sword32", + "ui/Image/icon/wpn_sword33", + "ui/Image/icon/wpn_sword34", + "ui/Image/icon/wpn_sword35", + "ui/Image/icon/wpn_sword36", + "ui/Image/icon/wpn_sword37", + "ui/Image/icon/wpn_sword38", + "ui/Image/icon/wpn_sword39", + "ui/Image/icon/wpn_sword40", + "ui/Image/icon/wpn_sword_b_uni02", + "ui/Image/icon/wpn_sword_w_uni01", + "ui/Image/icon/wpn_sword_w_uni02", + "ui/Image/icon/wpn_sword_w_uni05", + "ui/Image/icon/wpn_T9_1", + "ui/Image/icon/wpn_T9_10", + "ui/Image/icon/wpn_T9_11", + "ui/Image/icon/wpn_T9_12", + "ui/Image/icon/wpn_T9_13", + "ui/Image/icon/wpn_T9_14", + "ui/Image/icon/wpn_T9_15", + "ui/Image/icon/wpn_T9_16", + "ui/Image/icon/wpn_T9_17", + "ui/Image/icon/wpn_T9_18", + "ui/Image/icon/wpn_T9_19", + "ui/Image/icon/wpn_T9_2", + "ui/Image/icon/wpn_T9_20", + "ui/Image/icon/wpn_T9_21", + "ui/Image/icon/wpn_T9_22", + "ui/Image/icon/wpn_T9_23", + "ui/Image/icon/wpn_T9_24", + "ui/Image/icon/wpn_T9_25", + "ui/Image/icon/wpn_T9_26", + "ui/Image/icon/wpn_T9_27", + "ui/Image/icon/wpn_T9_28", + "ui/Image/icon/wpn_T9_29", + "ui/Image/icon/wpn_T9_3", + "ui/Image/icon/wpn_T9_30", + "ui/Image/icon/wpn_T9_31", + "ui/Image/icon/wpn_T9_32", + "ui/Image/icon/wpn_T9_33", + "ui/Image/icon/wpn_T9_34", + "ui/Image/icon/wpn_T9_35", + "ui/Image/icon/wpn_T9_36", + "ui/Image/icon/wpn_T9_37", + "ui/Image/icon/wpn_T9_38", + "ui/Image/icon/wpn_T9_39", + "ui/Image/icon/wpn_T9_4", + "ui/Image/icon/wpn_T9_40", + "ui/Image/icon/wpn_T9_41", + "ui/Image/icon/wpn_T9_42", + "ui/Image/icon/wpn_T9_43", + "ui/Image/icon/wpn_T9_44", + "ui/Image/icon/wpn_T9_45", + "ui/Image/icon/wpn_T9_46", + "ui/Image/icon/wpn_T9_47", + "ui/Image/icon/wpn_T9_48", + "ui/Image/icon/wpn_T9_49", + "ui/Image/icon/wpn_T9_5", + "ui/Image/icon/wpn_T9_50", + "ui/Image/icon/wpn_T9_51", + "ui/Image/icon/wpn_T9_52", + "ui/Image/icon/wpn_T9_53", + "ui/Image/icon/wpn_T9_54", + "ui/Image/icon/wpn_T9_55", + "ui/Image/icon/wpn_T9_6", + "ui/Image/icon/wpn_T9_7", + "ui/Image/icon/wpn_T9_8", + "ui/Image/icon/wpn_T9_9", + "ui/Image/icon/wpn_tangm17", + "ui/Image/icon/wpn_tangm18", + "ui/Image/icon/wpn_tangm19", + "ui/Image/icon/wpn_tangm20", + "ui/Image/icon/wpn_tangm_01", + "ui/Image/icon/wpn_tangm_02", + "ui/Image/icon/wpn_tangm_03", + "ui/Image/icon/wpn_tangm_04", + "ui/Image/icon/wpn_tangm_05", + "ui/Image/icon/wpn_tangm_06", + "ui/Image/icon/wpn_tangm_07", + "ui/Image/icon/wpn_tangm_08", + "ui/Image/icon/wpn_tangm_09", + "ui/Image/icon/wpn_tangm_10", + "ui/Image/icon/wpn_tangm_11", + "ui/Image/icon/wpn_tangm_12", + "ui/Image/icon/wpn_tangm_13", + "ui/Image/icon/wpn_tangm_14", + "ui/Image/icon/wpn_tangm_15", + "ui/Image/icon/wpn_tangm_16", + "ui/Image/icon/wpn_uni_brush1_w", + "ui/Image/icon/wpn_uni_brush2_w", + "ui/Image/icon/wpn_uni_brush3_w", + "ui/Image/icon/wpn_uni_double1_w", + "ui/Image/icon/wpn_uni_double2_w", + "ui/Image/icon/wpn_uni_double3_w", + "ui/Image/icon/wpn_uni_fist1_w", + "ui/Image/icon/wpn_uni_fist2_w", + "ui/Image/icon/wpn_uni_fist3_w", + "ui/Image/icon/wpn_uni_spear1_w", + "ui/Image/icon/wpn_uni_spear2_w", + "ui/Image/icon/wpn_uni_spear3_w", + "ui/Image/icon/wpn_uni_sword1_w", + "ui/Image/icon/wpn_uni_sword2_w", + "ui/Image/icon/wpn_uni_sword3_w", + "ui/Image/icon/wpn_uni_wand1_w", + "ui/Image/icon/wpn_uni_wand2_w", + "ui/Image/icon/wpn_uni_wand3_w", + "ui/Image/icon/wpn_wand01", + "ui/Image/icon/wpn_wand02", + "ui/Image/icon/wpn_wand03", + "ui/Image/icon/wpn_wand04", + "ui/Image/icon/wpn_wand05", + "ui/Image/icon/wpn_wand06", + "ui/Image/icon/wpn_wand07", + "ui/Image/icon/wpn_wand08", + "ui/Image/icon/wpn_wand09", + "ui/Image/icon/wpn_wand10", + "ui/Image/icon/wpn_wand11", + "ui/Image/icon/wpn_wand12", + "ui/Image/icon/wpn_wand13", + "ui/Image/icon/wpn_wand14", + "ui/Image/icon/wpn_wand15", + "ui/Image/icon/wpn_wand16", + "ui/Image/icon/wpn_wand17", + "ui/Image/icon/wpn_wand18", + "ui/Image/icon/wpn_wand19", + "ui/Image/icon/wpn_wand20", + "ui/Image/icon/wpn_wand21", + "ui/Image/icon/wpn_wand22", + "ui/Image/icon/wpn_wand23", + "ui/Image/icon/wpn_wand24", + "ui/Image/icon/wpn_wand25", + "ui/Image/icon/wpn_wand26", + "ui/Image/icon/wpn_wand27", + "ui/Image/icon/wpn_wand28", + "ui/Image/icon/wpn_wand29", + "ui/Image/icon/wpn_wand30", + "ui/Image/icon/wpn_wand31", + "ui/Image/icon/wpn_wand_b_uni02", + "ui/Image/icon/wpn_wand_w_uni01", + "ui/Image/icon/wpn_wand_w_uni02", + "ui/Image/icon/wpn_wudu_01", + "ui/Image/icon/wpn_wudu_02", + "ui/Image/icon/wpn_wudu_03", + "ui/Image/icon/wpn_wudu_04", + "ui/Image/icon/wpn_wudu_05", + "ui/Image/icon/wpn_wudu_06", + "ui/Image/icon/wpn_wudu_07", + "ui/Image/icon/wpn_wudu_08", + "ui/Image/icon/wpn_wudu_09", + "ui/Image/icon/wpn_wudu_10", + "ui/Image/icon/wpn_wudu_11", + "ui/Image/icon/wpn_wudu_12", + "ui/Image/icon/wpn_wudu_13", + "ui/Image/icon/wpn_wudu_14", + "ui/Image/icon/wpn_wudu_15", + "ui/Image/icon/wpn_wudu_16", + "ui/Image/icon/wpn_wudu_17", + "ui/Image/icon/wpn_wudu_18", + "ui/Image/icon/wpn_wudu_19", + "ui/Image/icon/wpn_wudu_20", + "ui/Image/icon/wpn_wudu_21", + "ui/Image/icon/wpn_xiaochengwu_01", + "ui/Image/icon/wpn_xiaochengwu_010", + "ui/Image/icon/wpn_xiaochengwu_02", + "ui/Image/icon/wpn_xiaochengwu_03", + "ui/Image/icon/wpn_xiaochengwu_04", + "ui/Image/icon/wpn_xiaochengwu_05", + "ui/Image/icon/wpn_xiaochengwu_06", + "ui/Image/icon/wpn_xiaochengwu_07", + "ui/Image/icon/wpn_xiaochengwu_08", + "ui/Image/icon/wpn_xiaochengwu_09", + "ui/Image/icon/wu", + "ui/Image/icon/wudu_book_1", + "ui/Image/icon/wudu_book_2", + "ui/Image/icon/wudu_book_3", + "ui/Image/icon/wudu_book_4", + "ui/Image/icon/wudu_book_5", + "ui/Image/icon/wudu_btxj_1", + "ui/Image/icon/wudu_btxj_2", + "ui/Image/icon/wudu_btxj_3", + "ui/Image/icon/wudu_btxj_4", + "ui/Image/icon/wudu_btxj_5", + "ui/Image/icon/wudu_btxj_6", + "ui/Image/icon/wudu_chongwu_1", + "ui/Image/icon/wudu_chongwu_2", + "ui/Image/icon/wudu_chongwu_3", + "ui/Image/icon/wudu_chongwu_4", + "ui/Image/icon/wudu_chongwu_5", + "ui/Image/icon/wudu_chongwu_6", + "ui/Image/icon/wudu_chongwu_7", + "ui/Image/icon/wudu_chongwu_8", + "ui/Image/icon/wudu_dhyl_1", + "ui/Image/icon/wudu_dhyl_2", + "ui/Image/icon/wudu_dhyl_3", + "ui/Image/icon/wudu_dhyl_4", + "ui/Image/icon/wudu_dhyl_5", + "ui/Image/icon/wudu_dhyl_6", + "ui/Image/icon/wudu_dhyl_7", + "ui/Image/icon/wudu_dhyl_8", + "ui/Image/icon/wudu_dhyl_9", + "ui/Image/icon/wudu_neigong_1", + "ui/Image/icon/wudu_neigong_2", + "ui/Image/icon/wudu_ptgj_1", + "ui/Image/icon/wudu_shuliandu_1", + "ui/Image/icon/wudu_shuliandu_2", + "ui/Image/icon/wudu_shuliandu_3", + "ui/Image/icon/wudu_taolu_1", + "ui/Image/icon/wudu_taolu_2", + "ui/Image/icon/wudu_taolu_3", + "ui/Image/icon/wudu_taolu_4", + "ui/Image/icon/wudu_wgzj_1", + "ui/Image/icon/wudu_wgzj_2", + "ui/Image/icon/wudu_wgzj_3", + "ui/Image/icon/wudu_wgzj_4", + "ui/Image/icon/wudu_wgzj_5", + "ui/Image/icon/wudu_wgzj_6", + "ui/Image/icon/wudu_wgzj_7", + "ui/Image/icon/wudu_wxtl_1", + "ui/Image/icon/wudu_wxtl_2", + "ui/Image/icon/wudu_wxtl_3", + "ui/Image/icon/wudu_wxtl_4", + "ui/Image/icon/wudu_wxtl_5", + "ui/Image/icon/wushipin", + "ui/Image/icon/wu_yanshenguang", + "ui/Image/icon/wz_0527_01", + "ui/Image/icon/wz_0527_02", + "ui/Image/icon/wz_0527_03", + "ui/Image/icon/WZ_0804_01", + "ui/Image/icon/WZ_0804_02", + "ui/Image/icon/xianzimiaotai", + "ui/Image/icon/xiaolongxia", + "ui/Image/icon/xingyue_01", + "ui/Image/icon/XiuWei01", + "ui/Image/icon/yanhuaguajian", + "ui/Image/icon/yijialuanzhen", + "ui/Image/icon/yinyuanhui01", + "ui/Image/icon/yinyuanhui1", + "ui/Image/icon/yinyuanhui2", + "ui/Image/icon/yinyuanhui3", + "ui/Image/icon/yinyuanhui4", + "ui/Image/icon/yuandanhuodong01", + "ui/Image/icon/yuandanhuodong02", + "ui/Image/icon/yuandanhuodong03", + "ui/Image/icon/yuandanhuodong04", + "ui/Image/icon/yuandanhuodong05", + "ui/Image/icon/yuandanhuodong06", + "ui/Image/icon/yuandanhuodong07", + "ui/Image/icon/yuandanhuodong08", + "ui/Image/icon/yuandanhuodong09", + "ui/Image/icon/yuandanhuodong10", + "ui/Image/icon/yuandanhuodong11", + "ui/Image/icon/yuandanhuodong12", + "ui/Image/icon/yuandanhuodong13", + "ui/Image/icon/yuandanhuodong14", + "ui/Image/icon/yuandanhuodong15", + "ui/Image/icon/yuandanhuodong16", + "ui/Image/icon/yuandanhuodong17", + "ui/Image/icon/yuandanhuodong18", + "ui/Image/icon/yuandanhuodong19", + "ui/Image/icon/yuandanhuodong20", + "ui/Image/icon/yuandanhuodong21", + "ui/Image/icon/yuandanhuodong22", + "ui/Image/icon/yuandanhuodong23", + "ui/Image/icon/yuandanhuodong24", + "ui/Image/icon/yuandanhuodong25", + "ui/Image/icon/yuandanhuodong26", + "ui/Image/icon/yuandanhuodong27", + "ui/Image/icon/yuandanhuodong28", + "ui/Image/icon/yuandanhuodong29", + "ui/Image/icon/yuandanhuodong30", + "ui/Image/icon/yuandanhuodong31", + "ui/Image/icon/yuandanhuodong32", + "ui/Image/icon/yuandanhuodong33", + "ui/Image/icon/yuebing_01", + "ui/Image/icon/yuebing_02", + "ui/Image/icon/yugutou", + "ui/Image/icon/YuRui", + "ui/Image/icon/zgf_01", + "ui/Image/icon/zgf_02", + "ui/Image/icon/zhongchongjian", + "ui/Image/icon/zhongqiuhuodong01", + "ui/Image/icon/zhongqiuhuodong02", + "ui/Image/icon/zhongtiao03", + "ui/Image/icon/zhongtiao06", + "ui/Image/icon/ziyun", + "ui/Image/icon/ZQ_0417_01", + "ui/Image/icon/ZQ_0417_02", + "ui/Image/icon/ZQ_0821_1", + "ui/Image/icon/ZQ_0821_2", + "ui/Image/icon/zuoq_yt", + "ui/Image/item_pic/19706", + "ui/Image/item_pic/19707", + "ui/Image/item_pic/19708", + "ui/Image/item_pic/19709", + "ui/Image/item_pic/19710", + "ui/Image/item_pic/19711", + "ui/Image/item_pic/2229", + "ui/Image/item_pic/2230", + "ui/Image/item_pic/260", + "ui/Image/item_pic/261", + "ui/Image/item_pic/262", + "ui/Image/item_pic/263", + "ui/Image/item_pic/264", + "ui/Image/item_pic/265", + "ui/Image/item_pic/266", + "ui/Image/item_pic/267", + "ui/Image/item_pic/268", + "ui/Image/item_pic/269", + "ui/Image/item_pic/28602", + "ui/Image/item_pic/28603", + "ui/Image/item_pic/28604", + "ui/Image/item_pic/28605", + "ui/Image/item_pic/28606", + "ui/Image/item_pic/28607", + "ui/Image/item_pic/28608", + "ui/Image/item_pic/28609", + "ui/Image/item_pic/28610", + "ui/Image/item_pic/28611", + "ui/Image/item_pic/28612", + "ui/Image/item_pic/28613", + "ui/Image/item_pic/28614", + "ui/Image/item_pic/28615", + "ui/Image/item_pic/28745", + "ui/Image/item_pic/28746", + "ui/Image/item_pic/40577", + "ui/Image/item_pic/40578", + "ui/Image/item_pic/41539", + "ui/Image/item_pic/41540", + "ui/Image/item_pic/45467", + "ui/Image/item_pic/45468", + "ui/Image/item_pic/45469", + "ui/Image/item_pic/45470", + "ui/Image/item_pic/45471", + "ui/Image/item_pic/45472", + "ui/Image/item_pic/45473", + "ui/Image/item_pic/45474", + "ui/Image/item_pic/45475", + "ui/Image/item_pic/45476", + "ui/Image/item_pic/45477", + "ui/Image/item_pic/45478", + "ui/Image/item_pic/45479", + "ui/Image/item_pic/45480", + "ui/Image/item_pic/45481", + "ui/Image/item_pic/45482", + "ui/Image/item_pic/45483", + "ui/Image/item_pic/45484", + "ui/Image/item_pic/45485", + "ui/Image/item_pic/45486", + "ui/Image/item_pic/45487", + "ui/Image/item_pic/45488", + "ui/Image/item_pic/45489", + "ui/Image/item_pic/45490", + "ui/Image/item_pic/45491", + "ui/Image/item_pic/45492", + "ui/Image/item_pic/45493", + "ui/Image/item_pic/45494", + "ui/Image/item_pic/45495", + "ui/Image/item_pic/45496", + "ui/Image/item_pic/45497", + "ui/Image/item_pic/45498", + "ui/Image/item_pic/45499", + "ui/Image/item_pic/45500", + "ui/Image/item_pic/45501", + "ui/Image/item_pic/45502", + "ui/Image/item_pic/45503", + "ui/Image/item_pic/45504", + "ui/Image/item_pic/45505", + "ui/Image/item_pic/45506", + "ui/Image/item_pic/45507", + "ui/Image/item_pic/45508", + "ui/Image/item_pic/45509", + "ui/Image/item_pic/45510", + "ui/Image/item_pic/45511", + "ui/Image/item_pic/45512", + "ui/Image/item_pic/45513", + "ui/Image/item_pic/45514", + "ui/Image/item_pic/45515", + "ui/Image/item_pic/45516", + "ui/Image/item_pic/45517", + "ui/Image/item_pic/45518", + "ui/Image/item_pic/45519", + "ui/Image/item_pic/45520", + "ui/Image/item_pic/45521", + "ui/Image/item_pic/45522", + "ui/Image/item_pic/45523", + "ui/Image/item_pic/45524", + "ui/Image/item_pic/45525", + "ui/Image/item_pic/45526", + "ui/Image/item_pic/45527", + "ui/Image/item_pic/45528", + "ui/Image/item_pic/45529", + "ui/Image/item_pic/45530", + "ui/Image/item_pic/45531", + "ui/Image/item_pic/45532", + "ui/Image/item_pic/45533", + "ui/Image/item_pic/45534", + "ui/Image/item_pic/45535", + "ui/Image/item_pic/45536", + "ui/Image/item_pic/45537", + "ui/Image/item_pic/45538", + "ui/Image/item_pic/45539", + "ui/Image/item_pic/45540", + "ui/Image/item_pic/45541", + "ui/Image/item_pic/45542", + "ui/Image/item_pic/45543", + "ui/Image/item_pic/45544", + "ui/Image/item_pic/45545", + "ui/Image/item_pic/45546", + "ui/Image/item_pic/45547", + "ui/Image/item_pic/45548", + "ui/Image/item_pic/45549", + "ui/Image/item_pic/45550", + "ui/Image/item_pic/45551", + "ui/Image/item_pic/45552", + "ui/Image/item_pic/45553", + "ui/Image/item_pic/45554", + "ui/Image/item_pic/45555", + "ui/Image/item_pic/45556", + "ui/Image/item_pic/45557", + "ui/Image/item_pic/45558", + "ui/Image/item_pic/45559", + "ui/Image/item_pic/45560", + "ui/Image/item_pic/45561", + "ui/Image/item_pic/45562", + "ui/Image/item_pic/45563", + "ui/Image/item_pic/45564", + "ui/Image/item_pic/45565", + "ui/Image/item_pic/45566", + "ui/Image/item_pic/45567", + "ui/Image/item_pic/45568", + "ui/Image/item_pic/45569", + "ui/Image/item_pic/45570", + "ui/Image/item_pic/45571", + "ui/Image/item_pic/45572", + "ui/Image/item_pic/45573", + "ui/Image/item_pic/45574", + "ui/Image/item_pic/46167", + "ui/Image/item_pic/46168", + "ui/Image/item_pic/46907", + "ui/Image/item_pic/46908", + "ui/Image/item_pic/52787", + "ui/Image/item_pic/52789", + "ui/Image/item_pic/52791", + "ui/Image/item_pic/52792", + "ui/Image/item_pic/53087", + "ui/Image/item_pic/53544", + "ui/Image/item_pic/59879", + "ui/Image/item_pic/59880", + "ui/Image/item_pic/59881", + "ui/Image/item_pic/59882", + "ui/Image/item_pic/59883", + "ui/Image/item_pic/59884", + "ui/Image/item_pic/59885", + "ui/Image/item_pic/59886", + "ui/Image/item_pic/59887", + "ui/Image/item_pic/59888", + "ui/Image/item_pic/59889", + "ui/Image/item_pic/59890", + "ui/Image/item_pic/59891", + "ui/Image/item_pic/59892", + "ui/Image/item_pic/59893", + "ui/Image/item_pic/59894", + "ui/Image/item_pic/59895", + "ui/Image/item_pic/59896", + "ui/Image/item_pic/59897", + "ui/Image/item_pic/90783", + "ui/Image/item_pic/90784", + "ui/Image/item_pic/90785", + "ui/Image/item_pic/90786", + "ui/Image/item_pic/90787", + "ui/Image/item_pic/90788", + "ui/Image/item_pic/90789", + "ui/Image/item_pic/90790", + "ui/Image/item_pic/90791", + "ui/Image/item_pic/90792", + "ui/Image/item_pic/90793", + "ui/Image/item_pic/90794", + "ui/Image/item_pic/91377", + "ui/Image/item_pic/91378", + "ui/Image/item_pic/92117", + "ui/Image/item_pic/92118", + "ui/Image/item_pic/93365", + "ui/Image/item_pic/93366", + "ui/Image/JX3Library/kongfu", + "ui/Image/JX3Library/世界频道", + "ui/Image/JX3Library/名字拜师", + "ui/Image/JX3Library/名字收徒", + "ui/Image/JX3Library/师徒界面更换", + "ui/Image/JX3Library/快捷拜师", + "ui/Image/JX3Library/快捷收徒", + "ui/Image/JX3Library/打开师徒", + "ui/Image/JX3Library/拜师", + "ui/Image/JX3Library/收徒弟", + "ui/Image/login/Carriage", + "ui/Image/login/CharButton", + "ui/Image/LootPanel/LootPanel", + "ui/Image/LootPanel/PlayerView", + "ui/Image/MiddleMap/MapWindow", + "ui/Image/MiddleMap/MapWindow2", + "ui/Image/MiniGame/bug", + "ui/Image/MiniGame/Vegetable", + "ui/Image/Minimap/BattleMinimap", + "ui/Image/Minimap/MapMark", + "ui/Image/Minimap/Minimap", + "ui/Image/Minimap/Minimap2", + "ui/Image/Minimap/Minimap3", + "ui/Image/NewSkillsBG/Cangjian", + "ui/Image/OperationActivity/OperationAcitivty", + "ui/Image/OperationActivity/OperationAcitivty10", + "ui/Image/OperationActivity/OperationAcitivty11", + "ui/Image/OperationActivity/OperationAcitivty12", + "ui/Image/OperationActivity/OperationAcitivty2", + "ui/Image/OperationActivity/OperationAcitivty3", + "ui/Image/OperationActivity/OperationAcitivty4", + "ui/Image/OperationActivity/OperationAcitivty5", + "ui/Image/OperationActivity/OperationAcitivty6", + "ui/Image/OperationActivity/OperationAcitivty7", + "ui/Image/OperationActivity/OperationAcitivty8", + "ui/Image/OperationActivity/OperationAcitivty9", + "ui/Image/Pets/newPets", + "ui/Image/Pets/newPetsName", + "ui/Image/PlayerAvatar/CangYun_1_DK_1", + "ui/Image/PlayerAvatar/CJ_1_DK_1", + "ui/Image/PlayerAvatar/CY_1_DK_1", + "ui/Image/PlayerAvatar/GB_1_DK_1", + "ui/Image/PlayerAvatar/gif_f1", + "ui/Image/PlayerAvatar/gif_f2", + "ui/Image/PlayerAvatar/gif_M1", + "ui/Image/PlayerAvatar/gif_m2", + "ui/Image/PlayerAvatar/JH_1_DK_1", + "ui/Image/PlayerAvatar/MJ_1_DK_1", + "ui/Image/PlayerAvatar/QX_1_DK_1", + "ui/Image/PlayerAvatar/SL_1_DK_1", + "ui/Image/PlayerAvatar/TC_1_DK_1", + "ui/Image/PlayerAvatar/TM_1_DK_1", + "ui/Image/PlayerAvatar/WD_1_DK_1", + "ui/Image/PlayerAvatar/WH_1_DK_1", + "ui/Image/push/LooksUI", + "ui/Image/QuestPanel/QuestPanel", + "ui/Image/QuestPanel/QuestPanelButton", + "ui/Image/QuestPanel/QuestPanelPart", + "ui/Image/QuicklySetPanel/QuicklySetPanel1", + "ui/Image/QuicklySetPanel/QuicklySetPanel2", + "ui/Image/QuicklySetPanel/Setting1", + "ui/Image/QuicklySetPanel/Setting2", + "ui/Image/QuicklySetPanel/Setting3", + "ui/Image/QuicklySetPanel/Setting4", + "ui/Image/QuicklySetPanel/Setting5", + "ui/Image/SprintHelp/CJ", + "ui/Image/SprintHelp/CY", + "ui/Image/SprintHelp/MJ", + "ui/Image/SprintHelp/QX1", + "ui/Image/SprintHelp/QX2", + "ui/Image/SprintHelp/SL", + "ui/Image/SprintHelp/TC", + "ui/Image/SprintHelp/TCvsCY", + "ui/Image/SprintHelp/TM", + "ui/Image/SprintHelp/WD", + "ui/Image/SprintHelp/WH", + "ui/Image/TargetPanel/CangJianAnimation1", + "ui/Image/TargetPanel/CangJianAnimation2", + "ui/Image/TargetPanel/FramePlayer", + "ui/Image/TargetPanel/Player", + "ui/Image/TargetPanel/Target", + "ui/Image/Teaching/dakaishangdian", + "ui/Image/Teaching/dazuo", + "ui/Image/Teaching/DiRen", + "ui/Image/Teaching/Doodad", + "ui/Image/Teaching/DuiHua", + "ui/Image/Teaching/fuchushuimian", + "ui/Image/Teaching/GouMai", + "ui/Image/Teaching/hongmingguai", + "ui/Image/Teaching/jineng", + "ui/Image/Teaching/JingTouShangXia", + "ui/Image/Teaching/JingTouYuanJin", + "ui/Image/Teaching/luopan", + "ui/Image/Teaching/Map", + "ui/Image/Teaching/Pmianban", + "ui/Image/Teaching/qianjixia", + "ui/Image/Teaching/QingGong", + "ui/Image/Teaching/R-mous", + "ui/Image/Teaching/renwu", + "ui/Image/Teaching/ShiQu", + "ui/Image/Teaching/ShiYongBeiBao", + "ui/Image/Teaching/ShiYongJiNeng", + "ui/Image/Teaching/shubiaozhongjian", + "ui/Image/Teaching/xiuli", + "ui/Image/Teaching/XuanZhuanShiJiao", + "ui/Image/Teaching/yidong", + "ui/Image/Teaching/yuanchengfeiji", + "ui/Image/Teaching/ZhuangBeiDaoJv", + "ui/Image/Teaching/zhuangbeipinzhi", + "ui/Image/Teaching/zhuangbeixiuli", + "ui/Image/Teaching/商店", + "ui/Image/Teaching/大图1", + "ui/Image/Teaching/大图2", + "ui/Image/Teaching/好友点赞", + "ui/Image/TradePanel/TradePanelShadow1", + "ui/Image/TradePanel/TradePanelShadow2", + "ui/Image/UICommon/AchievementPanel", + "ui/Image/UICommon/AchievementPanel2", + "ui/Image/UICommon/ActivePopularize", + "ui/Image/UICommon/ActivePopularize2", + "ui/Image/UICommon/ActivePopularize3", + "ui/Image/UICommon/ArenaIntroduction", + "ui/Image/UICommon/Arena_JJC1", + "ui/Image/UICommon/Arena_JJC2", + "ui/Image/UICommon/Arena_JJC3", + "ui/Image/UICommon/Arena_JJC4", + "ui/Image/UICommon/Arena_JJC5", + "ui/Image/UICommon/Arena_JJC6", + "ui/Image/UICommon/Arena_JJC7", + "ui/Image/UICommon/BatrleFiled2", + "ui/Image/UICommon/BattleFiled", + "ui/Image/UICommon/BigBtn", + "ui/Image/UICommon/BlackMarket", + "ui/Image/UICommon/Camp", + "ui/Image/UICommon/cangyun2", + "ui/Image/UICommon/CanYun", + "ui/Image/UICommon/CanYun3", + "ui/Image/UICommon/ChangjingSmallBG_1", + "ui/Image/UICommon/ChangjingSmallBG_2", + "ui/Image/UICommon/Chapter", + "ui/Image/UICommon/CommonPanel", + "ui/Image/UICommon/CommonPanel2", + "ui/Image/UICommon/CommonPanel3", + "ui/Image/UICommon/CommonPanel4", + "ui/Image/UICommon/CommonPanel5", + "ui/Image/UICommon/CommonPanel7", + "ui/Image/UICommon/CompassPanel", + "ui/Image/UICommon/CrossingChooseBG1", + "ui/Image/UICommon/CrossingChooseBG2", + "ui/Image/UICommon/CrossingChooseBG3", + "ui/Image/UICommon/CrossingChooseBG4", + "ui/Image/UICommon/CrossingChooseBG5", + "ui/Image/UICommon/CrossingChooseBG6", + "ui/Image/UICommon/CrossingPanel1", + "ui/Image/UICommon/CrossingPanel2", + "ui/Image/UICommon/CrossingPanel3", + "ui/Image/UICommon/CrossingPanel4", + "ui/Image/UICommon/CrossingPanel5", + "ui/Image/UICommon/CrossingPanel6", + "ui/Image/UICommon/CrossingPanel7", + "ui/Image/UICommon/CrossingPanel8", + "ui/Image/UICommon/EquipMagicChange", + "ui/Image/UICommon/ExteriorBox", + "ui/Image/UICommon/ExteriorBox2", + "ui/Image/UICommon/ExteriorBox3", + "ui/Image/UICommon/ExteriorFaceLift", + "ui/Image/UICommon/FaceLift1", + "ui/Image/UICommon/FaceLift2", + "ui/Image/UICommon/FaceLift3", + "ui/Image/UICommon/FaceLift4", + "ui/Image/UICommon/FaceList", + "ui/Image/UICommon/FBlist", + "ui/Image/UICommon/FBlistHome1", + "ui/Image/UICommon/Feedanimials", + "ui/Image/UICommon/FEPanel", + "ui/Image/UICommon/FEPanel3", + "ui/Image/UICommon/FindFriend1", + "ui/Image/UICommon/FindFriend2", + "ui/Image/UICommon/FindFriend3", + "ui/Image/UICommon/findFriend4", + "ui/Image/UICommon/Friend", + "ui/Image/UICommon/Friend2", + "ui/Image/UICommon/GoldTeam", + "ui/Image/UICommon/GoodFriends", + "ui/Image/UICommon/GuildMainPanel1", + "ui/Image/UICommon/GuildMainPanel2", + "ui/Image/UICommon/HairShop", + "ui/Image/UICommon/HelpPanel", + "ui/Image/UICommon/HorsePanel", + "ui/Image/UICommon/HorsePanel2", + "ui/Image/UICommon/HorsePanel3", + "ui/Image/UICommon/KoreaIcon", + "ui/Image/UICommon/KoreaIcon1", + "ui/Image/UICommon/Kuang_Cyclopaedia_Calender", + "ui/Image/UICommon/LearnKeyboard1", + "ui/Image/UICommon/LearnKeyboard2", + "ui/Image/UICommon/LearnKeyboard3", + "ui/Image/UICommon/LockOpen", + "ui/Image/UICommon/LockOpenBG1", + "ui/Image/UICommon/LockOpenBG2", + "ui/Image/UICommon/LoginCommon", + "ui/Image/UICommon/LoginSchool", + "ui/Image/UICommon/MailCommon", + "ui/Image/UICommon/NewCraft1", + "ui/Image/UICommon/NewCraft2", + "ui/Image/UICommon/newCraft4", + "ui/Image/UICommon/NewPet", + "ui/Image/UICommon/NewSkills1", + "ui/Image/UICommon/NewSkills2", + "ui/Image/UICommon/NewSkills3", + "ui/Image/UICommon/New_Cyclopaedia_Calender", + "ui/Image/UICommon/NPCGuidlines", + "ui/Image/UICommon/NPCGuidlines2", + "ui/Image/UICommon/PasswordPanel", + "ui/Image/UICommon/PlugIn", + "ui/Image/UICommon/PqUI1", + "ui/Image/UICommon/PqUI2", + "ui/Image/UICommon/PqUI3", + "ui/Image/UICommon/PqUI4", + "ui/Image/UICommon/pqUI5", + "ui/Image/UICommon/RaidTotal", + "ui/Image/UICommon/RankingPanel", + "ui/Image/UICommon/regionPQ1", + "ui/Image/UICommon/ScienceTree", + "ui/Image/UICommon/ScienceTree2", + "ui/Image/UICommon/ScienceTreeNode", + "ui/Image/UICommon/ScienceTreeNode2", + "ui/Image/UICommon/SettingSceneSlected", + "ui/Image/UICommon/ShopEntry", + "ui/Image/UICommon/Skills", + "ui/Image/UICommon/skills2", + "ui/Image/UICommon/skills3", + "ui/Image/UICommon/snsPanel", + "ui/Image/UICommon/Talk_face", + "ui/Image/UICommon/Talk_face1", + "ui/Image/UICommon/Talk_face2", + "ui/Image/UICommon/Teaching1", + "ui/Image/UICommon/Teaching2", + "ui/Image/UICommon/Teaching3", + "ui/Image/UICommon/TeamBuilding", + "ui/Image/UICommon/TheFlop", + "ui/Image/UICommon/TopMenu", + "ui/Image/UICommon/TWLogo", + "ui/Image/UICommon/TwoDimensionalCode", + "ui/Image/UICommon/TwoDimensionalCode1", + "ui/Image/UICommon/VH1", + "ui/Image/UICommon/VH2", + "ui/Image/UICommon/xiangqi1", + "ui/Image/UICommon/xiangqi2", + "ui/Image/UICommon/xiangqibg", + "ui/Image/UICommon/xiangqiresult", + "ui/Image/UICommon/Yirong", + "ui/Image/UICommon/yirong10", + "ui/Image/UICommon/yirong11", + "ui/Image/UICommon/yirong12", + "ui/Image/UICommon/yirong2", + "ui/Image/UICommon/yirong3", + "ui/Image/UICommon/yirong4", + "ui/Image/UICommon/yirong5", + "ui/Image/UICommon/yirong6", + "ui/Image/UICommon/yirong7", + "ui/Image/UICommon/yirong8", + "ui/Image/UICommon/yirong9", + "ui/Image/WorldMap/city1", + "ui/Image/WorldMap/city2", + "ui/Image/WorldMap/city3", + "ui/Image/WorldMap/city4", + "ui/Image/WorldMap/jiaotong1", + "ui/Image/WorldMap/jiaotong2", + "ui/Image/WorldMap/jiaotong3", + "ui/Image/WorldMap/suoluetu", +} diff --git a/MYDev_UITexViewer/info.ini b/MYDev_UITexViewer/info.ini new file mode 100644 index 000000000..39f8f37dc --- /dev/null +++ b/MYDev_UITexViewer/info.ini @@ -0,0 +1,8 @@ +[MYDev_UITexViewer] +name=图片浏览器 +desc=[开发者工具] Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_UITexViewer.lua +package=MY diff --git a/MYDev_UITexViewer/info.ini.zh_TW b/MYDev_UITexViewer/info.ini.zh_TW new file mode 100644 index 000000000..71d47fc34 --- /dev/null +++ b/MYDev_UITexViewer/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MYDev_UITexViewer] +name=鍦栫墖鐎忚鍣 +desc=[闁嬬櫦鑰呭伐鍏穄 Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_UITexViewer.lua +package=MY diff --git a/MYDev_UITexViewer/lang/zhcn.jx3dat b/MYDev_UITexViewer/lang/zhcn.jx3dat new file mode 100644 index 000000000..26ba17050 --- /dev/null +++ b/MYDev_UITexViewer/lang/zhcn.jx3dat @@ -0,0 +1,6 @@ +return { + ['MYDev_UITexViewer'] = '图像资源', + ['UITexViewer'] = '图像资源', + ['UITexPath'] = '图像资源地址', + ['(left click to generate xml)'] = '(左键点击可生成XML)', +} diff --git a/MYDev_UITexViewer/lang/zhtw.jx3dat b/MYDev_UITexViewer/lang/zhtw.jx3dat new file mode 100644 index 000000000..71db1a247 --- /dev/null +++ b/MYDev_UITexViewer/lang/zhtw.jx3dat @@ -0,0 +1,6 @@ +return { + ['MYDev_UITexViewer'] = '鍦栧儚璩囨簮', + ['UITexViewer'] = '鍦栧儚璩囨簮', + ['UITexPath'] = '鍦栧儚璩囨簮鍦板潃', + ['(left click to generate xml)'] = '(宸﹂嵉榛炴搳鍙敓鎴怷ML)', +} diff --git a/MYDev_UITexViewer/src/MYDev_UITexViewer.lua b/MYDev_UITexViewer/src/MYDev_UITexViewer.lua new file mode 100644 index 000000000..74828ed7a --- /dev/null +++ b/MYDev_UITexViewer/src/MYDev_UITexViewer.lua @@ -0,0 +1,135 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 开发者工具 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MYDev_UITexViewer/MYDev_UITexViewer' +local PLUGIN_NAME = 'MYDev_UITexViewer' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MYDev_UITexViewer' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MYDev_UITexViewer', { + szUITexPath = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MYDev_UITexViewer'], + szDescription = X.MakeCaption({ + _L['UITexPath'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, +}) +local D = {} + +local PS = {} + +function PS.IsRestricted() + return not X.IsDebugging('Dev_UITexViewer') +end + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local w, h = ui:Size() + local x, y = 20, 20 + + D.tUITexList = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MYDev_UITexViewer/data/data.jx3dat') or {} + + local uiBoard = ui:Append('WndScrollHandleBox', { + name = 'WndScrollHandleBox_ImageList', + x = x, y = y + 25, w = w - 21, h = h - 70, + handleStyle = 3, + }) + + local uiEdit = ui:Append('WndEditBox', { + name = 'WndEdit_Copy', + x = x, y = h - 30, w = w - 20, h = 25, + multiline = true, + }) + + local function DrawBoard() + local szPath = O.szUITexPath:gsub('/', '\\'):gsub('\\\\', '\\'):gsub('%.UITex$', ''):gsub('%.uitex$', '') + + local tInfo = KG_Table.Load(szPath .. '.txt', { + -- 图片文件帧信息表的表头名字 + {f = 'i', t = 'nFrame' }, -- 图片帧 ID + {f = 'i', t = 'nLeft' }, -- 帧位置: 距离左侧像素(X位置) + {f = 'i', t = 'nTop' }, -- 帧位置: 距离顶端像素(Y位置) + {f = 'i', t = 'nWidth' }, -- 帧宽度 + {f = 'i', t = 'nHeight'}, -- 帧高度 + {f = 's', t = 'szFile' }, -- 帧来源文件(无作用) + }, FILE_OPEN_MODE.NORMAL) + if not tInfo then + return + end + + uiBoard:Clear() + for i = 0, 256 do + local tLine = tInfo:Search(i) + if not tLine then + break + end + + if tLine.nWidth ~= 0 and tLine.nHeight ~= 0 then + uiBoard:Append('Image', { + name = 'Image_' .. i, + w = tLine.nWidth, h = tLine.nHeight, + alpha = 220, + image = szPath .. '.UITex', imageFrame = tLine.nFrame, + tip = { + render = szPath .. '.UITex#' .. i .. '\n' .. tLine.nWidth .. 'x' .. tLine.nHeight .. '\n' .. _L['(left click to generate xml)'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + onHover = function(bIn) + X.UI(this):Alpha((bIn and 255) or 220) + end, + onClick = function() + uiEdit:Text('w='..tLine.nWidth..' h='..tLine.nHeight..' path="' .. szPath .. '.UITex" frame=' .. i ..'') + end, + }) + end + end + end + + ui:Append('WndAutocomplete', { + name = 'WndAutocomplete_UITexPath', + x = x, y = y, w = w - 20, h = 25, + text = O.szUITexPath, + onChange = function(szText) + O.szUITexPath = szText + DrawBoard() + end, + onClick = function(nButton) + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + else + X.UI(this):Autocomplete('search', '') + end + end, + autocomplete = { + {'option', 'maxOption', 20}, + {'option', 'source', D.tUITexList}, + }, + }) + + DrawBoard() +end + +function PS.OnPanelDeactive(wnd) + D.tUITexList = nil + collectgarbage('collect') +end + +X.Panel.Register(_L['Development'], 'Dev_UITexViewer', _L['UITexViewer'], 'ui/Image/UICommon/BattleFiled.UITex|7', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MYDev_VarWatch/info.ini b/MYDev_VarWatch/info.ini new file mode 100644 index 000000000..34ce29ab9 --- /dev/null +++ b/MYDev_VarWatch/info.ini @@ -0,0 +1,8 @@ +[MYDev_VarWatch] +name=变量监控 +desc=[开发者工具] Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_VarWatch.lua +package=MY diff --git a/MYDev_VarWatch/info.ini.zh_TW b/MYDev_VarWatch/info.ini.zh_TW new file mode 100644 index 000000000..c81fa4c4b --- /dev/null +++ b/MYDev_VarWatch/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MYDev_VarWatch] +name=璁婃暩鐩f帶 +desc=[闁嬬櫦鑰呭伐鍏穄 Mission Accomplished! +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MYDev_VarWatch.lua +package=MY diff --git a/MYDev_VarWatch/lang/zhcn.jx3dat b/MYDev_VarWatch/lang/zhcn.jx3dat new file mode 100644 index 000000000..c6c3b8db4 --- /dev/null +++ b/MYDev_VarWatch/lang/zhcn.jx3dat @@ -0,0 +1,3 @@ +return { + ['VarWatch'] = '变量监控', +} diff --git a/MYDev_VarWatch/lang/zhtw.jx3dat b/MYDev_VarWatch/lang/zhtw.jx3dat new file mode 100644 index 000000000..512068524 --- /dev/null +++ b/MYDev_VarWatch/lang/zhtw.jx3dat @@ -0,0 +1,3 @@ +return { + ['VarWatch'] = '璁婃暩鐩f帶', +} diff --git a/MYDev_VarWatch/src/MYDev_VarWatch.lua b/MYDev_VarWatch/src/MYDev_VarWatch.lua new file mode 100644 index 000000000..5566609cb --- /dev/null +++ b/MYDev_VarWatch/src/MYDev_VarWatch.lua @@ -0,0 +1,137 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 变量监控 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MYDev_VarWatch/MYDev_VarWatch' +local PLUGIN_NAME = 'MYDev_VarWatch' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MYDev_VarWatch' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local _C = {} +local DATA_PATH = {'config/dev_varwatch.jx3dat', X.PATH_TYPE.GLOBAL} +_C.tVarList = X.LoadLUAData(DATA_PATH) or {} + +local function var2str_x(var, indent, level) -- 只解析一层table且不解析方法 + local function table_r(var, level, indent) + local t = {} + local szType = type(var) + if szType == 'nil' then + table.insert(t, 'nil') + elseif szType == 'number' then + table.insert(t, tostring(var)) + elseif szType == 'string' then + table.insert(t, string.format('%q', var)) + elseif szType == 'boolean' then + table.insert(t, tostring(var)) + elseif szType == 'table' then + table.insert(t, '{') + local s_tab_equ = ']=' + if indent then + s_tab_equ = '] = ' + if not X.IsEmpty(var) then + table.insert(t, '\n') + end + end + for key, val in pairs(var) do + if indent then + table.insert(t, string.rep(indent, level + 1)) + end + table.insert(t, '[') + table.insert(t, tostring(key)) + table.insert(t, s_tab_equ) --'] = ' + table.insert(t, tostring(val)) + table.insert(t, ',') + if indent then + table.insert(t, '\n') + end + end + if indent and not X.IsEmpty(var) then + table.insert(t, string.rep(indent, level)) + end + table.insert(t, '}') + else --if (szType == 'userdata') then + table.insert(t, '"') + table.insert(t, tostring(var)) + table.insert(t, '"') + end + return table.concat(t) + end + return table_r(var, level or 0, indent) +end + +X.Panel.Register(_L['Development'], 'Dev_VarWatch', _L['VarWatch'], 'ui/Image/UICommon/BattleFiled.UITex|7', { + IsRestricted = function() + return not X.IsDebugging('Dev_VarWatch') + end, + OnPanelActive = function(wnd) + local ui = X.UI(wnd) + local x, y = 10, 10 + local w, h = ui:Size() + local nLimit = 20 + + local tWndEditK = {} + local tWndEditV = {} + + for i = 1, nLimit do + tWndEditK[i] = ui:Append('WndEditBox', { + name = 'WndEditBox_K' .. i, + text = _C.tVarList[i], + x = x, y = y + (i - 1) * 25, + w = 150, h = 25, + color = {255, 255, 255}, + onChange = function(text) + _C.tVarList[i] = X.TrimString(text) + X.SaveLUAData(DATA_PATH, _C.tVarList) + end, + }) + + tWndEditV[i] = ui:Append('WndEditBox', { + name = 'WndEditBox_V' .. i, + x = x + 150, y = y + (i - 1) * 25, + w = w - 2 * x - 150, h = 25, + color = {255, 255, 255}, + }) + end + + X.BreatheCall('DEV_VARWATCH', function() + for i = 1, nLimit do + local szKey = _C.tVarList[i] + local hFocus = Station.GetFocusWindow() + if not X.IsEmpty(szKey) and -- 忽略空白的Key + wnd:GetRoot():IsVisible() and ( -- 主界面隐藏了就不要解析了 + not hFocus or ( + not hFocus:GetTreePath():find(tWndEditK[i]:Name()) and -- 忽略K编辑中的 + not hFocus:GetTreePath():find(tWndEditV[i]:Name()) -- 忽略V编辑中的 + ) + ) then + if loadstring then + local t = {select(2, X.XpCall(loadstring('return ' .. szKey)))} + for k, v in pairs(t) do + t[k] = tostring(v) + end + tWndEditV[i]:Text(table.concat(t, ', ')) + else + tWndEditV[i]:Text(var2str_x(X.GetGlobalValue(szKey))) + end + end + end + end) + end, + OnPanelDeactive = function() + X.BreatheCall('DEV_VARWATCH', false) + end, +}) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/Boilerplate_!Base/audio/Bing.ogg b/MY_!Base/audio/Bing.ogg similarity index 100% rename from Boilerplate_!Base/audio/Bing.ogg rename to MY_!Base/audio/Bing.ogg diff --git a/Boilerplate_!Base/audio/Notify.ogg b/MY_!Base/audio/Notify.ogg similarity index 100% rename from Boilerplate_!Base/audio/Notify.ogg rename to MY_!Base/audio/Notify.ogg diff --git a/Boilerplate_!Base/data/bookfix/zhcn.jx3dat b/MY_!Base/data/bookfix/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/data/bookfix/zhcn.jx3dat rename to MY_!Base/data/bookfix/zhcn.jx3dat diff --git a/Boilerplate_!Base/data/bookfix/zhtw.jx3dat b/MY_!Base/data/bookfix/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/data/bookfix/zhtw.jx3dat rename to MY_!Base/data/bookfix/zhtw.jx3dat diff --git a/Boilerplate_!Base/data/bosslist/zhcn.jx3dat b/MY_!Base/data/bosslist/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/data/bosslist/zhcn.jx3dat rename to MY_!Base/data/bosslist/zhcn.jx3dat diff --git a/Boilerplate_!Base/data/bosslist/zhtw.jx3dat b/MY_!Base/data/bosslist/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/data/bosslist/zhtw.jx3dat rename to MY_!Base/data/bosslist/zhtw.jx3dat diff --git a/Boilerplate_!Base/data/colors/zhcn.jx3dat b/MY_!Base/data/colors/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/data/colors/zhcn.jx3dat rename to MY_!Base/data/colors/zhcn.jx3dat diff --git a/Boilerplate_!Base/data/colors/zhtw.jx3dat b/MY_!Base/data/colors/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/data/colors/zhtw.jx3dat rename to MY_!Base/data/colors/zhtw.jx3dat diff --git a/Boilerplate_!Base/data/inpclist/zhcn.jx3dat b/MY_!Base/data/inpclist/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/data/inpclist/zhcn.jx3dat rename to MY_!Base/data/inpclist/zhcn.jx3dat diff --git a/Boilerplate_!Base/data/inpclist/zhtw.jx3dat b/MY_!Base/data/inpclist/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/data/inpclist/zhtw.jx3dat rename to MY_!Base/data/inpclist/zhtw.jx3dat diff --git a/MY_!Base/data/serendipities/zhcn.jx3dat b/MY_!Base/data/serendipities/zhcn.jx3dat new file mode 100644 index 000000000..70adcbcc0 --- /dev/null +++ b/MY_!Base/data/serendipities/zhcn.jx3dat @@ -0,0 +1,88 @@ +return { + [5] = { + [6630 ] = { 5, 6630, 'DONE' }, -- 飞仙玄晶 + [10360] = { 5, 10360, 'DONE' }, -- 化玉玄晶 + [10369] = { 5, 10369, 'DONE' }, -- 飞仙玄晶 + [18843] = { 5, 18843, 'DONE' }, -- 化玉玄晶 + [19284] = { 5, 19284, 'DONE' }, -- 沉沙玄晶 + [20522] = { 5, 20522, 'DONE' }, -- 沉沙玄晶 + [25830] = { 5, 25830, 'DONE' }, -- 醉月玄晶 + [25831] = { 5, 25831, 'DONE' }, -- 醉月玄晶 + [31601] = { 5, 31601, 'DONE' }, -- 归墟玄晶 + + [17395] = { 8, 5880, 'DONE' }, -- 小螃蟹·蟹兵 @喜小乐 + [17503] = { 8, 5881, 'DONE' }, -- 小螃蟹·蟹卒 @横小五 + [20006] = { 8, 10190, 'DONE' }, -- 小螃蟹·蟹将 @密探 + [20782] = { 8, 10914, 'DONE' }, -- 小螃蟹·蟹仔 @寄居蟹 + + [17398] = { 8, 5885, 'DONE' }, -- (大头鹅) 小鹅·大头鹅 + [17502] = { 8, 5886, 'DONE' }, -- (白鹅) 小鹅·白鹅 + [21323] = { 8, 11109, 'START' }, -- (蟹相) 象棋谱·半仙局上部 + [21285] = { 8, 11109, 'FINISH' }, -- (蟹相) 小螃蟹·蟹相 + [21324] = { 8, 11110, 'START' }, -- (蟹象) 象棋谱·半仙局下部 + [21286] = { 8, 11110, 'FINISH' }, -- (蟹象) 小螃蟹·蟹象 + [21901] = { 8, 11778, 'START' }, -- (蟹砲) 象棋谱·谪仙局上部 + [21887] = { 8, 11778, 'FINISH' }, -- (蟹砲) 小螃蟹·蟹砲 + [21902] = { 8, 11777, 'START' }, -- (蟹炮) 象棋谱·谪仙局下部 + [21876] = { 8, 11777, 'FINISH' }, -- (蟹炮) 小螃蟹·蟹炮 + [22754] = { 8, 13052, 'START' }, -- (冰蓝花客) 峭壁冰花雪莲 + [22760] = { 8, 13052, 'FINISH' }, -- (冰蓝花客) 小蟹·冰蓝花客 + [22752] = { 8, 13054, 'START' }, -- (蟹仕) 象棋谱·国士无双局上部 + [22540] = { 8, 13054, 'FINISH' }, -- (蟹仕) 小螃蟹·蟹仕 + [22753] = { 8, 13055, 'START' }, -- (蟹士) 象棋谱·国士无双局下部 + [22541] = { 8, 13055, 'FINISH' }, -- (蟹士) 小螃蟹·蟹士 + [23374] = { 8, 13225, 'START' }, -- (蟹车·红) 象棋谱·横行局上部 + [23369] = { 8, 13225, 'FINISH' }, -- (蟹车·红) 小螃蟹·红蟹车 + [23375] = { 8, 13226, 'START' }, -- (蟹车·蓝) 象棋谱·横行局下部 + [23370] = { 8, 13226, 'FINISH' }, -- (蟹车·蓝) 小螃蟹·蓝蟹车 + [23842] = { 8, 13909, 'START' }, -- (商周客) 琉璃簪花 + [23873] = { 8, 13909, 'FINISH' }, -- (商周客) 小蟹·商周客 + [23874] = { 8, 13910, 'START' }, -- (蟹马·红) 象棋谱·凡仙局上部 + [23871] = { 8, 13910, 'FINISH' }, -- (蟹马·红) 小螃蟹·红蟹马 + [23875] = { 8, 13911, 'START' }, -- (蟹马·蓝) 象棋谱·凡仙局下部 + [23872] = { 8, 13911, 'FINISH' }, -- (蟹马·蓝) 小螃蟹·蓝蟹马 + [20189] = { 8, 10192, 'START' }, -- (小灰) 惊恐的小灰鹅 + [20007] = { 8, 10192, 'FINISH' }, -- (小灰) 小鹅·小灰 + + [20014] = { 8, 10193, 'START' }, -- (小锦) 发髻 + [20191] = { 8, 10194, 'START' }, -- (阿里) 段氏腰牌 + [19907] = { 8, 10195, 'START' }, -- (阿飞) 护甲残片 + [20817] = { 8, 10912, 'START' }, -- (哈皮) 虚弱的小狗 + [20863] = { 8, 10913, 'START' }, -- (小果) 酒葫芦 + [21304] = { 8, 11108, 'START' }, -- (小花) 泥娃娃 + [21574] = { 8, 11779, 'START' }, -- (小诺) 烤羊腿秘方 + [22781] = { 8, 13051, 'START' }, -- (果果) 坚果 + [23371] = { 8, 13222, 'START' }, -- (静静) 小静静 + [23381] = { 8, 13223, 'START' }, -- (红羽大将军) 一个铃铛 + }, + [8] = { + [10193] = { 8, 10193, 'FINISH' }, -- (小锦) 小锦 + [10194] = { 8, 10194, 'FINISH' }, -- (阿里) 阿里 + [10195] = { 8, 10195, 'FINISH' }, -- (阿飞) 阿飞 + [10912] = { 8, 10912, 'FINISH' }, -- (哈皮) 哈皮 + [10913] = { 8, 10913, 'FINISH' }, -- (小果) 小果 + [11108] = { 8, 11108, 'FINISH' }, -- (小花) 小花 + [11779] = { 8, 11779, 'FINISH' }, -- (小诺) 小诺 + [13051] = { 8, 13051, 'FINISH' }, -- (果果) 果果 + [13222] = { 8, 13222, 'FINISH' }, -- (静静) 静静 + [13223] = { 8, 13223, 'FINISH' }, -- (红羽大将军) 红羽大将军 + + [10191] = { 8, 10191, 'DONE' }, -- 蟹帅 / 密探 + [11111] = { 8, 11111, 'DONE' }, -- 大哈 + [10915] = { 8, 10915, 'DONE' }, -- 稻稻 + + [2816 ] = { 8, 2816, 'DONE' }, -- 黑天 + [5772 ] = { 8, 5772, 'DONE' }, -- 夜话·白鹭 + [7078 ] = { 8, 7078, 'DONE' }, -- 秋声烛影 + [10204] = { 8, 10204, 'DONE' }, -- 守贞匕 + [13734] = { 8, 13734, 'DONE' }, -- 玉玲珑 + [13730] = { 8, 13730, 'DONE' }, -- 贪狼 + [11104] = { 8, 11104, 'DONE' }, -- 觅影瓶 + [13136] = { 8, 13136, 'DONE' }, -- 飞天 + [10210] = { 8, 10210, 'DONE' }, -- 黑龙斩铁 + [10945] = { 8, 10945, 'DONE' }, -- 白蛟腹 + }, + ["quest"] = { + [12879] = { 8, 13053, 'DONE' }, -- (嘟嘟) 青头仙草小童需 + }, +} diff --git a/MY_!Base/data/serendipities/zhtw.jx3dat b/MY_!Base/data/serendipities/zhtw.jx3dat new file mode 100644 index 000000000..062e10a2e --- /dev/null +++ b/MY_!Base/data/serendipities/zhtw.jx3dat @@ -0,0 +1,88 @@ +return { + [5] = { + [6630 ] = { 5, 6630, 'DONE' }, -- 椋涗粰鐜勬櫠 + [10360] = { 5, 10360, 'DONE' }, -- 鍖栫帀鐜勬櫠 + [10369] = { 5, 10369, 'DONE' }, -- 椋涗粰鐜勬櫠 + [18843] = { 5, 18843, 'DONE' }, -- 鍖栫帀鐜勬櫠 + [19284] = { 5, 19284, 'DONE' }, -- 娌夋矙鐜勬櫠 + [20522] = { 5, 20522, 'DONE' }, -- 娌夋矙鐜勬櫠 + [25830] = { 5, 25830, 'DONE' }, -- 閱夋湀鐜勬櫠 + [25831] = { 5, 25831, 'DONE' }, -- 閱夋湀鐜勬櫠 + [31601] = { 5, 31601, 'DONE' }, -- 姝稿鐜勬櫠 + + [17395] = { 8, 5880, 'DONE' }, -- 灏忚瀮锜孤疯煿鍏 @鍠滃皬妯 + [17503] = { 8, 5881, 'DONE' }, -- 灏忚瀮锜孤疯煿鍗 @姗皬浜 + [20006] = { 8, 10190, 'DONE' }, -- 灏忚瀮锜孤疯煿灏 @瀵嗘帰 + [20782] = { 8, 10914, 'DONE' }, -- 灏忚瀮锜孤疯煿浠 @瀵勫眳锜 + + [17398] = { 8, 5885, 'DONE' }, -- (澶ч牠榈) 灏忛禎路澶ч牠榈 + [17502] = { 8, 5886, 'DONE' }, -- (鐧介禎) 灏忛禎路鐧介禎 + [21323] = { 8, 11109, 'START' }, -- (锜圭浉) 璞℃璀溌峰崐浠欏眬涓婇儴 + [21285] = { 8, 11109, 'FINISH' }, -- (锜圭浉) 灏忚瀮锜孤疯煿鐩 + [21324] = { 8, 11110, 'START' }, -- (锜硅薄) 璞℃璀溌峰崐浠欏眬涓嬮儴 + [21286] = { 8, 11110, 'FINISH' }, -- (锜硅薄) 灏忚瀮锜孤疯煿璞 + [21901] = { 8, 11778, 'START' }, -- (锜圭牪) 璞℃璀溌疯浠欏眬涓婇儴 + [21887] = { 8, 11778, 'FINISH' }, -- (锜圭牪) 灏忚瀮锜孤疯煿鐮 + [21902] = { 8, 11777, 'START' }, -- (锜圭偖) 璞℃璀溌疯浠欏眬涓嬮儴 + [21876] = { 8, 11777, 'FINISH' }, -- (锜圭偖) 灏忚瀮锜孤疯煿鐐 + [22754] = { 8, 13052, 'START' }, -- (鍐拌棈鑺卞) 宄鍐拌姳闆摦 + [22760] = { 8, 13052, 'FINISH' }, -- (鍐拌棈鑺卞) 灏忚煿路鍐拌棈鑺卞 + [22752] = { 8, 13054, 'START' }, -- (锜逛粫) 璞℃璀溌峰湅澹劇闆欏眬涓婇儴 + [22540] = { 8, 13054, 'FINISH' }, -- (锜逛粫) 灏忚瀮锜孤疯煿浠 + [22753] = { 8, 13055, 'START' }, -- (锜瑰+) 璞℃璀溌峰湅澹劇闆欏眬涓嬮儴 + [22541] = { 8, 13055, 'FINISH' }, -- (锜瑰+) 灏忚瀮锜孤疯煿澹 + [23374] = { 8, 13225, 'START' }, -- (锜硅粖路绱) 璞℃璀溌锋┇琛屽眬涓婇儴 + [23369] = { 8, 13225, 'FINISH' }, -- (锜硅粖路绱) 灏忚瀮锜孤风磪锜硅粖 + [23375] = { 8, 13226, 'START' }, -- (锜硅粖路钘) 璞℃璀溌锋┇琛屽眬涓嬮儴 + [23370] = { 8, 13226, 'FINISH' }, -- (锜硅粖路钘) 灏忚瀮锜孤疯棈锜硅粖 + [23842] = { 8, 13909, 'START' }, -- (鍟嗗懆瀹) 鐞夌拑绨姳 + [23873] = { 8, 13909, 'FINISH' }, -- (鍟嗗懆瀹) 灏忚煿路鍟嗗懆瀹 + [23874] = { 8, 13910, 'START' }, -- (锜归Μ路绱) 璞℃璀溌峰嚒浠欏眬涓婇儴 + [23871] = { 8, 13910, 'FINISH' }, -- (锜归Μ路绱) 灏忚瀮锜孤风磪锜归Μ + [23875] = { 8, 13911, 'START' }, -- (锜归Μ路钘) 璞℃璀溌峰嚒浠欏眬涓嬮儴 + [23872] = { 8, 13911, 'FINISH' }, -- (锜归Μ路钘) 灏忚瀮锜孤疯棈锜归Μ + [20189] = { 8, 10192, 'START' }, -- (灏忕伆) 椹氭亹鐨勫皬鐏伴禎 + [20007] = { 8, 10192, 'FINISH' }, -- (灏忕伆) 灏忛禎路灏忕伆 + + [20014] = { 8, 10193, 'START' }, -- (灏忛對) 楂 + [20191] = { 8, 10194, 'START' }, -- (闃胯!) 娈垫皬鑵扮墝 + [19907] = { 8, 10195, 'START' }, -- (闃块) 璀风敳娈樼墖 + [20817] = { 8, 10912, 'START' }, -- (鍝堢毊) 铏涘急鐨勫皬鐙 + [20863] = { 8, 10913, 'START' }, -- (灏忔灉) 閰掕懌铇 + [21304] = { 8, 11108, 'START' }, -- (灏忚姳) 娉ュ▋濞 + [21574] = { 8, 11779, 'START' }, -- (灏忚) 鐑ょ緤鑵跨鏂 + [22781] = { 8, 13051, 'START' }, -- (鏋滄灉) 鍫呮灉 + [23371] = { 8, 13222, 'START' }, -- (闈滈潨) 灏忛潨闈 + [23381] = { 8, 13223, 'START' }, -- (绱呯窘澶у皣杌) 涓鍊嬮埓閻 + }, + [8] = { + [10193] = { 8, 10193, 'FINISH' }, -- (灏忛對) 灏忛對 + [10194] = { 8, 10194, 'FINISH' }, -- (闃胯!) 闃胯! + [10195] = { 8, 10195, 'FINISH' }, -- (闃块) 闃块 + [10912] = { 8, 10912, 'FINISH' }, -- (鍝堢毊) 鍝堢毊 + [10913] = { 8, 10913, 'FINISH' }, -- (灏忔灉) 灏忔灉 + [11108] = { 8, 11108, 'FINISH' }, -- (灏忚姳) 灏忚姳 + [11779] = { 8, 11779, 'FINISH' }, -- (灏忚) 灏忚 + [13051] = { 8, 13051, 'FINISH' }, -- (鏋滄灉) 鏋滄灉 + [13222] = { 8, 13222, 'FINISH' }, -- (闈滈潨) 闈滈潨 + [13223] = { 8, 13223, 'FINISH' }, -- (绱呯窘澶у皣杌) 绱呯窘澶у皣杌 + + [10191] = { 8, 10191, 'DONE' }, -- 锜瑰弗 / 瀵嗘帰 + [11111] = { 8, 11111, 'DONE' }, -- 澶у搱 + [10915] = { 8, 10915, 'DONE' }, -- 绋荤ɑ + + [2816 ] = { 8, 2816, 'DONE' }, -- 榛戝ぉ + [5772 ] = { 8, 5772, 'DONE' }, -- 澶滆┍路鐧介泛 + [7078 ] = { 8, 7078, 'DONE' }, -- 绉嬭伈鐕奖 + [10204] = { 8, 10204, 'DONE' }, -- 瀹堣矠鍖 + [13734] = { 8, 13734, 'DONE' }, -- 鐜夌幉鐡 + [13730] = { 8, 13730, 'DONE' }, -- 璨嫾 + [11104] = { 8, 11104, 'DONE' }, -- 瑕撳奖鐡 + [13136] = { 8, 13136, 'DONE' }, -- 椋涘ぉ + [10210] = { 8, 10210, 'DONE' }, -- 榛戦緧鏂惖 + [10945] = { 8, 10945, 'DONE' }, -- 鐧借洘鑵 + }, + ["quest"] = { + [12879] = { 8, 13053, 'DONE' }, -- (鍢熷槦) 闈掗牠浠欒崏灏忕闇 + }, +} diff --git a/MY_!Base/img/Logo.Tga b/MY_!Base/img/Logo.Tga new file mode 100644 index 000000000..7071f5ffc Binary files /dev/null and b/MY_!Base/img/Logo.Tga differ diff --git a/MY_!Base/img/Logo.UITex b/MY_!Base/img/Logo.UITex new file mode 100644 index 000000000..eda924c70 Binary files /dev/null and b/MY_!Base/img/Logo.UITex differ diff --git a/MY_!Base/img/Logo.txt b/MY_!Base/img/Logo.txt new file mode 100644 index 000000000..65d35bb48 --- /dev/null +++ b/MY_!Base/img/Logo.txt @@ -0,0 +1,4 @@ +Farme Left Top Width High File +0 0 0 100 100 C:\Users\root\Desktop\玄晶小ICON.tga +1 102 0 100 100 C:\Users\root\Desktop\猫爪.tga +2 204 0 100 100 C:\Users\root\Desktop\(new)猫爪.tga diff --git a/Boilerplate_!Base/img/PS.Tga b/MY_!Base/img/PS.Tga similarity index 100% rename from Boilerplate_!Base/img/PS.Tga rename to MY_!Base/img/PS.Tga diff --git a/Boilerplate_!Base/img/PS.UITex b/MY_!Base/img/PS.UITex similarity index 100% rename from Boilerplate_!Base/img/PS.UITex rename to MY_!Base/img/PS.UITex diff --git a/Boilerplate_!Base/img/PS.txt b/MY_!Base/img/PS.txt similarity index 100% rename from Boilerplate_!Base/img/PS.txt rename to MY_!Base/img/PS.txt diff --git a/Boilerplate_!Base/img/UIComponents.Tga b/MY_!Base/img/UIComponents.Tga similarity index 100% rename from Boilerplate_!Base/img/UIComponents.Tga rename to MY_!Base/img/UIComponents.Tga diff --git a/Boilerplate_!Base/img/UIComponents.UITex b/MY_!Base/img/UIComponents.UITex similarity index 100% rename from Boilerplate_!Base/img/UIComponents.UITex rename to MY_!Base/img/UIComponents.UITex diff --git a/Boilerplate_!Base/img/UIComponents.txt b/MY_!Base/img/UIComponents.txt similarity index 100% rename from Boilerplate_!Base/img/UIComponents.txt rename to MY_!Base/img/UIComponents.txt diff --git a/Boilerplate_!Base/info.ini b/MY_!Base/info.ini similarity index 94% rename from Boilerplate_!Base/info.ini rename to MY_!Base/info.ini index fe2828445..e69371ab8 100644 --- a/Boilerplate_!Base/info.ini +++ b/MY_!Base/info.ini @@ -1,7 +1,7 @@ -[Boilerplate_!Base] -package=Boilerplate -name=Boilerplate基础库 -desc=Boilerplate插件依赖此库,必须加载 +[MY_!Base] +package=MY +name=茗伊基础库 +desc=茗伊插件依赖此库,必须加载 default=1 version=1.0 lua_0=src\LuaWatcher.lua @@ -116,3 +116,7 @@ lua_108=src\Dev_BgMsgSegmentViewer_Detail.lua lua_109=src\PS.Welcome.lua lua_110=src\PS.GlobalConfig.lua lua_111=src\PS.UISample.lua +lua_112=src\MY_Serendipity.lua +lua_113=src\MY_Bidding.lua +lua_114=src\MY_RSS.lua +lua_115=src\MY_ShareKnowledge.lua diff --git a/Boilerplate_!Base/info.ini.zh_TW b/MY_!Base/info.ini.zh_TW similarity index 94% rename from Boilerplate_!Base/info.ini.zh_TW rename to MY_!Base/info.ini.zh_TW index 8ff578173..11b3ca33a 100644 --- a/Boilerplate_!Base/info.ini.zh_TW +++ b/MY_!Base/info.ini.zh_TW @@ -1,7 +1,7 @@ -[Boilerplate_!Base] -package=Boilerplate -name=Boilerplate鍩虹搴 -desc=Boilerplate鎻掍欢渚濊炒姝ゅ韩锛屽繀闋堣級鍏 +[MY_!Base] +package=MY +name=鑼椾紛鍩虹搴 +desc=鑼椾紛鎻掍欢渚濊炒姝ゅ韩锛屽繀闋堣級鍏 default=1 version=1.0 lua_0=src\LuaWatcher.lua @@ -116,3 +116,7 @@ lua_108=src\Dev_BgMsgSegmentViewer_Detail.lua lua_109=src\PS.Welcome.lua lua_110=src\PS.GlobalConfig.lua lua_111=src\PS.UISample.lua +lua_112=src\MY_Serendipity.lua +lua_113=src\MY_Bidding.lua +lua_114=src\MY_RSS.lua +lua_115=src\MY_ShareKnowledge.lua diff --git a/Boilerplate_!Base/lang/BgMsgCenter/zhcn.jx3dat b/MY_!Base/lang/BgMsgCenter/zhcn.jx3dat similarity index 54% rename from Boilerplate_!Base/lang/BgMsgCenter/zhcn.jx3dat rename to MY_!Base/lang/BgMsgCenter/zhcn.jx3dat index 43088a3e3..1ad41c2dc 100644 --- a/Boilerplate_!Base/lang/BgMsgCenter/zhcn.jx3dat +++ b/MY_!Base/lang/BgMsgCenter/zhcn.jx3dat @@ -1,5 +1,8 @@ return { ['[%s] wants to get your location, would you like to share?'] = '[%s] 希望取得你当前所在地图位置,你是否愿意共享当前位置信息?', + ['Block'] = '屏蔽他', + ['[%s] wants to see your detailed character info, OK?'] = '[%s] 想查看您的详细角色属性信息,是否允许?', + ['[%s] refused to share detailed character info with you.'] = '[%s] 拒绝向您共享详细角色属性信息。', ['[%s] want to see your info, OK?'] = '团长 [%s] 想知晓您的装备、心法,是否告知?', ['I\'ve installed %s v%s'] = '我已安装%s v%s。', } diff --git a/Boilerplate_!Base/lang/BgMsgCenter/zhtw.jx3dat b/MY_!Base/lang/BgMsgCenter/zhtw.jx3dat similarity index 54% rename from Boilerplate_!Base/lang/BgMsgCenter/zhtw.jx3dat rename to MY_!Base/lang/BgMsgCenter/zhtw.jx3dat index bdf2d9544..38010f6f7 100644 --- a/Boilerplate_!Base/lang/BgMsgCenter/zhtw.jx3dat +++ b/MY_!Base/lang/BgMsgCenter/zhtw.jx3dat @@ -1,5 +1,8 @@ return { ['[%s] wants to get your location, would you like to share?'] = '[%s] 甯屾湜鍙栧緱浣犵暥鍓嶆墍鍦ㄥ湴鍦栦綅缃紝浣犳槸鍚﹂鎰忓叡浜暥鍓嶄綅缃俊鎭紵', + ['Block'] = '灞忚斀浠', + ['[%s] wants to see your detailed character info, OK?'] = '[%s] 鎯虫煡鐪嬫偍鐨勮┏绱拌鑹插爆鎬т俊鎭紝鏄惁鍏佽ū锛', + ['[%s] refused to share detailed character info with you.'] = '[%s] 鎷掔禃鍚戞偍鍏变韩瑭崇窗瑙掕壊灞т俊鎭', ['[%s] want to see your info, OK?'] = '鍦橀暦 [%s] 鎯崇煡鏇夋偍鐨勮鍌欍佸績娉曪紝鏄惁鍛婄煡锛', ['I\'ve installed %s v%s'] = '鎴戝凡瀹夎%s v%s銆', } diff --git a/Boilerplate_!Base/lang/Dev/zhcn.jx3dat b/MY_!Base/lang/Dev/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/Dev/zhcn.jx3dat rename to MY_!Base/lang/Dev/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/Dev/zhtw.jx3dat b/MY_!Base/lang/Dev/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/Dev/zhtw.jx3dat rename to MY_!Base/lang/Dev/zhtw.jx3dat diff --git a/Boilerplate_!Base/lang/FloatBar/zhcn.jx3dat b/MY_!Base/lang/FloatBar/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/FloatBar/zhcn.jx3dat rename to MY_!Base/lang/FloatBar/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/FloatBar/zhtw.jx3dat b/MY_!Base/lang/FloatBar/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/FloatBar/zhtw.jx3dat rename to MY_!Base/lang/FloatBar/zhtw.jx3dat diff --git a/Boilerplate_!Base/lang/HoverEntry/zhcn.jx3dat b/MY_!Base/lang/HoverEntry/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/HoverEntry/zhcn.jx3dat rename to MY_!Base/lang/HoverEntry/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/HoverEntry/zhtw.jx3dat b/MY_!Base/lang/HoverEntry/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/HoverEntry/zhtw.jx3dat rename to MY_!Base/lang/HoverEntry/zhtw.jx3dat diff --git a/Boilerplate_!Base/lang/KeyPanel/zhcn.jx3dat b/MY_!Base/lang/KeyPanel/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/KeyPanel/zhcn.jx3dat rename to MY_!Base/lang/KeyPanel/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/KeyPanel/zhtw.jx3dat b/MY_!Base/lang/KeyPanel/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/KeyPanel/zhtw.jx3dat rename to MY_!Base/lang/KeyPanel/zhtw.jx3dat diff --git a/Boilerplate_!Base/lang/Notify/zhcn.jx3dat b/MY_!Base/lang/Notify/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/Notify/zhcn.jx3dat rename to MY_!Base/lang/Notify/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/Notify/zhtw.jx3dat b/MY_!Base/lang/Notify/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/Notify/zhtw.jx3dat rename to MY_!Base/lang/Notify/zhtw.jx3dat diff --git a/Boilerplate_!Base/lang/PS/zhcn.jx3dat b/MY_!Base/lang/PS/zhcn.jx3dat similarity index 69% rename from Boilerplate_!Base/lang/PS/zhcn.jx3dat rename to MY_!Base/lang/PS/zhcn.jx3dat index 81ea356d8..ceefc71ab 100644 --- a/Boilerplate_!Base/lang/PS/zhcn.jx3dat +++ b/MY_!Base/lang/PS/zhcn.jx3dat @@ -2,10 +2,6 @@ return { -- globalconfig ['GlobalConfig'] = '全局设置', ['Distance type'] = '默认距离计算方式', - ['Notify center'] = '消息中心', - ['Show in minimap'] = '显示小地图入口', - ['Order desc'] = '逆序显示', - ['Disable dismiss'] = '禁止消息自动消失', ['System Info'] = '系统信息', ['User Settings'] = '角色配置', ['Use preset user settings'] = '插件设置项方案选择', @@ -19,8 +15,18 @@ return { ['PRESET_DESC'] = '角色独立方案:\n在该角色上调整插件设置项,不会影响其他角色。\n\n共用配置方案:\n在该角色上调整插件设置项,勾选相同方案的都会被影响。', -- welcome + ['serendipity'] = '奇遇查询', ['%s, welcome to use %s!'] = '欢迎%s使用%s!', + ['Show share notify.'] = '启用数据分享提示', + ['Show notify tip.'] = '显示提示框', + ['Play notify sound.'] = '播放提示音', + ['Auto share.'] = '自动分享', + ['Silent mode.'] = '静默模式', + ['Realname, leave blank for anonymous.'] = '分享者名称(匿名请留空)', + ['Monitor serendipity and show share notify.'] = '收集系统公告、NPC对话框、科举题目、自身奇遇触发等信息,便于有分享精神的侠士可以通过网页上传分享从而给所有人提供如奇遇、花价等网页查询功能。', + ['Check this will monitor system message for serendipity and share it, are you sure?'] = '勾选该选项后:\n插件将收集系统公告、NPC对话框、科举题目、自身奇遇触发等信息,便于有分享精神的侠士可以通过网页上传分享,从而给广大侠士提供如奇遇、花价等网页公共查询功能。\n\n确认要启用分享功能吗?', + ['Storage location'] = '存储位置', ['User preference storage'] = '配置存储', ['User preference'] = '角色数据', diff --git a/Boilerplate_!Base/lang/PS/zhtw.jx3dat b/MY_!Base/lang/PS/zhtw.jx3dat similarity index 68% rename from Boilerplate_!Base/lang/PS/zhtw.jx3dat rename to MY_!Base/lang/PS/zhtw.jx3dat index 4064ef6e9..0a03fc293 100644 --- a/Boilerplate_!Base/lang/PS/zhtw.jx3dat +++ b/MY_!Base/lang/PS/zhtw.jx3dat @@ -2,10 +2,6 @@ return { -- globalconfig ['GlobalConfig'] = '鍏ㄥ眬瑷疆', ['Distance type'] = '榛樿獚璺濋洟瑷堢畻鏂瑰紡', - ['Notify center'] = '娑堟伅涓績', - ['Show in minimap'] = '椤ず灏忓湴鍦栧叆鍙', - ['Order desc'] = '閫嗗簭椤ず', - ['Disable dismiss'] = '绂佹娑堟伅鑷嫊娑堝け', ['System Info'] = '绯荤当淇℃伅', ['User Settings'] = '瑙掕壊閰嶇疆', ['Use preset user settings'] = '鎻掍欢瑷疆闋呮柟妗堥伕鎿', @@ -19,8 +15,18 @@ return { ['PRESET_DESC'] = '瑙掕壊鐛ㄧ珛鏂规锛歕n鍦ㄨ┎瑙掕壊涓婅鏁存彃浠惰ō缃爡锛屼笉鏈冨奖闊垮叾浠栬鑹层俓n\n鍏辩敤閰嶇疆鏂规锛歕n鍦ㄨ┎瑙掕壊涓婅鏁存彃浠惰ō缃爡锛屽嬀閬哥浉鍚屾柟妗堢殑閮芥渻琚奖闊裤', -- welcome + ['serendipity'] = '濂囬亣鏌ヨ', ['%s, welcome to use %s!'] = '姝¤繋%s浣跨敤%s锛', + ['Show share notify.'] = '鍟熺敤鏁告摎鍒嗕韩鎻愮ず', + ['Show notify tip.'] = '椤ず鎻愮ず妗', + ['Play notify sound.'] = '鎾斁鎻愮ず闊', + ['Auto share.'] = '鑷嫊鍒嗕韩', + ['Silent mode.'] = '闈滈粯妯″紡', + ['Realname, leave blank for anonymous.'] = '鍒嗕韩鑰呭悕绋(鍖垮悕璜嬬暀绌)', + ['Monitor serendipity and show share notify.'] = '鏀堕泦绯荤当鍏憡銆丯PC灏嶈┍妗嗐佺鑸夐鐩佽嚜韬閬囪Ц鐧肩瓑淇℃伅锛屼究鏂兼湁鍒嗕韩绮剧鐨勪繝澹彲浠ラ氶亷缍查爜涓婂偝鍒嗕韩寰炶岀郸鎵鏈変汉鎻愪緵濡傚閬囥佽姳鍍圭瓑缍查爜鏌ヨ鍔熻兘銆', + ['Check this will monitor system message for serendipity and share it, are you sure?'] = '鍕鹃伕瑭查伕闋呭緦锛歕n鎻掍欢灏囨敹闆嗙郴绲卞叕鍛娿丯PC灏嶈┍妗嗐佺鑸夐鐩佽嚜韬閬囪Ц鐧肩瓑淇℃伅锛屼究鏂兼湁鍒嗕韩绮剧鐨勪繝澹彲浠ラ氶亷缍查爜涓婂偝鍒嗕韩锛屽緸鑰岀郸寤eぇ淇犲+鎻愪緵濡傚閬囥佽姳鍍圭瓑缍查爜鍏叡鏌ヨ鍔熻兘銆俓n\n纰鸿獚瑕佸暉鐢ㄥ垎浜姛鑳藉棊锛', + ['Storage location'] = '瀛樺劜浣嶇疆', ['User preference storage'] = '閰嶇疆瀛樺劜', ['User preference'] = '瑙掕壊鏁告摎', diff --git a/Boilerplate_!Base/lang/lib/zhcn.jx3dat b/MY_!Base/lang/lib/zhcn.jx3dat similarity index 94% rename from Boilerplate_!Base/lang/lib/zhcn.jx3dat rename to MY_!Base/lang/lib/zhcn.jx3dat index ef9b5411b..aedbc269d 100644 --- a/Boilerplate_!Base/lang/lib/zhcn.jx3dat +++ b/MY_!Base/lang/lib/zhcn.jx3dat @@ -1,10 +1,10 @@ return { - PLUGIN_NAME = 'Boilerplate插件集', - PLUGIN_SHORT_NAME = 'Boilerplate插件', - PLUGIN_AUTHOR = 'Boilerplate @ 梦江南', - PLUGIN_AUTHOR_FEEDBACK = 'Boilerplate', - PLUGIN_AUTHOR_FEEDBACK_URL = 'Boilerplate URL', - PLUGIN_AUTHOR_SIGNATURE = 'Boilerplate @梦江南', + PLUGIN_NAME = '茗伊插件集', + PLUGIN_SHORT_NAME = '茗伊插件', + PLUGIN_AUTHOR = '茗伊 @ 梦江南', + PLUGIN_AUTHOR_FEEDBACK = '茗伊', + PLUGIN_AUTHOR_FEEDBACK_URL = 'https://zhaiyiming.com/feedback', + PLUGIN_AUTHOR_SIGNATURE = '茗伊 @梦江南', ['%s, welcome to use %s!'] = '欢迎%s使用%s!', ['Author @%s'] = '作者 @%s', @@ -39,7 +39,7 @@ return { ['Player is too far to peek!'] = '距离太远查看装备失败!', ['None-function hotkey'] = '空白快捷键', - ['Stop cast skill'] = '打断自身读条', + ['Stop cast skill'] = '打断自身运功', ['Display only chat panel'] = '仅显示聊天栏', OPERATOR = { @@ -92,7 +92,7 @@ return { ['User settings preset id cannot contains special character (/?*:|\\<>).'] = '本地共用数据方案名称不能包含特殊符号(/?*:|\\<>)。', - ['%s Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '%s数据库已损坏,需要修复后方可使用,但是修复可能造成临时顿卡掉线,是否立即修复?', + ['%s Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '%s数据库已损坏,需要修复后方可使用,但是修复可能造成客户端失去响应、角色掉线,请耐心等待,勿随意结束客户端,是否立即修复?', ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '接下来如有顿卡请耐心等待,不要结束进程,否则您的数据库可能造成不可逆的数据损坏,点击确认开始操作。', ['Database file locked, repair database failed! : %s'] = '数据库文件被占用,修复失败!(%s)', ['%s Database repair finished!'] = '%s数据库修复完成!', @@ -142,7 +142,7 @@ return { ['Birth / School'] = '稻香村、门派', ['City / Old city'] = '主城', ['Village / Camp'] = '野外', - ['Battle field / Arena'] = '战场、竞技场', + ['Battle field / Arena'] = '战场、名剑大会', ['Other dungeon'] = '其它秘境', ['Other'] = '其它地图', }, diff --git a/Boilerplate_!Base/lang/lib/zhtw.jx3dat b/MY_!Base/lang/lib/zhtw.jx3dat similarity index 94% rename from Boilerplate_!Base/lang/lib/zhtw.jx3dat rename to MY_!Base/lang/lib/zhtw.jx3dat index 5ca0a932b..15afdb83b 100644 --- a/Boilerplate_!Base/lang/lib/zhtw.jx3dat +++ b/MY_!Base/lang/lib/zhtw.jx3dat @@ -1,10 +1,10 @@ return { - PLUGIN_NAME = 'Boilerplate鎻掍欢闆', - PLUGIN_SHORT_NAME = 'Boilerplate鎻掍欢', - PLUGIN_AUTHOR = 'Boilerplate @ 澶㈡睙鍗', - PLUGIN_AUTHOR_FEEDBACK = 'Boilerplate', - PLUGIN_AUTHOR_FEEDBACK_URL = 'Boilerplate URL', - PLUGIN_AUTHOR_SIGNATURE = 'Boilerplate @澶㈡睙鍗', + PLUGIN_NAME = '鑼椾紛鎻掍欢闆', + PLUGIN_SHORT_NAME = '鑼椾紛鎻掍欢', + PLUGIN_AUTHOR = '鑼椾紛 @ 澶㈡睙鍗', + PLUGIN_AUTHOR_FEEDBACK = '鑼椾紛', + PLUGIN_AUTHOR_FEEDBACK_URL = 'https://zhaiyiming.com/feedback', + PLUGIN_AUTHOR_SIGNATURE = '鑼椾紛 @澶㈡睙鍗', ['%s, welcome to use %s!'] = '姝¤繋%s浣跨敤%s锛', ['Author @%s'] = '浣滆 @%s', @@ -39,7 +39,7 @@ return { ['Player is too far to peek!'] = '璺濋洟澶仩鏌ョ湅瑁濆倷澶辨晽锛', ['None-function hotkey'] = '绌虹櫧蹇嵎閸', - ['Stop cast skill'] = '鎵撴柗鑷韩璁姊', + ['Stop cast skill'] = '鎵撴柗鑷韩閬嬪姛', ['Display only chat panel'] = '鍍呴’绀鸿亰澶╂瑒', OPERATOR = { @@ -92,7 +92,7 @@ return { ['User settings preset id cannot contains special character (/?*:|\\<>).'] = '鏈湴鍏辩敤鏁告摎鏂规鍚嶇ū涓嶈兘鍖呭惈鐗规畩绗﹁櫉锛/?*:|\\<>锛夈', - ['%s Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '%s璩囨枡搴凡鎼嶅锛岄渶瑕佷慨瑜囧緦鏂瑰彲浣跨敤锛屼絾鏄慨瑜囧彲鑳介犳垚鑷ㄦ檪闋撳崱鎺夌窔,鏄惁绔嬪嵆淇锛', + ['%s Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '%s璩囨枡搴凡鎼嶅锛岄渶瑕佷慨瑜囧緦鏂瑰彲浣跨敤锛屼絾鏄慨瑜囧彲鑳介犳垚瀹㈡埗绔け鍘婚熆鎳夈佽鑹叉帀绶氾紝璜嬭愬績绛夊緟锛屽嬁闅ㄦ剰绲愭潫瀹㈡埗绔紝鏄惁绔嬪嵆淇锛', ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '鎺ヤ笅渚嗗鏈夐爴鍗¤珛鑰愬績绛夊緟锛屼笉瑕佺祼鏉熼茬▼锛屽惁鍓囨偍鐨勮硣鏂欏韩鍙兘閫犳垚涓嶅彲閫嗙殑鏁告摎鎼嶅锛岄粸鎿婄⒑瑾嶉枊濮嬫搷浣溿', ['Database file locked, repair database failed! : %s'] = '璩囨枡搴枃浠惰鍗犵敤锛屼慨瑜囧け鏁楋紒(%s)', ['%s Database repair finished!'] = '%s璩囨枡搴慨瑜囧畬鎴愶紒', @@ -142,7 +142,7 @@ return { ['Birth / School'] = '绋婚鏉戙侀杸娲', ['City / Old city'] = '涓诲煄', ['Village / Camp'] = '閲庡', - ['Battle field / Arena'] = '鎴板牬銆佺鎶鍫', + ['Battle field / Arena'] = '鎴板牬銆佸悕鍔嶅ぇ鏈', ['Other dungeon'] = '鍏跺畠绉樺', ['Other'] = '鍏跺畠鍦板湒', }, diff --git a/MY_!Base/lang/my_bidding/zhcn.jx3dat b/MY_!Base/lang/my_bidding/zhcn.jx3dat new file mode 100644 index 000000000..7202208c7 --- /dev/null +++ b/MY_!Base/lang/my_bidding/zhcn.jx3dat @@ -0,0 +1,58 @@ +return { + -- MY_Bidding + ['Bidding'] = '拍卖', + ['Show price'] = '出价', + ['P'] = '放弃', + ['Name'] = '名字', + ['Price'] = '出价', + ['Time'] = '时间', + ['Publish'] = '发布', + ['Finish'] = '结束', + ['You are not distributor!'] = '你不是分配者!', + ['Please unlock safety talk lock first!'] = '请先解除聊天锁。', + ['Bidding item:'] = '拍卖物品:', + ['Min price:'] = '最低出价:', + ['Min price step:'] = '最小加价:', + ['Target bidding number:'] = '目标人数:', + ['Sure'] = '确定', + ['Cancel'] = '取消', + ['Click to input price.'] = '点击进入手动出价。', + ['Hold SHIFT when click to quick bidding at price '] = '按住SHIFT键点击可快速出价:', + ['Right click to select quick bidding price.'] = '右键点击可选择指定价格快速出价。', + ['Want to buy '] = '参与拍卖', + ['You have not bidding a price yet.'] = '你尚未参与此次拍卖出价。', + ['You cannot p cause you have a valid price.'] = '你的出价仍然有效,暂时无法放弃本次拍卖。', + ['You have already p.'] = '你已放弃本次拍卖。', + ['Exit from bidding '] = '放弃拍卖', + [', P.'] = ',P。', + ['%d gold'] = '%d金', + ['%d brick'] = '%d金砖', + ['%d brick %d gold'] = '%d金砖%d金', + [', bidding for %s.'] = ',出价%s。', + [', no valid price'] = ',当前暂无有效出价', + [', current valid prices: '] = ',当前有效出价:', + [','] = ',', + [' gold'] = '金', + ['.'] = '。', + ['\'s record, delete '] = '记录,已作废', + [' \'s invalid price .'] = '的出价记录。', + [', nobody would buy it'] = ',无人出价', + [', finally bidding valid prices: '] = ',最终出价:', + [', bidding finished.'] = ',拍卖结束。', + ['Create bidding'] = '发起拍卖', + ['You are distributor, Please finish this bidding!'] = '你是分配者,请完成此次拍卖!', + ['Not a valid price'] = '你输入的出价不在拍卖允许范围内!', + ['Nearest price is %d and %d'] = '最接近的有效出价为%d金、%d金。', + ['Sure cancel this bidding? You will not able to bidding this item.'] = '拍卖尚未结束,退出后不可再次出价,确定要提前退出?', + ['Raise bidding for '] = '发起拍卖', + ['Modify bidding for '] = '修改拍卖', + [', min price is %s, bidding step is %s.'] = ',最低出价%s,最小加价%s。', + ['Your valid price is '] = '你当前有效出价为:', + ['You already have a valid price at %s.'] = '你已有有效出价%s,无需重复出价。', + ['Sure to delete %s\'s bidding record?'] = '确定要作废[%s]的出价记录?', + ['Raise quick bidding'] = '快速出价', + ['Click to raise quick bidding.'] = '左键点击快速加价。', + ['Click to quick bidding at price '] = '点击快速出价:', + ['Sure to raise bidding to '] = '确定要出价', + ['?'] = '?', +} diff --git a/MY_!Base/lang/my_bidding/zhtw.jx3dat b/MY_!Base/lang/my_bidding/zhtw.jx3dat new file mode 100644 index 000000000..3e3d6264d --- /dev/null +++ b/MY_!Base/lang/my_bidding/zhtw.jx3dat @@ -0,0 +1,58 @@ +return { + -- MY_Bidding + ['Bidding'] = '鎷嶈常', + ['Show price'] = '鍑哄児', + ['P'] = '鏀炬', + ['Name'] = '鍚嶅瓧', + ['Price'] = '鍑哄児', + ['Time'] = '鏅傞枔', + ['Publish'] = '鐧间綀', + ['Finish'] = '绲愭潫', + ['You are not distributor!'] = '浣犱笉鏄垎閰嶈咃紒', + ['Please unlock safety talk lock first!'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['Bidding item:'] = '鎷嶈常鐗╁搧锛', + ['Min price:'] = '鏈浣庡嚭鍍癸細', + ['Min price step:'] = '鏈灏忓姞鍍癸細', + ['Target bidding number:'] = '鐩浜烘暩锛', + ['Sure'] = '纰哄畾', + ['Cancel'] = '鍙栨秷', + ['Click to input price.'] = '榛炴搳閫插叆鎵嬪嫊鍑哄児銆', + ['Hold SHIFT when click to quick bidding at price '] = '鎸変綇SHIFT閸甸粸鎿婂彲蹇熷嚭鍍癸細', + ['Right click to select quick bidding price.'] = '鍙抽嵉榛炴搳鍙伕鎿囨寚瀹氬児鏍煎揩閫熷嚭鍍广', + ['Want to buy '] = '鍙冭垏鎷嶈常', + ['You have not bidding a price yet.'] = '浣犲皻鏈弮鑸囨娆℃媿璩e嚭鍍广', + ['You cannot p cause you have a valid price.'] = '浣犵殑鍑哄児浠嶇劧鏈夋晥锛屾毇鏅傜劇娉曟斁妫勬湰娆℃媿璩c', + ['You have already p.'] = '浣犲凡鏀炬鏈鎷嶈常銆', + ['Exit from bidding '] = '鏀炬鎷嶈常', + [', P.'] = '锛孭銆', + ['%d gold'] = '%d閲', + ['%d brick'] = '%d閲戠', + ['%d brick %d gold'] = '%d閲戠%d閲', + [', bidding for %s.'] = '锛屽嚭鍍%s銆', + [', no valid price'] = '锛岀暥鍓嶆毇鐒℃湁鏁堝嚭鍍', + [', current valid prices: '] = '锛岀暥鍓嶆湁鏁堝嚭鍍癸細', + [','] = '锛', + [' gold'] = '閲', + ['.'] = '銆', + ['\'s record, delete '] = '瑷橀寗锛屽凡浣滃虎', + [' \'s invalid price .'] = '鐨勫嚭鍍硅閷勩', + [', nobody would buy it'] = '锛岀劇浜哄嚭鍍', + [', finally bidding valid prices: '] = '锛屾渶绲傚嚭鍍癸細', + [', bidding finished.'] = '锛屾媿璩g祼鏉熴', + ['Create bidding'] = '鐧艰捣鎷嶈常', + ['You are distributor, Please finish this bidding!'] = '浣犳槸鍒嗛厤鑰咃紝璜嬪畬鎴愭娆℃媿璩o紒', + ['Not a valid price'] = '浣犺几鍏ョ殑鍑哄児涓嶅湪鎷嶈常鍏佽ū绡勫湇鍏э紒', + ['Nearest price is %d and %d'] = '鏈鎺ヨ繎鐨勬湁鏁堝嚭鍍圭偤%d閲戙%d閲戙', + ['Sure cancel this bidding? You will not able to bidding this item.'] = '鎷嶈常灏氭湭绲愭潫锛岄鍑哄緦涓嶅彲鍐嶆鍑哄児锛岀⒑瀹氳鎻愬墠閫鍑猴紵', + ['Raise bidding for '] = '鐧艰捣鎷嶈常', + ['Modify bidding for '] = '淇敼鎷嶈常', + [', min price is %s, bidding step is %s.'] = '锛屾渶浣庡嚭鍍%s锛屾渶灏忓姞鍍%s銆', + ['Your valid price is '] = '浣犵暥鍓嶆湁鏁堝嚭鍍圭偤锛', + ['You already have a valid price at %s.'] = '浣犲凡鏈夋湁鏁堝嚭鍍%s锛岀劇闇閲嶈鍑哄児銆', + ['Sure to delete %s\'s bidding record?'] = '纰哄畾瑕佷綔寤%s]鐨勫嚭鍍硅閷勶紵', + ['Raise quick bidding'] = '蹇熷嚭鍍', + ['Click to raise quick bidding.'] = '宸﹂嵉榛炴搳蹇熷姞鍍广', + ['Click to quick bidding at price '] = '榛炴搳蹇熷嚭鍍癸細', + ['Sure to raise bidding to '] = '纰哄畾瑕佸嚭鍍', + ['?'] = '锛', +} diff --git a/MY_!Base/lang/my_serendipity/zhcn.jx3dat b/MY_!Base/lang/my_serendipity/zhcn.jx3dat new file mode 100644 index 000000000..46b9048b4 --- /dev/null +++ b/MY_!Base/lang/my_serendipity/zhcn.jx3dat @@ -0,0 +1,20 @@ +return { + ['ADVENTURE_PATT'] = '“(.-)”[女侠在].-触发奇遇【(.-)】', + ['ADVENTURE_PATT2'] = '恭喜侠士(.-)在.-中获得稀有掉落%[(.-)%]', + ['ADVENTURE_PATT3'] = '“(.-)”在.-捕获.-稀有坐骑马“(.-)”的马驹', + ['You got %s, would you like to share?'] = '你触发了%s,是否愿意点击分享到公共数据查询中?', + ['[%s] got %s, would you like to share?'] = '[%s]触发了%s,是否愿意点击分享到公共数据查询中?', + ['You finished %s, would you like to share?'] = '你获得了%s,是否愿意点击分享到公共数据查询中?', + ['[%s] finished %s, would you like to share?'] = '[%s]获得了%s,是否愿意点击分享到公共数据查询中?', + ['Please input your realname, left blank for anonymous report:'] = '输入您希望显示的分享者名称,匿名分享请留空:', + + ['Would you like to share serendipity?'] = '是否希望分享世界奇遇公告和自身奇遇到茗伊公共查询?', + ['Would you like to auto share serendipity?'] = '是否希望自动分享奇遇到茗伊公共查询?', + ['Would you like to share serendipity silently?'] = '是否希望开启自动分享奇遇静默模式?', + ['Yes'] = '是', + ['No'] = '否', + + ['Anonymous'] = '匿名侠士', + ['JX3 is pround of you!'] = '剑网3幸甚有你!', + ['Thanks for your kindness!'] = '感谢各位无私付出的小可爱!', +} diff --git a/MY_!Base/lang/my_serendipity/zhtw.jx3dat b/MY_!Base/lang/my_serendipity/zhtw.jx3dat new file mode 100644 index 000000000..85739b430 --- /dev/null +++ b/MY_!Base/lang/my_serendipity/zhtw.jx3dat @@ -0,0 +1,20 @@ +return { + ['ADVENTURE_PATT'] = '鈥(.-)鈥漑濂充繝鍦╙.-瑙哥櫦濂囬亣銆(.-)銆', + ['ADVENTURE_PATT2'] = '鎭枩淇犲+(.-)鍦.-涓嵅寰楃█鏈夋帀钀%[(.-)%]', + ['ADVENTURE_PATT3'] = '鈥(.-)鈥濆湪.-鎹曠嵅.-绋鏈夊潗楱庨Μ鈥(.-)鈥濈殑棣', + ['You got %s, would you like to share?'] = '浣犺Ц鐧间簡%s锛屾槸鍚﹂鎰忛粸鎿婂垎浜埌鍏叡鏁告摎鏌ヨ涓紵', + ['[%s] got %s, would you like to share?'] = '[%s]瑙哥櫦浜%s锛屾槸鍚﹂鎰忛粸鎿婂垎浜埌鍏叡鏁告摎鏌ヨ涓紵', + ['You finished %s, would you like to share?'] = '浣犵嵅寰椾簡%s锛屾槸鍚﹂鎰忛粸鎿婂垎浜埌鍏叡鏁告摎鏌ヨ涓紵', + ['[%s] finished %s, would you like to share?'] = '[%s]鐛插緱浜%s锛屾槸鍚﹂鎰忛粸鎿婂垎浜埌鍏叡鏁告摎鏌ヨ涓紵', + ['Please input your realname, left blank for anonymous report:'] = '杓稿叆鎮ㄥ笇鏈涢’绀虹殑鍒嗕韩鑰呭悕绋憋紝鍖垮悕鍒嗕韩璜嬬暀绌猴細', + + ['Would you like to share serendipity?'] = '鏄惁甯屾湜鍒嗕韩涓栫晫濂囬亣鍏憡鍜岃嚜韬閬囧埌鑼椾紛鍏叡鏌ヨ锛', + ['Would you like to auto share serendipity?'] = '鏄惁甯屾湜鑷嫊鍒嗕韩濂囬亣鍒拌寳浼婂叕鍏辨煡瑭紵', + ['Would you like to share serendipity silently?'] = '鏄惁甯屾湜闁嬪暉鑷嫊鍒嗕韩濂囬亣闈滈粯妯″紡锛', + ['Yes'] = '鏄', + ['No'] = '鍚', + + ['Anonymous'] = '鍖垮悕淇犲+', + ['JX3 is pround of you!'] = '鍔嶇恫3骞哥敋鏈変綘锛', + ['Thanks for your kindness!'] = '鎰熻瑵鍚勪綅鐒$浠樺嚭鐨勫皬鍙剾锛', +} diff --git a/Boilerplate_!Base/lang/zhcn.jx3dat b/MY_!Base/lang/zhcn.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/zhcn.jx3dat rename to MY_!Base/lang/zhcn.jx3dat diff --git a/Boilerplate_!Base/lang/zhtw.jx3dat b/MY_!Base/lang/zhtw.jx3dat similarity index 100% rename from Boilerplate_!Base/lang/zhtw.jx3dat rename to MY_!Base/lang/zhtw.jx3dat diff --git a/Boilerplate_!Base/licenses/LICENSE.txt b/MY_!Base/licenses/LICENSE.txt similarity index 96% rename from Boilerplate_!Base/licenses/LICENSE.txt rename to MY_!Base/licenses/LICENSE.txt index 1488afff2..98ce76540 100644 --- a/Boilerplate_!Base/licenses/LICENSE.txt +++ b/MY_!Base/licenses/LICENSE.txt @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2009, SeasunGame +Copyright (c) 2012, Emil Zhai All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Boilerplate_!Base/licenses/LibDeflate-zlib.txt b/MY_!Base/licenses/LibDeflate-zlib.txt similarity index 100% rename from Boilerplate_!Base/licenses/LibDeflate-zlib.txt rename to MY_!Base/licenses/LibDeflate-zlib.txt diff --git a/Boilerplate_!Base/licenses/basexx-MIT.txt b/MY_!Base/licenses/basexx-MIT.txt similarity index 100% rename from Boilerplate_!Base/licenses/basexx-MIT.txt rename to MY_!Base/licenses/basexx-MIT.txt diff --git a/Boilerplate_!Base/licenses/lua-schema-MIT.txt b/MY_!Base/licenses/lua-schema-MIT.txt similarity index 100% rename from Boilerplate_!Base/licenses/lua-schema-MIT.txt rename to MY_!Base/licenses/lua-schema-MIT.txt diff --git a/Boilerplate_!Base/licenses/semver.lua-MIT.txt b/MY_!Base/licenses/semver.lua-MIT.txt similarity index 100% rename from Boilerplate_!Base/licenses/semver.lua-MIT.txt rename to MY_!Base/licenses/semver.lua-MIT.txt diff --git a/Boilerplate_!Base/licenses/uuid-MIT.txt b/MY_!Base/licenses/uuid-MIT.txt similarity index 100% rename from Boilerplate_!Base/licenses/uuid-MIT.txt rename to MY_!Base/licenses/uuid-MIT.txt diff --git a/Boilerplate_!Base/src/BgMsgCenter.lua b/MY_!Base/src/BgMsgCenter.lua similarity index 67% rename from Boilerplate_!Base/src/BgMsgCenter.lua rename to MY_!Base/src/BgMsgCenter.lua index a833b4ab0..5406816df 100644 --- a/Boilerplate_!Base/src/BgMsgCenter.lua +++ b/MY_!Base/src/BgMsgCenter.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯处理函数集成 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/BgMsgCenter') -------------------------------------------------------------------------------- @@ -102,23 +102,70 @@ X.RegisterBgMsg('RL', function(_, data, nChannel, dwTalkerID, szTalkerName, bIsS end) -- 查看完整属性 +local CHAR_INFO_BLOCK_LIST = {} X.RegisterBgMsg('CHAR_INFO', function(_, data, nChannel, dwTalkerID, szTalkerName, bIsSelf) if not bIsSelf and data[2] == X.GetClientPlayerID() then local nReplyChannel = X.IsTeammate(dwTalkerID) and PLAYER_TALK_CHANNEL.RAID or D.GetReplyChannel(nChannel, szTalkerName) - if data[1] == 'ASK' then - if not _G.MY_CharInfo or _G.MY_CharInfo.bEnable or data[3] == 'DEBUG' then + if data[1] == 'ASK' then + local bAcquaintance = X.IsTeammate(dwTalkerID) or X.IsFellowship(dwTalkerID) or X.IsAuthorPlayer(dwTalkerID, szTalkerName) + local bDebug = data[3] == 'DEBUG' and bAcquaintance + local bConfirm = not bAcquaintance and not bDebug + local function fnResolve() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'CHAR_INFO request from ' .. szTalkerName .. ' (' .. dwTalkerID .. ') accepted, sending info.', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] local aInfo = X.GetClientPlayerCharInfo() - if not X.IsTeammate(dwTalkerID) and not data[3] == 'DEBUG' then + if not X.IsTeammate(dwTalkerID) and not bDebug then for _, v in ipairs(aInfo) do v.tip = nil end end X.SendBgMsg(nReplyChannel, 'CHAR_INFO', {'ACCEPT', dwTalkerID, aInfo}, true) - else + end + local function fnReject() X.SendBgMsg(nReplyChannel, 'CHAR_INFO', {'REFUSE', dwTalkerID}, true) end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'CHAR_INFO request from ' .. szTalkerName .. ' (' .. dwTalkerID .. '), ' .. (bConfirm and 'confirm' or 'no confirm') .. ' required', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + if not CHAR_INFO_BLOCK_LIST[dwTalkerID] and (not _G.MY_CharInfo or _G.MY_CharInfo.bEnable or bDebug) then + if bConfirm then + X.PeekOtherPlayerByID(dwTalkerID, function (dwID, eState, kPlayer) + if not kPlayer or kPlayer.nLevel ~= X.CONSTANT.MAX_PLAYER_LEVEL then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'CHAR_INFO request from ' .. szTalkerName .. ' (' .. dwTalkerID .. ') rejected due to not max level.', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return + end + X.MessageBox('MY_CharInfo', { + szMessage = _L('[%s] wants to see your detailed character info, OK?', szTalkerName), + { + szOption = g_tStrings.STR_ACCEPT, + fnAction = fnResolve, + }, { + szOption = g_tStrings.STR_REFUSE, + fnAction = fnReject, + }, + { + szOption = _L('Block'), + bCheck = true, + fnAction = function() + fnReject() + CHAR_INFO_BLOCK_LIST[dwTalkerID] = true + end, + } + }) + end) + else + fnResolve() + end + else + fnReject() + end + elseif data[1] == 'REFUSE' and data[2] == X.GetClientPlayerID() then + X.OutputSystemAnnounceMessage(_L('[%s] refused to share detailed character info with you.', szTalkerName)) end end end) @@ -338,6 +385,118 @@ end --- 子插件自定义背景通讯 -------------------------------------------------------------------------------- +-- 团队工具·团队秘境CD +do + local LAST_TIME = {} + X.RegisterBgMsg('MY_TEAM_TOOLS__MAP_CD_REQ', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if bSelf then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Team map copy id request sent.', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return + end + local dwMapID, aRequestID, aRefreshID = data[1], data[2], data[3] + local dwID = X.GetClientPlayerID() + local szGlobalID = X.GetClientPlayerGlobalID() + local bNotChange = not X.IsNil(LAST_TIME[dwMapID]) + local bResponse = D.NeedReply(aRequestID, aRefreshID, dwID, szGlobalID, bNotChange) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Team map copy id request from ' .. szTalkerName + .. ', will ' .. (bResponse and '' or 'not ') .. 'response.', X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] + if bResponse then + local tProgress, aCopyID + local function fnAction() + if not tProgress or not aCopyID then + return + end + local nReplyChannel = D.GetReplyChannel(nChannel, szTalkerName) + X.SendBgMsg(nReplyChannel, 'MY_TEAM_TOOLS__MAP_CD_RES', {X.GetClientPlayerGlobalID(), dwMapID, aCopyID, tProgress}, true) + end + local bCDProgressMap = X.IsCDProgressMap(dwMapID) + if bCDProgressMap then + X.GetClientPlayerMapCDProgress(dwMapID, function(t) + tProgress = t + fnAction() + end) + else + tProgress = {} + end + X.GetMapSaveCopy(function(tMapID) + aCopyID = tMapID[dwMapID] or {} + fnAction() + end) + LAST_TIME[dwMapID] = GetCurrentTime() + end + end) + X.RegisterEvent('UPDATE_DUNGEON_ROLE_PROGRESS', function() + local dwMapID, dwPlayerID = arg0, arg1 + if dwPlayerID == X.GetClientPlayerID() then + LAST_TIME[dwMapID] = nil + end + end) + X.RegisterEvent({ + 'ON_RESET_MAP_RESPOND', + 'ON_APPLY_PLAYER_SAVED_COPY_RESPOND', + }, function() + LAST_TIME = {} + end) +end + +-- 团队工具·成就统计 +do + local LAST_ACHIEVE_TIME, LAST_COUNTER_TIME = {}, {} + X.RegisterBgMsg('MY_TEAM_TOOLS__ACHIEVE_REQ', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if bSelf then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Team achievement request sent.', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return + end + local aAchieveID, aCounterID, aRequestID, aRefreshID = data[1], data[2], data[3], data[4] + local dwID = X.GetClientPlayerID() + local szGlobalID = X.GetClientPlayerGlobalID() + local bNotChange = true + for _, vv in ipairs(aAchieveID) do + if not LAST_ACHIEVE_TIME[vv] then + bNotChange = false + end + end + for _, vv in ipairs(aCounterID) do + if not LAST_COUNTER_TIME[vv] then + bNotChange = false + end + end + local bResponse = D.NeedReply(aRequestID, aRefreshID, dwID, szGlobalID, bNotChange) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Achievement request from ' .. szTalkerName + .. ', will ' .. (bResponse and '' or 'not ') .. 'response.', X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] + if bResponse then + local me = X.GetClientPlayer() + local aAchieveRes, aCounterRes = {}, {} + for _, dwAchieveID in ipairs(aAchieveID) do + LAST_ACHIEVE_TIME[dwAchieveID] = GetCurrentTime() + table.insert(aAchieveRes, {dwAchieveID, me.IsAchievementAcquired(dwAchieveID)}) + end + for _, dwCounterID in ipairs(aCounterID) do + LAST_COUNTER_TIME[dwCounterID] = GetCurrentTime() + table.insert(aCounterRes, {dwCounterID, me.GetAchievementCount(dwCounterID)}) + end + local nReplyChannel = D.GetReplyChannel(nChannel, szTalkerName) + X.SendBgMsg(nReplyChannel, 'MY_TEAM_TOOLS__ACHIEVE_RES', {aAchieveRes, aCounterRes, X.GetClientPlayerGlobalID()}, true) + end + end) + X.RegisterEvent({ + 'NEW_ACHIEVEMENT', + 'SYNC_ACHIEVEMENT_DATA', + 'UPDATE_ACHIEVEMENT_POINT', + 'UPDATE_ACHIEVEMENT_COUNT', + }, function() + LAST_ACHIEVE_TIME, LAST_COUNTER_TIME = {}, {} + end) +end + -------------------------------------------------------------------------------- --[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/Boilerplate_!Base/src/DebugLogs.lua b/MY_!Base/src/DebugLogs.lua similarity index 97% rename from Boilerplate_!Base/src/DebugLogs.lua rename to MY_!Base/src/DebugLogs.lua index f92b1fea1..3b9a062cf 100644 --- a/Boilerplate_!Base/src/DebugLogs.lua +++ b/MY_!Base/src/DebugLogs.lua @@ -3,8 +3,8 @@ -- @desc : 各种调试信息输出 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/DebugLogs') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_BgMsgSegmentViewer.lua b/MY_!Base/src/Dev_BgMsgSegmentViewer.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_BgMsgSegmentViewer.lua rename to MY_!Base/src/Dev_BgMsgSegmentViewer.lua index 85b996e3c..45b65741f 100644 --- a/Boilerplate_!Base/src/Dev_BgMsgSegmentViewer.lua +++ b/MY_!Base/src/Dev_BgMsgSegmentViewer.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯分片查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/Dev_BgMsgSegmentViewer') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua b/MY_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua rename to MY_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua index 517405f0f..e6a3f411a 100644 --- a/Boilerplate_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua +++ b/MY_!Base/src/Dev_BgMsgSegmentViewer_Detail.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯分片详情查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/Dev_BgMsgSegmentViewer_Detail') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_BgMsgSender.lua b/MY_!Base/src/Dev_BgMsgSender.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_BgMsgSender.lua rename to MY_!Base/src/Dev_BgMsgSender.lua index c9a66f447..7a4645598 100644 --- a/Boilerplate_!Base/src/Dev_BgMsgSender.lua +++ b/MY_!Base/src/Dev_BgMsgSender.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯发送器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/Dev_BgMsgSender') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_BgMsgViewer.lua b/MY_!Base/src/Dev_BgMsgViewer.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_BgMsgViewer.lua rename to MY_!Base/src/Dev_BgMsgViewer.lua index fe88c2c4e..0252c9b61 100644 --- a/Boilerplate_!Base/src/Dev_BgMsgViewer.lua +++ b/MY_!Base/src/Dev_BgMsgViewer.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/Dev_BgMsgViewer') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_BgMsgViewer_Detail.lua b/MY_!Base/src/Dev_BgMsgViewer_Detail.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_BgMsgViewer_Detail.lua rename to MY_!Base/src/Dev_BgMsgViewer_Detail.lua index b65ae99a7..260551259 100644 --- a/Boilerplate_!Base/src/Dev_BgMsgViewer_Detail.lua +++ b/MY_!Base/src/Dev_BgMsgViewer_Detail.lua @@ -3,8 +3,8 @@ -- @desc : 背景通讯详情查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/Dev_BgMsgViewer_Detail') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_UIEditor.lua b/MY_!Base/src/Dev_UIEditor.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_UIEditor.lua rename to MY_!Base/src/Dev_UIEditor.lua index 1826e7aec..b4f9c664a 100644 --- a/Boilerplate_!Base/src/Dev_UIEditor.lua +++ b/MY_!Base/src/Dev_UIEditor.lua @@ -3,8 +3,8 @@ -- @desc : UI查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/UIEditor') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_UIFindStation.lua b/MY_!Base/src/Dev_UIFindStation.lua similarity index 99% rename from Boilerplate_!Base/src/Dev_UIFindStation.lua rename to MY_!Base/src/Dev_UIFindStation.lua index 1e1912fc5..6d81e6199 100644 --- a/Boilerplate_!Base/src/Dev_UIFindStation.lua +++ b/MY_!Base/src/Dev_UIFindStation.lua @@ -3,8 +3,8 @@ -- @desc : 界面查看器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/UIFindStation') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/Dev_UIManager.lua b/MY_!Base/src/Dev_UIManager.lua similarity index 97% rename from Boilerplate_!Base/src/Dev_UIManager.lua rename to MY_!Base/src/Dev_UIManager.lua index 60b7e8d60..222943cc4 100644 --- a/Boilerplate_!Base/src/Dev_UIManager.lua +++ b/MY_!Base/src/Dev_UIManager.lua @@ -3,8 +3,8 @@ -- @desc : UI窗口枚举器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/UIManager') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/HoverEntry.lua b/MY_!Base/src/HoverEntry.lua similarity index 98% rename from Boilerplate_!Base/src/HoverEntry.lua rename to MY_!Base/src/HoverEntry.lua index f1892016b..3117df1ba 100644 --- a/Boilerplate_!Base/src/HoverEntry.lua +++ b/MY_!Base/src/HoverEntry.lua @@ -3,8 +3,8 @@ -- @desc : 悬浮功能入口 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/HoverEntry') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/KeyPanel.lua b/MY_!Base/src/KeyPanel.lua similarity index 99% rename from Boilerplate_!Base/src/KeyPanel.lua rename to MY_!Base/src/KeyPanel.lua index 822204824..fdd408f30 100644 --- a/Boilerplate_!Base/src/KeyPanel.lua +++ b/MY_!Base/src/KeyPanel.lua @@ -6,8 +6,8 @@ -- @modifier : Emil Zhai (root@zhaiyiming.com) -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/KeyPanel') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/LuaWatcher.lua b/MY_!Base/src/LuaWatcher.lua similarity index 99% rename from Boilerplate_!Base/src/LuaWatcher.lua rename to MY_!Base/src/LuaWatcher.lua index 07833dd98..2701f5f22 100644 --- a/Boilerplate_!Base/src/LuaWatcher.lua +++ b/MY_!Base/src/LuaWatcher.lua @@ -7,7 +7,7 @@ if LoadLUAData('interface/DEBUG.jx3dat') and IsLocalFileExist('ui/DEBUG.ini') th Wnd.OpenWindow('ui/DEBUG.ini') end -------------------------------------------------------------------------------- -local NS = 'Boilerplate' +local NS = 'MY' local D = {} local NO_RES_TIME = 6000 local MAX_COUNT = 50 diff --git a/MY_!Base/src/MY_Bidding.lua b/MY_!Base/src/MY_Bidding.lua new file mode 100644 index 000000000..0e1f438cd --- /dev/null +++ b/MY_!Base/src/MY_Bidding.lua @@ -0,0 +1,842 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 简易的多人拍卖 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = X.NSFormatString('{$NS}_!Base/MY_Bidding') +-------------------------------------------------------------------------------- +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local _L = X.LoadLangPack(X.PACKET_INFO.FRAMEWORK_ROOT .. 'lang/my_bidding/') +local INI_PATH = X.PACKET_INFO.FRAMEWORK_ROOT .. 'ui/MY_Bidding.ini' +local D = {} +local O = {} +local BIDDING_CACHE = {} + +function D.CheckChatLock() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Please unlock safety talk lock first!']) + return false + end + return true +end + +function D.CreateFrame(szKey) + local szFrameName = 'MY_Bidding#' .. szKey + if Station.SearchFrame(szFrameName) then + return + end + local ui, frame + ui = X.UI.CreateFrame('MY_Bidding', { + w = 565, h = 480, + text = _L['Bidding'], + onRemove = function() + if X.IsClientPlayerTeamDistributor() then + X.OutputSystemAnnounceMessage(_L['You are distributor, Please finish this bidding!']) + else + X.Confirm(_L['Sure cancel this bidding? You will not able to bidding this item.'], function() + X.UI.CloseFrame(frame) + end) + end + return true + end, + }) + frame = ui:Raw() + if not frame then + return + end + frame:SetName('MY_Bidding#' .. szKey) + X.UI.AppendFromIni(frame, INI_PATH, 'Wnd_Total', true) + frame:Lookup('Wnd_Config', 'Handle_ConfigName/Text_ConfigName_Title'):SetText(_L['Bidding item:']) + frame:Lookup('Wnd_Config', 'Handle_ConfigPriceMin/Text_ConfigPriceMin_Title'):SetText(_L['Min price:']) + frame:Lookup('Wnd_Config', 'Handle_ConfigPriceStep/Text_ConfigPriceStep_Title'):SetText(_L['Min price step:']) + frame:Lookup('Wnd_Config', 'Handle_ConfigNumber/Text_ConfigNumber_Title'):SetText(_L['Target bidding number:']) + frame:Lookup('Wnd_Config/WndButton_ConfigSubmit', 'Text_ConfigSubmit'):SetText(_L['Sure']) + frame:Lookup('Wnd_Config/WndButton_ConfigCancel', 'Text_ConfigCancel'):SetText(_L['Cancel']) + frame:Lookup('Wnd_Bidding/WndButton_Bidding', 'Text_ButtonBidding'):SetText(_L['Show price']) + frame:Lookup('Wnd_Bidding/WndButton_BiddingP', 'Text_ButtonBiddingP'):SetText(_L['P']) + frame:Lookup('Wnd_Bidding/WndButton_Publish', 'Text_Publish'):SetText(_L['Publish']) + frame:Lookup('Wnd_Bidding/WndButton_Finish', 'Text_Finish'):SetText(_L['Finish']) + frame:Lookup('WndScroll_Bidding', 'Handle_BiddingColumns/Handle_BiddingColumnName/Text_BiddingColumnName_Title'):SetText(_L['Name']) + frame:Lookup('WndScroll_Bidding', 'Handle_BiddingColumns/Handle_BiddingColumnPrice/Text_BiddingColumnPrice_Title'):SetText(_L['Price']) + frame:Lookup('WndScroll_Bidding', 'Handle_BiddingColumns/Handle_BiddingColumnTime/Text_BiddingColumnTime_Title'):SetText(_L['Time']) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Config/WndButton_ConfigSubmit')) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Config/WndButton_ConfigCancel')) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Bidding/WndButton_Bidding')) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Bidding/WndButton_BiddingP')) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Bidding/WndButton_Publish')) + X.UI.AdaptComponentAppearance(frame:Lookup('Wnd_Bidding/WndButton_Finish')) + frame:RegisterEvent('PARTY_DISBAND') + frame:RegisterEvent('PARTY_DELETE_MEMBER') + frame:RegisterEvent('TEAM_AUTHORITY_CHANGED') + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, -100) + D.SwitchConfig(frame, false) + D.SwitchCustomBidding(frame, false) + D.UpdateAuthourize(frame) + D.UpdateList(frame) + return frame +end + +function D.Open(tConfig) + if not tConfig then + tConfig = {} + end + if not tConfig.szKey then + tConfig.szKey = X.GetUUID() + end + if not X.IsClientPlayerTeamDistributor() then + return X.OutputSystemAnnounceMessage(_L['You are not distributor!']) + end + if not D.CheckChatLock() then + return + end + if not tConfig.szItem and not tConfig.dwTabType then + BIDDING_CACHE[tConfig.szKey] = { + tConfig = tConfig, + aRecord = {}, + } + local frame = D.CreateFrame(tConfig.szKey) + if not frame then + return + end + frame.bWaitInit = true + frame.tUnsavedConfig = X.Clone(tConfig) + D.UpdateConfig(frame) + D.SwitchConfig(frame, true) + D.UpdateAuthourize(frame) + else + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_BIDDING_START', tConfig) + D.PublishConfig(tConfig, true) + end +end + +function D.Close(szKey) + X.UI.CloseFrame('MY_Bidding#' .. szKey) +end + +function D.GetFrame(szKey) + return Station.Lookup('Normal/MY_Bidding#' .. szKey) +end + +function D.GetKey(frame) + return frame:GetName():sub(#'MY_Bidding#' + 1) +end + +function D.EditToConfig(edit, tConfig) + local aStruct = edit:GetTextStruct() + local tStruct = aStruct and aStruct[1] + if tStruct then + if tStruct.type == 'item' then + local item = GetItem(tStruct.item) + if item then + tConfig.szItem = nil + tConfig.dwTabType = item.dwTabType + tConfig.dwTabIndex = item.dwIndex + tConfig.nCount = item.bCanStack and item.nStackNum or 1 + tConfig.nBookID = item.nGenre == ITEM_GENRE.BOOK and item.nBookID or nil + end + elseif tStruct.type == 'iteminfo' then + tConfig.szItem = nil + tConfig.dwTabType = tStruct.tabtype + tConfig.dwTabIndex = tStruct.index + tConfig.nCount = 1 + tConfig.nBookID = nil + elseif tStruct.type == 'book' then + tConfig.szItem = nil + tConfig.dwTabType = tStruct.tabtype + tConfig.dwTabIndex = tStruct.index + tConfig.nCount = 1 + tConfig.nBookID = tStruct.bookinfo + elseif tStruct.type == 'text' then + tConfig.szItem = tStruct.text + tConfig.dwTabType = nil + tConfig.dwTabIndex = nil + tConfig.nCount = 1 + tConfig.nBookID = nil + end + end + local tCount = aStruct and aStruct[2] + if tCount and tCount.type == 'text' then + local nCount = tonumber(tCount.text:gsub('.*x', ''), 10) + if nCount then + tConfig.nCount = math.max(math.floor(nCount), 1) + end + end +end + +function D.ConfigToEditStruct(tConfig) + local aStruct = {} + if tConfig.nBookID then + table.insert(aStruct, { + type = 'book', + version = 0, + text = '[' .. X.GetItemInfoName(tConfig.dwTabType, tConfig.dwTabIndex, tConfig.nBookID) .. ']', + tabtype = tConfig.dwTabType, + index = tConfig.dwTabIndex, + bookinfo = tConfig.nBookID, + }) + if tConfig.nCount and tConfig.nCount > 1 then + table.insert(aStruct, { + type = 'text', + text = ' x' .. tConfig.nCount, + }) + end + elseif tConfig.dwTabType then + table.insert(aStruct, { + type = 'iteminfo', + version = 0, + text = '[' .. X.GetItemInfoName(tConfig.dwTabType, tConfig.dwTabIndex) .. ']', + tabtype = tConfig.dwTabType, + index = tConfig.dwTabIndex, + }) + if tConfig.nCount and tConfig.nCount > 1 then + table.insert(aStruct, { + type = 'text', + text = ' x' .. tConfig.nCount, + }) + end + elseif tConfig.szItem then + table.insert(aStruct, { + type = 'text', + text = tConfig.szItem, + }) + end + return aStruct +end + +function D.SetTextStruct(edit, aStruct) + edit:ClearText() + for _, p in ipairs(aStruct) do + if p.type == 'book' or p.type == 'iteminfo' then + edit:InsertObj(p.text, p) + elseif p.type == 'text' then + edit:InsertText(p.text) + end + end +end + +function D.ConfigToEdit(edit, tConfig) + D.SetTextStruct(edit, D.ConfigToEditStruct(tConfig)) +end + +function D.GetQuickBiddingPrice(szKey) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local aRecord = D.GetRankRecord(cache.aRecord) + -- 计算最低最高有效金额、最低加价金额 + local nCurrentLowestPrice = nil + local nCurrentHighestPrice = nil + local nNextPrice = tConfig.nPriceMin + if #aRecord >= tConfig.nNumber then + nCurrentLowestPrice = aRecord[tConfig.nNumber].nPrice + nCurrentHighestPrice = aRecord[1].nPrice + nNextPrice = nCurrentLowestPrice + tConfig.nPriceStep + end + -- 计算自己的当前有效出价 + local nMyPrice, bPassed + for i, p in ipairs(aRecord) do + if p.dwTalkerID == X.GetClientPlayerID() then + if i <= tConfig.nNumber then + nMyPrice = p.nPrice + end + if p.bP then + bPassed = true + end + end + end + return nNextPrice, nMyPrice, bPassed, nCurrentLowestPrice, nCurrentHighestPrice +end + +function D.RaiseBidding(szKey, nPrice) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + if not D.CheckChatLock() then + return false + end + local nNextPrice, nMyPrice, bPassed = D.GetQuickBiddingPrice(szKey) + if nMyPrice then + X.OutputSystemAnnounceMessage(_L('You already have a valid price at %s.', D.GetMoneyChatText(nMyPrice))) + return false + end + if bPassed then + X.OutputSystemAnnounceMessage(_L['You have already p.']) + return false + end + local nPriceNear = math.max(nNextPrice, math.floor(((nPrice - tConfig.nPriceMin) / tConfig.nPriceStep)) * tConfig.nPriceStep + tConfig.nPriceMin) + if nPrice ~= nPriceNear then + X.OutputSystemAnnounceMessage(_L['Not a valid price']) + X.OutputSystemAnnounceMessage(_L('Nearest price is %d and %d', nPriceNear, nPriceNear + tConfig.nPriceStep)) + return false + end + local aSay = D.ConfigToEditStruct(BIDDING_CACHE[szKey].tConfig) + table.insert(aSay, 1, { type = 'text', text = _L['Want to buy '] }) + table.insert(aSay, { type = 'text', text = _L(', bidding for %s.', D.GetMoneyChatText(nPrice)) }) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_BIDDING_ACTION', { szKey = szKey, nPrice = nPrice }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) + return true +end + +function D.DrawPrice(h, nGold) + h:Clear() + h:AppendItemFromString(GetMoneyText({ nGold = nGold }, 'font=162', 'all2')) + h:FormatAllItemPos() +end + +function D.UpdateConfig(frame) + local szKey = D.GetKey(frame) + local tConfig = BIDDING_CACHE[szKey].tConfig + local wnd = frame:Lookup('Wnd_Config') + local h = wnd:Lookup('', '') + if tConfig.dwTabType and tConfig.dwTabIndex then + -- dwTabType, dwTabIndex, nBookID + local szItem = X.GetItemInfoName(tConfig.dwTabType, tConfig.dwTabIndex, tConfig.nBookID) + if tConfig.nCount and tConfig.nCount > 1 then + szItem = szItem .. ' x' .. (tConfig.nCount or 1) + end + UpdateBoxObject( + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Handle_ConfigBiddingItem/Box_ConfigBiddingItem'), + UI_OBJECT.ITEM_INFO, nil, tConfig.dwTabType, tConfig.dwTabIndex, tConfig.nBookID or tConfig.nCount) + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Handle_ConfigBiddingItem'):Show() + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Text_ConfigBiddingName'):Hide() + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Handle_ConfigBiddingItem/Text_ConfigBiddingItem'):SetText(szItem) + D.ConfigToEdit(wnd:Lookup('WndEditBox_Name/WndEdit_Name'), tConfig) + else -- if tConfig.szItem then + -- szItem + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Handle_ConfigBiddingItem'):Hide() + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Text_ConfigBiddingName'):Show() + h:Lookup('Handle_ConfigName/Handle_ConfigName_Value/Text_ConfigBiddingName'):SetText(tConfig.szItem or '') + wnd:Lookup('WndEditBox_Name/WndEdit_Name'):SetText(tConfig.szItem or '') + end + wnd:Lookup('WndEditBox_PriceMin/WndEdit_PriceMin'):SetText(tConfig.nPriceMin or '') + D.DrawPrice(h:Lookup('Handle_ConfigPriceMin/Handle_ConfigPriceMin_Value'), tConfig.nPriceMin or 0) + wnd:Lookup('WndEditBox_PriceStep/WndEdit_PriceStep'):SetText(tConfig.nPriceStep or '') + D.DrawPrice(h:Lookup('Handle_ConfigPriceStep/Handle_ConfigPriceStep_Value'), tConfig.nPriceStep or 0) + wnd:Lookup('WndCombo_Number', 'Text_Number'):SetText(tConfig.nNumber or 1) + h:Lookup('Handle_ConfigNumber/Text_ConfigNumber_Value'):SetText(tConfig.nNumber or 1) + frame:Lookup('Wnd_Bidding/WndButton_Bidding'):SetVisible(not frame.bWaitInit) +end + +function D.SwitchConfig(frame, bConfig) + frame:Lookup('Wnd_Config/WndEditBox_Name'):SetVisible(bConfig) + frame:Lookup('Wnd_Config', 'Handle_ConfigName/Handle_ConfigName_Value'):SetVisible(not bConfig) + frame:Lookup('Wnd_Config/WndEditBox_PriceMin'):SetVisible(bConfig) + frame:Lookup('Wnd_Config', 'Handle_ConfigPriceMin/Handle_ConfigPriceMin_Value'):SetVisible(not bConfig) + frame:Lookup('Wnd_Config/WndEditBox_PriceStep'):SetVisible(bConfig) + frame:Lookup('Wnd_Config', 'Handle_ConfigPriceStep/Handle_ConfigPriceStep_Value'):SetVisible(not bConfig) + frame:Lookup('Wnd_Config/WndCombo_Number'):SetVisible(bConfig) + frame:Lookup('Wnd_Config', 'Handle_ConfigNumber/Text_ConfigNumber_Value'):SetVisible(not bConfig) + frame:Lookup('Wnd_Config/WndButton_ConfigSubmit'):SetVisible(bConfig) + frame:Lookup('Wnd_Config/WndButton_ConfigCancel'):SetVisible(not frame.bWaitInit and bConfig) + frame:Lookup('Wnd_Config/Btn_Option'):SetVisible(not bConfig) +end + +function D.SwitchCustomBidding(frame, bCustom) + frame:Lookup('Wnd_CustomBidding'):SetVisible(bCustom) +end + +function D.UpdateAuthourize(frame) + local bDistributor = X.IsClientPlayerTeamDistributor() + if not bDistributor then + D.SwitchConfig(frame, false) + end + frame:Lookup('Wnd_Config/Btn_Option'):SetVisible(not frame.bWaitInit and bDistributor) + frame:Lookup('Wnd_Bidding/WndButton_Publish'):SetVisible(not frame.bWaitInit and bDistributor) + frame:Lookup('Wnd_Bidding/WndButton_Finish'):SetVisible(not frame.bWaitInit and bDistributor) +end + +function D.RecordSorter(r1, r2) + if r1.nPrice == r2.nPrice then + return r1.dwTick < r2.dwTick + end + return r1.nPrice > r2.nPrice +end + +function D.GetRankRecord(aRecord) + local tRes = {} + for _, rec in ipairs(aRecord) do + if not tRes[rec.dwTalkerID] or tRes[rec.dwTalkerID].dwTick < rec.dwTick then + tRes[rec.dwTalkerID] = rec + end + end + local aRes = {} + for _, v in pairs(tRes) do + table.insert(aRes, v) + end + if #aRes > 0 then + table.sort(aRes, D.RecordSorter) + end + return aRes +end + +function D.UpdateList(frame) + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local aRecord = D.GetRankRecord(BIDDING_CACHE[szKey].aRecord) + local h = frame:Lookup('WndScroll_Bidding', 'Handle_List') + h:Clear() + for i, rec in ipairs(aRecord) do + local hItem = h:AppendItemFromIni(INI_PATH, 'Handle_Row') + hItem.rec = rec + hItem:Lookup('Handle_RowItem/Image_RowItemKungfu'):FromIconID(Table_GetSkillIconID(rec.dwKungfu, 1)) + hItem:Lookup('Handle_RowItem/Text_RowItemName'):SetText(rec.szTalkerName) + D.DrawPrice(hItem:Lookup('Handle_RowItem/Handle_RowItemPrice'), rec.nPrice) + hItem:Lookup('Handle_RowItem/Text_RowItemTime'):SetText(X.FormatTime(rec.dwTime, '%hh:%mm:%ss')) + hItem:Lookup('Handle_RowItem/Text_RowItemP'):SetVisible(rec.bP) + hItem:SetAlpha(tConfig.nNumber < i and 100 or 255) + end + h:FormatAllItemPos() +end + +function D.PublishConfig(tConfig, bInit) + local aSay = D.ConfigToEditStruct(tConfig) + if bInit then + table.insert(aSay, 1, { type = 'text', text = _L['Raise bidding for '] }) + else + table.insert(aSay, 1, { type = 'text', text = _L['Modify bidding for '] }) + end + table.insert(aSay, { + type = 'text', + text = _L(', min price is %s, bidding step is %s.', + D.GetMoneyChatText(tConfig.nPriceMin), + D.GetMoneyChatText(tConfig.nPriceStep)), + }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) +end + +function D.GetMoneyChatText(nGold) + if nGold >= 10000 then + local nBrick = math.floor(nGold / 10000) + local nGold = nGold % 10000 + if nGold == 0 then + return _L('%d brick', nBrick) + end + return _L('%d brick %d gold', nBrick, nGold) + end + return _L('%d gold', nGold) +end + +------------------------------------------------------------------------------------------------------- +-- 界面事件 +------------------------------------------------------------------------------------------------------- + +function D.OnEvent(event) + if event == 'PARTY_DISBAND' then + X.UI.CloseFrame(this) + elseif event == 'PARTY_DELETE_MEMBER' then + if X.GetClientPlayerID() == arg1 then + X.UI.CloseFrame(this) + end + elseif event == 'TEAM_AUTHORITY_CHANGED' then + D.UpdateAuthourize(this) + end +end + +function D.OnLButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Btn_Option' then + if not X.IsClientPlayerTeamDistributor() then + return X.OutputSystemAnnounceMessage(_L['You are not distributor!']) + end + local szKey = D.GetKey(frame) + frame.tUnsavedConfig = X.Clone(BIDDING_CACHE[szKey].tConfig) + D.UpdateConfig(frame) + D.SwitchConfig(frame, true) + elseif name == 'Btn_Number' then + local frame = frame + local txt = this:GetParent():Lookup('', 'Text_Number') + local menu = {} + for i = 1, 24 do + table.insert(menu, { + szOption = i, + fnAction = function() + frame.tUnsavedConfig.nNumber = i + txt:SetText(i) + X.UI.ClosePopupMenu() + end, + }) + end + local wnd = this:GetParent() + menu.x = wnd:GetAbsX() + menu.y = wnd:GetAbsY() + wnd:GetH() + menu.nMinWidth = wnd:GetW() + X.UI.PopupMenu(menu) + elseif name == 'WndButton_ConfigSubmit' then + if not X.IsClientPlayerTeamDistributor() then + return X.OutputSystemAnnounceMessage(_L['You are not distributor!']) + end + if not D.CheckChatLock() then + return + end + local tConfig = frame.tUnsavedConfig + local wnd = this:GetParent() + D.EditToConfig(wnd:Lookup('WndEditBox_Name/WndEdit_Name'), tConfig) + tConfig.nPriceMin = tonumber(wnd:Lookup('WndEditBox_PriceMin/WndEdit_PriceMin'):GetText()) or 2000 + tConfig.nPriceStep = tonumber(wnd:Lookup('WndEditBox_PriceStep/WndEdit_PriceStep'):GetText()) or 1000 + tConfig.nNumber = tConfig.nNumber or 1 + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, frame.bWaitInit and 'MY_BIDDING_START' or 'MY_BIDDING_CONFIG', tConfig) + D.PublishConfig(tConfig, frame.bWaitInit) + frame.bWaitInit = nil + D.SwitchConfig(frame, false) + D.UpdateAuthourize(frame) + elseif name == 'WndButton_ConfigCancel' then + D.SwitchConfig(frame, false) + elseif name == 'WndButton_BiddingP' then + if not D.CheckChatLock() then + return + end + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local aRecord = D.GetRankRecord(cache.aRecord) + local bExist, bP, bValid = false, false, false + for i, p in ipairs(aRecord) do + if p.dwTalkerID == X.GetClientPlayerID() then + bExist = true + if p.bP then + bP = true + elseif i <= cache.tConfig.nNumber then + bValid = true + end + break + end + end + if not bExist then + return X.OutputSystemAnnounceMessage(_L['You have not bidding a price yet.']) + end + if bP then + return X.OutputSystemAnnounceMessage(_L['You have already p.']) + end + if bValid then + return X.OutputSystemAnnounceMessage(_L['You cannot p cause you have a valid price.']) + end + local aSay = D.ConfigToEditStruct(BIDDING_CACHE[szKey].tConfig) + table.insert(aSay, 1, { type = 'text', text = _L['Exit from bidding '] }) + table.insert(aSay, { type = 'text', text = _L[', P.'] }) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_BIDDING_P', { szKey = szKey }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) + elseif name == 'WndButton_Bidding' then + local szKey = D.GetKey(frame) + local nNextPrice, nMyPrice, bPassed = D.GetQuickBiddingPrice(szKey) + if bPassed then + return X.OutputSystemAnnounceMessage(_L['You have already p.']) + end + if IsShiftKeyDown() then + D.RaiseBidding(szKey, nNextPrice) + else + this:GetParent():GetParent() + :Lookup('Wnd_CustomBidding/WndEditBox_CustomBidding/WndEdit_CustomBidding') + :SetText(nNextPrice) + D.SwitchCustomBidding(frame, true) + end + elseif name == 'WndButton_CustomBiddingDown' then + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local edit = this:GetParent():Lookup('WndEditBox_CustomBidding/WndEdit_CustomBidding') + local nNextPrice = D.GetQuickBiddingPrice(szKey) + local nPrice = tonumber(edit:GetText()) or 0 + nPrice = math.max(nNextPrice, math.floor(((nPrice - tConfig.nPriceMin) / tConfig.nPriceStep) - 1) * tConfig.nPriceStep + tConfig.nPriceMin) + edit:SetText(nPrice) + elseif name == 'WndButton_CustomBiddingUp' then + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local edit = this:GetParent():Lookup('WndEditBox_CustomBidding/WndEdit_CustomBidding') + local nNextPrice = D.GetQuickBiddingPrice(szKey) + local nPrice = tonumber(edit:GetText()) or 0 + nPrice = math.max(nNextPrice, math.floor(((nPrice - tConfig.nPriceMin) / tConfig.nPriceStep) + 1) * tConfig.nPriceStep + tConfig.nPriceMin) + edit:SetText(nPrice) + elseif name == 'WndButton_CustomBiddingSure' then + local szKey = D.GetKey(frame) + local edit = this:GetParent():Lookup('WndEditBox_CustomBidding/WndEdit_CustomBidding') + local nPrice = tonumber(edit:GetText()) or 0 + D.RaiseBidding(szKey, nPrice) + D.SwitchCustomBidding(frame, false) + elseif name == 'WndButton_CustomBiddingCancel' then + D.SwitchCustomBidding(frame, false) + elseif name == 'WndButton_Publish' then + if not D.CheckChatLock() then + return + end + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local aRecord = D.GetRankRecord(cache.aRecord) + local aSay = D.ConfigToEditStruct(tConfig) + table.insert(aSay, 1, { type = 'text', text = _L['Bidding'] }) + if #aRecord == 0 then + table.insert(aSay, { type = 'text', text = _L[', no valid price'] }) + else + table.insert(aSay, { type = 'text', text = _L[', current valid prices: '] }) + for i = 1, math.min(#aRecord, tConfig.nNumber) do + if i > 1 then + table.insert(aSay, { type = 'text', text = _L[','] }) + end + table.insert(aSay, { type = 'name', name = aRecord[i].szTalkerName }) + table.insert(aSay, { type = 'text', text = aRecord[i].nPrice .. _L[' gold'] }) + end + end + table.insert(aSay, { type = 'text', text = _L['.'] }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) + elseif name == 'WndButton_Finish' then + if not D.CheckChatLock() then + return + end + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local aRecord = D.GetRankRecord(cache.aRecord) + local aSay = D.ConfigToEditStruct(tConfig) + table.insert(aSay, 1, { type = 'text', text = _L['Bidding'] }) + if #aRecord == 0 then + table.insert(aSay, { type = 'text', text = _L[', nobody would buy it'] }) + else + table.insert(aSay, { type = 'text', text = _L[', finally bidding valid prices: '] }) + for i = 1, math.min(#aRecord, tConfig.nNumber) do + if i > 1 then + table.insert(aSay, { type = 'text', text = _L[','] }) + end + table.insert(aSay, { type = 'name', name = aRecord[i].szTalkerName }) + table.insert(aSay, { type = 'text', text = aRecord[i].nPrice .. _L[' gold'] }) + end + end + table.insert(aSay, { type = 'text', text = _L[', bidding finished.'] }) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_BIDDING_FINISH', { szKey = szKey }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) + end +end + +function D.OnRButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'WndButton_Bidding' then + local szKey = D.GetKey(frame) + local nNextPrice, nMyPrice, bPassed, nCurrentLowestPrice, nCurrentHighestPrice = D.GetQuickBiddingPrice(szKey) + local menu = { + { szOption = _L['Raise quick bidding'], bDisable = true }, + } + for _, nPriceAdd in ipairs({ 100, 1000, 5000, 10000, 20000, 50000, 100000 }) do + table.insert(menu, { + bRichText = true, + szOption = GetFormatText('+', 162) .. GetMoneyText({ nGold = nPriceAdd }, 'font=162', 'all2'), + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + local szXml = bPassed + and GetFormatText(_L['You have already p.']) + or (GetFormatText(_L['Click to raise quick bidding.']) + .. (nMyPrice + and GetFormatText('\n' .. _L['Your valid price is ']) + .. GetMoneyText({ nGold = nMyPrice }, 'font=162', 'all2') + or GetFormatText('\n' .. _L['Click to quick bidding at price ']) + .. GetMoneyText({ nGold = nCurrentLowestPrice + nPriceAdd }, 'font=162', 'all2')) + .. GetFormatText(_L['.'])) + OutputTip(szXml, 600, {nX, nY, nW, nH}, ALW.BOTTOM_TOP) + end, + fnMouseLeave = function() + HideTip() + end, + fnAction = function() + if bPassed then + return X.OutputSystemAnnounceMessage(_L['You have already p.']) + end + local msg = { + szName = 'MY_Bidding_Confirm', + szMessage = GetFormatText(_L['Sure to raise bidding to ']) + .. GetMoneyText({ nGold = nCurrentLowestPrice + nPriceAdd }, 'font=162', 'all2') + .. GetFormatText(_L['?']), + bRichText = true, + szAlignment = 'CENTER', + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + D.RaiseBidding(szKey, nCurrentLowestPrice + nPriceAdd) + end + }, + { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + } + MessageBox(msg) + end, + }) + end + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.nMiniWidth = this:GetW() + menu.x = nX + menu.y = nY + nH + X.UI.PopupMenu(menu) + end +end + +function D.OnItemRefreshTip() + local name = this:GetName() + if name == 'Handle_ButtonBidding' then + local frame = this:GetRoot() + local szKey = D.GetKey(frame) + local nNextPrice, nMyPrice, bPassed = D.GetQuickBiddingPrice(szKey) + local szXml = bPassed + and GetFormatText(_L['You have already p.']) + or (GetFormatText(_L['Click to input price.']) + .. (nMyPrice + and GetFormatText('\n' .. _L['Your valid price is ']) + .. GetMoneyText({ nGold = nMyPrice }, 'font=162', 'all2') + or GetFormatText('\n' .. _L['Hold SHIFT when click to quick bidding at price ']) + .. GetMoneyText({ nGold = nNextPrice }, 'font=162', 'all2') + .. GetFormatText('\n' .. _L['Right click to select quick bidding price.'])) + .. GetFormatText(_L['.'])) + X.OutputTip(this, szXml, true, ALW.TOP_BOTTOM) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_ButtonBidding' then + HideTip() + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_RowItemDelete' then + if not X.IsClientPlayerTeamDistributor() then + return X.OutputSystemAnnounceMessage(_L['You are not distributor!']) + end + if not D.CheckChatLock() then + return + end + local frame = this:GetRoot() + local szKey = D.GetKey(frame) + local cache = BIDDING_CACHE[szKey] + local tConfig = cache.tConfig + local aSay = D.ConfigToEditStruct(tConfig) + local rec = this:GetParent().rec + table.insert(aSay, 1, { type = 'text', text = _L['Modify bidding for '] }) + table.insert(aSay, { type = 'text', text = _L['\'s record, delete '] }) + table.insert(aSay, { type = 'name', name = rec.szTalkerName }) + table.insert(aSay, { type = 'text', text = _L[' \'s invalid price .'] }) + X.Confirm(_L('Sure to delete %s\'s bidding record?', rec.szTalkerName), function() + if not X.IsClientPlayerTeamDistributor() then + return X.OutputSystemAnnounceMessage(_L['You are not distributor!']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_BIDDING_DELETE', { szKey = szKey, dwTalkerID = rec.dwTalkerID }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, aSay, { parsers = { name = false } }) + end) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Bidding', + exports = { + { + preset = 'UIEvent', + fields = { + Open = D.Open, + Close = D.Close, + }, + root = D, + }, + }, +} +MY_Bidding = X.CreateModule(settings) +end + +------------------------------------------------------------------------------------------------------- +-- 背景通信 +------------------------------------------------------------------------------------------------------- +X.RegisterBgMsg('MY_BIDDING_START', function(_, tConfig, nChannel, dwTalkerID, szTalkerName, bSelf) + BIDDING_CACHE[tConfig.szKey] = { + tConfig = tConfig, + aRecord = {}, + } + local frame = D.CreateFrame(tConfig.szKey) + if not frame then + return + end + D.UpdateConfig(frame) +end) + +X.RegisterBgMsg('MY_BIDDING_CONFIG', function(_, tConfig, nChannel, dwTalkerID, szTalkerName, bSelf) + if BIDDING_CACHE[tConfig.szKey] then + BIDDING_CACHE[tConfig.szKey].tConfig = tConfig + end + local frame = D.GetFrame(tConfig.szKey) + if not frame then + return + end + D.UpdateConfig(frame) +end) + +X.RegisterBgMsg('MY_BIDDING_ACTION', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not BIDDING_CACHE[data.szKey] then + return + end + table.insert(BIDDING_CACHE[data.szKey].aRecord, { + dwTalkerID = dwTalkerID, + szTalkerName = szTalkerName, + nPrice = data.nPrice, + dwTime = GetCurrentTime(), + dwTick = GetTickCount(), + dwKungfu = X.GetTeamMemberInfo(dwTalkerID).dwKungfuID, + }) + local frame = D.GetFrame(data.szKey) + if not frame then + return + end + D.UpdateList(frame) +end) + +X.RegisterBgMsg('MY_BIDDING_P', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not BIDDING_CACHE[data.szKey] then + return + end + for _, p in ipairs(BIDDING_CACHE[data.szKey].aRecord) do + if p.dwTalkerID == dwTalkerID then + p.bP = true + end + end + local frame = D.GetFrame(data.szKey) + if not frame then + return + end + D.UpdateList(frame) +end) + +X.RegisterBgMsg('MY_BIDDING_DELETE', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not BIDDING_CACHE[data.szKey] then + return + end + local aRecord = BIDDING_CACHE[data.szKey].aRecord + for i, p in X.ipairs_r(aRecord) do + if p.dwTalkerID == data.dwTalkerID then + table.remove(aRecord, i) + end + end + local frame = D.GetFrame(data.szKey) + if not frame then + return + end + D.UpdateList(frame) +end) + +X.RegisterBgMsg('MY_BIDDING_FINISH', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not BIDDING_CACHE[data.szKey] then + return + end + BIDDING_CACHE[data.szKey] = nil + D.Close(data.szKey) +end) + +X.RegisterAddonMenu('MY_Bidding', { szOption = _L['Create bidding'], fnAction = D.Open }) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_!Base/src/MY_RSS.lua b/MY_!Base/src/MY_RSS.lua new file mode 100644 index 000000000..6adef5210 --- /dev/null +++ b/MY_!Base/src/MY_RSS.lua @@ -0,0 +1,149 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : RSS 数据订阅 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = X.NSFormatString('{$NS}_!Base/MY_RSS') +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_!Base' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_!Base' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '*') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local D = {} +local RSS_FILE = {'temporary/rss.jx3dat', X.PATH_TYPE.GLOBAL} +local RSS_DATA = X.LoadLUAData(RSS_FILE) or {} +local RSS_ADAPTER = {} +local RSS_DATA_CACHE = {} +local RSS_BASE_URL = 'https://rss.j3cx.com' +local RSS_PULL_BASE_URL = 'https://pull.j3cx.com' +local RSS_PUSH_BASE_URL = 'https://push.j3cx.com' +local RSS_PAGE_BASE_URL = 'https://page.j3cx.com' + +function D.Get(szKey) + if X.IsNil(RSS_DATA) then + return + end + if not RSS_DATA_CACHE[szKey] then + local data = X.Clone(RSS_DATA[szKey]) + if RSS_ADAPTER[szKey] then + data = RSS_ADAPTER[szKey](data) + end + RSS_DATA_CACHE[szKey] = data + end + return RSS_DATA_CACHE[szKey] +end + +function D.RegisterAdapter(szKey, fnAdapter) + RSS_ADAPTER[szKey] = fnAdapter + RSS_DATA_CACHE[szKey] = nil + if X.IsNil(RSS_DATA) then + return + end + FireUIEvent('MY_RSS_UPDATE', szKey) +end + +function D.Sync() + local RSS_URL = { + RSS_BASE_URL .. '/rss' + .. '?l=' .. X.ENVIRONMENT.GAME_LANG + .. '&L=' .. X.ENVIRONMENT.GAME_EDITION + .. '&_=' .. GetCurrentTime(), + RSS_PULL_BASE_URL .. '/config/all' + .. '?l=' .. X.ENVIRONMENT.GAME_LANG + .. '&L=' .. X.ENVIRONMENT.GAME_EDITION + .. '&_=' .. GetCurrentTime(), + } + local tData, tDataIndex = {}, {} + local nPending = #RSS_URL + do + local nYear, nMonth, nDay, nHour, nMinute, nSecond = X.TimeToDate(GetCurrentTime()) + if nHour >= 7 then + nDay = nDay + 1 + end + tData.EXPIRES = X.DateToTime(nYear, nMonth, nDay, 7, 0, 0) + end + local function fnAction(nIndex, data) + if X.IsTable(data) then + if X.IsNumber(data.EXPIRES) then + tData.EXPIRES = math.min(tData.EXPIRES or math.huge, data.EXPIRES) + end + for k, v in pairs(data) do + if k ~= 'EXPIRES' and nIndex < (tDataIndex[k] or math.huge) then + tData[k] = v + tDataIndex[k] = nIndex + RSS_DATA[k] = v + RSS_DATA_CACHE[k] = nil + FireUIEvent('MY_RSS_UPDATE', k) + end + end + end + nPending = nPending - 1 + if nPending > 0 then + return + end + for k, _ in pairs(RSS_DATA) do + if X.IsNil(tData[k]) then + RSS_DATA[k] = nil + RSS_DATA_CACHE[k] = nil + FireUIEvent('MY_RSS_UPDATE', k) + end + end + X.SaveLUAData(RSS_FILE, RSS_DATA) + end + for nIndex, szURL in ipairs(RSS_URL) do + X.Ajax({ + url = szURL, + success = function(html, status) + local data = X.DecodeJSON(html) + fnAction(nIndex, data) + end, + error = function(errMsg, status) + fnAction(nIndex, nil) + end, + }) + end +end + +X.RegisterInit('MY_RSS', function() + if not X.IsNumber(RSS_DATA.EXPIRES) or RSS_DATA.EXPIRES < GetCurrentTime() then + D.Sync() + else + FireUIEvent('MY_RSS_UPDATE') + end +end) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RSS', + exports = { + { + fields = { + 'RegisterAdapter', + 'Get', + 'Sync', + PULL_BASE_URL = RSS_PULL_BASE_URL, + PUSH_BASE_URL = RSS_PUSH_BASE_URL, + PAGE_BASE_URL = RSS_PAGE_BASE_URL, + }, + root = D, + }, + }, +} +MY_RSS = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_!Base/src/MY_Serendipity.lua b/MY_!Base/src/MY_Serendipity.lua new file mode 100644 index 000000000..abb8e70ce --- /dev/null +++ b/MY_!Base/src/MY_Serendipity.lua @@ -0,0 +1,493 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 奇遇分享模块 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = X.NSFormatString('{$NS}_!Base/MY_Serendipity') +-------------------------------------------------------------------------------- +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local _L, D = X.LoadLangPack(X.PACKET_INFO.FRAMEWORK_ROOT .. 'lang/my_serendipity/'), {} +local O = { + bEnable = X.SchemaGet(X.LoadLUAData({'config/show_notify.jx3dat' , X.PATH_TYPE.GLOBAL}), X.Schema.Boolean, false), + bSound = X.SchemaGet(X.LoadLUAData({'config/serendipity_sound.jx3dat' , X.PATH_TYPE.GLOBAL}), X.Schema.Boolean, true ), + bPreview = X.SchemaGet(X.LoadLUAData({'config/serendipity_preview.jx3dat' , X.PATH_TYPE.GLOBAL}), X.Schema.Boolean, true ), + bAutoShare = X.SchemaGet(X.LoadLUAData({'config/serendipity_autoshare.jx3dat' , X.PATH_TYPE.GLOBAL}), X.Schema.Boolean, false), + bSilentMode = X.SchemaGet(X.LoadLUAData({'config/serendipity_silentmode.jx3dat', X.PATH_TYPE.GLOBAL}), X.Schema.Boolean, true ), +} + +local SERENDIPITY_INFO +local SERENDIPITY_METHOD = { + MSG_SYS = 1, -- 系统消息 + EVENT_TRIGGER = 2, -- 事件机制 + LOOT_ITEM = 3, -- 拾取物品 + FINISH_QUEST = 4, -- 完成任务 +} +local SERENDIPITY_STATUS = { + -- START = 0, -- 历史原因 0、1 枚举取值部分有逻辑问题,为了兼容已废除该值 + -- FINISH = 1, + DONE = 2, -- 直接完成 + START = 3, -- 触发 + FINISH = 4, -- 完成 +} +local SERENDIPITY_LIST = {} + +X.RegisterEvent('MY_NOTIFY_DISMISS', function() + for i, p in X.ipairs_r(SERENDIPITY_LIST) do + if p.szKey == arg0 then + table.remove(SERENDIPITY_LIST, i) + end + end +end) + +function D.GetSerendipityShareName(fnAction, bNoConfirm) + local szReporter = X.LoadLUAData({'config/realname.jx3dat', X.PATH_TYPE.ROLE}) or X.GetClientPlayer().szName:gsub('@.-$', '') + if bNoConfirm then + if fnAction then + fnAction(szReporter) + end + else + local function fnConfirm(szText) + if szText ~= szReporter then + X.SaveLUAData({'config/realname.jx3dat', X.PATH_TYPE.ROLE}, szText) + end + if fnAction then + fnAction(szText) + end + end + GetUserInput(_L['Please input your realname, left blank for anonymous report:'], fnConfirm, nil, nil, nil, szReporter, 6) + end +end + +function D.SerendipityShareConfirm(szName, szSerendipity, nMethod, eStatus, dwTime, szMode) + local szKey = szName .. '_' .. szSerendipity .. '_' .. dwTime + local szRegion = X.GetRegionOriginName() + local szServer = X.GetServerOriginName() + local bSelf = szName == X.GetClientPlayerInfo().szName + local szNameU = AnsiToUTF8(szName) + local szNameCRC = ('%x%x%x'):format(szNameU:byte(), GetStringCRC(szNameU), szNameU:byte(-1)) + local nCount = bSelf and 0 or 1 + local function fnAction(szReporter) + if szReporter == '' and nMethod ~= 1 then + szName = '' + end + local function DoUpload() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('Prepare for uploading serendipity ' .. szSerendipity .. ' by ' + .. szName .. '#' .. szNameCRC .. ' via ' .. szReporter, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/serendipity/uploads', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + S = szRegion, s = szServer, a = szSerendipity, + n = szName, N = szNameCRC, R = szReporter, + f = eStatus, t = dwTime, c = nCount, m = nMethod, + }, + signature = X.SECRET['J3CX::SERENDIPITY_UPLOADS'], + }) + end + if szMode == 'manual' or nMethod ~= 1 then + DoUpload() + else + X.DelayCall(X.Random(0, 10000), DoUpload) + end + -- if szMode == 'manual' then + -- DoUpload() + -- else + -- -- 战斗中移动中免打扰防止卡住 + -- X.BreatheCall(function() + -- if Cursor.IsVisible() + -- and me and not me.bFightState + -- and ( + -- me.nMoveState == MOVE_STATE.ON_STAND + -- or me.nMoveState == MOVE_STATE.ON_FLOAT + -- or me.nMoveState == MOVE_STATE.ON_SIT + -- or me.nMoveState == MOVE_STATE.ON_FREEZE + -- or me.nMoveState == MOVE_STATE.ON_ENTRAP + -- or me.nMoveState == MOVE_STATE.ON_DEATH + -- or me.nMoveState == MOVE_STATE.ON_AUTO_FLY + -- or me.nMoveState == MOVE_STATE.ON_START_AUTO_FLY + -- ) then + -- DoUpload() + -- return 0 + -- end + -- end) + -- end + if szMode ~= 'silent' then + local w, h = 270, 180 + local ui = X.UI.CreateFrame('MY_Serendipity#' .. szKey, { + w = w, h = h, close = true, text = '', anchor = 'CENTER', + }) + if szMode == 'auto' then + ui:Alpha(200) + ui:Anchor({ x = 0, y = -60, s = 'BOTTOMRIGHT', r = 'BOTTOMRIGHT' }) + end + ui:Append('Handle', { x = 10, y = (h - 90) / 2, w = w - 20, h = h, alignVertical = 1, alignHorizontal = 1, handleStyle = 3 }) + :Append('Text', { + text = (szName == '' and _L['Anonymous'] or szName) + .. '\n' .. szSerendipity .. ' - ' .. X.FormatTime(dwTime, '%hh:%mm:%ss') + .. '\n' .. (szReporter == '' and '' or (szReporter .. _L[','])) .. _L['JX3 is pround of you!'] + .. '\n' .. _L['Thanks for your kindness!'], + fontScale = 1.2, + }) + :FormatChildrenPos() + X.DelayCall(10000, function() ui:Remove() end) + X.DismissNotify(szKey) + end + end + D.GetSerendipityShareName(fnAction, szMode ~= 'manual') +end + +function D.OnSerendipity(szName, szSerendipity, nMethod, eStatus, dwTime) + if X.IsDebugServer() then + return + end + local szKey = szName .. '_' .. szSerendipity .. '_' .. dwTime + if MY_Serendipity.bAutoShare then + D.SerendipityShareConfirm(szName, szSerendipity, nMethod, eStatus, dwTime, MY_Serendipity.bSilentMode and 'silent' or 'auto') + else + local szXml = GetFormatText(szName == X.GetClientPlayer().szName + and _L(eStatus == SERENDIPITY_STATUS.START + and 'You got %s, would you like to share?' + or 'You finished %s, would you like to share?', szSerendipity) + or _L(eStatus == SERENDIPITY_STATUS.START + and '[%s] got %s, would you like to share?' + or '[%s] finished %s, would you like to share?', szName, szSerendipity) + ) + local function fnAction() + D.SerendipityShareConfirm(szName, szSerendipity, nMethod, eStatus, dwTime, 'manual') + end + if MY_Serendipity.bEnable then + X.CreateNotify({ + szKey = szKey, + szMsg = szXml, + fnAction = fnAction, + bPlaySound = MY_Serendipity.bSound, + bPopupPreview = MY_Serendipity.bPreview, + }) + end + table.insert(SERENDIPITY_LIST, { szKey = szKey, szXml = szXml, fnAction = fnAction }) + end +end + +function D.GetSerendipityName(nID) + local Adventure = X.GetGameTable('Adventure', true) + if Adventure then + for i = 2, Adventure:GetRowCount() do + local tLine = Adventure:GetRow(i) + if tLine.dwID == nID then + return tLine.szName + end + end + end + return tostring(nID) +end + +X.RegisterEvent('ON_SERENDIPITY_TRIGGER', 'QIYU', function() + local me = X.GetClientPlayer() + if not me then + return + end + local eStatus = arg1 and SERENDIPITY_STATUS.FINISH or SERENDIPITY_STATUS.START + D.OnSerendipity(me.szName, D.GetSerendipityName(arg0), SERENDIPITY_METHOD.EVENT_TRIGGER, eStatus, GetCurrentTime()) +end) + +function D.GetSerendipityInfo(dwTabType, dwIndex) + if not SERENDIPITY_INFO then + SERENDIPITY_INFO = X.LoadLUAData(X.PACKET_INFO.FRAMEWORK_ROOT .. 'data/serendipities/{$lang}.jx3dat') + SERENDIPITY_INFO.name = {} + for dwTabType, tList in pairs(SERENDIPITY_INFO) do + if dwTabType ~= 'name' then + for dwID, p in pairs(tList) do + if X.IsNumber(dwTabType) then + local KItemInfo = GetItemInfo(dwTabType, dwID) + if KItemInfo then + SERENDIPITY_INFO.name[KItemInfo.szName] = p + end + end + local KItemInfo = GetItemInfo(p[1], p[2]) + if KItemInfo then + SERENDIPITY_INFO.name[KItemInfo.szName] = p + end + end + end + end + end + local serendipity = SERENDIPITY_INFO[dwTabType] and SERENDIPITY_INFO[dwTabType][dwIndex] + local eStatus = serendipity and serendipity[3] and SERENDIPITY_STATUS[serendipity[3]] + if eStatus then + local iteminfo = GetItemInfo(serendipity[1], serendipity[2]) + if iteminfo then + return iteminfo.szName, eStatus + end + end +end + +local FETCH_CACHE = {} +function D.Fetch(szName, fnAction) + if not X.IsString(szName) then + szName, fnAction = X.GetClientPlayerInfo().szName, szName + end + if FETCH_CACHE[szName] then + fnAction(X.Clone(FETCH_CACHE[szName])) + return + end + local szNameU = AnsiToUTF8(szName) + local szNameCRC = ('%x%x%x'):format(szNameU:byte(), GetStringCRC(szNameU), szNameU:byte(-1)) + local qs = X.ConvertToANSI(X.SignPostData(X.ConvertToUTF8( + { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + S = X.GetRegionOriginName(), + s = X.GetServerOriginName(), + n = szName, + N = szNameCRC, + }), + X.KGUIEncrypt(X.SECRET['J3CX::SERENDIPITY']) + )) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/serendipity', + data = { + server = X.GetServerOriginName(), + role = szName, + serendipity = '', + cert = table.concat({qs._c, qs._t, qs.L, qs.l, qs.n, qs.N, qs.S, qs.s}, '|'), + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if not res then + return + end + local aList = {} + for _, p in ipairs(X.Get(res, {'data', 'data'}, {})) do + table.insert(aList, { + szSerendipity = p.serendipity, + dwTime = p.time, + }) + end + FETCH_CACHE[szName] = aList + fnAction(X.Clone(FETCH_CACHE[szName])) + end, + }) +end + +X.RegisterMsgMonitor('MSG_SYS', 'QIYU', function(szChannel, szMsg, nFont, bRich, r, g, b) + local me = X.GetClientPlayer() + if not me then + return + end + -- local hWnd = Station.GetFocusWindow() + -- if hWnd and hWnd:GetType() == 'WndEdit' then + -- return + -- end + -- 跨服中免打扰 + if IsRemotePlayer(me.dwID) then + return + end + -- 确认是真实系统消息 + if not StringLowerW(szMsg):find('ui/image/minimap/minimap.uitex') then + return + end + -- OutputMessage('MSG_SYS', "path=\"UI/Image/Minimap/Minimap.UITex\" frame=184text=\"“一只蠢盾盾”侠士正在为人传功,不经意间触发奇遇【雪山恩仇】!正是:侠心义行,偏遭奇症缠身;雪峰疗伤,却逢绝世奇缘。\" font=10 r=255 g=255 b=0 text=\"\\\n\"", true) + -- “醉戈止战”侠士福缘非浅,触发奇遇【阴阳两界】,此千古奇缘将开启怎样的奇妙际遇,令人神往! + if bRich then + szMsg = GetPureText(szMsg) + end + szMsg:gsub(_L.ADVENTURE_PATT, function(szName, szSerendipity) + D.OnSerendipity(szName, szSerendipity, SERENDIPITY_METHOD.MSG_SYS, SERENDIPITY_STATUS.START, GetCurrentTime()) + end) + -- 恭喜侠士江阙阙在25人英雄会战唐门中获得稀有掉落[夜话·白鹭]! + szMsg:gsub(_L.ADVENTURE_PATT2, function(szName, szSerendipity) + if not D.GetSerendipityInfo('name', szSerendipity) then -- 太多了筛选下… + return + end + D.OnSerendipity(szName, szSerendipity, SERENDIPITY_METHOD.MSG_SYS, SERENDIPITY_STATUS.DONE, GetCurrentTime()) + end) + -- 江湖快马飞报!侠士“琵琶声停@隐士”在白龙口捕获12级稀有坐骑马“闪电”的马驹!假以时日,此马驹必能成长为一匹纵横江湖的宝马神骏! + -- 江湖快马飞报!侠士“你不会前来”在鲲鹏岛捕获9级稀有坐骑马“麟驹·潮生”的马驹!假以时日,此马驹必能成长为一匹纵横江湖的宝马神骏! + szMsg:gsub(_L.ADVENTURE_PATT3, function(szName, szSerendipity) + D.OnSerendipity(szName, szSerendipity, SERENDIPITY_METHOD.MSG_SYS, SERENDIPITY_STATUS.DONE, GetCurrentTime()) + end) +end) + +X.RegisterEvent('LOOT_ITEM', function() + local player = X.GetPlayer(arg0) + local item = GetItem(arg1) + if not player or not item then + return + end + local szSerendipity, eStatus = D.GetSerendipityInfo(item.dwTabType, item.dwIndex) + if szSerendipity then + D.OnSerendipity(player.szName, szSerendipity, SERENDIPITY_METHOD.LOOT_ITEM, eStatus, GetCurrentTime()) + end +end) + +X.RegisterEvent('QUEST_FINISHED', function() + local me = X.GetClientPlayer() + if not me then + return + end + local szSerendipity, eStatus = D.GetSerendipityInfo('quest', arg0) + if szSerendipity then + D.OnSerendipity(me.szName, szSerendipity, SERENDIPITY_METHOD.FINISH_QUEST, eStatus, GetCurrentTime()) + end +end) + +-- X.RegisterInit(function() +-- X.RegisterTutorial({ +-- szKey = 'MY_Serendipity', +-- szMessage = _L['Would you like to share serendipity?'], +-- fnRequire = function() +-- return not X.IsDebugServer() and not MY_Serendipity.bEnable +-- end, +-- { +-- szOption = _L['Yes'], +-- bDefault = true, +-- fnAction = function() +-- MY_Serendipity.bEnable = true +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- { +-- szOption = _L['No'], +-- fnAction = function() +-- MY_Serendipity.bEnable = false +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- }) + +-- X.RegisterTutorial({ +-- szKey = 'MY_Serendipity_Auto', +-- szMessage = _L['Would you like to auto share serendipity?'], +-- fnRequire = function() +-- return not X.IsDebugServer() +-- and MY_Serendipity.bEnable +-- and not MY_Serendipity.bAutoShare +-- end, +-- { +-- szOption = _L['Yes'], +-- bDefault = true, +-- fnAction = function() +-- MY_Serendipity.bAutoShare = true +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- { +-- szOption = _L['No'], +-- fnAction = function() +-- MY_Serendipity.bAutoShare = false +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- }) + +-- X.RegisterTutorial({ +-- szKey = 'MY_Serendipity_Silent', +-- szMessage = _L['Would you like to share serendipity silently?'], +-- fnRequire = function() +-- return not X.IsDebugServer() +-- and MY_Serendipity.bEnable +-- and MY_Serendipity.bAutoShare +-- and not MY_Serendipity.bSilentMode +-- end, +-- { +-- szOption = _L['Yes'], +-- bDefault = true, +-- fnAction = function() +-- MY_Serendipity.bSilentMode = true +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- { +-- szOption = _L['No'], +-- fnAction = function() +-- MY_Serendipity.bSilentMode = false +-- X.Panel.RedrawTab(nil) +-- end, +-- }, +-- }) +-- end) + + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Serendipity', + exports = { + { + fields = { + 'bEnable', + 'bSound', + 'bPreview', + 'bAutoShare', + 'bSilentMode', + }, + root = O, + }, + { + fields = { + 'Fetch', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bSound', + 'bPreview', + 'bAutoShare', + 'bSilentMode', + }, + triggers = { + bEnable = function(_, v) + if v then + for i, p in X.ipairs_r(SERENDIPITY_LIST) do + X.CreateNotify({ + szKey = p.szKey, + szMsg = p.szXml, + fnAction = p.fnAction, + bPlaySound = false, + bPopupPreview = false, + }) + end + else + for i, p in X.ipairs_r(SERENDIPITY_LIST) do + X.DismissNotify(p.szKey) + end + end + X.SaveLUAData({'config/show_notify.jx3dat', X.PATH_TYPE.GLOBAL}, v) + end, + bSound = function(_, v) + X.SaveLUAData({'config/serendipity_sound.jx3dat', X.PATH_TYPE.GLOBAL}, v) + end, + bPreview = function(_, v) + X.SaveLUAData({'config/serendipity_preview.jx3dat', X.PATH_TYPE.GLOBAL}, v) + end, + bAutoShare = function(_, v) + X.SaveLUAData({'config/serendipity_autoshare.jx3dat', X.PATH_TYPE.GLOBAL}, v) + end, + bSilentMode = function(_, v) + X.SaveLUAData({'config/serendipity_silentmode.jx3dat', X.PATH_TYPE.GLOBAL}, v) + end, + }, + root = O, + }, + }, +} +MY_Serendipity = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_!Base/src/MY_ShareKnowledge.lua b/MY_!Base/src/MY_ShareKnowledge.lua new file mode 100644 index 000000000..dfd69cf77 --- /dev/null +++ b/MY_!Base/src/MY_ShareKnowledge.lua @@ -0,0 +1,645 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 公共数据分享模块 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = X.NSFormatString('{$NS}_!Base/MY_ShareKnowledge') +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_!Base' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_!Base' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '*') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +--------------- +-- 系统事件 +--------------- +do +local FREQUENCY_LIMIT = 10000 +local NEXT_AWAKE_TIME = 0 +local CURRENT_EVENT = {} + +MY_RSS.RegisterAdapter('share-event', function(data) + local t = {} + if X.IsTable(data) then + for _, p in ipairs(data) do + if X.IsString(p[1]) then + local r = { name = p[1], argv = {}, argc = p[3] } + if X.IsTable(p[2]) then + for key, value in pairs(p[2]) do + if X.IsNumber(key) and key > 0 then + r.argv['arg' .. (key - 1)] = value + end + end + end + table.insert(t, r) + end + end + end + return t +end) + +X.RegisterEvent('MY_RSS_UPDATE', function() + if arg0 and arg0 ~= 'share-event' then + return + end + for k, _ in pairs(CURRENT_EVENT) do + X.RegisterEvent(k, 'MY_ShareKnowledge__Event', false) + end + CURRENT_EVENT = {} + local rss = MY_RSS.Get('share-event') + if not rss then + return + end + for _, p in ipairs(rss) do + X.RegisterEvent(p.name, 'MY_ShareKnowledge__Event', function() + if not MY_Serendipity.bEnable then + return + end + if GetTime() < NEXT_AWAKE_TIME then + return + end + for key, value in pairs(p.argv) do + if _G[key] ~= value then + return + end + end + local argv = {} + for i = 0, p.argc - 1 do + argv[i + 1] = _G['arg' .. i] + end + local szArgs = X.EncodeJSON(argv) + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-event', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + region = X.GetRegionOriginName(), + server = X.GetServerOriginName(), + event = p.name, + args = szArgs, + time = GetCurrentTime(), + }, + signature = X.SECRET['J3CX::SHARE_EVENT'], + }) + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT + end) + CURRENT_EVENT[p.name] = true + end +end) +end + +--------------- +-- 界面抓取 +--------------- +do +local FREQUENCY_LIMIT = 10000 +local NEXT_AWAKE_TIME = 0 +local CACHE = {} + +local TRANSLATOR = {} +function TRANSLATOR.PLAIN(info) + local t = {} + if info.children then + for _, v in ipairs(info.children) do + table.insert(t, TRANSLATOR.PLAIN(v)) + end + end + if info.type == 'Text' then + table.insert(t, info.text) + end + return table.concat(t) +end +function TRANSLATOR.BBCODE(info) + local t = {} + if info.children then + for _, v in ipairs(info.children) do + table.insert(t, TRANSLATOR.BBCODE(v)) + end + end + if info.type == 'Text' then + local bStyle = false + if info.r and info.g and info.b then + bStyle = true + table.insert(t, '[style color="') + table.insert(t, X.RGB2Hex(info.r, info.g, info.b, info.a)) + table.insert(t, '"]') + end + table.insert(t, X.StringReplaceW(X.StringReplaceW(info.text, '[', '\\['), ']', '\\]')) + if bStyle then + table.insert(t, '[/style]') + end + elseif info.type == 'Image' then + table.insert(t, '[img]') + table.insert(t, info.image) + if info.frame then + table.insert(t, ':') + table.insert(t, info.frame) + end + table.insert(t, '[/img]]') + end + return table.concat(t) +end + +local SCHEMA = X.Schema.MixedTable({ + -- PATH + [1] = X.Schema.MixedTable({ + [1] = X.Schema.String, + [2] = X.Schema.OneOf(X.Schema.String, X.Schema.Nil), + }), + -- UI PROPS PATH / DATA TRANSLATOR NAME + [2] = X.Schema.OneOf(unpack((function() + local a = {X.Schema.Collection(X.Schema.Any), X.Schema.Nil} + for k, _ in pairs(TRANSLATOR) do + table.insert(a, k) + end + return a + end)())), +}) + +MY_RSS.RegisterAdapter('share-ui', function(data) + local t = {} + if X.IsTable(data) then + for k, v in pairs(data) do + local err = X.Schema.CheckSchema(v, SCHEMA) + if not err then + local key = k + if not X.IsString(key) then + key = v[1][1] + if v[1][2] then + key = key .. '::' .. v[1][2] + end + end + table.insert(t, { + id = GetStringCRC(X.EncodeJSON({key, v[1], v[2]})), + key = key, + path = v[1], + dataTranslator = v[2], + }) + end + end + end + return t +end) + +local function SerializeElement(el) + local info = { type = el:GetType(), name = el:GetName() } + if el:GetBaseType() == 'Wnd' then + local h = el:Lookup('', '') + if h then + info.handle = SerializeElement(h) + end + local c = el:GetFirstChild() + if c then + info.children = {} + end + while c do + table.insert(c.children, SerializeElement(c)) + c = c:GetNext() + end + end + if info.type == 'Text' then + local r, g, b = el:GetFontColor() + local a = el:GetAlpha() + if r ~= 255 or g ~= 255 or b ~= 255 or a ~= 255 then + info.r = r + info.g = g + info.b = b + info.a = a + end + info.text = el:GetText() + elseif info.type == 'Image' then + local image, frame = el:GetImagePath() + info.image = image + info.frame = frame + elseif info.type == 'Handle' then + local i = 0 + local it = el:Lookup(i) + if it then + info.children = {} + end + while it do + table.insert(info.children, SerializeElement(it)) + i = i + 1 + it = el:Lookup(i) + end + end + return info +end + +X.BreatheCall('MY_ShareKnowledge__UI', 1000, function() + if not MY_Serendipity.bEnable then + return + end + local rss = MY_RSS.Get('share-ui') + if not rss then + return + end + if GetTime() < NEXT_AWAKE_TIME then + return + end + local res = {} + for _, v in ipairs(rss) do + local el, data = Station.Lookup(unpack(v.path)), nil + if el then + if X.IsTable(v.dataTranslator) then + data = X.Get(el, v.dataTranslator) + else + data = SerializeElement(el) + if v.dataTranslator then + local translator = TRANSLATOR[v.dataTranslator] + if translator then + data = translator(data) + else + data = nil + end + end + end + end + local szContent = X.EncodeJSON(data) + if CACHE[v.id] ~= szContent then + res[v.key] = data + CACHE[v.id] = szContent + end + end + if not X.IsEmpty(res) then + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-ui', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + region = X.GetRegionOriginName(), + server = X.GetServerOriginName(), + time = GetCurrentTime(), + data = X.EncodeJSON(res), + }, + signature = X.SECRET['J3CX::SHARE_UI'], + }) + end + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT +end) +end + +--------------- +-- NPC 对话框 +--------------- +do +local FREQUENCY_LIMIT = 1000 +local NEXT_AWAKE_TIME = 0 + +MY_RSS.RegisterAdapter('share-npc-chat', function(data) + local t = {} + if X.IsTable(data) then + for _, k in ipairs(data) do + t[k] = true + end + end + return t +end) + +X.RegisterEvent('OPEN_WINDOW', 'MY_ShareKnowledge__Npc', function() + if not MY_Serendipity.bEnable then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local dwTargetID = arg3 + local npc = X.GetNpc(dwTargetID) + if not npc then + return + end + local rss = MY_RSS.Get('share-npc-chat') + if not rss or not rss[npc.dwTemplateID] then + return + end + if GetTime() < NEXT_AWAKE_TIME then + return + end + local szContent = arg1 + local map = X.GetMapInfo(me.GetMapID()) + local szDelayID + local function fnAction(line) + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-npc-chat', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + r = X.GetRegionOriginName(), + s = X.GetServerOriginName(), + t = GetCurrentTime(), + c = szContent, + cn = line and line.szCenterName or '', -- Center Name + ci = line and line.dwCenterID or -1, -- Center ID + li = line and line.nLineIndex or -1, -- Line Index + mi = map and map.dwID, -- Map ID + mn = map and map.szName, -- Map Name + nt = npc.dwTemplateID, -- NPC Template ID + nn = X.GetNpcName(npc.dwID), -- NPC Name + }, + signature = X.SECRET['J3CX::SHARE_NPC_CHAT'], + }) + X.DelayCall(szDelayID, false) + end + szDelayID = X.DelayCall(5000, fnAction) + X.GetHLLineInfo({ dwMapID = me.GetMapID(), nCopyIndex = me.GetScene().nCopyIndex }, fnAction) + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT +end) +end + +--------------- +-- 系统信息 +--------------- +do +local FREQUENCY_LIMIT = 0 +local NEXT_AWAKE_TIME = 0 + +MY_RSS.RegisterAdapter('share-sysmsg', function(data) + local t = {} + if X.IsTable(data) then + for _, szPattern in ipairs(data) do + if X.IsString(szPattern) then + table.insert(t, szPattern) + end + end + end + return t +end) + +X.RegisterMsgMonitor('MSG_SYS', 'MY_ShareKnowledge__Sysmsg', function(szChannel, szMsg, nFont, bRich, r, g, b) + if not MY_Serendipity.bEnable then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local rss = MY_RSS.Get('share-sysmsg') + if not rss then + return + end + if GetTime() < NEXT_AWAKE_TIME then + return + end + -- 跨服中免打扰 + if IsRemotePlayer(me.dwID) then + return + end + -- 确认是真实系统消息 + if X.ContainsEchoMsgHeader(szMsg) then + return + end + -- OutputMessage('MSG_SYS', "path=\"UI/Image/Minimap/Minimap.UITex\" frame=184text=\"“一只蠢盾盾”侠士正在为人传功,不经意间触发奇遇【雪山恩仇】!正是:侠心义行,偏遭奇症缠身;雪峰疗伤,却逢绝世奇缘。\" font=10 r=255 g=255 b=0 text=\"\\\n\"", true) + -- “醉戈止战”侠士福缘非浅,触发奇遇【阴阳两界】,此千古奇缘将开启怎样的奇妙际遇,令人神往! + -- 恭喜侠士江阙阙在25人英雄会战唐门中获得稀有掉落[夜话·白鹭]! + if bRich then + szMsg = GetPureText(szMsg) + end + for _, szPattern in ipairs(rss) do + if string.find(szMsg, szPattern) then + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-sysmsg', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + region = X.GetRegionOriginName(), + server = X.GetServerOriginName(), + content = szMsg, + time = GetCurrentTime(), + }, + signature = X.SECRET['J3CX::SHARE_SYSMSG'], + }) + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT + break + end + end +end) +end + +--------------- +-- 通用信息 +--------------- +do +local FREQUENCY_LIMIT = 1000 +local NEXT_AWAKE_TIME = 0 +local CURRENT_MSG_CHANNEL = {} + +MY_RSS.RegisterAdapter('share-msg', function(data) + local t = {} + if X.IsTable(data) then + for szChannel, aList in pairs(data) do + local a = {} + for _, s in ipairs(aList) do + if X.IsString(s) then + table.insert(a, s) + end + end + t[szChannel] = a + end + end + return t +end) + +X.RegisterEvent('MY_RSS_UPDATE', function() + if arg0 and arg0 ~= 'share-msg' then + return + end + for k, _ in pairs(CURRENT_MSG_CHANNEL) do + X.RegisterMsgMonitor(k, 'MY_ShareKnowledge__MSG', false) + end + CURRENT_MSG_CHANNEL = {} + local rss = MY_RSS.Get('share-msg') + if not rss then + return + end + for k, p in pairs(rss) do + X.RegisterMsgMonitor(k, 'MY_ShareKnowledge__MSG', function(szChannel, szMsg, nFont, bRich, r, g, b, dwTalkerID, szName) + if not MY_Serendipity.bEnable then + return + end + if GetTime() < NEXT_AWAKE_TIME then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + -- 跨服中免打扰 + if IsRemotePlayer(me.dwID) then + return + end + -- 确认是真实消息 + if X.ContainsEchoMsgHeader(szMsg) then + return + end + if bRich then + szMsg = GetPureText(szMsg) + bRich = false + end + for _, s in ipairs(p) do + if string.find(szMsg, s) then + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-msg', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + region = X.GetRegionOriginName(), + server = X.GetServerOriginName(), + channel = szChannel, + msg = szMsg, + talkerId = dwTalkerID, + talkerName = szName, + time = GetCurrentTime(), + }, + signature = X.SECRET['J3CX::SHARE_MSG'], + }) + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT + return + end + end + end) + CURRENT_MSG_CHANNEL[k] = true + end +end) +end + +--------------- +-- 通用商店 +--------------- +do +local FREQUENCY_LIMIT = 1000 +local NEXT_AWAKE_TIME = 0 + +MY_RSS.RegisterAdapter('share-shop', function(data) + local t = {} + if X.IsArray(data) then + for _, dwShopNpcTemplateID in ipairs(data) do + if X.IsNumber(dwShopNpcTemplateID) then + t[dwShopNpcTemplateID] = true + end + end + end + return t +end) + +local SHOP_OWNER_INFO = {} +X.RegisterEvent('SHOP_OPENSHOP', 'MY_ShareKnowledge__ShareShop', function() + local rss = MY_RSS.Get('share-shop') + if not rss then + return + end + local dwShopID = arg0 + local txtNpcName = Station.Lookup('Normal/ShopPanel/Wnd_BG', 'Text_Title') + if not txtNpcName then + return + end + local szNpcName = txtNpcName:GetText() + local KNpc + for i, p in ipairs(X.GetNearNpc()) do + if X.GetNpcName(p.dwID) == szNpcName then + KNpc = p + break + end + end + if not KNpc then + return + end + SHOP_OWNER_INFO[dwShopID] = KNpc.dwTemplateID +end) + +local SHOP_CACHE = {} +local function GetItemKey(it) + if it.nGenre == ITEM_GENRE.BOOK then + return X.NumberBaseN(it.dwTabType, 32) .. '_' + .. X.NumberBaseN(it.dwTabIndex, 32) .. '_' + .. X.NumberBaseN(it.nBookID, 32) + end + return X.NumberBaseN(it.dwTabType, 32) .. '_' .. X.NumberBaseN(it.dwTabIndex, 32) +end +local function BreatheFlushShopCache() + if NEXT_AWAKE_TIME > GetTime() then + return + end + local rss = MY_RSS.Get('share-shop') + if not rss then + return + end + for dwShopID, tList in pairs(SHOP_CACHE) do + local dwShopNpcTemplateID = SHOP_OWNER_INFO[dwShopID] + if dwShopNpcTemplateID then + if rss[dwShopNpcTemplateID] then + local aList = {} + for dwItemIndex, tItem in pairs(tList) do + table.insert(aList, { + dwItemIndex = dwItemIndex, + dwTabType = tItem.dwTabType, + dwTabIndex = tItem.dwTabIndex, + nGenre = tItem.nGenre, + nBookID = tItem.nBookID, + }) + end + table.sort(aList, function(a, b) return a.dwItemIndex > b.dwItemIndex end) + + local aItem = {} + for _, it in ipairs(aList) do + table.insert(aItem, GetItemKey(it)) + end + local szItems = table.concat(aItem, '~') + + X.EnsureAjax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/share-shop', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + region = X.GetRegionOriginName(), + server = X.GetServerOriginName(), + shop = dwShopID, + npc = SHOP_OWNER_INFO[dwShopID], + items = szItems, + time = GetCurrentTime(), + }, + signature = X.SECRET['J3CX::SHARE_SHOP'], + }) + NEXT_AWAKE_TIME = GetTime() + FREQUENCY_LIMIT + end + SHOP_CACHE[dwShopID] = nil + return + end + end + X.BreatheCall('MY_ShareKnowledge__ShareShop', false) +end +X.RegisterEvent('SHOP_UPDATEITEM', 'MY_ShareKnowledge__ShareShop', function() + local rss = MY_RSS.Get('share-shop') + if not rss then + return + end + local dwShopID, dwItemIndex = arg0, arg1 + if not SHOP_CACHE[dwShopID] then + SHOP_CACHE[dwShopID] = {} + end + local dwItemID = GetShopItemID(dwShopID, dwItemIndex) + local KItem = dwItemID and GetItem(dwItemID) + if KItem then + SHOP_CACHE[dwShopID][dwItemIndex] = { + dwTabType = KItem.dwTabType, + dwTabIndex = KItem.dwIndex, + nGenre = KItem.nGenre, + nBookID = KItem.nBookID, + } + X.BreatheCall('MY_ShareKnowledge__ShareShop', 3000, BreatheFlushShopCache) + end +end) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/Boilerplate_!Base/src/PS.GlobalConfig.lua b/MY_!Base/src/PS.GlobalConfig.lua similarity index 99% rename from Boilerplate_!Base/src/PS.GlobalConfig.lua rename to MY_!Base/src/PS.GlobalConfig.lua index cb1f73d03..53133bed1 100644 --- a/Boilerplate_!Base/src/PS.GlobalConfig.lua +++ b/MY_!Base/src/PS.GlobalConfig.lua @@ -3,8 +3,8 @@ -- @desc : 全局杂项设置 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/PS.GlobalConfig') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/PS.UISample.lua b/MY_!Base/src/PS.UISample.lua similarity index 99% rename from Boilerplate_!Base/src/PS.UISample.lua rename to MY_!Base/src/PS.UISample.lua index c0b1a08e4..9525e25c1 100644 --- a/Boilerplate_!Base/src/PS.UISample.lua +++ b/MY_!Base/src/PS.UISample.lua @@ -3,8 +3,8 @@ -- @desc : 界面组件库示例 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/PS.UISample') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/PS.Welcome.lua b/MY_!Base/src/PS.Welcome.lua similarity index 59% rename from Boilerplate_!Base/src/PS.Welcome.lua rename to MY_!Base/src/PS.Welcome.lua index be33dc6bc..2a80ab141 100644 --- a/Boilerplate_!Base/src/PS.Welcome.lua +++ b/MY_!Base/src/PS.Welcome.lua @@ -3,8 +3,8 @@ -- @desc : 欢迎页 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/PS.Welcome') -------------------------------------------------------------------------------- @@ -55,6 +55,116 @@ function PS.OnPanelActive(wnd) ui:Append('Text', { name = 'Text_Memory', x = 10, y = 300, w = 150, alpha = 150, font = 162, text = GetMemoryText(), alignHorizontal = 2 }) ui:Append('Text', { name = 'Text_Svr', x = 10, y = 345, w = 557, font = 204, text = GetSvrText(), alpha = 220 }) local x = 7 + -- 奇遇分享 + x = x + ui:Append('WndCheckBox', { + x = x, h = 25, + name = 'WndCheckBox_SerendipityNotify', + text = _L['Show share notify.'], + checked = MY_Serendipity.bEnable, + onCheck = function(bChecked) + if bChecked then + local ui = X.UI(this) + X.Confirm(_L['Check this will monitor system message for serendipity and share it, are you sure?'], function() + MY_Serendipity.bEnable = bChecked + ui:Check(true, WNDEVENT_FIRETYPE.PREVENT) + end) + ui:Check(false, WNDEVENT_FIRETYPE.PREVENT) + else + MY_Serendipity.bEnable = bChecked + end + end, + tip = { + render = _L['Monitor serendipity and show share notify.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):AutoWidth():Width() + local xS0 = x + ui:Append('WndCheckBox', { + x = x, h = 25, + name = 'WndCheckBox_SerendipityAutoShare', + text = _L['Auto share.'], + checked = MY_Serendipity.bAutoShare, + onCheck = function() + MY_Serendipity.bAutoShare = not MY_Serendipity.bAutoShare + end, + autoEnable = function() return MY_Serendipity.bEnable end, + }):AutoWidth():Width() + -- 自动分享子项 + x = xS0 + x = x + ui:Append('WndCheckBox', { + x = x, h = 25, + name = 'WndCheckBox_SerendipitySilentMode', + text = _L['Silent mode.'], + checked = MY_Serendipity.bSilentMode, + onCheck = function() + MY_Serendipity.bSilentMode = not MY_Serendipity.bSilentMode + end, + autoVisible = function() return MY_Serendipity.bAutoShare end, + autoEnable = function() return MY_Serendipity.bEnable end, + }):AutoWidth():Width() + x = x + 5 + x = x + ui:Append('WndEditBox', { + x = x, w = 105 + 3, h = 28, + name = 'WndEditBox_SerendipitySilentMode', + placeholder = _L['Realname, leave blank for anonymous.'], + tip = { + render = _L['Realname, leave blank for anonymous.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + limit = 6, + text = X.LoadLUAData({'config/realname.jx3dat', X.PATH_TYPE.ROLE}) or X.GetClientPlayer().szName:gsub('@.-$', ''), + onChange = function(szText) + X.SaveLUAData({'config/realname.jx3dat', X.PATH_TYPE.ROLE}, szText) + end, + autoVisible = function() return MY_Serendipity.bAutoShare end, + autoEnable = function() return MY_Serendipity.bEnable end, + }):Width() + -- 手动分享子项 + x = xS0 + x = x + ui:Append('WndCheckBox', { + x = x, h = 25, + name = 'WndCheckBox_SerendipityNotifyTip', + text = _L['Show notify tip.'], + checked = MY_Serendipity.bPreview, + onCheck = function() + MY_Serendipity.bPreview = not MY_Serendipity.bPreview + end, + autoVisible = function() return not MY_Serendipity.bAutoShare end, + autoEnable = function() return MY_Serendipity.bEnable end, + }):AutoWidth():Width() + x = x + ui:Append('WndCheckBox', { + x = x, h = 25, + name = 'WndCheckBox_SerendipityNotifySound', + text = _L['Play notify sound.'], + checked = MY_Serendipity.bSound, + onCheck = function() + MY_Serendipity.bSound = not MY_Serendipity.bSound + end, + autoEnable = function() return MY_Serendipity.bEnable and not MY_Serendipity.bAutoShare end, + autoVisible = function() return not MY_Serendipity.bAutoShare end, + }):AutoWidth():Width() + x = x + ui:Append('WndButton', { + x = x, h = 30, + name = 'WndButton_SerendipitySearch', + text = _L['serendipity'], + onClick = function() + local szNameU = AnsiToUTF8(X.GetClientPlayerInfo().szName) + local szNameCRC = ('%x%x%x'):format(szNameU:byte(), GetStringCRC(szNameU), szNameU:byte(-1)) + X.UI.OpenBrowser( + 'https://j3cx.com/serendipity/?' + .. X.EncodeQuerystring(X.SignPostData(X.ConvertToUTF8( + { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + S = X.GetRegionOriginName(), + s = X.GetServerOriginName(), + n = X.GetClientPlayerInfo().szName, + N = szNameCRC, + }), + X.KGUIEncrypt(X.SECRET['J3CX::SERENDIPITY']) + )), + { openurl = 'https://j3cx.com/serendipity', controls = false }) + end, + }):AutoWidth():Width() + 5 -- 数据位置 x = x + ui:Append('WndButton', { x = x, h = 30, @@ -226,6 +336,70 @@ function PS.OnPanelActive(wnd) return menu end, }):AutoWidth():Width() + 5 + function D.fnDrawRSS() + local tRSS = MY_RSS.Get('MP') + if tRSS and X.IsString(tRSS.t) then + local function FormatSQS(s) + local SQS = X.EncodeQuerystring(X.SignPostData(X.ConvertToUTF8( + { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + S = X.GetRegionOriginName(), + s = X.GetServerOriginName(), + n = X.GetClientPlayerInfo().szName, + }), + X.SECRET['J3CX::SHARE_MSG'] + )) + return X.StringReplaceW(s, '{$SQS}', SQS) + end + local szText = tRSS.t + local szPath = X.IsString(tRSS.u) and tRSS.u or nil + local szMode = X.IsString(tRSS.m) and tRSS.m or nil + local function CreateMenu(menu, data) + for _, v in ipairs(data) do + if X.IsTable(v) and X.IsString(v.t) then + local m = { + szOption = v.t, + fnAction = function() + if not X.IsString(v.u) then + return + end + X.OpenBrowser(FormatSQS(v.u), v.m) + X.UI.ClosePopupMenu() + end, + } + if v.c then + m.r, m.g, m.b = X.HumanColor2RGB(v.c) + end + if X.IsTable(v.s) then + m = CreateMenu(m, v.s) + end + table.insert(menu, m) + end + end + return menu + end + local menu = CreateMenu({}, tRSS.s) + local t = { + x = x, h = 30, + name = 'WndButton_RSS', + text = szText, + } + if tRSS.c then + t.r, t.g, t.b = X.HumanColor2RGB(tRSS.c) + end + if #menu == 0 then + t.onClick = function() + X.OpenBrowser(FormatSQS(szPath), szMode) + end + else + t.menu = menu + end + x = x + ui:Append('WndButton', t):AutoWidth():Width() + 5 + PS.OnPanelResize(wnd) + D.fnDrawRSS = nil + end + end PS.OnPanelResize(wnd) end @@ -247,8 +421,16 @@ function PS.OnPanelResize(wnd) ui:Fetch('Text_Adv'):Pos(10, fScaleH + 10) ui:Fetch('Text_Svr'):Pos(10, fScaleH + 35) end + ui:Fetch('WndCheckBox_SerendipityNotify'):Top(fScaleH + 66.5) + ui:Fetch('WndCheckBox_SerendipityAutoShare'):Top(fScaleH + 66.5) + ui:Fetch('WndCheckBox_SerendipitySilentMode'):Top(fScaleH + 66.5) + ui:Fetch('WndEditBox_SerendipitySilentMode'):Top(fScaleH + 65) + ui:Fetch('WndCheckBox_SerendipityNotifyTip'):Top(fScaleH + 66.5) + ui:Fetch('WndCheckBox_SerendipityNotifySound'):Top(fScaleH + 66.5) + ui:Fetch('WndButton_SerendipitySearch'):Top(fScaleH + 65) ui:Fetch('WndButton_UserPreference'):Top(fScaleH + 65) ui:Fetch('WndButton_AddonErrorMessage'):Top(fScaleH + 65) + ui:Fetch('WndButton_RSS'):Top(fScaleH + 65) end function PS.OnPanelBreathe(wnd) @@ -258,6 +440,17 @@ function PS.OnPanelBreathe(wnd) ui:Fetch('Text_Memory'):Text(GetMemoryText()) end +function PS.OnPanelDeactivate() + D.fnDrawRSS = nil +end + X.Panel.Register(nil, 'Welcome', _L['Welcome'], '', PS) +X.RegisterEvent('MY_RSS_UPDATE', 'PS_Welcome_RSS_Update', function() + if arg0 and arg0 ~= 'MP' then + return + end + X.SafeCall(D.fnDrawRSS) +end) + --[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_!Base/src/lib/Base.lua b/MY_!Base/src/lib/Base.lua new file mode 100644 index 000000000..4db95afce --- /dev/null +++ b/MY_!Base/src/lib/Base.lua @@ -0,0 +1,378 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Plugin Project. +-- @desc : 插件命名空间初始化 +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- + +-- 游戏语言、游戏运营分支编码、游戏发行版编码、游戏版本号、游戏运行方式 +local szVersion, szVersionLineName, szVersionEx = select(2, GetVersion()) +-- 游戏语言 +local _GAME_LANG_ = string.lower(szVersionLineName) +if _GAME_LANG_ == 'classic' then + _GAME_LANG_ = 'zhcn' +end +-- 游戏运营分支编码 +local _GAME_BRANCH_ = string.lower(szVersionLineName) +if _GAME_BRANCH_ == 'zhcn' then + _GAME_BRANCH_ = 'remake' +elseif _GAME_BRANCH_ == 'zhtw' then + _GAME_BRANCH_ = 'intl' +end +-- 游戏发行版编码 +local _GAME_EDITION_ = string.lower(szVersionLineName .. '_' .. szVersionEx) +-- 游戏版本号 +local _GAME_VERSION_ = string.lower(szVersion) +-- 游戏运行方式,本地、云端 +local _GAME_PROVIDER_ = 'local' +if SM_IsEnable then + local status, res = pcall(SM_IsEnable) + if status and res then + _GAME_PROVIDER_ = 'remote' + end +end +-- 游戏代码分支 +local _GAME_API_BRANCH_ = _GAME_BRANCH_ +if _GAME_API_BRANCH_ == 'intl' then + _GAME_API_BRANCH_ = 'remake' +end + +local DEBUG_LEVEL = { + PM_LOG = 0, + LOG = 1, + WARNING = 2, + ERROR = 3, + DEBUG = 3, + NONE = 4, +} + +local CODE_PAGE = { + UTF8 = 65001, + GBK = 936, +} + +local IETF_BCP_47 = { + zhcn = 'zh-CN', + zhtw = 'zh-TW', +} + +local _NAME_SPACE_ = 'MY' +local _BUILD_ = '20260127' +local _VERSION_ = '29.0.3' +local _MENU_COLOR_ = {255, 165, 79} +local _INTERFACE_ROOT_ = 'Interface/' +local _ADDON_ROOT_ = _INTERFACE_ROOT_ .. _NAME_SPACE_ .. '/' +local _DATA_ROOT_ = (_GAME_PROVIDER_ == 'remote' and (GetUserDataFolder() .. '/' .. GetUserAccount() .. '/interface/') or _INTERFACE_ROOT_) .. _NAME_SPACE_ .. '#DATA/' +local _FRAMEWORK_ROOT_ = _ADDON_ROOT_ .. _NAME_SPACE_ .. '_!Base/' +local _UI_COMPONENT_ROOT_ = _FRAMEWORK_ROOT_ .. 'ui/components/' +local _LOGO_IMAGE_ = _FRAMEWORK_ROOT_ .. 'img/Logo.UITex' +local _LOGO_MAIN_FRAME_ = 0 +local _LOGO_MENU_FRAME_ = 1 +local _LOGO_MENU_HOVER_FRAME_ = 2 +local _POSTER_IMAGE_LIST_ = { + _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster_2013.UITex', + _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster_2020.UITex', + _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster_2024_1.UITex', + _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster_2024_2.UITex', + _ADDON_ROOT_ .. _NAME_SPACE_ .. '_Resource/img/Poster_2024_3.UITex', +} +local _DEBUG_LEVEL_ = DEBUG_LEVEL[LoadLUAData(_DATA_ROOT_ .. 'debug.level.jx3dat') or 'NONE'] or DEBUG_LEVEL.NONE +local _LOG_LEVEL_ = math.min(DEBUG_LEVEL[LoadLUAData(_DATA_ROOT_ .. 'log.level.jx3dat') or 'ERROR'] or DEBUG_LEVEL.ERROR, _DEBUG_LEVEL_) + +---@class (partial) MY_UI +local UI = {} + +-- 基础库命名空间 +---@class (partial) MY +local X = { + UI = UI, + DEBUG_LEVEL = DEBUG_LEVEL, + CODE_PAGE = CODE_PAGE, + PATH_TYPE = { + NORMAL = 0, + DATA = 1, + ROLE = 2, + GLOBAL = 3, + SERVER = 4, + }, + PACKET_INFO = { + NAME_SPACE = _NAME_SPACE_ , + VERSION = _VERSION_ , + BUILD = _BUILD_ , + MENU_COLOR = _MENU_COLOR_ , + INTERFACE_ROOT = _INTERFACE_ROOT_ , + ROOT = _ADDON_ROOT_ , + DATA_ROOT = _DATA_ROOT_ , + FRAMEWORK_ROOT = _FRAMEWORK_ROOT_ , + UI_COMPONENT_ROOT = _UI_COMPONENT_ROOT_ , + LOGO_IMAGE = _LOGO_IMAGE_ , + LOGO_MAIN_FRAME = _LOGO_MAIN_FRAME_ , + LOGO_MENU_FRAME = _LOGO_MENU_FRAME_ , + LOGO_MENU_HOVER_FRAME = _LOGO_MENU_HOVER_FRAME_, + POSTER_IMAGE_LIST = _POSTER_IMAGE_LIST_ , + DEBUG_LEVEL = _DEBUG_LEVEL_ , + LOG_LEVEL = _LOG_LEVEL_ , + }, + ENVIRONMENT = setmetatable({}, { + __index = setmetatable({ + GAME_LANG = _GAME_LANG_, + GAME_LOCALE = IETF_BCP_47[_GAME_LANG_] or 'en-US', + GAME_BRANCH = _GAME_BRANCH_, + GAME_EDITION = _GAME_EDITION_, + GAME_VERSION = _GAME_VERSION_, + GAME_PROVIDER = _GAME_PROVIDER_, + GAME_API_BRANCH = _GAME_API_BRANCH_, + SERVER_ADDRESS = select(7, GetUserServer()), + SOUND_DRIVER = IsFileExist('bin64\\KG3DWwiseSoundX64.dll') + and 'WWISE' + or 'FMOD', + CODE_PAGE = _GAME_BRANCH_ == 'intl' + and CODE_PAGE.UTF8 + or CODE_PAGE.GBK, + RUNTIME_OPTIMIZE = --[[#DEBUG BEGIN]]( + (IsDebugClient() or debug.traceback ~= nil) + and _DEBUG_LEVEL_ == DEBUG_LEVEL.NONE + and _LOG_LEVEL_ == DEBUG_LEVEL.NONE + and not IsLocalFileExist(_ADDON_ROOT_ .. 'secret.jx3dat') + ) and not IsLocalFileExist(_DATA_ROOT_ .. 'no.runtime.optimize.jx3dat') + and true + or --[[#DEBUG END]]false, + }, { __index = GLOBAL }), + __newindex = function() end, + }), + SECRET = setmetatable({}, { + __index = LoadLUAData(_ADDON_ROOT_ .. 'secret.jx3dat') or {}, + __newindex = function() end, + }), + SHARED_MEMORY = PLUGIN_SHARED_MEMORY, +} + +X.IS_REMAKE = X.ENVIRONMENT.GAME_API_BRANCH == 'remake' +X.IS_CLASSIC = X.ENVIRONMENT.GAME_API_BRANCH == 'classic' +X.IS_LOCAL = X.ENVIRONMENT.GAME_PROVIDER == 'local' +X.IS_REMOTE = X.ENVIRONMENT.GAME_PROVIDER == 'remote' +X.IS_EXP = X.ENVIRONMENT.GAME_EDITION:sub(-4) == '_exp' +X.IS_WWISE = X.ENVIRONMENT.SOUND_DRIVER == 'WWISE' +X.IS_FMOD = X.ENVIRONMENT.SOUND_DRIVER == 'FMOD' +X.IS_UTF8 = X.ENVIRONMENT.CODE_PAGE == CODE_PAGE.UTF8 +X.IS_GBK = X.ENVIRONMENT.CODE_PAGE == CODE_PAGE.GBK +X.IS_RUNTIME_OPTIMIZE = X.ENVIRONMENT.RUNTIME_OPTIMIZE + +-- 共享内存 +if type(X.SHARED_MEMORY) ~= 'table' then + X.SHARED_MEMORY = {} + PLUGIN_SHARED_MEMORY = X.SHARED_MEMORY +end + +local NS_FORMAT_STRING_CACHE = {} + +-- 格式化命名空间模板字符串 +---@param s string @需要格式化的字符串 +---@return string @格式化后的字符串 +function X.NSFormatString(s) + if not NS_FORMAT_STRING_CACHE[s] then + NS_FORMAT_STRING_CACHE[s] = StringReplaceW(s, '{$NS}', _NAME_SPACE_) + end + return NS_FORMAT_STRING_CACHE[s] +end + +-- 锁定命名空间 +---@param ns table @需要锁定的命名空间 +---@param szNSString string @需要锁定的命名空间的字符串描述名 +---@param mt table @额外的命名空间元表 +---@return table @命名空间锁定后读写代理对象 +function X.NSLock(ns, szNSString, mt) + local PROXY = {} + for k, v in pairs(ns) do + PROXY[k] = v + ns[k] = nil + end + local t = { + __metatable = true, + __index = PROXY, + __newindex = function() assert(false, 'DO NOT modify ' .. szNSString .. ' after initialized!!!') end, + __tostring = function(t) return szNSString end, + } + if mt then + for k, v in pairs(mt) do + t[k] = v + end + end + setmetatable(ns, t) + return PROXY +end + +-- 加载语言包 +---@param szLangFolder string @语言包文件夹 +---@return table @语言包 +function X.LoadLangPack(szLangFolder) + local t0 = LoadLUAData(_FRAMEWORK_ROOT_ .. 'lang/default') or {} + local t1 = LoadLUAData(_FRAMEWORK_ROOT_ .. 'lang/' .. _GAME_LANG_) or {} + for k, v in pairs(t1) do + t0[k] = v + end + if type(szLangFolder) == 'string' then + szLangFolder = string.gsub(szLangFolder,'[/\\]+$','') + local t2 = LoadLUAData(szLangFolder..'/default') or {} + for k, v in pairs(t2) do + t0[k] = v + end + local t3 = LoadLUAData(szLangFolder..'/' .. _GAME_LANG_) or {} + for k, v in pairs(t3) do + t0[k] = v + end + end + setmetatable(t0, { + __index = function(t, k) return k end, + __call = function(t, k, ...) return string.format(t[k], ...) end, + }) + return t0 +end + +local _L = X.LoadLangPack(_FRAMEWORK_ROOT_ .. 'lang/lib/') +local szHeader1 = GetFormatText(_L.PLUGIN_NAME .. ' ' .. _L['[Author]'], 8, 89, 224, 232) +local szHeader2 = GetFormatText(_L['[Fake author]'], 8, 255, 95, 159) +local szNameCN1 = string.char(0xDC, 0xF8, 0xD2, 0xC1) +local szNameCN2 = string.char(0xDC, 0xF8, 0xD2, 0xC1, 0xD2, 0xC1) +local szNameCN3 = string.char(0xD2, 0xC1, 0xDC, 0xF8) +local szNameCN4 = string.char(0xD2, 0xC1, 0xDC, 0xF8, 0xDC, 0xF8) +local szNameTW1 = string.char(0xE8, 0x8C, 0x97, 0xE4, 0xBC, 0x8A) +local szNameTW2 = string.char(0xE8, 0x8C, 0x97, 0xE4, 0xBC, 0x8A, 0xE4, 0xBC, 0x8A) + +X.PACKET_INFO.NAME = _L.PLUGIN_NAME +X.PACKET_INFO.SHORT_NAME = _L.PLUGIN_SHORT_NAME +X.PACKET_INFO.AUTHOR = _L.PLUGIN_AUTHOR +X.PACKET_INFO.AUTHOR_FEEDBACK = _L.PLUGIN_AUTHOR_FEEDBACK +X.PACKET_INFO.AUTHOR_FEEDBACK_URL = _L.PLUGIN_AUTHOR_FEEDBACK_URL +X.PACKET_INFO.AUTHOR_SIGNATURE = _L.PLUGIN_AUTHOR_SIGNATURE +X.PACKET_INFO.AUTHOR_ROLE_LIST = { + -- { szGlobalID = '0', szHeader = '' }, + -- { szName = '', dwID = 0, szHeader = '' }, + -- { szName = '', dwID = 0, szGlobalID = '0', szHeader = '' }, + -- 眉间雪 + { szGlobalID = '4917930793088585480', dwID = 3848, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '4917930793088587692', dwID = 6060, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '4917930793091799002', dwID = 3217370, szName = szNameCN4, szHeader = szHeader1 }, + { szGlobalID = '4845873199050654297', dwID = 3753904, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4845873199050655898', dwID = 3755505, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '4953959590107545980', dwID = 5381616, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4953959590107546219', dwID = 5381855, szName = szNameCN2, szHeader = szHeader1 }, + -- 山海相逢 + { szGlobalID = '4863887597560136370', dwID = 690, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '4863887597560137528', dwID = 1848, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '4881901996069618081', dwID = 1613070, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4881901996069618638', dwID = 1613627, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '4899916394579099691', dwID = 2335833, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4899916394579099773', dwID = 2335915, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '4935945191598063966', dwID = 3254257, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4935945191598064134', dwID = 3254425, szName = szNameCN2, szHeader = szHeader1 }, + -- 龙争虎斗 + { szGlobalID = '378302368703873127' , dwID = 4751463, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '378302368704986888' , dwID = 5865224, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '378302368705443010' , dwID = 6321346, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '378302368705443033' , dwID = 6321369, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '378302368705443039' , dwID = 6321375, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '378302368729578857' , dwID = 30457193, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '378302368731640013' , dwID = 32518349, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '378302368732635380' , dwID = 33513716, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '378302368732910188' , dwID = 33788524, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '378302368733692724' , dwID = 34571060, szName = szNameCN1, szHeader = szHeader1 }, + -- 剑胆琴心 + { szGlobalID = '972777519512290625' , dwID = 263489, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '972777519522485610' , dwID = 10458474, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + -- 斗转星移 + { szGlobalID = '270215977646574895' , dwID = 4345135, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '270215977662693730' , dwID = 20463970, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '4431542033332598576', dwID = 20501066, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '4431542033332788264', dwID = 20690754, szName = szNameCN2, szHeader = szHeader1 }, + -- 乾坤一掷 + { szGlobalID = '306244774665193949' , dwID = 4000221, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '306244774678344906' , dwID = 17151178, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '4647714815446365644', dwID = 22028859, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '4647714815446365650', dwID = 22028865, szName = szNameCN2, szHeader = szHeader1 }, + -- 绝代天骄 + { szGlobalID = '810647932928415242' , dwID = 1725962, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932929761745' , dwID = 3072465, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '810647932929767343' , dwID = 3078063, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932930507327' , dwID = 3818047, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '162129586587094825' , dwID = 14533895, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932948616306' , dwID = 21927026, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932948971397' , dwID = 22282117, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932954659351' , dwID = 27970071, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '810647932954621200' , dwID = 27931920, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + -- 梦江南 + { szGlobalID = '432345564230575012' , dwID = 3007396, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '432345564256132428' , dwID = 28564812, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '342273571692775163' , dwID = 17796954, szName = szNameCN1, szHeader = szHeader1 }, + -- 幽月轮 + { szGlobalID = '198158383608689108' , dwID = 4387284, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '198158383625370506' , dwID = 21068682, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '3945153273576625046', dwID = 21553085, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '3945153273576625053', dwID = 21553092, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + -- 长安城 + { szGlobalID = '396316767212724712' , dwID = 4121064, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '396316767217116975' , dwID = 8513327, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '396316767221932296' , dwID = 13328648, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '396316767221932356' , dwID = 13328708, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '396316767221969620' , dwID = 13365972, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + -- 唯我独尊 + { szGlobalID = '342273571684493800' , dwID = 4336104, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '2900318160027211566', dwID = 20870772, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + -- 蝶恋花 + { szGlobalID = '216172782116345142' , dwID = 2561334, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782116778584' , dwID = 2994776, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782124917034' , dwID = 11133226, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782124970802' , dwID = 11186994, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '216172782126564848' , dwID = 12781040, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '216172782126564851' , dwID = 12781043, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782135452209' , dwID = 21668401, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782136639174' , dwID = 22855366, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '216172782136822717' , dwID = 23038909, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '216172782136999278' , dwID = 23215470, szName = szNameCN1, szHeader = szHeader1 }, + -- 天鹅坪 + { szGlobalID = '252201579136182161' , dwID = 3434385, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '252201579136967752' , dwID = 4219976, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '252201579145213206' , dwID = 12465430, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '2990390152574185432', dwID = 14964280, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '252201579154915656' , dwID = 22167880, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + -- 破阵子 + { szGlobalID = '288230376154983398' , dwID = 3271654, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '288230376168682411' , dwID = 16970667, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + -- 飞龙在天 + { szGlobalID = '234187180625901428' , dwID = 2635636, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '234187180631190792' , dwID = 7925000, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '234187180639172085' , dwID = 15906293, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '234187180639782941' , dwID = 16517149, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '234187180639916246' , dwID = 16650454, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '3710966092953340963', dwID = 22075830, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '3728980491462810295', dwID = 23598477, szName = szNameCN2, szHeader = szHeader1 }, + { szGlobalID = '3710966092956267991', dwID = 25002858, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '2882303761517969694', dwID = 25747825, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '3855081281029320236', dwID = 26037104, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '3963167672086075586', dwID = 27419106, szName = szNameCN1, szHeader = szHeader1 }, + -- 国际服 + { szGlobalID = '18014398509867167', dwID = 385183, szName = szNameTW2, szHeader = szHeader1 }, -- NameTW2 + { szGlobalID = '18014398515510594', dwID = 6028610, szName = szNameTW2, szHeader = szHeader1 }, + { szGlobalID = '18014398518050253', dwID = 8568269, szName = szNameTW1, szHeader = szHeader1 }, -- NameTW1 + -- 缘起稻香 + { szGlobalID = '36028797018964996', dwID = 1028, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '54043195528446612', dwID = 1234873, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '90071992547410200', dwID = 1438152, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + { szGlobalID = '72057594037928079', dwID = 1542205, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '36028797020576831', dwID = 1677727, szName = szNameCN2, szHeader = szHeader1 }, + -- 天宝盛世 + { szGlobalID = '18014398509483243', dwID = 1259, szName = szNameCN1, szHeader = szHeader1 }, + { szGlobalID = '18014398511806138', dwID = 2324154, szName = szNameCN1, szHeader = szHeader1 }, -- NameCN1 + { szGlobalID = '18014398511806143', dwID = 2324159, szName = szNameCN2, szHeader = szHeader1 }, -- NameCN2 + -- 通配 + { szName = szNameCN1, dwID = '*', szHeader = szHeader2 }, -- 简体 + { szName = szNameCN2, dwID = '*', szHeader = szHeader2 }, -- 简体 + { szName = szNameTW1, dwID = '*', szHeader = szHeader2 }, -- 繁体 + { szName = szNameTW2, dwID = '*', szHeader = szHeader2 }, -- 繁体 +} + +-- 导出命名空间 +---@class (partial) MY +MY = X + +---@class (partial) MY_UI +MY_UI = UI diff --git a/Boilerplate_!Base/src/lib/BaseAPI.lua b/MY_!Base/src/lib/BaseAPI.lua similarity index 99% rename from Boilerplate_!Base/src/lib/BaseAPI.lua rename to MY_!Base/src/lib/BaseAPI.lua index bb1275a1b..8b132d0f8 100644 --- a/Boilerplate_!Base/src/lib/BaseAPI.lua +++ b/MY_!Base/src/lib/BaseAPI.lua @@ -3,8 +3,8 @@ -- @desc : 游戏通用函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- -- Lua 数据序列化 diff --git a/Boilerplate_!Base/src/lib/BaseLua.lua b/MY_!Base/src/lib/BaseLua.lua similarity index 99% rename from Boilerplate_!Base/src/lib/BaseLua.lua rename to MY_!Base/src/lib/BaseLua.lua index c92cc1366..4a53f5576 100644 --- a/Boilerplate_!Base/src/lib/BaseLua.lua +++ b/MY_!Base/src/lib/BaseLua.lua @@ -3,8 +3,8 @@ -- @desc : LUA 基础函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local RANDOM_VALUE = nil diff --git a/Boilerplate_!Base/src/lib/BaseXX.lua b/MY_!Base/src/lib/BaseXX.lua similarity index 99% rename from Boilerplate_!Base/src/lib/BaseXX.lua rename to MY_!Base/src/lib/BaseXX.lua index 9c78c45bb..1af385a35 100644 --- a/Boilerplate_!Base/src/lib/BaseXX.lua +++ b/MY_!Base/src/lib/BaseXX.lua @@ -6,8 +6,8 @@ -- Base64-encoding -- Sourced from https://github.com/aiq/basexx/blob/master/lib/basexx.lua -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/BaseXX') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Chat.lua b/MY_!Base/src/lib/Chat.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Chat.lua rename to MY_!Base/src/lib/Chat.lua index 8992cf6e4..5bfed0bf7 100644 --- a/Boilerplate_!Base/src/lib/Chat.lua +++ b/MY_!Base/src/lib/Chat.lua @@ -3,8 +3,8 @@ -- @desc : 聊天相关模块 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Chat') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Constant.lua b/MY_!Base/src/lib/Constant.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Constant.lua rename to MY_!Base/src/lib/Constant.lua index 6658b4d9e..ae6cc13e6 100644 --- a/Boilerplate_!Base/src/lib/Constant.lua +++ b/MY_!Base/src/lib/Constant.lua @@ -3,8 +3,8 @@ -- @desc : 游戏常量枚举 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Constant') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Curl.lua b/MY_!Base/src/lib/Curl.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Curl.lua rename to MY_!Base/src/lib/Curl.lua index e769770b8..4ff3a5d11 100644 --- a/Boilerplate_!Base/src/lib/Curl.lua +++ b/MY_!Base/src/lib/Curl.lua @@ -3,8 +3,8 @@ -- @desc : 网络请求支持库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Curl') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Deflate.lua b/MY_!Base/src/lib/Deflate.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Deflate.lua rename to MY_!Base/src/lib/Deflate.lua index 903206f34..38ffa9a0e 100644 --- a/Boilerplate_!Base/src/lib/Deflate.lua +++ b/MY_!Base/src/lib/Deflate.lua @@ -3,8 +3,8 @@ -- @desc : Deflate 工具库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Deflate') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Environment.lua b/MY_!Base/src/lib/Environment.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Environment.lua rename to MY_!Base/src/lib/Environment.lua index 9c40975dc..2f0c0a178 100644 --- a/Boilerplate_!Base/src/lib/Environment.lua +++ b/MY_!Base/src/lib/Environment.lua @@ -3,8 +3,8 @@ -- @desc : 环境相关 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Environment') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Event.lua b/MY_!Base/src/lib/Event.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Event.lua rename to MY_!Base/src/lib/Event.lua index 1292347ec..4c4df7884 100644 --- a/Boilerplate_!Base/src/lib/Event.lua +++ b/MY_!Base/src/lib/Event.lua @@ -3,8 +3,8 @@ -- @desc : 事件处理相关函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Event') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Achievement.lua b/MY_!Base/src/lib/Game.Achievement.lua similarity index 97% rename from Boilerplate_!Base/src/lib/Game.Achievement.lua rename to MY_!Base/src/lib/Game.Achievement.lua index 16f594417..4e0033767 100644 --- a/Boilerplate_!Base/src/lib/Game.Achievement.lua +++ b/MY_!Base/src/lib/Game.Achievement.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Achievement') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Activity.lua b/MY_!Base/src/lib/Game.Activity.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Activity.lua rename to MY_!Base/src/lib/Game.Activity.lua index e7fca88fe..4b5b6f257 100644 --- a/Boilerplate_!Base/src/lib/Game.Activity.lua +++ b/MY_!Base/src/lib/Game.Activity.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Activity') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Asset.lua b/MY_!Base/src/lib/Game.Asset.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Asset.lua rename to MY_!Base/src/lib/Game.Asset.lua index 61bf1613e..c1b1f6e6e 100644 --- a/Boilerplate_!Base/src/lib/Game.Asset.lua +++ b/MY_!Base/src/lib/Game.Asset.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Asset') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Book.lua b/MY_!Base/src/lib/Game.Book.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Book.lua rename to MY_!Base/src/lib/Game.Book.lua index 1e2452e16..5232515d5 100644 --- a/Boilerplate_!Base/src/lib/Game.Book.lua +++ b/MY_!Base/src/lib/Game.Book.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Book') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Buff.lua b/MY_!Base/src/lib/Game.Buff.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Buff.lua rename to MY_!Base/src/lib/Game.Buff.lua index c533b8dd0..4574466f0 100644 --- a/Boilerplate_!Base/src/lib/Game.Buff.lua +++ b/MY_!Base/src/lib/Game.Buff.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Buff') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Distance.lua b/MY_!Base/src/lib/Game.Distance.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Distance.lua rename to MY_!Base/src/lib/Game.Distance.lua index 3de286c4d..8356e383e 100644 --- a/Boilerplate_!Base/src/lib/Game.Distance.lua +++ b/MY_!Base/src/lib/Game.Distance.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Distance') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Fellowship.lua b/MY_!Base/src/lib/Game.Fellowship.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Fellowship.lua rename to MY_!Base/src/lib/Game.Fellowship.lua index 6d9df3fb9..aeed22d3f 100644 --- a/Boilerplate_!Base/src/lib/Game.Fellowship.lua +++ b/MY_!Base/src/lib/Game.Fellowship.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Fellowship') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Fight.lua b/MY_!Base/src/lib/Game.Fight.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Fight.lua rename to MY_!Base/src/lib/Game.Fight.lua index 03029d83a..ea1c4ecac 100644 --- a/Boilerplate_!Base/src/lib/Game.Fight.lua +++ b/MY_!Base/src/lib/Game.Fight.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Fight') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Homeland.lua b/MY_!Base/src/lib/Game.Homeland.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Homeland.lua rename to MY_!Base/src/lib/Game.Homeland.lua index eb3fee112..42a5da0fc 100644 --- a/Boilerplate_!Base/src/lib/Game.Homeland.lua +++ b/MY_!Base/src/lib/Game.Homeland.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Homeland') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Inventory.lua b/MY_!Base/src/lib/Game.Inventory.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Inventory.lua rename to MY_!Base/src/lib/Game.Inventory.lua index 0fd32ef38..80b8b9af8 100644 --- a/Boilerplate_!Base/src/lib/Game.Inventory.lua +++ b/MY_!Base/src/lib/Game.Inventory.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Inventory') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Item.lua b/MY_!Base/src/lib/Game.Item.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Item.lua rename to MY_!Base/src/lib/Game.Item.lua index f70e1a35c..7c73d067c 100644 --- a/Boilerplate_!Base/src/lib/Game.Item.lua +++ b/MY_!Base/src/lib/Game.Item.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Item') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Macro.lua b/MY_!Base/src/lib/Game.Macro.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Macro.lua rename to MY_!Base/src/lib/Game.Macro.lua index d25164d29..efe1946fd 100644 --- a/Boilerplate_!Base/src/lib/Game.Macro.lua +++ b/MY_!Base/src/lib/Game.Macro.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Macro') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Map.lua b/MY_!Base/src/lib/Game.Map.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Map.lua rename to MY_!Base/src/lib/Game.Map.lua index 721e5576a..44eadb6dd 100644 --- a/Boilerplate_!Base/src/lib/Game.Map.lua +++ b/MY_!Base/src/lib/Game.Map.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Map') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.MapCD.lua b/MY_!Base/src/lib/Game.MapCD.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.MapCD.lua rename to MY_!Base/src/lib/Game.MapCD.lua index 484b63c90..bf6f39979 100644 --- a/Boilerplate_!Base/src/lib/Game.MapCD.lua +++ b/MY_!Base/src/lib/Game.MapCD.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.MapCD') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Minimap.lua b/MY_!Base/src/lib/Game.Minimap.lua similarity index 97% rename from Boilerplate_!Base/src/lib/Game.Minimap.lua rename to MY_!Base/src/lib/Game.Minimap.lua index 32dcb0bf9..35ca32758 100644 --- a/Boilerplate_!Base/src/lib/Game.Minimap.lua +++ b/MY_!Base/src/lib/Game.Minimap.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Minimap') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Name.lua b/MY_!Base/src/lib/Game.Name.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Name.lua rename to MY_!Base/src/lib/Game.Name.lua index d6d0e0a2c..9e6c4f33b 100644 --- a/Boilerplate_!Base/src/lib/Game.Name.lua +++ b/MY_!Base/src/lib/Game.Name.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Name') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.PeekPlayer.lua b/MY_!Base/src/lib/Game.PeekPlayer.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.PeekPlayer.lua rename to MY_!Base/src/lib/Game.PeekPlayer.lua index 085bdbe26..1f2bf31ff 100644 --- a/Boilerplate_!Base/src/lib/Game.PeekPlayer.lua +++ b/MY_!Base/src/lib/Game.PeekPlayer.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.PeekPlayer') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.SafeLock.lua b/MY_!Base/src/lib/Game.SafeLock.lua similarity index 97% rename from Boilerplate_!Base/src/lib/Game.SafeLock.lua rename to MY_!Base/src/lib/Game.SafeLock.lua index d34095d02..2a9f20a0c 100644 --- a/Boilerplate_!Base/src/lib/Game.SafeLock.lua +++ b/MY_!Base/src/lib/Game.SafeLock.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.SafeLock') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Skill.lua b/MY_!Base/src/lib/Game.Skill.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Skill.lua rename to MY_!Base/src/lib/Game.Skill.lua index c8c3feb44..352ca54a1 100644 --- a/Boilerplate_!Base/src/lib/Game.Skill.lua +++ b/MY_!Base/src/lib/Game.Skill.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Skill') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.String.lua b/MY_!Base/src/lib/Game.String.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.String.lua rename to MY_!Base/src/lib/Game.String.lua index e066eb6ed..45f75a4a8 100644 --- a/Boilerplate_!Base/src/lib/Game.String.lua +++ b/MY_!Base/src/lib/Game.String.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.String') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Character.lua b/MY_!Base/src/lib/Game.Target.Character.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Target.Character.lua rename to MY_!Base/src/lib/Game.Target.Character.lua index d8af25d0f..34385d24e 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Character.lua +++ b/MY_!Base/src/lib/Game.Target.Character.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Target') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Doodad.lua b/MY_!Base/src/lib/Game.Target.Doodad.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Target.Doodad.lua rename to MY_!Base/src/lib/Game.Target.Doodad.lua index 46e2a1759..db1f232b8 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Doodad.lua +++ b/MY_!Base/src/lib/Game.Target.Doodad.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Doodad') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Near.lua b/MY_!Base/src/lib/Game.Target.Near.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Target.Near.lua rename to MY_!Base/src/lib/Game.Target.Near.lua index b9b800e81..a36d75c50 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Near.lua +++ b/MY_!Base/src/lib/Game.Target.Near.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Near') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Npc.lua b/MY_!Base/src/lib/Game.Target.Npc.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Target.Npc.lua rename to MY_!Base/src/lib/Game.Target.Npc.lua index 2f61d146c..1f929487c 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Npc.lua +++ b/MY_!Base/src/lib/Game.Target.Npc.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Npc') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Player.lua b/MY_!Base/src/lib/Game.Target.Player.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Target.Player.lua rename to MY_!Base/src/lib/Game.Target.Player.lua index 0108c81ff..6ec05d080 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Player.lua +++ b/MY_!Base/src/lib/Game.Target.Player.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Player') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Target.Relation.lua b/MY_!Base/src/lib/Game.Target.Relation.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Target.Relation.lua rename to MY_!Base/src/lib/Game.Target.Relation.lua index d79ee8748..09f9de471 100644 --- a/Boilerplate_!Base/src/lib/Game.Target.Relation.lua +++ b/MY_!Base/src/lib/Game.Target.Relation.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.KObject.Relation') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Team.lua b/MY_!Base/src/lib/Game.Team.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Game.Team.lua rename to MY_!Base/src/lib/Game.Team.lua index f0d17b92b..759d8733b 100644 --- a/Boilerplate_!Base/src/lib/Game.Team.lua +++ b/MY_!Base/src/lib/Game.Team.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Team') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Game.Tong.lua b/MY_!Base/src/lib/Game.Tong.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Game.Tong.lua rename to MY_!Base/src/lib/Game.Tong.lua index b0014ba25..0878ac88f 100644 --- a/Boilerplate_!Base/src/lib/Game.Tong.lua +++ b/MY_!Base/src/lib/Game.Tong.lua @@ -3,8 +3,8 @@ -- @desc : 游戏环境库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Game.Tong') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Interval.lua b/MY_!Base/src/lib/Interval.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Interval.lua rename to MY_!Base/src/lib/Interval.lua index 1e36f0cb4..47989b82c 100644 --- a/Boilerplate_!Base/src/lib/Interval.lua +++ b/MY_!Base/src/lib/Interval.lua @@ -3,8 +3,8 @@ -- @desc : 时间周期函数模块 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Interval') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Json.lua b/MY_!Base/src/lib/Json.lua similarity index 96% rename from Boilerplate_!Base/src/lib/Json.lua rename to MY_!Base/src/lib/Json.lua index 0ae63543b..01ede6052 100644 --- a/Boilerplate_!Base/src/lib/Json.lua +++ b/MY_!Base/src/lib/Json.lua @@ -3,8 +3,8 @@ -- @desc : Json 处理模块 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Json') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/LoadingEnd.lua b/MY_!Base/src/lib/LoadingEnd.lua similarity index 96% rename from Boilerplate_!Base/src/lib/LoadingEnd.lua rename to MY_!Base/src/lib/LoadingEnd.lua index e5b3db92c..3a12f1967 100644 --- a/Boilerplate_!Base/src/lib/LoadingEnd.lua +++ b/MY_!Base/src/lib/LoadingEnd.lua @@ -3,8 +3,8 @@ -- @desc : 基础库加载完成处理 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/LoadingEnd') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Math.lua b/MY_!Base/src/lib/Math.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Math.lua rename to MY_!Base/src/lib/Math.lua index cc74ef237..3757be029 100644 --- a/Boilerplate_!Base/src/lib/Math.lua +++ b/MY_!Base/src/lib/Math.lua @@ -3,8 +3,8 @@ -- @desc : 数学库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Math') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/PacketExtend.lua b/MY_!Base/src/lib/PacketExtend.lua similarity index 94% rename from Boilerplate_!Base/src/lib/PacketExtend.lua rename to MY_!Base/src/lib/PacketExtend.lua index 232e329b1..0faf4ef60 100644 --- a/Boilerplate_!Base/src/lib/PacketExtend.lua +++ b/MY_!Base/src/lib/PacketExtend.lua @@ -3,8 +3,8 @@ -- @desc : 插件库自定义函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/PacketExtend') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Panel.lua b/MY_!Base/src/lib/Panel.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Panel.lua rename to MY_!Base/src/lib/Panel.lua index 98472700e..4fb5ba29c 100644 --- a/Boilerplate_!Base/src/lib/Panel.lua +++ b/MY_!Base/src/lib/Panel.lua @@ -3,8 +3,8 @@ -- @desc : 插件主界面相关函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/PS') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Print.lua b/MY_!Base/src/lib/Print.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Print.lua rename to MY_!Base/src/lib/Print.lua index fce9aaffa..0a31ca562 100644 --- a/Boilerplate_!Base/src/lib/Print.lua +++ b/MY_!Base/src/lib/Print.lua @@ -3,8 +3,8 @@ -- @desc : 系统输出 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Print') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Schema.lua b/MY_!Base/src/lib/Schema.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Schema.lua rename to MY_!Base/src/lib/Schema.lua index b1d05e631..3100b5a5a 100644 --- a/Boilerplate_!Base/src/lib/Schema.lua +++ b/MY_!Base/src/lib/Schema.lua @@ -4,8 +4,8 @@ -- @ref : https://github.com/sschoener/lua-schema -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Schema') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Semver.lua b/MY_!Base/src/lib/Semver.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Semver.lua rename to MY_!Base/src/lib/Semver.lua index d4167f28d..3cc3f8173 100644 --- a/Boilerplate_!Base/src/lib/Semver.lua +++ b/MY_!Base/src/lib/Semver.lua @@ -3,8 +3,8 @@ -- @desc : Semver 版本号工具库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Semver') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Storage.LUAData.lua b/MY_!Base/src/lib/Storage.LUAData.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Storage.LUAData.lua rename to MY_!Base/src/lib/Storage.LUAData.lua index 7c883d580..4f9749e67 100644 --- a/Boilerplate_!Base/src/lib/Storage.LUAData.lua +++ b/MY_!Base/src/lib/Storage.LUAData.lua @@ -3,8 +3,8 @@ -- @desc : LUA 数据 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Storage.LUAData') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Storage.Path.lua b/MY_!Base/src/lib/Storage.Path.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Storage.Path.lua rename to MY_!Base/src/lib/Storage.Path.lua index 5f8a56e82..01a885a07 100644 --- a/Boilerplate_!Base/src/lib/Storage.Path.lua +++ b/MY_!Base/src/lib/Storage.Path.lua @@ -3,8 +3,8 @@ -- @desc : 路径相关操作 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Storage.Path') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Storage.RemoteStorage.lua b/MY_!Base/src/lib/Storage.RemoteStorage.lua similarity index 64% rename from Boilerplate_!Base/src/lib/Storage.RemoteStorage.lua rename to MY_!Base/src/lib/Storage.RemoteStorage.lua index 77928c6af..965b6df54 100644 --- a/Boilerplate_!Base/src/lib/Storage.RemoteStorage.lua +++ b/MY_!Base/src/lib/Storage.RemoteStorage.lua @@ -3,8 +3,8 @@ -- @desc : 远程存储 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Storage.RemoteStorage') -------------------------------------------------------------------------------- @@ -187,4 +187,113 @@ local function OnInit() end X.RegisterInit('LIB#RemoteStorage', OnInit) + +------------------------------------------------------------------------------ +-- 设置云存储 +------------------------------------------------------------------------------ + +do +------------------------------- +-- remote data storage online +-- bosslist (done) +-- focus list (working on) +-- chat blocklist (working on) +------------------------------- +local function FormatStorageData(me, d) + return X.EncryptString(X.ConvertToUTF8(X.EncodeJSON({ + g = me.GetGlobalID(), f = me.dwForceID, e = me.GetTotalEquipScore(), + n = X.GetClientPlayerName(), i = X.GetClientPlayerID(), c = me.nCamp, + S = X.GetRegionOriginName(), s = X.GetServerOriginName(), r = me.nRoleType, + _ = GetCurrentTime(), t = X.GetTongName(), d = d, + m = X.ENVIRONMENT.GAME_PROVIDER == 'remote' and 1 or 0, v = X.PACKET_INFO.VERSION, + }))) +end +-- 个人数据版本号 +local m_nStorageVer = {} +X.BreatheCall(X.NSFormatString('{$NS}#STORAGE_DATA'), 200, function() + if not X.IsInitialized() then + return + end + local me = X.GetClientPlayer() + if not me or IsRemotePlayer(me.dwID) or not X.GetTongName() then + return + end + X.BreatheCall(X.NSFormatString('{$NS}#STORAGE_DATA'), false) + if X.IsDebugServer() then + return + end + m_nStorageVer = X.LoadLUAData({'config/storageversion.jx3dat', X.PATH_TYPE.ROLE}) or {} + X.Ajax({ + url = 'https://pull-storage.j3cx.com/api/storage', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + data = FormatStorageData(me), + }, + success = function(html, status) + local data = X.DecodeJSON(html) + if data then + for k, v in pairs(data.public or X.CONSTANT.EMPTY_TABLE) do + local oData = X.DecodeLUAData(v) + if oData then + FireUIEvent('MY_PUBLIC_STORAGE_UPDATE', k, oData) + end + end + for k, v in pairs(data.private or X.CONSTANT.EMPTY_TABLE) do + if not m_nStorageVer[k] or m_nStorageVer[k] < v.v then + local oData = X.DecodeLUAData(v.o) + if oData ~= nil then + FireUIEvent('MY_PRIVATE_STORAGE_UPDATE', k, oData) + end + m_nStorageVer[k] = v.v + end + end + for _, v in ipairs(data.action or X.CONSTANT.EMPTY_TABLE) do + if v[1] == 'execute' then + local f = X.GetGlobalValue(v[2]) + if f then + f(select(3, v)) + end + elseif v[1] == 'assign' then + X.SetGlobalValue(v[2], v[3]) + elseif v[1] == 'axios' then + X.Ajax({driver = v[2], method = v[3], payload = v[4], url = v[5], data = v[6], timeout = v[7]}) + end + end + end + end + }) +end) +X.RegisterFlush(X.NSFormatString('{$NS}#STORAGE_DATA'), function() + X.SaveLUAData({'config/storageversion.jx3dat', X.PATH_TYPE.ROLE}, m_nStorageVer) +end) +-- 保存个人数据 方便网吧党和公司家里多电脑切换 +function X.StorageData(szKey, oData) + if X.IsDebugServer() then + return + end + X.DelayCall('STORAGE_' .. szKey, 120000, function() + local me = X.GetClientPlayer() + if not me then + return + end + X.Ajax({ + url = 'https://push-storage.j3cx.com/api/storage/uploads', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + data = FormatStorageData(me, { k = szKey, o = oData }), + }, + success = function(html, status) + local data = X.DecodeJSON(html) + if data and data.succeed then + FireUIEvent('MY_PRIVATE_STORAGE_SYNC', szKey) + end + end, + }) + end) + m_nStorageVer[szKey] = GetCurrentTime() +end +end + --[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/Boilerplate_!Base/src/lib/Storage.SQLite.lua b/MY_!Base/src/lib/Storage.SQLite.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Storage.SQLite.lua rename to MY_!Base/src/lib/Storage.SQLite.lua index bb90ae761..fdfc4c0fd 100644 --- a/Boilerplate_!Base/src/lib/Storage.SQLite.lua +++ b/MY_!Base/src/lib/Storage.SQLite.lua @@ -3,8 +3,8 @@ -- @desc : SQLite -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Storage.SQLite') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Storage.UserSettings.lua b/MY_!Base/src/lib/Storage.UserSettings.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Storage.UserSettings.lua rename to MY_!Base/src/lib/Storage.UserSettings.lua index f895b6afc..e5aaaee58 100644 --- a/Boilerplate_!Base/src/lib/Storage.UserSettings.lua +++ b/MY_!Base/src/lib/Storage.UserSettings.lua @@ -3,8 +3,8 @@ -- @desc : 用户配置 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Storage.UserSettings') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/String.lua b/MY_!Base/src/lib/String.lua similarity index 99% rename from Boilerplate_!Base/src/lib/String.lua rename to MY_!Base/src/lib/String.lua index 95e087ae6..d7e9f2480 100644 --- a/Boilerplate_!Base/src/lib/String.lua +++ b/MY_!Base/src/lib/String.lua @@ -3,8 +3,8 @@ -- @desc : 字符串处理 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/String') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Account.lua b/MY_!Base/src/lib/System.Account.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.Account.lua rename to MY_!Base/src/lib/System.Account.lua index e941a816f..1700a8849 100644 --- a/Boilerplate_!Base/src/lib/System.Account.lua +++ b/MY_!Base/src/lib/System.Account.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·账户 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Account') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.CThread.lua b/MY_!Base/src/lib/System.CThread.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.CThread.lua rename to MY_!Base/src/lib/System.CThread.lua index 50bc033a5..d6dd3c51a 100644 --- a/Boilerplate_!Base/src/lib/System.CThread.lua +++ b/MY_!Base/src/lib/System.CThread.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·跨线程读写 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.CThread') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Cache.lua b/MY_!Base/src/lib/System.Cache.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.Cache.lua rename to MY_!Base/src/lib/System.Cache.lua index 4a9aed3b6..cd83fda40 100644 --- a/Boilerplate_!Base/src/lib/System.Cache.lua +++ b/MY_!Base/src/lib/System.Cache.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·缓存 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Cache') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Color.lua b/MY_!Base/src/lib/System.Color.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.Color.lua rename to MY_!Base/src/lib/System.Color.lua index 011e5362a..a4aa663bc 100644 --- a/Boilerplate_!Base/src/lib/System.Color.lua +++ b/MY_!Base/src/lib/System.Color.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·颜色 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Color') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.EditBox.lua b/MY_!Base/src/lib/System.EditBox.lua similarity index 96% rename from Boilerplate_!Base/src/lib/System.EditBox.lua rename to MY_!Base/src/lib/System.EditBox.lua index cc6dd7f17..f94355532 100644 --- a/Boilerplate_!Base/src/lib/System.EditBox.lua +++ b/MY_!Base/src/lib/System.EditBox.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·聊天框 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.EditBox') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.ErrorCollect.lua b/MY_!Base/src/lib/System.ErrorCollect.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.ErrorCollect.lua rename to MY_!Base/src/lib/System.ErrorCollect.lua index 7b2676c60..b92a3b8be 100644 --- a/Boilerplate_!Base/src/lib/System.ErrorCollect.lua +++ b/MY_!Base/src/lib/System.ErrorCollect.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·错误日志 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.ErrorCollect') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Font.lua b/MY_!Base/src/lib/System.Font.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.Font.lua rename to MY_!Base/src/lib/System.Font.lua index 4d8561317..bf5f0efdc 100644 --- a/Boilerplate_!Base/src/lib/System.Font.lua +++ b/MY_!Base/src/lib/System.Font.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·字体 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Font') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.GVoice.lua b/MY_!Base/src/lib/System.GVoice.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.GVoice.lua rename to MY_!Base/src/lib/System.GVoice.lua index faf1d65ce..6d5e1f719 100644 --- a/Boilerplate_!Base/src/lib/System.GVoice.lua +++ b/MY_!Base/src/lib/System.GVoice.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·语音 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.GVoice') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Hook.lua b/MY_!Base/src/lib/System.Hook.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.Hook.lua rename to MY_!Base/src/lib/System.Hook.lua index 9edb1d496..0068da8c8 100644 --- a/Boilerplate_!Base/src/lib/System.Hook.lua +++ b/MY_!Base/src/lib/System.Hook.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·注入 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Hook') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Hotkey.lua b/MY_!Base/src/lib/System.Hotkey.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Hotkey.lua rename to MY_!Base/src/lib/System.Hotkey.lua index 2e5d4fa98..21a393f0c 100644 --- a/Boilerplate_!Base/src/lib/System.Hotkey.lua +++ b/MY_!Base/src/lib/System.Hotkey.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·快捷键 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Hotkey') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.InfoCache.lua b/MY_!Base/src/lib/System.InfoCache.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.InfoCache.lua rename to MY_!Base/src/lib/System.InfoCache.lua index db44b86f1..7d088513a 100644 --- a/Boilerplate_!Base/src/lib/System.InfoCache.lua +++ b/MY_!Base/src/lib/System.InfoCache.lua @@ -3,8 +3,8 @@ -- @desc : 键值对文件分隔快速存储模块 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.InfoCache') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Menu.lua b/MY_!Base/src/lib/System.Menu.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Menu.lua rename to MY_!Base/src/lib/System.Menu.lua index 58db6da84..781785b8b 100644 --- a/Boilerplate_!Base/src/lib/System.Menu.lua +++ b/MY_!Base/src/lib/System.Menu.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·系统菜单 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Menu') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.MessageBox.lua b/MY_!Base/src/lib/System.MessageBox.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.MessageBox.lua rename to MY_!Base/src/lib/System.MessageBox.lua index a0340632d..1cc5b8f8a 100644 --- a/Boilerplate_!Base/src/lib/System.MessageBox.lua +++ b/MY_!Base/src/lib/System.MessageBox.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·弹框 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.MessageBox') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Module.lua b/MY_!Base/src/lib/System.Module.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Module.lua rename to MY_!Base/src/lib/System.Module.lua index aceae1b3b..fde1f7a39 100644 --- a/Boilerplate_!Base/src/lib/System.Module.lua +++ b/MY_!Base/src/lib/System.Module.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·模块 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Module') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Operator.lua b/MY_!Base/src/lib/System.Operator.lua similarity index 97% rename from Boilerplate_!Base/src/lib/System.Operator.lua rename to MY_!Base/src/lib/System.Operator.lua index 13893cc27..738922b65 100644 --- a/Boilerplate_!Base/src/lib/System.Operator.lua +++ b/MY_!Base/src/lib/System.Operator.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·计算符号 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Operator') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Pinyin.lua b/MY_!Base/src/lib/System.Pinyin.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.Pinyin.lua rename to MY_!Base/src/lib/System.Pinyin.lua index 63a7384d1..b25f287a3 100644 --- a/Boilerplate_!Base/src/lib/System.Pinyin.lua +++ b/MY_!Base/src/lib/System.Pinyin.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·拼音 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Pinyin') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Sound.lua b/MY_!Base/src/lib/System.Sound.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Sound.lua rename to MY_!Base/src/lib/System.Sound.lua index a27493a6e..e9a8753e3 100644 --- a/Boilerplate_!Base/src/lib/System.Sound.lua +++ b/MY_!Base/src/lib/System.Sound.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·声音 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Sound') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Time.lua b/MY_!Base/src/lib/System.Time.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Time.lua rename to MY_!Base/src/lib/System.Time.lua index 946215943..a472ffa71 100644 --- a/Boilerplate_!Base/src/lib/System.Time.lua +++ b/MY_!Base/src/lib/System.Time.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·时间 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Time') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.UI.lua b/MY_!Base/src/lib/System.UI.lua similarity index 98% rename from Boilerplate_!Base/src/lib/System.UI.lua rename to MY_!Base/src/lib/System.UI.lua index dd4b8ff19..0595f88ce 100644 --- a/Boilerplate_!Base/src/lib/System.UI.lua +++ b/MY_!Base/src/lib/System.UI.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·界面函数 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.UI') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/System.Variable.lua b/MY_!Base/src/lib/System.Variable.lua similarity index 99% rename from Boilerplate_!Base/src/lib/System.Variable.lua rename to MY_!Base/src/lib/System.Variable.lua index 8a56a1834..d705f8544 100644 --- a/Boilerplate_!Base/src/lib/System.Variable.lua +++ b/MY_!Base/src/lib/System.Variable.lua @@ -3,8 +3,8 @@ -- @desc : 系统函数库·全局数据 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/System.Variable') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Table.lua b/MY_!Base/src/lib/Table.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Table.lua rename to MY_!Base/src/lib/Table.lua index b98f2d3a4..3c02aff54 100644 --- a/Boilerplate_!Base/src/lib/Table.lua +++ b/MY_!Base/src/lib/Table.lua @@ -3,8 +3,8 @@ -- @desc : 查询全局配置表函数库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Table') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Tip.lua b/MY_!Base/src/lib/Tip.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Tip.lua rename to MY_!Base/src/lib/Tip.lua index d75a139be..5c77743dc 100644 --- a/Boilerplate_!Base/src/lib/Tip.lua +++ b/MY_!Base/src/lib/Tip.lua @@ -3,8 +3,8 @@ -- @desc : Tip相关逻辑 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Tip') -------------------------------------------------------------------------------- @@ -253,7 +253,7 @@ function X.OutputPlayerTip(Rect, dwID, szExtraXml) table.insert(t, GetFormatText(g_tStrings.STR_TIP_CAMP_FLAG .. '\n', 163)) end table.insert(t, GetFormatText(g_tStrings.STR_GUILD_CAMP_NAME[player.nCamp], 82)) - -- 小本本 + -- 角色备注 if _G.MY_Anmerkungen and _G.MY_Anmerkungen.GetPlayerNote then local note = _G.MY_Anmerkungen.GetPlayerNote(player.dwID) if note and note.szContent ~= '' then diff --git a/Boilerplate_!Base/src/lib/UI.Browser.lua b/MY_!Base/src/lib/UI.Browser.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.Browser.lua rename to MY_!Base/src/lib/UI.Browser.lua index f5417bb96..9b4efc3ed 100644 --- a/Boilerplate_!Base/src/lib/UI.Browser.lua +++ b/MY_!Base/src/lib/UI.Browser.lua @@ -3,8 +3,8 @@ -- @desc : 网页界面 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.Browser') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.ColorPicker.lua b/MY_!Base/src/lib/UI.ColorPicker.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.ColorPicker.lua rename to MY_!Base/src/lib/UI.ColorPicker.lua index a92f0b05e..32c7d8b93 100644 --- a/Boilerplate_!Base/src/lib/UI.ColorPicker.lua +++ b/MY_!Base/src/lib/UI.ColorPicker.lua @@ -3,8 +3,8 @@ -- @desc : ColorPicker -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.ColorPicker') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.DragDrop.lua b/MY_!Base/src/lib/UI.DragDrop.lua similarity index 98% rename from Boilerplate_!Base/src/lib/UI.DragDrop.lua rename to MY_!Base/src/lib/UI.DragDrop.lua index a2ba056ba..983d1300d 100644 --- a/Boilerplate_!Base/src/lib/UI.DragDrop.lua +++ b/MY_!Base/src/lib/UI.DragDrop.lua @@ -3,8 +3,8 @@ -- @desc : 弹出菜单 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.DragDrop') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.FloatBar.lua b/MY_!Base/src/lib/UI.FloatBar.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.FloatBar.lua rename to MY_!Base/src/lib/UI.FloatBar.lua index 03a642fd2..f4a9ff901 100644 --- a/Boilerplate_!Base/src/lib/UI.FloatBar.lua +++ b/MY_!Base/src/lib/UI.FloatBar.lua @@ -3,8 +3,8 @@ -- @desc : 全局浮动条界面 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.FloatBar') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.FloatText.lua b/MY_!Base/src/lib/UI.FloatText.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.FloatText.lua rename to MY_!Base/src/lib/UI.FloatText.lua index 2debe8c7c..6c6647b80 100644 --- a/Boilerplate_!Base/src/lib/UI.FloatText.lua +++ b/MY_!Base/src/lib/UI.FloatText.lua @@ -3,8 +3,8 @@ -- @desc : 浮动文本 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.HandlePool') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.FontPicker.lua b/MY_!Base/src/lib/UI.FontPicker.lua similarity index 97% rename from Boilerplate_!Base/src/lib/UI.FontPicker.lua rename to MY_!Base/src/lib/UI.FontPicker.lua index e0dd8604f..21c707344 100644 --- a/Boilerplate_!Base/src/lib/UI.FontPicker.lua +++ b/MY_!Base/src/lib/UI.FontPicker.lua @@ -3,8 +3,8 @@ -- @desc : FontPicker -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.FontPicker') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.HandlePool.lua b/MY_!Base/src/lib/UI.HandlePool.lua similarity index 98% rename from Boilerplate_!Base/src/lib/UI.HandlePool.lua rename to MY_!Base/src/lib/UI.HandlePool.lua index 7f5c55058..4ea20d519 100644 --- a/Boilerplate_!Base/src/lib/UI.HandlePool.lua +++ b/MY_!Base/src/lib/UI.HandlePool.lua @@ -3,8 +3,8 @@ -- @desc : HandlePool -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.HandlePool') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.IconPicker.lua b/MY_!Base/src/lib/UI.IconPicker.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.IconPicker.lua rename to MY_!Base/src/lib/UI.IconPicker.lua index 6258a9a95..97673ab2f 100644 --- a/Boilerplate_!Base/src/lib/UI.IconPicker.lua +++ b/MY_!Base/src/lib/UI.IconPicker.lua @@ -3,8 +3,8 @@ -- @desc : IconPicker -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.IconPicker') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.ListEditor.lua b/MY_!Base/src/lib/UI.ListEditor.lua similarity index 98% rename from Boilerplate_!Base/src/lib/UI.ListEditor.lua rename to MY_!Base/src/lib/UI.ListEditor.lua index 444de34c0..3ba85c8bc 100644 --- a/Boilerplate_!Base/src/lib/UI.ListEditor.lua +++ b/MY_!Base/src/lib/UI.ListEditor.lua @@ -3,8 +3,8 @@ -- @desc : ListEditor -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.ListEditor') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.Notify.lua b/MY_!Base/src/lib/UI.Notify.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.Notify.lua rename to MY_!Base/src/lib/UI.Notify.lua index 2e1cd937f..ef33d4dde 100644 --- a/Boilerplate_!Base/src/lib/UI.Notify.lua +++ b/MY_!Base/src/lib/UI.Notify.lua @@ -6,8 +6,8 @@ -- @modifier : Emil Zhai (root@zhaiyiming.com) -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.Notify') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.PageSetModule.lua b/MY_!Base/src/lib/UI.PageSetModule.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.PageSetModule.lua rename to MY_!Base/src/lib/UI.PageSetModule.lua index ddeaaab35..6c630908d 100644 --- a/Boilerplate_!Base/src/lib/UI.PageSetModule.lua +++ b/MY_!Base/src/lib/UI.PageSetModule.lua @@ -3,8 +3,8 @@ -- @desc : IconPicker -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.PageSetModule') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.PopupMenu.lua b/MY_!Base/src/lib/UI.PopupMenu.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.PopupMenu.lua rename to MY_!Base/src/lib/UI.PopupMenu.lua index 7b7685043..59753418a 100644 --- a/Boilerplate_!Base/src/lib/UI.PopupMenu.lua +++ b/MY_!Base/src/lib/UI.PopupMenu.lua @@ -3,8 +3,8 @@ -- @desc : 弹出菜单 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.PopupMenu') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.Request.lua b/MY_!Base/src/lib/UI.Request.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.Request.lua rename to MY_!Base/src/lib/UI.Request.lua index d7f5a89bf..78853a31b 100644 --- a/Boilerplate_!Base/src/lib/UI.Request.lua +++ b/MY_!Base/src/lib/UI.Request.lua @@ -3,8 +3,8 @@ -- @desc : 请求处理弹框界面 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.Request') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.Shadows.lua b/MY_!Base/src/lib/UI.Shadows.lua similarity index 98% rename from Boilerplate_!Base/src/lib/UI.Shadows.lua rename to MY_!Base/src/lib/UI.Shadows.lua index 3745fa39b..7a3de60b5 100644 --- a/Boilerplate_!Base/src/lib/UI.Shadows.lua +++ b/MY_!Base/src/lib/UI.Shadows.lua @@ -3,8 +3,8 @@ -- @desc : 集中渲染阴影 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.Shadows') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.TextEditor.lua b/MY_!Base/src/lib/UI.TextEditor.lua similarity index 97% rename from Boilerplate_!Base/src/lib/UI.TextEditor.lua rename to MY_!Base/src/lib/UI.TextEditor.lua index a2d179904..20a35f1f1 100644 --- a/Boilerplate_!Base/src/lib/UI.TextEditor.lua +++ b/MY_!Base/src/lib/UI.TextEditor.lua @@ -3,8 +3,8 @@ -- @desc : TextEditor -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.TextEditor') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.UserInput.lua b/MY_!Base/src/lib/UI.UserInput.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.UserInput.lua rename to MY_!Base/src/lib/UI.UserInput.lua index f36b68b0d..c2719b59b 100644 --- a/Boilerplate_!Base/src/lib/UI.UserInput.lua +++ b/MY_!Base/src/lib/UI.UserInput.lua @@ -3,8 +3,8 @@ -- @desc : UserInput -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.UserInput') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.UserSettings.lua b/MY_!Base/src/lib/UI.UserSettings.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.UserSettings.lua rename to MY_!Base/src/lib/UI.UserSettings.lua index a225fe53b..b2981284f 100644 --- a/Boilerplate_!Base/src/lib/UI.UserSettings.lua +++ b/MY_!Base/src/lib/UI.UserSettings.lua @@ -3,8 +3,8 @@ -- @desc : 用户设置导入导出界面 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.UserSettings') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.Utils.lua b/MY_!Base/src/lib/UI.Utils.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.Utils.lua rename to MY_!Base/src/lib/UI.Utils.lua index 20f1bbbff..ca3deb59e 100644 --- a/Boilerplate_!Base/src/lib/UI.Utils.lua +++ b/MY_!Base/src/lib/UI.Utils.lua @@ -3,8 +3,8 @@ -- @desc : 界面工具库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI.Utils') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/UI.lua b/MY_!Base/src/lib/UI.lua similarity index 99% rename from Boilerplate_!Base/src/lib/UI.lua rename to MY_!Base/src/lib/UI.lua index 72ef7bd5a..d00ea2711 100644 --- a/Boilerplate_!Base/src/lib/UI.lua +++ b/MY_!Base/src/lib/UI.lua @@ -3,8 +3,8 @@ -- @desc : 界面库 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/UI') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Uuid.lua b/MY_!Base/src/lib/Uuid.lua similarity index 98% rename from Boilerplate_!Base/src/lib/Uuid.lua rename to MY_!Base/src/lib/Uuid.lua index 6764cabbc..cea148d60 100644 --- a/Boilerplate_!Base/src/lib/Uuid.lua +++ b/MY_!Base/src/lib/Uuid.lua @@ -3,8 +3,8 @@ -- @desc : UUID生成器 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Uuid') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/src/lib/Xml.lua b/MY_!Base/src/lib/Xml.lua similarity index 99% rename from Boilerplate_!Base/src/lib/Xml.lua rename to MY_!Base/src/lib/Xml.lua index 88fc9431d..d0d717268 100644 --- a/Boilerplate_!Base/src/lib/Xml.lua +++ b/MY_!Base/src/lib/Xml.lua @@ -8,8 +8,8 @@ -- local aXMLNode = X.XMLDecode(szXML: string) -- local szXML = X.XMLEncode(xml: aXMLNode | XMLNode) -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_!Base/lib/Xml') -------------------------------------------------------------------------------- diff --git a/Boilerplate_!Base/ui/Browser.ini b/MY_!Base/ui/Browser.ini similarity index 100% rename from Boilerplate_!Base/ui/Browser.ini rename to MY_!Base/ui/Browser.ini diff --git a/Boilerplate_!Base/ui/Dev_UIEditor.ini b/MY_!Base/ui/Dev_UIEditor.ini similarity index 100% rename from Boilerplate_!Base/ui/Dev_UIEditor.ini rename to MY_!Base/ui/Dev_UIEditor.ini diff --git a/Boilerplate_!Base/ui/DragDrop.ini b/MY_!Base/ui/DragDrop.ini similarity index 100% rename from Boilerplate_!Base/ui/DragDrop.ini rename to MY_!Base/ui/DragDrop.ini diff --git a/Boilerplate_!Base/ui/FloatBar.ini b/MY_!Base/ui/FloatBar.ini similarity index 100% rename from Boilerplate_!Base/ui/FloatBar.ini rename to MY_!Base/ui/FloatBar.ini diff --git a/MY_!Base/ui/MY_Bidding.ini b/MY_!Base/ui/MY_Bidding.ini new file mode 100644 index 000000000..3e7aa5b39 --- /dev/null +++ b/MY_!Base/ui/MY_Bidding.ini @@ -0,0 +1,1753 @@ +[MY_Bidding] +._WndType=WndFrame +._Parent=Normal +Left=400 +Top=200 +Width=565 +Height=495 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=565 +DragAreaHeight=45 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +ScriptFile=ui\Config\Default\CraftReadManagePanel.lua +ViewMutexKey= +IsCustomDragable=1 +ClassName=MY_BiddingBase +ItemCount=3 +Item_0=WndEdit_Name +Item_1=WndEdit_PriceMin +Item_2=WndEdit_PriceStep +EnableTabChangeFocus=1 + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_Bidding +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Wnd_Config] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=63 +Width=565 +Height=66 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Config] +._WndType=Handle +._Parent=Wnd_Config +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=565 +Height=66 + +[Handle_ConfigName] +._WndType=Handle +._Parent=Handle_Config +Left=21 +Top=10 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_ConfigName_Title] +._WndType=Text +._Parent=Handle_ConfigName +Left=0 +Top=0 +PosType=0 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=拍卖物品: +Width=81 +Height=22 + +[Handle_ConfigName_Value] +._WndType=Handle +._Parent=Handle_ConfigName +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_ConfigBiddingItem] +._WndType=Handle +._Parent=Handle_ConfigName_Value +HandleType=0 +FirstItemPosType=0 +Left=75 +Top=0 +PosType=0 +PixelScroll=0 + +[Text_ConfigBiddingItem] +._WndType=Text +._Parent=Handle_ConfigBiddingItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=25 +Top=0 +PosType=0 +FontScheme=162 +HAlign=0 +VAlign=0 +AutoEtc=0 +ShowAll=1 +OrgText=1 +FontColor= +$Text=亡体秘录十二篇 +Width=280 +Height=22 + +[Box_ConfigBiddingItem] +._WndType=Box +._Parent=Handle_ConfigBiddingItem +Left=0 +Top=0 +PosType=0 +IconID=245 +Width=20 +Height=20 + +[Text_ConfigBiddingName] +._WndType=Text +._Parent=Handle_ConfigName_Value +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=75 +Top=0 +PosType=0 +FontScheme=162 +HAlign=0 +VAlign=0 +AutoEtc=0 +ShowAll=1 +OrgText=1 +FontColor= +$Text=亡体秘录十二篇 +Width=313 +Height=22 + +[Handle_ConfigPriceMin] +._WndType=Handle +._Parent=Handle_Config +Left=21 +Top=40 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_ConfigPriceMin_Title] +._WndType=Text +._Parent=Handle_ConfigPriceMin +Left=0 +Top=0 +PosType=0 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=最低出价: +Width=74 +Height=22 + +[Handle_ConfigPriceMin_Value] +._WndType=Handle +._Parent=Handle_ConfigPriceMin +Left=75 +Top=0 +PosType=0 +HandleType=3 +Width=111 +Height=22 +RowSpacing=0 + +[Text_ConfigPriceMin_Value] +._WndType=Text +._Parent=Handle_ConfigPriceMin_Value +PosType=8 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=1000砖1000金 +Width=104 +Height=22 + +[Handle_ConfigPriceStep] +._WndType=Handle +._Parent=Handle_Config +Left=220 +Top=40 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_ConfigPriceStep_Title] +._WndType=Text +._Parent=Handle_ConfigPriceStep +Left=0 +Top=0 +PosType=0 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=最小加价: +Width=74 +Height=22 + +[Handle_ConfigPriceStep_Value] +._WndType=Handle +._Parent=Handle_ConfigPriceStep +Left=75 +Top=0 +PosType=0 +HandleType=3 +Width=111 +Height=22 +RowSpacing=0 + +[Text_ConfigPriceStep_Value] +._WndType=Text +._Parent=Handle_ConfigPriceStep_Value +PosType=8 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=5000金 +Width=104 +Height=22 + +[Handle_ConfigNumber] +._WndType=Handle +._Parent=Handle_Config +Left=419 +Top=40 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=160 +Height=22 + +[Text_ConfigNumber_Title] +._WndType=Text +._Parent=Handle_ConfigNumber +Left=0 +Top=0 +PosType=0 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=中标人数: +Width=81 +Height=22 + +[Text_ConfigNumber_Value] +._WndType=Text +._Parent=Handle_ConfigNumber +Left=81 +Top=0 +PosType=0 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=20 +Width=81 +Height=22 + +[WndEditBox_Name] +._WndType=WndWindow +._Parent=Wnd_Config +Left=92 +Top=7 +Width=313 +Height=27 + +[Handle_Edit_Name] +._WndType=Handle +._Parent=WndEditBox_Name +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=313 +Height=27 +EventID=2048 + +[Image_Default_1_1] +._WndType=Image +._Parent=Handle_Edit_Name +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=313 +Height=27 +ImageType=10 + +[WndEdit_Name] +._WndType=WndEdit +._Parent=WndEditBox_Name +Left=4 +Top=2 +Width=305 +Height=22 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=2 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black +PlaceholderAlpha=150 +PlaceholderLeft=4 +PlaceholderTop=1 +PlaceholderFontScheme=18 +PasteInfo=1 + +[WndEditBox_PriceMin] +._WndType=WndWindow +._Parent=Wnd_Config +Left=92 +Top=37 +Width=115 +Height=27 + +[Handle_Edit_PriceMin] +._WndType=Handle +._Parent=WndEditBox_PriceMin +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +EventID=2048 + +[Image_Default_1] +._WndType=Image +._Parent=Handle_Edit_PriceMin +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +ImageType=10 + +[WndEdit_PriceMin] +._WndType=WndEdit +._Parent=WndEditBox_PriceMin +Left=4 +Top=2 +Width=107 +Height=22 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=0 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black +PlaceholderAlpha=150 +PlaceholderLeft=4 +PlaceholderTop=1 +PlaceholderFontScheme=18 + +[WndEditBox_PriceStep] +._WndType=WndWindow +._Parent=Wnd_Config +Left=290 +Top=37 +Width=115 +Height=27 + +[Handle_Edit_PriceStep] +._WndType=Handle +._Parent=WndEditBox_PriceStep +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +EventID=2048 + +[Image_Default_1_0] +._WndType=Image +._Parent=Handle_Edit_PriceStep +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +ImageType=10 + +[WndEdit_PriceStep] +._WndType=WndEdit +._Parent=WndEditBox_PriceStep +Left=4 +Top=2 +Width=107 +Height=22 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=0 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black +PlaceholderAlpha=150 +PlaceholderLeft=4 +PlaceholderTop=1 +PlaceholderFontScheme=18 + +[WndCombo_Number] +._WndType=WndWindow +._Parent=Wnd_Config +Left=493 +Top=38 +Width=50 +Height=24 + +[Handle_Number] +._WndType=Handle +._Parent=WndCombo_Number +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=50 +Height=24 +PixelScroll=0 + +[Image_Number] +._WndType=Image +._Parent=Handle_Number +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=150 +Left=0 +Top=0 +PosType=0 +Width=50 +Height=24 +ImageType=11 + +[Text_Number] +._WndType=Text +._Parent=Handle_Number +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=7 +Top=0 +PosType=0 +Width=21 +Height=24 +FontScheme=162 +HAlign=0 +VAlign=1 +AutoEtc=1 +ShowAll=0 +OrgText=1 +$Text=20 +FontColor= + +[Btn_Number] +._WndType=WndButton +._Parent=WndCombo_Number +Left=27 +Top=3 +Width=20 +Height=20 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Handle_ButtonNumber] +._WndType=Handle +._Parent=Btn_Number +HandleType=0 +FirstItemPosType=0 +Left=-27 +Top=0 +PosType=0 +EventID=512 +Width=50 +Height=24 + +[Btn_Option] +._WndType=WndButton +._Parent=Wnd_Config +Left=522 +Top=10 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=22 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[WndButton_ConfigCancel] +._WndType=WndButton +._Parent=Wnd_Config +Frame=4 +Left=424 +Top=9 +Width=60 +Height=26 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ConfigCancel] +._WndType=Handle +._Parent=WndButton_ConfigCancel +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 + +[Text_ConfigCancel] +._WndType=Text +._Parent=Handle_ConfigCancel +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=取消 + +[WndButton_ConfigSubmit] +._WndType=WndButton +._Parent=Wnd_Config +Frame=4 +Left=487 +Top=9 +Width=60 +Height=26 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ConfigSubmit] +._WndType=Handle +._Parent=WndButton_ConfigSubmit +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 + +[Text_ConfigSubmit] +._WndType=Text +._Parent=Handle_ConfigSubmit +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=确定 + +[WndScroll_Bidding] +._WndType=WndScroll +._Parent=Wnd_Total +Left=17 +Top=133 +Width=543 +Height=270 +ScrollHandle=Handle_List +ScrollContainer= +VerScrollBar=Scroll_All +ScrollButtonUp=Btn_Up +ScrollButtonDown=Btn_Down + +[Handle_Bidding] +._WndType=Handle +._Parent=WndScroll_Bidding +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Bidding_BG] +._WndType=Image +._Parent=Handle_Bidding +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=528 +Height=270 + +[Image_Bidding_BG1] +._WndType=Image +._Parent=Handle_Bidding +Left=2 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=524 +Height=240 + +[Image_Bidding_Line1_0] +._WndType=Image +._Parent=Handle_Bidding +Left=2 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=524 +Height=3 + +[Handle_BiddingColumns] +._WndType=Handle +._Parent=Handle_Bidding +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=528 +Height=270 + +[Handle_BiddingColumnName] +._WndType=Handle +._Parent=Handle_BiddingColumns +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=199 +Height=30 +EventID=277 + +[Image_BiddingColumnName_Break] +._WndType=Image +._Parent=Handle_BiddingColumnName +Left=196 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=266 + +[Text_BiddingColumnName_Title] +._WndType=Text +._Parent=Handle_BiddingColumnName +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=名字 +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=170 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Handle_BiddingColumnPrice] +._WndType=Handle +._Parent=Handle_BiddingColumns +Left=200 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=160 +Height=30 +EventID=277 + +[Image_BiddingColumnPrice_Break] +._WndType=Image +._Parent=Handle_BiddingColumnPrice +Left=156 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=266 + +[Text_BiddingColumnPrice_Title] +._WndType=Text +._Parent=Handle_BiddingColumnPrice +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=出价 +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=160 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Handle_BiddingColumnTime] +._WndType=Handle +._Parent=Handle_BiddingColumns +Left=360 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=120 +Height=30 +EventID=277 + +[Image_BiddingColumnTime_Break] +._WndType=Image +._Parent=Handle_BiddingColumnTime +Left=116 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=266 + +[Text_BiddingColumnTime_Title] +._WndType=Text +._Parent=Handle_BiddingColumnTime +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=时间 +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Bidding +Left=0 +Top=30 +PosType=0 +HandleType=3 +Width=528 +Height=240 +PixelScroll=1 +RowSpacing=0 + +[Handle_Row] +._WndType=Handle +._Parent=Handle_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=528 +Height=30 +EventID=810 +Hover=Image_RowHover|Handle_RowItemDelete + +[Image_RowBg] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=75 +ImageType=0 +Width=522 +Height=30 + +[Image_RowHover] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=89 +ImageType=0 +Width=522 +Height=30 +LockShowAndHide=1 + +[Image_RowSpliter] +._WndType=Image +._Parent=Handle_Row +Left=2 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Width=524 +Height=3 +Frame=65 + +[Handle_RowItem] +._WndType=Handle +._Parent=Handle_Row +Left=0 +Top=0 +PosType=0 +HandleType=0 +HAlign=0 +VAlign=0 +Width=528 +Height=30 +FirstItemPosType=0 + +[Image_RowItemKungfu] +._WndType=Image +._Parent=Handle_RowItem +Left=10 +Top=3 +PosType=0 +Image=ui\Image\Icon\Skill_ChunYang21.UITex +Alpha=255 +Frame=0 +Width=24 +Height=24 + +[Text_RowItemName] +._WndType=Text +._Parent=Handle_RowItem +Left=40 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=十六夜红月@唯我独尊 +AutoEtc=1 +Width=150 +Height=30 +VAlign=1 +ShowAll=0 + +[Handle_RowItemPrice] +._WndType=Handle +._Parent=Handle_RowItem +Left=210 +Top=3 +PosType=0 +HandleType=3 +Width=140 +Height=22 +HAlign=1 +VAlign=1 +RowSpacing=0 + +[Text_New_0] +._WndType=Text +._Parent=Handle_RowItemPrice +PosType=8 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=3金砖3000金 +VAlign=1 +HAlign=1 +Width=140 +Height=22 + +[Text_RowItemTime] +._WndType=Text +._Parent=Handle_RowItem +Left=370 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +AutoEtc=1 +Width=99 +Height=30 +VAlign=1 +ShowAll=0 +$Text=02:20:39 +HAlign=1 + +[Text_RowItemP] +._WndType=Text +._Parent=Handle_RowItem +Left=498 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=P +Width=9 +Height=30 +VAlign=1 +FontColor=red1 + +[Handle_RowItemDelete] +._WndType=Handle +._Parent=Handle_Row +Left=489 +Top=3 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=26 +Height=26 +EventID=853 +Hover=Image_RowItemDeleteH +MBStatus=Image_RowItemDeleteD +LockShowAndHide=1 +$Tip=STR_DELETE +TipRichText=0 + +[Image_RowItemDelete] +._WndType=Image +._Parent=Handle_RowItemDelete +Left=0 +Top=0 +PosType=0 +Image=ui\Image\button\FrendNPartyButton.UITex +Alpha=255 +Frame=12 +Width=26 +Height=26 + +[Image_RowItemDeleteH] +._WndType=Image +._Parent=Handle_RowItemDelete +Left=0 +Top=0 +PosType=0 +Image=ui\Image\button\FrendNPartyButton.UITex +Alpha=255 +Frame=13 +Width=26 +Height=26 +LockShowAndHide=1 + +[Image_RowItemDeleteD] +._WndType=Image +._Parent=Handle_RowItemDelete +Left=0 +Top=0 +PosType=0 +Image=ui\Image\button\FrendNPartyButton.UITex +Alpha=255 +Frame=14 +Width=26 +Height=26 +LockShowAndHide=1 + +[Btn_Up] +._WndType=WndButton +._Parent=WndScroll_Bidding +Frame=34 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Down] +._WndType=WndButton +._Parent=WndScroll_Bidding +Frame=38 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Bidding +StepCount=30 +PageStepCount=10 +Left=525 +Top=30 +Width=20 +Height=478 +SlideBtn=Btn_ListScroll +Type=1 +AutoHideSlideButton=0 + +[Btn_ListScroll] +._WndType=WndButton +._Parent=Scroll_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=190 + +[Wnd_Bidding] +._WndType=WndWindow +._Parent=Wnd_Total +Left=21 +Top=420 +Width=523 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_Bidding] +._WndType=WndButton +._Parent=Wnd_Bidding +Frame=4 +Left=154 +Top=0 +Width=100 +Height=32 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ButtonBidding] +._WndType=Handle +._Parent=WndButton_Bidding +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +EventID=768 + +[Text_ButtonBidding] +._WndType=Text +._Parent=Handle_ButtonBidding +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=出价 + +[WndButton_BiddingP] +._WndType=WndButton +._Parent=Wnd_Bidding +Frame=4 +Left=260 +Top=0 +Width=100 +Height=32 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ButtonBiddingP] +._WndType=Handle +._Parent=WndButton_BiddingP +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +EventID=768 + +[Text_ButtonBiddingP] +._WndType=Text +._Parent=Handle_ButtonBiddingP +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=P + +[WndButton_Publish] +._WndType=WndButton +._Parent=Wnd_Bidding +Frame=4 +Left=399 +Top=3 +Width=60 +Height=26 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_Publish] +._WndType=Handle +._Parent=WndButton_Publish +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 + +[Text_Publish] +._WndType=Text +._Parent=Handle_Publish +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=发布 + +[WndButton_Finish] +._WndType=WndButton +._Parent=Wnd_Bidding +Frame=4 +Left=463 +Top=3 +Width=60 +Height=26 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_Finish] +._WndType=Handle +._Parent=WndButton_Finish +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 + +[Text_Finish] +._WndType=Text +._Parent=Handle_Finish +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=结束 + +[Wnd_CustomBidding] +._WndType=WndWindow +._Parent=Wnd_Total +Left=3 +Top=60 +Width=558 +Height=409 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +LockShowAndHide=1 + +[Handle_CustomBidding] +._WndType=Handle +._Parent=Wnd_CustomBidding +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Default_1_1_1_0] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0_0] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0_1] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0_1_0_0] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0_1_0_1] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_1_1_1_0_0_1_0_2] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=558 +Height=409 +ImageType=10 + +[Image_Default_Small1_1_1_0_0_1_0] +._WndType=Image +._Parent=Handle_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=137 +Top=150 +PosType=0 +Width=270 +Height=132 +ImageType=10 + +[WndButton_CustomBiddingDown] +._WndType=WndButton +._Parent=Wnd_CustomBidding +Frame=4 +Left=191 +Top=187 +Width=17 +Height=17 +NormalGroup=45 +MouseOverGroup=46 +MouseDownGroup=47 +DisableGroup=38 +Image=ui\Image\UICommon\UISettingImage01.UITex +Alpha=255 + +[Handle_CustomBiddingDown] +._WndType=Handle +._Parent=WndButton_CustomBiddingDown +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=26 +Height=26 + +[Text_CustomBiddingDown] +._WndType=Text +._Parent=Handle_CustomBiddingDown +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=26 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 + +[WndEditBox_CustomBidding] +._WndType=WndWindow +._Parent=Wnd_CustomBidding +Left=220 +Top=182 +Width=115 +Height=27 + +[Handle_Edit_CustomBidding] +._WndType=Handle +._Parent=WndEditBox_CustomBidding +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +EventID=2048 + +[Image_Default_1_2] +._WndType=Image +._Parent=Handle_Edit_CustomBidding +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=115 +Height=27 +ImageType=10 + +[WndEdit_CustomBidding] +._WndType=WndEdit +._Parent=WndEditBox_CustomBidding +Left=4 +Top=2 +Width=107 +Height=22 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=0 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black +PlaceholderAlpha=150 +PlaceholderLeft=4 +PlaceholderTop=1 +PlaceholderFontScheme=18 + +[WndButton_CustomBiddingUp] +._WndType=WndButton +._Parent=Wnd_CustomBidding +Frame=4 +Left=344 +Top=187 +Width=17 +Height=17 +NormalGroup=42 +MouseOverGroup=43 +MouseDownGroup=44 +DisableGroup=48 +Image=ui\Image\UICommon\UISettingImage01.UITex +Alpha=255 + +[Handle_CustomBiddingUp] +._WndType=Handle +._Parent=WndButton_CustomBiddingUp +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=26 +Height=26 + +[Text_CustomBiddingUp] +._WndType=Text +._Parent=Handle_CustomBiddingUp +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=26 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 + +[WndButton_CustomBiddingSure] +._WndType=WndButton +._Parent=Wnd_CustomBidding +Frame=4 +Left=176 +Top=225 +Width=100 +Height=32 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ButtonCustomBiddingSure] +._WndType=Handle +._Parent=WndButton_CustomBiddingSure +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +EventID=768 + +[Text_ButtonCustomBiddingSure] +._WndType=Text +._Parent=Handle_ButtonCustomBiddingSure +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=出价 + +[WndButton_CustomBiddingCancel] +._WndType=WndButton +._Parent=Wnd_CustomBidding +Frame=4 +Left=279 +Top=225 +Width=100 +Height=32 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Handle_ButtonCustomBiddingCancel] +._WndType=Handle +._Parent=WndButton_CustomBiddingCancel +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +EventID=768 + +[Text_ButtonCustomBiddingCancel] +._WndType=Text +._Parent=Handle_ButtonCustomBiddingCancel +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=32 +HAlign=1 +VAlign=1 +FontScheme=162 +ShowAll=0 +AutoEtc=1 +OrgText=1 +$Text=取消 + diff --git a/MY_!Base/ui/MY_NotifyIcon.ini b/MY_!Base/ui/MY_NotifyIcon.ini new file mode 100644 index 000000000..2ba077471 --- /dev/null +++ b/MY_!Base/ui/MY_NotifyIcon.ini @@ -0,0 +1,128 @@ +[MY_NotifyIcon] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=56 +Height=80 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Wnd_MY_NotifyIcon] +._WndType=WndWindow +._Parent=MY_NotifyIcon +Left=0 +Top=0 +Width=56 +Height=80 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +OrgTip=0 + +[WndSFX_MY_NotifyIcon] +._WndType=WndSFX +._Parent=Wnd_MY_NotifyIcon +Left=28 +Top=61 +Width=0 +Height=0 +SFXFile=data\source\other\特效\系统\SFX\其他\T_图标按钮01.Sfx +Loop=1 +Scale=2.000000 + +[WndSFX_MY_NotifyIcon1] +._WndType=WndSFX +._Parent=WndSFX_MY_NotifyIcon +Left=0 +Top=0 +Width=0 +Height=0 +SFXFile=data\source\other\特效\系统\SFX\其他\T_图标按钮01.Sfx +Loop=1 +Scale=2.000000 +LockShowAndHide=1 + +[Wnd_MY_NotifyIcon_Inner] +._WndType=WndWindow +._Parent=Wnd_MY_NotifyIcon +Left=0 +Top=35 +Width=56 +Height=56 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_MY_NotifyIcon] +._WndType=Handle +._Parent=Wnd_MY_NotifyIcon_Inner +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=56 +Height=56 +TipRichText=0 +OrgTip=1 +$Tip=茗伊消息中心 +EventID=277 +ShowTipType=0 + +[Image_MY_NotifyIcon] +._WndType=Image +._Parent=Handle_MY_NotifyIcon +Left=7 +Top=4 +PosType=0 +Image=ui\image\uicommon\plugin.uitex +Alpha=240 +Frame=6 +Width=44 +Height=44 + +[Handle_MY_NotifyIcon_Num] +._WndType=Handle +._Parent=Handle_MY_NotifyIcon +Left=31 +Top=-6 +PosType=0 +HandleType=0 +FirstItemPosType=0 +TipRichText=0 + +[Image_MY_NotifyIcon_Num] +._WndType=Image +._Parent=Handle_MY_NotifyIcon_Num +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Feedanimials.UITex +Alpha=255 +Frame=94 +Width=21 +Height=21 + +[Text_MY_NotifyIcon_Num] +._WndType=Text +._Parent=Handle_MY_NotifyIcon_Num +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=-1 +Alpha=255 +$Text=3 +HAlign=1 +VAlign=1 +OrgText=1 +FontScheme=228 +Width=20 +Height=20 +FontColor= + diff --git a/Boilerplate_!Base/ui/Notify.ini b/MY_!Base/ui/Notify.ini similarity index 93% rename from Boilerplate_!Base/ui/Notify.ini rename to MY_!Base/ui/Notify.ini index 4578ca023..b7aa41986 100644 --- a/Boilerplate_!Base/ui/Notify.ini +++ b/MY_!Base/ui/Notify.ini @@ -1,340 +1,340 @@ -[Notify] -._WndType=WndFrame -._Parent=Normal -BreatheWhenHide=1 -DisableBringToTop=0 -DragAreaHeight=50 -DragAreaLeft=0 -DragAreaTop=0 -DragAreaWidth=960 -DummyWnd=0 -Height=600 -IsCustomDragable=1 -Left=50 -MultiFrame=0 -Top=250 -ViewMutexKey= -Width=760 - -[WndScroll_Notify] -._WndType=WndScroll -._Parent=Notify -Height=520 -Left=20 -ScrollButtonDown=WndButton_NotifyDown -ScrollButtonUp=WndButton_NotifyUp -ScrollContainer= -ScrollHandle=Handle_Notifies -Top=50 -VerScrollBar=Scroll_Notify -Width=735 - -[Handle_ScrollNotify] -._WndType=Handle -._Parent=WndScroll_Notify -FirstItemPosType=0 -HandleType=0 -Height=520 -Left=0 -PosType=0 -Top=0 -Width=720 - -[Image_Notify] -._WndType=Image -._Parent=Handle_ScrollNotify -Alpha=255 -Frame=8 -Height=520 -Image=UI/Image/Minimap/Minimap2.UITex -Left=0 -PosType=0 -Top=0 -Width=720 - -[Handle_Notifies] -._WndType=Handle -._Parent=Handle_ScrollNotify -ControlShow=0 -EventId=515 -HandleType=3 -Height=520 -IgnoreInvisibleChild=1 -Left=0 -PixelScroll=1 -PosType=0 -RowSpacing=0 -Top=0 -Width=720 - -[Handle_Notify] -._WndType=Handle -._Parent=Handle_Notifies -ControlShow=0 -EventID=816 -FirstItemPosType=0 -HandleType=0 -Height=50 -Hover=Shadow_NotifyHover -PosType=8 -Width=720 - -[Shadow_NotifyHover] -._WndType=Shadow -._Parent=Handle_Notify -Alpha=120 -Height=50 -Left=0 -LockShowAndHide=1 -PosType=0 -ShadowColor=gray1 -Top=0 -Width=720 - -[Shadow_NotifySelect] -._WndType=Shadow -._Parent=Handle_Notify -Alpha=150 -Height=50 -Left=0 -LockShowAndHide=1 -PosType=0 -ShadowColor=gray1 -Top=0 -Width=720 - -[Handle_Notify_Msg] -._WndType=Handle -._Parent=Handle_Notify -ControlShow=0 -HAlign=0 -HandleType=3 -Height=42 -Left=9 -PixelScroll=1 -PosType=0 -RowSpacing=0 -Top=4 -VAlign=1 -Width=635 - -[Handle_Notify_View] -._WndType=Handle -._Parent=Handle_Notify -EventID=277 -FirstItemPosType=0 -HandleType=0 -Height=30 -Hover=Image_View_Hover -Left=649 -MBStatus=Image_View_Down -PosType=0 -Top=12 -Width=30 - -[Image_View] -._WndType=Image -._Parent=Handle_Notify_View -Alpha=255 -Frame=90 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -Left=0 -PosType=0 -Top=0 -Width=28 - -[Image_View_Hover] -._WndType=Image -._Parent=Handle_Notify_View -Alpha=255 -Frame=91 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -Left=0 -PosType=0 -Top=0 -Width=28 - -[Image_View_Down] -._WndType=Image -._Parent=Handle_Notify_View -Alpha=255 -Frame=92 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -Left=0 -LockShowAndHide=1 -PosType=0 -Top=0 -Width=28 - -[Handle_Notify_Dismiss] -._WndType=Handle -._Parent=Handle_Notify -Alpha=190 -EventID=277 -FirstItemPosType=0 -HandleType=0 -Height=30 -Hover=Image_Dismiss_Hover -Left=682 -MBStatus=Image_Dismiss_Down -PosType=0 -Top=12 -Width=30 - -[Image_Dismiss] -._WndType=Image -._Parent=Handle_Notify_Dismiss -Alpha=255 -Frame=86 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -ImageType=0 -Left=0 -PosType=0 -Top=0 -Width=28 - -[Image_Dismiss_Hover] -._WndType=Image -._Parent=Handle_Notify_Dismiss -Alpha=255 -Frame=87 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -Left=0 -LockShowAndHide=1 -PosType=0 -Top=0 -Width=28 - -[Image_Dismiss_Down] -._WndType=Image -._Parent=Handle_Notify_Dismiss -Alpha=255 -Frame=88 -Height=28 -Image=ui\Image\UICommon\FeedAnimials.UITex -Left=0 -LockShowAndHide=1 -PosType=0 -Top=0 -Width=28 - -[Image_Notify_Spliter] -._WndType=Image -._Parent=Handle_Notify -Alpha=255 -Frame=45 -Height=8 -Image=ui\image\uicommon\CommonPanel.UITex -Left=0 -PosType=0 -Top=44 -Width=720 - -[Image_Notify_Unread] -._WndType=Image -._Parent=Handle_Notify -Alpha=255 -Frame=94 -Height=12 -Image=ui\Image\UICommon\Feedanimials.UITex -Left=668 -PosType=0 -Top=9 -Width=12 - -[WndButton_NotifyUp] -._WndType=WndButton -._Parent=WndScroll_Notify -$Tip=Tip -CheckBox=0 -CheckOver=0 -DisableFrame=-1 -DisableGroup=49 -Down=0 -DummyWnd=0 -FollowMove=0,0 -FollowSize=0,0 -Frame=69 -GrayColor=0 -Height=0 -Image=ui\Image\UICommon\CommonPanel.UITex -Left=0 -MouseDownGroup=50 -MouseOverGroup=48 -Moveable=0 -NoOverSound=0 -NormalGroup=47 -Over=1 -OverFrame=0 -SendHoldMsg=0 -ShowTipType=0 -Top=0 -Trans=0 -Up=0 -Width=0 - -[WndButton_NotifyDown] -._WndType=WndButton -._Parent=WndScroll_Notify -$Tip=Tip -CheckBox=0 -CheckOver=0 -DisableFrame=-1 -DisableGroup=53 -Down=0 -DummyWnd=0 -FollowMove=0,0 -FollowSize=0,0 -Frame=69 -GrayColor=0 -Height=0 -Image=ui\Image\UICommon\CommonPanel.UITex -Left=0 -MouseDownGroup=46 -MouseOverGroup=52 -Moveable=0 -NoOverSound=0 -NormalGroup=51 -Over=1 -OverFrame=0 -SendHoldMsg=0 -ShowTipType=0 -Top=0 -Trans=0 -Up=0 -Width=0 - -[Scroll_Notify] -._WndType=WndNewScrollBar -._Parent=WndScroll_Notify -AutoHideSlideButton=0 -AutoResizeSlideButton=0 -Height=500 -Left=720 -PageStepCount=7 -SlideBtn=WndButton_Scroll_ChatLog -StepCount=0 -Top=0 -Type=1 -Width=15 - -[WndButton_Scroll_Notify] -._WndType=WndButton -._Parent=Scroll_Notify -Alpha=150 -DisableGroup=34 -Frame=-1 -Height=50 -Image=ui\Image\UICommon\CommonPanel.UITex -Left=0 -MouseDownGroup=33 -MouseOverGroup=32 -NormalGroup=31 -Top=0 -Width=15 - +[Notify] +._WndType=WndFrame +._Parent=Normal +BreatheWhenHide=1 +DisableBringToTop=0 +DragAreaHeight=50 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=960 +DummyWnd=0 +Height=600 +IsCustomDragable=1 +Left=50 +MultiFrame=0 +Top=250 +ViewMutexKey= +Width=760 + +[WndScroll_Notify] +._WndType=WndScroll +._Parent=Notify +Height=520 +Left=20 +ScrollButtonDown=WndButton_NotifyDown +ScrollButtonUp=WndButton_NotifyUp +ScrollContainer= +ScrollHandle=Handle_Notifies +Top=50 +VerScrollBar=Scroll_Notify +Width=735 + +[Handle_ScrollNotify] +._WndType=Handle +._Parent=WndScroll_Notify +FirstItemPosType=0 +HandleType=0 +Height=520 +Left=0 +PosType=0 +Top=0 +Width=720 + +[Image_Notify] +._WndType=Image +._Parent=Handle_ScrollNotify +Alpha=255 +Frame=8 +Height=520 +Image=UI/Image/Minimap/Minimap2.UITex +Left=0 +PosType=0 +Top=0 +Width=720 + +[Handle_Notifies] +._WndType=Handle +._Parent=Handle_ScrollNotify +ControlShow=0 +EventId=515 +HandleType=3 +Height=520 +IgnoreInvisibleChild=1 +Left=0 +PixelScroll=1 +PosType=0 +RowSpacing=0 +Top=0 +Width=720 + +[Handle_Notify] +._WndType=Handle +._Parent=Handle_Notifies +ControlShow=0 +EventID=816 +FirstItemPosType=0 +HandleType=0 +Height=50 +Hover=Shadow_NotifyHover +PosType=8 +Width=720 + +[Shadow_NotifyHover] +._WndType=Shadow +._Parent=Handle_Notify +Alpha=120 +Height=50 +Left=0 +LockShowAndHide=1 +PosType=0 +ShadowColor=gray1 +Top=0 +Width=720 + +[Shadow_NotifySelect] +._WndType=Shadow +._Parent=Handle_Notify +Alpha=150 +Height=50 +Left=0 +LockShowAndHide=1 +PosType=0 +ShadowColor=gray1 +Top=0 +Width=720 + +[Handle_Notify_Msg] +._WndType=Handle +._Parent=Handle_Notify +ControlShow=0 +HAlign=0 +HandleType=3 +Height=42 +Left=9 +PixelScroll=1 +PosType=0 +RowSpacing=0 +Top=4 +VAlign=1 +Width=635 + +[Handle_Notify_View] +._WndType=Handle +._Parent=Handle_Notify +EventID=277 +FirstItemPosType=0 +HandleType=0 +Height=30 +Hover=Image_View_Hover +Left=649 +MBStatus=Image_View_Down +PosType=0 +Top=12 +Width=30 + +[Image_View] +._WndType=Image +._Parent=Handle_Notify_View +Alpha=255 +Frame=90 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +Left=0 +PosType=0 +Top=0 +Width=28 + +[Image_View_Hover] +._WndType=Image +._Parent=Handle_Notify_View +Alpha=255 +Frame=91 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +Left=0 +PosType=0 +Top=0 +Width=28 + +[Image_View_Down] +._WndType=Image +._Parent=Handle_Notify_View +Alpha=255 +Frame=92 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +Left=0 +LockShowAndHide=1 +PosType=0 +Top=0 +Width=28 + +[Handle_Notify_Dismiss] +._WndType=Handle +._Parent=Handle_Notify +Alpha=190 +EventID=277 +FirstItemPosType=0 +HandleType=0 +Height=30 +Hover=Image_Dismiss_Hover +Left=682 +MBStatus=Image_Dismiss_Down +PosType=0 +Top=12 +Width=30 + +[Image_Dismiss] +._WndType=Image +._Parent=Handle_Notify_Dismiss +Alpha=255 +Frame=86 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +ImageType=0 +Left=0 +PosType=0 +Top=0 +Width=28 + +[Image_Dismiss_Hover] +._WndType=Image +._Parent=Handle_Notify_Dismiss +Alpha=255 +Frame=87 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +Left=0 +LockShowAndHide=1 +PosType=0 +Top=0 +Width=28 + +[Image_Dismiss_Down] +._WndType=Image +._Parent=Handle_Notify_Dismiss +Alpha=255 +Frame=88 +Height=28 +Image=ui\Image\UICommon\FeedAnimials.UITex +Left=0 +LockShowAndHide=1 +PosType=0 +Top=0 +Width=28 + +[Image_Notify_Spliter] +._WndType=Image +._Parent=Handle_Notify +Alpha=255 +Frame=45 +Height=8 +Image=ui\image\uicommon\CommonPanel.UITex +Left=0 +PosType=0 +Top=44 +Width=720 + +[Image_Notify_Unread] +._WndType=Image +._Parent=Handle_Notify +Alpha=255 +Frame=94 +Height=12 +Image=ui\Image\UICommon\Feedanimials.UITex +Left=668 +PosType=0 +Top=9 +Width=12 + +[WndButton_NotifyUp] +._WndType=WndButton +._Parent=WndScroll_Notify +$Tip=Tip +CheckBox=0 +CheckOver=0 +DisableFrame=-1 +DisableGroup=49 +Down=0 +DummyWnd=0 +FollowMove=0,0 +FollowSize=0,0 +Frame=69 +GrayColor=0 +Height=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Left=0 +MouseDownGroup=50 +MouseOverGroup=48 +Moveable=0 +NoOverSound=0 +NormalGroup=47 +Over=1 +OverFrame=0 +SendHoldMsg=0 +ShowTipType=0 +Top=0 +Trans=0 +Up=0 +Width=0 + +[WndButton_NotifyDown] +._WndType=WndButton +._Parent=WndScroll_Notify +$Tip=Tip +CheckBox=0 +CheckOver=0 +DisableFrame=-1 +DisableGroup=53 +Down=0 +DummyWnd=0 +FollowMove=0,0 +FollowSize=0,0 +Frame=69 +GrayColor=0 +Height=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Left=0 +MouseDownGroup=46 +MouseOverGroup=52 +Moveable=0 +NoOverSound=0 +NormalGroup=51 +Over=1 +OverFrame=0 +SendHoldMsg=0 +ShowTipType=0 +Top=0 +Trans=0 +Up=0 +Width=0 + +[Scroll_Notify] +._WndType=WndNewScrollBar +._Parent=WndScroll_Notify +AutoHideSlideButton=0 +AutoResizeSlideButton=0 +Height=500 +Left=720 +PageStepCount=7 +SlideBtn=WndButton_Scroll_ChatLog +StepCount=0 +Top=0 +Type=1 +Width=15 + +[WndButton_Scroll_Notify] +._WndType=WndButton +._Parent=Scroll_Notify +Alpha=150 +DisableGroup=34 +Frame=-1 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Left=0 +MouseDownGroup=33 +MouseOverGroup=32 +NormalGroup=31 +Top=0 +Width=15 + diff --git a/Boilerplate_!Base/ui/NotifyFloatBar.ini b/MY_!Base/ui/NotifyFloatBar.ini similarity index 100% rename from Boilerplate_!Base/ui/NotifyFloatBar.ini rename to MY_!Base/ui/NotifyFloatBar.ini diff --git a/Boilerplate_!Base/ui/OutputTableTip.ini b/MY_!Base/ui/OutputTableTip.ini similarity index 100% rename from Boilerplate_!Base/ui/OutputTableTip.ini rename to MY_!Base/ui/OutputTableTip.ini diff --git a/Boilerplate_!Base/ui/PageSetModule.ini b/MY_!Base/ui/PageSetModule.ini similarity index 100% rename from Boilerplate_!Base/ui/PageSetModule.ini rename to MY_!Base/ui/PageSetModule.ini diff --git a/Boilerplate_!Base/ui/PopupMenu.ini b/MY_!Base/ui/PopupMenu.ini similarity index 100% rename from Boilerplate_!Base/ui/PopupMenu.ini rename to MY_!Base/ui/PopupMenu.ini diff --git a/Boilerplate_!Base/ui/PopupMenu.tpl.ini b/MY_!Base/ui/PopupMenu.tpl.ini similarity index 100% rename from Boilerplate_!Base/ui/PopupMenu.tpl.ini rename to MY_!Base/ui/PopupMenu.tpl.ini diff --git a/Boilerplate_!Base/ui/Request.ini b/MY_!Base/ui/Request.ini similarity index 100% rename from Boilerplate_!Base/ui/Request.ini rename to MY_!Base/ui/Request.ini diff --git a/Boilerplate_!Base/ui/Shadows.ini b/MY_!Base/ui/Shadows.ini similarity index 100% rename from Boilerplate_!Base/ui/Shadows.ini rename to MY_!Base/ui/Shadows.ini diff --git a/Boilerplate_!Base/ui/components/Shadow.ini b/MY_!Base/ui/components/Shadow.ini similarity index 100% rename from Boilerplate_!Base/ui/components/Shadow.ini rename to MY_!Base/ui/components/Shadow.ini diff --git a/Boilerplate_!Base/ui/components/WndAutocomplete.ini b/MY_!Base/ui/components/WndAutocomplete.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndAutocomplete.ini rename to MY_!Base/ui/components/WndAutocomplete.ini diff --git a/Boilerplate_!Base/ui/components/WndButton.ini b/MY_!Base/ui/components/WndButton.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndButton.ini rename to MY_!Base/ui/components/WndButton.ini diff --git a/Boilerplate_!Base/ui/components/WndButtonBox.ini b/MY_!Base/ui/components/WndButtonBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndButtonBox.ini rename to MY_!Base/ui/components/WndButtonBox.ini diff --git a/Boilerplate_!Base/ui/components/WndCheckBox.ini b/MY_!Base/ui/components/WndCheckBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndCheckBox.ini rename to MY_!Base/ui/components/WndCheckBox.ini diff --git a/Boilerplate_!Base/ui/components/WndComboBox.ini b/MY_!Base/ui/components/WndComboBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndComboBox.ini rename to MY_!Base/ui/components/WndComboBox.ini diff --git a/Boilerplate_!Base/ui/components/WndContainer.ini b/MY_!Base/ui/components/WndContainer.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndContainer.ini rename to MY_!Base/ui/components/WndContainer.ini diff --git a/Boilerplate_!Base/ui/components/WndDummyWrapper.ini b/MY_!Base/ui/components/WndDummyWrapper.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndDummyWrapper.ini rename to MY_!Base/ui/components/WndDummyWrapper.ini diff --git a/Boilerplate_!Base/ui/components/WndEditBox.ini b/MY_!Base/ui/components/WndEditBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndEditBox.ini rename to MY_!Base/ui/components/WndEditBox.ini diff --git a/Boilerplate_!Base/ui/components/WndEditComboBox.ini b/MY_!Base/ui/components/WndEditComboBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndEditComboBox.ini rename to MY_!Base/ui/components/WndEditComboBox.ini diff --git a/Boilerplate_!Base/ui/components/WndFrame.ini b/MY_!Base/ui/components/WndFrame.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndFrame.ini rename to MY_!Base/ui/components/WndFrame.ini diff --git a/Boilerplate_!Base/ui/components/WndFrameEmpty.ini b/MY_!Base/ui/components/WndFrameEmpty.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndFrameEmpty.ini rename to MY_!Base/ui/components/WndFrameEmpty.ini diff --git a/Boilerplate_!Base/ui/components/WndListBox.ini b/MY_!Base/ui/components/WndListBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndListBox.ini rename to MY_!Base/ui/components/WndListBox.ini diff --git a/Boilerplate_!Base/ui/components/WndPageSet.ini b/MY_!Base/ui/components/WndPageSet.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndPageSet.ini rename to MY_!Base/ui/components/WndPageSet.ini diff --git a/Boilerplate_!Base/ui/components/WndRadioBox.ini b/MY_!Base/ui/components/WndRadioBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndRadioBox.ini rename to MY_!Base/ui/components/WndRadioBox.ini diff --git a/Boilerplate_!Base/ui/components/WndScrollHandleBox.ini b/MY_!Base/ui/components/WndScrollHandleBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndScrollHandleBox.ini rename to MY_!Base/ui/components/WndScrollHandleBox.ini diff --git a/Boilerplate_!Base/ui/components/WndScrollWindowBox.ini b/MY_!Base/ui/components/WndScrollWindowBox.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndScrollWindowBox.ini rename to MY_!Base/ui/components/WndScrollWindowBox.ini diff --git a/Boilerplate_!Base/ui/components/WndSlider.ini b/MY_!Base/ui/components/WndSlider.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndSlider.ini rename to MY_!Base/ui/components/WndSlider.ini diff --git a/Boilerplate_!Base/ui/components/WndTab.ini b/MY_!Base/ui/components/WndTab.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndTab.ini rename to MY_!Base/ui/components/WndTab.ini diff --git a/Boilerplate_!Base/ui/components/WndTable.ini b/MY_!Base/ui/components/WndTable.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndTable.ini rename to MY_!Base/ui/components/WndTable.ini diff --git a/Boilerplate_!Base/ui/components/WndTabs.ini b/MY_!Base/ui/components/WndTabs.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndTabs.ini rename to MY_!Base/ui/components/WndTabs.ini diff --git a/Boilerplate_!Base/ui/components/WndWebCef.ini b/MY_!Base/ui/components/WndWebCef.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndWebCef.ini rename to MY_!Base/ui/components/WndWebCef.ini diff --git a/Boilerplate_!Base/ui/components/WndWebPage.ini b/MY_!Base/ui/components/WndWebPage.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndWebPage.ini rename to MY_!Base/ui/components/WndWebPage.ini diff --git a/Boilerplate_!Base/ui/components/WndWindow.ini b/MY_!Base/ui/components/WndWindow.ini similarity index 100% rename from Boilerplate_!Base/ui/components/WndWindow.ini rename to MY_!Base/ui/components/WndWindow.ini diff --git a/MY_BagEx/info.ini b/MY_BagEx/info.ini new file mode 100644 index 000000000..18f1fcf71 --- /dev/null +++ b/MY_BagEx/info.ini @@ -0,0 +1,23 @@ +[MY_BagEx] +name=背包助手 +desc=仓库背包对比整理等功能 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_BagEx_GenericFilters.lua +lua_1=src\MY_BagEx.lua +lua_2=src\MY_BagEx_Bag.lua +lua_3=src\MY_BagEx_BagSort.lua +lua_4=src\MY_BagEx_BagSplit.lua +lua_5=src\MY_BagEx_BagStack.lua +lua_6=src\MY_BagEx_BagLock.lua +lua_7=src\MY_BagEx_BagNewItem.lua +lua_8=src\MY_BagEx_Bank.lua +lua_9=src\MY_BagEx_BankSort.lua +lua_10=src\MY_BagEx_BankStack.lua +lua_11=src\MY_BagEx_BankLock.lua +lua_12=src\MY_BagEx_GuildBank.lua +lua_13=src\MY_BagEx_GuildBankSort.lua +lua_14=src\MY_BagEx_GuildBankStack.lua +lua_15=src\PS.lua +package=MY diff --git a/MY_BagEx/info.ini.zh_TW b/MY_BagEx/info.ini.zh_TW new file mode 100644 index 000000000..64cfa02ee --- /dev/null +++ b/MY_BagEx/info.ini.zh_TW @@ -0,0 +1,23 @@ +[MY_BagEx] +name=鑳屽寘鍔╂墜 +desc=鍊夊韩鑳屽寘灏嶆瘮鏁寸悊绛夊姛鑳 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_BagEx_GenericFilters.lua +lua_1=src\MY_BagEx.lua +lua_2=src\MY_BagEx_Bag.lua +lua_3=src\MY_BagEx_BagSort.lua +lua_4=src\MY_BagEx_BagSplit.lua +lua_5=src\MY_BagEx_BagStack.lua +lua_6=src\MY_BagEx_BagLock.lua +lua_7=src\MY_BagEx_BagNewItem.lua +lua_8=src\MY_BagEx_Bank.lua +lua_9=src\MY_BagEx_BankSort.lua +lua_10=src\MY_BagEx_BankStack.lua +lua_11=src\MY_BagEx_BankLock.lua +lua_12=src\MY_BagEx_GuildBank.lua +lua_13=src\MY_BagEx_GuildBankSort.lua +lua_14=src\MY_BagEx_GuildBankStack.lua +lua_15=src\PS.lua +package=MY diff --git a/MY_BagEx/lang/default.jx3dat b/MY_BagEx/lang/default.jx3dat new file mode 100644 index 000000000..c5f4dbc73 --- /dev/null +++ b/MY_BagEx/lang/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['MOSAICS_CHAR'] = '*', +} diff --git a/MY_BagEx/lang/zhcn.jx3dat b/MY_BagEx/lang/zhcn.jx3dat new file mode 100644 index 000000000..37c7b9c04 --- /dev/null +++ b/MY_BagEx/lang/zhcn.jx3dat @@ -0,0 +1,109 @@ +return { + ['MY_BagEx'] = '背包助手', + + -- MY_BagEx_GenericFilters.lua -- + ['Search'] = '搜索', + ['Time Limited'] = '限时', + ['Generic package searcher and filters'] = '背包、仓库搜索与对比', + ['Compare with bag'] = '对比背包', + + -- MY_BagEx_BagNewItem.lua -- + ['Bag new item'] = '背包新物品', + ['Put new bag item to bottom'] = '背包新获得物品放置到最后面', + ['Avoid locked bag box'] = '避开锁定的背包格子', + ['Ignore exist item'] = '不移动已存在的堆叠物品', + + -- MY_BagEx_Bag.lua -- + ['Bag'] = '背包', + ['Sort need confirm'] = '整理需要二次确认', + ['Lock cells data'] = '锁定格子位置', + ['Bag package sort and stack'] = '背包整理、堆叠、锁定', + ['Need confirm'] = '需要二次确认', + + -- MY_BagEx_BagSort.lua -- + ['Bag contains book only, use official sort please!'] = '整理失败,背包包含书包,请使用官方整理功能!', + ['Bag contains material only, use official sort please!'] = '整理失败,背包包含矿石包,请使用官方整理功能!', + ['Bag panel closed, sort exited!'] = '背包界面已关闭,停止整理!', + ['Cannot find item temp position, bag is full, sort exited!'] = '无法获取临时位置,背包可能已满,停止整理!', + ['Bag item changed, sort finished, result may not be perfect!'] = '背包物品不一致,整理结束,结果可能不完美!', + ['Put new item in bag detected, sort exited!'] = '背包放入新物品,停止整理!', + ['Sort'] = '整理', + ['Press shift for random, right click to import and export'] = '按住SHIFT随机打乱,点击右键导入导出', + ['Sure to start bag sort?'] = '确认要进行背包物品整理吗?', + ['Export blueprint'] = '导出布局', + ['Import blueprint'] = '导入布局', + ['Please input blueprint'] = '请输入布局数据', + ['Invalid blueprint data'] = '布局数据解析失败', + + -- MY_BagEx_BagSplit.lua -- + ['Split'] = '拆分', + ['Split stacked items (hotkey SHIFT+LClick)'] = '拆分叠加的物品(快捷方式:Shift+鼠标左键)', + + -- MY_BagEx_BagStack.lua -- + ['Bag panel closed, stack exited!'] = '背包界面已关闭,停止堆叠!', + ['Put new item in bag detected, stack exited!'] = '背包放入新物品,停止堆叠!', + ['Stack'] = '堆叠', + ['Sure to start bag stack?'] = '确认要进行背包物品堆叠吗?', + + -- MY_BagEx_BagLock.lua -- + ['Lock'] = '锁定', + + -- MY_BagEx_Bank.lua -- + ['Bank'] = '仓库', + ['Sort need confirm'] = '整理需要二次确认', + ['Lock cells data'] = '锁定格子位置', + ['Bank package sort and stack'] = '仓库整理、堆叠、锁定', + ['Need confirm'] = '需要二次确认', + + -- MY_BagEx_BankSort.lua -- + ['Please unlock mibao first.'] = '请先解除密保锁。', + ['Bank contains book only, use official sort please!'] = '整理失败,仓库包含书包,请使用官方整理功能!', + ['Bank contains material only, use official sort please!'] = '整理失败,仓库包含矿石包,请使用官方整理功能!', + ['Bank panel closed, sort exited!'] = '仓库界面已关闭,停止整理!', + ['Cannot find item temp position, bank is full, sort exited!'] = '无法获取临时位置,仓库可能已满,停止整理!', + ['Bank item changed, sort finished, result may not be perfect!'] = '仓库物品不一致,整理结束,结果可能不完美!', + ['Put new item in bank detected, sort exited!'] = '仓库放入新物品,停止整理!', + ['Sort'] = '整理', + ['Press shift for random, right click to import and export'] = '按住SHIFT随机打乱,点击右键导入导出', + ['Sure to start bank sort?'] = '确认要进行仓库物品整理吗?', + ['Export blueprint'] = '导出布局', + ['Import blueprint'] = '导入布局', + ['Please input blueprint'] = '请输入布局数据', + ['Invalid blueprint data'] = '布局数据解析失败', + + -- MY_BagEx_BankStack.lua -- + ['Please unlock mibao first.'] = '请先解除密保锁。', + ['Bank panel closed, stack exited!'] = '仓库界面已关闭,停止堆叠!', + ['Put new item in bank detected, stack exited!'] = '仓库放入新物品,停止堆叠!', + ['Stack'] = '堆叠', + ['Sure to start bank stack?'] = '确认要进行仓库物品堆叠吗?', + + -- MY_BagEx_BankLock.lua -- + ['Lock'] = '锁定', + + -- MY_BagEx_GuildBank.lua -- + ['GuildBank'] = '帮会仓库', + ['Sort need confirm'] = '整理需要二次确认', + ['Guild package sort and stack'] = '帮会仓库整理与堆叠', + ['Need confirm'] = '需要二次确认', + + -- MY_BagEx_GuildBankSort.lua -- + ['Please unlock mibao first.'] = '请先解除密保锁。', + ['Guild box closed or page changed, sort exited!'] = '帮会仓库已关闭或页码发生变化,停止整理!', + ['Cannot find item temp position, guild bank is full, sort exited!'] = '无法获取临时位置,仓库可能已满,停止整理!', + ['Guild bank item changed, sort finished, result may not be perfect!'] = '仓库物品不一致,整理结束,结果可能不完美!', + ['Put item in guild detected, sort exited!'] = '帮会仓库放入新物品,停止整理!', + ['Unknown exception occurred, sort exited!'] = '发生未知错误,停止整理!', + ['Sort'] = '整理', + ['Press shift for random, right click to import and export'] = '按住SHIFT随机打乱,点击右键导入导出', + ['Sure to start guild bank sort?'] = '确认要进行帮会仓库物品整理吗?', + ['Export blueprint'] = '导出布局', + ['Import blueprint'] = '导入布局', + ['Please input blueprint'] = '请输入布局数据', + ['Invalid blueprint data'] = '布局数据解析失败', + + -- MY_BagEx_GuildBankStack.lua -- + ['Stack'] = '堆叠', + ['Please unlock mibao first.'] = '请先解除密保锁。', + ['Sure to start guild bank stack?'] = '确认要进行帮会仓库物品堆叠吗?', +} diff --git a/MY_BagEx/lang/zhtw.jx3dat b/MY_BagEx/lang/zhtw.jx3dat new file mode 100644 index 000000000..fe464e5dc --- /dev/null +++ b/MY_BagEx/lang/zhtw.jx3dat @@ -0,0 +1,109 @@ +return { + ['MY_BagEx'] = '鑳屽寘鍔╂墜', + + -- MY_BagEx_GenericFilters.lua -- + ['Search'] = '鎼滅储', + ['Time Limited'] = '闄愭檪', + ['Generic package searcher and filters'] = '鑳屽寘銆佸夊韩鎼滅储鑸囧皪姣', + ['Compare with bag'] = '灏嶆瘮鑳屽寘', + + -- MY_BagEx_BagNewItem.lua -- + ['Bag new item'] = '鑳屽寘鏂扮墿鍝', + ['Put new bag item to bottom'] = '鑳屽寘鏂扮嵅寰楃墿鍝佹斁缃埌鏈寰岄潰', + ['Avoid locked bag box'] = '閬块枊閹栧畾鐨勮儗鍖呮牸瀛', + ['Ignore exist item'] = '涓嶇Щ鍕曞凡瀛樺湪鐨勫爢鐤婄墿鍝', + + -- MY_BagEx_Bag.lua -- + ['Bag'] = '鑳屽寘', + ['Sort need confirm'] = '鏁寸悊闇瑕佷簩娆$⒑瑾', + ['Lock cells data'] = '閹栧畾鏍煎瓙浣嶇疆', + ['Bag package sort and stack'] = '鑳屽寘鏁寸悊銆佸爢鐤娿侀帠瀹', + ['Need confirm'] = '闇瑕佷簩娆$⒑瑾', + + -- MY_BagEx_BagSort.lua -- + ['Bag contains book only, use official sort please!'] = '鏁寸悊澶辨晽锛岃儗鍖呭寘鍚浉鍖咃紝璜嬩娇鐢ㄥ畼鏂规暣鐞嗗姛鑳斤紒', + ['Bag contains material only, use official sort please!'] = '鏁寸悊澶辨晽锛岃儗鍖呭寘鍚う鐭冲寘锛岃珛浣跨敤瀹樻柟鏁寸悊鍔熻兘锛', + ['Bag panel closed, sort exited!'] = '鑳屽寘鐣岄潰宸查棞闁夛紝鍋滄鏁寸悊锛', + ['Cannot find item temp position, bag is full, sort exited!'] = '鐒℃硶鐛插彇鑷ㄦ檪浣嶇疆锛岃儗鍖呭彲鑳藉凡婊匡紝鍋滄鏁寸悊锛', + ['Bag item changed, sort finished, result may not be perfect!'] = '鑳屽寘鐗╁搧涓嶄竴鑷达紝鏁寸悊绲愭潫锛岀祼鏋滃彲鑳戒笉瀹岀編锛', + ['Put new item in bag detected, sort exited!'] = '鑳屽寘鏀惧叆鏂扮墿鍝侊紝鍋滄鏁寸悊锛', + ['Sort'] = '鏁寸悊', + ['Press shift for random, right click to import and export'] = '鎸変綇SHIFT闅ㄦ鎵撲簜锛岄粸鎿婂彸閸靛皫鍏ュ皫鍑', + ['Sure to start bag sort?'] = '纰鸿獚瑕侀茶鑳屽寘鐗╁搧鏁寸悊鍡庯紵', + ['Export blueprint'] = '灏庡嚭浣堝眬', + ['Import blueprint'] = '灏庡叆浣堝眬', + ['Please input blueprint'] = '璜嬭几鍏ヤ綀灞鏁告摎', + ['Invalid blueprint data'] = '浣堝眬鏁告摎瑙f瀽澶辨晽', + + -- MY_BagEx_BagSplit.lua -- + ['Split'] = '鎷嗗垎', + ['Split stacked items (hotkey SHIFT+LClick)'] = '鎷嗗垎鐤婂姞鐨勭墿鍝侊紙蹇嵎鏂瑰紡锛歋hift+婊戦紶宸﹂嵉锛', + + -- MY_BagEx_BagStack.lua -- + ['Bag panel closed, stack exited!'] = '鑳屽寘鐣岄潰宸查棞闁夛紝鍋滄鍫嗙枈锛', + ['Put new item in bag detected, stack exited!'] = '鑳屽寘鏀惧叆鏂扮墿鍝侊紝鍋滄鍫嗙枈锛', + ['Stack'] = '鍫嗙枈', + ['Sure to start bag stack?'] = '纰鸿獚瑕侀茶鑳屽寘鐗╁搧鍫嗙枈鍡庯紵', + + -- MY_BagEx_BagLock.lua -- + ['Lock'] = '閹栧畾', + + -- MY_BagEx_Bank.lua -- + ['Bank'] = '鍊夊韩', + ['Sort need confirm'] = '鏁寸悊闇瑕佷簩娆$⒑瑾', + ['Lock cells data'] = '閹栧畾鏍煎瓙浣嶇疆', + ['Bank package sort and stack'] = '鍊夊韩鏁寸悊銆佸爢鐤娿侀帠瀹', + ['Need confirm'] = '闇瑕佷簩娆$⒑瑾', + + -- MY_BagEx_BankSort.lua -- + ['Please unlock mibao first.'] = '璜嬪厛瑙i櫎瀵嗕繚閹栥', + ['Bank contains book only, use official sort please!'] = '鏁寸悊澶辨晽锛屽夊韩鍖呭惈鏇稿寘锛岃珛浣跨敤瀹樻柟鏁寸悊鍔熻兘锛', + ['Bank contains material only, use official sort please!'] = '鏁寸悊澶辨晽锛屽夊韩鍖呭惈绀︾煶鍖咃紝璜嬩娇鐢ㄥ畼鏂规暣鐞嗗姛鑳斤紒', + ['Bank panel closed, sort exited!'] = '鍊夊韩鐣岄潰宸查棞闁夛紝鍋滄鏁寸悊锛', + ['Cannot find item temp position, bank is full, sort exited!'] = '鐒℃硶鐛插彇鑷ㄦ檪浣嶇疆锛屽夊韩鍙兘宸叉豢锛屽仠姝㈡暣鐞嗭紒', + ['Bank item changed, sort finished, result may not be perfect!'] = '鍊夊韩鐗╁搧涓嶄竴鑷达紝鏁寸悊绲愭潫锛岀祼鏋滃彲鑳戒笉瀹岀編锛', + ['Put new item in bank detected, sort exited!'] = '鍊夊韩鏀惧叆鏂扮墿鍝侊紝鍋滄鏁寸悊锛', + ['Sort'] = '鏁寸悊', + ['Press shift for random, right click to import and export'] = '鎸変綇SHIFT闅ㄦ鎵撲簜锛岄粸鎿婂彸閸靛皫鍏ュ皫鍑', + ['Sure to start bank sort?'] = '纰鸿獚瑕侀茶鍊夊韩鐗╁搧鏁寸悊鍡庯紵', + ['Export blueprint'] = '灏庡嚭浣堝眬', + ['Import blueprint'] = '灏庡叆浣堝眬', + ['Please input blueprint'] = '璜嬭几鍏ヤ綀灞鏁告摎', + ['Invalid blueprint data'] = '浣堝眬鏁告摎瑙f瀽澶辨晽', + + -- MY_BagEx_BankStack.lua -- + ['Please unlock mibao first.'] = '璜嬪厛瑙i櫎瀵嗕繚閹栥', + ['Bank panel closed, stack exited!'] = '鍊夊韩鐣岄潰宸查棞闁夛紝鍋滄鍫嗙枈锛', + ['Put new item in bank detected, stack exited!'] = '鍊夊韩鏀惧叆鏂扮墿鍝侊紝鍋滄鍫嗙枈锛', + ['Stack'] = '鍫嗙枈', + ['Sure to start bank stack?'] = '纰鸿獚瑕侀茶鍊夊韩鐗╁搧鍫嗙枈鍡庯紵', + + -- MY_BagEx_BankLock.lua -- + ['Lock'] = '閹栧畾', + + -- MY_BagEx_GuildBank.lua -- + ['GuildBank'] = '骞渻鍊夊韩', + ['Sort need confirm'] = '鏁寸悊闇瑕佷簩娆$⒑瑾', + ['Guild package sort and stack'] = '骞渻鍊夊韩鏁寸悊鑸囧爢鐤', + ['Need confirm'] = '闇瑕佷簩娆$⒑瑾', + + -- MY_BagEx_GuildBankSort.lua -- + ['Please unlock mibao first.'] = '璜嬪厛瑙i櫎瀵嗕繚閹栥', + ['Guild box closed or page changed, sort exited!'] = '骞渻鍊夊韩宸查棞闁夋垨闋佺⒓鐧肩敓璁婂寲锛屽仠姝㈡暣鐞嗭紒', + ['Cannot find item temp position, guild bank is full, sort exited!'] = '鐒℃硶鐛插彇鑷ㄦ檪浣嶇疆锛屽夊韩鍙兘宸叉豢锛屽仠姝㈡暣鐞嗭紒', + ['Guild bank item changed, sort finished, result may not be perfect!'] = '鍊夊韩鐗╁搧涓嶄竴鑷达紝鏁寸悊绲愭潫锛岀祼鏋滃彲鑳戒笉瀹岀編锛', + ['Put item in guild detected, sort exited!'] = '骞渻鍊夊韩鏀惧叆鏂扮墿鍝侊紝鍋滄鏁寸悊锛', + ['Unknown exception occurred, sort exited!'] = '鐧肩敓鏈煡閷锛屽仠姝㈡暣鐞嗭紒', + ['Sort'] = '鏁寸悊', + ['Press shift for random, right click to import and export'] = '鎸変綇SHIFT闅ㄦ鎵撲簜锛岄粸鎿婂彸閸靛皫鍏ュ皫鍑', + ['Sure to start guild bank sort?'] = '纰鸿獚瑕侀茶骞渻鍊夊韩鐗╁搧鏁寸悊鍡庯紵', + ['Export blueprint'] = '灏庡嚭浣堝眬', + ['Import blueprint'] = '灏庡叆浣堝眬', + ['Please input blueprint'] = '璜嬭几鍏ヤ綀灞鏁告摎', + ['Invalid blueprint data'] = '浣堝眬鏁告摎瑙f瀽澶辨晽', + + -- MY_BagEx_GuildBankStack.lua -- + ['Stack'] = '鍫嗙枈', + ['Please unlock mibao first.'] = '璜嬪厛瑙i櫎瀵嗕繚閹栥', + ['Sure to start guild bank stack?'] = '纰鸿獚瑕侀茶骞渻鍊夊韩鐗╁搧鍫嗙枈鍡庯紵', +} diff --git a/MY_BagEx/src/MY_BagEx.lua b/MY_BagEx/src/MY_BagEx.lua new file mode 100644 index 000000000..4f325f276 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx.lua @@ -0,0 +1,260 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包整理 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = { + -- 物品排序顺序 + aGenre = { + [ITEM_GENRE.TASK_ITEM] = 1, + [ITEM_GENRE.EQUIPMENT] = 2, + [ITEM_GENRE.BOOK] = 3, + [ITEM_GENRE.POTION] = 4, + [ITEM_GENRE.MATERIAL] = 5, + }, + aSub = { + [EQUIPMENT_SUB.HORSE] = 1, + [EQUIPMENT_SUB.PACKAGE] = 2, + [EQUIPMENT_SUB.MELEE_WEAPON] = 3, + [EQUIPMENT_SUB.RANGE_WEAPON] = 4, + }, +} + +local ITEM_DESC_LIST_SCHEMA = X.Schema.Collection(X.Schema.OneOf( + X.Schema.Record({ + dwTabType = X.Schema.Number, + dwTabIndex = X.Schema.Number, + nBookID = X.Schema.Number, + nStackNum = X.Schema.Number, + nCurrentDurability = X.Schema.Number, + bBind = X.Schema.Boolean, + }, false), + X.Schema.Record({}, false) +)) + +function D.GetItemDesc(kItem) + if not kItem then + return X.CONSTANT.EMPTY_TABLE + end + return { + dwTabType = kItem.dwTabType, + dwTabIndex = kItem.dwIndex, + nBookID = kItem.nBookID, + nGenre = kItem.nGenre, + nSub = kItem.nSub, + nDetail = kItem.nDetail, + nQuality = kItem.nQuality, + bCanStack = kItem.bCanStack, + nStackNum = kItem.nStackNum, + nCurrentDurability = kItem.nCurrentDurability, + bBind = kItem.bBind, + nExpireTime = kItem.GetLeftExistTime() == 0 and 0 or (GetCurrentTime() + kItem.GetLeftExistTime()), + } +end + +function D.IsSameItemDesc(a, b, bIgnoreExtendProps) + if X.IsEmpty(a) and X.IsEmpty(b) then + return true + end + if X.IsEmpty(a) or X.IsEmpty(b) then + return false + end + if a.dwTabType ~= b.dwTabType or a.dwTabIndex ~= b.dwTabIndex then + return false + end + if a.nGenre == ITEM_GENRE.BOOK and a.nBookID ~= b.nBookID then + return false + end + if not bIgnoreExtendProps then + if a.bCanStack and a.nStackNum ~= b.nStackNum then + return false + end + if a.nExpireTime ~= b.nExpireTime then + return false + end + end + if a.bBind ~= b.bBind then + return false + end + return true +end + +function D.CanItemDescStack(a, b) + if X.IsEmpty(a) or X.IsEmpty(b) then + return false + end + if a.dwTabType ~= b.dwTabType or a.dwTabIndex ~= b.dwTabIndex or a.bBind ~= b.bBind then + return false + end + if a.nGenre == ITEM_GENRE.BOOK and a.nBookID ~= b.nBookID then + return false + end + return a.bCanStack +end + +-- 背包整理格子排序函数 +function D.ItemDescSorter(a, b) + -- 空白格子靠后 + if X.IsEmpty(a) then + return false + end + if X.IsEmpty(b) then + return true + end + -- 限时物品放后面 + local bExpireTimeA = a.nExpireTime ~= 0 + local bExpireTimeB = b.nExpireTime ~= 0 + if bExpireTimeA ~= bExpireTimeB then + if bExpireTimeA then + return false + end + if bExpireTimeB then + return true + end + end + -- 类型不同按类型排序 + local nGenreA = D.aGenre[a.nGenre] or (100 + a.nGenre) + local nGenreB = D.aGenre[b.nGenre] or (100 + b.nGenre) + if nGenreA ~= nGenreB then + return nGenreA < nGenreB + end + -- 装备类比较 + if a.nGenre == ITEM_GENRE.EQUIPMENT then + local nSubA = D.aSub[a.nSub] or (100 + a.nSub) + local nSubB = D.aSub[b.nSub] or (100 + b.nSub) + -- 按装备类型排序 + if nSubA ~= nSubB then + return nSubA > nSubB + end + -- 武器按照类型排列 + if a.nSub == EQUIPMENT_SUB.MELEE_WEAPON or a.nSub == EQUIPMENT_SUB.RANGE_WEAPON then + if a.nDetail ~= b.nDetail then + return a.nDetail < b.nDetail + end + end + -- 包裹容量大的排在前面 + if b.nSub == EQUIPMENT_SUB.PACKAGE then + if a.nCurrentDurability ~= b.nCurrentDurability then + return a.nCurrentDurability > b.nCurrentDurability + end + end + end + -- 处理品质比较 + if a.nQuality ~= b.nQuality then + return a.nQuality > b.nQuality + end + -- 按照物品表下标排序 + if a.dwTabType ~= b.dwTabType then + return a.dwTabType < b.dwTabType + end + if a.dwTabIndex ~= b.dwTabIndex then + return a.dwTabIndex < b.dwTabIndex + end + if a.nGenre == ITEM_GENRE.BOOK and a.nBookID ~= b.nBookID then + return a.nBookID < b.nBookID + end + -- 相同限时物品先消失的放前面 + local nExpireTimeA = a.nExpireTime == 0 and math.huge or a.nExpireTime + local nExpireTimeB = b.nExpireTime == 0 and math.huge or b.nExpireTime + if not X.IsEquals(nExpireTimeA, nExpireTimeB) then + return nExpireTimeA < nExpireTimeB + end + -- 按堆叠数量排序 + if b.bCanStack then + return a.nStackNum > b.nStackNum + end + return false +end + +function D.EncodeItemDescList(aItemDesc) + local aList = {} + for nIndex, tDesc in ipairs(aItemDesc) do + -- 仅保留自定义属性 + aList[nIndex] = { + dwTabType = tDesc.dwTabType, + dwTabIndex = tDesc.dwTabIndex, + nBookID = tDesc.nBookID, + nStackNum = tDesc.nStackNum, + nCurrentDurability = tDesc.nCurrentDurability, + bBind = tDesc.bBind, + } + end + return X.CompressLUAData(aList) +end + +function D.DecodeItemDescList(szBin) + local aList = X.DecompressLUAData(szBin) + local errs = X.Schema.CheckSchema(aList, ITEM_DESC_LIST_SCHEMA) + if not errs then + local aItemDesc = {} + for nIndex, tItem in ipairs(aList) do + local kItemInfo = GetItemInfo(tItem.dwTabType, tItem.dwTabIndex) + if kItemInfo then + aItemDesc[nIndex] = { + dwTabType = tItem.dwTabType, + dwTabIndex = tItem.dwTabIndex, + nBookID = tItem.nBookID, + nStackNum = tItem.nStackNum, + nCurrentDurability = tItem.nCurrentDurability, + bBind = tItem.bBind, + -- 从 ItemInfo 中恢复公有属性 + nGenre = kItemInfo.nGenre, + nSub = kItemInfo.nSub, + nDetail = kItemInfo.nDetail, + nQuality = kItemInfo.nQuality, + bCanStack = kItemInfo.bCanStack, + nExpireTime = 0, + } + else + aItemDesc[nIndex] = {} + end + end + return aItemDesc + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx', + exports = { + { + fields = { + GetItemDesc = D.GetItemDesc, + IsSameItemDesc = D.IsSameItemDesc, + CanItemDescStack = D.CanItemDescStack, + ItemDescSorter = D.ItemDescSorter, + EncodeItemDescList = D.EncodeItemDescList, + DecodeItemDescList = D.DecodeItemDescList, + }, + }, + }, +} +MY_BagEx = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_Bag.lua b/MY_BagEx/src/MY_BagEx_Bag.lua new file mode 100644 index 000000000..6ed34bf0a --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_Bag.lua @@ -0,0 +1,288 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包基础逻辑 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_Bag' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_Bag' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_BagEx_Bag', { remake = true }) +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag'], + _L['Bag package sort and stack'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + szRestriction = 'MY_BagEx_Bag', + }, + bConfirm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag'], + _L['Sort need confirm'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + szRestriction = 'MY_BagEx_Bag', + }, + tLock = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag'], + _L['Lock cells data'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + szRestriction = 'MY_BagEx_Bag', + }, +}) +local D = {} + +function D.IsEnabled() + return O.bEnable and not X.IsInInventoryPackageLimitedMap() and not X.IsRestricted('MY_BagEx_Bag') +end + +function D.ShowItemShadow(frame, dwBox, dwX, bEditLock) + for _, szPath in ipairs({ + 'Handle_Bag_Compact/Mode_' .. dwBox .. '_' .. dwX .. '/' .. dwBox .. '_' .. dwX, + 'Handle_Bag_Normal/Handle_Bag' .. dwBox .. '/Handle_Bag_Content' .. dwBox .. '/Mode_' .. dwX .. '/' .. dwBox .. '_' .. dwX + }) do + local box = frame:Lookup('', szPath) + if box then + local szKey = dwBox .. '_' .. dwX + local sha = box:GetParent():Lookup('Shadow_MY_BagEx') + if not sha then + sha = X.UI(box:GetParent()):Append('Shadow', { name = 'Shadow_MY_BagEx', w = 0, h = 0 }):Raw() + sha:SetSize(box:GetSize()) + sha:SetRelPos(box:GetRelPos()) + sha:SetAbsPos(box:GetAbsPos()) + end + sha:Show() + if O.tLock[szKey] then + sha:SetAlpha(128) + sha:SetColorRGB(0, 0, 0) + else + sha:SetAlpha(50) + sha:SetColorRGB(255, 255, 255) + end + if bEditLock then + sha.OnItemLButtonClick = function() + local tLock = O.tLock + tLock[szKey] = not tLock[szKey] or nil + if tLock[szKey] then + sha:SetAlpha(128) + sha:SetColorRGB(0, 0, 0) + else + sha:SetAlpha(50) + sha:SetColorRGB(255, 255, 255) + end + O.tLock = tLock + end + else + sha.OnItemLButtonClick = nil + end + end + end +end + +function D.ShowAllItemShadow(bEditLock) + local frame = Station.Lookup('Normal/BigBagPanel') + if not frame then + return + end + -- 遮罩背包列表 + local h = frame:Lookup('', 'Handle_BagList') + if h then + local sha = h:Lookup('Shadow_MY_BagEx') + if not sha then + sha = X.UI(h):Append('Shadow', { name = 'Shadow_MY_BagEx', w = 0, h = 0 }):Raw() + sha:SetColorRGB(255, 255, 255) + sha:SetAlpha(0) + sha:SetSize(h:GetSize()) + sha:SetRelPos(0, 0) + sha:SetAbsPos(h:GetAbsPos()) + end + sha:Show() + end + -- 遮罩背包物品 + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + D.ShowItemShadow(frame, dwBox, dwX, bEditLock) + end + end +end + +function D.HideItemShadow(frame, dwBox, dwX) + for _, szPath in ipairs({ + 'Handle_Bag_Compact/Mode_' .. dwBox .. '_' .. dwX .. '/' .. dwBox .. '_' .. dwX, + 'Handle_Bag_Normal/Handle_Bag' .. dwBox .. '/Handle_Bag_Content' .. dwBox .. '/Mode_' .. dwX .. '/' .. dwBox .. '_' .. dwX + }) do + local box = frame:Lookup('', szPath) + if box then + local sha = box:GetParent():Lookup('Shadow_MY_BagEx') + if sha then + sha:Hide() + end + end + end +end + +function D.HideAllItemShadow() + local frame = Station.Lookup('Normal/BigBagPanel') + if not frame then + return + end + -- 遮罩背包列表 + local h = frame:Lookup('', 'Handle_BagList') + if h then + local sha = h:Lookup('Shadow_MY_BagEx') + if sha then + sha:Hide() + end + end + -- 遮罩背包物品 + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + D.HideItemShadow(frame, dwBox, dwX) + end + end +end + +function D.IsItemBoxLocked(dwBox, dwX) + local szKey = dwBox .. '_' .. dwX + return O.tLock[szKey] or false +end + +-- 检测冲突 +function D.CheckConflict(bRestore) + if not bRestore and D.IsEnabled() then + -- 隐藏冲突的系统按钮 + for _, szPath in ipairs({ + 'Normal/BigBagPanel/Btn_CU', + 'Normal/BigBagPanel/Btn_Split', + 'Normal/BigBagPanel/Btn_Stack', + 'Normal/BigBagPanel/Btn_LockSort', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_CU', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_Split', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_Stack', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_LockSort', + }) do + local el = Station.Lookup(szPath) + if el then + el:Hide() + end + end + else + -- 恢复冲突的系统按钮 + for _, szPath in ipairs({ + 'Normal/BigBagPanel/Btn_CU', + 'Normal/BigBagPanel/Btn_Split', + 'Normal/BigBagPanel/Btn_Stack', + 'Normal/BigBagPanel/Btn_LockSort', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_CU', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_Split', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_Stack', + 'Normal/BigBagPanel/WndContainer_Btn/Btn_LockSort', + }) do + local el = Station.Lookup(szPath) + if el then + el:Show() + end + end + end +end + +function D.OnEnableChange() + D.CheckConflict() + MY_BagEx_BagSort.CheckInjection() + MY_BagEx_BagSplit.CheckInjection() + MY_BagEx_BagStack.CheckInjection() + MY_BagEx_BagLock.CheckInjection() +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + if not X.IsRestricted('MY_BagEx_Bag') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Bag package sort and stack'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.OnEnableChange() + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Need confirm'], + checked = O.bConfirm, + onCheck = function(bChecked) + O.bConfirm = bChecked + end, + autoEnable = function() return O.bEnable end, + }):AutoWidth():Width() + 5 + nX = nPaddingX + nY = nY + nLH + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_Bag', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + ShowItemShadow = D.ShowItemShadow, + ShowAllItemShadow = D.ShowAllItemShadow, + HideItemShadow = D.HideItemShadow, + HideAllItemShadow = D.HideAllItemShadow, + IsItemBoxLocked = D.IsItemBoxLocked, + IsEnabled = D.IsEnabled, + }, + }, + { + fields = { + 'bConfirm', + }, + root = O, + }, + }, +} +MY_BagEx_Bag = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_BagEx_Bag', function() D.CheckConflict() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_Bag', function() D.CheckConflict() end) +X.RegisterReload('MY_BagEx_Bag', function() D.CheckConflict(true) end) +X.RegisterEvent('LOADING_ENDING', 'MY_BagEx_Bag', function() D.OnEnableChange() end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BagLock.lua b/MY_BagEx/src/MY_BagEx_BagLock.lua new file mode 100644 index 000000000..b29af9eb6 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BagLock.lua @@ -0,0 +1,109 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包锁定 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BagLock' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BagLock' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +-- 检测堆叠按纽 +function D.CheckInjection(bRemoveInjection) + local hFrame = Station.Lookup('Normal/BigBagPanel') + if not hFrame then + return + end + local hInjectRoot = hFrame:Lookup('WndContainer_Btn') or hFrame + if not bRemoveInjection and MY_BagEx_Bag.IsEnabled() then + -- 植入堆叠按纽 + local hBtnRef = hInjectRoot:Lookup('Btn_MY_Stack') + local btnNew = hInjectRoot:Lookup('Btn_MY_Lock') + if not hBtnRef then + return + end + local nX = hBtnRef:GetRelX() + hBtnRef:GetW() + 3 + local nY = hBtnRef:GetRelY() + local nH = hBtnRef:GetH() + if not btnNew then + local bEdit = false + btnNew = X.UI(hInjectRoot) + :Append('WndButton', { + name = 'Btn_MY_Lock', + w = 'auto', h = nH, + text = _L['Lock'], + onClick = function() + bEdit = not bEdit + if bEdit then + MY_BagEx_Bag.ShowAllItemShadow(true) + else + MY_BagEx_Bag.HideAllItemShadow() + end + end, + }) + :Raw() + end + if not btnNew then + return + end + btnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagLock__Injection', function() + if not btnNew then + return + end + btnNew:Enable(not arg0) + end) + else + -- 移除堆叠按纽 + X.UI(hInjectRoot:Lookup('Btn_MY_Lock')):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagLock__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BagLock', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BagLock = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('SCROLL_UPDATE_LIST', 'MY_BagEx_BagLock', function() + if (arg0 == 'Handle_Bag_Compact' or arg0 == 'Handle_Bag_Normal') + and arg1 == 'BigBagPanel' then + D.CheckInjection() + end +end) +X.RegisterUserSettingsInit('MY_BagEx_BagLock', function() D.CheckInjection() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_BagLock', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_BagLock', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BagNewItem.lua b/MY_BagEx/src/MY_BagEx_BagNewItem.lua new file mode 100644 index 000000000..cdb97908c --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BagNewItem.lua @@ -0,0 +1,212 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包新物品 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BagNewItem' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BagNewItem' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + bNewToBottom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag new item'], + _L['Put new bag item to bottom'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAvoidLock = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag new item'], + _L['Avoid locked bag box'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bIgnoreNewStackItem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bag new item'], + _L['Ignore exist item'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} +local INVENTORY_CACHE = {} +local BAG_ITEM_CACHE = {} +local EQUIP_ITEM_CACHE = {} +local NEW_ITEM_FLAG_TIME = {} +local EXCHANGE_BOX_TIME = {} + +function D.ShowNewItemFlag(dwBox, dwX) + local frame = Station.Lookup('Normal/BigBagPanel') + if not frame then + return + end + for _, szPath in ipairs({ + 'Handle_Bag_Compact/Mode_' .. dwBox .. '_' .. dwX .. '/' .. dwBox .. '_' .. dwX, + 'Handle_Bag_Normal/Handle_Bag' .. dwBox .. '/Handle_Bag_Content' .. dwBox .. '/Mode_' .. dwX .. '/' .. dwBox .. '_' .. dwX + }) do + local box = frame:Lookup('', szPath) + if box then + box:SetObjectInUse(true) + end + end +end + +function D.CreateBagItemCache() + BAG_ITEM_CACHE = {} + X.IterInventoryItem(X.CONSTANT.INVENTORY_TYPE.PACKAGE, function(kItem, dwBox, dwX) + if kItem then + INVENTORY_CACHE[dwBox .. '_' .. dwX] = { + szKey = X.GetItemKey(kItem), + nStackNum = (kItem.bCanStack and kItem.nStackNum or 1), + } + BAG_ITEM_CACHE[kItem.dwID] = kItem.bCanStack and kItem.nStackNum or 1 + end + end) + EQUIP_ITEM_CACHE = {} + X.IterInventoryItem(X.CONSTANT.INVENTORY_TYPE.EQUIP, function(kItem, dwBox, dwX) + if kItem then + EQUIP_ITEM_CACHE[kItem.dwID] = kItem.bCanStack and kItem.nStackNum or 1 + end + end) +end + +function D.OnBagItemUpdate(dwBox, dwX) + local me = X.GetClientPlayer() + local kItem = X.GetInventoryItem(me, dwBox, dwX) + if kItem then + local szItemKey = X.GetItemKey(kItem) + local nStackNum = kItem.bCanStack and kItem.nStackNum or 1 + local tInventoryItemInfo = INVENTORY_CACHE[dwBox .. '_' .. dwX] + local bNewItem = (not BAG_ITEM_CACHE[kItem.dwID]) and (not tInventoryItemInfo or tInventoryItemInfo.szKey ~= szItemKey) + local bFromEquip = EQUIP_ITEM_CACHE[kItem.dwID] + local bNewStack = (BAG_ITEM_CACHE[kItem.dwID] and BAG_ITEM_CACHE[kItem.dwID] ~= nStackNum) + or (tInventoryItemInfo and tInventoryItemInfo.szItemKey == szItemKey and tInventoryItemInfo.nStackNum ~= nStackNum) + if (not bNewItem and (not bNewStack or O.bIgnoreNewStackItem)) or bFromEquip then + local bNewFlag = NEW_ITEM_FLAG_TIME[kItem.dwID] and NEW_ITEM_FLAG_TIME[kItem.dwID] > GetCurrentTime() + if bNewFlag or bNewStack or bFromEquip then + D.ShowNewItemFlag(dwBox, dwX) + end + elseif O.bNewToBottom then + local dwExcBox, dwExcX + for _, dwIterBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwIterX = 0, X.GetInventoryBoxSize(dwIterBox) - 1 do + if ( + ( + not X.GetInventoryItem(me, dwIterBox, dwIterX) + and ((EXCHANGE_BOX_TIME[dwIterBox .. ',' .. dwIterX] or 0) < GetCurrentTime()) + ) + or (dwIterBox == dwBox and dwIterX == dwX) + ) + and ( + not MY_BagEx_Bag.IsItemBoxLocked(dwIterBox, dwIterX) + or not O.bAvoidLock + ) then + dwExcBox, dwExcX = dwIterBox, dwIterX + end + end + end + if dwExcBox and dwExcX and (dwExcBox ~= dwBox or dwExcX ~= dwX) then + EXCHANGE_BOX_TIME[dwExcBox .. ',' .. dwExcX] = GetCurrentTime() + 1 -- 保证一秒内不同时交换两个物品到同一个格子导致失败 + NEW_ITEM_FLAG_TIME[kItem.dwID] = GetCurrentTime() + 5 -- 五秒内始终认为该物品为新物品 + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BagNewItem', 'ExchangeItem: ' .. dwBox .. ',' .. dwX .. ' <-> ' .. dwExcBox .. ',' .. dwExcX, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwExcBox, dwExcX) + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BagNewItem', 'NotExchangeItem: ' .. dwBox .. ',' .. dwX, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.ShowNewItemFlag(dwBox, dwX) + end + end + end + D.CreateBagItemCache() +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Put new bag item to bottom'], + checked = O.bNewToBottom, + onCheck = function(bChecked) + O.bNewToBottom = bChecked + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Avoid locked bag box'], + checked = O.bAvoidLock, + onCheck = function(bChecked) + O.bAvoidLock = bChecked + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Ignore exist item'], + checked = O.bIgnoreNewStackItem, + onCheck = function(bChecked) + O.bIgnoreNewStackItem = bChecked + end, + }):AutoWidth():Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BagNewItem', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_BagEx_BagNewItem = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('BAG_ITEM_UPDATE', 'MY_BagEx_BagNewItem', function() + local dwBox, dwX, bNew = arg0, arg1, arg2 + D.OnBagItemUpdate(dwBox, dwX) +end) + +X.RegisterInit('MY_BagEx_BagNewItem', function() + D.CreateBagItemCache() +end) + +X.RegisterFrameDestroy('BigBagPanel', 'MY_BagEx_BagNewItem', function() + NEW_ITEM_FLAG_TIME = {} +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BagSort.lua b/MY_BagEx/src/MY_BagEx_BagSort.lua new file mode 100644 index 000000000..e298ec6b0 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BagSort.lua @@ -0,0 +1,355 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包整理 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BagSort' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BagSort' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate(bRandom, bExportBlueprint, aBlueprint) + local hFrame = Station.Lookup('Normal/BigBagPanel') + if not hFrame then + return + end + local szState = 'Idle' + -- 加载格子列表 + local me, aItemDesc, nItemCount, aBoxPos = X.GetClientPlayer(), {}, 0, {} + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + local dwGenre = me.GetContainType(dwBox) + if dwGenre == ITEM_GENRE.BOOK then + X.OutputSystemAnnounceMessage(_L['Bag contains book only, use official sort please!'], X.CONSTANT.MSG_THEME.ERROR) + return + end + if dwGenre == ITEM_GENRE.MATERIAL then + X.OutputSystemAnnounceMessage(_L['Bag contains material only, use official sort please!'], X.CONSTANT.MSG_THEME.ERROR) + return + end + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local kItem = X.GetInventoryItem(me, dwBox, dwX) + local tDesc = MY_BagEx.GetItemDesc(kItem) + if not X.IsEmpty(tDesc) then + nItemCount = nItemCount + 1 + end + table.insert(aItemDesc, tDesc) + table.insert(aBoxPos, { dwBox = dwBox, dwX = dwX }) + end + end + -- 导出布局 + if bExportBlueprint then + X.UI.OpenTextEditor(MY_BagEx.EncodeItemDescList(aItemDesc)) + return + end + -- 没物品不需要操作 + if nItemCount == 0 then + return + end + -- 导入布局 + if aBlueprint then + for nIndex, tDesc in ipairs(aItemDesc) do + aItemDesc[nIndex] = aBlueprint[nIndex] or MY_BagEx.GetItemDesc() + end + else + -- 避开锁定格子 + local aMovableItemDesc = {} + for nIndex, tDesc in ipairs(aItemDesc) do + local tPos = aBoxPos[nIndex] + if not MY_BagEx_Bag.IsItemBoxLocked(tPos.dwBox, tPos.dwX) then + table.insert(aMovableItemDesc, tDesc) + end + end + -- 排序格子列表 + if bRandom then + for nIndex = 1, #aMovableItemDesc do + local nExcIndex = X.Random(1, #aMovableItemDesc) + if nIndex ~= nExcIndex then + aMovableItemDesc[nIndex], aMovableItemDesc[nExcIndex] = aMovableItemDesc[nExcIndex], aMovableItemDesc[nIndex] + end + end + else + table.sort(aMovableItemDesc, MY_BagEx.ItemDescSorter) + end + -- 合成避开锁定格子后的排序结果 + for nIndex, _ in X.ipairs_r(aItemDesc) do + local tPos = aBoxPos[nIndex] + if not MY_BagEx_Bag.IsItemBoxLocked(tPos.dwBox, tPos.dwX) then + aItemDesc[nIndex] = table.remove(aMovableItemDesc) + end + end + end + -- 结束清理环境、恢复控件状态 + local function fnFinish() + szState = 'Idle' + X.RegisterEvent('BAG_ITEM_UPDATE', 'MY_BagEx_BagSort__Sort', false) + MY_BagEx_Bag.HideAllItemShadow() + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + -- 根据排序结果与当前状态交换物品 + local nIndex, bChanged = 1, false + local function fnNext() + if not hFrame then + X.OutputSystemAnnounceMessage(_L['Bag panel closed, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + if szState == 'Exchanging' then + return + end + while nIndex <= #aItemDesc do + local tDesc = aItemDesc[nIndex] + local tBoxPos = aBoxPos[nIndex] + local dwBox, dwX = tBoxPos.dwBox, tBoxPos.dwX + local kCurItem = X.GetInventoryItem(me, dwBox, dwX) + local tCurDesc = MY_BagEx.GetItemDesc(kCurItem) + if MY_BagEx.IsSameItemDesc(tDesc, tCurDesc) then + if not MY_BagEx_Bag.IsItemBoxLocked(dwBox, dwX) then + MY_BagEx_Bag.HideItemShadow(hFrame, dwBox, dwX) + end + nIndex = nIndex + 1 + else -- 当前格子和预期不符 需要交换 + local tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc + -- 寻找预期物品所在位置 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if not MY_BagEx_Bag.IsItemBoxLocked(dwExcBox, dwExcX) and MY_BagEx.IsSameItemDesc(tDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + bChanged = true + end + end + -- 寻找堆叠数不同的预期物品所在位置 + if not dwExcBox then + for nExcIndex = nIndex, #aBoxPos do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if not MY_BagEx_Bag.IsItemBoxLocked(dwExcBox, dwExcX) and MY_BagEx.IsSameItemDesc(tDesc, tExcDesc, true) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + end + -- 符合要求不用交換 + if dwBox == dwExcBox and dwX == dwExcX then + nIndex = nIndex + 1 + X.DelayCall(fnNext) + return + end + -- 当前格子和预期物品可堆叠 先拿个别的东西替换过来否则会导致物品合并 + if dwExcBox and MY_BagEx.CanItemDescStack(tCurDesc, tDesc) then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到用于交换的格子 + if not MY_BagEx_Bag.IsItemBoxLocked(dwExcBox, dwExcX) and not MY_BagEx.CanItemDescStack(tCurDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Bag item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, bag is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + -- 还是没有匹配到 将当前物品找个空格子移走 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + -- 匹配到用于交换的格子 + if not MY_BagEx_Bag.IsItemBoxLocked(dwExcBox, dwExcX) and not kExcItem then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Bag item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, bag is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + -- 执行物品互换 + szState = 'Exchanging' + if kCurItem then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BagSort', 'ExchangeItem: ' .. dwBox .. ',' .. dwX .. ' <-> ' ..dwExcBox .. ',' .. dwExcX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwExcBox, dwExcX) + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BagSort', 'ExchangeItem: ' .. dwExcBox .. ',' .. dwExcX .. ' <-> ' ..dwBox .. ',' .. dwX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwExcBox, dwExcX, dwBox, dwX) + end + return + end + end + fnFinish() + end + X.RegisterEvent('BAG_ITEM_UPDATE', 'MY_BagEx_BagSort__Sort', function() + local dwBox, dwX, bNewAdd = arg0, arg1, arg2 + if bNewAdd then + X.OutputSystemAnnounceMessage(_L['Put new item in bag detected, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + elseif szState == 'Exchanging' then + szState = 'Idle' + X.DelayCall('MY_BagEx_BagSort__Sort', fnNext) + end + end) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + fnNext() +end + +-- 检测增加按纽 +function D.CheckInjection(bRemoveInjection) + local hFrame = Station.Lookup('Normal/BigBagPanel') + if not hFrame then + return + end + local hInjectRoot = hFrame:Lookup('WndContainer_Btn') or hFrame + if not bRemoveInjection and MY_BagEx_Bag.IsEnabled() then + -- 植入整理按纽 + local hBtnRef = hInjectRoot:Lookup('Btn_CU') + local hBtnNew = hInjectRoot:Lookup('Btn_MY_Sort') + if not hBtnRef then + return + end + local nX = hBtnRef:GetRelX() + local nY = hBtnRef:GetRelY() + local nH = hBtnRef:GetH() + if not hBtnNew then + hBtnNew = X.UI(hInjectRoot) + :Append('WndButton', { + name = 'Btn_MY_Sort', + w = 'auto', h = nH, + text = _L['Sort'], + tip = { + render = _L['Press shift for random, right click to import and export'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onLClick = function() + local bRandom = IsShiftKeyDown() + MY_BagEx_Bag.ShowAllItemShadow() + if MY_BagEx_Bag.bConfirm then + X.Confirm('MY_BagEx_BagSort', _L['Sure to start bag sort?'], { + x = hFrame:GetAbsX() + hFrame:GetW() / 2, + y = hFrame:GetAbsY() + hFrame:GetH() / 2, + fnResolve = function() D.Operate(bRandom) end, + fnReject = MY_BagEx_Bag.HideAllItemShadow, + fnCancel = MY_BagEx_Bag.HideAllItemShadow, + fnAutoClose = function() return not hFrame or not hFrame:IsVisible() end, + }) + else + D.Operate(bRandom) + end + end, + menuRClick = function() + return { + { + szOption = _L['Export blueprint'], + fnAction = function() + D.Operate(false, true) + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Import blueprint'], + fnAction = function() + GetUserInput(_L['Please input blueprint'], function(szBlueprint) + local aBlueprint = MY_BagEx.DecodeItemDescList(szBlueprint) + if aBlueprint then + MY_BagEx_Bag.ShowAllItemShadow() + D.Operate(false, false, aBlueprint) + else + X.OutputSystemAnnounceMessage(_L['Invalid blueprint data']) + end + end, nil, nil, nil, '') + end, + }, + } + end, + }) + :Raw() + end + if not hBtnNew then + return + end + hBtnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagSort__Injection', function() + if not hBtnNew then + return + end + hBtnNew:Enable(not arg0) + end) + else + -- 移除整理按纽 + X.UI(hInjectRoot:Lookup('Btn_MY_Sort')):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagSort__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BagSort', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BagSort = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('SCROLL_UPDATE_LIST', 'MY_BagEx_BagSort', function() + if (arg0 == 'Handle_Bag_Compact' or arg0 == 'Handle_Bag_Normal') + and arg1 == 'BigBagPanel' then + D.CheckInjection() + end +end) +X.RegisterUserSettingsInit('MY_BagEx_BagSort', function() D.CheckInjection() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_BagSort', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_BagSort', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BagSplit.lua b/MY_BagEx/src/MY_BagEx_BagSplit.lua new file mode 100644 index 000000000..2b7a8e07d --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BagSplit.lua @@ -0,0 +1,112 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包整理 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BagSplit' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BagSplit' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +-- 检测增加按纽 +function D.CheckInjection(bRemoveInjection) + local hFrame = Station.Lookup('Normal/BigBagPanel') + if not hFrame then + return + end + local hInjectRoot = hFrame:Lookup('WndContainer_Btn') or hFrame + if not bRemoveInjection and MY_BagEx_Bag.IsEnabled() then + -- 植入拆分按纽 + local hBtnRef = hInjectRoot:Lookup('Btn_MY_Sort') + local hWndNew = hInjectRoot:Lookup('Wnd_MY_Split') + local hBtnNew = hInjectRoot:Lookup('Wnd_MY_Split/Btn_Split') + if not hBtnRef then + return + end + local nX = hBtnRef:GetRelX() + hBtnRef:GetW() + 3 + local nY = hBtnRef:GetRelY() + local nH = hBtnRef:GetH() + if not hWndNew then + hWndNew = X.UI(hInjectRoot) + :Append('WndWindow', { + name = 'Wnd_MY_Split', + w = 0, h = nH, + }) + :Raw() + hBtnNew = X.UI(hWndNew) + :Append('WndButton', { + name = 'Btn_Split', + w = 'auto', h = nH, + text = _L['Split'], + tip = { + render = _L['Split stacked items (hotkey SHIFT+LClick)'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }) + :Raw() + hWndNew:SetW(hBtnNew:GetW()) + end + if not hWndNew or not hBtnNew then + return + end + hWndNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagSplit__Injection', function() + if not hBtnNew then + return + end + hBtnNew:Enable(not arg0) + end) + else + -- 移除整理按纽 + X.UI(hInjectRoot:Lookup('Wnd_MY_Split')):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagSplit__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BagSplit', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BagSplit = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('SCROLL_UPDATE_LIST', 'MY_BagEx_BagSplit', function() + if (arg0 == 'Handle_Bag_Compact' or arg0 == 'Handle_Bag_Normal') + and arg1 == 'BigBagPanel' then + D.CheckInjection() + end +end) +X.RegisterUserSettingsInit('MY_BagEx_BagSplit', function() D.CheckInjection() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_BagSplit', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_BagSplit', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BagStack.lua b/MY_BagEx/src/MY_BagEx_BagStack.lua new file mode 100644 index 000000000..56bad3083 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BagStack.lua @@ -0,0 +1,229 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包堆叠 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BagStack' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BagStack' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate() + local frame = Station.Lookup('Normal/BigBagPanel') + if not frame then + return + end + local bTrigger + local fnFinish = function() + X.RegisterEvent('BAG_ITEM_UPDATE', 'MY_BagEx_BagStack__Stack', false) + MY_BagEx_Bag.HideAllItemShadow() + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + local bStackLeftExistTime = false + local function fnNext() + bTrigger = true + if not frame then + X.OutputSystemAnnounceMessage(_L['Bag panel closed, stack exited!'], X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + local me, tList = X.GetClientPlayer(), {} + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + if not MY_BagEx_Bag.IsItemBoxLocked(dwBox, dwX) then + MY_BagEx_Bag.HideItemShadow(frame, dwBox, dwX) + end + local kItem = not MY_BagEx_Bag.IsItemBoxLocked(dwBox, dwX) and X.GetInventoryItem(me, dwBox, dwX) + if kItem and kItem.bCanStack and kItem.nStackNum < kItem.nMaxStackNum and me.GetTradeItemLeftTime(kItem.dwID) == 0 then + local szKey = X.GetItemKey(kItem) .. '_' .. (kItem.bBind and '1' or '0') + local nLeftExistTime = bStackLeftExistTime and 0 or kItem.GetLeftExistTime() + local tPos = tList[szKey] and tList[szKey][nLeftExistTime] + if tPos then + local dwBox1, dwX1 = tPos.dwBox, tPos.dwX + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BagStack', 'ExchangeItem: ' ..dwBox .. ',' .. dwX .. ' <-> ' ..dwBox1 .. ',' .. dwX1 .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwBox1, dwX1) + return + else + if not tList[szKey] then + tList[szKey] = {} + end + tList[szKey][nLeftExistTime] = { dwBox = dwBox, dwX = dwX } + end + end + end + end + fnFinish() + end + local function fnStart() + X.RegisterEvent('BAG_ITEM_UPDATE', 'MY_BagEx_BagStack__Stack', function() + local dwBox, dwX, bNewAdd = arg0, arg1, arg2 + if bNewAdd then + X.OutputSystemAnnounceMessage(_L['Put new item in bag detected, stack exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + else + X.DelayCall('MY_BagEx_BagStack__Stack', fnNext) + end + end) + X.DelayCall(1000, function() + if not bTrigger then + fnFinish() + end + end) + fnNext() + end + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + bTrigger = false + + local me, tCache = X.GetClientPlayer(), {} + local bLeftExistTime = false + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + if not MY_BagEx_Bag.IsItemBoxLocked(dwBox, dwX) then + local kItem = X.GetInventoryItem(me, dwBox, dwX) + if kItem then + local szKey = X.GetItemKey(kItem) + local nTimeLimited = kItem.GetLeftExistTime() + if tCache[szKey] then + if tCache[szKey] ~= nTimeLimited then + bLeftExistTime = true + end + else + tCache[szKey] = nTimeLimited + end + end + end + end + end + if bLeftExistTime then + MessageBox({ + szMessage = g_tStrings.STR_STACK_BAG_JUDGE, + szName = 'BigBagPanel_StackBox', + x = frame:GetAbsX() + frame:GetW() / 2, + y = frame:GetAbsY() + frame:GetH() / 2, + fnAutoClose = function() return not frame or not frame:IsVisible() end, + fnCancelAction = fnFinish, + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + bStackLeftExistTime = true + fnStart() + end, + }, { + szOption = g_tStrings.STR_HOTKEY_CANCEL, + fnAction = function() + bStackLeftExistTime = false + fnStart() + end, + }, + }) + else + fnStart() + end +end + +-- 检测堆叠按纽 +function D.CheckInjection(bRemoveInjection) + local hFrame = Station.Lookup('Normal/BigBagPanel') + if not hFrame then + return + end + local hInjectRoot = hFrame:Lookup('WndContainer_Btn') or hFrame + if not bRemoveInjection and MY_BagEx_Bag.IsEnabled() then + -- 植入堆叠按纽 + local hWndRef = hInjectRoot:Lookup('Wnd_MY_Split') + local hBtnNew = hInjectRoot:Lookup('Btn_MY_Stack') + if not hWndRef then + return + end + local nX = hWndRef:GetRelX() + hWndRef:GetW() + 3 + local nY = hWndRef:GetRelY() + local nH = hWndRef:GetH() + if not hBtnNew then + hBtnNew = X.UI(hInjectRoot) + :Append('WndButton', { + name = 'Btn_MY_Stack', + w = 'auto', h = nH, + text = _L['Stack'], + onClick = function() + MY_BagEx_Bag.ShowAllItemShadow() + if MY_BagEx_Bag.bConfirm then + X.Confirm('MY_BagEx_BagStack', _L['Sure to start bag stack?'], { + x = hFrame:GetAbsX() + hFrame:GetW() / 2, + y = hFrame:GetAbsY() + hFrame:GetH() / 2, + fnResolve = D.Operate, + fnReject = MY_BagEx_Bag.HideAllItemShadow, + fnCancel = MY_BagEx_Bag.HideAllItemShadow, + fnAutoClose = function() return not hFrame or not hFrame:IsVisible() end, + }) + else + D.Operate() + end + end, + }) + :Raw() + end + if not hBtnNew then + return + end + hBtnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagStack__Injection', function() + if not hBtnNew then + return + end + hBtnNew:Enable(not arg0) + end) + else + -- 移除堆叠按纽 + X.UI(hInjectRoot:Lookup('Btn_MY_Stack')):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BagStack__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BagStack', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BagStack = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('SCROLL_UPDATE_LIST', 'MY_BagEx_BagStack', function() + if (arg0 == 'Handle_Bag_Compact' or arg0 == 'Handle_Bag_Normal') + and arg1 == 'BigBagPanel' then + D.CheckInjection() + end +end) +X.RegisterUserSettingsInit('MY_BagEx_BagStack', function() D.CheckInjection() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_BagStack', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_BagStack', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_Bank.lua b/MY_BagEx/src/MY_BagEx_Bank.lua new file mode 100644 index 000000000..b61faf7e1 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_Bank.lua @@ -0,0 +1,335 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仓库基础逻辑 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_Bank' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_Bank' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bank'], + _L['Bank package sort and stack'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bConfirm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bank'], + _L['Sort need confirm'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tLock = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Bank'], + _L['Lock cells data'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, +}) +local D = {} + +function D.PreventItemUIEvent(el) + el.OnItemMouseEnter = function() end + el.OnItemMouseLeave = function() end + el.OnItemLButtonDown = function() end + el.OnItemLButtonUp = function() end + el.OnItemRefreshTip = function() end +end + +function D.ShowItemShadow(frame, dwBox, dwX, bEditLock) + for _, v in ipairs({ + { szPath = '', szSubPath = 'Handle_Box/' .. dwBox .. '_' .. dwX, bNew = false }, + { szPath = 'WndScroll_Bag', szSubPath = 'Handle_Normal_Mod' .. dwBox .. '/Handle_Bag_Content/Handle_Mode' .. dwBox .. '_' .. dwX .. '/Box', bNew = true }, + { szPath = 'WndScroll_Bag', szSubPath = 'Handle_Compact_Mod' .. dwBox .. '_' .. dwX .. '/Box_Impact', bNew = true }, + }) do + local box = frame:Lookup(v.szPath, v.szSubPath) + if box then + local szKey = dwBox .. '_' .. dwX + local sha + if v.bNew then + sha = box:GetParent():Lookup('Shadow_MY_BagEx') + if not sha then + sha = X.UI(box:GetParent()):Append('Shadow', { name = 'Shadow_MY_BagEx', w = 0, h = 0 }):Raw() + sha:SetSize(box:GetSize()) + sha:SetRelPos(box:GetRelPos()) + sha:SetAbsPos(box:GetAbsPos()) + D.PreventItemUIEvent(sha) + end + sha:Show() + else + local h = box:GetParent():GetParent():Lookup('Handle_MY_BagEx_Shadow') + if not h then + h = X.UI(box:GetParent():GetParent()):Append('Handle', { name = 'Handle_MY_BagEx_Shadow' }):Raw() + D.PreventItemUIEvent(h) + end + h:SetSize(box:GetParent():GetSize()) + sha = h:Lookup(dwBox .. '_' .. dwX) + if not sha then + sha = X.UI(h):Append('Shadow', { name = dwBox .. '_' .. dwX, w = 0, h = 0 }):Raw() + sha:SetSize(box:GetSize()) + D.PreventItemUIEvent(sha) + end + sha:SetRelPos(box:GetRelPos()) + sha:SetAbsPos(box:GetAbsPos()) + sha:Show() + end + if O.tLock[szKey] then + sha:SetAlpha(128) + sha:SetColorRGB(0, 0, 0) + else + sha:SetAlpha(50) + sha:SetColorRGB(255, 255, 255) + end + if bEditLock then + sha.OnItemLButtonClick = function() + local tLock = O.tLock + tLock[szKey] = not tLock[szKey] or nil + if tLock[szKey] then + sha:SetAlpha(128) + sha:SetColorRGB(0, 0, 0) + else + sha:SetAlpha(50) + sha:SetColorRGB(255, 255, 255) + end + O.tLock = tLock + end + else + sha.OnItemLButtonClick = nil + end + end + end +end + +function D.ShowAllItemShadow(bEditLock) + local frame = Station.Lookup('Normal/BigBankPanel') + if not frame then + return + end + -- 遮罩紧凑模式切换按钮 + local chk = frame:Lookup('CheckBox_Compact') + if chk then + local wnd = frame:Lookup('Wnd_MY_BagEx_CheckBox_Compact') + if not wnd then + wnd = X.UI(frame):Append('WndWindow', { name = 'Wnd_MY_BagEx_CheckBox_Compact' }):Raw() + wnd:SetSize(chk:GetSize()) + wnd:SetRelPos(chk:GetRelPos()) + end + wnd:Show() + end + -- 遮罩背包列表 + local h = frame:Lookup('', '') + local box = h:Lookup('Box_Bag1') + if box then + local nRelX, nRelY = box:GetRelPos() + local nAbsX, nAbsY = box:GetAbsPos() + local nW, nH = box:GetSize() + local i = 1 + while box do + i = i + 1 + box = frame:Lookup('', 'Box_Bag' .. i) + if box then + nW = box:GetRelX() - nRelX + box:GetW() + nH = box:GetRelY() - nRelY + box:GetH() + end + end + local sha = h:Lookup('Shadow_MY_BagEx') + if not sha then + sha = X.UI(h):Append('Shadow', { name = 'Shadow_MY_BagEx', w = 0, h = 0 }):Raw() + sha:SetColorRGB(255, 255, 255) + sha:SetAlpha(0) + sha:SetSize(nW, nH) + sha:SetRelPos(nRelX, nRelY) + sha:SetAbsPos(nAbsX, nAbsY) + D.PreventItemUIEvent(sha) + end + sha:Show() + end + -- 遮罩背包物品 + for _, dwBox in ipairs(X.CONSTANT.INVENTORY_BANK_LIST) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + D.ShowItemShadow(frame, dwBox, dwX, bEditLock) + end + end +end + +function D.HideItemShadow(frame, dwBox, dwX) + for _, v in ipairs({ + { szPath = '', szSubPath = 'Handle_Box/' .. dwBox .. '_' .. dwX, bNew = false }, + { szPath = 'WndScroll_Bag', szSubPath = 'Handle_Normal_Mod' .. dwBox .. '/Handle_Bag_Content/Handle_Mode' .. dwBox .. '_' .. dwX .. '/Box', bNew = true }, + { szPath = 'WndScroll_Bag', szSubPath = 'Handle_Compact_Mod' .. dwBox .. '_' .. dwX .. '/Box_Impact', bNew = true }, + }) do + local box = frame:Lookup(v.szPath, v.szSubPath) + if box then + if v.bNew then + local sha = box:GetParent():Lookup('Shadow_MY_BagEx') + if sha then + sha:Hide() + end + else + local sha = box:GetParent():GetParent():Lookup('Handle_MY_BagEx_Shadow/' .. dwBox .. '_' .. dwX) + if sha then + sha:Hide() + end + end + end + end +end + +function D.HideAllItemShadow() + local frame = Station.Lookup('Normal/BigBankPanel') + if not frame then + return + end + -- 遮罩紧凑模式切换按钮 + local chk = frame:Lookup('CheckBox_Compact') + if chk then + local wnd = frame:Lookup('Wnd_MY_BagEx_CheckBox_Compact') + if wnd then + wnd:Hide() + end + end + -- 遮罩背包列表 + local h = frame:Lookup('', '') + if h then + local sha = h:Lookup('Shadow_MY_BagEx') + if sha then + sha:Hide() + end + end + -- 遮罩背包物品 + for _, dwBox in ipairs(X.CONSTANT.INVENTORY_BANK_LIST) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + D.HideItemShadow(frame, dwBox, dwX) + end + end +end + +function D.IsItemBoxLocked(dwBox, dwX) + local szKey = dwBox .. '_' .. dwX + return O.tLock[szKey] or false +end + +-- 检测冲突 +function D.CheckConflict(bRemoveInjection) + if not bRemoveInjection and O.bEnable then + -- 隐藏冲突的系统按钮 + for _, szPath in ipairs({ + 'Normal/BigBankPanel/Btn_CU', + 'Normal/BigBankPanel/Btn_Stack', + 'Normal/BigBankPanel/Btn_Lock', + }) do + local el = Station.Lookup(szPath) + if el then + el:Hide() + end + end + else + -- 恢复冲突的系统按钮 + for _, szPath in ipairs({ + 'Normal/BigBankPanel/Btn_CU', + 'Normal/BigBankPanel/Btn_Stack', + 'Normal/BigBankPanel/Btn_Lock', + }) do + local el = Station.Lookup(szPath) + if el then + el:Show() + end + end + end +end + +function D.CheckEnable(bRemoveInjection) + D.CheckConflict(bRemoveInjection) + MY_BagEx_BankSort.CheckInjection(bRemoveInjection) + MY_BagEx_BankStack.CheckInjection(bRemoveInjection) + MY_BagEx_BankLock.CheckInjection(bRemoveInjection) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Bank package sort and stack'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.CheckEnable() + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Need confirm'], + checked = O.bConfirm, + onCheck = function(bChecked) + O.bConfirm = bChecked + end, + autoEnable = function() return O.bEnable end, + }):AutoWidth():Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_Bank', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + ShowItemShadow = D.ShowItemShadow, + ShowAllItemShadow = D.ShowAllItemShadow, + HideItemShadow = D.HideItemShadow, + HideAllItemShadow = D.HideAllItemShadow, + IsItemBoxLocked = D.IsItemBoxLocked, + }, + }, + { + fields = { + 'bEnable', + 'bConfirm', + }, + root = O, + }, + }, +} +MY_BagEx_Bank = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('ON_SET_BANK_COMPACT_MODE', 'MY_BagEx_Bank', function() X.DelayCall(D.CheckEnable) end) +X.RegisterUserSettingsInit('MY_BagEx_Bank', function() X.DelayCall(D.CheckEnable) end) +X.RegisterFrameCreate('BigBankPanel', 'MY_BagEx_Bank', function() X.DelayCall(D.CheckEnable) end) +X.RegisterReload('MY_BagEx_Bank', function() D.CheckEnable(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BankLock.lua b/MY_BagEx/src/MY_BagEx_BankLock.lua new file mode 100644 index 000000000..e9aa046b2 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BankLock.lua @@ -0,0 +1,97 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仓库锁定 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BankLock' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BankLock' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +-- 检测堆叠按纽 +function D.CheckInjection(bRemoveInjection) + if not bRemoveInjection and MY_BagEx_Bank.bEnable and not X.IsInInventoryPackageLimitedMap() then + -- 植入堆叠按纽 + local frame = Station.Lookup('Normal/BigBankPanel') + if not frame then + return + end + local btnRef = frame:Lookup('Btn_MY_Stack') + local btnNew = frame:Lookup('Btn_MY_Lock') + if not btnRef then + return + end + local nX = btnRef:GetRelX() + btnRef:GetW() + 5 + local nY = btnRef:GetRelY() + if not btnNew then + local bEdit = false + btnNew = X.UI('Normal/BigBankPanel') + :Append('WndButton', { + name = 'Btn_MY_Lock', + w = 'auto', h = 'auto', + text = _L['Lock'], + onClick = function() + bEdit = not bEdit + if bEdit then + MY_BagEx_Bank.ShowAllItemShadow(true) + else + MY_BagEx_Bank.HideAllItemShadow() + end + end, + }) + :Raw() + end + if not btnNew then + return + end + btnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankLock__Injection', function() + if not btnNew then + return + end + btnNew:Enable(not arg0) + end) + else + -- 移除堆叠按纽 + X.UI('Normal/BigBankPanel/Btn_MY_Lock'):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankLock__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BankLock', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BankLock = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BankSort.lua b/MY_BagEx/src/MY_BagEx_BankSort.lua new file mode 100644 index 000000000..8508599c0 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BankSort.lua @@ -0,0 +1,349 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包整理 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BankSort' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BankSort' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate(bRandom, bExportBlueprint, aBlueprint) + local hFrame = Station.Lookup('Normal/BigBankPanel') + if not hFrame then + return + end + local szState = 'Idle' + -- 加载格子列表 + local me, aItemDesc, nItemCount, aBoxPos = X.GetClientPlayer(), {}, 0, {} + for _, dwBox in ipairs(X.CONSTANT.INVENTORY_BANK_LIST) do + local dwGenre = me.GetContainType(dwBox) + if dwGenre == ITEM_GENRE.BOOK then + X.OutputSystemAnnounceMessage(_L['Bank contains book only, use official sort please!'], X.CONSTANT.MSG_THEME.ERROR) + return + end + if dwGenre == ITEM_GENRE.MATERIAL then + X.OutputSystemAnnounceMessage(_L['Bank contains material only, use official sort please!'], X.CONSTANT.MSG_THEME.ERROR) + return + end + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local kItem = X.GetInventoryItem(me, dwBox, dwX) + local tDesc = MY_BagEx.GetItemDesc(kItem) + if not X.IsEmpty(tDesc) then + nItemCount = nItemCount + 1 + end + table.insert(aItemDesc, tDesc) + table.insert(aBoxPos, { dwBox = dwBox, dwX = dwX }) + end + end + -- 导出布局 + if bExportBlueprint then + X.UI.OpenTextEditor(MY_BagEx.EncodeItemDescList(aItemDesc)) + return + end + -- 没物品不需要操作 + if nItemCount == 0 then + return + end + -- 导入布局 + if aBlueprint then + for nIndex, tDesc in ipairs(aItemDesc) do + aItemDesc[nIndex] = aBlueprint[nIndex] or MY_BagEx.GetItemDesc() + end + else + -- 避开锁定格子 + local aMovableItemDesc = {} + for nIndex, tDesc in ipairs(aItemDesc) do + local tPos = aBoxPos[nIndex] + if not MY_BagEx_Bank.IsItemBoxLocked(tPos.dwBox, tPos.dwX) then + table.insert(aMovableItemDesc, tDesc) + end + end + -- 排序格子列表 + if bRandom then + for nIndex = 1, #aMovableItemDesc do + local nExcIndex = X.Random(1, #aMovableItemDesc) + if nIndex ~= nExcIndex then + aMovableItemDesc[nIndex], aMovableItemDesc[nExcIndex] = aMovableItemDesc[nExcIndex], aMovableItemDesc[nIndex] + end + end + else + table.sort(aMovableItemDesc, MY_BagEx.ItemDescSorter) + end + -- 合成避开锁定格子后的排序结果 + for i, _ in X.ipairs_r(aItemDesc) do + local tPos = aBoxPos[i] + if not MY_BagEx_Bank.IsItemBoxLocked(tPos.dwBox, tPos.dwX) then + aItemDesc[i] = table.remove(aMovableItemDesc) + end + end + end + -- 结束清理环境、恢复控件状态 + local function fnFinish() + szState = 'Idle' + X.RegisterEvent({'BAG_ITEM_UPDATE', 'BANK_ITEM_UPDATE'}, 'MY_BagEx_BankSort__Sort', false) + MY_BagEx_Bank.HideAllItemShadow() + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + -- 根据排序结果与当前状态交换物品 + local nIndex, bChanged = 1, false + local function fnNext() + if not hFrame then + X.OutputSystemAnnounceMessage(_L['Bank panel closed, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + if szState == 'Exchanging' then + return + end + while nIndex <= #aItemDesc do + local tDesc = aItemDesc[nIndex] + local tBoxPos = aBoxPos[nIndex] + local dwBox, dwX = tBoxPos.dwBox, tBoxPos.dwX + local kCurItem = X.GetInventoryItem(me, dwBox, dwX) + local tCurDesc = MY_BagEx.GetItemDesc(kCurItem) + if MY_BagEx.IsSameItemDesc(tDesc, tCurDesc) then + if not MY_BagEx_Bank.IsItemBoxLocked(dwBox, dwX) then + MY_BagEx_Bank.HideItemShadow(hFrame, dwBox, dwX) + end + nIndex = nIndex + 1 + else -- 当前格子和预期不符 需要交换 + local tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc + -- 寻找预期物品所在位置 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if not MY_BagEx_Bank.IsItemBoxLocked(dwExcBox, dwExcX) and MY_BagEx.IsSameItemDesc(tDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + bChanged = true + end + end + -- 寻找堆叠数不同的预期物品所在位置 + if not dwExcBox then + for nExcIndex = nIndex, #aBoxPos do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if not MY_BagEx_Bank.IsItemBoxLocked(dwExcBox, dwExcX) and MY_BagEx.IsSameItemDesc(tDesc, tExcDesc, true) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + end + -- 符合要求不用交換 + if dwBox == dwExcBox and dwX == dwExcX then + nIndex = nIndex + 1 + X.DelayCall(fnNext) + return + end + -- 当前格子和预期物品可堆叠 先拿个别的东西替换过来否则会导致物品合并 + if dwExcBox and MY_BagEx.CanItemDescStack(tCurDesc, tDesc) then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到用于交换的格子 + if not MY_BagEx_Bank.IsItemBoxLocked(dwExcBox, dwExcX) and not MY_BagEx.CanItemDescStack(tCurDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Bank item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, bank is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + -- 还是没有匹配到 将当前物品找个空格子移走 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + -- 匹配到用于交换的格子 + if not MY_BagEx_Bank.IsItemBoxLocked(dwExcBox, dwExcX) and not kExcItem then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Bank item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, bank is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + -- 执行物品互换 + szState = 'Exchanging' + if kCurItem then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BankSort', 'ExchangeItem: ' ..dwBox .. ',' .. dwX .. ' <-> ' ..dwExcBox .. ',' .. dwExcX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwExcBox, dwExcX) + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BankSort', 'ExchangeItem: ' ..dwExcBox .. ',' .. dwExcX .. ' <-> ' ..dwBox .. ',' .. dwX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwExcBox, dwExcX, dwBox, dwX) + end + return + end + end + fnFinish() + end + X.RegisterEvent({'BAG_ITEM_UPDATE', 'BANK_ITEM_UPDATE'}, 'MY_BagEx_BankSort__Sort', function(event) + local dwBox, dwX, bNewAdd = arg0, arg1, arg2 + if (event == 'BAG_ITEM_UPDATE' and dwBox >= INVENTORY_INDEX.BANK_PACKAGE1 and dwBox <= INVENTORY_INDEX.BANK_PACKAGE5) + or event == 'BANK_ITEM_UPDATE' then + if bNewAdd then + X.OutputSystemAnnounceMessage(_L['Put new item in bank detected, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + elseif szState == 'Exchanging' then + szState = 'Idle' + X.DelayCall('MY_BagEx_BankSort__Sort', fnNext) + end + end + end) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + fnNext() +end + +-- 检测增加按纽 +function D.CheckInjection(bRemoveInjection) + if not bRemoveInjection and MY_BagEx_Bank.bEnable and not X.IsInInventoryPackageLimitedMap() then + -- 植入整理按纽 + local hFrame = Station.Lookup('Normal/BigBankPanel') + if not hFrame then + return + end + local hBtnRef = hFrame:Lookup('Btn_CU') + local hBtnNew = hFrame:Lookup('Btn_MY_Sort') + if not hBtnRef then + return + end + local nX, nY = hBtnRef:GetRelPos() + if not hBtnNew then + hBtnNew = X.UI('Normal/BigBankPanel') + :Append('WndButton', { + name = 'Btn_MY_Sort', + w = 'auto', h = 'auto', + text = _L['Sort'], + tip = { + render = _L['Press shift for random, right click to import and export'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onLClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.BANK) then + X.OutputSystemAnnounceMessage(_L['Please unlock mibao first.']) + return + end + local bRandom = IsShiftKeyDown() + MY_BagEx_Bank.ShowAllItemShadow() + if MY_BagEx_Bank.bConfirm then + X.Confirm('MY_BagEx_BankSort', _L['Sure to start bank sort?'], { + x = hFrame:GetAbsX() + hFrame:GetW() / 2, + y = hFrame:GetAbsY() + hFrame:GetH() / 2, + fnResolve = function() D.Operate(bRandom) end, + fnReject = MY_BagEx_Bank.HideAllItemShadow, + fnCancel = MY_BagEx_Bank.HideAllItemShadow, + fnAutoClose = function() return not hFrame or not hFrame:IsVisible() end, + }) + else + D.Operate(bRandom) + end + end, + menuRClick = function() + return { + { + szOption = _L['Export blueprint'], + fnAction = function() + D.Operate(false, true) + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Import blueprint'], + fnAction = function() + GetUserInput(_L['Please input blueprint'], function(szBlueprint) + local aBlueprint = MY_BagEx.DecodeItemDescList(szBlueprint) + if aBlueprint then + MY_BagEx_Bank.ShowAllItemShadow() + D.Operate(false, false, aBlueprint) + else + X.OutputSystemAnnounceMessage(_L['Invalid blueprint data']) + end + end, nil, nil, nil, '') + end, + }, + } + end, + }) + :Raw() + end + if not hBtnNew then + return + end + hBtnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankSort__Injection', function() + if not hBtnNew then + return + end + hBtnNew:Enable(not arg0) + end) + else + -- 移除整理按纽 + X.UI('Normal/BigBankPanel/Btn_MY_Sort'):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankSort__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BankSort', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BankSort = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_BankStack.lua b/MY_BagEx/src/MY_BagEx_BankStack.lua new file mode 100644 index 000000000..8f4bc6104 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_BankStack.lua @@ -0,0 +1,224 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包堆叠 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_BankStack' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_BankStack' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate() + local frame = Station.Lookup('Normal/BigBankPanel') + if not frame then + return + end + local bTrigger + local fnFinish = function() + X.RegisterEvent({'BAG_ITEM_UPDATE', 'BANK_ITEM_UPDATE'}, 'MY_BagEx_BankStack__Stack', false) + MY_BagEx_Bank.HideAllItemShadow() + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + local bStackLeftExistTime = false + local function fnNext() + bTrigger = true + if not frame then + X.OutputSystemAnnounceMessage(_L['Bank panel closed, stack exited!'], X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + local me, tList = X.GetClientPlayer(), {} + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.BANK)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + if not MY_BagEx_Bank.IsItemBoxLocked(dwBox, dwX) then + MY_BagEx_Bank.HideItemShadow(frame, dwBox, dwX) + end + local kItem = not MY_BagEx_Bank.IsItemBoxLocked(dwBox, dwX) and X.GetInventoryItem(me, dwBox, dwX) + if kItem and kItem.bCanStack and kItem.nStackNum < kItem.nMaxStackNum and me.GetTradeItemLeftTime(kItem.dwID) == 0 then + local szKey = X.GetItemKey(kItem) .. '_' .. (kItem.bBind and '1' or '0') + local nLeftExistTime = bStackLeftExistTime and 0 or kItem.GetLeftExistTime() + local tPos = tList[szKey] and tList[szKey][nLeftExistTime] + if tPos then + local dwBox1, dwX1 = tPos.dwBox, tPos.dwX + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_BankStack', 'ExchangeItem: ' ..dwBox .. ',' .. dwX .. ' <-> ' ..dwBox1 .. ',' .. dwX1 .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwBox1, dwX1) + return + else + if not tList[szKey] then + tList[szKey] = {} + end + tList[szKey][nLeftExistTime] = { dwBox = dwBox, dwX = dwX } + end + end + end + end + fnFinish() + end + local function fnStart() + X.RegisterEvent({'BAG_ITEM_UPDATE', 'BANK_ITEM_UPDATE'}, 'MY_BagEx_BankStack__Stack', function(event) + local dwBox, dwX, bNewAdd = arg0, arg1, arg2 + if (event == 'BAG_ITEM_UPDATE' and dwBox >= INVENTORY_INDEX.BANK_PACKAGE1 and dwBox <= INVENTORY_INDEX.BANK_PACKAGE5) + or event == 'BANK_ITEM_UPDATE' then + if bNewAdd then + X.OutputSystemAnnounceMessage(_L['Put new item in bank detected, stack exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + else + X.DelayCall('MY_BagEx_BankStack__Stack', fnNext) + end + end + end) + X.DelayCall(1000, function() + if not bTrigger then + fnFinish() + end + end) + fnNext() + end + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + bTrigger = false + + local me, tCache = X.GetClientPlayer(), {} + local bLeftExistTime = false + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.BANK)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + if not MY_BagEx_Bank.IsItemBoxLocked(dwBox, dwX) then + local kItem = X.GetInventoryItem(me, dwBox, dwX) + if kItem then + local szKey = X.GetItemKey(kItem) + local nTimeLimited = kItem.GetLeftExistTime() + if tCache[szKey] then + if tCache[szKey] ~= nTimeLimited then + bLeftExistTime = true + end + else + tCache[szKey] = nTimeLimited + end + end + end + end + end + if bLeftExistTime then + MessageBox({ + szMessage = g_tStrings.STR_STACK_BANK_JUDGE, + szName = 'BigBankPanel_StackBox', + x = frame:GetAbsX() + frame:GetW() / 2, + y = frame:GetAbsY() + frame:GetH() / 2, + fnAutoClose = function() return not frame or not frame:IsVisible() end, + fnCancelAction = fnFinish, + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + bStackLeftExistTime = true + fnStart() + end, + }, { + szOption = g_tStrings.STR_HOTKEY_CANCEL, + fnAction = function() + bStackLeftExistTime = false + fnStart() + end, + }, + }) + else + fnStart() + end +end + +-- 检测堆叠按纽 +function D.CheckInjection(bRemoveInjection) + if not bRemoveInjection and MY_BagEx_Bank.bEnable and not X.IsInInventoryPackageLimitedMap() then + -- 植入堆叠按纽 + local frame = Station.Lookup('Normal/BigBankPanel') + if not frame then + return + end + local btnRef = frame:Lookup('Btn_MY_Sort') + local btnNew = frame:Lookup('Btn_MY_Stack') + if not btnRef then + return + end + local nX = btnRef:GetRelX() + btnRef:GetW() + 5 + local nY = btnRef:GetRelY() + if not btnNew then + btnNew = X.UI('Normal/BigBankPanel') + :Append('WndButton', { + name = 'Btn_MY_Stack', + w = 'auto', h = 'auto', + text = _L['Stack'], + onClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.BANK) then + X.OutputSystemAnnounceMessage(_L['Please unlock mibao first.']) + return + end + MY_BagEx_Bank.ShowAllItemShadow() + if MY_BagEx_Bank.bConfirm then + X.Confirm('MY_BagEx_BankStack', _L['Sure to start bank stack?'], { + x = frame:GetAbsX() + frame:GetW() / 2, + y = frame:GetAbsY() + frame:GetH() / 2, + fnResolve = D.Operate, + fnReject = MY_BagEx_Bank.HideAllItemShadow, + fnCancel = MY_BagEx_Bank.HideAllItemShadow, + fnAutoClose = function() return not frame or not frame:IsVisible() end, + }) + else + D.Operate() + end + end, + }) + :Raw() + end + if not btnNew then + return + end + btnNew:SetRelPos(nX, nY) + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankStack__Injection', function() + if not btnNew then + return + end + btnNew:Enable(not arg0) + end) + else + -- 移除堆叠按纽 + X.UI('Normal/BigBankPanel/Btn_MY_Stack'):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_BankStack__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_BankStack', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_BankStack = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_GenericFilters.lua b/MY_BagEx/src/MY_BagEx_GenericFilters.lua new file mode 100644 index 000000000..c01cf21e6 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_GenericFilters.lua @@ -0,0 +1,499 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仓库背包增强(搜索/对比) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_GenericFilters' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_GenericFilters' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_BagEx_GenericFilters', { remake = true }) +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['Generic package searcher and filters'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + szRestriction = 'MY_BagEx_GenericFilters', + }, +}) +local D = {} + +local l_tItemText = {} + +local l_szBagFilter = '' + +local l_szBankFilter = '' +local l_bCompareBank = false +local l_bBankTimeLtd = false + +local l_szGuildBankFilter = '' +local l_bCompareGuild = false + +local function GetItemText(item) + if item then + if GetItemTip then + local szKey = item.dwTabType .. ',' .. item.dwIndex + if not l_tItemText[szKey] then + l_tItemText[szKey] = '' + l_tItemText[szKey] = X.GetPureText(X.GetItemTip(item), 'LUA') + end + return l_tItemText[szKey] + else + return item.szName + end + else + return '' + end +end + +local SimpleMatch = X.StringSimpleMatch +local function FilterBags(szTreePath, szFilter, bTimeLtd) + if szFilter then + szFilter = szFilter:gsub('[%[%]]', '') + if szFilter == '' then + szFilter = nil + end + end + local me = X.GetClientPlayer() + if not szFilter and not bTimeLtd then + X.UI(szTreePath):Find('.Box'):Alpha(255) + else + X.UI(szTreePath):Find('.Box'):Each(function(ui) + if this.bBag then + return + end + local bMatch = true + local szBoxType, nUiId, dwBox, dwX, suitIndex, dwTabType, dwIndex = this:GetObject() + if szBoxType == UI_OBJECT_ITEM then + local item = X.GetInventoryItem(X.GetClientPlayer(), dwBox, dwX) + if item then + if bTimeLtd and item.GetLeftExistTime() == 0 then + bMatch = false + end + if szFilter and not SimpleMatch(GetItemText(item), szFilter) then + bMatch = false + end + end + end + if bMatch then + this:SetAlpha(255) + else + this:SetAlpha(50) + end + end) + end +end + +local function DoFilterBag(bForce) + if IsBagInSort and IsBagInSort() then + return + end + -- 优化性能 当过滤器为空时不遍历筛选 + if bForce or l_szBagFilter then + FilterBags('Normal/BigBagPanel', l_szBagFilter) + if l_szBagFilter == '' then + l_szBagFilter = nil + end + end +end + +local function DoFilterBank(bForce) + if IsBankInSort and IsBankInSort() then + return + end + -- 优化性能 当过滤器为空时不遍历筛选 + if bForce or l_szBankFilter or l_bBankTimeLtd then + FilterBags('Normal/BigBankPanel', l_szBankFilter, l_bBankTimeLtd) + if l_szBankFilter == '' then + l_szBankFilter = nil + end + end +end + +local function DoFilterGuildBank(bForce) + -- 优化性能 当过滤器为空时不遍历筛选 + if bForce or l_szGuildBankFilter then + FilterBags('Normal/GuildBankPanel', l_szGuildBankFilter) + if l_szGuildBankFilter == '' then + l_szGuildBankFilter = nil + end + end +end + +local function DoCompare(ui1, ui2) + local itemlist1 = {} + local itemlist2 = {} + + ui1:Find('.Box'):Each(function(e) + if this.bBag then return end + local szBoxType, nUiId, dwBox, dwX, suitIndex, dwTabType, dwIndex = this:GetObject() + if szBoxType == UI_OBJECT_ITEM then + itemlist1[dwTabType .. ',' .. dwIndex] = true + end + end) + ui2:Find('.Box'):Each(function(e) + if this.bBag then return end + local szBoxType, nUiId, dwBox, dwX, suitIndex, dwTabType, dwIndex = this:GetObject() + if szBoxType == UI_OBJECT_ITEM then + itemlist2[dwTabType .. ',' .. dwIndex] = true + + if itemlist1[dwTabType .. ',' .. dwIndex] then + e:Alpha(255) + else + e:Alpha(50) + end + end + end) + ui1:Find('.Box'):Each(function(e) + if this.bBag then return end + local szBoxType, nUiId, dwBox, dwX, suitIndex, dwTabType, dwIndex = this:GetObject() + if szBoxType == UI_OBJECT_ITEM then + if itemlist2[dwTabType .. ',' .. dwIndex] then + e:Alpha(255) + else + e:Alpha(50) + end + end + end) +end + +local function DoCompareBank(bForce) + if l_bCompareBank then + local frmBag = Station.Lookup('Normal/BigBagPanel') + local frmBank = Station.Lookup('Normal/BigBankPanel') + + if frmBag and frmBank and frmBank:IsVisible() then + X.UI('Normal/BigBagPanel/CheckBox_Totle'):Check(true):Check(false) + DoCompare(X.UI(frmBag), X.UI(frmBank)) + end + else + DoFilterBag(bForce) + DoFilterBank(bForce) + end +end + +local function DoCompareGuildBank(bForce) + if l_bCompareGuild then + local frmBag = Station.Lookup('Normal/BigBagPanel') + local frmGuildBank = Station.Lookup('Normal/GuildBankPanel') + + if frmBag and frmGuildBank and frmGuildBank:IsVisible() then + X.UI('Normal/BigBagPanel/CheckBox_Totle'):Check(true):Check(false) + DoCompare(X.UI(frmBag), X.UI(frmGuildBank)) + end + else + DoFilterBag(bForce) + DoFilterGuildBank(bForce) + end +end + +local function OnFrameKeyDown() + local szKey = GetKeyName(Station.GetMessageKey()) + if IsCtrlKeyDown() and szKey == 'F' then + local el = this:Lookup('WndEditBox_KeyWord/WndEdit_Default') + or this:Lookup('WndContainer_Other/Wnd_Search/Edit_Search') + if el then + Station.SetFocusWindow(el:GetTreePath()) + return 1 + end + end + return 0 +end + +local function Hook() + local frame = Station.Lookup('Normal/BigBagPanel') + if frame and not frame.bMYBagExHook then + frame.bMYBagExHook = true + local nX, nY, nH = 60, 30, 21 + if X.UI.IS_GLASSMORPHISM then + nX, nY, nH = 45, 7, 25 + end + if not frame:Lookup('WndContainer_Other/Wnd_Search') then + X.UI(frame):Append('WndEditBox', { + name = 'WndEditBox_KeyWord', + w = 80 + nH, h = nH, x = nX, y = nY, + appearance = 'SEARCH_LEFT', + text = l_szBagFilter, + placeholder = _L['Search'], + alignVertical = X.UI.ALIGN_VERTICAL.MIDDLE, + onChange = function(txt) + local nLen = txt:len() + nLen = math.max(nLen, 8) + nLen = math.min(nLen, 16) + X.UI(this):Width(nLen * 10 + nH) + l_szBagFilter = txt + DoFilterBag() + end, + }) + end + + HookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown, { bHookReturn = true }) + end + + local frame = Station.Lookup('Normal/BigBankPanel') + if frame and not frame.bMYBagExHook then + frame.bMYBagExHook = true + + local nPaddingX = 277 + local img = Station.Lookup('Normal/BigBankPanel', 'Image_BagBox6') + if img then + nPaddingX = img:GetRelX() + img:GetW() + 5 + end + + local ui = X.UI(frame) + local nX = nPaddingX + local bOfficial = not not frame:Lookup('WndContainer_Other/Wnd_Search') + + if not bOfficial then + nX = nX + ui:Append('WndCheckBox', { + name = 'CheckBox_TimeLtd', + x = nX, y = 56, alpha = 200, + text = _L['Time Limited'], + checked = l_bBankTimeLtd, + onCheck = function(bChecked) + if bChecked then + X.UI('Normal/BigBankPanel/WndCheckBox_Compare'):Check(false) + end + l_bBankTimeLtd = bChecked + DoFilterBank(true) + end + }):Width() + 3 + end + + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_Compare', + x = bOfficial and 560 or nX, y = bOfficial and 52 or 56, + text = _L['Compare with bag'], + checked = l_bCompareBank, + onCheck = function(bChecked) + if bChecked then + X.UI('Normal/BigBankPanel/CheckBox_TimeLtd'):Check(false) + end + l_bCompareBank = bChecked + DoCompareBank(true) + end + }):Width() + 3 + + local nW = nX - nPaddingX + nX = nPaddingX + + if not bOfficial then + if not frame:Lookup('WndContainer_Other/Wnd_Search') then + ui:Append('WndEditBox', { + name = 'WndEditBox_KeyWord', + x = nX + 3, y = 80, w = nW, h = 21, + text = l_szBankFilter, + placeholder = _L['Search'], + onChange = function(txt) + local nLen = txt:len() + nLen = math.max(nLen, 15) + nLen = math.min(nLen, 25) + X.UI(this):Width(nLen * 10) + l_szBankFilter = txt + DoFilterBank(true) + end, + }) + end + end + + HookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown, { bHookReturn = true }) + end + + local frame = Station.Lookup('Normal/GuildBankPanel') + if frame and not frame.bMYBagExHook then + frame.bMYBagExHook = true + X.UI('Normal/GuildBankPanel'):Append('WndEditBox', { + name = 'WndEditBox_KeyWord', + x = X.IS_REMAKE and 20 or 60, y = 25, + w = 100, h = 21, + text = l_szGuildBankFilter, + placeholder = _L['Search'], + onChange = function(txt) + local nLen = txt:len() + nLen = math.max(nLen, 10) + nLen = math.min(nLen, 25) + X.UI(this):Width(nLen * 10) + l_szGuildBankFilter = txt + DoFilterGuildBank(true) + end, + }) + + local nY = 475 + local btn = Station.Lookup('Normal/GuildBankPanel/Btn_Refresh') + if btn then + nY = btn:GetRelY() + end + + X.UI('Normal/GuildBankPanel'):Append('WndCheckBox', { + name = 'WndCheckBox_Compare', + w = 100, x = 20, y = nY, + text = _L['Compare with bag'], + checked = l_bCompareGuild, + onCheck = function(bChecked) + l_bCompareGuild = bChecked + DoCompareGuildBank(true) + end + }) + + HookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown, { bHookReturn = true }) + end + + X.RegisterEvent('EXECUTE_BINDING', 'MY_BAGEX', function(e) + local szName, bDown = arg0, arg1 + if Cursor.IsVisible() + and szName == 'OPENORCLOSEALLBAGS' and not bDown then + local hFrame = Station.Lookup('Normal/BigBagPanel') + if hFrame and hFrame:IsVisible() then + Station.SetFocusWindow(hFrame) + end + end + end) + + DoFilterBank() + DoCompareBank() + DoFilterGuildBank() + DoCompareGuildBank() +end + +local function Unhook() + local frame = Station.Lookup('Normal/BigBagPanel') + if frame and frame.bMYBagExHook then + frame.bMYBagExHook = nil + if frame:Lookup('WndEditBox_KeyWord') then + frame:Lookup('WndEditBox_KeyWord'):Destroy() + end + UnhookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown) + end + + local frame = Station.Lookup('Normal/BigBankPanel') + if frame and frame.bMYBagExHook then + frame.bMYBagExHook = nil + for _, v in ipairs({ + 'CheckBox_TimeLtd', + 'WndEditBox_KeyWord', + 'WndCheckBox_Compare', + }) do + local el = frame:Lookup(v) + if el then + el:Destroy() + end + end + UnhookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown) + end + + local frame = Station.Lookup('Normal/GuildBankPanel') + if frame and frame.bMYBagExHook then + frame.bMYBagExHook = nil + for _, v in ipairs({ + 'WndEditBox_KeyWord', + 'WndCheckBox_Compare', + }) do + local el = frame:Lookup(v) + if el then + el:Destroy() + end + end + UnhookTableFunc(frame, 'OnFrameKeyDown', OnFrameKeyDown) + end + + X.RegisterEvent('EXECUTE_BINDING', 'MY_BAGEX') +end + +local function Apply(bEnable) + if bEnable and not X.IsRestricted('MY_BagEx_GenericFilters') then + Hook() + X.RegisterFrameCreate('BigBagPanel', 'MY_BAGEX', Hook) + X.RegisterFrameCreate('BigBankPanel', 'MY_BAGEX', Hook) + X.RegisterFrameCreate('GuildBankPanel', 'MY_BAGEX', Hook) + else + Unhook() + X.RegisterFrameCreate('BigBagPanel', 'MY_BAGEX', false) + X.RegisterFrameCreate('BigBankPanel', 'MY_BAGEX', false) + X.RegisterFrameCreate('GuildBankPanel', 'MY_BAGEX', false) + end +end + +function D.Enable(bEnable) + O.bEnable = bEnable + Apply(bEnable) +end + +do +local function OnBagItemUpdate() + if l_bCompareBank then + DoCompareBank() + elseif l_bCompareGuild then + DoCompareGuildBank() + else + DoFilterBag() + DoFilterBank() + DoFilterGuildBank() + end +end +X.RegisterEvent({'BAG_ITEM_UPDATE', 'GUILD_BANK_PANEL_UPDATE', 'LOADING_END'}, function() + if not O.bEnable then + return + end + X.DelayCall('MY_BagEx_GenericFilters', 100, OnBagItemUpdate) +end) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + if not X.IsRestricted('MY_BagEx_GenericFilters') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Generic package searcher and filters'], + checked = O.bEnable, + onCheck = function(bChecked) + D.Enable(bChecked) + end, + }):AutoWidth():Width() + 5 + nX = nPaddingX + nY = nY + nLH + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_GenericFilters', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_BagEx_GenericFilters = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- +X.RegisterUserSettingsInit('MY_BAGEX', function() + Apply(O.bEnable) +end) +X.RegisterReload('MY_BAGEX', function() Apply(false) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_GuildBank.lua b/MY_BagEx/src/MY_BagEx_GuildBank.lua new file mode 100644 index 000000000..5ffd7d9b4 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_GuildBank.lua @@ -0,0 +1,111 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包堆叠 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_GuildBank' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_GuildBank' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['GuildBank'], + _L['Guild package sort and stack'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bConfirm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_BagEx'], + szDescription = X.MakeCaption({ + _L['GuildBank'], + _L['Sort need confirm'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +-- 检测冲突 +function D.CheckConflict(bRestore) +end + +function D.OnEnableChange() + D.CheckConflict() + MY_BagEx_GuildBankSort.CheckInjection() + MY_BagEx_GuildBankStack.CheckInjection() +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Guild package sort and stack'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.OnEnableChange() + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Need confirm'], + checked = O.bConfirm, + onCheck = function(bChecked) + O.bConfirm = bChecked + end, + autoEnable = function() return O.bEnable end, + }):AutoWidth():Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_GuildBank', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + { + fields = { + 'bEnable', + 'bConfirm', + }, + root = O, + }, + }, +} +MY_BagEx_GuildBank = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_BagEx_GuildBank', function() D.CheckConflict() end) +X.RegisterFrameCreate('BigBagPanel', 'MY_BagEx_GuildBank', function() D.CheckConflict() end) +X.RegisterReload('MY_BagEx_GuildBank', function() D.CheckConflict(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_GuildBankSort.lua b/MY_BagEx/src/MY_BagEx_GuildBankSort.lua new file mode 100644 index 000000000..1161d0f63 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_GuildBankSort.lua @@ -0,0 +1,325 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仓库整理 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_GuildBankSort' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_GuildBankSort' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate(bRandom, bExportBlueprint, aBlueprint) + local hFrame = Station.Lookup('Normal/GuildBankPanel') + if not hFrame then + return + end + local nPage, szState = hFrame.nPage or 0, 'Idle' + local dwBox = X.CONSTANT.INVENTORY_GUILD_BANK_LIST[nPage + 1] + -- 加载格子列表 + local me, aItemDesc, nItemCount, aBoxPos = X.GetClientPlayer(), {}, 0, {} + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local kItem = X.GetInventoryItem(me, dwBox, dwX) + local tDesc = MY_BagEx.GetItemDesc(kItem) + if not X.IsEmpty(tDesc) then + nItemCount = nItemCount + 1 + end + table.insert(aItemDesc, tDesc) + table.insert(aBoxPos, { dwBox = dwBox, dwX = dwX }) + end + -- 导出布局 + if bExportBlueprint then + X.UI.OpenTextEditor(MY_BagEx.EncodeItemDescList(aItemDesc)) + return + end + -- 没物品不需要操作 + if nItemCount == 0 then + return + end + -- 导入布局 + if aBlueprint then + for nIndex, tDesc in ipairs(aItemDesc) do + aItemDesc[nIndex] = aBlueprint[nIndex] or MY_BagEx.GetItemDesc() + end + else + -- 排序格子列表 + if bRandom then + for nIndex = 1, #aItemDesc do + local nExcIndex = X.Random(1, #aItemDesc) + if nIndex ~= nExcIndex then + aItemDesc[nIndex], aItemDesc[nExcIndex] = aItemDesc[nExcIndex], aItemDesc[nIndex] + end + end + else + table.sort(aItemDesc, MY_BagEx.ItemDescSorter) + end + end + -- 结束清理环境、恢复控件状态 + local function fnFinish() + szState = 'Idle' + X.RegisterEvent('TONG_EVENT_NOTIFY', 'MY_BagEx_GuildBankSort__Sort', false) + X.RegisterEvent('UPDATE_TONG_REPERTORY_PAGE', 'MY_BagEx_GuildBankSort__Sort', false) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + -- 根据排序结果与当前状态交换物品 + local nIndex, bChanged = 1, false + local function fnNext() + if not hFrame or (hFrame.nPage or 0) ~= nPage then + X.OutputSystemAnnounceMessage(_L['Guild box closed or page changed, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + if szState == 'Exchanging' or szState == 'Refreshing' then + return + end + while nIndex <= #aItemDesc do + local tDesc = aItemDesc[nIndex] + local tBoxPos = aBoxPos[nIndex] + local dwBox, dwX = tBoxPos.dwBox, tBoxPos.dwX + local kCurItem = X.GetInventoryItem(me, dwBox, dwX) + local tCurDesc = MY_BagEx.GetItemDesc(kCurItem) + -- 当前格子和预期不符 需要交换 + if MY_BagEx.IsSameItemDesc(tDesc, tCurDesc) then + nIndex = nIndex + 1 + else + local tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc + -- 寻找预期物品所在位置 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if MY_BagEx.IsSameItemDesc(tDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + bChanged = true + end + end + -- 寻找堆叠数不同的预期物品所在位置 + if not dwExcBox then + for nExcIndex = nIndex, #aBoxPos do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到预期物品所在位置 + if MY_BagEx.IsSameItemDesc(tDesc, tExcDesc, true) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + end + -- 符合要求不用交換 + if dwBox == dwExcBox and dwX == dwExcX then + nIndex = nIndex + 1 + X.DelayCall(fnNext) + return + end + -- 当前格子和预期物品可堆叠 先拿个别的东西替换过来否则会导致物品合并 + if dwExcBox and MY_BagEx.CanItemDescStack(tCurDesc, tDesc) then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + tExcDesc = MY_BagEx.GetItemDesc(kExcItem) + -- 匹配到用于交换的格子 + if not MY_BagEx.CanItemDescStack(tCurDesc, tExcDesc) then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Guild bank item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, guild bank is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + -- 还是没有匹配到 将当前物品找个空格子移走 + if not dwExcBox then + for nExcIndex = #aBoxPos, nIndex + 1, -1 do + tExcBoxPos = aBoxPos[nExcIndex] + dwExcBox, dwExcX = tExcBoxPos.dwBox, tExcBoxPos.dwX + kExcItem = X.GetInventoryItem(me, dwExcBox, dwExcX) + -- 匹配到用于交换的格子 + if not kExcItem then + break + end + tExcBoxPos, dwExcBox, dwExcX, kExcItem, tExcDesc = nil, nil, nil, nil, nil + end + if not dwExcBox then + local szMsg = bChanged + and _L['Guild bank item changed, sort finished, result may not be perfect!'] + or _L['Cannot find item temp position, guild bank is full, sort exited!'] + X.OutputSystemAnnounceMessage(szMsg, X.CONSTANT.MSG_THEME.ERROR) + return fnFinish() + end + end + szState = 'Exchanging' + if kCurItem then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_GuildBankSort', 'ExchangeItem: GUILD,' .. dwX .. ' <-> ' .. 'GUILD,' .. dwExcX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwExcBox, dwExcX) + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_GuildBankSort', 'ExchangeItem: GUILD,' .. dwExcX .. ' <-> ' .. 'GUILD,' .. dwX .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwExcBox, dwExcX, dwBox, dwX) + end + return + end + end + fnFinish() + end + X.RegisterEvent('UPDATE_TONG_REPERTORY_PAGE', 'MY_BagEx_GuildBankSort__Sort', function() + if szState == 'Refreshing' then + szState = 'Idle' + fnNext() + end + end) + X.RegisterEvent('TONG_EVENT_NOTIFY', 'MY_BagEx_GuildBankSort__Sort', function() + -- TONG_EVENT_CODE.TAKE_REPERTORY_ITEM_PERMISSION_DENY_ERROR + if arg0 == TONG_EVENT_CODE.EXCHANGE_REPERTORY_ITEM_SUCCESS then + szState = 'Refreshing' + elseif arg0 == TONG_EVENT_CODE.PUT_ITEM_IN_REPERTORY_SUCCESS then + X.OutputSystemAnnounceMessage(_L['Put item in guild detected, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + else + X.OutputSystemAnnounceMessage(_L['Unknown exception occurred, sort exited!'], X.CONSTANT.MSG_THEME.ERROR) + fnFinish() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_GuildBankSort', 'TONG_EVENT_NOTIFY: ' .. arg0, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + end) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + fnNext() +end + +-- 检测增加按纽 +function D.CheckInjection(bRemoveInjection) + if not bRemoveInjection and MY_BagEx_GuildBank.bEnable and not X.IsInInventoryPackageLimitedMap() then + -- 植入整理按纽 + local hFrame = Station.Lookup('Normal/GuildBankPanel') + if not hFrame then + return + end + local hBtnRef = hFrame:Lookup('Btn_Refresh') + local hBtnNew = hFrame:Lookup('Btn_MY_Sort') + if hBtnRef then + if not hBtnNew then + local nX, nY = hBtnRef:GetRelPos() + local nW, nH = hBtnRef:GetSize() + hBtnNew = X.UI('Normal/GuildBankPanel') + :Append('WndButton', { + name = 'Btn_MY_Sort', + x = nX - nW, y = nY, w = nW, h = nH, + text = _L['Sort'], + tip = { + render = _L['Press shift for random, right click to import and export'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onLClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TONG_REPERTORY) then + X.OutputSystemAnnounceMessage(_L['Please unlock mibao first.']) + return + end + local bRandom = IsShiftKeyDown() + if MY_BagEx_GuildBank.bConfirm then + X.Confirm('MY_BagEx_GuildBankSort', _L['Sure to start guild bank sort?'], { + x = hFrame:GetAbsX() + hFrame:GetW() / 2, + y = hFrame:GetAbsY() + hFrame:GetH() / 2, + fnResolve = function() D.Operate(bRandom) end, + fnAutoClose = function() return not hFrame or not hFrame:IsVisible() end, + }) + else + D.Operate(bRandom) + end + end, + menuRClick = function() + return { + { + szOption = _L['Export blueprint'], + fnAction = function() + D.Operate(false, true) + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Import blueprint'], + fnAction = function() + GetUserInput(_L['Please input blueprint'], function(szBlueprint) + local aBlueprint = MY_BagEx.DecodeItemDescList(szBlueprint) + if aBlueprint then + D.Operate(false, false, aBlueprint) + else + X.OutputSystemAnnounceMessage(_L['Invalid blueprint data']) + end + end, nil, nil, nil, '') + end, + }, + } + end, + }) + :Raw() + end + end + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_GuildBankSort__Injection', function() + if not hBtnNew then + return + end + hBtnNew:Enable(not arg0) + end) + else + -- 移除整理按纽 + X.UI('Normal/GuildBankPanel/Btn_MY_Sort'):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_GuildBankSort__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_GuildBankSort', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_GuildBankSort = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_BagEx_GuildBankSort', function() D.CheckInjection() end) +X.RegisterFrameCreate('GuildBankPanel', 'MY_BagEx_GuildBankSort', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_GuildBankSort', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/MY_BagEx_GuildBankStack.lua b/MY_BagEx/src/MY_BagEx_GuildBankStack.lua new file mode 100644 index 000000000..081e2f421 --- /dev/null +++ b/MY_BagEx/src/MY_BagEx_GuildBankStack.lua @@ -0,0 +1,155 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仓库堆叠 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/MY_BagEx_GuildBankStack' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx_GuildBankStack' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], {}) +local D = {} + +function D.Operate() + local frame = Station.Lookup('Normal/GuildBankPanel') + if not frame then + return + end + local nPage = frame.nPage or 0 + local dwBox = X.CONSTANT.INVENTORY_GUILD_BANK_LIST[nPage + 1] + local bTrigger + local fnFinish = function() + X.RegisterEvent('TONG_EVENT_NOTIFY', 'MY_BagEx_GuildBankStack__Stack', false) + X.RegisterEvent('UPDATE_TONG_REPERTORY_PAGE', 'MY_BagEx_GuildBankStack__Stack', false) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', false) + end + local function fnNext() + bTrigger = true + local me, tList = X.GetClientPlayer(), {} + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local kItem = X.GetInventoryItem(me, dwBox, dwX) + if kItem and kItem.bCanStack and kItem.nStackNum < kItem.nMaxStackNum then + local szKey = X.GetItemKey(kItem) .. '_' .. (kItem.bBind and '1' or '0') + local tPos = tList[szKey] + if tPos then + local dwBox1, dwX1 = tPos.dwBox, tPos.dwX + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_BagEx_GuildBankStack', 'ExchangeItem: ' ..dwBox .. ',' .. dwX .. ' <-> ' ..dwBox1 .. ',' .. dwX1 .. ' ', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.ExchangeInventoryItem(dwBox, dwX, dwBox1, dwX1) + return + else + tList[szKey] = { dwBox = dwBox, dwX = dwX } + end + end + end + fnFinish() + end + X.RegisterEvent('UPDATE_TONG_REPERTORY_PAGE', 'MY_BagEx_GuildBankStack__Stack', fnNext) + X.RegisterEvent('TONG_EVENT_NOTIFY', 'MY_BagEx_GuildBankStack__Stack', function() + -- TONG_EVENT_CODE.TAKE_REPERTORY_ITEM_PERMISSION_DENY_ERROR + if arg0 == TONG_EVENT_CODE.PUT_ITEM_IN_REPERTORY_SUCCESS then + fnFinish() + end + end) + X.DelayCall(1000, function() + if not bTrigger then + fnFinish() + end + end) + FireUIEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', true) + fnNext() + bTrigger = false +end + +-- 检测堆叠按纽 +function D.CheckInjection(bRemoveInjection) + if not bRemoveInjection and MY_BagEx_GuildBank.bEnable and not X.IsInInventoryPackageLimitedMap() then + -- 植入堆叠按纽 + local frame = Station.Lookup('Normal/GuildBankPanel') + if not frame then + return + end + local btnRef = frame:Lookup('Btn_MY_Sort') or frame:Lookup('Btn_Refresh') + local btnNew = frame:Lookup('Btn_MY_Stack') + if btnRef then + if not btnNew then + local nX, nY = btnRef:GetRelPos() + local nW, nH = btnRef:GetSize() + btnNew = X.UI('Normal/GuildBankPanel') + :Append('WndButton', { + name = 'Btn_MY_Stack', + x = nX - nW, y = nY, w = nW, h = nH, + text = _L['Stack'], + onClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TONG_REPERTORY) then + X.OutputSystemAnnounceMessage(_L['Please unlock mibao first.']) + return + end + if MY_BagEx_GuildBank.bConfirm then + X.Confirm('MY_BagEx_GuildBankStack', _L['Sure to start guild bank stack?'], { + x = frame:GetAbsX() + frame:GetW() / 2, + y = frame:GetAbsY() + frame:GetH() / 2, + fnResolve = D.Operate, + fnAutoClose = function() return not frame or not frame:IsVisible() end, + }) + else + D.Operate() + end + end, + }) + :Raw() + end + end + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_GuildBankStack__Injection', function() + if not btnNew then + return + end + btnNew:Enable(not arg0) + end) + else + -- 移除堆叠整理按纽] + X.UI('Normal/GuildBankPanel/Btn_MY_Stack'):Remove() + X.RegisterEvent('MY_BAG_EX__SORT_STACK_PROGRESSING', 'MY_BagEx_GuildBankStack__Injection', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BagEx_GuildBankStack', + exports = { + { + fields = { + CheckInjection = D.CheckInjection, + }, + }, + }, +} +MY_BagEx_GuildBankStack = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_BagEx_GuildBankStack', function() D.CheckInjection() end) +X.RegisterFrameCreate('GuildBankPanel', 'MY_BagEx_GuildBankStack', function() D.CheckInjection() end) +X.RegisterReload('MY_BagEx_GuildBankStack', function() D.CheckInjection(true) end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_BagEx/src/PS.lua b/MY_BagEx/src/PS.lua new file mode 100644 index 000000000..08428b43d --- /dev/null +++ b/MY_BagEx/src/PS.lua @@ -0,0 +1,43 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_BagEx/PS' +local PLUGIN_NAME = 'MY_BagEx' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_BagEx' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local PS = { nPriority = 1 } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 25, 25 + local nW, nH = ui:Size() + local nX, nY = nPaddingX, nPaddingY + local nLH = 28 + + nX, nY = MY_BagEx_GenericFilters.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_BagEx_Bag.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_BagEx_Bank.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + nY = nY + nLH + nX, nY = MY_BagEx_GuildBank.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + nY = nY + nLH + nX, nY = MY_BagEx_BagNewItem.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) +end +X.Panel.Register(_L['General'], 'MY_BagEx', _L['MY_BagEx'], 374, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/config/cataclysm/zhcn.jx3dat b/MY_Cataclysm/config/cataclysm/zhcn.jx3dat new file mode 100644 index 000000000..ff8613200 --- /dev/null +++ b/MY_Cataclysm/config/cataclysm/zhcn.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = 'CATACLYSM', + eFrameStyle = 'CATACLYSM', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 1, -- 0 不着色 1 根据距离 2 根据门派 + nColoredName = 1, + nNameVAlignment = 0, + nNameHAlignment = 0, + nHPShownMode2 = 2, + nHPShownNumMode = 1, + nHPVAlignment = 2, + nHPHAlignment = 2, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 40, + nLifeFont = 15, + nManaFont = 190, + fNameFontScale = 1.05, + fLifeFontScale = 1.05, + fManaFontScale = 1, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 1.1, + fScaleY = 1.0, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 五毒醉舞提示 万花距离提示 晚点做 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 绿 + { 0, 180, 52 }, -- 绿 + -- 免得被说乱 + -- { 230, 170, 40 }, -- 黄 + { 230, 80, 80 }, -- 红 + { 230, 80, 80 }, -- 红 + }, + tOtherCol = { + { 255, 255, 255 }, + { 110, 110, 110 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255, + 110, + }, + tOtherAlpha = { + 0, + 255, -- 不在线 + 110, -- 出同步范围 + }, +} diff --git a/MY_Cataclysm/config/cataclysm/zhtw.jx3dat b/MY_Cataclysm/config/cataclysm/zhtw.jx3dat new file mode 100644 index 000000000..543d260aa --- /dev/null +++ b/MY_Cataclysm/config/cataclysm/zhtw.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = 'CATACLYSM', + eFrameStyle = 'CATACLYSM', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 1, -- 0 涓嶈憲鑹 1 鏍规摎璺濋洟 2 鏍规摎闁娲 + nColoredName = 1, + nNameVAlignment = 0, + nNameHAlignment = 0, + nHPShownMode2 = 2, + nHPShownNumMode = 1, + nHPVAlignment = 2, + nHPHAlignment = 2, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 40, + nLifeFont = 15, + nManaFont = 190, + fNameFontScale = 1.05, + fLifeFontScale = 1.05, + fManaFontScale = 1, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 1.1, + fScaleY = 1.0, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 浜旀瘨閱夎垶鎻愮ず 钀姳璺濋洟鎻愮ず 鏅氶粸鍋 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 缍 + { 0, 180, 52 }, -- 缍 + -- 鍏嶅緱琚浜 + -- { 230, 170, 40 }, -- 榛 + { 230, 80, 80 }, -- 绱 + { 230, 80, 80 }, -- 绱 + }, + tOtherCol = { + { 255, 255, 255 }, + { 110, 110, 110 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255, + 110, + }, + tOtherAlpha = { + 0, + 255, -- 涓嶅湪绶 + 110, -- 鍑哄悓姝ョ瘎鍦 + }, +} diff --git a/MY_Cataclysm/config/default/zhcn.jx3dat b/MY_Cataclysm/config/default/zhcn.jx3dat new file mode 100644 index 000000000..519b5bd34 --- /dev/null +++ b/MY_Cataclysm/config/default/zhcn.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = '', + eFrameStyle = 'CATACLYSM', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 1, -- 0 不着色 1 根据距离 2 根据门派 + nColoredName = 1, + nNameVAlignment = 0, + nNameHAlignment = 0, + nHPShownMode2 = 2, + nHPShownNumMode = 3, + nHPVAlignment = 2, + nHPHAlignment = 2, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 40, + nLifeFont = 15, + nManaFont = 190, + fNameFontScale = 1.05, + fLifeFontScale = 1.05, + fManaFontScale = 1, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 1.1, + fScaleY = 1.0, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 五毒醉舞提示 万花距离提示 晚点做 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 绿 + { 0, 180, 52 }, -- 绿 + -- 免得被说乱 + -- { 230, 170, 40 }, -- 黄 + { 230, 80, 80 }, -- 红 + { 230, 80, 80 }, -- 红 + }, + tOtherCol = { + { 255, 255, 255 }, + { 110, 110, 110 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255, + 110, + }, + tOtherAlpha = { + 0, + 255, -- 不在线 + 110, -- 出同步范围 + }, +} diff --git a/MY_Cataclysm/config/default/zhtw.jx3dat b/MY_Cataclysm/config/default/zhtw.jx3dat new file mode 100644 index 000000000..849537ae2 --- /dev/null +++ b/MY_Cataclysm/config/default/zhtw.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = '', + eFrameStyle = 'CATACLYSM', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 1, -- 0 涓嶈憲鑹 1 鏍规摎璺濋洟 2 鏍规摎闁娲 + nColoredName = 1, + nNameVAlignment = 0, + nNameHAlignment = 0, + nHPShownMode2 = 2, + nHPShownNumMode = 3, + nHPVAlignment = 2, + nHPHAlignment = 2, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 40, + nLifeFont = 15, + nManaFont = 190, + fNameFontScale = 1.05, + fLifeFontScale = 1.05, + fManaFontScale = 1, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 1.1, + fScaleY = 1.0, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 浜旀瘨閱夎垶鎻愮ず 钀姳璺濋洟鎻愮ず 鏅氶粸鍋 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 缍 + { 0, 180, 52 }, -- 缍 + -- 鍏嶅緱琚浜 + -- { 230, 170, 40 }, -- 榛 + { 230, 80, 80 }, -- 绱 + { 230, 80, 80 }, -- 绱 + }, + tOtherCol = { + { 255, 255, 255 }, + { 110, 110, 110 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255, + 110, + }, + tOtherAlpha = { + 0, + 255, -- 涓嶅湪绶 + 110, -- 鍑哄悓姝ョ瘎鍦 + }, +} diff --git a/MY_Cataclysm/config/official/zhcn.jx3dat b/MY_Cataclysm/config/official/zhcn.jx3dat new file mode 100644 index 000000000..ae61ff89d --- /dev/null +++ b/MY_Cataclysm/config/official/zhcn.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = 'OFFICIAL', + eFrameStyle = 'OFFICIAL', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 3, -- 0 不着色 1 根据距离 2 根据门派 3官方着色 + nColoredName = 0, + nNameVAlignment = 0, + nNameHAlignment = 1, + nHPShownMode2 = 2, + nHPShownNumMode = 3, + nHPVAlignment = 2, + nHPHAlignment = 1, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 234, + nLifeFont = 212, + nManaFont = 190, + fNameFontScale = 1, + fLifeFontScale = 1, + fManaFontScale = 0.7, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 0.8, + fScaleY = 0.85, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 五毒醉舞提示 万花距离提示 晚点做 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 绿 + { 0, 180, 52 }, -- 绿 + -- 免得被说乱 + -- { 230, 170, 40 }, -- 黄 + { 230, 80, 80 }, -- 红 + { 230, 80, 80 }, -- 红 + }, + tOtherCol = { + { 255, 255, 255 }, + { 128, 128, 128 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255 * 0.8, + 255 * 0.4, + }, + tOtherAlpha = { + 0, + 0, -- 不在线 + 255 * 0.2, -- 出同步范围 + }, +} diff --git a/MY_Cataclysm/config/official/zhtw.jx3dat b/MY_Cataclysm/config/official/zhtw.jx3dat new file mode 100644 index 000000000..2bc22b9b1 --- /dev/null +++ b/MY_Cataclysm/config/official/zhtw.jx3dat @@ -0,0 +1,95 @@ +return { + eCss = 'OFFICIAL', + eFrameStyle = 'OFFICIAL', + bDrag = true, + bShowInRaid = false, + bEditMode = false, + bShowAllGrid = false, + tAnchor = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + nAutoLinkMode = 5, + nBGColorMode = 3, -- 0 涓嶈憲鑹 1 鏍规摎璺濋洟 2 鏍规摎闁娲 3瀹樻柟钁楄壊 + nColoredName = 0, + nNameVAlignment = 0, + nNameHAlignment = 1, + nHPShownMode2 = 2, + nHPShownNumMode = 3, + nHPVAlignment = 2, + nHPHAlignment = 1, + bShowHPDecimal = true, + bBuffAboveMana = true, + nShowMP = false, + bHPHitAlert = true, + nShowIcon = 2, + bShowDistance = false, + bShowBossTarget = true, + bShowBossFocus = false, + bEnableDistance = true, + bEnableImportantSkill = true, + bShowTargetTargetAni = false, + nNameFont = 234, + nLifeFont = 212, + nManaFont = 190, + fNameFontScale = 1, + fLifeFontScale = 1, + fManaFontScale = 0.7, + nMaxShowBuff = 4, + bLifeGradient = true, + bManaGradient = true, + nAlpha = 220, + fBuffScale = 1, + bAutoBuffSize = true, + bAltView = false, + bAltViewInFight = false, + bHideTipInFight = false, + bShowTipAtRightBottom = false, + bTempTargetEnable = false, + nTempTargetDelay = 0, + fScaleX = 0.8, + fScaleY = 0.85, + nDrawInterval = 4, + bFasterHP = false, + bStaring = false, + bShowBuffTime = true, + bShowBuffNum = true, + bShowBuffReminder = true, + bBuffAltPublish = true, + bBuffPushToOfficial = true, + bBuffDataTeamMon = true, + bShowAttention = true, + bShowCaution = true, + bShowScreenHead = true, + bShowGroupNumber = true, + bShowEffect = false, -- 浜旀瘨閱夎垶鎻愮ず 钀姳璺濋洟鎻愮ず 鏅氶粸鍋 + bShowSputtering = false, + tSputteringFontColor = { 79, 255, 108 }, + nSputteringFontAlpha = 192, + tSputteringShadowColor = { 79, 255, 108 }, + nSputteringShadowAlpha = 192, + nSputteringDistance = 15, + aBuffList = {}, + tDistanceLevel = { 20, 22, 200 }, + tManaColor = { 0, 96, 255 }, + tDistanceCol = { + { 0, 180, 52 }, -- 缍 + { 0, 180, 52 }, -- 缍 + -- 鍏嶅緱琚浜 + -- { 230, 170, 40 }, -- 榛 + { 230, 80, 80 }, -- 绱 + { 230, 80, 80 }, -- 绱 + }, + tOtherCol = { + { 255, 255, 255 }, + { 128, 128, 128 }, + { 192, 192, 192 }, + }, + tDistanceAlpha = { + 255, + 255 * 0.8, + 255 * 0.4, + }, + tOtherAlpha = { + 0, + 0, -- 涓嶅湪绶 + 255 * 0.2, -- 鍑哄悓姝ョ瘎鍦 + }, +} diff --git a/MY_Cataclysm/images/Cataclysm.Tga b/MY_Cataclysm/images/Cataclysm.Tga new file mode 100644 index 000000000..7a7d9c894 Binary files /dev/null and b/MY_Cataclysm/images/Cataclysm.Tga differ diff --git a/MY_Cataclysm/images/Cataclysm.UITex b/MY_Cataclysm/images/Cataclysm.UITex new file mode 100644 index 000000000..8f1a4ca12 Binary files /dev/null and b/MY_Cataclysm/images/Cataclysm.UITex differ diff --git a/MY_Cataclysm/images/Cataclysm.txt b/MY_Cataclysm/images/Cataclysm.txt new file mode 100644 index 000000000..806595693 --- /dev/null +++ b/MY_Cataclysm/images/Cataclysm.txt @@ -0,0 +1,9 @@ +Farme Left Top Width High File +0 18 36 16 16 C:\Users\Webster\Desktop\CTM\B.tga +1 0 36 16 16 C:\Users\Webster\Desktop\CTM\BL.tga +2 36 36 16 16 C:\Users\Webster\Desktop\CTM\BR.tga +3 0 18 16 16 C:\Users\Webster\Desktop\CTM\L.tga +4 36 18 16 16 C:\Users\Webster\Desktop\CTM\R.tga +5 18 0 16 16 C:\Users\Webster\Desktop\CTM\T.tga +6 0 0 16 16 C:\Users\Webster\Desktop\CTM\TL.tga +7 36 0 16 16 C:\Users\Webster\Desktop\CTM\TR.tga diff --git a/MY_Cataclysm/images/ForceColorBox.Tga b/MY_Cataclysm/images/ForceColorBox.Tga new file mode 100644 index 000000000..4dd7f192c Binary files /dev/null and b/MY_Cataclysm/images/ForceColorBox.Tga differ diff --git a/MY_Cataclysm/images/ForceColorBox.UITex b/MY_Cataclysm/images/ForceColorBox.UITex new file mode 100644 index 000000000..79b3be4d3 Binary files /dev/null and b/MY_Cataclysm/images/ForceColorBox.UITex differ diff --git a/MY_Cataclysm/images/border.Tga b/MY_Cataclysm/images/border.Tga new file mode 100644 index 000000000..55966ae01 Binary files /dev/null and b/MY_Cataclysm/images/border.Tga differ diff --git a/MY_Cataclysm/images/border.UITex b/MY_Cataclysm/images/border.UITex new file mode 100644 index 000000000..34b648a35 Binary files /dev/null and b/MY_Cataclysm/images/border.UITex differ diff --git a/MY_Cataclysm/images/border.txt b/MY_Cataclysm/images/border.txt new file mode 100644 index 000000000..5ed8645fd --- /dev/null +++ b/MY_Cataclysm/images/border.txt @@ -0,0 +1,6 @@ +Farme Left Top Width High File +0 0 0 550 200 C:\Users\Webster\Desktop\边框2 0106\blue.tga +1 0 202 550 200 C:\Users\Webster\Desktop\边框2 0106\orange.tga +2 0 404 550 200 C:\Users\Webster\Desktop\边框2 0106\pink.tga +3 0 606 550 200 C:\Users\Webster\Desktop\边框2 0106\red.tga +4 0 808 550 200 C:\Users\Webster\Desktop\边框2 0106\yellow.tga diff --git a/MY_Cataclysm/info.ini b/MY_Cataclysm/info.ini new file mode 100644 index 000000000..15e3c7e90 --- /dev/null +++ b/MY_Cataclysm/info.ini @@ -0,0 +1,15 @@ +[MY_Cataclysm] +name=团队面板 +desc=团队框架,更好用的团队面板 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_Cataclysm.lua +lua_1=src/MY_CataclysmParty.lua +lua_2=src/MY_CataclysmMain.lua +lua_3=src/MY_CataclysmPS.Main.lua +lua_4=src/MY_CataclysmPS.GridStyle.lua +lua_5=src/MY_CataclysmPS.GridColor.lua +lua_6=src/MY_CataclysmPS.Interface.lua +lua_7=src/MY_CataclysmPS.BuffMonitor.lua diff --git a/MY_Cataclysm/info.ini.zh_TW b/MY_Cataclysm/info.ini.zh_TW new file mode 100644 index 000000000..f679e5c1b --- /dev/null +++ b/MY_Cataclysm/info.ini.zh_TW @@ -0,0 +1,15 @@ +[MY_Cataclysm] +name=鍦橀殜闈㈡澘 +desc=鍦橀殜妗嗘灦锛屾洿濂界敤鐨勫湗闅婇潰鏉 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_Cataclysm.lua +lua_1=src/MY_CataclysmParty.lua +lua_2=src/MY_CataclysmMain.lua +lua_3=src/MY_CataclysmPS.Main.lua +lua_4=src/MY_CataclysmPS.GridStyle.lua +lua_5=src/MY_CataclysmPS.GridColor.lua +lua_6=src/MY_CataclysmPS.Interface.lua +lua_7=src/MY_CataclysmPS.BuffMonitor.lua diff --git a/MY_Cataclysm/lang/default.jx3dat b/MY_Cataclysm/lang/default.jx3dat new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/MY_Cataclysm/lang/default.jx3dat @@ -0,0 +1 @@ +return {} diff --git a/MY_Cataclysm/lang/zhcn.jx3dat b/MY_Cataclysm/lang/zhcn.jx3dat new file mode 100644 index 000000000..d7f27fdbf --- /dev/null +++ b/MY_Cataclysm/lang/zhcn.jx3dat @@ -0,0 +1,183 @@ +return { + -- MY_CataclysmMain.lua -- + ['MY_Cataclysm'] = '团队面板', + ['Open team countdown'] = '团队倒计时', + ['Interface settings'] = '界面设置', + ['Upload team snapshot'] = '团队快照上传', + ['Cataclysm'] = '团队面板', + ['Please hold down Ctrl, change it'] = '请按住Ctrl来更改分配模式。', + ['Enable Cataclysm Team Panel'] = '启用团队面板', + ['Only in team'] = '只在团队中显示', + ['Show distance'] = '显示距离', + ['Show central party member tag'] = '溅射助手', + ['Show color on right top pos of central member of each party'] = '在溅射小队成员数量最多的角色右上角显示标记', + ['Set sputtering distance'] = '设置溅射距离', + ['Set sputtering font color'] = '设置文字颜色', + ['Set sputtering font alpha'] = '设置文字透明度', + ['Set sputtering shadow color'] = '设置背景颜色', + ['Set sputtering shadow alpha'] = '设置背景透明度', + ['Show ManaCount'] = '显示内力数值', + ['Show target\'s target'] = '显示目标的目标', + ['Show Boss target'] = '显示首领目标', + ['Show Boss focus'] = '显示首领点名', + ['Attack Warning'] = '被攻击提示', + ['Show attention shadow'] = '显示警告色', + ['Show caution animate'] = '显示警告特效', + ['Show screen head'] = '显示头顶警告', + ['Show important skill'] = '显示重要招式调息状态', + ['ZuiWu Effect'] = '醉舞范围', + ['Show effect when teammate get ZuiWu, only your ZuiWu will be showen while you\'re BuTianJue.'] = '显示受到醉舞治疗的队友特效,当你的心法为补天诀时将仅显示受到你的醉舞效果治疗的队友。', + ['Name/Icon/Mana/Life Display'] = '名字、图标、内力和血量显示方案', + ['Life font'] = '血量字体', + ['Name font'] = '名字字体', + ['Font scale'] = '字体缩放', + ['Show Format value'] = '显示精简数值', + ['Show Percentage value'] = '显示百分比数', + ['Show full value'] = '显示具体数值', + ['Show Icon Mode'] = '图标显示方案', + ['Show Force Icon'] = '显示门派图标', + ['Show Camp Icon'] = '显示阵营图标', + ['Show Text Force'] = '文字心法', + ['Color settings'] = '文字&颜色&距离', + ['LifeBar Gradient'] = '血条渐变色', + ['ManaBar Gradient'] = '蓝条渐变色', + ['Colored as official team frame'] = '官方着色', + ['Colored according to the distance'] = '按距离着色', + ['Name'] = '名字', + ['Colored by...'] = '着色方式', + ['Name colored by force'] = '名字门派着色', + ['Name colored by camp'] = '名字阵营着色', + ['Name without color'] = '名字不着色', + ['Colored all the same'] = '单色着色', + ['Edit Distance Level'] = '编辑距离等级', + ['distance, distance, ...'] = '8,20,22,24,30, ...', + ['Distance color'] = '距离颜色', + ['Other color'] = '其他状态颜色', + ['Distance alpha'] = '距离透明度', + ['Other alpha'] = '其他状态透明度', + ['Font Style'] = '文字样式设置', + ['Restore Default'] = '恢复默认', + ['Interface Width'] = '界面宽度比例', + ['Interface Height'] = '界面高度比例', + ['Arrangement'] = '排列模式', + ['One lines: 5/0'] = '一行:五列', + ['Two lines: 1/4'] = '两行:一列/四列', + ['Two lines: 2/3'] = '两行:二列/三列', + ['Two lines: 3/2'] = '两行:三列/二列', + ['Two lines: 4/1'] = '两行:四列/一列', + ['Show tip at right bottom'] = '鼠标滑过角色信息显示在屏幕右下角', + ['Don\'t show tip in fight'] = '战斗中不显示', + ['Alt view player'] = '按住ALT点击查看装备', + ['Disable in fight'] = '战斗中禁用', + ['Faster Refresh (Greater performance loss)'] = '更快的界面刷新(要求部分性能开销)', + ['Refresh every breathe call.'] = '每个逻辑帧都刷新界面显示。', + ['Ultimate Refresh HP (Greater performance loss)'] = '极快的血量刷新(要求非常多的性能开销)', + ['Refresh every render call.'] = '每个渲染帧都刷新界面显示。', + ['Grid Style'] = '格子样式', + ['Grid Color'] = '背景颜色', + ['Panel'] = '面板', + ['configure'] = '配置', + ['Max count'] = '最大显示数量', + ['Buff scale'] = '气劲缩放', + ['Auto scale'] = '自动缩放', + ['Show AllGrid'] = '显示完整的小队格子', + ['Buff settings'] = '气劲设置', + ['Buff Staring'] = '边框闪烁', + ['Show Buff Time'] = '显示剩余时间', + ['Show Buff Num'] = '显示层数', + ['Show Buff Reminder'] = '显示备注', + ['Push buff to official'] = '联动官方面板', + ['Show Group Number'] = '显示分组编号', + ['Team Members: %d, %d agree %d%%'] = '团队共%d人,%d人已同意发放工资,当前比率%d%%。', + ['Wage await %ds...'] = '工资等待确认中…(%ds)', + ['Cataclysm Team Panel'] = '团队面板', + -- MY_CataclysmParty.lua -- + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['Take back permissions'] = '收回权限', + ['Take back all permissions'] = '收回所有权限', + ['Take back leader permission'] = '收回队长权限', + ['Take back mark permission'] = '收回标记权限', + ['Take back distribute permission'] = '收回分配权限', + ['MY_GKP'] = '金团记录', + ['Please install and load GKP addon first.'] = '未检测到金团记录插件,请先返回角色选择界面进入插件管理界面,安装并加载茗伊金团记录子插件。', + ['MY_TeamTools'] = '团队工具', + ['Please install and load MY_TeamTools addon first.'] = '未检测到团队工具插件,请先返回角色选择界面进入插件管理界面,安装并加载茗伊团队工具子插件。', + ['MY_TeamNotice'] = '团队告示', + ['Please install and load MY_TeamNotice addon first.'] = '未检测到团队告示插件,请先返回角色选择界面进入插件管理界面,安装并加载茗伊团队工具子插件。', + ['MY_TeamMon_Subscribe'] = '团队监控导入数据', + ['Please install and load MY_TeamMon addon first.'] = '未检测到团队监控插件,请先返回角色选择界面进入插件管理界面,安装并加载茗伊团队监控子插件。', + ['EnvokeAllTeammates'] = '召请队友前往', + ['TeamCountdown'] = '发起团队倒计时', + ['You are not the distrubutor.'] = '你不是分配者。', + ['Interface style'] = '界面样式', + ['Official team frame style'] = '官方样式', + ['Cataclysm team frame style'] = 'Cataclysm样式', + ['Restore default'] = '恢复默认', + ['Raid style preset'] = '样式预设类型', + ['Please choose your favorite raid style.\nYou can rechoose in setting panel.'] = '请选择您喜欢的团队面板样式:\n注:您可以随时前往面板设置界面重新选择。', + ['Official style'] = '官方样式', + ['Cataclysm style'] = 'CTM样式', + ['Keep current'] = '保持现状', + ['Scale %d%%'] = '缩放%d%%', + ['Target assist delay setting'] = '延迟选中目标设置', + ['Target assist delay %dms.'] = '延迟%d毫秒选中目标。', + ['Target assist no delay.'] = '鼠标移入立即选中。', + ['Alpha: %d.'] = '透明度:%d。', + ['More than %d meter'] = '%d尺以上', + ['Alt Click Publish'] = '按住ALT点击快速发布到团队', + ['Enable official data'] = '启用官方团队气劲数据', + ['Enable MY_TeamMon data'] = '启用团队监控数据联动', + ['HP'] = '血量', + ['Mana'] = '内力', + ['Show mode'] = '显示方式', + ['Show number mode'] = '数值显示方案', + ['V alignment'] = '名字垂直对齐方式', + ['H alignment'] = '名字水平对齐方式', + ['Top'] = '上', + ['Middle'] = '中', + ['Bottom'] = '下', + ['Left'] = '左', + ['Center'] = '中', + ['Right'] = '右', + ['Show Decimal'] = '显示小数', + ['Over mana bar'] = '遮挡内力', + ['[%s] got buff [%s]x%d, remaining %ds.'] = '[%s]获得气劲【%s】x%d,剩余持续时间%d秒。', + ['Edit buff'] = '团队气劲监控', + ['Name or id'] = 'ID/名称', + ['Level'] = '等级', + ['Stacknum'] = '层数', + ['Only mine'] = '仅来源自己', + ['Only me'] = '仅监控自己', + ['Hide (Can Modify Default Data)'] = '隐藏 (可隐藏指定的默认数据)', + ['No limit'] = '不限', + ['Color'] = '颜色', + ['Left click to change color, right click to clear color'] = '左键点击设置蒙版和描边颜色,右键点击清除颜色。', + ['Left click to change screen head color, right click to clear color'] = '左键点击设置头顶报警颜色,右键点击清除颜色。', + ['Border alpha'] = '描边透明度', + ['Reminder'] = '备注', + ['Priority'] = '优先级', + ['Attention'] = '蒙版警告', + ['Caution'] = '特效警告', + ['Screen Head'] = '头顶警告', + ['Requires MY_LifeBar loaded.'] = '需加载并启用头顶血条', + ['Add'] = '添加', + ['Edit'] = '编辑', + ['Sure'] = '确定', + ['Delete'] = '删除', + ['Delete [%s]?'] = '删除[%s]?', + ['MY_Cataclysm_Buff is blocked in current kungfu, temporary disabled.'] = '当前心法禁止使用团队面板气劲监控,相关功能已暂时关闭。', + + ['Buff list'] = '气劲列表', + ['From MY_TeamMon data'] = '来自团队监控数据', + ['From official raid buff data'] = '来自官方团队气劲数据', + ['From custom data'] = '来自用户自定义数据', + + ['Would you like to use MY cataclysm?'] = '是否使用茗伊团队面板?', + ['Use'] = '使用', + ['Not use'] = '不使用', + + ['Load ancient config'] = '加载旧版数据', + ['Please input ancient config name:'] = '请输入旧版数据配置名:', + + ['Wujie online'] = '无界端在线', +} diff --git a/MY_Cataclysm/lang/zhtw.jx3dat b/MY_Cataclysm/lang/zhtw.jx3dat new file mode 100644 index 000000000..78b59f521 --- /dev/null +++ b/MY_Cataclysm/lang/zhtw.jx3dat @@ -0,0 +1,183 @@ +return { + -- MY_CataclysmMain.lua -- + ['MY_Cataclysm'] = '鍦橀殜闈㈡澘', + ['Open team countdown'] = '鍦橀殜鍊掕▓鏅', + ['Interface settings'] = '鐣岄潰瑷疆', + ['Upload team snapshot'] = '鍦橀殜蹇収涓婂偝', + ['Cataclysm'] = '鍦橀殜闈㈡澘', + ['Please hold down Ctrl, change it'] = '璜嬫寜浣廋trl渚嗘洿鏀瑰垎閰嶆ā寮忋', + ['Enable Cataclysm Team Panel'] = '鍟熺敤鍦橀殜闈㈡澘', + ['Only in team'] = '鍙湪鍦橀殜涓’绀', + ['Show distance'] = '椤ず璺濋洟', + ['Show central party member tag'] = '婵哄皠鍔╂墜', + ['Show color on right top pos of central member of each party'] = '鍦ㄦ亢灏勫皬闅婃垚鍝℃暩閲忔渶澶氱殑瑙掕壊鍙充笂瑙掗’绀烘瑷', + ['Set sputtering distance'] = '瑷疆婵哄皠璺濋洟', + ['Set sputtering font color'] = '瑷疆鏂囧瓧椤忚壊', + ['Set sputtering font alpha'] = '瑷疆鏂囧瓧閫忔槑搴', + ['Set sputtering shadow color'] = '瑷疆鑳屾櫙椤忚壊', + ['Set sputtering shadow alpha'] = '瑷疆鑳屾櫙閫忔槑搴', + ['Show ManaCount'] = '椤ず鍏у姏鏁稿', + ['Show target\'s target'] = '椤ず鐩鐨勭洰妯', + ['Show Boss target'] = '椤ず棣栭牁鐩', + ['Show Boss focus'] = '椤ず棣栭牁榛炲悕', + ['Attack Warning'] = '琚敾鎿婃彁绀', + ['Show attention shadow'] = '椤ず璀﹀憡鑹', + ['Show caution animate'] = '椤ず璀﹀憡鐗规晥', + ['Show screen head'] = '椤ず闋爞璀﹀憡', + ['Show important skill'] = '椤ず閲嶈鎷涘紡瑾挎伅鐙鎱', + ['ZuiWu Effect'] = '閱夎垶绡勫湇', + ['Show effect when teammate get ZuiWu, only your ZuiWu will be showen while you\'re BuTianJue.'] = '椤ず鍙楀埌閱夎垶娌荤檪鐨勯殜鍙嬬壒鏁堬紝鐣朵綘鐨勫績娉曠偤瑁滃ぉ瑷f檪灏囧儏椤ず鍙楀埌浣犵殑閱夎垶鏁堟灉娌荤檪鐨勯殜鍙嬨', + ['Name/Icon/Mana/Life Display'] = '鍚嶅瓧銆佸湒妯欍佸収鍔涘拰琛閲忛’绀烘柟妗', + ['Life font'] = '琛閲忓瓧楂', + ['Name font'] = '鍚嶅瓧瀛楅珨', + ['Font scale'] = '瀛楅珨绺斁', + ['Show Format value'] = '椤ず绮剧啊鏁稿', + ['Show Percentage value'] = '椤ず鐧惧垎姣旀暩', + ['Show full value'] = '椤ず鍏烽珨鏁稿', + ['Show Icon Mode'] = '鍦栨椤ず鏂规', + ['Show Force Icon'] = '椤ず闁娲惧湒妯', + ['Show Camp Icon'] = '椤ず闄g嚐鍦栨', + ['Show Text Force'] = '鏂囧瓧蹇冩硶', + ['Color settings'] = '鏂囧瓧&椤忚壊&璺濋洟', + ['LifeBar Gradient'] = '琛姊濇几璁婅壊', + ['ManaBar Gradient'] = '钘嶆婕歌畩鑹', + ['Colored as official team frame'] = '瀹樻柟钁楄壊', + ['Colored according to the distance'] = '鎸夎窛闆㈣憲鑹', + ['Name'] = '鍚嶅瓧', + ['Colored by...'] = '钁楄壊鏂瑰紡', + ['Name colored by force'] = '鍚嶅瓧闁娲捐憲鑹', + ['Name colored by camp'] = '鍚嶅瓧闄g嚐钁楄壊', + ['Name without color'] = '鍚嶅瓧涓嶈憲鑹', + ['Colored all the same'] = '鍠壊钁楄壊', + ['Edit Distance Level'] = '绶ㄨ集璺濋洟绛夌礆', + ['distance, distance, ...'] = '8,20,22,24,30, ...', + ['Distance color'] = '璺濋洟椤忚壊', + ['Other color'] = '鍏朵粬鐙鎱嬮鑹', + ['Distance alpha'] = '璺濋洟閫忔槑搴', + ['Other alpha'] = '鍏朵粬鐙鎱嬮忔槑搴', + ['Font Style'] = '鏂囧瓧妯e紡瑷疆', + ['Restore Default'] = '鎭㈠京榛樿獚', + ['Interface Width'] = '鐣岄潰瀵害姣斾緥', + ['Interface Height'] = '鐣岄潰楂樺害姣斾緥', + ['Arrangement'] = '鎺掑垪妯″紡', + ['One lines: 5/0'] = '涓琛岋細浜斿垪', + ['Two lines: 1/4'] = '鍏╄锛氫竴鍒/鍥涘垪', + ['Two lines: 2/3'] = '鍏╄锛氫簩鍒/涓夊垪', + ['Two lines: 3/2'] = '鍏╄锛氫笁鍒/浜屽垪', + ['Two lines: 4/1'] = '鍏╄锛氬洓鍒/涓鍒', + ['Show tip at right bottom'] = '婊戦紶婊戦亷瑙掕壊淇℃伅椤ず鍦ㄥ睆骞曞彸涓嬭', + ['Don\'t show tip in fight'] = '鎴伴涓笉椤ず', + ['Alt view player'] = '鎸変綇ALT榛炴搳鏌ョ湅瑁濆倷', + ['Disable in fight'] = '鎴伴涓鐢', + ['Faster Refresh (Greater performance loss)'] = '鏇村揩鐨勭晫闈㈠埛鏂帮紙瑕佹眰閮ㄥ垎鎬ц兘闁嬮姺锛', + ['Refresh every breathe call.'] = '姣忓嬮倧杓箑閮藉埛鏂扮晫闈㈤’绀恒', + ['Ultimate Refresh HP (Greater performance loss)'] = '妤靛揩鐨勮閲忓埛鏂帮紙瑕佹眰闈炲父澶氱殑鎬ц兘闁嬮姺锛', + ['Refresh every render call.'] = '姣忓嬫覆鏌撳箑閮藉埛鏂扮晫闈㈤’绀恒', + ['Grid Style'] = '鏍煎瓙妯e紡', + ['Grid Color'] = '鑳屾櫙椤忚壊', + ['Panel'] = '闈㈡澘', + ['configure'] = '閰嶇疆', + ['Max count'] = '鏈澶ч’绀烘暩閲', + ['Buff scale'] = '姘e媮绺斁', + ['Auto scale'] = '鑷嫊绺斁', + ['Show AllGrid'] = '椤ず瀹屾暣鐨勫皬闅婃牸瀛', + ['Buff settings'] = '姘e媮瑷疆', + ['Buff Staring'] = '閭婃闁冪垗', + ['Show Buff Time'] = '椤ず鍓╅鏅傞枔', + ['Show Buff Num'] = '椤ず灞ゆ暩', + ['Show Buff Reminder'] = '椤ず鍌欐敞', + ['Push buff to official'] = '鑱嫊瀹樻柟闈㈡澘', + ['Show Group Number'] = '椤ず鍒嗙祫绶ㄨ櫉', + ['Team Members: %d, %d agree %d%%'] = '鍦橀殜鍏%d浜猴紝%d浜哄凡鍚屾剰鐧兼斁宸ヨ硣锛岀暥鍓嶆瘮鐜%d%%銆', + ['Wage await %ds...'] = '宸ヨ硣绛夊緟纰鸿獚涓(%ds)', + ['Cataclysm Team Panel'] = '鍦橀殜闈㈡澘', + -- MY_CataclysmParty.lua -- + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['Take back permissions'] = '鏀跺洖瑷卞彲娆', + ['Take back all permissions'] = '鏀跺洖鎵鏈夎ū鍙瑠', + ['Take back leader permission'] = '鏀跺洖闅婇暦瑷卞彲娆', + ['Take back mark permission'] = '鏀跺洖妯欒瑷卞彲娆', + ['Take back distribute permission'] = '鏀跺洖鍒嗛厤瑷卞彲娆', + ['MY_GKP'] = '閲戝湗瑷橀寗', + ['Please install and load GKP addon first.'] = '鏈娓埌閲戝湗瑷橀寗鎻掍欢锛岃珛鍏堣繑鍥炶鑹查伕鎿囩晫闈㈤插叆鎻掍欢绠$悊鐣岄潰锛屽畨瑁濅甫杓夊叆鑼椾紛閲戝湗瑷橀寗瀛愭彃浠躲', + ['MY_TeamTools'] = '鍦橀殜宸ュ叿', + ['Please install and load MY_TeamTools addon first.'] = '鏈娓埌鍦橀殜宸ュ叿鎻掍欢锛岃珛鍏堣繑鍥炶鑹查伕鎿囩晫闈㈤插叆鎻掍欢绠$悊鐣岄潰锛屽畨瑁濅甫杓夊叆鑼椾紛鍦橀殜宸ュ叿瀛愭彃浠躲', + ['MY_TeamNotice'] = '鍦橀殜鍛婄ず', + ['Please install and load MY_TeamNotice addon first.'] = '鏈娓埌鍦橀殜鍛婄ず鎻掍欢锛岃珛鍏堣繑鍥炶鑹查伕鎿囩晫闈㈤插叆鎻掍欢绠$悊鐣岄潰锛屽畨瑁濅甫杓夊叆鑼椾紛鍦橀殜宸ュ叿瀛愭彃浠躲', + ['MY_TeamMon_Subscribe'] = '鍦橀殜鐩f帶灏庡叆鏁告摎', + ['Please install and load MY_TeamMon addon first.'] = '鏈娓埌鍦橀殜鐩f帶鎻掍欢锛岃珛鍏堣繑鍥炶鑹查伕鎿囩晫闈㈤插叆鎻掍欢绠$悊鐣岄潰锛屽畨瑁濅甫杓夊叆鑼椾紛鍦橀殜鐩f帶瀛愭彃浠躲', + ['EnvokeAllTeammates'] = '鍙珛闅婂弸鍓嶅線', + ['TeamCountdown'] = '鐧艰捣鍦橀殜鍊掕▓鏅', + ['You are not the distrubutor.'] = '浣犱笉鏄垎閰嶈呫', + ['Interface style'] = '鐣岄潰妯e紡', + ['Official team frame style'] = '瀹樻柟妯e紡', + ['Cataclysm team frame style'] = 'Cataclysm妯e紡', + ['Restore default'] = '鎭㈠京榛樿獚', + ['Raid style preset'] = '妯e紡闋愯ō椤炲瀷', + ['Please choose your favorite raid style.\nYou can rechoose in setting panel.'] = '璜嬮伕鎿囨偍鍠滄鐨勫湗闅婇潰鏉挎ǎ寮忥細\n瑷伙細鎮ㄥ彲浠ラ毃鏅傚墠寰闈㈡澘瑷疆鐣岄潰閲嶆柊閬告搰銆', + ['Official style'] = '瀹樻柟妯e紡', + ['Cataclysm style'] = 'CTM妯e紡', + ['Keep current'] = '淇濇寔鐝剧媭', + ['Scale %d%%'] = '绺斁%d%%', + ['Target assist delay setting'] = '寤堕伈閬镐腑鐩瑷疆', + ['Target assist delay %dms.'] = '寤堕伈%d姣閬镐腑鐩銆', + ['Target assist no delay.'] = '婊戦紶绉诲叆绔嬪嵆閬镐腑銆', + ['Alpha: %d.'] = '閫忔槑搴︼細%d銆', + ['More than %d meter'] = '%d灏轰互涓', + ['Alt Click Publish'] = '鎸変綇ALT榛炴搳蹇熺櫦浣堝埌鍦橀殜', + ['Enable official data'] = '鍟熺敤瀹樻柟鍦橀殜姘e媮鏁告摎', + ['Enable MY_TeamMon data'] = '鍟熺敤鍦橀殜鐩f帶鏁告摎鑱嫊', + ['HP'] = '琛閲', + ['Mana'] = '鍏у姏', + ['Show mode'] = '椤ず鏂瑰紡', + ['Show number mode'] = '鏁稿奸’绀烘柟妗', + ['V alignment'] = '鍚嶅瓧鍨傜洿灏嶉綂鏂瑰紡', + ['H alignment'] = '鍚嶅瓧姘村钩灏嶉綂鏂瑰紡', + ['Top'] = '涓', + ['Middle'] = '涓', + ['Bottom'] = '涓', + ['Left'] = '宸', + ['Center'] = '涓', + ['Right'] = '鍙', + ['Show Decimal'] = '椤ず灏忔暩', + ['Over mana bar'] = '閬搵鍏у姏', + ['[%s] got buff [%s]x%d, remaining %ds.'] = '[%s]鐛插緱姘e媮銆%s銆憍%d锛屽墿椁樻寔绾屾檪闁%d绉掋', + ['Edit buff'] = '鍦橀殜姘e媮鐩f帶', + ['Name or id'] = 'ID/鍚嶇ū', + ['Level'] = '绛夌礆', + ['Stacknum'] = '灞ゆ暩', + ['Only mine'] = '鍍呬締婧愯嚜宸', + ['Only me'] = '鍍呯洠鎺ц嚜宸', + ['Hide (Can Modify Default Data)'] = '闅辫棌 (鍙毐钘忔寚瀹氱殑榛樿獚鏁告摎)', + ['No limit'] = '涓嶉檺', + ['Color'] = '椤忚壊', + ['Left click to change color, right click to clear color'] = '宸﹂嵉榛炴搳瑷疆钂欑増鍜屾弿閭婇鑹诧紝鍙抽嵉榛炴搳娓呴櫎椤忚壊銆', + ['Left click to change screen head color, right click to clear color'] = '宸﹂嵉榛炴搳瑷疆闋爞鍫辫椤忚壊锛屽彸閸甸粸鎿婃竻闄ら鑹层', + ['Border alpha'] = '鎻忛倞閫忔槑搴', + ['Reminder'] = '鍌欐敞', + ['Priority'] = '鍎厛闋嗗簭', + ['Attention'] = '钂欑増璀﹀憡', + ['Caution'] = '鐗规晥璀﹀憡', + ['Screen Head'] = '闋爞璀﹀憡', + ['Requires MY_LifeBar loaded.'] = '闇杓夊叆涓﹀暉鐢ㄩ牠闋傝姊', + ['Add'] = '娣诲姞', + ['Edit'] = '绶ㄨ集', + ['Sure'] = '纰哄畾', + ['Delete'] = '鍒櫎', + ['Delete [%s]?'] = '鍒櫎[%s]锛', + ['MY_Cataclysm_Buff is blocked in current kungfu, temporary disabled.'] = '鐣跺墠蹇冩硶绂佹浣跨敤鍦橀殜闈㈡澘姘e媮鐩f帶锛岀浉闂滃姛鑳藉凡鏆檪闂滈枆銆', + + ['Buff list'] = '姘e媮鍒楄〃', + ['From MY_TeamMon data'] = '渚嗚嚜鍦橀殜鐩f帶鏁告摎', + ['From official raid buff data'] = '渚嗚嚜瀹樻柟鍦橀殜姘e媮鏁告摎', + ['From custom data'] = '渚嗚嚜鐢ㄦ埗鑷畾缇╂暩鎿', + + ['Would you like to use MY cataclysm?'] = '鏄惁浣跨敤鑼椾紛鍦橀殜闈㈡澘锛', + ['Use'] = '浣跨敤', + ['Not use'] = '涓嶄娇鐢', + + ['Load ancient config'] = '杓夊叆鑸婄増鏁告摎', + ['Please input ancient config name:'] = '璜嬭几鍏ヨ垔鐗堟暩鎿氶厤缃悕锛', + + ['Wujie online'] = '鐒$晫绔湪绶', +} diff --git a/MY_Cataclysm/src/MY_Cataclysm.lua b/MY_Cataclysm/src/MY_Cataclysm.lua new file mode 100644 index 000000000..f263d78bb --- /dev/null +++ b/MY_Cataclysm/src/MY_Cataclysm.lua @@ -0,0 +1,1321 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板模块 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_Cataclysm' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_Cataclysm', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Enable Cataclysm Team Panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + eCss = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['configure'], + _L['Raid style preset'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + eFrameStyle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + _L['Interface style'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'CATACLYSM', + }, + bDrag = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + g_tStrings.WINDOW_LOCK, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowInRaid = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Only in team'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEditMode = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + (string.gsub(g_tStrings.STR_RAID_MENU_RAID_EDIT, 'Ctrl', 'Alt')), + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowAllGrid = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Show AllGrid'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'LEFTCENTER', r = 'LEFTCENTER', x = 100, y = -200 }, + }, + nAutoLinkMode = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + _L['Arrangement'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 5, + }, + nBGColorMode = { -- 0 不着色 1 根据距离 2 根据门派 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + g_tStrings.BACK_COLOR, + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nColoredName = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Name'], + _L['Colored by...'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nNameVAlignment = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Name'], + _L['V alignment'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nNameHAlignment = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Name'], + _L['H alignment'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nHPShownMode2 = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['Show mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + nHPShownNumMode = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['Show number mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 3, + }, + nHPVAlignment = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['V alignment'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + nHPHAlignment = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['H alignment'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + bShowHPDecimal = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['Show Decimal'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBuffAboveMana = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Over mana bar'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nShowMP = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Show ManaCount'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bHPHitAlert = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Attack Warning'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nShowIcon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Show Icon Mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + bShowDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show distance'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBossTarget = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show Boss target'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowBossFocus = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show Boss focus'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEnableDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + g_tStrings.STR_RAID_DISTANCE, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bEnableImportantSkill = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show important skill'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTargetTargetAni = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show target\'s target'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nNameFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Name'], + _L['Name font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 40, + }, + nLifeFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['Life font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 15, + }, + nManaFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Mana'], + g_tStrings.STR_SKILL_MANA .. g_tStrings.FONT, + }), + xSchema = X.Schema.Number, + xDefaultValue = 190, + }, + fNameFontScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Name'], + _L['Font scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1.05, + }, + fLifeFontScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['HP'], + _L['Font scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1.05, + }, + fManaFontScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Style'], + _L['Mana'], + _L['Font scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nMaxShowBuff = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Max count'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 4, + }, + bLifeGradient = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['LifeBar Gradient'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bManaGradient = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['ManaBar Gradient'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + g_tStrings.STR_ALPHA, + }), + xSchema = X.Schema.Number, + xDefaultValue = 220, + }, + fBuffScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Buff scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + bAutoBuffSize = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Auto scale'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAltView = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Alt view player'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAltViewInFight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Alt view player'], + _L['Disable in fight'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bHideTipInFight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Don\'t show tip in fight'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTipAtRightBottom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show tip at right bottom'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTempTargetEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + g_tStrings.STR_RAID_TARGET_ASSIST, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nTempTargetDelay = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Target assist delay setting'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + fScaleX = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + _L['Interface Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1.1, + }, + fScaleY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + _L['Interface Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1.0, + }, + nDrawInterval = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Faster Refresh (Greater performance loss)'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 4, + }, + bFasterHP = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Ultimate Refresh HP (Greater performance loss)'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bStaring = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Buff Staring'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBuffTime = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Show Buff Time'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowBuffNum = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Show Buff Num'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowBuffReminder = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Show Buff Reminder'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBuffAltPublish = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Alt Click Publish'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBuffPushToOfficial = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Push buff to official'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBuffDataOfficial = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Enable official data'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBuffDataTeamMon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Enable MY_TeamMon data'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowAttention = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show attention shadow'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowCaution = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show caution animate'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowScreenHead = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show screen head'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowGroupNumber = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Interface settings'], + _L['Show Group Number'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowEffect = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['ZuiWu Effect'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, -- 五毒醉舞提示 万花距离提示 晚点做 + }, + bShowSputtering = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Show central party member tag'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tSputteringFontColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Set sputtering font color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 79, 255, 108 }, + }, + nSputteringFontAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Set sputtering font alpha'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 192, + }, + tSputteringShadowColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Set sputtering shadow color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 79, 255, 108 }, + }, + nSputteringShadowAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Set sputtering shadow alpha'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 192, + }, + nSputteringDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['MY_Cataclysm'], + _L['Set sputtering distance'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 15, + }, + aBuffList = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Buff settings'], + _L['Buff list'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Any), + xDefaultValue = {}, + }, + tDistanceLevel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Edit Distance Level'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Number), + xDefaultValue = { 20, 22, 200 }, + }, + tManaColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Mana'], + g_tStrings.STR_SKILL_MANA .. g_tStrings.BACK_COLOR, + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 0, 96, 255 }, + }, + tDistanceCol = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Distance color'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number)), + xDefaultValue = { + { 0, 180, 52 }, -- 绿 + { 0, 180, 52 }, -- 绿 + -- 免得被说乱 + -- { 230, 170, 40 }, -- 黄 + { 230, 80, 80 }, -- 红 + { 230, 80, 80 }, -- 红 + }, + }, + tOtherCol = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Other color'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number)), + xDefaultValue = { + { 255, 255, 255 }, + { 110, 110, 110 }, + { 192, 192, 192 }, + }, + }, + tDistanceAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Distance alpha'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Number), + xDefaultValue = { + 255, + 255, + 110, + }, + }, + tOtherAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Cataclysm'], + szDescription = X.MakeCaption({ + _L['Grid Color'], + _L['Other alpha'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { + 0, + 255, -- 不在线 + 110, -- 出同步范围 + }, + }, +}) +local D = { + CFG = O, + bVisible = true, + bFold = false, + BG_COLOR_MODE = { + SAME_COLOR = 0, + BY_DISTANCE = 1, + BY_FORCE = 2, + OFFICIAL = 3, + }, +} + +function D.AnnounceShielded() + local bBlock = X.IsInCompetitionMap() and X.IsClientPlayerMountMobileKungfu() + if bBlock and not D.bBlockMessageAnnounced then + X.OutputSystemMessage(_L['MY_Cataclysm_Buff is blocked in current kungfu, temporary disabled.']) + end + D.bBlockMessageAnnounced = bBlock +end + +-- 解析 +function D.EncodeBuffRule(v, bNoBasic) + local a = {} + if not bNoBasic then + table.insert(a, v.szName or v.dwID) + if v.nLevel then + table.insert(a, 'lv' .. v.nLevel) + end + end + if v.nStackNum then + table.insert(a, 'sn' .. (v.szStackOp or '>=') .. v.nStackNum) + end + if v.bOnlyMe then + table.insert(a, 'me') + end + if v.bOnlyMine or v.bOnlySelf or v.bSelf then + table.insert(a, 'mine') + end + a = { table.concat(a, '|') } + + if v.col then + local cols = { v.col } + if v.nColAlpha and v.col:sub(1, 1) ~= '#' then + table.insert(cols, v.nColAlpha) + end + table.insert(a, '[' .. table.concat(cols, '|') .. ']') + end + if not X.IsEmpty(v.szReminder) then + table.insert(a, '(' .. v.szReminder .. ')') + end + if v.nPriority then + table.insert(a, '#' .. v.nPriority) + end + if v.bAttention then + table.insert(a, '!!') + end + if v.bCaution then + table.insert(a, '!!!') + end + if v.bScreenHead then + if v.colScreenHead then + table.insert(a, '!!!!|[' .. v.colScreenHead .. ']') + else + table.insert(a, '!!!!') + end + end + if v.bDelete then + table.insert(a, '-') + end + return table.concat(a, ',') +end + +function D.DecodeBuffRule(line) + line = X.TrimString(line) + if line ~= '' then + local tab = {} + local vals = X.SplitString(line, ',') + for i, val in ipairs(vals) do + if i == 1 then + local vs = X.SplitString(val, '|') + for j, v in ipairs(vs) do + v = X.TrimString(v) + if v ~= '' then + if j == 1 then + tab.dwID = tonumber(v) + if not tab.dwID then + tab.szName = v + end + elseif v == 'self' or v == 'mine' then + tab.bOnlyMine = true + elseif v:sub(1, 2) == 'lv' then + tab.nLevel = tonumber((v:sub(3))) + elseif v:sub(1, 2) == 'sn' then + if tonumber(v:sub(4, 4)) then + tab.szStackOp = v:sub(3, 3) + tab.nStackNum = tonumber((v:sub(4))) + else + tab.szStackOp = v:sub(3, 4) + tab.nStackNum = tonumber((v:sub(5))) + end + end + end + end + elseif val == '!!' then + tab.bAttention = true + elseif val == '!!!' then + tab.bCaution = true + elseif val == '!!!!' or val:sub(1, 5) == '!!!!|' then + tab.bScreenHead = true + local vs = X.SplitString(val, '|') + for _, v in ipairs(vs) do + if v:sub(1, 1) == '[' and v:sub(-1, -1) == ']' then + tab.colScreenHead = v:sub(2, -2) + end + end + elseif val == '-' then + tab.bDelete = true + elseif val:sub(1, 1) == '#' then + tab.nPriority = tonumber((val:sub(2))) + elseif val:sub(1, 1) == '[' and val:sub(-1, -1) == ']' then + val = val:sub(2, -2) + if val:sub(1, 1) == '#' then + tab.col = val + else + local vs = X.SplitString(val, '|') + tab.col = vs[1] + tab.nColAlpha = vs[2] and tonumber(vs[2]) + end + elseif val:sub(1, 1) == '(' and val:sub(-1, -1) == ')' then + tab.szReminder = val:sub(2, -2) + end + end + if tab.dwID or tab.szName then + return tab + end + end +end + +function D.OpenBuffRuleEditor(rec, onChangeNotify, onCloseNotify, bHideBase) + local w, h = 320, 320 + local ui = X.UI.CreateFrame('MY_Cataclysm_BuffConfig', { + w = w, h = h, + text = _L['Edit buff'], + close = true, anchor = 'CENTER', + }):Remove(function() + if not bHideBase and not rec.dwID and (not rec.szName or rec.szName == '') then + onChangeNotify() + end + X.SafeCall(onCloseNotify) + end) + local nPaddingX, nPaddingY = 25, 60 + local x, y = nPaddingX, nPaddingY + if not bHideBase then + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Name or id'], + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndEditBox', { + x = x, y = y, w = 105, h = 25, + text = rec.dwID or rec.szName, + onChange = function(text) + if tonumber(text) then + rec.dwID = tonumber(text) + rec.szName = nil + else + rec.dwID = nil + rec.szName = text + end + onChangeNotify(rec) + end, + }):Width() + 15 + + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Level'], + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndEditBox', { + x = x, y = y, w = 60, h = 25, + placeholder = _L['No limit'], + editType = X.UI.EDIT_TYPE.NUMBER, text = rec.nLevel, + onChange = function(text) + rec.nLevel = tonumber(text) + onChangeNotify(rec) + end, + }):Width() + 5 + y = y + 30 + y = y + 10 + end + + x = nPaddingX + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Stacknum'], + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndComboBox', { + name = 'WndComboBox_StackOp', + x = x, y = y, w = 90, h = 25, + text = rec.szStackOp + and X.GetOperatorName(rec.szStackOp) + or (rec.nStackNum and X.GetOperatorName('>=') or _L['No limit']), + menu = function() + local this = this + local menu = {{ + szOption = _L['No limit'], + fnAction = function() + rec.szStackOp = nil + ui:Children('#WndEditBox_StackNum'):Text('') + onChangeNotify(rec) + X.UI(this):Text(_L['No limit']) + X.UI.ClosePopupMenu() + end, + }} + return X.InsertOperatorMenu( + menu, + rec.szStackOp, + function(szOp) + rec.szStackOp = szOp + onChangeNotify(rec) + X.UI(this):Text(X.GetOperatorName(szOp)) + X.UI.ClosePopupMenu() + end + ) + end, + }):Width() + 5 + x = x + ui:Append('WndEditBox', { + name = 'WndEditBox_StackNum', + x = x, y = y, w = 30, h = 25, + editType = X.UI.EDIT_TYPE.NUMBER, + text = rec.nStackNum, + onChange = function(text) + rec.nStackNum = tonumber(text) + if rec.nStackNum then + if not rec.szStackOp then + rec.szStackOp = '>=' + ui:Children('#WndComboBox_StackOp'):Text(X.GetOperatorName('>=')) + end + end + onChangeNotify(rec) + end, + }):Width() + 10 + + ui:Append('WndCheckBox', { + x = x, y = y - 10, + text = _L['Only mine'], + checked = rec.bOnlyMine, + onCheck = function(bChecked) + rec.bOnlyMine = bChecked + onChangeNotify(rec) + end, + }):AutoWidth() + ui:Append('WndCheckBox', { + x = x, y = y + 10, + text = _L['Only me'], + checked = rec.bOnlyMe, + onCheck = function(bChecked) + rec.bOnlyMe = bChecked + onChangeNotify(rec) + end, + }):AutoWidth() + y = y + 30 + y = y + 10 + + if not bHideBase then + x = nPaddingX + y = y + 10 + x = x + ui:Append('WndCheckBox', { + x = x, y = y, + text = _L['Hide (Can Modify Default Data)'], + checked = rec.bDelete, + onCheck = function(bChecked) + rec.bDelete = bChecked + onChangeNotify(rec) + end, + }):AutoWidth():Width() + 5 + y = y + 30 + y = y + 10 + end + + x = nPaddingX + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Reminder'], + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndEditBox', { + x = x, y = y, w = 30, h = 25, + text = rec.szReminder, + onChange = function(text) + rec.szReminder = text + onChangeNotify(rec) + end, + autoEnable = function() return not rec.bDelete end, + }):Width() + 5 + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Priority'], + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndEditBox', { + x = x, y = y, w = 40, h = 25, + editType = X.UI.EDIT_TYPE.NUMBER, + text = rec.nPriority, + onChange = function(text) + rec.nPriority = tonumber(text) + onChangeNotify(rec) + end, + autoEnable = function() return not rec.bDelete end, + }):Width() + 5 + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Color'], + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('Shadow', { + x = x, y = y + 2, w = 22, h = 22, + color = rec.col and {X.HumanColor2RGB(rec.col)} or {255, 255, 0}, + onLClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + local a = rec.col and select(4, X.Hex2RGB(rec.col)) or 255 + rec.nColAlpha = a + rec.col = X.RGB2Hex(r, g, b, a) + X.UI(this):Color(r, g, b) + onChangeNotify(rec) + end) + end, + onRClick = function() + X.UI(this):Color(255, 255, 0) + rec.col = nil + onChangeNotify(rec) + end, + tip = { + render = _L['Left click to change color, right click to clear color'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return not rec.bDelete end, + }):Width() + 5 + x = x + ui:Append('Shadow', { + x = x, y = y + 2, w = 22, h = 22, + color = rec.colScreenHead and {X.HumanColor2RGB(rec.colScreenHead)} or {255, 255, 0}, + onLClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + rec.colScreenHead = X.RGB2Hex(r, g, b) + X.UI(this):Color(r, g, b) + onChangeNotify(rec) + end) + end, + onRClick = function() + X.UI(this):Color(255, 255, 0) + rec.colScreenHead = nil + onChangeNotify(rec) + end, + tip = { + render = _L['Left click to change screen head color, right click to clear color'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return not rec.bDelete end, + }):Width() + 5 + y = y + 30 + + x = nPaddingX + x = x + ui:Append('Text', { + x = x, y = y, h = 25, + text = _L['Border alpha'], + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndSlider', { + x = x, y = y, text = '', + range = {0, 255}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = rec.col and select(4, X.HumanColor2RGB(rec.col)) or rec.nColAlpha or 255, + onChange = function(nVal) + if rec.col then + local r, g, b = X.Hex2RGB(rec.col) + if r and g and b then + rec.col = X.RGB2Hex(r, g, b, nVal) + end + end + rec.nColAlpha = nVal + onChangeNotify(rec) + end, + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + y = y + 30 + + x = nPaddingX + x = x + ui:Append('WndCheckBox', { + x = x, y = y, + text = _L['Attention'], + checked = rec.bAttention, + onCheck = function(bChecked) + rec.bAttention = bChecked + onChangeNotify(rec) + end, + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndCheckBox', { + x = x, y = y, + text = _L['Caution'], + checked = rec.bCaution, + onCheck = function(bChecked) + rec.bCaution = bChecked + onChangeNotify(rec) + end, + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndCheckBox', { + x = x, y = y, + text = _L['Screen Head'], + checked = rec.bScreenHead, + onCheck = function(bChecked) + rec.bScreenHead = bChecked + onChangeNotify(rec) + end, + tip = _L['Requires MY_LifeBar loaded.'], + autoEnable = function() return not rec.bDelete end, + }):AutoWidth():Width() + 5 + + y = y + 50 + ui:Append('WndButton', { + x = (w - 120) / 2, y = y, w = 120, + text = _L['Delete'], color = {223, 63, 95}, + buttonStyle = 'FLAT', + onClick = function() + local function fnAction() + onChangeNotify() + ui:Remove() + end + if rec.dwID or (rec.szName and rec.szName ~= '') then + X.Confirm(_L('Delete [%s]?', rec.szName or rec.dwID), fnAction) + else + fnAction() + end + end, + }) + y = y + 30 + + h = y + 15 + ui:Height(h) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Cataclysm', + exports = { + { + fields = { + 'CFG', + 'bVisible', + 'bFold', + 'BG_COLOR_MODE', + 'EncodeBuffRule', + 'DecodeBuffRule', + 'OpenBuffRuleEditor', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'CFG', + 'bVisible', + 'bFold', + 'BG_COLOR_MODE', + }, + triggers = { + bVisible = function() + FireUIEvent('MY_CATACLYSM_SET_VISIBLE') + end, + bFold = function() + FireUIEvent('MY_CATACLYSM_SET_FOLD') + end, + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_Cataclysm = X.CreateModule(settings) +end + +X.RegisterEvent('LOADING_END', 'MY_Cataclysm__AnnounceShielded', D.AnnounceShielded) +X.RegisterKungfuMount('MY_Cataclysm__AnnounceShielded', D.AnnounceShielded) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmMain.lua b/MY_Cataclysm/src/MY_CataclysmMain.lua new file mode 100644 index 000000000..bde8d005c --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmMain.lua @@ -0,0 +1,1515 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板主界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmMain' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_CataclysmMain__OfficialBuff', { ['*'] = true }) +-------------------------------------------------------------------------------- +local MY_IsVisibleBuff, MY_GetBuffName = X.IsVisibleBuff, X.GetBuffName +local D = {} +local INI_ROOT = X.PACKET_INFO.ROOT .. 'MY_Cataclysm/ui/' +local CFG = MY_Cataclysm.CFG +local CTM_CONFIG_DEFAULT = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_Cataclysm/config/default/{$lang}.jx3dat') +local CTM_CONFIG_OFFICIAL = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_Cataclysm/config/official/{$lang}.jx3dat') +local CTM_CONFIG_CATACLYSM = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_Cataclysm/config/cataclysm/{$lang}.jx3dat') + +local TEAM_VOTE_REQUEST = {} +local BUFF_LIST = {} +local GKP_RECORD_TOTAL = 0 +local CTM_CAPTION = '' +local CTM_BUFF_TEAMMON = {} +local CTM_BUFF_OFFICIAL = {} +local DEBUG = false + +do +-- TODO: 不是需要基础排序 而是需要作用域限定加权,当作用域一致时,用户>DBM>官方 +local function InsertBuffListCache(aBuffList, szVia, nViaPriority) + for _, tab in ipairs(aBuffList) do + local id = tab.dwID or tab.szName + if id then + for iid, aList in pairs(BUFF_LIST) do + if iid == id or (tab.szName and type(iid) == 'number' and Table_GetBuffName(iid, 1) == tab.szName) then + for i, p in X.ipairs_r(aList) do + if (not tab.nLevel or p.nLevel == tab.nLevel) + and (not tab.szStackOp or p.szStackOp == tab.szStackOp) + and (not tab.nStackNum or p.nStackNum == tab.nStackNum) + and (not tab.bOnlyMe or p.bOnlyMe == tab.bOnlyMe) + and (not tab.bOnlyMine or p.bOnlyMine == tab.bOnlyMine) then + table.remove(aList, i) + end + end + if #aList == 0 then + BUFF_LIST[iid] = nil + end + end + end + if not tab.bDelete then + if not BUFF_LIST[id] then + BUFF_LIST[id] = {} + end + table.insert(BUFF_LIST[id], 1, setmetatable({ szVia = szVia, nViaPriority = nViaPriority }, { __index = tab })) + end + end + end +end +function D.UpdateBuffListCache() + BUFF_LIST = {} + if CFG.bBuffDataOfficial and CTM_BUFF_OFFICIAL then + InsertBuffListCache(CTM_BUFF_OFFICIAL, _L['From official raid buff data'], 2) + end + if CFG.bBuffDataTeamMon and CTM_BUFF_TEAMMON then + InsertBuffListCache(CTM_BUFF_TEAMMON, _L['From MY_TeamMon data'], 1) + end + if CFG.aBuffList and not X.IsRestricted('MY_Cataclysm_BuffMonitor') then + InsertBuffListCache(CFG.aBuffList, _L['From custom data'], 0) + end + if CFG.bBuffPushToOfficial then + local aBuff = {} + for _, dwID in pairs(BUFF_LIST) do + if X.IsNumber(dwID) then + table.insert(aBuff, dwID) + end + end + Raid_MonitorBuffs(aBuff) + end + FireUIEvent('MY_CATACLYSM_BUFF_LIST_CACHE_UPDATE') +end +end + +do +local function UpdateTeamMonData() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + if MY_TeamMon and MY_TeamMon.IterTable and MY_TeamMon.GetTable then + local aBuff = {} + for _, szType in ipairs({'BUFF', 'DEBUFF'}) do + for _, data in MY_TeamMon.IterTable(MY_TeamMon.GetTable(szType), 0, true, true) do + if data.aCataclysmBuff then + for _, v in ipairs(data.aCataclysmBuff) do + v = X.Clone(v) + v.dwID = data.dwID + if data.bCheckLevel then + v.nLevel = data.nLevel + end + v.nIcon = data.nIcon + table.insert(aBuff, v) + end + end + end + end + CTM_BUFF_TEAMMON = aBuff + D.UpdateBuffListCache() + end +end +local function onTeamMonUpdate() + if arg0 and not arg0['BUFF'] and not arg0['DEBUFF'] then + return + end + UpdateTeamMonData() +end +X.RegisterEvent('MY_TEAM_MON_DATA_RELOAD', 'MY_CataclysmMain', onTeamMonUpdate) +end + +do +local function UpdateOfficialBuff() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + local dwMapID = X.GetMapID(true) + local szMapID = tostring(dwMapID) + local dwMountKungfuID = UI_GetPlayerMountKungfuID() + local aBuff = {} + local RaidPanelBuff = X.GetGameTable('RaidPanelBuff') + if not RaidPanelBuff or not X.IsRestricted('MY_CataclysmMain__OfficialBuff') then + local szPath = X.FormatPath({'userdata\\cataclysm\\official_buff.tab', X.PATH_TYPE.GLOBAL}) + local tTitle = { + { f = 'i', t = 'dwBuffID' }, + { f = 'i', t = 'nBuffLevel' }, + { f = 's', t = 'szMapID' }, + { f = 'i', t = 'dwMountKungfuID' }, + { f = 's', t = 'szStackOperator' }, + { f = 'i', t = 'nStackNum' }, + { f = 'b', t = 'bOnlyMine' }, + { f = 'b', t = 'bOnlyMyself' }, + { f = 'i', t = 'nIconID' }, + { f = 'b', t = 'bAttention' }, + { f = 's', t = 'szAttentionColor' }, + { f = 'b', t = 'bCaution' }, + { f = 'b', t = 'bScreenHead' }, + { f = 's', t = 'szScreenHeadColor' }, + { f = 'i', t = 'nPriority' }, + { f = 's', t = 'szReminder' }, + { f = 's', t = 'szReminderColor' }, + { f = 's', t = 'szBorderColor' }, + } + RaidPanelBuff = KG_Table.Load(szPath, tTitle, FILE_OPEN_MODE.NORMAL) or RaidPanelBuff + end + if RaidPanelBuff then + local nCount = RaidPanelBuff:GetRowCount() + for i = 2, nCount do + local tLine = RaidPanelBuff:GetRow(i) + if (not tLine.dwMapID or tLine.dwMapID == dwMapID or tLine.dwMapID == 0) + and (not tLine.szMapID or X.Contains(X.SplitString(tLine.szMapID, ';'), szMapID)) + and (not tLine.dwMountKungfuID or tLine.dwMountKungfuID == 0 or X.IsSameKungfu(tLine.dwMountKungfuID, dwMountKungfuID)) then + local v = { + dwID = tLine.dwBuffID, + nLevel = X.IIf(tLine.nBuffLevel > 0, tLine.nBuffLevel, nil), + szStackOp = X.IIf( + tLine.szStackOperator == '', + X.IIf(tLine.nStackNum == 0, nil, '>='), + tLine.szStackOperator + ), + nStackNum = X.IIf(tLine.szStackOperator == '' and tLine.nStackNum == 0, nil, tLine.nStackNum), + bOnlyMine = tLine.bOnlyMine, + bOnlyMe = tLine.bOnlyMyself, + nIconID = X.IIf(tLine.nIconID == 0, nil, tLine.nIconID), + bAttention = tLine.bAttention, + colAttention = X.IIf(tLine.szAttentionColor == '', nil, tLine.szAttentionColor), + bCaution = tLine.bCaution, + bScreenHead = tLine.bScreenHead, + colScreenHead = X.IIf(tLine.szScreenHeadColor == '', nil, tLine.szScreenHeadColor), + nPriority = tLine.nPriority, + szReminder = tLine.szReminder, + colReminder = X.IIf(tLine.szReminderColor == '', nil, tLine.szReminderColor), + colBorder = X.IIf(tLine.szBorderColor == '', nil, tLine.szBorderColor), + } + table.insert(aBuff, v) + end + end + end + local NewRaidBuff = X.GetGameTable('NewRaidBuff') + if NewRaidBuff then + local nCount = NewRaidBuff:GetRowCount() + for i = 2, nCount do + local tLine = NewRaidBuff:GetRow(i) + if tLine.dwMountKungfuID == 0 or X.IsSameKungfu(tLine.dwMountKungfuID, dwMountKungfuID) then + local v = { + dwID = tLine.dwBuffID, + nLevel = nil, + szStackOp = nil, + nStackNum = nil, + bOnlyMine = tLine.bOnlyMyself, + bOnlyMe = nil, + nIconID = Table_GetBuffIconID(tLine.dwBuffID, tLine.nBuffLevel) + or Table_GetBuffIconID(tLine.dwBuffID) + or 13, + bAttention = nil, + colAttention = nil, + bCaution = nil, + bScreenHead = nil, + colScreenHead = nil, + nPriority = nil, + szReminder = nil, + colReminder = nil, + colBorder = nil, + } + table.insert(aBuff, v) + end + end + end + CTM_BUFF_OFFICIAL = aBuff + D.UpdateBuffListCache() +end +X.RegisterEvent('MY_RESTRICTION', 'MY_CataclysmMain__OfficialBuff', function() + if arg0 and arg0 ~= 'MY_CataclysmMain__OfficialBuff' then + return + end + UpdateOfficialBuff() +end) +X.RegisterInit('MY_CataclysmMain__OfficialBuff', UpdateOfficialBuff) +X.RegisterKungfuMount('MY_CataclysmMain__OfficialBuff', UpdateOfficialBuff) +end + +function D.SetConfig(Config, bKeepBuff) + if bKeepBuff then + Config.aBuffList = nil + end + -- update version + if Config.tBuffList then + Config.aBuffList = {} + for k, v in pairs(Config.tBuffList) do + v.dwID = tonumber(k) + if not v.dwID then + v.szName = k + end + table.insert(Config.aBuffList, v) + end + Config.tBuffList = nil + end + -- options fixed + if Config.eCss == 'OFFICIAL' then + for k, v in pairs(CTM_CONFIG_OFFICIAL) do + if type(Config[k]) == 'nil' then + Config[k] = v + end + end + elseif Config.eCss == 'CATACLYSM' then + for k, v in pairs(CTM_CONFIG_CATACLYSM) do + if type(Config[k]) == 'nil' then + Config[k] = v + end + end + else + for k, v in pairs(CTM_CONFIG_DEFAULT) do + if type(Config[k]) == 'nil' then + Config[k] = v + end + end + end + -- Config.bFasterHP = false + for k, v in pairs(Config) do + X.Call(X.Set, CFG, {k}, v) + end + D.UpdateBuffListCache() + D.ReloadCataclysmPanel() +end + +function D.LoadAncientConfigure(szConfigName) + local xData = X.LoadLUAData({'config/cataclysm/' .. szConfigName .. '.jx3dat', X.PATH_TYPE.GLOBAL}) + if X.IsTable(xData) then + D.SetConfig(xData) + end +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_CataclysmMain') +end + +local CTM_LOOT_MODE = X.KvpToObject({ + {PARTY_LOOT_MODE.FREE_FOR_ALL, {'ui/Image/TargetPanel/Target.UITex' , 60}}, + {PARTY_LOOT_MODE.DISTRIBUTE , {'ui/Image/UICommon/CommonPanel2.UITex', 92}}, + {PARTY_LOOT_MODE.GROUP_LOOT , {'ui/Image/UICommon/LoginCommon.UITex' , 29}}, + {PARTY_LOOT_MODE.BIDDING , {'ui/Image/UICommon/GoldTeam.UITex' , 6}}, +}) +local CTM_LOOT_QUALITY = { + [0] = 2399, + [1] = 2396, + [2] = 2401, + [3] = 2397, + [4] = 2402, + [5] = 2400, +} + +function D.InsertForceCountMenu(tMenu) + local tForceList = {} + local hTeam = GetClientTeam() + local nCount = 0 + for nGroupID = 0, hTeam.nGroupNum - 1 do + local tGroupInfo = hTeam.GetGroupInfo(nGroupID) + for _, dwMemberID in ipairs(tGroupInfo.MemberList) do + local tMemberInfo = hTeam.GetMemberInfo(dwMemberID) + if not tForceList[tMemberInfo.dwForceID] then + tForceList[tMemberInfo.dwForceID] = 0 + end + tForceList[tMemberInfo.dwForceID] = tForceList[tMemberInfo.dwForceID] + 1 + end + nCount = nCount + #tGroupInfo.MemberList + end + local tSubMenu = { szOption = g_tStrings.STR_RAID_MENU_FORCE_COUNT .. + FormatString(g_tStrings.STR_ALL_PARENTHESES, nCount) + } + for dwForceID, nCount in pairs(tForceList) do + local szPath, nFrame = GetForceImage(dwForceID) + table.insert(tSubMenu, { + szOption = g_tStrings.tForceTitle[dwForceID] .. ' ' .. nCount, + rgb = { X.GetForceColor(dwForceID) }, + szIcon = szPath, + nFrame = nFrame, + szLayer = 'ICON_LEFT' + }) + end + table.insert(tMenu, tSubMenu) +end + +function D.InsertDistributeMenu(tMenu) + local aDistributeMenu = {} + InsertDistributeMenu(aDistributeMenu, not X.IsClientPlayerTeamDistributor()) + for _, menu in ipairs(aDistributeMenu) do + if menu.szOption == g_tStrings.STR_LOOT_LEVEL then + table.insert(menu, 1, { + bDisable = not X.IsClientPlayerTeamDistributor(), + szOption = g_tStrings.STR_WHITE, + nFont = 79, rgb = {GetItemFontColorByQuality(1)}, + bMCheck = true, bChecked = GetClientTeam().nRollQuality == 1, + fnAction = function() GetClientTeam().SetTeamRollQuality(1) end, + }) + table.insert(menu, 1, { + bDisable = not X.IsClientPlayerTeamDistributor(), + szOption = g_tStrings.STR_GRAY, + nFont = 79, rgb = {GetItemFontColorByQuality(0)}, + bMCheck = true, bChecked = GetClientTeam().nRollQuality == 0, + fnAction = function() GetClientTeam().SetTeamRollQuality(0) end, + }) + end + table.insert(tMenu, menu) + end +end + +function D.GetTeammateFrame() + return Station.Lookup('Normal/Teammate') +end + +function D.RaidPanel_Switch(bOpen) + local frame = Station.Lookup('Normal/RaidPanel_Main') + if bOpen then + if not frame then + OpenRaidPanel() + end + else + if frame then + -- 有一点问题 会被加呼吸 根据判断 + if not D.GetTeammateFrame() then + X.UI.OpenFrame('Teammate') + end + CloseRaidPanel() + X.UI.CloseFrame('Teammate') + end + end +end + +function D.TeammatePanel_Switch(bOpen) + local hFrame = D.GetTeammateFrame() + if hFrame then + if bOpen then + hFrame:Show() + else + hFrame:Hide() + end + end +end + +function D.GetGroupTotal() + local me, team = X.GetClientPlayer(), GetClientTeam() + local nGroup = 0 + if me.IsInRaid() then + for i = 0, team.nGroupNum - 1 do + local tGroup = team.GetGroupInfo(i) + if #tGroup.MemberList > 0 then + nGroup = nGroup + 1 + end + end + else + nGroup = 1 + end + return nGroup +end + +function D.UpdatePrepareBarPos() + local frame = D.GetFrame() + if not frame then + return + end + local hTotal = frame:Lookup('', '') + local hPrepare = hTotal:Lookup('Handle_Prepare') + if MY_Cataclysm.bFold or D.GetGroupTotal() < 3 then + hPrepare:SetRelPos(0, -18) + else + local wrapper = frame:Lookup('WndContainer_Wrapper') + local container = wrapper:Lookup('WndContainer_Main') + hPrepare:SetRelPos(wrapper:GetRelX() + container:GetW(), 3) + end + hTotal:FormatAllItemPos() +end + +function D.SetFrameCaption(szText) + local frame = D.GetFrame() + if szText then + CTM_CAPTION = szText + end + if frame then + frame:Lookup('', 'Handle_BG/Text_Caption'):SetText(CTM_CAPTION) + end +end + +function D.SetFrameSize(bEnter) + local frame = D.GetFrame() + if frame then + local nGroup = D.GetGroupTotal() + local nGroupEx = nGroup + if CFG.nAutoLinkMode ~= 5 then + nGroupEx = 1 + end + local wrapper = frame:Lookup('WndContainer_Wrapper') + local container = wrapper:Lookup('WndContainer_Main') + local nItemW = frame:Lookup('', 'Handle_ListW'):GetW() * CFG.fScaleX + local nMinW = wrapper:GetRelX() + container:GetW() + local nDragW = math.max(nItemW * nGroupEx, nMinW + 30) + local nDragH = select(2, frame:GetSize()) + frame:SetW(nDragW) + frame:SetDragArea(0, 0, nDragW, nDragH) + local nBgW, nWrapperW = math.max(nItemW * nGroupEx, nMinW + 5), container:GetW() + if not bEnter then + nBgW = math.min(nItemW * nGroupEx, nMinW + 5) + nWrapperW = nBgW - wrapper:GetRelX() - 5 + end + local nBgSW = frame:Lookup('', 'Handle_BG/Image_Title_BG'):GetW() + local nWrapperSW = wrapper:GetW() + local nSTick = bEnter + and GetTime() + or GetTime() + 1500 + local nDuring = bEnter + and 100 + or 200 + local bContinue, nTick, fPer + X.RenderCall('MY_CataclysmMain_WAni', function() + bContinue = false + if X.IsElement(wrapper) then + nTick = GetTime() + if nTick < nSTick then + return + end + bContinue = nTick - nSTick < nDuring + fPer = bContinue + and ((nTick - nSTick) / nDuring) + or 1 + wrapper:SetW((nWrapperW - nWrapperSW) * fPer + nWrapperSW) + frame:Lookup('', 'Handle_BG/Image_Title_BG'):SetW((nBgW - nBgSW) * fPer + nBgSW) + end + if not bContinue then + D.UpdatePrepareBarPos() + return 0 + end + end) + end +end + +function D.CreateControlBar() + local team = GetClientTeam() + local nLootMode = team.nLootMode + local nRollQuality = team.nRollQuality + local frame = D.GetFrame() + local container = frame:Lookup('WndContainer_Wrapper/WndContainer_Main') + local szIniFile = INI_ROOT .. 'MY_CataclysmMain_Button.ini' + container:Clear() + -- 团队工具 团队告示 + if X.IsClientPlayerInParty() then + container:AppendContentFromIni(szIniFile, 'Wnd_TeamTools') + container:AppendContentFromIni(szIniFile, 'Wnd_TeamNotice') + end + -- 团队监控 + container:AppendContentFromIni(szIniFile, 'Wnd_TeamMon_Subscribe') + -- 分配模式 + local hLootMode = container:AppendContentFromIni(szIniFile, 'WndButton_LootMode') + if CTM_LOOT_MODE[nLootMode] then + hLootMode:Lookup('', 'Image_LootMode'):FromUITex(unpack(CTM_LOOT_MODE[nLootMode])) + end + if nLootMode == PARTY_LOOT_MODE.DISTRIBUTE + or (nLootMode == PARTY_LOOT_MODE.BIDDING and OpenGoldTeam) then + container:AppendContentFromIni(szIniFile, 'WndButton_LootQuality') + :Lookup('', 'Image_LootQuality'):FromIconID(CTM_LOOT_QUALITY[nRollQuality]) + container:AppendContentFromIni(szIniFile, 'WndButton_GKP') + end + -- 世界标记 + if X.IsClientPlayerTeamLeader() then + container:AppendContentFromIni(szIniFile, 'WndButton_WorldMark') + end + -- 召请玩家 + if X.IsClientPlayerTeamLeader() and EnvokeAllTeammates then + container:AppendContentFromIni(szIniFile, 'Wnd_EnvokeAllTeammates') + end + -- 倒计时 + if X.IsClientPlayerTeamLeader() and MY_TeamCountdown then + container:AppendContentFromIni(szIniFile, 'Wnd_TeamCountdown') + end + -- 语音按钮 + if X.GVoiceBase_IsOpen() then + local nSpeakerState = X.GVoiceBase_GetSpeakerState() + container:AppendContentFromIni(szIniFile, 'Wnd_Speaker') + :Lookup('WndButton_Speaker').nSpeakerState = nSpeakerState + container:Lookup('Wnd_Speaker/WndButton_Speaker', 'Image_Normal') + :SetVisible(nSpeakerState == X.CONSTANT.SPEAKER_STATE.OPEN) + container:Lookup('Wnd_Speaker/WndButton_Speaker', 'Image_Close_Speaker') + :SetVisible(nSpeakerState == X.CONSTANT.SPEAKER_STATE.CLOSE) + local nMicState = X.GVoiceBase_GetMicState() + container:AppendContentFromIni(szIniFile, 'Wnd_Microphone') + :Lookup('WndButton_Microphone').nMicState = nMicState + container:Lookup('Wnd_Microphone/WndButton_Microphone', 'Animate_Input_Mic') + :SetVisible(nMicState == X.CONSTANT.MIC_STATE.FREE) + container:Lookup('Wnd_Microphone/WndButton_Microphone', 'Image_UnInsert_Mic') + :SetVisible(nMicState == X.CONSTANT.MIC_STATE.NOT_AVIAL) + container:Lookup('Wnd_Microphone/WndButton_Microphone', 'Image_Close_Mic') + :SetVisible(nMicState == X.CONSTANT.MIC_STATE.CLOSE_NOT_IN_ROOM or nMicState == X.CONSTANT.MIC_STATE.CLOSE_IN_ROOM) + local hMicFree = container:Lookup('Wnd_Microphone/WndButton_Microphone', 'Handle_Free_Mic') + local hMicHotKey = container:Lookup('Wnd_Microphone/WndButton_Microphone', 'Handle_HotKey') + hMicFree:SetVisible(nMicState == X.CONSTANT.MIC_STATE.FREE) + hMicHotKey:SetVisible(nMicState == X.CONSTANT.MIC_STATE.KEY) + -- 自动调整语音按钮宽度 + local nMicWidth = hMicFree:GetRelX() + if nMicState == X.CONSTANT.MIC_STATE.FREE then + nMicWidth = nMicWidth + hMicFree:GetW() + elseif nMicState == X.CONSTANT.MIC_STATE.KEY then + nMicWidth = hMicHotKey:GetRelX() + hMicHotKey:GetW() + end + container:Lookup('Wnd_Microphone'):SetW(nMicWidth) + end + -- 最小化 + container:AppendContentFromIni(szIniFile, 'Wnd_Fold') + :Lookup('CheckBox_Fold'):Check(MY_Cataclysm.bFold, WNDEVENT_FIRETYPE.PREVENT) + -- 自动计算宽度 + local nW, wnd = 0, nil + for i = 0, container:GetAllContentCount() - 1 do + wnd = container:LookupContent(i) + wnd:SetRelX(nW) + nW = nW + wnd:GetW() + end + container:SetW(nW) + container:FormatAllContentPos() + D.SetFrameSize(false) + D.SetFrameCaption() +end + +-- 创建中间层数据 常用的 +function D.CreateItemData() + local frame = D.GetFrame() + if not frame then + return + end + for _, p in ipairs({ + {'hMember', 'MY_CataclysmParty_Item.' .. CFG.eFrameStyle .. '.ini', 'Handle_RoleDummy'}, + {'hBuff', 'MY_CataclysmParty_Item.' .. CFG.eFrameStyle .. '.ini', 'Handle_Buff'}, + }) do + if frame[p[1]] then + frame:RemoveItemData(frame[p[1]]) + end + frame[p[1]] = frame:CreateItemData(INI_ROOT .. p[2], p[3]) or frame[p[1]] -- 兼容当前KGUI错误代码 + end +end + +function D.OpenCataclysmPanel() + if not D.GetFrame() then + if CFG.eCss == '' then + D.ConfirmRestoreConfig() + end + X.UI.OpenFrame(INI_ROOT .. 'MY_CataclysmMain.ini', 'MY_CataclysmMain') + end +end + +function D.CloseCataclysmPanel() + if D.GetFrame() then + X.UI.CloseFrame(D.GetFrame()) + MY_CataclysmParty:CloseParty() + MY_Cataclysm.bFold = false + end +end + +function D.CheckCataclysmEnable() + local me = X.GetClientPlayer() + if not MY_Cataclysm.bEnable then + D.CloseCataclysmPanel() + return false + end + if CFG.bShowInRaid and not me.IsInRaid() then + D.CloseCataclysmPanel() + return false + end + if not me.IsInParty() then + D.CloseCataclysmPanel() + return false + end + D.OpenCataclysmPanel() + return true +end + +function D.ReloadCataclysmPanel() + if D.GetFrame() then + D.CreateItemData() + D.CreateControlBar() + MY_CataclysmParty:CloseParty() + MY_CataclysmParty:ReloadParty() + end +end + +function D.UpdateAnchor(frame) + local a = CFG.tAnchor + if not X.IsEmpty(a) then + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + else + frame:SetPoint('LEFTCENTER', 0, 0, 'LEFTCENTER', 100, -200) + end +end + +function D.OnWageStart() + MY_CataclysmParty:StartTeamVote('wage_agree') + local nTime = GetCurrentTime() + local function fnAction() + D.SetFrameCaption(_L('Wage await %ds...', 30 - (GetCurrentTime() - nTime))) + end + fnAction() + X.BreatheCall('MY_Cataclysm_Wage', 1000, fnAction) +end + +function D.OnWageFinish() + MY_CataclysmParty:ClearTeamVote('wage_agree') + D.SetFrameCaption('') + X.BreatheCall('MY_Cataclysm_Wage', false) +end + +------------------------------------------------- +-- 界面创建 事件注册 +------------------------------------------------- +function D.OnFrameCreate() + if CFG.bFasterHP then + this:RegisterEvent('RENDER_FRAME_UPDATE') + end + this:RegisterEvent('PARTY_SYNC_MEMBER_DATA') + this:RegisterEvent('PARTY_ADD_MEMBER') + this:RegisterEvent('PARTY_DISBAND') + this:RegisterEvent('PARTY_DELETE_MEMBER') + this:RegisterEvent('PARTY_UPDATE_MEMBER_INFO') + this:RegisterEvent('PARTY_UPDATE_MEMBER_LMR') + this:RegisterEvent('PARTY_LEVEL_UP_RAID') + this:RegisterEvent('PARTY_SET_MEMBER_ONLINE_FLAG') + this:RegisterEvent('PLAYER_STATE_UPDATE') + this:RegisterEvent('UPDATE_PLAYER_SCHOOL_ID') + -- this:RegisterEvent('RIAD_READY_CONFIRM_RECEIVE_QUESTION') + this:RegisterEvent('RIAD_READY_CONFIRM_RECEIVE_ANSWER') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('PARTY_SET_MARK') + this:RegisterEvent('TEAM_AUTHORITY_CHANGED') + this:RegisterEvent('TEAM_CHANGE_MEMBER_GROUP') + this:RegisterEvent('PARTY_SET_FORMATION_LEADER') + this:RegisterEvent('PARTY_LOOT_MODE_CHANGED') + this:RegisterEvent('PARTY_ROLL_QUALITY_CHANGED') + this:RegisterEvent('LOADING_END') + this:RegisterEvent('TARGET_CHANGE') + this:RegisterEvent('CHARACTER_THREAT_RANKLIST') + this:RegisterEvent('BUFF_UPDATE') + this:RegisterEvent('PLAYER_ENTER_SCENE') + this:RegisterEvent('MY_CATACLYSM_BUFF_LIST_CACHE_UPDATE') + this:RegisterEvent('MY_CATACLYSM_SET_VISIBLE') + this:RegisterEvent('MY_CATACLYSM_SET_FOLD') + -- 拍团部分 arg0 0=T人 1=分工资 + this:RegisterEvent('TEAM_VOTE_REQUEST') + -- arg0 回应状态 arg1 dwID arg2 同意=1 反对=0 + this:RegisterEvent('TEAM_VOTE_RESPOND') + this:RegisterEvent('TEAM_INCOMEMONEY_CHANGE_NOTIFY') + this:RegisterEvent('SYS_MSG') + this:RegisterEvent('MY_RAID_REC_BUFF') + this:RegisterEvent('GKP_RECORD_TOTAL') + this:RegisterEvent('GVOICE_MIC_STATE_CHANGED') + this:RegisterEvent('GVOICE_SPEAKER_STATE_CHANGED') + this:RegisterEvent('ON_MY_MOSAICS_RESET') + this:RegisterEvent('ON_TEAMSWICTH_FRAMEDRAG') + this:RegisterEvent('TEAM_SWICTH_ROOM') + if X.GetClientPlayer() then + D.UpdateAnchor(this) + MY_CataclysmParty:AutoLinkAllPanel() + end + D.SetFrameSize() + D.SetFrameCaption() + D.CreateItemData() + D.CreateControlBar() + this:EnableDrag(CFG.bDrag) + this:SetVisible(MY_Cataclysm.bVisible) +end + +------------------------------------------------- +-- 拖动窗体 OnFrameDrag +------------------------------------------------- + +function D.OnFrameDragSetPosEnd() + D.UpdateOfficialTeamSwitchPanel(true) + MY_CataclysmParty:AutoLinkAllPanel() +end + +function D.OnFrameDragEnd() + this:CorrectPos() + CFG.tAnchor = GetFrameAnchor(this, 'TOPLEFT') + MY_CataclysmParty:AutoLinkAllPanel() -- fix screen pos +end + +------------------------------------------------- +-- 事件处理 +------------------------------------------------- +do +local function RecBuffWithTabs(tabs, dwOwnerID, dwBuffID, dwSrcID) + if not tabs then + return + end + for _, tab in ipairs(tabs) do + if not tab.bOnlyMine or dwSrcID == X.GetClientPlayerID() then + MY_CataclysmParty:RecBuff(dwOwnerID, setmetatable({ + dwID = dwBuffID, + nLevel = tab.nLevel or 0, + bOnlyMine = tab.bOnlyMine or tab.bOnlySelf or tab.bSelf, + }, { __index = tab })) + end + end +end +local function OnBuffUpdate(dwOwnerID, dwID, nLevel, nStackNum, dwSrcID) + if X.IsBossFocusBuff(dwID, nLevel, nStackNum) then + MY_CataclysmParty:RecBossFocusBuff(dwOwnerID, { + dwID = dwID , + nLevel = nLevel , + nStackNum = nStackNum, + }) + end + if MY_IsVisibleBuff(dwID, nLevel) and not X.IsRestricted('MY_Cataclysm_BuffMonitor') then + local szName = MY_GetBuffName(dwID, nLevel) + RecBuffWithTabs(BUFF_LIST[dwID], dwOwnerID, dwID, dwSrcID) + RecBuffWithTabs(BUFF_LIST[szName], dwOwnerID, dwID, dwSrcID) + end +end +function D.OnEvent(szEvent) + if szEvent == 'RENDER_FRAME_UPDATE' then + MY_CataclysmParty:CallDrawHPMP(true) + elseif szEvent == 'SYS_MSG' then + if arg0 == 'UI_OME_SKILL_CAST_LOG' and arg2 == 13165 then + MY_CataclysmParty:KungFuSwitch(arg1) + end + if CFG.bShowEffect then + if arg0 == 'UI_OME_SKILL_EFFECT_LOG' + and arg5 == 6252 + and arg9[SKILL_RESULT_TYPE.THERAPY] + and (arg1 == X.GetControlPlayerID() or UI_GetPlayerMountKungfuID() ~= 10176) then + MY_CataclysmParty:CallEffect(arg2, 500) + end + end + elseif szEvent == 'PARTY_SYNC_MEMBER_DATA' then + MY_CataclysmParty:CallRefreshImages(arg1, true, true, nil, true) + MY_CataclysmParty:CallDrawHPMP(arg1, true) + elseif szEvent == 'PARTY_ADD_MEMBER' then + if MY_CataclysmParty:GetPartyFrame(arg2) then + MY_CataclysmParty:DrawParty(arg2) + else + MY_CataclysmParty:CreatePanel(arg2) + MY_CataclysmParty:DrawParty(arg2) + D.SetFrameSize() + end + if CFG.nAutoLinkMode ~= 5 then + MY_CataclysmParty:AutoLinkAllPanel() + end + D.UpdatePrepareBarPos() + elseif szEvent == 'PARTY_DELETE_MEMBER' then + local me = X.GetClientPlayer() + if me.dwID == arg1 then + D.OnWageFinish() + D.CloseCataclysmPanel() + else + local team = GetClientTeam() + local tGroup = team.GetGroupInfo(arg3) + if #tGroup.MemberList == 0 then + MY_CataclysmParty:CloseParty(arg3) + MY_CataclysmParty:AutoLinkAllPanel() + else + MY_CataclysmParty:DrawParty(arg3) + end + if CFG.nAutoLinkMode ~= 5 then + MY_CataclysmParty:AutoLinkAllPanel() + end + end + D.SetFrameSize() + D.UpdatePrepareBarPos() + elseif szEvent == 'PARTY_DISBAND' then + D.OnWageFinish() + D.CloseCataclysmPanel() + elseif szEvent == 'PARTY_UPDATE_MEMBER_LMR' then + MY_CataclysmParty:CallDrawHPMP(arg1, true) + elseif szEvent == 'PARTY_UPDATE_MEMBER_INFO' then + MY_CataclysmParty:CallRefreshImages(arg1, false, true, nil, true) + MY_CataclysmParty:CallDrawHPMP(arg1, true) + elseif szEvent == 'UPDATE_PLAYER_SCHOOL_ID' then + if X.IsTeammate(arg0) then + MY_CataclysmParty:CallRefreshImages(arg0, false, true) + end + elseif szEvent == 'PLAYER_STATE_UPDATE' then + if X.IsTeammate(arg0) then + MY_CataclysmParty:CallDrawHPMP(arg0, true) + end + elseif szEvent == 'PARTY_SET_MEMBER_ONLINE_FLAG' then + MY_CataclysmParty:CallDrawHPMP(arg1, true) + elseif szEvent == 'TEAM_AUTHORITY_CHANGED' then + MY_CataclysmParty:CallRefreshImages(arg2, true) + MY_CataclysmParty:CallRefreshImages(arg3, true) + D.CreateControlBar() + elseif szEvent == 'PARTY_SET_FORMATION_LEADER' then + MY_CataclysmParty:RefreshFormation() + elseif szEvent == 'PARTY_SET_MARK' then + MY_CataclysmParty:RefreshMark() + elseif szEvent == 'TEAM_VOTE_REQUEST' then + -- arg0 nVoteType + -- arg1 nArg0 + -- arg2 nArg1 + if arg0 == 1 then + D.OnWageStart() + end + elseif szEvent == 'TEAM_VOTE_RESPOND' then + -- arg0 nVoteType + -- arg1 dwAnswerID + -- arg2 bYes + -- arg3 nArg0 + -- arg4 nArg1 + if arg0 == 1 then + MY_CataclysmParty:ChangeTeamVoteState('wage_agree', arg1, arg2 == 1 and 'resolve' or 'reject') + end + elseif szEvent == 'TEAM_INCOMEMONEY_CHANGE_NOTIFY' then + local nTotalRaidMoney = GetClientTeam().nInComeMoney + if nTotalRaidMoney and nTotalRaidMoney == 0 then + D.OnWageFinish() + end + -- elseif szEvent == 'RIAD_READY_CONFIRM_RECEIVE_QUESTION' then + elseif szEvent == 'RIAD_READY_CONFIRM_RECEIVE_ANSWER' then + MY_CataclysmParty:ChangeTeamVoteState('raid_ready', arg0, arg1 == 1 and 'resolve' or 'reject') + elseif szEvent == 'TEAM_CHANGE_MEMBER_GROUP' then + local me = X.GetClientPlayer() + local team = GetClientTeam() + local tSrcGropu = team.GetGroupInfo(arg1) + -- SrcGroup + if #tSrcGropu.MemberList == 0 then + MY_CataclysmParty:CloseParty(arg1) + MY_CataclysmParty:AutoLinkAllPanel() + else + MY_CataclysmParty:DrawParty(arg1) + end + -- DstGroup + if not MY_CataclysmParty:GetPartyFrame(arg2) then + MY_CataclysmParty:CreatePanel(arg2) + end + MY_CataclysmParty:DrawParty(arg2) + MY_CataclysmParty:RefreshGroupText() + MY_CataclysmParty:RefreshMark() + if CFG.nAutoLinkMode ~= 5 then + MY_CataclysmParty:AutoLinkAllPanel() + end + D.SetFrameSize() + elseif szEvent == 'PARTY_LEVEL_UP_RAID' then + MY_CataclysmParty:RefreshGroupText() + elseif szEvent == 'PARTY_LOOT_MODE_CHANGED' then + D.CreateControlBar() + elseif szEvent == 'PARTY_ROLL_QUALITY_CHANGED' then + D.CreateControlBar() + elseif szEvent == 'TARGET_CHANGE' then + -- oldid, oldtype, newid, newtype + MY_CataclysmParty:RefreshTarget(arg0, arg1, arg2, arg3) + elseif szEvent == 'CHARACTER_THREAT_RANKLIST' then + MY_CataclysmParty:RefreshThreat(arg0, arg1) + elseif szEvent == 'MY_RAID_REC_BUFF' then + MY_CataclysmParty:RecBuff(arg0, arg1) + elseif szEvent == 'BUFF_UPDATE' then + -- local owner, bdelete, index, cancancel, id , stacknum, endframe, binit, level, srcid, isvalid, leftframe + -- = arg0 , arg1 , arg2 , arg3 , arg4, arg5 , arg6 , arg7 , arg8 , arg9 , arg10 , arg11 + if arg1 then + return + end + OnBuffUpdate(arg0, arg4, arg8, arg5, arg9) + elseif szEvent == 'PLAYER_ENTER_SCENE' then + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local dwID = arg0 + if not me.IsPlayerInMyParty(dwID) then + return + end + local function update() + local tar = X.GetPlayer(dwID) + if not tar then + return + end + local aList = X.GetBuffList(tar) + if X.count_c(aList) == 0 then + return X.DelayCall(update, 75) + end + for _, buff in X.ipairs_c(aList) do + OnBuffUpdate(dwID, buff.dwID, buff.nLevel, buff.nStackNum, buff.dwSkillSrcID) + end + end + X.DelayCall(update, 75) + elseif szEvent == 'MY_CATACLYSM_BUFF_LIST_CACHE_UPDATE' then + local team = GetClientTeam() + if not team then + return + end + MY_CataclysmParty:ClearBuff() + for _, dwID in ipairs(team.GetTeamMemberList()) do + local tar = X.GetPlayer(dwID) + if tar then + for _, buff in X.ipairs_c(X.GetBuffList(tar)) do + OnBuffUpdate(dwID, buff.dwID, buff.nLevel, buff.nStackNum, buff.dwSkillSrcID) + end + end + end + elseif szEvent == 'MY_CATACLYSM_SET_VISIBLE' then + this:SetVisible(MY_Cataclysm.bVisible) + elseif szEvent == 'MY_CATACLYSM_SET_FOLD' then + D.UpdatePrepareBarPos() + elseif szEvent == 'GKP_RECORD_TOTAL' then + GKP_RECORD_TOTAL = arg0 + elseif szEvent == 'GVOICE_MIC_STATE_CHANGED' then + D.CreateControlBar() + elseif szEvent == 'GVOICE_SPEAKER_STATE_CHANGED' then + D.CreateControlBar() + elseif szEvent == 'ON_MY_MOSAICS_RESET' then + D.ReloadCataclysmPanel() + elseif szEvent == 'ON_TEAMSWICTH_FRAMEDRAG' then + D.UpdateOfficialTeamSwitchPanel() + elseif szEvent == 'TEAM_SWICTH_ROOM' then + D.UpdateOfficialTeamSwitchPanel() + elseif szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + MY_CataclysmParty:RefreshSFX() + MY_CataclysmParty:AutoLinkAllPanel() + elseif szEvent == 'LOADING_END' then -- 勿删 + D.OnWageFinish() + D.ReloadCataclysmPanel() + D.RaidPanel_Switch(DEBUG) + D.TeammatePanel_Switch(false) + D.SetFrameSize() + D.SetFrameCaption() + end +end + +do +local i = 1 +function D.FrameBuffRefreshCall() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + local team = GetClientTeam() + if not team then + return + end + local aList = team.GetTeamMemberList() + local nCount = #aList + if i > nCount then + i = 1 + end + local tar = X.GetPlayer(aList[i]) + if tar then + for _, buff in X.ipairs_c(X.GetBuffList(tar)) do + OnBuffUpdate(tar.dwID, buff.dwID, buff.nLevel, buff.nStackNum, buff.dwSkillSrcID) + end + end + i = i + 1 +end +end + +function D.UpdateOfficialTeamSwitchPanel(bFollowCataclysm) + local frame = D.GetFrame() + if not frame then + return + end + local bVisible = X.GetCurrentTeamSwitchType() == 'TEAM' + local frmSwitch = Station.Lookup('Normal/TeamSwitchBtn') + if bVisible and frmSwitch then + if bFollowCataclysm then + if TeamSwitchBtn_SetAbsPos then + local nX, nY = frame:GetRelPos() + TeamSwitchBtn_SetAbsPos(nX, nY) + end + else + local nX, nY = frmSwitch:GetRelPos() + nX = nX + frmSwitch:GetW() + if nX ~= frame:GetRelX() or nY ~= frame:GetRelY() then + frame:SetRelPos(nX, nY) + MY_CataclysmParty:AutoLinkAllPanel() + end + end + end + if MY_Cataclysm.bVisible ~= bVisible then + MY_Cataclysm.bVisible = bVisible + end +end + +function D.UpdateOTAction(frame) + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 4 ~= 0 then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local KOTTarget + for _, npc in ipairs(X.GetNearBoss()) do + if not KOTTarget or not KOTTarget.bFightState then + KOTTarget = npc + end + end + if not KOTTarget then + local dwType, dwID = me.GetTarget() + if dwType == TARGET.NPC then + KOTTarget = X.GetNpc(dwID) + elseif dwType == TARGET.PLAYER then + local tar = X.GetPlayer(dwID) + local dwType, dwID = tar.GetTarget() + if dwType == TARGET.NPC then + KOTTarget = X.GetNpc(dwID) + end + end + end + local hPrepare = frame:Lookup('', 'Handle_Prepare') + if KOTTarget then + local nType, dwSkillID, dwSkillLevel, fProgress = X.GetCharacterOTActionState(KOTTarget) + if nType ~= X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_IDLE and fProgress and dwSkillID and dwSkillID ~= 0 and dwSkillLevel then + hPrepare:Lookup('Text_Prepare'):SetText(X.GetSkillName(dwSkillID, dwSkillLevel) or '') + hPrepare:Lookup('Image_Prepare'):SetPercentage(fProgress) + hPrepare:SetAlpha(255) + frame.nOTEndTime = GetTime() + return + end + end + hPrepare:SetAlpha(math.max(0, (1 - (GetTime() - (frame.nOTEndTime or 0)) / 2000) * 255)) +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then + return + end + D.UpdateOTAction(this) + if not CFG.bFasterHP and GetLogicFrameCount() % CFG.nDrawInterval ~= 0 then + return + end + MY_CataclysmParty:RefreshDistance() + MY_CataclysmParty:RefreshBuff() + MY_CataclysmParty:RefreshAttention() + MY_CataclysmParty:RefreshCaution() + MY_CataclysmParty:RefreshTTarget() + MY_CataclysmParty:RefreshBossTarget() + MY_CataclysmParty:RefreshBossFocus() + MY_CataclysmParty:RefreshSputtering() + MY_CataclysmParty:RefreshPlayerSkillCD() + -- kill System Panel + D.RaidPanel_Switch(DEBUG) + D.TeammatePanel_Switch(false) + D.FrameBuffRefreshCall() + -- 官方代码太容易报错 放最后 + if not this.nBreatheTime or GetTime() - this.nBreatheTime >= 300 then -- 语音最短刷新间隔300ms + MY_CataclysmParty:RefreshGVoice() + this.nBreatheTime = GetTime() + end + X.GVoiceBase_CheckMicState() +end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Option' then + local me = X.GetClientPlayer() + local menu = {} + if me.IsInRaid() then + -- 团队就位 + table.insert(menu, { + szOption = g_tStrings.STR_RAID_MENU_READY_CONFIRM, + { + szOption = g_tStrings.STR_RAID_READY_CONFIRM_START, + bDisable = not X.IsClientPlayerTeamLeader(), + fnAction = function() + Send_RaidReadyConfirm() + MY_CataclysmParty:StartTeamVote('raid_ready') + end, + }, + { + szOption = g_tStrings.STR_RAID_READY_CONFIRM_RESET, + fnAction = function() MY_CataclysmParty:ClearTeamVote('raid_ready') end, + } + }) + table.insert(menu, { bDevide = true }) + end + -- 分配 + D.InsertDistributeMenu(menu, not X.IsClientPlayerTeamDistributor()) + if MY_TeamCountdown then + table.insert(menu, { szOption = _L['Open team countdown'], fnAction = function() + MY_TeamCountdown.Open() + end }) + end + table.insert(menu, { bDevide = true }) + if me.IsInRaid() then + -- 编辑模式 + table.insert(menu, { szOption = string.gsub(g_tStrings.STR_RAID_MENU_RAID_EDIT, 'Ctrl', 'Alt'), bDisable = not X.IsClientPlayerTeamLeader() or not me.IsInRaid(), bCheck = true, bChecked = CFG.bEditMode, fnAction = function() + CFG.bEditMode = not CFG.bEditMode + X.UI.ClosePopupMenu() + end }) + -- 人数统计 + table.insert(menu, { bDevide = true }) + D.InsertForceCountMenu(menu) + -- 团队快照上传 + if X.IsClientPlayerTeamLeader() and X.IsTable(MY_JBTeamSnapshot) and X.IsFunction(MY_JBTeamSnapshot.CreateSnapshot) then + table.insert(menu, { + szOption = _L['Upload team snapshot'], + fnAction = function() + MY_JBTeamSnapshot.CreateSnapshot() + end, + }) + end + table.insert(menu, { bDevide = true }) + end + table.insert(menu, { szOption = _L['Interface settings'], rgb = { 255, 255, 0 }, fnAction = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_Cataclysm') + end }) + if X.IsDebugging() then + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = 'DEBUG', bCheck = true, bChecked = DEBUG, fnAction = function() + DEBUG = not DEBUG + end }) + end + local nX, nY = Cursor.GetPos(true) + menu.x, menu.y = nX, nY + PopupMenu(menu) + elseif szName == 'WndButton_WorldMark' then + if IsCtrlKeyDown() and MY_YunWorldMark then + MY_YunWorldMark.OpenPanel() + return + end + local me = X.GetClientPlayer() + local dwMapID = me.GetMapID() + local nMapType = select(2, GetMapParams(dwMapID)) + if not nMapType or nMapType ~= MAP_TYPE.DUNGEON then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.STR_WORLD_MARK) + return + end + Wnd.ToggleWindow('WorldMark') + elseif szName == 'WndButton_GKP' then + local team = GetClientTeam() + local nLootMode = team.nLootMode + if nLootMode == PARTY_LOOT_MODE.BIDDING then + return OpenGoldTeam() + end + if not MY_GKP_MI then + return X.Alert(_L['Please install and load GKP addon first.']) + end + return MY_GKP_MI.TogglePanel() + elseif szName == 'Wnd_TeamTools' then + if not MY_TeamTools then + return X.Alert(_L['Please install and load MY_TeamTools addon first.']) + end + MY_TeamTools.Toggle() + elseif szName == 'Wnd_TeamNotice' then + if not MY_TeamNotice then + return X.Alert(_L['Please install and load MY_TeamNotice addon first.']) + end + MY_TeamNotice.OpenFrame() + elseif szName == 'Wnd_TeamMon_Subscribe' then + if not MY_TeamMon then + return X.Alert(_L['Please install and load MY_TeamMon addon first.']) + end + MY_TeamMon_Subscribe.OpenPanel() + elseif szName == 'WndButton_LootMode' or szName == 'WndButton_LootQuality' then + if X.IsClientPlayerTeamDistributor() then + local menu = {} + if szName == 'WndButton_LootMode' then + D.InsertDistributeMenu(menu, not X.IsClientPlayerTeamDistributor()) + PopupMenu(menu[1]) + elseif szName == 'WndButton_LootQuality' then + D.InsertDistributeMenu(menu, not X.IsClientPlayerTeamDistributor()) + PopupMenu(menu[2]) + end + else + return X.OutputSystemMessage(_L['You are not the distrubutor.']) + end + elseif szName == 'WndButton_EnvokeAllTeammates' then + EnvokeAllTeammates() + elseif szName == 'Wnd_TeamCountdown' then + MY_TeamCountdown.Open() + elseif szName == 'WndButton_Speaker' then + X.GVoiceBase_SwitchSpeakerState() + elseif szName == 'WndButton_Microphone' then + X.GVoiceBase_SwitchMicState() + end +end + +function D.OnLButtonDown() + MY_CataclysmParty:BringToTop() +end + +function D.OnRButtonDown() + MY_CataclysmParty:BringToTop() +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_Fold' then + MY_Cataclysm.bFold = true + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + if name == 'CheckBox_Fold' then + MY_Cataclysm.bFold = false + end +end + +local SPEAKER_TIP = { + [X.CONSTANT.SPEAKER_STATE.OPEN ] = g_tStrings.GVOICE_SPEAKER_OPEN_TIP, + [X.CONSTANT.SPEAKER_STATE.CLOSE] = g_tStrings.GVOICE_SPEAKER_CLOSE_TIP, +} +local MIC_TIP = setmetatable({ + [X.CONSTANT.MIC_STATE.NOT_AVIAL ] = g_tStrings.GVOICE_MIC_UNAVIAL_STATE_TIP, + [X.CONSTANT.MIC_STATE.CLOSE_NOT_IN_ROOM] = g_tStrings.GVOICE_MIC_JOIN_STATE_TIP, + [X.CONSTANT.MIC_STATE.CLOSE_IN_ROOM ] = g_tStrings.GVOICE_MIC_KEY_STATE_TIP, + [X.CONSTANT.MIC_STATE.FREE ] = g_tStrings.GVOICE_MIC_CLOSE_STATE_TIP, +}, { + __index = function(t, k) + if k == X.CONSTANT.MIC_STATE.KEY then + if X.GetHotKey('TOGGLE_GVOCIE_SAY') then + return (g_tStrings.GVOICE_MIC_FREE_STATE_TIP + :format(X.GetHotKeyDisplay('TOGGLE_GVOCIE_SAY'))) + else + return g_tStrings.GVOICE_MIC_FREE_STATE_TIP2 + end + end + end, +}) + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'WndButton_GKP' + or name == 'WndButton_LootMode' + or name == 'WndButton_LootQuality' + or name == 'Wnd_TeamTools' + or name == 'Wnd_TeamNotice' + or name == 'Wnd_TeamMon_Subscribe' + or name == 'Wnd_TeamCountdown' then + this:SetAlpha(255) + end + if name == 'WndButton_GKP' then + X.OutputTip(this, _L['MY_GKP']) + elseif name == 'Wnd_TeamTools' then + X.OutputTip(this, _L['MY_TeamTools']) + elseif name == 'Wnd_TeamNotice' then + X.OutputTip(this, _L['MY_TeamNotice']) + elseif name == 'Wnd_TeamMon_Subscribe' then + X.OutputTip(this, _L['MY_TeamMon_Subscribe']) + elseif name == 'WndButton_EnvokeAllTeammates' then + X.OutputTip(this, _L['EnvokeAllTeammates']) + elseif name == 'Wnd_TeamCountdown' then + X.OutputTip(this, _L['TeamCountdown']) + elseif name == 'WndButton_Speaker' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(SPEAKER_TIP[this.nSpeakerState]), 400, { x, y, w, h }, ALW.TOP_BOTTOM) + elseif name == 'WndButton_Microphone' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(MIC_TIP[this.nMicState]), 400, { x, y, w, h }, ALW.TOP_BOTTOM) + end + D.SetFrameSize(true) +end + +function D.OnMouseLeave() + local name = this:GetName() + if name == 'WndButton_GKP' + or name == 'WndButton_LootMode' + or name == 'WndButton_LootQuality' + or name == 'Wnd_TeamTools' + or name == 'Wnd_TeamNotice' + or name == 'Wnd_TeamMon_Subscribe' + or name == 'Wnd_TeamCountdown' then + this:SetAlpha(220) + X.HideTip() + end + if not IsKeyDown('LButton') then + D.SetFrameSize() + end + HideTip() +end + +function D.CheckEnableTeamPanel() + if D.CheckCataclysmEnable() then + D.ReloadCataclysmPanel() + end + if not MY_Cataclysm.bEnable then + local me = X.GetClientPlayer() + if me.IsInRaid() then + FireUIEvent('MY_CATACLYSM_PANEL_RAID', true) + elseif me.IsInParty() then + FireUIEvent('MY_CATACLYSM_PANEL_TEAMMATE', true) + end + end +end + +function D.ToggleTeamPanel() + MY_Cataclysm.bEnable = not MY_Cataclysm.bEnable + D.CheckEnableTeamPanel() +end + +function D.ConfirmRestoreConfig() + MessageBox({ + szName = 'MY_Cataclysm_Restore_Default', + szAlignment = 'CENTER', + szMessage = _L['Please choose your favorite raid style.\nYou can rechoose in setting panel.'], + { + szOption = _L['Official style'], + fnAction = function() + D.SetConfig(X.Clone(CTM_CONFIG_OFFICIAL), true) + D.CheckEnableTeamPanel() + X.Panel.SwitchTab('MY_Cataclysm', true) + end, + }, + { + szOption = _L['Cataclysm style'], + fnAction = function() + D.SetConfig(X.Clone(CTM_CONFIG_CATACLYSM), true) + D.CheckEnableTeamPanel() + X.Panel.SwitchTab('MY_Cataclysm', true) + end, + }, + { + szOption = _L['Keep current'], + fnAction = function() + if CFG.eCss == '' then + CFG.eCss = 'DEFAULT' + end + end, + }, + }) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Cataclysm', + exports = { + { + preset = 'UIEvent', + fields = { + 'GetFrame', + 'OpenCataclysmPanel', + 'CloseCataclysmPanel', + 'LoadAncientConfigure', + 'SetFrameSize', + 'UpdateBuffListCache', + 'CheckEnableTeamPanel', + 'ToggleTeamPanel', + 'CheckCataclysmEnable', + 'ReloadCataclysmPanel', + 'ConfirmRestoreConfig', + }, + root = D, + }, + }, +} +MY_CataclysmMain = X.CreateModule(settings) +end + +X.RegisterEvent('MY_CATACLYSM_PANEL_TEAMMATE', function() + D.TeammatePanel_Switch(arg0) +end) +X.RegisterEvent('MY_CATACLYSM_PANEL_RAID', function() + D.RaidPanel_Switch(arg0) +end) + +-- 关于界面打开和刷新面板的时机 +-- 1) 普通情况下 组队会触发[PARTY_UPDATE_BASE_INFO]打开+刷新 +-- 2) 进入名剑大会/战场的情况下 不会触发[PARTY_UPDATE_BASE_INFO]事件 +-- 需要利用外面注册的[LOADING_END]来打开+刷新 +-- 3) 如果在名剑大会/战场掉线重上的情况下 需要使用外面注册的[LOADING_END]来打开面板 +-- 然后在UI上注册的[LOADING_END]的来刷新界面,否则获取不到团队成员,只能获取到有几个队 +-- UI的[LOADING_END]晚大约30m,然后就能获取到团队成员了?????? +-- 4) 从名剑大会/战场回到原服使用外面注册的[LOADING_END]来打开+刷新 +-- 5) 普通掉线/过地图使用外面注册的[LOADING_END]打开+刷新,避免过地图时候团队变动没有收到事件的情况。 +-- 6) 综上所述的各式各样的奇葩情况 可以做如下的调整 +-- 利用外面的注册的[LOADING_END]来打开 +-- 利用UI注册的[LOADING_END]来刷新 +-- 避免多次重复刷新面板浪费开销 +-- 7) 新增 PARTY_RESET 事件,官方从名剑大会出来时候补发这个事件 + +X.RegisterEvent('PARTY_UPDATE_BASE_INFO', function() + X.WithClientPlayer(function(me) + D.CheckCataclysmEnable() + D.ReloadCataclysmPanel() + end) + PlaySound(SOUND.UI_SOUND, g_sound.Gift) +end) + +X.RegisterEvent('PARTY_LEVEL_UP_RAID', function() + X.WithClientPlayer(function(me) + D.CheckCataclysmEnable() + D.ReloadCataclysmPanel() + end) +end) + +X.RegisterEvent('PARTY_RESET', function() + X.WithClientPlayer(function(me) + D.CheckCataclysmEnable() + D.ReloadCataclysmPanel() + end) +end) + +X.RegisterEvent('ON_PLUGIN_TEAM_NOTICE', function() + local tData, dwPlayerID = arg0, arg1 + if not tData[1] or not tData[1].dwSubType or tData[1].dwSubType ~= PLUGIN_TEAM.SKILL_NOTICE then + return + end + local tSkillInfo = string.split(tData[1].szText, '|') + if not tSkillInfo or X.IsEmpty(tSkillInfo) then + return + end + local nEndFrame = tonumber(tSkillInfo[1]) + local dwSkillID = tonumber(tSkillInfo[2]) + local nSkillLevel = tonumber(tSkillInfo[3]) + if not nEndFrame or not dwSkillID or not nSkillLevel then + return + end + MY_CataclysmParty:RecPlayerSkillCD(dwPlayerID, dwSkillID, nSkillLevel, nEndFrame) +end) + +X.RegisterUserSettingsInit(function() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and CFG.nDrawInterval == 4 then + CFG.nDrawInterval = 16 + end + X.WithClientPlayer(function(me) + D.CheckCataclysmEnable() + D.UpdateBuffListCache() + D.ReloadCataclysmPanel() + end) +end) + +X.RegisterEvent('LOADING_END', function() + X.WithClientPlayer(function(me) + D.CheckCataclysmEnable() + end) +end) + +X.RegisterAddonMenu(function() + return { szOption = _L['Cataclysm Team Panel'], bCheck = true, bChecked = MY_Cataclysm.bEnable, fnAction = D.ToggleTeamPanel } +end) + +X.RegisterTutorial({ + szKey = 'MY_Cataclysm', + szMessage = _L['Would you like to use MY cataclysm?'], + fnRequire = function() return not MY_Cataclysm.bEnable end, + { + szOption = _L['Use'], + bDefault = true, + fnAction = function() + MY_Cataclysm.bEnable = true + D.CheckEnableTeamPanel() + X.Panel.RedrawTab('MY_Cataclysm') + end, + }, + { + szOption = _L['Not use'], + fnAction = function() + MY_Cataclysm.bEnable = false + D.CheckEnableTeamPanel() + X.Panel.RedrawTab('MY_Cataclysm') + end, + }, +}) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmPS.BuffMonitor.lua b/MY_Cataclysm/src/MY_CataclysmPS.BuffMonitor.lua new file mode 100644 index 000000000..f937aba14 --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmPS.BuffMonitor.lua @@ -0,0 +1,293 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板BUFF设置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmPS.BuffMonitor' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_Cataclysm_BuffMonitor', { ['*'] = false, exp = false }) +-------------------------------------------------------------------------------- + +local D = { + ReloadCataclysmPanel = MY_CataclysmMain.ReloadCataclysmPanel, +} +local CFG, PS = MY_Cataclysm.CFG, { nPriority = 5 } + +-- 解析 +local function EncodeBuffRuleList(aBuffList) + local aName = {} + for _, v in ipairs(aBuffList) do + table.insert(aName, MY_Cataclysm.EncodeBuffRule(v)) + end + return table.concat(aName, '\n') +end + +local function DecodeBuffRuleList(szText) + local aBuffList = {} + for _, v in ipairs(X.SplitString(szText, '\n')) do + v = MY_Cataclysm.DecodeBuffRule(v) + if v then + table.insert(aBuffList, v) + end + end + return aBuffList +end + +local l_list +local function OpenBuffRuleEditor(rec) + MY_Cataclysm.OpenBuffRuleEditor(rec, function(p) + if p then + if l_list then + l_list:ListBox('update', 'id', rec, {'text'}, {MY_Cataclysm.EncodeBuffRule(rec)}) + end + MY_CataclysmMain.UpdateBuffListCache() + else + for i, p in ipairs(CFG.aBuffList) do + if p == rec then + if l_list then + l_list:ListBox('delete', 'id', rec) + end + table.remove(CFG.aBuffList, i) + MY_CataclysmMain.UpdateBuffListCache() + break + end + end + end + end, function() + CFG.aBuffList = CFG.aBuffList + X.Panel.SwitchTab('MY_Cataclysm_BuffMonitor', true) + end) +end + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 10, 10 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + local bRestricted = X.IsRestricted('MY_Cataclysm_BuffMonitor') + + if not bRestricted then + nX = nPaddingX + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 100, + buttonStyle = 'FLAT', + text = _L['Add'], + onClick = function() + local rec = {} + table.insert(CFG.aBuffList, rec) + l_list:ListBox('insert', { id = rec, text = MY_Cataclysm.EncodeBuffRule(rec), data = rec }) + OpenBuffRuleEditor(rec) + end, + }):AutoHeight():Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 100, + buttonStyle = 'FLAT', + text = _L['Edit'], + onClick = function() + local ui = X.UI.CreateFrame('MY_Cataclysm_BuffConfig', { + w = 350, h = 550, + text = _L['Edit buff'], + close = true, anchor = 'CENTER', + }) + local x, y = 20, 60 + local edit = ui:Append('WndEditBox',{ + x = x, y = y, w = 310, h = 440, + limit = -1, multiline = true, + text = EncodeBuffRuleList(CFG.aBuffList), + }) + y = y + edit:Height() + 5 + + ui:Append('WndButton', { + x = x, y = y, w = 310, + text = _L['Sure'], + buttonStyle = 'FLAT', + onClick = function() + CFG.aBuffList = DecodeBuffRuleList(edit:Text()) + MY_CataclysmMain.UpdateBuffListCache() + ui:Remove() + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + X.Panel.SwitchTab('MY_Cataclysm_BuffMonitor', true) + end, + }) + end, + }):AutoHeight():Width() + 5 + nX = nPaddingX + nY = nY + 30 + + l_list = ui:Append('WndListBox', { + x = nX, y = nY, + w = nW - 240 - 20, h = nH - nY - 5, + listBox = {{ + 'onlclick', + function(id, szText, data, bSelected) + OpenBuffRuleEditor(data) + return false + end, + }}, + }) + for _, rec in ipairs(CFG.aBuffList) do + l_list:ListBox('insert', { id = rec, text = MY_Cataclysm.EncodeBuffRule(rec), data = rec }) + end + nY = nH + end + + nPaddingX = X.IIf(bRestricted, 30, nW - 240) + nX = nPaddingX + nY = nPaddingY + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Auto scale'], + checked = CFG.bAutoBuffSize, + onCheck = function(bCheck) + CFG.bAutoBuffSize = bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, h = 25, rw = 80, + enable = not CFG.bAutoBuffSize, + autoEnable = function() return not CFG.bAutoBuffSize end, + range = {50, 200}, + value = CFG.fBuffScale * 100, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(nVal) + CFG.fBuffScale = nVal / 100 + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + textFormatter = function(val) return _L('%d%%', val) end, + }):AutoWidth():Width() + 10 + + nX = nPaddingX + nY = nY + 30 + nX = nX + ui:Append('Text', { x = nX, y = nY, h = 25, text = _L['Max count']}):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, h = 25, rw = 80, text = '', + range = {0, 10}, + value = CFG.nMaxShowBuff, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(nVal) + CFG.nMaxShowBuff = nVal + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 8 + + nX = nPaddingX + nY = nY + 30 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Push buff to official'], + checked = CFG.bBuffPushToOfficial, + onCheck = function(bCheck) + CFG.bBuffPushToOfficial = bCheck + MY_CataclysmMain.UpdateBuffListCache() + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Buff Staring'], + checked = CFG.bStaring, + onCheck = function(bCheck) + CFG.bStaring = bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + nY = nY + 30 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show Buff Time'], + checked = CFG.bShowBuffTime, + onCheck = function(bCheck) + CFG.bShowBuffTime = bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Over mana bar'], + checked = not CFG.bBuffAboveMana, + onCheck = function(bCheck) + CFG.bBuffAboveMana = not bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + nY = nY + 30 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show Buff Num'], + checked = CFG.bShowBuffNum, + onCheck = function(bCheck) + CFG.bShowBuffNum = bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show Buff Reminder'], + checked = CFG.bShowBuffReminder, + onCheck = function(bCheck) + CFG.bShowBuffReminder = bCheck + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + nY = nY + 30 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Alt Click Publish'], + checked = CFG.bBuffAltPublish, + onCheck = function(bCheck) + CFG.bBuffAltPublish = bCheck + end, + }):AutoWidth():Width() + 5 + nY = nY + 30 + + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Enable official data'], + checked = CFG.bBuffDataOfficial, + onCheck = function(bCheck) + CFG.bBuffDataOfficial = bCheck + MY_CataclysmMain.UpdateBuffListCache() + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + autoEnable = function() return _G.MY_Resource and true end, + }):AutoWidth():Width() + 5 + nY = nY + 30 + + if not bRestricted then + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Enable MY_TeamMon data'], + checked = CFG.bBuffDataTeamMon, + onCheck = function(bCheck) + CFG.bBuffDataTeamMon = bCheck + MY_CataclysmMain.UpdateBuffListCache() + X.DelayCall('MY_Cataclysm_Reload', 300, D.ReloadCataclysmPanel) + end, + autoEnable = function() return _G.MY_Resource and true end, + }):AutoWidth():Width() + 5 + nY = nY + 30 + end +end +function PS.OnPanelDeactive() + l_list = nil +end +X.Panel.Register(_L['Raid'], 'MY_Cataclysm_BuffMonitor', _L['Buff settings'], 'ui/Image/UICommon/RaidTotal.uitex|65', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmPS.GridColor.lua b/MY_Cataclysm/src/MY_CataclysmPS.GridColor.lua new file mode 100644 index 000000000..e1c2befcb --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmPS.GridColor.lua @@ -0,0 +1,348 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板格子颜色 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmPS.GridColor' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local CFG, PS = MY_Cataclysm.CFG, { nPriority = 3 } +local CTM_BG_COLOR_MODE = MY_Cataclysm.BG_COLOR_MODE + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local x, y = nPaddingX, nPaddingY + + local tDistanceLevel = CFG.tDistanceLevel + local tDistanceCol = CFG.tDistanceCol + local tDistanceAlpha = CFG.tDistanceAlpha + local tOtherCol = CFG.tOtherCol + local tOtherAlpha = CFG.tOtherAlpha + local tManaColor = CFG.tManaColor + + y = y + ui:Append('Text', { x = x, y = y, text = g_tStrings.BACK_COLOR, font = 27 }):Height() + + x = x + 10 + y = y + 5 + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Colored as official team frame'], + group = 'BACK_COLOR', checked = CFG.nBGColorMode == CTM_BG_COLOR_MODE.OFFICIAL, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nBGColorMode = CTM_BG_COLOR_MODE.OFFICIAL + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end, + }):AutoWidth():Width() + + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Colored all the same'], + group = 'BACK_COLOR', checked = CFG.nBGColorMode == CTM_BG_COLOR_MODE.SAME_COLOR, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nBGColorMode = CTM_BG_COLOR_MODE.SAME_COLOR + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end, + }):AutoWidth():Width() + 5 + + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Colored according to the distance'], + group = 'BACK_COLOR', checked = CFG.nBGColorMode == CTM_BG_COLOR_MODE.BY_DISTANCE, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nBGColorMode = CTM_BG_COLOR_MODE.BY_DISTANCE + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end, + }):AutoWidth():Width() + 5 + + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = g_tStrings.STR_RAID_COLOR_NAME_SCHOOL, + group = 'BACK_COLOR', checked = CFG.nBGColorMode == CTM_BG_COLOR_MODE.BY_FORCE, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nBGColorMode = CTM_BG_COLOR_MODE.BY_FORCE + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end, + }):AutoWidth():Width() + 5 + + y = y + ui:Append('WndCheckBox', { + x = x, y = y, text = g_tStrings.STR_RAID_DISTANCE, + checked = CFG.bEnableDistance, + onCheck = function(bCheck) + CFG.bEnableDistance = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end, + }):AutoWidth():Height() + 5 + + -- 设置分段距离等级 + x = nPaddingX + 10 + if CFG.bEnableDistance then + y = y + ui:Append('WndButton', { + x = x, y = y, w = 150, h = 35, + text = _L['Edit Distance Level'], + buttonStyle = 'SKEUOMORPHISM_LACE_BORDER', + onClick = function() + GetUserInput(_L['distance, distance, ...'], function(szText) + local t = X.SplitString(X.TrimString(szText), ',') + local tt = {} + for k, v in ipairs(t) do + if not tonumber(v) then + table.remove(t, k) + else + table.insert(tt, tonumber(v)) + end + end + if #t > 0 then + tDistanceLevel = tt + for i = 1, #t do + table.insert(tDistanceCol, CFG.tDistanceCol[i] or { 255, 255, 255 }) + table.insert(tDistanceAlpha, CFG.tDistanceAlpha[i] or 255) + end + CFG.tDistanceLevel = tDistanceLevel + CFG.tDistanceCol = tDistanceCol + CFG.tDistanceAlpha = tDistanceAlpha + X.Panel.SwitchTab('MY_Cataclysm_GridColor', true) + end + end) + end, + }):Height() + end + + -- 统一背景 + if not CFG.bEnableDistance + or CFG.nBGColorMode == CTM_BG_COLOR_MODE.SAME_COLOR then + x = nPaddingX + 20 + ui:Append('Text', { x = x, y = y, text = g_tStrings.BACK_COLOR }):AutoWidth() + x = 280 + x = x + ui:Append('Shadow', { + w = 22, h = 22, x = x, y = y + 3, color = tDistanceCol[1], + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + tDistanceCol[1] = { r, g, b } + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tDistanceCol = tDistanceCol + X.UI(this):Color(r, g, b) + end) + end, + }):Width() + 5 + y = y + 30 + end + + -- 分段距离背景 + if CFG.bEnableDistance then + x = nPaddingX + 20 + for i = 1, #tDistanceLevel do + local n = tDistanceLevel[i - 1] or 0 + local text = n .. g_tStrings.STR_METER .. ' - ' + .. tDistanceLevel[i] + .. g_tStrings.STR_METER .. g_tStrings.BACK_COLOR + ui:Append('Text', { x = x, y = y, text = text }):AutoWidth() + local x = 280 + if CFG.nBGColorMode == CTM_BG_COLOR_MODE.BY_DISTANCE then + x = x + ui:Append('Shadow', { + w = 22, h = 22, x = x, y = y + 3, color = tDistanceCol[i], + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + tDistanceCol[i] = { r, g, b } + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tDistanceCol = tDistanceCol + X.UI(this):Color(r, g, b) + end) + end, + }):Width() + 5 + else + x = x + ui:Append('WndSlider', { + x = x, y = y + 3, h = 22, + range = {0, 255}, + value = tDistanceAlpha[i], + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) + tDistanceAlpha[i] = val + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tDistanceAlpha = tDistanceAlpha + end, + textFormatter = function(val) return _L('Alpha: %d.', val) end, + }):Width() + 5 + end + y = y + 30 + end + end + + -- 出同步范围背景 + x = nPaddingX + 20 + ui:Append('Text', { + x = x, y = y, + text = CFG.bEnableDistance + and _L('More than %d meter', tDistanceLevel[#tDistanceLevel]) + or g_tStrings.STR_RAID_DISTANCE_M4, + }):AutoWidth() + x = 280 + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.BY_FORCE + and CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL then + x = x + ui:Append('Shadow', { + w = 22, h = 22, x = x, y = y + 3, + color = tOtherCol[3], + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + tOtherCol[3] = { r, g, b } + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tOtherCol = tOtherCol + X.UI(this):Color(r, g, b) + end) + end, + textFormatter = function(val) return _L('Alpha: %d.', val) end, + }):Width() + 5 + end + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.BY_DISTANCE then + x = x + ui:Append('WndSlider', { + x = x, y = y + 3, h = 22, + range = {0, 255}, + value = tOtherAlpha[3], + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) + tOtherAlpha[3] = val + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tOtherAlpha = tOtherAlpha + end, + textFormatter = function(val) return _L('Alpha: %d.', val) end, + }):Width() + 5 + end + y = y + 30 + + -- 离线背景 + x = nPaddingX + 20 + ui:Append('Text', { x = x, y = y, text = g_tStrings.STR_GUILD_OFFLINE .. g_tStrings.BACK_COLOR }):AutoWidth() + x = 280 + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL then + x = x + ui:Append('Shadow', { + w = 22, h = 22, x = x, y = y + 3, color = tOtherCol[2], + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + tOtherCol[2] = { r, g, b } + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tOtherCol = tOtherCol + X.UI(this):Color(r, g, b) + end) + end, + }):Width() + 5 + end + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.BY_DISTANCE then + x = x + ui:Append('WndSlider', { + x = x, y = y + 3, h = 22, + range = {0, 255}, + value = tOtherAlpha[2], + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) + tOtherAlpha[2] = val + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tOtherAlpha = tOtherAlpha + end, + textFormatter = function(val) return _L('Alpha: %d.', val) end, + }):Width() + 5 + end + y = y + 30 + + -- 内力 + x = nPaddingX + 20 + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL then + ui:Append('Text', { x = x, y = y, text = g_tStrings.STR_SKILL_MANA .. g_tStrings.BACK_COLOR }):AutoWidth() + y = y + ui:Append('Shadow', { + w = 22, h = 22, x = 280, y = y + 3, color = tManaColor, + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + tManaColor = { r, g, b } + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + CFG.tManaColor = tManaColor + X.UI(this):Color(r, g, b) + end) + end, + }):Height() + 5 + end + + -- 血条蓝条渐变色 + x = nPaddingX + 10 + y = y + 5 + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL then + x = x + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['LifeBar Gradient'], + checked = CFG.bLifeGradient, + onCheck = function(bCheck) + CFG.bLifeGradient = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + + x = x + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['ManaBar Gradient'], + checked = CFG.bManaGradient, + onCheck = function(bCheck) + CFG.bManaGradient = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + end +end +X.Panel.Register(_L['Raid'], 'MY_Cataclysm_GridColor', _L['Grid Color'], 'ui/Image/UICommon/RaidTotal.uitex|71', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmPS.GridStyle.lua b/MY_Cataclysm/src/MY_CataclysmPS.GridStyle.lua new file mode 100644 index 000000000..df5e784d5 --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmPS.GridStyle.lua @@ -0,0 +1,315 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板格子样式 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmPS.GridStyle' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local CFG, PS = MY_Cataclysm.CFG, { nPriority = 2 } + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local x, y = nPaddingX, nPaddingY + + y = y + ui:Append('Text', { x = x, y = y, text = _L['Grid Style'], font = 27 }):Height() + + y = y + 5 + + x = nPaddingX + 10 + y = y + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['Show AllGrid'], + checked = CFG.bShowAllGrid, + onCheck = function(bCheck) + CFG.bShowAllGrid = bCheck + MY_CataclysmMain.ReloadCataclysmPanel() + end, + }):AutoWidth():Height() + 5 + + x = nPaddingX + y = y + 10 + + -- 名字、图标、内力和血量显示方案 + x = nPaddingX + y = y + ui:Append('Text', { x = x, y = y, text = _L['Name/Icon/Mana/Life Display'], font = 27 }):Height() + + -- 名字 + x = nPaddingX + 10 + y = y + 5 + for _, p in ipairs({ + { 1, _L['Name colored by force'] }, + { 2, _L['Name colored by camp'] }, + { 0, _L['Name without color'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'namecolor', checked = CFG.nColoredName == p[1], + onCheck = function() + CFG.nColoredName = p[1] + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallRefreshImages(true, false, false, nil, true) + MY_CataclysmParty:CallDrawHPMP(true ,true) + end + end, + }):AutoWidth():Width() + 5 + end + + y = y + ui:Append('WndSlider', { + x = x, y = y - 1, + value = CFG.fNameFontScale * 100, + range = {1, 400}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('Scale %d%%', val) end, + onChange = function(val) + CFG.fNameFontScale = val / 100 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallRefreshImages(nil, nil, nil, nil, true) + end + end, + }):Height() + + x = nPaddingX + 10 + for _, p in ipairs({ + { 0, _L['Top'] }, + { 1, _L['Middle'] }, + { 2, _L['Bottom'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'namevali', checked = CFG.nNameVAlignment == p[1], + onCheck = function() + CFG.nNameVAlignment = p[1] + MY_CataclysmParty:CallRefreshImages(true, false, true, nil, true) + end, + }):AutoWidth():Width() + 5 + end + for _, p in ipairs({ + { 0, _L['Left'] }, + { 1, _L['Center'] }, + { 2, _L['Right'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'namehali', checked = CFG.nNameHAlignment == p[1], + onCheck = function() + CFG.nNameHAlignment = p[1] + MY_CataclysmParty:CallRefreshImages(true, false, true, nil, true) + end, + }):AutoWidth():Width() + 5 + end + -- 名字字体修改 + x = x + ui:Append('WndButton', { + x = x, y = y, h = 24, + text = _L['Name font'], + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + CFG.nNameFont = nFont + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallRefreshImages(true, false, false, nil, true) + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end) + end, + }):AutoWidth():Width() + 5 + y = y + 25 + + -- 血量显示方式 + x = nPaddingX + 10 + y = y + 10 + for _, p in ipairs({ + { 2, g_tStrings.STR_RAID_LIFE_LEFT }, + { 1, g_tStrings.STR_RAID_LIFE_LOSE }, + { 0, g_tStrings.STR_RAID_LIFE_HIDE }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'lifemode', checked = CFG.nHPShownMode2 == p[1], + onCheck = function() + CFG.nHPShownMode2 = p[1] + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + end + + ui:Append('WndSlider', { + x = x, y = y - 1, + value = CFG.fLifeFontScale * 100, + range = {1, 400}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('Scale %d%%', val) end, + onChange = function(val) + CFG.fLifeFontScale = val / 100 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + autoEnable = function() return CFG.nHPShownMode2 ~= 0 end, + }) + y = y + 25 + + -- 血量数值显示方案 + x = nPaddingX + 10 + for _, p in ipairs({ + { 1, _L['Show Format value'] }, + { 2, _L['Show Percentage value'] }, + { 3, _L['Show full value'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'lifval', checked = CFG.nHPShownNumMode == p[1], + autoEnable = function() return CFG.nHPShownMode2 ~= 0 end, + onCheck = function() + CFG.nHPShownNumMode = p[1] + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + end + + x = x + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['Show Decimal'], + checked = CFG.bShowHPDecimal, + onCheck = function(bCheck) + CFG.bShowHPDecimal = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + y = y + 25 + + x = nPaddingX + 10 + for _, p in ipairs({ + { 0, _L['Top'] }, + { 1, _L['Middle'] }, + { 2, _L['Bottom'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'lifvali', checked = CFG.nHPVAlignment == p[1], + autoEnable = function() return CFG.nHPShownMode2 ~= 0 end, + onCheck = function() + CFG.nHPVAlignment = p[1] + MY_CataclysmParty:CallRefreshImages(true, false, true, nil, true) + end, + }):AutoWidth():Width() + 5 + end + for _, p in ipairs({ + { 0, _L['Left'] }, + { 1, _L['Center'] }, + { 2, _L['Right'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'lifhali', checked = CFG.nHPHAlignment == p[1], + autoEnable = function() return CFG.nHPShownMode2 ~= 0 end, + onCheck = function() + CFG.nHPHAlignment = p[1] + MY_CataclysmParty:CallRefreshImages(true, false, true, nil, true) + end, + }):AutoWidth():Width() + 5 + end + ui:Append('WndButton', { + x = x, y = y, h = 24, + text = _L['Life font'], + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + CFG.nLifeFont = nFont + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end) + end, + autoEnable = function() return CFG.nHPShownMode2 ~= 0 end, + }):AutoWidth() + y = y + 25 + + -- 图标显示方案 + x = nPaddingX + 10 + y = y + 10 + for _, p in ipairs({ + { 1, _L['Show Force Icon'] }, + { 2, g_tStrings.STR_SHOW_KUNGFU }, + { 3, _L['Show Camp Icon'] }, + { 4, _L['Show Text Force'] }, + }) do + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = p[2], + group = 'icon', checked = CFG.nShowIcon == p[1], + onCheck = function() + CFG.nShowIcon = p[1] + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallRefreshImages(true, false, true, nil, true) + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + end + y = y + 25 + + -- 内力显示 + x = nPaddingX + 10 + x = x + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['Show ManaCount'], + checked = CFG.nShowMP, + onCheck = function(bCheck) + CFG.nShowMP = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + + x = x + ui:Append('WndButton', { + x = x, y = y, h = 24, + text = g_tStrings.STR_SKILL_MANA .. g_tStrings.FONT, + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + CFG.nManaFont = nFont + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end) + end, + autoEnable = function() return CFG.nShowMP end, + }):Width() + 5 + + ui:Append('WndSlider', { + x = x, y = y - 1, + value = CFG.fManaFontScale * 100, + range = {1, 400}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('Scale %d%%', val) end, + onChange = function(val) + CFG.fManaFontScale = val / 100 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + autoEnable = function() return CFG.nShowMP end, + }) + y = y + 25 +end +X.Panel.Register(_L['Raid'], 'MY_Cataclysm_GridStyle', _L['Grid Style'], 'ui/Image/UICommon/RaidTotal.uitex|68', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmPS.Interface.lua b/MY_Cataclysm/src/MY_CataclysmPS.Interface.lua new file mode 100644 index 000000000..71a9e3877 --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmPS.Interface.lua @@ -0,0 +1,208 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板样式设置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmPS.Interface' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local CFG, PS = MY_Cataclysm.CFG, { nPriority = 4 } +local CTM_BG_COLOR_MODE = MY_Cataclysm.BG_COLOR_MODE + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local x, y = nPaddingX, nPaddingY + + y = y + ui:Append('Text', { x = x, y = y, text = _L['Interface settings'], font = 27 }):Height() + + x = nPaddingX + 10 + y = y + 3 + x = x + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Official team frame style'], + group = 'CSS', checked = CFG.eFrameStyle == 'OFFICIAL', + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.eFrameStyle = 'OFFICIAL' + MY_CataclysmMain.ReloadCataclysmPanel() + end, + }):AutoWidth():Width() + 5 + + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Cataclysm team frame style'], + group = 'CSS', checked = CFG.eFrameStyle == 'CATACLYSM', + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.eFrameStyle = 'CATACLYSM' + MY_CataclysmMain.ReloadCataclysmPanel() + end, + }):AutoWidth():Height() + + x = nPaddingX + 10 + x = x + ui:Append('Text', { x = x, y = y, text = _L['Interface Width']}):AutoWidth():Width() + 5 + y = y + ui:Append('WndSlider', { + x = x, y = y + 3, h = 25, w = 250, + range = {50, 250}, + value = CFG.fScaleX * 100, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(nVal) + nVal = nVal / 100 + local nNewX, nNewY = nVal / CFG.fScaleX, CFG.fScaleY / CFG.fScaleY + CFG.fScaleX = nVal + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:Scale(nNewX, nNewY) + end + end, + textFormatter = function(val) return _L('%d%%', val) end, + }):Height() + + x = nPaddingX + 10 + x = x + ui:Append('Text', { x = x, y = y, text = _L['Interface Height']}):AutoWidth():Width() + 5 + y = y + ui:Append('WndSlider', { + x = x, y = y + 3, h = 25, w = 250, + range = {50, 250}, + value = CFG.fScaleY * 100, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(nVal) + nVal = nVal / 100 + local nNewX, nNewY = CFG.fScaleX / CFG.fScaleX, nVal / CFG.fScaleY + CFG.fScaleY = nVal + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:Scale(nNewX, nNewY) + end + end, + textFormatter = function(val) return _L('%d%%', val) end, + }):Height() + + x = nPaddingX + y = y + 10 + y = y + ui:Append('Text', { x = x, y = y, text = g_tStrings.OTHER, font = 27 }):Height() + + x = x + 10 + y = y + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['Show Group Number'], + checked = CFG.bShowGroupNumber, + onCheck = function(bCheck) + CFG.bShowGroupNumber = bCheck + MY_CataclysmMain.ReloadCataclysmPanel() + end, + }):Height() + + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL then + x = x + ui:Append('Text', { x = x, y = y, text = g_tStrings.STR_ALPHA }):AutoWidth():Width() + 5 + y = y + ui:Append('WndSlider', { + x = x, y = y + 3, + range = {0, 255}, + value = CFG.nAlpha, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(nVal) + CFG.nAlpha = nVal + if MY_CataclysmMain.GetFrame() then + FireUIEvent('MY_CATACLYSM_SET_ALPHA') + end + end, + textFormatter = function(val) return _L('%d%%', val / 255 * 100) end, + }):Height() + end + + x = nPaddingX + y = y + 10 + y = y + ui:Append('Text', { x = x, y = y, text = _L['Arrangement'], font = 27 }):Height() + + x = x + 10 + y = y + 3 + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['One lines: 5/0'], + group = 'Arrangement', checked = CFG.nAutoLinkMode == 5, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nAutoLinkMode = 5 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:AutoLinkAllPanel() + MY_CataclysmMain.SetFrameSize() + end + end, + }):AutoWidth():Height() + 3 + + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Two lines: 1/4'], + group = 'Arrangement', checked = CFG.nAutoLinkMode == 1, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nAutoLinkMode = 1 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:AutoLinkAllPanel() + MY_CataclysmMain.SetFrameSize() + end + end, + }):AutoWidth():Height() + 3 + + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Two lines: 2/3'], + group = 'Arrangement', checked = CFG.nAutoLinkMode == 2, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nAutoLinkMode = 2 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:AutoLinkAllPanel() + MY_CataclysmMain.SetFrameSize() + end + end, + }):AutoWidth():Height() + 3 + + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Two lines: 3/2'], + group = 'Arrangement', checked = CFG.nAutoLinkMode == 3, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nAutoLinkMode = 3 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:AutoLinkAllPanel() + MY_CataclysmMain.SetFrameSize() + end + end, + }):AutoWidth():Height() + 3 + + y = y + ui:Append('WndRadioBox', { + x = x, y = y, text = _L['Two lines: 4/1'], + group = 'Arrangement', checked = CFG.nAutoLinkMode == 4, + onCheck = function(bChecked) + if not bChecked then + return + end + CFG.nAutoLinkMode = 4 + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:AutoLinkAllPanel() + MY_CataclysmMain.SetFrameSize() + end + end, + }):AutoWidth():Height() + 3 +end +X.Panel.Register(_L['Raid'], 'MY_Cataclysm_Interface', _L['Interface settings'], 'ui/Image/UICommon/RaidTotal.uitex|74', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmPS.Main.lua b/MY_Cataclysm/src/MY_CataclysmPS.Main.lua new file mode 100644 index 000000000..492def2d7 --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmPS.Main.lua @@ -0,0 +1,363 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板主设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmPS.Main' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local CFG, PS = MY_Cataclysm.CFG, { nPriority = 1 } + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['configure'], font = 27 }):Height() + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 3, w = 120, + buttonStyle = 'FLAT', + text = _L['Load ancient config'], + onClick = function() + GetUserInput(_L['Please input ancient config name:'], function(szText) + MY_CataclysmMain.LoadAncientConfigure(szText) + MY_CataclysmMain.CheckEnableTeamPanel() + X.Panel.SwitchTab('MY_Cataclysm', true) + end, nil, nil, nil, 'common') + end, + }):Width() + 5 + + -- 恢复默认 + nY = nY + ui:Append('WndButton', { + x = nX, y = nY + 3, w = 100, + text = _L['Restore default'], + buttonStyle = 'FLAT', + onClick = function() + MY_CataclysmMain.ConfirmRestoreConfig() + end, + }):Height() + 20 + + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Cataclysm Team Panel'], font = 27 }):AutoWidth():Height() + + nX = nX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Enable Cataclysm Team Panel'], + onCheck = MY_CataclysmMain.ToggleTeamPanel, checked = MY_Cataclysm.bEnable, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Only in team'], + checked = CFG.bShowInRaid, + onCheck = function(bCheck) + CFG.bShowInRaid = bCheck + if MY_CataclysmMain.CheckCataclysmEnable() then + MY_CataclysmMain.ReloadCataclysmPanel() + end + local me = X.GetClientPlayer() + if me.IsInParty() and not me.IsInRaid() then + FireUIEvent('MY_CATACLYSM_PANEL_TEAMMATE', CFG.bShowInRaid) + end + end, + }):AutoWidth():Width() + 5 + + nY = nY + ui:Append('WndCheckBox', { + x = nX, y = nY, text = g_tStrings.WINDOW_LOCK, + checked = not CFG.bDrag, + onCheck = function(bCheck) + CFG.bDrag = not bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmMain.GetFrame():EnableDrag(not bCheck) + end + end, + }):AutoWidth():Height() + 5 + + -- 提醒框 + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, text = g_tStrings.STR_RAID_TIP_IMAGE, font = 27 }):Height() + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show attention shadow'], + checked = CFG.bShowAttention, + onCheck = function(bCheck) + CFG.bShowAttention = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show caution animate'], + checked = CFG.bShowCaution, + onCheck = function(bCheck) + CFG.bShowCaution = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show screen head'], + checked = CFG.bShowScreenHead, + onCheck = function(bCheck) + CFG.bShowScreenHead = bCheck + end, + tip = _L['Requires MY_LifeBar loaded.'], + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show important skill'], + checked = CFG.bEnableImportantSkill, + onCheck = function(bCheck) + CFG.bEnableImportantSkill = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + 10 + nY = nY + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Attack Warning'], + checked = CFG.bHPHitAlert, + onCheck = function(bCheck) + CFG.bHPHitAlert = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:CallDrawHPMP(true, true) + end + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show distance'], + checked = CFG.bShowDistance, + onCheck = function(bCheck) + CFG.bShowDistance = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['ZuiWu Effect'], + checked = CFG.bShowEffect, + onCheck = function(bCheck) + CFG.bShowEffect = bCheck + end, + tip = { + render = _L['Show effect when teammate get ZuiWu, only your ZuiWu will be showen while you\'re BuTianJue.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show central party member tag'], + checked = CFG.bShowSputtering, + onCheck = function(bCheck) + CFG.bShowSputtering = bCheck + end, + tip = { + render = _L['Show color on right top pos of central member of each party'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 25, h = 25, + buttonStyle = 'OPTION', + menu = function() + return { + { + szOption = _L['Set sputtering distance'], + fnAction = function() + GetUserInputNumber( + CFG.nSputteringDistance, + 1000, + nil, + function(val) CFG.nSputteringDistance = val or CFG.nSputteringDistance end) + end, + }, + { + szOption = _L['Set sputtering font color'], + fnAction = function() + X.UI.OpenColorPicker(function(r, g, b) + CFG.tSputteringFontColor = { r, g, b } + end) + end, + }, + { + szOption = _L['Set sputtering font alpha'], + fnAction = function() + local fnAction = function(f) + CFG.nSputteringFontAlpha = math.ceil((1 - f) * 255) + end + local fPosX, fPosY = Cursor.GetPos() + GetUserPercentage(fnAction, nil, 1 - CFG.nSputteringFontAlpha / 255, _L['Set sputtering font alpha'], { fPosX, fPosY, fPosX + 1, fPosY + 1 }) + end, + }, + { + szOption = _L['Set sputtering shadow color'], + fnAction = function() + X.UI.OpenColorPicker(function(r, g, b) + CFG.tSputteringShadowColor = { r, g, b } + end) + end, + }, + { + szOption = _L['Set sputtering shadow alpha'], + fnAction = function() + local fnAction = function(f) + CFG.nSputteringShadowAlpha = math.ceil((1 - f) * 255) + end + local fPosX, fPosY = Cursor.GetPos() + GetUserPercentage(fnAction, nil, 1 - CFG.nSputteringShadowAlpha / 255, _L['Set sputtering shadow alpha'], { fPosX, fPosY, fPosX + 1, fPosY + 1 }) + end, + }, + } + end, + autoEnable = function() return CFG.bShowSputtering end, + }):Width() + 5 + + nX = nPaddingX + 10 + nY = nY + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show target\'s target'], + checked = CFG.bShowTargetTargetAni, + onCheck = function(bCheck) + CFG.bShowTargetTargetAni = bCheck + if MY_CataclysmMain.GetFrame() then + MY_CataclysmParty:RefreshTTarget() + end + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show Boss target'], + checked = CFG.bShowBossTarget, + onCheck = function(bCheck) + CFG.bShowBossTarget = bCheck + end, + }):AutoWidth():Width() + 5 + + nY = nY + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show Boss focus'], + checked = CFG.bShowBossFocus, + onCheck = function(bCheck) + CFG.bShowBossFocus = bCheck + end, + }):AutoWidth():Height() + + -- 其他 + nX = nPaddingX + nY = nY + 4 + nY = nY + ui:Append('Text', { x = nX, y = nY, text = g_tStrings.OTHER, font = 27 }):Height() + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Show tip at right bottom'], + checked = CFG.bShowTipAtRightBottom, + onCheck = function(bCheck) + CFG.bShowTipAtRightBottom = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Don\'t show tip in fight'], + checked = CFG.bHideTipInFight, + onCheck = function(bCheck) + CFG.bHideTipInFight = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + 10 + nY = nY + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = g_tStrings.STR_RAID_TARGET_ASSIST, + checked = CFG.bTempTargetEnable, + onCheck = function(bCheck) + CFG.bTempTargetEnable = bCheck + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY - 1, + value = CFG.nTempTargetDelay / 75, + range = {0, 8}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) + CFG.nTempTargetDelay = val * 75 + end, + textFormatter = function(val) + return val == 0 + and _L['Target assist no delay.'] + or _L('Target assist delay %dms.', val * 75) + end, + autoEnable = function() return CFG.bTempTargetEnable end, + }):AutoWidth():Width() + + nX = nPaddingX + 10 + nY = nY + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Alt view player'], + checked = CFG.bAltView, + onCheck = function(bCheck) + CFG.bAltView = bCheck + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Disable in fight'], + checked = not CFG.bAltViewInFight, + onCheck = function(bCheck) + CFG.bAltViewInFight = not bCheck + end, + autoEnable = function() return CFG.bAltView end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + 10 + nY = nY + 25 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Faster Refresh (Greater performance loss)'], + checked = CFG.nDrawInterval == 1, + onCheck = function(bCheck) + CFG.nDrawInterval = bCheck and 1 or 4 + end, + tip = { + render = _L['Refresh every breathe call.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }) + + nY = nY + 25 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Ultimate Refresh HP (Greater performance loss)'], + checked = CFG.bFasterHP, + onCheck = function(bCheck) + CFG.bFasterHP = bCheck + if MY_CataclysmMain.GetFrame() then + if bCheck then + MY_CataclysmMain.GetFrame():RegisterEvent('RENDER_FRAME_UPDATE') + else + MY_CataclysmMain.GetFrame():UnRegisterEvent('RENDER_FRAME_UPDATE') + end + end + end, + tip = { + render = _L['Refresh every render call.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }) + nY = nY + 25 +end +X.Panel.Register(_L['Raid'], 'MY_Cataclysm', _L['Cataclysm'], 'ui/Image/UICommon/RaidTotal.uitex|62', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/src/MY_CataclysmParty.lua b/MY_Cataclysm/src/MY_CataclysmParty.lua new file mode 100644 index 000000000..0fa7bdb8d --- /dev/null +++ b/MY_Cataclysm/src/MY_CataclysmParty.lua @@ -0,0 +1,2339 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队面板小队界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Cataclysm/MY_CataclysmParty' +local PLUGIN_NAME = 'MY_Cataclysm' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Cataclysm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_Cataclysm.CHANGGE_SHADOW', { ['*'] = true, intl = false }) +X.RegisterRestriction('MY_Cataclysm.Seize', { ['*'] = true }) +-------------------------------------------------------------------------------- +local D = {} +----------------------------------------------- +-- 重构 @ 2015 赶时间 很多东西写的很粗略 +----------------------------------------------- +local Station, SetTarget = Station, SetTarget +local Target_GetTargetData = Target_GetTargetData +local MY_GetBuff, MY_GetEndTime = X.GetBuff, X.GetEndTime +local CFG = MY_Cataclysm.CFG +local CTM_BG_COLOR_MODE = MY_Cataclysm.BG_COLOR_MODE +-- global STR cache +local COINSHOP_SOURCE_NULL = g_tStrings.COINSHOP_SOURCE_NULL +local STR_FRIEND_NOT_ON_LINE = g_tStrings.STR_FRIEND_NOT_ON_LINE +local FIGHT_DEATH = g_tStrings.FIGHT_DEATH +-- STATE cache +local MOVE_STATE_ON_STAND = MOVE_STATE.ON_STAND +local MOVE_STATE_ON_DEATH = MOVE_STATE.ON_DEATH +-- local value +local CTM_ALPHA_STEP = 15 -- 240 / CTM_ALPHA_STEP +local CTM_GROUP_COUNT = 5 - 1 -- 防止以后开个什么40人本 估计不太可能 就和剑三这还得好几年 +local CTM_MEMBER_COUNT = 5 +local CTM_DRAG = false +local CTM_DRAG_ID +local CTM_CLICK_DISMISS +local CTM_TARGET -- 注意这个是UI逻辑选中目标 不一定是真实的当前目标 +local CTM_TTARGET -- 注意这个是UI逻辑目标选中的目标 不一定是真实的当前目标 +local CTM_CACHE = setmetatable({}, { __mode = 'v' }) +local CTM_LIFE_CACHE = {} -- 当前帧队友血量缓存 +local CTM_BUFF_TIME = {} -- 附近目标 BUFF 刷新时间戳 +local CTM_BUFF_RULE = {} -- 附近记录到的需要显示的BUFF规则缓存 +local CTM_BOSS_CACHE = {} -- 附近的首领缓存 +local CTM_BOSS_FOCUS_BUFF = {} -- 附近记录到的首领点名BUFF缓存 +local CTM_ATTENTION_BUFF = {} -- 附近记录到的需要显示蒙版的BUFF缓存 +local CTM_ATTENTION_STACK = {} -- 蒙版BUFF栈(取第一个也就是最新入栈的作为显示颜色) +local CTM_CAUTION_BUFF = {} -- 附近记录到的警告BUFF缓存 +local CTM_SCREEN_HEAD = {} -- 头顶倒计时缓存 +local CTM_BOSS_TARGET = {} -- 首领目标缓存 +local CTM_BOSS_FOCUSED_STATE = {} -- 被首领点名的状态缓存 +local CTM_NPC_THREAT_TARGET = {} -- 首领一仇缓存 +local CTM_PLAYER_SKILL_CD = {} -- 队友招式调息状态显示 +local CTM_TEMP_TARGET_TYPE, CTM_TEMP_TARGET_ID +local CHANGGE_REAL_SHADOW_TPLID = 46140 -- 清绝歌影 的主体影子 +local CHANGGE_REAL_SHADOW_CACHE = {} +do +local function onNpcEnterScene() + local me = X.GetClientPlayer() + local npc = X.GetNpc(arg0) + if X.IsBoss(me.GetMapID(), npc.dwTemplateID) then + CTM_BOSS_CACHE[npc.dwID] = npc + end + if npc.dwTemplateID == CHANGGE_REAL_SHADOW_TPLID then + if not (IsEnemy(X.GetClientPlayerID(), arg0) and X.IsRestricted('MY_Cataclysm.CHANGGE_SHADOW')) then + local dwType, dwID = X.GetCharacterTarget(me) + if dwType == TARGET.PLAYER and dwID == npc.dwEmployer then + X.SetClientPlayerTarget(TARGET.NPC, arg0) + end + end + CHANGGE_REAL_SHADOW_CACHE[npc.dwEmployer] = arg0 + CHANGGE_REAL_SHADOW_CACHE[arg0] = npc.dwEmployer + end +end +X.RegisterEvent('NPC_ENTER_SCENE', 'MY_Cataclysm', onNpcEnterScene) + +local function onNpcLeaveScene() + local me = X.GetClientPlayer() + local npc = X.GetNpc(arg0) + if CHANGGE_REAL_SHADOW_CACHE[arg0] then + if not (IsEnemy(X.GetClientPlayerID(), arg0) and X.IsRestricted('MY_Cataclysm.CHANGGE_SHADOW')) then + local dwType, dwID = X.GetCharacterTarget(me) + if dwType == TARGET.NPC and dwID == arg0 then + X.SetClientPlayerTarget(TARGET.PLAYER, npc.dwEmployer) + end + end + CHANGGE_REAL_SHADOW_CACHE[CHANGGE_REAL_SHADOW_CACHE[arg0]] = nil + CHANGGE_REAL_SHADOW_CACHE[arg0] = nil + end + CTM_BOSS_CACHE[npc.dwID] = nil +end +X.RegisterEvent('NPC_LEAVE_SCENE', 'MY_Cataclysm', onNpcLeaveScene) +end + +X.RegisterEvent('BUFF_UPDATE', 'MY_Cataclysm', function() + -- local owner, bdelete, index, cancancel, id , stacknum, endframe, binit, level, srcid, isvalid, leftframe + -- = arg0 , arg1 , arg2 , arg3 , arg4, arg5 , arg6 , arg7 , arg8 , arg9 , arg10 , arg11 + if arg1 then + return + end + if not CTM_BUFF_TIME[arg0] then + CTM_BUFF_TIME[arg0] = {} + end + CTM_BUFF_TIME[arg0][arg4] = GetTime() +end) + +do +local function onBossSet() + CTM_BOSS_CACHE = {} + local dwMapID = X.GetClientPlayer().GetMapID() + for _, npc in ipairs(X.GetNearNpc()) do + if X.IsBoss(dwMapID, npc.dwTemplateID) then + CTM_BOSS_CACHE[npc.dwID] = npc + end + end +end +X.RegisterEvent('MY_SET_BOSS', 'MY_Cataclysm', onBossSet) +end + +local function SetTarget(dwType, dwID) + if CHANGGE_REAL_SHADOW_CACHE[dwID] then + dwType, dwID = TARGET.NPC, CHANGGE_REAL_SHADOW_CACHE[dwID] + end + X.SetClientPlayerTarget(dwType, dwID) +end + +local function CanTarget(dwID) + if CHANGGE_REAL_SHADOW_CACHE[dwID] then + dwID = CHANGGE_REAL_SHADOW_CACHE[dwID] + end + if X.IsPlayer(dwID) then + return X.GetPlayer(dwID) + else + return X.GetNpc(dwID) + end +end + +-- Package func +local HIDE_FORCE = { + [7] = true, + [8] = true, + [10] = true, + [21] = true, +} +local function IsPlayerManaHide(dwForceID, dwMountType) + if dwMountType then + if dwMountType == X.CONSTANT.KUNGFU_MOUNT_TYPE.CANG_JIAN or --藏剑 + dwMountType == X.CONSTANT.KUNGFU_MOUNT_TYPE.TANG_MEN or --唐门 + dwMountType == X.CONSTANT.KUNGFU_MOUNT_TYPE.MING_JIAO or --明教 + dwMountType == X.CONSTANT.KUNGFU_MOUNT_TYPE.CANG_YUN then --苍云 + return true + else + return false + end + else + return HIDE_FORCE[dwForceID] + end +end + +-- 官方这代码太垃圾到处报错 = =|| 加个pcall了只能 mmp +local _GVoiceBase_IsMemberForbid = X.GVoiceBase_IsMemberForbid +local function GVoiceBase_IsMemberForbid(...) + local status, res = X.Call(_GVoiceBase_IsMemberForbid, ...) + return status and res +end + +local _GVoiceBase_IsMemberSaying = X.GVoiceBase_IsMemberSaying +local function GVoiceBase_IsMemberSaying(...) + local status, res = X.Call(_GVoiceBase_IsMemberSaying, ...) + return status and res +end + +local function OpenRaidDragPanel(dwMemberID) + local hTeam = GetClientTeam() + local tMemberInfo = X.GetTeamMemberInfo(dwMemberID) + if not tMemberInfo then + return + end + local hFrame = X.UI.OpenFrame('RaidDragPanel') + + local nX, nY = Cursor.GetPos() + hFrame:SetAbsPos(nX, nY) + hFrame:StartMoving() + + hFrame.dwID = dwMemberID + local hMember = hFrame:Lookup('', '') + + local szPath, nFrame = GetForceImage(tMemberInfo.dwForceID) + hMember:Lookup('Image_Force'):FromUITex(szPath, nFrame) + + local txtName = hMember:Lookup('Text_Name') + txtName:SetText(tMemberInfo.szName) + + local hImageLife = hMember:Lookup('Image_Health') + local hImageMana = hMember:Lookup('Image_Mana') + if tMemberInfo.bOnline then + local fCurrentLife, fMaxLife = X.GetCharacterLife(tMemberInfo) + if fMaxLife > 0 then + hImageLife:SetPercentage(fCurrentLife / fMaxLife) + end + if tMemberInfo.nMaxMana > 0 and tMemberInfo.nMaxMana ~= 1 then + hImageMana:SetPercentage(tMemberInfo.nCurrentMana / tMemberInfo.nMaxMana) + end + else + hImageLife:SetPercentage(0) + hImageMana:SetPercentage(0) + end + hMember:Show() + hFrame:BringToTop() + hFrame:Scale(CFG.fScaleX, CFG.fScaleY) +end + +local function CloseRaidDragPanel() + local hFrame = Station.Lookup('Normal/RaidDragPanel') + if hFrame then + hFrame:EndMoving() + X.UI.CloseFrame(hFrame) + end +end + +local function InsertChangeGroupMenu(tMenu, dwMemberID) + local hTeam = GetClientTeam() + local tSubMenu = { szOption = g_tStrings.STR_RAID_MENU_CHANG_GROUP } + + local nCurGroupID = hTeam.GetMemberGroupIndex(dwMemberID) + for i = 0, hTeam.nGroupNum - 1 do + if i ~= nCurGroupID then + local tGroupInfo = hTeam.GetGroupInfo(i) + if tGroupInfo and tGroupInfo.MemberList then + local tSubSubMenu = + { + szOption = g_tStrings.STR_NUMBER[i + 1], + bDisable = (#tGroupInfo.MemberList >= CTM_MEMBER_COUNT), + fnAction = function() GetClientTeam().ChangeMemberGroup(dwMemberID, i, 0) end, + fnAutoClose = function() return true end, + } + table.insert(tSubMenu, tSubSubMenu) + end + end + end + if #tSubMenu > 0 then + table.insert(tMenu, tSubMenu) + end +end + +-- 有各个版本之间的文本差异,所以做到翻译中 +local CTM_KUNGFU_TEXT = X.CONSTANT.KUNGFU_TYPE_LABEL_ABBR + +-- CODE -- +local CTM = {} + +MY_CataclysmParty_Base = class() + +function MY_CataclysmParty_Base.OnFrameCreate() + this:Lookup('', 'Handle_BG/Shadow_BG'):SetAlpha(CFG.nAlpha) + this:RegisterEvent('MY_CATACLYSM_SET_VISIBLE') + this:RegisterEvent('MY_CATACLYSM_SET_FOLD') + this:RegisterEvent('MY_CATACLYSM_SET_ALPHA') + this:SetVisible(MY_Cataclysm.bVisible and not MY_Cataclysm.bFold) +end + +function MY_CataclysmParty_Base.OnEvent(szEvent) + if szEvent == 'MY_CATACLYSM_SET_VISIBLE' or szEvent == 'MY_CATACLYSM_SET_FOLD' then + this:SetVisible(MY_Cataclysm.bVisible and not MY_Cataclysm.bFold) + elseif szEvent == 'MY_CATACLYSM_SET_ALPHA' then + this:Lookup('', 'Handle_BG/Shadow_BG'):SetAlpha(CFG.nAlpha) + end +end + +function MY_CataclysmParty_Base.OnLButtonDown() + CTM:BringToTop() +end + +function MY_CataclysmParty_Base.OnRButtonDown() + CTM:BringToTop() +end + +function MY_CataclysmParty_Base.OnItemLButtonDrag() + local dwID = (this.bBuff and this:GetParent():GetParent().dwID) or (this.bRole and this.dwID) + if not dwID then + return + end + local team = GetClientTeam() + local me = X.GetClientPlayer() + if (IsAltKeyDown() or CFG.bEditMode) and me.IsInRaid() and X.IsClientPlayerTeamLeader() then + CTM_DRAG = true + CTM_DRAG_ID = dwID + CTM_CLICK_DISMISS = true + CTM:DrawAllParty() + CTM:AutoLinkAllPanel() + CTM:BringToTop() + OpenRaidDragPanel(dwID) + end +end + +-- DragEnd bug fix +function MY_CataclysmParty_Base.OnItemLButtonUp() + X.DelayCall(50, function() + if CTM_DRAG then + CTM_DRAG, CTM_DRAG_ID = false, nil + CTM:CloseParty() + CTM:ReloadParty() + CloseRaidDragPanel() + end + end) +end + +function MY_CataclysmParty_Base.OnItemLButtonDragEnd() + local dwID = (this.bBuff and this:GetParent():GetParent().dwID) or (this.bRole and this.dwID) + if CTM_DRAG and dwID ~= CTM_DRAG_ID then + local team = GetClientTeam() + local nGroup = (this.bBuff and this:GetParent():GetParent().nGroup) or this.nGroup + team.ChangeMemberGroup(CTM_DRAG_ID, nGroup, dwID or 0) + CTM_DRAG, CTM_DRAG_ID = false, nil + CloseRaidDragPanel() + CTM:CloseParty() + CTM:ReloadParty() + end +end + +function D.SetTargetTeammate(dwID, info) + if X.IsInPubgMap() and X.GetClientPlayer().nMoveState == MOVE_STATE.ON_DEATH then + BattleField_MatchPlayer(dwID) + elseif info.bOnline and CanTarget(dwID) then -- 有待考证 + if CFG.bTempTargetEnable then + X.DelayCall('MY_Cataclysm_TempTarget', false) + CTM_TEMP_TARGET_TYPE, CTM_TEMP_TARGET_ID = nil + end + SetTarget(TARGET.PLAYER, dwID) + end +end + +function MY_CataclysmParty_Base.OnItemLButtonDown() + local dwID = (this.bBuff and this:GetParent():GetParent().dwID) or (this.bRole and this.dwID) + if not dwID then + return + end + local info = CTM:GetMemberInfo(dwID) + if not info then + return + end + if not IsCtrlKeyDown() and not IsAltKeyDown() then + D.SetTargetTeammate(dwID, info) + end + CTM_CLICK_DISMISS = false +end + +function MY_CataclysmParty_Base.OnItemLButtonClick() + if CTM_CLICK_DISMISS then + return + end + local dwID = (this.bBuff and this:GetParent():GetParent().dwID) or (this.bRole and this.dwID) + if not dwID then + return + end + local info = CTM:GetMemberInfo(dwID) + if not info then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if IsAltKeyDown() then + if this.bBuff and CFG.bBuffAltPublish then + X.SendChat( + PLAYER_TALK_CHANNEL.RAID, + _L( + '[%s] got buff [%s]x%d, remaining %ds.', + info.szName, + X.GetBuffName(this.dwID, this.nLevel), + this.nStackNum or 1, + MY_GetEndTime(this.nEndFrame) + ) + ) + elseif this.bRole and CFG.bAltView and (CFG.bAltViewInFight or not me.bFightState) then + if IsCtrlKeyDown() then + if MY_CharInfo and MY_CharInfo.ViewCharInfoToPlayer then + MY_CharInfo.ViewCharInfoToPlayer(dwID) + end + else + X.ViewOtherPlayerByID(dwID) + end + else + D.SetTargetTeammate(dwID, info) + end + elseif IsCtrlKeyDown() then + X.EditBox_AppendLinkPlayer(info.szName) + end +end + +do + +local function OnItemRefreshTip() + local bTip = not CFG.bHideTipInFight or not X.IsFighting() + if not bTip then + return + end + local Rect + if not CFG.bShowTipAtRightBottom then + local nX, nY = this:GetRoot():GetAbsPos() + local nW, nH = this:GetRoot():GetSize() + Rect = { nX, nY + 5, nW, nH } + end + if this.bBuff then + X.OutputBuffTip(Rect, this.dwID, this.nLevel, MY_GetEndTime(this.nEndFrame), GetFormatText(this.szVia, 82)) + elseif this.bRole then + X.OutputTeamMemberTip(Rect, this.dwID) + end +end +MY_CataclysmParty_Base.OnItemRefreshTip = OnItemRefreshTip + +function MY_CataclysmParty_Base.OnItemMouseEnter() + if CTM_DRAG and this:Lookup('Image_Slot') and this:Lookup('Image_Slot'):IsValid() then + this:Lookup('Image_Slot'):Show() + end + local name = this:GetName() + local bTip = not CFG.bHideTipInFight or not X.IsFighting() + if name == 'Handle_Platform' then + if bTip then + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + local szTip = GetFormatText(_L['Wujie online'], 101) + OutputTip(szTip, 400, { nX, nY, nW, nH }) + end + end + OnItemRefreshTip() + local dwID = (this.bBuff and this:GetParent():GetParent().dwID) or (this.bRole and this.dwID) + local info = dwID ~= CTM_TEMP_TARGET_ID and CTM:GetMemberInfo(dwID) or nil + if info and info.bOnline and CanTarget(dwID) and CFG.bTempTargetEnable then + X.DelayCall('MY_Cataclysm_TempTarget', false) + local function fnAction() + if not CTM_TEMP_TARGET_TYPE then + local me = X.GetClientPlayer() + CTM_TEMP_TARGET_TYPE, CTM_TEMP_TARGET_ID = X.GetCharacterTarget(me) + end + SetTarget(TARGET.PLAYER, dwID) + end + if CFG.nTempTargetDelay == 0 then + fnAction() + else + X.DelayCall('MY_Cataclysm_TempTarget', CFG.nTempTargetDelay, fnAction) + end + end +end +end + +do +local function ResumeTempTarget() + SetTarget(CTM_TEMP_TARGET_TYPE, CTM_TEMP_TARGET_ID) + CTM_TEMP_TARGET_TYPE, CTM_TEMP_TARGET_ID = nil +end +function MY_CataclysmParty_Base.OnItemMouseLeave(dst) + if CTM_DRAG and this:Lookup('Image_Slot') and this:Lookup('Image_Slot'):IsValid() then + this:Lookup('Image_Slot'):Hide() + end + HideTip() + local dwID + if this.bRole then + dwID = this.dwID + elseif this.bBuff then + dwID = this:GetParent():GetParent().dwID + end + if dst then + local dwDstID + if dst.bRole then + dwDstID = dst.dwID + elseif dst.bBuff then + dwDstID = dst:GetParent():GetParent().dwID + end + if dwDstID == dwID then + return + end + end + if not dwID then + return + end + if CFG.bTempTargetEnable then + X.DelayCall('MY_Cataclysm_TempTarget', false) + if CTM_TEMP_TARGET_TYPE then + X.DelayCall('MY_Cataclysm_TempTarget', ResumeTempTarget) -- 延迟到下一帧 因为可能当前帧临时选中另外一个玩家 那么不需要切回目标 + end + end +end +end + +function MY_CataclysmParty_Base.OnItemRButtonClick() + if not this.dwID then + return + end + local dwID = this.dwID + local menu = {} + local me = X.GetClientPlayer() + local info = CTM:GetMemberInfo(dwID) + local szPath, nFrame = GetForceImage(info.dwForceID) + table.insert(menu, { + szOption = info.szName, + szLayer = 'ICON_RIGHT', + rgb = { X.GetForceColor(info.dwForceID, 'foreground') }, + szIcon = szPath, + nFrame = nFrame + }) + if X.IsClientPlayerTeamLeader() and me.IsInRaid() then + table.insert(menu, { bDevide = true }) + InsertChangeGroupMenu(menu, dwID) + end + local info = CTM:GetMemberInfo(dwID) + if dwID ~= me.dwID then + if X.IsClientPlayerTeamLeader() then + table.insert(menu, { bDevide = true }) + end + InsertTeammateMenu(menu, dwID) + local t = {} + InsertTargetMenu(t, dwID) + for _, v in ipairs(t) do + if v.szOption == g_tStrings.LOOKUP_INFO or v.szOption == g_tStrings.STR_LOOKUP_MORE then + for _, vv in ipairs(v) do + if vv.szOption == g_tStrings.LOOKUP_NEW_TANLENT then -- 奇穴 + table.insert(menu, vv) + break + end + end + end + if v.szOption == g_tStrings.STR_MAKE_TRADDING then -- 交易 + table.insert(menu, v) + end + end + table.insert(menu, { szOption = g_tStrings.STR_LOOKUP, bDisable = not info.bOnline, fnAction = function() + X.ViewOtherPlayerByID(dwID) + end }) + if MY_CharInfo and MY_CharInfo.ViewCharInfoToPlayer then + table.insert(menu, { + szOption = g_tStrings.STR_LOOK .. g_tStrings.STR_EQUIP_ATTR, bDisable = not info.bOnline, fnAction = function() + MY_CharInfo.ViewCharInfoToPlayer(dwID) + end + }) + end + local extra = {} + if MY_Focus then + for _, v in ipairs(MY_Focus.GetTargetMenu(TARGET.PLAYER, dwID)) do + table.insert(extra, v) + end + end + if #extra > 0 then + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + for _, v in ipairs(extra) do + table.insert(menu, v) + end + end + else + table.insert(menu, { bDevide = true }) + InsertPlayerMenu(menu, dwID) + if X.IsClientPlayerTeamLeader() then + table.insert(menu, { bDevide = true }) + table.insert(menu, { + szOption = _L['Take back all permissions'], + rgb = { 255, 255, 0 }, + fnAction = function() + local team = GetClientTeam() + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK, X.GetClientPlayerID()) + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE, X.GetClientPlayerID()) + end, + }) + elseif not X.IsRestricted('MY_Cataclysm.Seize') then + table.insert(menu, { bDevide = true }) + table.insert(menu, { + szOption = _L['Take back permissions'], + rgb = { 255, 255, 0 }, + { + szOption = _L['Take back all permissions'], + rgb = { 255, 255, 0 }, + fnAction = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_ABOUT', {'TeamAuth'}) + end, + }, + { + szOption = _L['Take back leader permission'], + rgb = { 255, 255, 0 }, + fnAction = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_ABOUT', {'TeamLeader'}) + end, + }, + { + szOption = _L['Take back mark permission'], + rgb = { 255, 255, 0 }, + fnAction = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_ABOUT', {'TeamMark'}) + end, + }, + { + szOption = _L['Take back distribute permission'], + rgb = { 255, 255, 0 }, + fnAction = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_ABOUT', {'TeamDistribute'}) + end, + } + }) + end + end + if #menu > 0 then + PopupMenu(menu) + end +end + +function CTM:GetPartyFrame(nIndex) -- 获得组队面板 + return Station.Lookup('Normal/MY_CataclysmParty_' .. nIndex) +end + +function CTM:BringToTop() + MY_CataclysmMain.GetFrame():BringToTop() + for i = 0, CTM_GROUP_COUNT do + if self:GetPartyFrame(i) then + self:GetPartyFrame(i):BringToTop() + end + end +end + +function CTM:GetMemberHandle(nGroup, nIndex) + local frame = self:GetPartyFrame(nGroup) + if frame then + return frame:Lookup('', 'Handle_Cols/Handle_Roles'):Lookup(nIndex) + end +end + +-- 创建面板 +function CTM:CreatePanel(nIndex) + local me = X.GetClientPlayer() + local frame = self:GetPartyFrame(nIndex) + if not frame then + frame = X.UI.OpenFrame( + X.PACKET_INFO.ROOT .. 'MY_Cataclysm/ui/MY_CataclysmParty.' .. CFG.eFrameStyle .. '.ini', + 'MY_CataclysmParty_' .. nIndex + ) + frame:Scale(CFG.fScaleX, CFG.fScaleY) + frame:SetVisible(MY_Cataclysm.bVisible and not MY_Cataclysm.bFold) + end + self:AutoLinkAllPanel() + self:RefreshGroupText() +end + +-- 刷新团队组编号 +function CTM:RefreshGroupText() + local team = GetClientTeam() + local me = X.GetClientPlayer() + for i = 0, team.nGroupNum - 1 do + local frame = self:GetPartyFrame(i) + if frame then + local txtGroup, szGroup = frame:Lookup('', 'Handle_Cols/Handle_Title/Text_Title') + if me.IsInRaid() then + if CFG.eFrameStyle == 'CATACLYSM' then + txtGroup:SetFontScheme(7) + end + local tGroup = team.GetGroupInfo(i) + if tGroup and tGroup.MemberList then + for k, v in ipairs(tGroup.MemberList) do + if v == X.GetClientPlayerID() then + -- txtGroup:SetFontScheme(2) + txtGroup:SetFontColor(255, 128, 0) -- 自己所在的小队 黄色 + break + end + end + end + szGroup = CFG.eFrameStyle == 'CATACLYSM' and g_tStrings.STR_NUMBER[i + 1] or tostring(i + 1) + else + szGroup = g_tStrings.STR_TEAM + end + txtGroup:SetText(szGroup) + end + end +end + -- 连接所有面板 +function CTM:AutoLinkAllPanel() + local frameMain = MY_CataclysmMain.GetFrame() + local nX, nY = frameMain:GetRelPos() + nY = nY + 24 + local nShownCount = 0 + local tPosnSize = {} + -- { nX = nX, nY = nY, nW = 0, nH = 0 } + for i = 0, CTM_GROUP_COUNT do + local hPartyPanel = self:GetPartyFrame(i) + if hPartyPanel then + local nW, nH = hPartyPanel:GetSize() + + if nShownCount < CFG.nAutoLinkMode then + tPosnSize[nShownCount] = { nX = nX + (128 * CFG.fScaleX * nShownCount), nY = nY, nW = nW, nH = nH } + else + local nUpperIndex = math.min(nShownCount - CFG.nAutoLinkMode, CFG.nAutoLinkMode - 1) + local tPS = tPosnSize[nUpperIndex] or {nH = 235 * CFG.fScaleY} + tPosnSize[nShownCount] = { + nX = nX + (128 * CFG.fScaleX * (nShownCount - CFG.nAutoLinkMode)), + nY = nY + tPosnSize[nUpperIndex].nH, + nW = nW, + nH = nH + } + end + local _nX, _nY = hPartyPanel:GetRelPos() + if _nX ~= tPosnSize[nShownCount].nX or _nY ~= tPosnSize[nShownCount].nY then + hPartyPanel:SetRelPos(tPosnSize[nShownCount].nX, tPosnSize[nShownCount].nY) + end + nShownCount = nShownCount + 1 + end + end +end + +function CTM:GetMemberInfo(dwID) + local team = GetClientTeam() + if not team then + return + end + return X.GetTeamMemberInfo(dwID) +end + +function CTM:GetTeamInfo() + local team = GetClientTeam() + return { + [TEAM_AUTHORITY_TYPE.LEADER] = team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER), + [TEAM_AUTHORITY_TYPE.MARK] = team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK), + [TEAM_AUTHORITY_TYPE.DISTRIBUTE] = team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE), + } +end + +local function HideTarget() + if CTM_TARGET + and CTM_CACHE[CTM_TARGET] + and CTM_CACHE[CTM_TARGET]:IsValid() + and CTM_CACHE[CTM_TARGET]:Lookup('Image_Selected') + and CTM_CACHE[CTM_TARGET]:Lookup('Image_Selected'):IsValid() then + CTM_CACHE[CTM_TARGET]:Lookup('Image_Selected'):Hide() + end +end + +function CTM:RefreshTarget(dwOldID, nOldType, dwNewID, nNewType) + if nOldType == TARGET.NPC and CHANGGE_REAL_SHADOW_CACHE[dwOldID] then + nOldType, dwOldID = TARGET.PLAYER, CHANGGE_REAL_SHADOW_CACHE[dwOldID] + end + if nNewType == TARGET.NPC and CHANGGE_REAL_SHADOW_CACHE[dwNewID] then + nNewType, dwNewID = TARGET.PLAYER, CHANGGE_REAL_SHADOW_CACHE[dwNewID] + end + if dwOldID == CTM_TARGET then + HideTarget() + end + if nNewType == TARGET.PLAYER + and CTM_CACHE[dwNewID] + and CTM_CACHE[dwNewID]:IsValid() + and CTM_CACHE[dwNewID]:Lookup('Image_Selected') + and CTM_CACHE[dwNewID]:Lookup('Image_Selected'):IsValid() then + CTM_CACHE[dwNewID]:Lookup('Image_Selected'):Show() + end + CTM_TARGET = dwNewID +end + +do +local function HideTTarget() + if CTM_TTARGET + and CTM_CACHE[CTM_TTARGET] + and CTM_CACHE[CTM_TTARGET]:IsValid() + and CTM_CACHE[CTM_TTARGET]:Lookup('Handle_TargetTarget') + and CTM_CACHE[CTM_TTARGET]:Lookup('Handle_TargetTarget'):IsValid() then + CTM_CACHE[CTM_TTARGET]:Lookup('Handle_TargetTarget'):Hide() + end +end +function CTM:RefreshTTarget() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + if CFG.bShowTargetTargetAni then + local dwType, dwID = Target_GetTargetData() + if dwID then + local KObject = X.GetTargetHandle(dwType, dwID) + if KObject then + local dwTarType, dwTarID = KObject.GetTarget() + if dwTarType == TARGET.NPC and CHANGGE_REAL_SHADOW_CACHE[dwTarID] then + dwTarType, dwTarID = TARGET.PLAYER, CHANGGE_REAL_SHADOW_CACHE[dwTarID] + end + if dwTarID ~= CTM_TTARGET then + HideTTarget() + end + if dwTarID and dwTarID ~= 0 and dwTarType == TARGET.PLAYER + and CTM_CACHE[dwTarID] + and CTM_CACHE[dwTarID]:IsValid() + and CTM_CACHE[dwTarID]:Lookup('Handle_TargetTarget') + and CTM_CACHE[dwTarID]:Lookup('Handle_TargetTarget'):IsValid() then + CTM_CACHE[dwTarID]:Lookup('Handle_TargetTarget'):Show() + end + CTM_TTARGET = dwTarID + return + end + end + end + HideTTarget() +end +end + +do +local function HideBossTarget(dwTarID) + if CTM_CACHE[dwTarID] + and CTM_CACHE[dwTarID]:IsValid() + and CTM_CACHE[dwTarID]:Lookup('Image_Threat') + and CTM_CACHE[dwTarID]:Lookup('Image_Threat'):IsValid() then + CTM_CACHE[dwTarID]:Lookup('Image_Threat'):Hide() + end +end +function CTM:RefreshBossTarget() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + local tKeep = {} + if CFG.bShowBossTarget then + for dwNpcID, npc in pairs(CTM_BOSS_CACHE) do + local dwTarID = (X.IsCharacterRelationEnemy(X.GetClientPlayerID(), dwNpcID) and npc.bFightState) + and (CTM_NPC_THREAT_TARGET[dwNpcID] or select(2, npc.GetTarget())) + or nil + if dwTarID then + if dwTarID ~= CTM_BOSS_TARGET[dwNpcID] then + HideBossTarget(CTM_BOSS_TARGET[dwNpcID]) + if CTM_CACHE[dwTarID] + and CTM_CACHE[dwTarID]:IsValid() + and CTM_CACHE[dwTarID]:Lookup('Image_Threat') + and CTM_CACHE[dwTarID]:Lookup('Image_Threat'):IsValid() then + CTM_CACHE[dwTarID]:Lookup('Image_Threat'):Show() + end + CTM_BOSS_TARGET[dwNpcID] = dwTarID + end + tKeep[dwTarID] = true + end + end + end + for dwNpcID, dwTarID in pairs(CTM_BOSS_TARGET) do + if not tKeep[dwTarID] then + HideBossTarget(dwTarID) + CTM_BOSS_TARGET[dwNpcID] = nil + end + end +end +end + +function CTM:RefreshThreat(dwNpcID, tList) + local dwTarID, nMaxThreat = 0, -1 + for dwID, nThreat in pairs(tList) do + if nThreat > nMaxThreat then + dwTarID, nMaxThreat = dwID, nThreat + end + end + CTM_NPC_THREAT_TARGET[dwNpcID] = dwTarID + self:RefreshBossTarget() +end + +function CTM:RefreshAttention() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + if CFG.bShowAttention then + local team, me = GetClientTeam(), X.GetClientPlayer() + local tKeep = {} + for _, dwTarID in ipairs(team.GetTeamMemberList()) do + local p = X.GetPlayer(dwTarID) + if CTM_CACHE[dwTarID] and CTM_CACHE[dwTarID]:IsValid() then + if p and not X.IsEmpty(CTM_ATTENTION_STACK[dwTarID]) then + local data = CTM_ATTENTION_STACK[dwTarID][1] + local r, g, b = X.HumanColor2RGB(data.colAttention or data.col) + CTM_CACHE[dwTarID]:Lookup('Shadow_Attention'):SetColorRGB(r, g, b) + CTM_CACHE[dwTarID]:Lookup('Shadow_Attention'):Show() + else + CTM_CACHE[dwTarID]:Lookup('Shadow_Attention'):Hide() + end + end + tKeep[dwTarID] = p and true or false + end + for dwTarID, _ in pairs(CTM_ATTENTION_BUFF) do + if not tKeep[dwTarID] then + CTM_ATTENTION_BUFF[dwTarID] = nil + CTM_ATTENTION_STACK[dwTarID] = nil + end + end + else + for dwTarID, _ in pairs(CTM_ATTENTION_BUFF) do + if CTM_CACHE[dwTarID] and CTM_CACHE[dwTarID]:IsValid() then + CTM_CACHE[dwTarID]:Lookup('Shadow_Attention'):Hide() + end + end + end + -- Output(CTM_ATTENTION_BUFF, CTM_ATTENTION_STACK) +end + +function CTM:RefreshCaution() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + if CFG.bShowCaution or CFG.bShowBossFocus then + local team, me = GetClientTeam(), X.GetClientPlayer() + local tKeep = {} + for _, dwTarID in ipairs(team.GetTeamMemberList()) do + local p = X.GetPlayer(dwTarID) + if CTM_CACHE[dwTarID] and CTM_CACHE[dwTarID]:IsValid() then + CTM_CACHE[dwTarID]:Lookup('Handle_Caution'):SetVisible( + p and ( + (CFG.bShowCaution and not X.IsEmpty(CTM_CAUTION_BUFF[dwTarID])) + or (CFG.bShowBossFocus and CTM_BOSS_FOCUSED_STATE[dwTarID]) + ) + ) + end + tKeep[dwTarID] = p and true or false + end + if CFG.bShowCaution then + for dwTarID, _ in pairs(CTM_CAUTION_BUFF) do + if not tKeep[dwTarID] then + CTM_CAUTION_BUFF[dwTarID] = nil + end + end + end + if CFG.bShowBossFocus then + for dwTarID, _ in pairs(CTM_BOSS_FOCUSED_STATE) do + if not tKeep[dwTarID] then + CTM_BOSS_FOCUSED_STATE[dwTarID] = nil + end + end + end + else + for dwTarID, _ in pairs(CTM_CAUTION_BUFF) do + if CTM_CACHE[dwTarID] and CTM_CACHE[dwTarID]:IsValid() then + CTM_CACHE[dwTarID]:Lookup('Handle_Caution'):Hide() + end + end + for dwTarID, _ in pairs(CTM_BOSS_FOCUSED_STATE) do + if CTM_CACHE[dwTarID] and CTM_CACHE[dwTarID]:IsValid() then + CTM_CACHE[dwTarID]:Lookup('Handle_Caution'):Hide() + end + end + end + -- Output(CTM_CAUTION_BUFF, CTM_BOSS_FOCUSED_STATE) +end + +function CTM:RefreshMark() + local team = GetClientTeam() + local tPartyMark = team.GetTeamMark() + if not tPartyMark then return end + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + if tPartyMark[k] then + local nMarkID, nIconFrame = tPartyMark[k], 0 + if nMarkID and PARTY_MARK_ICON_FRAME_LIST[nMarkID] then + -- assert(nMarkID > 0 and nMarkID <= #PARTY_MARK_ICON_FRAME_LIST) + nIconFrame = PARTY_MARK_ICON_FRAME_LIST[nMarkID] + end + v:Lookup('Image_MarkImage'):FromUITex(PARTY_MARK_ICON_PATH, nIconFrame) + v:Lookup('Image_MarkImage'):Show() + local fScale = (CFG.fScaleY + CFG.fScaleX) / 2 + v:Lookup('Image_MarkImage'):SetSize(24 * fScale, 24 * fScale) + else + v:Lookup('Image_MarkImage'):Hide() + end + end + end +end + +-- 由于SFX的缩放独立于UI缩放 所以需要单独计算 +-- 我们准备三个Handle 一个允许缩放 一个禁止缩放 SFX初始为1倍缩放 结构为 允许缩放Handle/禁止缩放Handle/SFX +-- 允许缩放的那个Handle初始大小是你想要得到的最终显示大小 初始位置亦为你想要显示的最终位置 +-- 禁止缩放的那个Handle初始大小应该等于SFX模型缩放比为1时在屏幕上的矩形区域大小 初始位置为刚好覆盖SFX +-- SFX初始中心应当为最终想要的中心点 +-- 计算方法是 每次计算允许缩放的Handle与禁止缩放的Handle的比例差即可得知SFX当前理应当缩放和平移数值 +function CTM:RefreshSFX() + local hDest--[[, hScale]], hFixed + local fSfxX, fSfxY -- SFX当前状态下对比初始时正确的缩放比 + -- local fUIX, fUIY -- UI当前状态下对应1.0的缩放比 + local fUIScale = Station.GetUIScale() + for dwID, h in pairs(CTM_CACHE) do + if h:IsValid() then + for _, szID in ipairs({ 'TargetTarget', 'Caution' }) do + hDest = h:Lookup('Handle_' .. szID) + -- hScale = hDest:Lookup('Handle_' .. szID .. '_Scale') + hFixed = hDest:Lookup('Handle_' .. szID .. '_Fixed') + -- fUIX, fUIY = hScale:GetW() / hFixed:GetW(), hScale:GetH() / hFixed:GetH() + fSfxX, fSfxY = hDest:GetW() / hFixed:GetW(), hDest:GetH() / hFixed:GetH() + hDest:Lookup('SFX_' .. szID):SetModelScale(fSfxX / fUIScale, fSfxY / fUIScale, fSfxX / fUIScale) + end + end + end +end + +function CTM:RefreshGVoice() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + local team = GetClientTeam() + local sayingInfo = X.GVoiceBase_GetSaying() + local bInRoom = X.GVoiceBase_GetMicState() ~= X.CONSTANT.MIC_STATE.CLOSE_NOT_IN_ROOM + for dwID, h in pairs(CTM_CACHE) do + if h:IsValid() then + local fScale = math.min(CFG.fScaleY, CFG.fScaleX) + local hSpeaker = h:Lookup('Handle_Speaker') + if bInRoom and GVoiceBase_IsMemberForbid(dwID) then + hSpeaker:Show() + hSpeaker:SetRelX(h:GetW() - hSpeaker:GetW()) + hSpeaker:SetAbsX(h:GetAbsX() + h:GetW() - 30 * fScale) + hSpeaker:Lookup('Shadow_SpeakerBg'):SetSize(30 * fScale, 22 * fScale) + hSpeaker:Lookup('Handle_ForbidSpeaker'):Show() + hSpeaker:Lookup('Animate_SpeakerEffect'):Hide() + hSpeaker:Lookup('Handle_ForbidSpeaker/Image_Speaker'):SetSize(11 * fScale, 16 * fScale) + hSpeaker:Lookup('Handle_ForbidSpeaker/Image_ForbidSpeaker'):SetSize(16 * fScale, 16 * fScale) + elseif bInRoom and GVoiceBase_IsMemberSaying(dwID, sayingInfo) then + hSpeaker:Show() + hSpeaker:SetRelX(h:GetW() - hSpeaker:GetW()) + hSpeaker:SetAbsX(h:GetAbsX() + h:GetW() - 30 * fScale) + hSpeaker:Lookup('Shadow_SpeakerBg'):SetSize(30 * fScale, 22 * fScale) + hSpeaker:Lookup('Handle_ForbidSpeaker'):Hide() + hSpeaker:Lookup('Animate_SpeakerEffect'):Show() + hSpeaker:Lookup('Animate_SpeakerEffect'):SetSize(32 * fScale, 24 * fScale) + else + hSpeaker:Hide() + end + end + end +end + +function CTM:CallRefreshImages(dwID, ...) + if type(dwID) == 'number' then + local info = self:GetMemberInfo(dwID) + local handle = CTM_CACHE[dwID] + if info and handle and handle:IsValid() then + self:RefreshImages(handle, dwID, info, ...) + end + else + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + local info = self:GetMemberInfo(k) + self:RefreshImages(v, k, info, ...) + end + end + end +end + +function CTM:KungFuSwitch(dwID) + local handle = CTM_CACHE[dwID] + if handle and handle:IsValid() then + if X.GetPlayer(dwID) then + local key = 'MY_CATACLYSM_KUNGFU_' .. dwID + local img = handle:Lookup('Image_Icon') + X.BreatheCall(key, function() + local player = X.GetPlayer(dwID) + if player and img and img:IsValid() then + local nType, dwSkillID, dwSkillLevel, fCastPercent = X.GetCharacterOTActionState(player) + if (nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE) and fCastPercent then + local alpha = 255 * (math.abs((fCastPercent * 300) % 32 - 7) + 4) / 12 + if alpha <= 255 then + img:SetAlpha(alpha) + end + return + else + img:SetAlpha(255) + end + end + X.BreatheCall(key, false) + end) + end + end +end + +-- 刷新图标和名字之类的信息 +function CTM:RefreshImages(h, dwID, info, tSetting, bIcon, bFormationLeader, bLayout) + -- assert(info) + if not info then return end + -- 刷新团队权限标记 + if type(tSetting) ~= 'nil' then + local fnAction = function(t) + local hTotal = { + [TEAM_AUTHORITY_TYPE.LEADER] = h:Lookup('Handle_Icons/Image_Leader'), + [TEAM_AUTHORITY_TYPE.MARK] = h:Lookup('Handle_Icons/Image_Marker'), + [TEAM_AUTHORITY_TYPE.DISTRIBUTE] = h:Lookup('Handle_Icons/Image_Looter'), + } + for k, v in pairs(hTotal) do + if t[k] == dwID then + v:Show() + local fScale = (CFG.fScaleY + CFG.fScaleX) / 2 + v:SetSize(14 * fScale, 14 * fScale) + else + v:Hide() + end + end + end + + if type(tSetting) == 'table' then -- 根据表的内容刷新标记队长等信息 + fnAction(tSetting) + elseif type(tSetting) == 'boolean' and tSetting then + fnAction(self:GetTeamInfo()) + end + end + -- 刷新阵眼 + if type(bFormationLeader) == 'boolean' then + if bFormationLeader then + local fScale = (CFG.fScaleY + CFG.fScaleX) / 2 + h:Lookup('Handle_Icons/Image_Matrix'):SetSize(14 * fScale, 14 * fScale) + h:Lookup('Handle_Icons/Image_Matrix'):Show() + else + h:Lookup('Handle_Icons/Image_Matrix'):Hide() + end + end + -- 刷新内功 + if bIcon then -- 刷新icon + local img, bVisible = h:Lookup('Image_Icon'), true + if CFG.nShowIcon ~= 4 then + if CFG.nShowIcon == 2 and info.dwActualKungfuID == 0 then + img:FromUITex('ui/image/TargetPanel/Target.UITex', 21) + elseif CFG.nShowIcon == 2 then + local _, nIconID = X.GetSkillName(info.dwActualKungfuID, 1) + if nIconID == 1435 then nIconID = 889 end + img:FromIconID(nIconID) + elseif CFG.nShowIcon == 1 then + img:FromUITex(GetForceImage(info.dwForceID)) + elseif CFG.nShowIcon == 3 then + local szCampImg, nCampFrame = X.GetCampImage(info.nCamp, false) + if szCampImg then + img:FromUITex(szCampImg, nCampFrame) + else + bVisible = false + end + end + local fScale = (CFG.fScaleY + CFG.fScaleX) / 2 + if fScale * 0.9 > 1 then + fScale = fScale * 0.9 + end + img:SetSize(28 * fScale, 28 * fScale) + else -- 不再由icon控制 转交给textname + bVisible = false + end + img:SetVisible(bVisible) + bLayout = true + end + -- 刷新平台 + h:Lookup('Handle_Platform'):SetVisible(X.IsMobileClient(info.nClientVersionType)) + -- 刷新名字 + if bLayout then + local txtName = h:Lookup('Text_Name') + local txtLife = h:Lookup('Text_Life') + local txtDeath = h:Lookup('Text_Death') + local txtOffLine = h:Lookup('Text_OffLine') + local txtSchool = h:Lookup('Text_School_Name') + local r, g, b = 255, 255, 255 + if CFG.nColoredName == 1 then + r, g, b = X.GetForceColor(info.dwForceID, 'foreground') + elseif CFG.nColoredName == 0 then + r, b, b = 255, 255, 255 + elseif CFG.nColoredName == 2 then + r, g, b = X.GetCampColor(info.nCamp, 'foreground') + end + local szName = X.ExtractPlayerOriginName(info.szName) + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + szName = MY_ChatMosaics.MosaicsString(szName) + end + txtName:SetText(szName) + txtName:SetVAlign(CFG.nNameVAlignment) + txtName:SetHAlign(CFG.nNameHAlignment) + txtName:SetFontScheme(CFG.nNameFont) + txtName:SetFontColor(r, g, b) + txtName:SetFontScale(CFG.fNameFontScale) + txtLife:SetVAlign(CFG.nHPVAlignment) + txtLife:SetHAlign(CFG.nHPHAlignment) + txtDeath:SetVAlign(CFG.nHPVAlignment) + txtDeath:SetHAlign(CFG.nHPHAlignment) + txtOffLine:SetVAlign(CFG.nHPVAlignment) + txtOffLine:SetHAlign(CFG.nHPHAlignment) + local fScale, nRelX = (CFG.fScaleY + CFG.fScaleX) / 2 + if fScale * 0.9 > 1 then + fScale = fScale * 0.9 + end + if CFG.nShowIcon == 4 then + local r, g, b = X.GetForceColor(info.dwForceID, 'foreground') + txtSchool:SetText(CTM_KUNGFU_TEXT[info.dwActualKungfuID]) + txtSchool:SetFontScheme(CFG.nNameFont) + txtSchool:SetFontColor(r, g, b) + txtSchool:SetFontScale(fScale) + txtSchool:AutoSize() + txtSchool:Show() + nRelX = txtSchool:GetRelX() + txtSchool:GetW() + 5 + else + local img = h:Lookup('Image_Icon') + txtSchool:Hide() + nRelX = img:GetRelX() + img:GetW() + end + -- 刷新名字血量位置 + local nMargin = CFG.eFrameStyle == 'OFFICIAL' and 7 or 5 + for _, szItemName in ipairs({'Text_Name', 'Text_Life', 'Text_Death', 'Text_OffLine'}) do + local txt = h:Lookup(szItemName) + local nVAlign = txt:GetVAlign() + local nHAlign = txt:GetHAlign() + if nVAlign == ALIGNMENT.TOP + and (nHAlign == ALIGNMENT.LEFT or nHAlign == ALIGNMENT.RIGHT) then + txt:SetRelX(nRelX) + txt:SetAbsX(h:GetAbsX() + nRelX) + txt:SetW(h:GetW() - nRelX - nMargin) + else + txt:SetRelX(nMargin) + txt:SetAbsX(h:GetAbsX() + nMargin) + txt:SetW(h:GetW() - nMargin * 2) + end + end + -- 刷新BUFF位置 + if CFG.bBuffAboveMana then + local hMana = h:Lookup('Handle_Mana') + local hBoxes = h:Lookup('Handle_Buff_Boxes') + hBoxes:SetRelPos(hMana:GetRelX() - 1, hMana:GetRelY() - hBoxes:GetH() + hMana:GetH() / 2) + hBoxes:SetAbsPos(hMana:GetAbsX() - 1, hMana:GetAbsY() - hBoxes:GetH() + hMana:GetH() / 2) + end + end +end + +function CTM:DrawAllParty() + for i = 0, CTM_GROUP_COUNT do + if not self:GetPartyFrame(i) then + self:CreatePanel(i) + self:DrawParty(i) + else + self:FormatFrame(self:GetPartyFrame(i), CTM_MEMBER_COUNT) + end + end +end + +function CTM:CloseParty(nIndex) + if nIndex then + if self:GetPartyFrame(nIndex) then + X.UI.CloseFrame(self:GetPartyFrame(nIndex)) + end + else + for i = 0, CTM_GROUP_COUNT do + if self:GetPartyFrame(i) then + X.UI.CloseFrame(self:GetPartyFrame(i)) + end + end + end +end + +function CTM:ReloadParty() + local team = GetClientTeam() + for i = 0, team.nGroupNum - 1 do + local tGroup = team.GetGroupInfo(i) + if tGroup then + if #tGroup.MemberList == 0 then + self:CloseParty(i) + else + self:CreatePanel(i) + self:DrawParty(i) + end + end + end + self:AutoLinkAllPanel() + self:RefreshMark() + self:RefreshDistance() + self:RefreshFormation() + self:RefreshPlayerSkillCD() + CTM_LIFE_CACHE = {} +end + +-- 哎 事件太蛋疼 就这样吧 +function CTM:RefreshFormation() + local team = GetClientTeam() + for i = 0, team.nGroupNum - 1 do + local tGroup = team.GetGroupInfo(i) + if tGroup and tGroup.dwFormationLeader and #tGroup.MemberList > 0 then + local dwFormationLeader = tGroup.dwFormationLeader + for k, v in ipairs(tGroup.MemberList) do + local info = self:GetMemberInfo(v) + if CTM_CACHE[v] and CTM_CACHE[v]:IsValid() then + self:RefreshImages(CTM_CACHE[v], v, info, false, false, dwFormationLeader == v) + end + end + end + end +end + +-- 绘制面板 +function CTM:DrawParty(nIndex) + local team = GetClientTeam() + local tGroup = team.GetGroupInfo(nIndex) + local frame = self:GetPartyFrame(nIndex) + local handle = frame:Lookup('', 'Handle_Cols/Handle_Roles') + local tSetting = self:GetTeamInfo() + local hMember = MY_CataclysmMain.GetFrame().hMember + handle:Clear() + for i = 1, CTM_MEMBER_COUNT do + local dwID = tGroup.MemberList[i] + local h = handle:AppendItemFromData(hMember, i) + if dwID then + h.bRole = true + h.dwID = dwID + CTM_CACHE[dwID] = h + local info = self:GetMemberInfo(dwID) + h:Lookup('Image_MemberBg'):Show() + self:RefreshImages(h, dwID, info, tSetting, true, dwID == tGroup.dwFormationLeader, true) + end + h.nGroup = nIndex + self:Scale(CFG.fScaleX, CFG.fScaleY, h) + end + handle:FormatAllItemPos() + frame.nMemberCount = #tGroup.MemberList + -- 先缩放后画 + self:FormatFrame(frame, #tGroup.MemberList) + self:RefreshDistance() -- 立即刷新一次 + for k, v in pairs(CTM_CACHE) do + if v:IsValid() and v.nGroup == nIndex then + self:CallDrawHPMP(k, true) + end + end + CTM_LIFE_CACHE = {} + -- 刷新 + CTM_TARGET = nil + CTM_TTARGET = nil + local dwType, dwID = Target_GetTargetData() + self:RefreshTarget(dwID, dwType, dwID, dwType) + self:RefreshTTarget() + self:RefreshPlayerSkillCD() +end + +function CTM:Scale(fX, fY, frame) + if frame then + frame:Scale(fX, fY) + else + for i = 0, CTM_GROUP_COUNT do + if self:GetPartyFrame(i) then + self:GetPartyFrame(i):Scale(fX, fY) + self:FormatFrame(self:GetPartyFrame(i)) + end + end + end + self:AutoLinkAllPanel() + self:CallRefreshImages(true, true, true, nil, true) -- 缩放其他图标 + self:RefreshSFX() -- 缩放特效 + self:RefreshFormation() -- 缩放阵眼 + self:RefreshMark() -- 缩放标记 + self:RefreshGVoice() -- 缩放语音 +end + +function CTM:FormatFrame(frame, nMemberCount) + local fX, fY = CFG.fScaleX, CFG.fScaleY + local height, nGroupHeight = (CFG.fScaleY - 1) * 18, 0 + local h = frame:Lookup('', '') + local nRolesH = 0 + if CTM_DRAG or CFG.bShowAllGrid then + nMemberCount = CTM_MEMBER_COUNT + local handle = h:Lookup('Handle_Cols/Handle_Roles') + for i = 0, handle:GetItemCount() - 1 do + local h = handle:Lookup(i) + if not h.dwID then + if CTM_DRAG then + h:Lookup('Image_SlotBg'):Show() + end + h:Lookup('Image_MemberBg'):Show() + end + nRolesH = nRolesH + h:GetH() + end + handle:SetH(nRolesH) + else + nMemberCount = frame.nMemberCount or CTM_MEMBER_COUNT + local handle = h:Lookup('Handle_Cols/Handle_Roles') + for i = 0, handle:GetItemCount() - 1 do + local h = handle:Lookup(i) + if h.dwID then + nRolesH = nRolesH + h:GetH() + end + h:Lookup('Image_SlotBg'):Hide() + h:Lookup('Image_MemberBg'):SetVisible(not not h.dwID) + end + handle:SetH(nRolesH) + end + if not CFG.bShowGroupNumber then + nGroupHeight = 23 + end + frame:SetSize(128 * fX, 25 * fY + nRolesH - height - nGroupHeight) + h:Lookup('Handle_BG/Shadow_BG'):SetSize(120 * fX, nRolesH + 20 * fY - height - nGroupHeight) + h:Lookup('Handle_BG/Image_BG_L'):SetSize(18 * fX, nRolesH + nMemberCount * 3 * fY - height - nGroupHeight) + h:Lookup('Handle_BG/Image_BG_R'):SetSize(18 * fX, nRolesH + nMemberCount * 3 * fY - height - nGroupHeight) + h:Lookup('Handle_BG/Image_BG_BL'):SetRelPos(0, nRolesH + 11 * fY - height - nGroupHeight) + h:Lookup('Handle_BG/Image_BG_T'):SetSize(110 * fX, 18 * fY) + h:Lookup('Handle_BG/Image_BG_B'):SetSize(110 * fX, 18 * fY) + h:Lookup('Handle_BG/Image_BG_B'):SetRelPos(14 * fX, nRolesH + 11 * fY - height - nGroupHeight) + h:Lookup('Handle_BG/Image_BG_BR'):SetRelPos(112 * fX, nRolesH + 11 * fY - height - nGroupHeight) + h:Lookup('Handle_BG'):FormatAllItemPos() + h:Lookup('Handle_Cols/Handle_Title'):SetVisible(CFG.bShowGroupNumber) + h:Lookup('Handle_Cols/Handle_Title'):SetH(23) + h:Lookup('Handle_Cols/Handle_Title/Text_Title'):SetH(23) + h:Lookup('Handle_Cols/Handle_Title/Image_TitleBg'):SetH(23) + h:Lookup('Handle_Cols'):FormatAllItemPos() +end + +-- 注册buff +function CTM:RecBuff(dwMemberID, tRule) + local szKey = ('%d,%d,%s%d'):format( + tRule.dwID, tRule.nLevel, + tRule.szStackOp or '', + tRule.nStackNum or 0 + ) + CTM_BUFF_RULE[szKey] = setmetatable({ szKey = szKey }, { __index = tRule }) +end + +function CTM:ClearBuff(dwMemberID) + local team = GetClientTeam() + for k, v in ipairs(team.GetTeamMemberList()) do + if CTM_CACHE[v] and CTM_CACHE[v]:IsValid() then + CTM_CACHE[v]:Lookup('Handle_Buff_Boxes'):Clear() + end + if CTM_CAUTION_BUFF[v] then + CTM_CAUTION_BUFF[v] = nil + end + if CTM_ATTENTION_BUFF[v] then + for _, p in pairs(CTM_ATTENTION_BUFF[v]) do + for i, rec in X.ipairs_r(CTM_ATTENTION_STACK[v]) do + if rec == p then + table.remove(CTM_ATTENTION_STACK[v], i) + break + end + end + end + CTM_ATTENTION_BUFF[v] = nil + end + if CTM_CAUTION_BUFF[v] then + CTM_CAUTION_BUFF[v] = nil + end + if CTM_SCREEN_HEAD[v] then + CTM_SCREEN_HEAD[v] = nil + end + end + CTM_BUFF_RULE = {} +end + +function D.UpdateCharaterBuffBox(hItem, tBuff, tRule) + local nEndFrame, nStackNum = tBuff.nEndFrame, tBuff.nStackNum + -- 描边 + local r, g, b, a + if tRule.colBorder or tRule.col then + r, g, b, a = X.HumanColor2RGB(tRule.colBorder or tRule.col) + end + if tRule.colBorder or tRule.col then + local hSha, sha = hItem:Lookup('Handle_RbgBorders') + for i = 0, hSha:GetItemCount() - 1 do + sha = hSha:Lookup(i) + sha:SetAlpha(a or tRule.nColAlpha or 192) + sha:SetColorRGB(r or 255, g or 255, b or 0) + end + hItem:Lookup('Handle_RbgBorders'):Show() + hItem:Lookup('Handle_InnerBorders'):Show() + else + hItem:Lookup('Handle_RbgBorders'):Hide() + hItem:Lookup('Handle_InnerBorders'):Hide() + end + -- 文字大小 + local r, g, b, a + if tRule.colReminder or tRule.col then + r, g, b, a = X.HumanColor2RGB(tRule.colReminder or tRule.col) + end + local szName, icon = X.GetBuffName(tRule.dwID, tRule.nLevelEx or tBuff.nLevel) + if tRule.nIcon and tonumber(tRule.nIcon) then + icon = tRule.nIcon + end + hItem.szName = szName + local box = hItem:Lookup('Box') + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN, tRule.dwID, tRule.nLevelEx) + box:SetObjectIcon(icon) + box:SetObjectStaring(CFG.bStaring) + local txtStackNum = hItem:Lookup('Text_StackNum') + txtStackNum:SetFontColor(255, 255, 255) + local txtReminder = hItem:Lookup('Text_Reminder') + txtReminder:SetText(tRule.szReminder) + txtReminder:SetVisible(CFG.bShowBuffReminder) + txtReminder:SetFontColor(r or 255, g or 255, b or 255) + + -- revise + -- update data + hItem.dwID = tBuff.dwID + hItem.nLevel = tBuff.nLevel + hItem.nEndFrame = nEndFrame + hItem.nStackNum = nStackNum + hItem.szVia = tRule.szVia + -- buff time + local txtTime = hItem:Lookup('Text_Time') + if CFG.bShowBuffTime then + local nTime, r, g, b = MY_GetEndTime(nEndFrame) + if nTime <= 5 then + if nTime >= 0 then + r, g, b = 255, 0, 0 + end + elseif nTime <= 30 then + r, g, b = 255, 255, 0 + end + if r and g and b then + txtTime:SetText(math.floor(nTime) .. '"') + txtTime:SetFontColor(r, g, b) + else + txtTime:SetText('') + end + end + txtTime:SetVisible(CFG.bShowBuffTime) + -- buff stack number + local txtStackNum = hItem:Lookup('Text_StackNum') + if CFG.bShowBuffNum and nStackNum > 1 then + txtStackNum:SetText(nStackNum) + else + txtStackNum:SetText('') + end + txtStackNum:SetVisible(CFG.bShowBuffNum) +end + +-- BUFF => 数据表,排序根据优先级、作用域刷新作用严格程度 +local function RuleSorter(a, b) + -- 全局优先级 + if a.nPriority == b.nPriority then + -- 作用域优先级 + if (a.szStackOp == '') == (b.szStackOp == '') then + -- 来源优先级 + if a.nViaPriority == b.nViaPriority then + return false + end + if not a.nViaPriority then + return false + end + if not b.nViaPriority then + return true + end + return a.nViaPriority < b.nViaPriority + end + if a.szStackOp == '' then + return false + end + if b.szStackOp == '' then + return true + end + return false + end + if not a.nPriority then + return false + end + if not b.nPriority then + return true + end + return a.nPriority < b.nPriority +end +local function DispSorter(a, b) + if a.nPriority == b.nPriority then + local nTimeA = CTM_BUFF_TIME[a.dwCharID] and CTM_BUFF_TIME[a.dwCharID][a.tBuff.dwID] + local nTimeB = CTM_BUFF_TIME[b.dwCharID] and CTM_BUFF_TIME[b.dwCharID][b.tBuff.dwID] + if nTimeA == nTimeB then + return false + end + if not nTimeA then + return true + end + if not nTimeB then + return false + end + return nTimeA < nTimeB + end + if not a.nPriority then + return false + end + if not b.nPriority then + return true + end + return a.nPriority < b.nPriority +end +function D.UpdateCharaterBuff(p, handle, tKeep) + if X.IsInCompetitionMap() and X.IsClientPlayerMountMobileKungfu() then + return + end + local dwCharID = p.dwID + local me = X.GetClientPlayer() + -- 气劲数据归并 + local tDisp = {} + for _, tRule in pairs(CTM_BUFF_RULE) do + local buff = (not tRule.bOnlyMe or p.dwID == me.dwID) + and MY_GetBuff(p, tRule.dwID, tRule.nLevel, tRule.bOnlyMine and me.dwID) + or nil + if buff then + if buff.nStackNum and tRule.nStackNum + and not X.JudgeOperator(tRule.szStackOp or '>=', buff.nStackNum, tRule.nStackNum) then + buff = nil + end + if buff then + tKeep[tRule.szKey] = true + -- 加入 BUFF 组,准备后续排序渲染 + if not tDisp[buff.szKey] then + tDisp[buff.szKey] = { + tBuff = buff, + aRule = {}, + } + end + table.insert(tDisp[buff.szKey].aRule, tRule) + end + end + end + -- 气劲数据排序 + local aDisp = {} + local tRuleKey = {} + for _, tItem in pairs(tDisp) do + table.sort(tItem.aRule, RuleSorter) + local tRule = tItem.aRule[1] + local nPriority = tRule.nPriority + if not nPriority then + if tRule.bCaution then + nPriority = 0 + elseif tRule.bAttention then + nPriority = 1 + end + end + table.insert(aDisp, { + dwCharID = dwCharID, + tBuff = tItem.tBuff, + tRule = tRule, + nPriority = nPriority, + }) + tRuleKey[tRule.szKey] = true + end + table.sort(aDisp, DispSorter) + -- 气劲渲染 + for i = 1, CFG.nMaxShowBuff do + local hItem = handle:Lookup(i - 1) + local tItem = aDisp[i] + if tItem then + if not hItem then + hItem = handle:AppendItemFromData(MY_CataclysmMain.GetFrame().hBuff) + local fScale = 1 + if CFG.bAutoBuffSize then + if CFG.fScaleY > 1 then + fScale = CFG.fScaleY + end + fScale = fScale * 0.8 -- INI画大了不好调 这里调整下吧 + else + fScale = CFG.fBuffScale + end + local fFontScale = fScale * 0.9 / (1 + Font.GetOffset() * 0.07) + hItem:Scale(fScale, fScale) + local txtTime = hItem:Lookup('Text_Time') + txtTime:SetFontScale(fFontScale * (hItem:GetH() / txtTime:GetH()) * 0.6) + local txtStackNum = hItem:Lookup('Text_StackNum') + txtStackNum:SetFontScale(fFontScale * (hItem:GetH() / txtStackNum:GetH()) * 0.55) + local txtReminder = hItem:Lookup('Text_Reminder') + txtReminder:SetFontScale(fFontScale * (hItem:GetH() / txtReminder:GetH()) * 0.6) + hItem.bBuff = true + end + hItem:Show() + D.UpdateCharaterBuffBox(hItem, tItem.tBuff, tItem.tRule) + elseif hItem then + hItem:Hide() + end + end + handle:FormatAllItemPos() + -- 渲染当前提醒 + for _, tItem in ipairs(aDisp) do + local tRule = tItem.tRule + local tBuff = tItem.tBuff + -- update attention + if tRule.bAttention then + if not CTM_ATTENTION_BUFF[dwCharID] then + CTM_ATTENTION_BUFF[dwCharID] = {} + end + if not CTM_ATTENTION_STACK[dwCharID] then + CTM_ATTENTION_STACK[dwCharID] = {} + end + if not CTM_ATTENTION_BUFF[dwCharID][tRule.szKey] then + local rec = { + col = tRule.colAttention or tRule.col or 'yellow', + } + CTM_ATTENTION_BUFF[dwCharID][tRule.szKey] = rec + table.insert(CTM_ATTENTION_STACK[dwCharID], 1, rec) + end + end + -- update caution + if tRule.bCaution then + if not CTM_CAUTION_BUFF[dwCharID] then + CTM_CAUTION_BUFF[dwCharID] = {} + end + CTM_CAUTION_BUFF[dwCharID][tRule.szKey] = true + end + -- update screen head + if tRule.bScreenHead then + if not CTM_SCREEN_HEAD[dwCharID] then + CTM_SCREEN_HEAD[dwCharID] = {} + end + if not CTM_SCREEN_HEAD[dwCharID][tRule.szKey] then + local szCountdownKey = 'MY_CATACLYSM_' .. tBuff.dwID .. '_' .. tRule.szKey + FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwCharID, 'BUFF', szCountdownKey, { + dwBuffID = tBuff.dwID, + szText = tBuff.szName, + nLogicFrame = tBuff.nEndFrame, + col = tRule.colScreenHead or tRule.col, + nPriority = tItem.nPriority, + }) + CTM_SCREEN_HEAD[dwCharID][tRule.szKey] = szCountdownKey + end + end + end + -- 移除消失的提醒 + if CTM_ATTENTION_BUFF[dwCharID] then + for szRuleKey, rec in pairs(CTM_ATTENTION_BUFF[dwCharID]) do + if not tRuleKey[szRuleKey] then + for i, vv in X.ipairs_r(CTM_ATTENTION_STACK[dwCharID]) do + if vv == rec then + table.remove(CTM_ATTENTION_STACK[dwCharID], i) + break + end + end + CTM_ATTENTION_BUFF[dwCharID][szRuleKey] = nil + end + end + end + if CTM_CAUTION_BUFF[dwCharID] then + for szRuleKey, _ in pairs(CTM_CAUTION_BUFF[dwCharID]) do + if not tRuleKey[szRuleKey] then + CTM_CAUTION_BUFF[dwCharID][szRuleKey] = nil + end + end + end + if CTM_SCREEN_HEAD[dwCharID] then + for szRuleKey, _ in pairs(CTM_SCREEN_HEAD[dwCharID]) do + if not tRuleKey[szRuleKey] then + FireUIEvent( + 'MY_LIFEBAR_COUNTDOWN', + dwCharID, + 'BUFF', + CTM_SCREEN_HEAD[dwCharID][szRuleKey], + false + ) + CTM_SCREEN_HEAD[dwCharID][szRuleKey] = nil + end + end + end +end + +function CTM:RefreshBuff() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 8 ~= 0 then + return + end + local team = GetClientTeam() + local tKeep = {} + for k, v in ipairs(team.GetTeamMemberList()) do + local p = X.GetPlayer(v) + local handle = CTM_CACHE[v] and CTM_CACHE[v]:IsValid() and CTM_CACHE[v]:Lookup('Handle_Buff_Boxes') + if handle then + if p then + D.UpdateCharaterBuff(p, handle, tKeep) + else + handle:Clear() + end + end + end + for k, v in pairs(CTM_BUFF_RULE) do + if not tKeep[k] then + CTM_BUFF_RULE[k] = nil + end + end + -- print(CTM_BUFF_CACHE) +end + +function CTM:RecBossFocusBuff(dwMemberID, data) + CTM_BOSS_FOCUS_BUFF[data.dwID .. '#' .. data.nLevel] = data +end + +function CTM:RefreshBossFocus() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + local team, me = GetClientTeam(), X.GetClientPlayer() + for k, v in ipairs(team.GetTeamMemberList()) do + if CTM_CACHE[v] and CTM_CACHE[v]:IsValid() then + local p, bFocus = X.GetPlayer(v), nil + if p then + for _, data in pairs(CTM_BOSS_FOCUS_BUFF) do + local buff = MY_GetBuff(p, data.dwID, data.nLevel) + if buff and buff.nStackNum >= data.nStackNum then + bFocus = true + break + end + end + end + CTM_BOSS_FOCUSED_STATE[v] = bFocus + end + end + self:RefreshCaution() +end + +function CTM:RefreshDistance() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 8 ~= 0 then + return + end + local me = X.GetClientPlayer() + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + local p = X.GetPlayer(k) -- info.nPoX 刷新太慢了 对于治疗来说 这个太重要了 + if p then + local nDistance = MY.GetCharacterDistance(me, p) -- 只计算平面 --?? + if CFG.bEnableDistance then + local find + for kk, vv in ipairs(CFG.tDistanceLevel) do + if nDistance <= vv then + if v.nDistanceLevel ~= kk then + v.nDistanceLevel = kk + self:CallDrawHPMP(k, true) + end + find = true + break + end + end + -- 如果上面都不匹配的话 默认认为出了同步范围 feedback 桥之于水 + if not find and v.nDistanceLevel then + v.nDistanceLevel = nil + self:CallDrawHPMP(k, true) + end + else + v.nDistance = 0 + v.nDistanceLevel = 1 + end + if CFG.bShowDistance then + v:Lookup('Text_Distance'):SetText(string.format('%.1f', nDistance)) + v:Lookup('Text_Distance'):SetFontColor(255, math.max(0, 255 - nDistance * 8), math.max(0, 255 - nDistance * 8)) + else + v:Lookup('Text_Distance'):SetText('') + end + else + if CFG.bShowDistance then + v:Lookup('Text_Distance'):SetText('') + end + if v.nDistance or v.nDistanceLevel then + v.nDistance = nil + v.nDistanceLevel = nil + self:CallDrawHPMP(k, true) + end + end + end + end +end + +function CTM:RecPlayerSkillCD(dwMemberID, dwSkillID, nSkillLevel, nEndFrame) + if not CTM_PLAYER_SKILL_CD[dwMemberID] then + CTM_PLAYER_SKILL_CD[dwMemberID] = {} + end + CTM_PLAYER_SKILL_CD[dwMemberID] = { + dwSkillID = dwSkillID, + nSkillLevel = nSkillLevel, + nEndFrame = nEndFrame, + } +end + +function CTM:RefreshPlayerSkillCD() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + local rec = CFG.bEnableImportantSkill and CTM_PLAYER_SKILL_CD[k] + if rec then + local nLeft = math.ceil(math.max(0, rec.nEndFrame - GetLogicFrameCount()) / GLOBAL.GAME_FPS) + if nLeft > 0 then + v:Lookup('Handle_SkillCD/Box_SkillCD'):Hide() + v:Lookup('Handle_SkillCD/Text_SkillCD'):Show() + v:Lookup('Handle_SkillCD/Text_SkillCD'):SetText(nLeft > 60 and (math.ceil(nLeft / 60) .. '\'') or (nLeft .. '"')) + else + v:Lookup('Handle_SkillCD/Text_SkillCD'):Hide() + v:Lookup('Handle_SkillCD/Box_SkillCD'):Show() + v:Lookup('Handle_SkillCD/Box_SkillCD'):SetObjectIcon(Table_GetSkillIconID(rec.dwSkillID, rec.nSkillLevel)) + end + v:Lookup('Handle_SkillCD'):Show() + else + v:Lookup('Handle_SkillCD'):Hide() + end + end + end +end + +-- 血量 / 内力 +function CTM:CallDrawHPMP(dwID, ...) + if type(dwID) == 'number' then + local info = self:GetMemberInfo(dwID) + local handle = CTM_CACHE[dwID] + if info and handle and handle:IsValid() then + self:DrawHPMP(handle, dwID, info, ...) + end + else + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + local info = self:GetMemberInfo(k) + if info then + self:DrawHPMP(v, k, info, ...) + end + end + end + end +end + +-- 缩放对动态构建的UI不会缩放 所以需要后处理 +function CTM:DrawHPMP(h, dwID, info, bRefresh) + if not info then return end + local bSha = CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.OFFICIAL + local hLife = h:Lookup('Handle_Life') + local hMana = h:Lookup('Handle_Mana') + local Lsha = hLife:Lookup('Shadow_Life') + local Limg = hLife:Lookup('Image_Life') + local Ledg = hLife:Lookup('Image_LifeLine') + local Msha = hMana:Lookup('Shadow_Mana') + local Mimg = hMana:Lookup('Image_Mana') + local player, npc, dwMountType + if CHANGGE_REAL_SHADOW_CACHE[dwID] then + npc = X.GetNpc(CHANGGE_REAL_SHADOW_CACHE[dwID]) + end + if CFG.bFasterHP then + player = X.GetPlayer(dwID) + end + -- 气血计算 因为sync 必须拿出来单独算 + local obj = npc or player + local fLifePercentage + local fCurrentLife, fMaxLife = X.GetCharacterLife(obj) + if not fCurrentLife or fCurrentLife < - 1000 + or fMaxLife == 1 or fCurrentLife == 1 + or fCurrentLife == 255 or fMaxLife == 255 then -- obj sync err fix + fCurrentLife, fMaxLife = X.GetCharacterLife(info) + end + fMaxLife = math.max(1, fMaxLife) + fCurrentLife = math.max(0, fCurrentLife) + fLifePercentage = fMaxLife ~= 0 and (fCurrentLife / fMaxLife) + if not fLifePercentage or fLifePercentage < 0 or fLifePercentage > 1 then + fLifePercentage = 1 + end + Lsha:SetVisible(bSha) + Msha:SetVisible(bSha) + Limg:SetVisible(not bSha) + Ledg:SetVisible(not bSha) + Mimg:SetVisible(not bSha) + + local bDeathFlag = info.bDeathFlag + -- 有待验证 + if player then + if player.GetKungfuMount() then + dwMountType = player.GetKungfuMount().dwMountType + end + if player.nMoveState == MOVE_STATE_ON_STAND then + if info.bDeathFlag then + bDeathFlag = true + end + else + bDeathFlag = player.nMoveState == MOVE_STATE_ON_DEATH + end + end + -- 透明度 + local nAlpha = 255 + if CFG.nBGColorMode ~= CTM_BG_COLOR_MODE.BY_DISTANCE then + if h.nDistanceLevel then + nAlpha = CFG.tDistanceAlpha[h.nDistanceLevel] + elseif info.bOnline then + nAlpha = CFG.tOtherAlpha[3] + else + nAlpha = CFG.tOtherAlpha[2] + end + else + nAlpha = 255 + end + -- 内力 + if not bDeathFlag then + local nPercentage, nManaShow = 1, 1 + local mana = h:Lookup('Text_Mana') + if not IsPlayerManaHide(info.dwForceID, dwMountType) then -- 内力不需要那么准 + nPercentage = info.nMaxMana ~= 0 and (info.nCurrentMana / info.nMaxMana) + nManaShow = info.nCurrentMana + if not CFG.nShowMP then + mana:SetText('') + else + mana:SetText(nManaShow) + end + mana:SetFontScheme(CFG.nManaFont) + mana:SetFontScale(CFG.fManaFontScale) + end + if not nPercentage or nPercentage < 0 or nPercentage > 1 then + nPercentage = 1 + end + if bSha then + local r, g, b = unpack(CFG.tManaColor) + if not info.bOnline then + r, g, b = unpack(CFG.tOtherCol[2]) -- 不在线就灰色了 + end + self:DrawShadow(Msha, hMana:GetW() * nPercentage, Msha:GetH(), r, g, b, nAlpha, CFG.bManaGradient) + Msha:Show() + else + if info.bOnline then + Mimg:ToNormal() + else + Mimg:ToGray() + end + Mimg:Show() + Mimg:SetAlpha(nAlpha) + Mimg:SetPercentage(nPercentage) + end + else + Mimg:Hide() + end + -- 掉血警告 必须早于血条绘制 + if CFG.bHPHitAlert then + local lifeFade = hLife:Lookup('Shadow_Life_Fade') + if CTM_LIFE_CACHE[dwID] and CTM_LIFE_CACHE[dwID] > fLifePercentage then + local nAlpha, nW, nH = lifeFade:GetAlpha(), 0, 0 + if nAlpha == 0 then + if bSha then + nW, nH = Lsha:GetSize() + else + nW, nH = Limg:GetSize() + end + lifeFade:SetSize(nW * CTM_LIFE_CACHE[dwID], nH) + end + lifeFade:SetAlpha(240) + lifeFade:Show() + + local key = 'MY_CATACLYSM_HIT_' .. dwID + X.BreatheCall(key, false) + X.BreatheCall(key, function() + if lifeFade:IsValid() then + local nFadeAlpha = math.max(lifeFade:GetAlpha() - CTM_ALPHA_STEP, 0) + lifeFade:SetAlpha(nFadeAlpha) + if nFadeAlpha <= 0 then + X.BreatheCall(key, false) + end + else + X.BreatheCall(key, false) + end + end) + end + else + hLife:Lookup('Shadow_Life_Fade'):Hide() + end + -- 缓存 + if not CFG.bFasterHP or bRefresh or (CFG.bFasterHP and CTM_LIFE_CACHE[dwID] ~= fLifePercentage) then + if bSha then + -- 颜色计算 + local nNewW = hLife:GetW() * fLifePercentage + local r, g, b = unpack(CFG.tOtherCol[2]) -- 不在线就灰色了 + if info.bOnline then + if CFG.nBGColorMode == CTM_BG_COLOR_MODE.BY_DISTANCE then + if player or X.GetPlayer(dwID) then + if h.nDistanceLevel then + r, g, b = unpack(CFG.tDistanceCol[h.nDistanceLevel]) + else + r, g, b = unpack(CFG.tOtherCol[3]) + end + else + r, g, b = unpack(CFG.tOtherCol[3]) -- 在线使用白色 + end + elseif CFG.nBGColorMode == CTM_BG_COLOR_MODE.SAME_COLOR then + r, g, b = unpack(CFG.tDistanceCol[1]) -- 使用用户配色1 + elseif CFG.nBGColorMode == CTM_BG_COLOR_MODE.BY_FORCE then + r, g, b = X.GetForceColor(info.dwForceID, 'background') + end + end + self:DrawShadow(Lsha, nNewW, Lsha:GetH(), r, g, b, nAlpha, CFG.bLifeGradient) + Lsha:Show() + else + local nRelX = Limg:GetRelX() + Limg:GetW() * fLifePercentage - Ledg:GetW() + Ledg:Show() + Ledg:SetAlpha(nAlpha) + Ledg:SetRelX(nRelX) + Ledg:SetAbsX(hLife:GetAbsX() + nRelX) + if info.bOnline then + Limg:ToNormal() + else + Limg:ToGray() + end + Limg:Show() + Limg:SetAlpha(nAlpha) + Limg:SetPercentage(fLifePercentage) + end + + if not CTM_LIFE_CACHE[dwID] then + CTM_LIFE_CACHE[dwID] = 0 + else + CTM_LIFE_CACHE[dwID] = fLifePercentage + end + -- 数值绘制 + local life = h:Lookup('Text_Life') + local nFontAlpha = math.min(nAlpha * 0.4 + 255 * 0.6, 255) + if not info.bOnline then + nFontAlpha = nFontAlpha * 0.8 + end + life:SetAlpha(nAlpha == 0 and 0 or nFontAlpha) + life:SetFontScheme(CFG.nLifeFont) + life:SetFontScale(CFG.fLifeFontScale) + h:Lookup('Text_Name'):SetAlpha(nFontAlpha) + + if not bDeathFlag and info.bOnline then + life:SetFontColor(255, 255, 255) + if CFG.nHPShownMode2 == 0 then + life:SetText('') + else + local fnAction = function(val, max) + if CFG.nHPShownNumMode == 1 then + if val > 9999 then + val = (CFG.bShowHPDecimal and '%.1fw' or '%dw'):format(val / 10000) + end + elseif CFG.nHPShownNumMode == 2 then + val = (CFG.bShowHPDecimal and '%.1f%%' or '%d%%'):format(val / max * 100) + end + return val + end + if CFG.nHPShownMode2 == 2 then + life:SetText(fnAction(fCurrentLife, fMaxLife)) + elseif CFG.nHPShownMode2 == 1 then + local nShownLife = fMaxLife - fCurrentLife + if nShownLife > 0 then + life:SetText('-' .. fnAction(nShownLife, fMaxLife)) + else + life:SetText('') + end + end + end + elseif not info.bOnline then + life:SetText('') + elseif bDeathFlag then + life:SetText('') + else + life:SetFontColor(128, 128, 128) + life:SetText(COINSHOP_SOURCE_NULL) + end + -- if info.dwActualKungfuID == 0 then -- 没有同步成功时显示的内容 + -- life:SetText('sync ...') + -- end + h:Lookup('Text_Death'):SetVisible(bDeathFlag) + h:Lookup('Text_OffLine'):SetVisible(not info.bOnline) + h:Lookup('Text_Death'):SetFontScale(CFG.fLifeFontScale) + h:Lookup('Text_OffLine'):SetFontScale(CFG.fLifeFontScale) + h:Lookup('Image_PlayerBg'):SetVisible(info.bOnline) + end +end + +-- 重绘溅射助手 +function CTM:RefreshSputtering() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetLogicFrameCount() % 16 ~= 0 then + return + end + local team = GetClientTeam() + if CFG.bShowSputtering then + for nGroup = 0, team.nGroupNum - 1 do + local tGroupInfo = team.GetGroupInfo(nGroup) + local nMaxCount, tCount = 1, {} + for _, dwID in pairs(tGroupInfo.MemberList) do + local info, nCount = team.GetMemberInfo(dwID), 0 + local player = X.GetPlayer(dwID) + if player and not info.bDeathFlag and info.bOnline then + for _, dwID2 in pairs(tGroupInfo.MemberList) do + local info2 = team.GetMemberInfo(dwID2) + local player2 = X.GetPlayer(dwID2) + if player2 and not info2.bDeathFlag and info2.bOnline + and X.GetCharacterDistance(player, player2, 'gwwean') <= CFG.nSputteringDistance then + nCount = nCount + 1 + end + end + if nCount > nMaxCount then + nMaxCount = nCount + end + end + tCount[dwID] = nCount + end + for _, dwID in pairs(tGroupInfo.MemberList) do + local handle = CTM_CACHE[dwID] + if handle and handle:IsValid() then + handle:Lookup('Handle_Sputtering'):SetVisible(tCount[dwID] == nMaxCount) + handle:Lookup('Handle_Sputtering/Text_Sputtering'):SetAlpha(CFG.nSputteringFontAlpha) + handle:Lookup('Handle_Sputtering/Text_Sputtering'):SetText(nMaxCount) + handle:Lookup('Handle_Sputtering/Text_Sputtering'):SetFontColor(unpack(CFG.tSputteringFontColor)) + handle:Lookup('Handle_Sputtering/Shadow_Sputtering'):SetAlpha(CFG.nSputteringShadowAlpha) + handle:Lookup('Handle_Sputtering/Shadow_Sputtering'):SetColorRGB(unpack(CFG.tSputteringShadowColor)) + end + end + end + else + for nGroup = 0, team.nGroupNum - 1 do + local tGroupInfo = team.GetGroupInfo(nGroup) + for _, dwID in pairs(tGroupInfo.MemberList) do + local handle = CTM_CACHE[dwID] + if handle and handle:IsValid() then + handle:Lookup('Handle_Sputtering'):Hide() + end + end + end + end +end + +function CTM:DrawShadow(sha, x, y, r, g, b, a, bGradient) -- 重绘三角扇 + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:ClearTriangleFanPoint() + if bGradient then + sha:AppendTriangleFanPoint(0, 0, 64, 64, 64, a) + sha:AppendTriangleFanPoint(x, 0, 64, 64, 64, a) + sha:AppendTriangleFanPoint(x, y, r, g, b, a) + sha:AppendTriangleFanPoint(0, y, r, g, b, a) + else + sha:AppendTriangleFanPoint(0, 0, r, g, b, a) + sha:AppendTriangleFanPoint(x, 0, r, g, b, a) + sha:AppendTriangleFanPoint(x, y, r, g, b, a) + sha:AppendTriangleFanPoint(0, y, r, g, b, a) + end +end + +do +local VOTE_OPTIONS = { + ['raid_ready'] = { awaitPath = 'Image_ReadyCover', rejectPath = 'Image_NotReady', resolvePath = 'Animate_Ready', timeoutAlert = 5000 }, + ['wage_agree'] = { awaitPath = 'Handle_TeamVoteWait', rejectPath = 'Handle_TeamVoteReject', timeout = 30000 }, +} +function CTM:StartTeamVote(eType) + local opt = VOTE_OPTIONS[eType] + if not opt then + return + end + self:ClearTeamVote(eType) + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + local info = self:GetMemberInfo(k) + local bAwait = info.bOnline + if k == X.GetClientPlayerID() then + if eType == 'raid_ready' then + bAwait = false + elseif eType == 'wage_agree' then + bAwait = not X.IsClientPlayerTeamDistributor() + end + end + if bAwait then + v:Lookup(opt.awaitPath):Show() + end + end + end + if opt.timeoutAlert then + X.DelayCall(opt.timeoutAlert, function() + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + if v:Lookup(opt.awaitPath):IsVisible() or v:Lookup(opt.rejectPath):IsVisible() then + X.Confirm(g_tStrings.STR_RAID_READY_CONFIRM_RESET .. '?', function() + self:ClearTeamVote(eType) + end) + break + end + end + end + end) + end + if opt.timeout then + X.DelayCall(opt.timeout, function() + self:ClearTeamVote(eType) + end) + end +end + +function CTM:ChangeTeamVoteState(eType, dwID, status) + local opt = VOTE_OPTIONS[eType] + if not opt then + return + end + local handle = CTM_CACHE[dwID] + if handle and handle:IsValid() then + handle:Lookup(opt.awaitPath):Hide() + if status == 'resolve' and opt.resolvePath then + local key = 'MY_CATACLYSM_READY_' .. eType .. '_' .. dwID + local hResolve = handle:Lookup(opt.resolvePath) + hResolve:Show() + hResolve:SetAlpha(240) + X.BreatheCall(key, function() + if not X.IsElement(handle) then + X.BreatheCall(key, false) + return + end + local hResolve = handle:Lookup(opt.resolvePath) + if not X.IsElement(hResolve) then + X.BreatheCall(key, false) + return + end + local nAlpha = math.max(hResolve:GetAlpha() - 15, 0) + hResolve:SetAlpha(nAlpha) + if nAlpha <= 0 then + X.BreatheCall(key, false) + end + end) + elseif status == 'reject' then + handle:Lookup(opt.rejectPath):Show() + end + end +end + +function CTM:ClearTeamVote(eType) + local opt = VOTE_OPTIONS[eType] + if not opt then + return + end + for k, v in pairs(CTM_CACHE) do + if v:IsValid() then + for _, k in ipairs({ 'resolvePath', 'rejectPath', 'awaitPath' }) do + if opt[k] and v:Lookup(opt[k]) then + v:Lookup(opt[k]):Hide() + end + end + end + end +end +end + +function CTM:CallEffect(dwTargetID, nDelay) + if CTM_CACHE[dwTargetID] and CTM_CACHE[dwTargetID]:IsValid() then + X.DelayCall('MY_Cataclysm_' .. dwTargetID, nDelay, function() + if CTM_CACHE[dwTargetID] and CTM_CACHE[dwTargetID]:IsValid() then + CTM_CACHE[dwTargetID]:Lookup('Image_Effect'):Hide() + end + end) + CTM_CACHE[dwTargetID]:Lookup('Image_Effect'):Show() + end +end + +local function GetMemberHandle(dwID) + local handle = CTM_CACHE[dwID] + if handle and handle:IsValid() then + return handle + end +end + +local ui = { + GetMemberHandle = GetMemberHandle, +} +MY_CataclysmParty = setmetatable(ui, { __index = CTM, __newindex = function() end, __metatable = true }) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Cataclysm/ui/MY_CataclysmMain.ini b/MY_Cataclysm/ui/MY_CataclysmMain.ini new file mode 100644 index 000000000..04e64412c --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmMain.ini @@ -0,0 +1,229 @@ +[MY_CataclysmMain] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=128 +Height=24 +DragAreaWidth=128 +DragAreaHeight=24 +IsCustomDragable=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Handle_Main] +._WndType=Handle +._Parent=MY_CataclysmMain +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=24 + +[Handle_BG] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=24 + +[Image_Title_BG] +._WndType=Image +._Parent=Handle_BG +Image=ui\Image\UICommon\RaidTotal.UItex +Frame=27 +Alpha=220 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=128 +Height=24 + +[Text_Caption] +._WndType=Text +._Parent=Handle_BG +Left=0 +Top=-24 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=128 +Height=24 +HAlign=0 +VAlign=2 +FontScheme=0 +FontColor= +OrgText=1 +$Text=123 + +[Handle_Prepare] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-19 +PosType=0 +Width=230 +Height=17 + +[Image_BgLeft] +._WndType=Image +._Parent=Handle_Prepare +Image=UI\Image\Common\ProgressBar.UITex +Frame=20 +Left=0 +Top=2 +PosType=0 +Alpha=255 + +[Image_BgCenter] +._WndType=Image +._Parent=Handle_Prepare +Image=UI\Image\Common\ProgressBar.UITex +Frame=19 +PosType=9 +Width=192 +Height=15 +Alpha=255 + +[Image_BgRight] +._WndType=Image +._Parent=Handle_Prepare +Image=UI\Image\Common\ProgressBar.UITex +Frame=18 +PosType=9 +Alpha=255 +Left=209 +Top=2 + +[Image_Prepare] +._WndType=Image +._Parent=Handle_Prepare +Image=UI\Image\Common\ProgressBar.UITex +Frame=26 +PosType=0 +Width=202 +Height=5 +Alpha=255 +ImageType=1 +Left=12 +Top=7 + +[Image_FlashS] +._WndType=Image +._Parent=Handle_Prepare +Image=ui\Image\Common\ProgressBar.UITex +Frame=25 +PosType=0 +Width=202 +Height=5 +Alpha=255 +ImageType=0 +Left=12 +Top=7 +LockShowAndHide=1 + +[Image_FlashF] +._WndType=Image +._Parent=Handle_Prepare +Image=ui\Image\Common\ProgressBar.UITex +Frame=21 +PosType=0 +Width=202 +Height=5 +Alpha=255 +ImageType=0 +Left=12 +Top=7 +LockShowAndHide=1 + +[Text_Prepare] +._WndType=Text +._Parent=Handle_Prepare +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=10 +Top=4 +PosType=0 +FontScheme=15 +HAlign=1 +VAlign=1 +Width=204 +Height=10 + +[Handle_ListW] +._WndType=Handle +._Parent=Handle_Main +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=128 +Height=1 + +[WndContainer_Wrapper] +._WndType=WndContainer +._Parent=MY_CataclysmMain +Left=26 +Top=2 +Width=128 +Height=22 +DrawStyle=1 +ContainerType=0 + +[WndContainer_Main] +._WndType=WndContainer +._Parent=WndContainer_Wrapper +Left=0 +Top=0 +Width=128 +Height=22 +DrawStyle=1 + +[Btn_Option] +._WndType=WndButton +._Parent=MY_CataclysmMain +Left=1 +Top=1 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=STR_TITLE_UISET +OrgTip=0 +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + diff --git a/MY_Cataclysm/ui/MY_CataclysmMain_Button.ini b/MY_Cataclysm/ui/MY_CataclysmMain_Button.ini new file mode 100644 index 000000000..34d57365d --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmMain_Button.ini @@ -0,0 +1,752 @@ +[MY_CataclysmMain_Button] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=50 +Width=210 +Height=21 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[WndContainer_Total] +._WndType=WndContainer +._Parent=MY_CataclysmMain_Button +Left=0 +Top=0 +Width=210 +Height=21 +ContainerType=1 + +[Wnd_TeamTools] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Alpha=220 +Width=22 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_TeamTools] +._WndType=Handle +._Parent=Wnd_TeamTools +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Box_TeamTools] +._WndType=Box +._Parent=Handle_TeamTools +PosType=0 +IconID=5962 +Width=22 +Height=22 +Left=0 +Top=-1 + +[Wnd_TeamNotice] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Alpha=220 +Width=22 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_TeamNotice] +._WndType=Handle +._Parent=Wnd_TeamNotice +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_TeamNotice] +._WndType=Image +._Parent=Handle_TeamNotice +Left=0 +Top=0 +PosType=0 +Image=UI/Image/UICommon/ActivePopularize2.UITex +Alpha=255 +Frame=20 +Width=21 +Height=20 + +[WndButton_LootMode] +._WndType=WndButton +._Parent=WndContainer_Total +PosType=0 +Width=21 +Height=21 +Top=0 +Left=0 +Alpha=220 +OrgTip=0 +$Tip=STR_GOLDTEAM_CHOOSE +Frame=-1 +NormalGroup=0 +MouseOverGroup=0 +MouseDownGroup=0 +DisableGroup=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image= +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 + +[Handle_LootMode] +._WndType=Handle +._Parent=WndButton_LootMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=21 +Height=21 + +[Image_LootMode] +._WndType=Image +._Parent=Handle_LootMode +Image=ui\Image\TargetPanel\Target.UITex +Frame=60 +Alpha=220 +Left=0 +Top=0 +PosType=0 +Width=21 +Height=21 + +[WndButton_LootQuality] +._WndType=WndButton +._Parent=WndContainer_Total +PosType=0 +Width=21 +Height=21 +Top=0 +Left=0 +Alpha=220 +Frame=-1 +NormalGroup=0 +MouseOverGroup=0 +MouseDownGroup=0 +DisableGroup=0 +DummyWnd=1 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +Trans=0 +Image= +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 + +[Handle_LootQuality] +._WndType=Handle +._Parent=WndButton_LootQuality +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=21 +Height=21 +OrgTip=0 +$Tip= +EventID=789 + +[Image_LootQuality] +._WndType=Image +._Parent=Handle_LootQuality +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=92 +Alpha=220 +Left=0 +Top=0 +PosType=0 +Width=21 +Height=21 + +[WndButton_GKP] +._WndType=WndButton +._Parent=WndContainer_Total +PosType=0 +Width=20 +Height=15 +Top=0 +Left=0 +Alpha=220 +Frame=-1 +NormalGroup=0 +MouseOverGroup=0 +MouseDownGroup=0 +DisableGroup=0 +DummyWnd=1 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +Trans=0 +Image= +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 + +[Handle_GKP] +._WndType=Handle +._Parent=WndButton_GKP +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=20 +Height=21 +EventID=789 +$Tip=GKP +OrgTip=1 +TipRichText=0 + +[Image_GKP] +._WndType=Image +._Parent=Handle_GKP +Image=UI/Image/Button/ShopButton.uitex +Frame=61 +Alpha=220 +Left=0 +Top=3 +PosType=0 +Width=20 +Height=15 + +[WndButton_WorldMark] +._WndType=WndButton +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=20 +Height=20 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=17 +MouseOverGroup=18 +MouseDownGroup=19 +DisableGroup=17 +$Tip=STR_RAID_WORLDMARK +TipRichText=1 +ShowTipType=0 + +[Wnd_Speaker] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=25 +Height=23 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_Speaker] +._WndType=WndButton +._Parent=Wnd_Speaker +Left=0 +Top=0 +Width=14 +Height=18 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Trans=0 +Image=ui\Image\UITga\Voice.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=13 +MouseOverGroup=14 +MouseDownGroup=15 +DisableGroup=15 +ButtonDisable=0 +ShowTipType=0 + +[Handle_Speaker] +._WndType=Handle +._Parent=WndButton_Speaker +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=25 +Height=21 +EventID=789 + +[Image_Normal] +._WndType=Image +._Parent=Handle_Speaker +Left=13 +Top=1 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=43 +Width=11 +Height=16 + +[Image_Close_Speaker] +._WndType=Image +._Parent=Handle_Speaker +Left=8 +Top=1 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=34 +Width=16 +Height=16 + +[Wnd_Microphone] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=48 +Height=23 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_Microphone] +._WndType=WndButton +._Parent=Wnd_Microphone +Left=0 +Top=0 +Width=16 +Height=19 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Trans=0 +Image=ui\Image\UITga\Voice.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=4 +MouseOverGroup=5 +MouseDownGroup=6 +DisableGroup=3 +ButtonDisable=0 +ShowTipType=0 + +[Handle_Microphone] +._WndType=Handle +._Parent=WndButton_Microphone +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=45 +Height=21 +EventID=789 +Hover=Handle_HotKey/Image_HotKey_Mic_Hover|Handle_Free_Mic/Image_Free_Mic_Hover +MBStatus=Handle_HotKey/Image_HotKey_Mic_Down|Handle_Free_Mic/Image_Free_Mic_Down + +[Image_UnInsert_Mic] +._WndType=Image +._Parent=Handle_Microphone +Left=8 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=31 + +[Image_Close_Mic] +._WndType=Image +._Parent=Handle_Microphone +Left=8 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=34 +LockShowAndHide=1 + +[Handle_HotKey] +._WndType=Handle +._Parent=Handle_Microphone +Left=16 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=20 + +[Image_HotKey_Mic] +._WndType=Image +._Parent=Handle_HotKey +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=46 +Width=20 +Height=21 +ImageType=12 + +[Image_HotKey_Mic_Hover] +._WndType=Image +._Parent=Handle_HotKey +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=47 +Width=20 +Height=21 +ImageType=12 +LockShowAndHide=1 + +[Image_HotKey_Mic_Down] +._WndType=Image +._Parent=Handle_HotKey +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=48 +Width=20 +Height=21 +ImageType=12 +LockShowAndHide=1 + +[Text_HotKey] +._WndType=Text +._Parent=Handle_HotKey +Left=3 +Top=1 +PosType=0 +FontSpacing=0 +Alpha=255 +$Text=STR_MICHOTKEY +FontScheme=212 +FontColor= +ShowAll=0 +MultiLine=0 +VAlign=0 +HAlign=0 +RowSpacing=0 +Width=18 +Height=17 + +[Handle_Free_Mic] +._WndType=Handle +._Parent=Handle_Microphone +Left=25 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=20 + +[Image_Free_Mic] +._WndType=Image +._Parent=Handle_Free_Mic +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=46 +ImageType=12 +Width=20 +Height=21 + +[Image_Free_Mic_Hover] +._WndType=Image +._Parent=Handle_Free_Mic +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=47 +Width=20 +Height=21 +ImageType=12 +LockShowAndHide=1 + +[Image_Free_Mic_Down] +._WndType=Image +._Parent=Handle_Free_Mic +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=48 +Width=20 +Height=21 +ImageType=12 +LockShowAndHide=1 + +[Text_Free] +._WndType=Text +._Parent=Handle_Free_Mic +Left=3 +Top=1 +PosType=0 +RowSpacing=-3 +FontSpacing=0 +Alpha=255 +FontScheme=212 +FontColor= +Width=18 +Height=17 +ShowAll=0 +MultiLine=1 +OrgText=0 +$Text=STR_MICFREE + +[Animate_Input_Mic] +._WndType=Animate +._Parent=Handle_Microphone +Left=-1 +Top=-2 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Group=0 +LoopCount=-1 +Width=27 +Height=23 + +[Wnd_Fold] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=21 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[CheckBox_Fold] +._WndType=WndCheckBox +._Parent=Wnd_Fold +Left=0 +Top=1 +Width=20 +Height=20 +Frame=0 +UnCheckAndEnable=47 +CheckAndEnable=51 +UnCheckAndDisable=50 +CheckAndDisable=46 +UnCheckedAndEnableWhenMouseOver=48 +CheckedAndEnableWhenMouseOver=52 +CheckedAndDisableWhenMouseOver=49 +UnCheckedAndDisableWhenMouseOver=48 +Checking=50 +UnChecking=46 +Image=ui\Image\UICommon\CommonPanel.UITex +OrgTip=0 +CheckedWhenCreate=0 + +[Wnd_TeamMon_Subscribe] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Alpha=220 +Width=22 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_TeamMon_Subscribe] +._WndType=Handle +._Parent=Wnd_TeamMon_Subscribe +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_TeamMon_Subscribe] +._WndType=Image +._Parent=Handle_TeamMon_Subscribe +Left=0 +Top=0 +PosType=0 +Image=UI/Image/UICommon/ActivePopularize2.UITex +Alpha=255 +Frame=17 +Width=21 +Height=20 + +[Wnd_EnvokeAllTeammates] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=21 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_EnvokeAllTeammates] +._WndType=WndButton +._Parent=Wnd_EnvokeAllTeammates +Left=0 +Top=0 +Width=21 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\GoldTeam.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=28 +MouseOverGroup=29 +MouseDownGroup=30 +DisableGroup=31 +ButtonDisable=0 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Wnd_TeamCountdown] +._WndType=WndWindow +._Parent=WndContainer_Total +Left=0 +Top=0 +Width=21 +Height=21 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_TeamCountdown] +._WndType=Handle +._Parent=Wnd_TeamCountdown +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Image_TeamCountdown] +._WndType=Image +._Parent=Handle_TeamCountdown +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=153 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=21 +Height=21 + diff --git a/MY_Cataclysm/ui/MY_CataclysmParty.CATACLYSM.ini b/MY_Cataclysm/ui/MY_CataclysmParty.CATACLYSM.ini new file mode 100644 index 000000000..1cdd60aaf --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmParty.CATACLYSM.ini @@ -0,0 +1,203 @@ +[MY_CataclysmParty] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=128 +Height=235 +IsCustomDragable=1 +MultiFrame=1 +DisableBreath=1 +ClassName=MY_CataclysmParty_Base +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_Main] +._WndType=Handle +._Parent=MY_CataclysmParty +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=235 + +[Handle_BG] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=235 + +[Shadow_BG] +._WndType=Shadow +._Parent=Handle_BG +ShadowColor=black +Alpha=255 +Left=4 +Top=4 +PosType=0 +Width=120 +Height=228 + +[Image_BG_TL] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=6 +Height=18 +Width=18 +Alpha=220 +Left=0 +Top=0 +PosType=0 +ImageType=0 + +[Image_BG_T] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=5 +Alpha=220 +Left=14 +Top=0 +PosType=0 +ImageType=0 + +[Image_BG_TR] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=7 +Height=18 +Width=18 +Alpha=220 +Left=112 +Top=0 +PosType=0 +ImageType=0 + +[Image_BG_L] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=3 +Alpha=220 +Left=0 +Top=15 +PosType=0 +ImageType=0 + +[Image_BG_R] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=4 +Alpha=220 +Left=112 +Top=15 +PosType=0 +ImageType=0 + +[Image_BG_BL] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=1 +Height=18 +Width=18 +Alpha=220 +Left=0 +Top=220 +PosType=0 +ImageType=0 + +[Image_BG_B] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=0 +Alpha=220 +Left=15 +Top=220 +PosType=0 +ImageType=0 + +[Image_BG_BR] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=2 +Height=18 +Width=18 +Alpha=220 +Left=113 +Top=220 +PosType=0 +ImageType=0 + +[Handle_Cols] +._WndType=Handle +._Parent=Handle_Main +Left=0 +Top=3 +PosType=0 +HandleType=3 +Width=128 +Height=235 +RowSpacing=0 +HAlign=1 + +[Handle_Roles] +._WndType=Handle +._Parent=Handle_Cols +HandleType=3 +PosType=8 +Width=122 +Height=210 +RowSpacing=0 + +[Handle_Title] +._WndType=Handle +._Parent=Handle_Cols +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=128 +Height=25 + +[Image_TitleBg] +._WndType=Image +._Parent=Handle_Title +Left=5 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=0 +Width=119 +Height=22 +Frame=28 + +[Text_Title] +._WndType=Text +._Parent=Handle_Title +Left=5 +Top=-2 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Width=119 +Height=22 +FontScheme=18 +HAlign=1 +VAlign=1 +OrgText=1 diff --git a/MY_Cataclysm/ui/MY_CataclysmParty.OFFICIAL.ini b/MY_Cataclysm/ui/MY_CataclysmParty.OFFICIAL.ini new file mode 100644 index 000000000..2fe94fa7d --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmParty.OFFICIAL.ini @@ -0,0 +1,212 @@ +[MY_CataclysmParty] +._WndType=WndFrame +._Parent=Normal +Left=50 +Top=50 +Width=128 +Height=235 +IsCustomDragable=1 +MultiFrame=1 +DisableBreath=1 +ClassName=MY_CataclysmParty_Base +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_Main] +._WndType=Handle +._Parent=MY_CataclysmParty +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=235 + +[Handle_BG] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=235 + +[Shadow_BG] +._WndType=Shadow +._Parent=Handle_BG +ShadowColor=black +Alpha=255 +Left=4 +Top=4 +PosType=0 +Width=120 +Height=228 +LockShowAndHide=1 + +[Image_BG_TL] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=6 +Height=18 +Width=18 +Alpha=220 +Left=0 +Top=0 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_T] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=5 +Alpha=220 +Left=14 +Top=0 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_TR] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=7 +Height=18 +Width=18 +Alpha=220 +Left=112 +Top=0 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_L] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=3 +Alpha=220 +Left=0 +Top=15 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_R] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=4 +Alpha=220 +Left=112 +Top=15 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_BL] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=1 +Height=18 +Width=18 +Alpha=220 +Left=0 +Top=220 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_B] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=0 +Alpha=220 +Left=15 +Top=220 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Image_BG_BR] +._WndType=Image +._Parent=Handle_BG +Image=interface\MY\MY_Cataclysm\images\Cataclysm.UITex +Frame=2 +Height=18 +Width=18 +Alpha=220 +Left=113 +Top=220 +PosType=0 +ImageType=0 +LockShowAndHide=1 + +[Handle_Cols] +._WndType=Handle +._Parent=Handle_Main +Left=0 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 +Width=128 +Height=210 +IgnoreInvisibleChild=1 + +[Handle_Title] +._WndType=Handle +._Parent=Handle_Cols +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=128 +Height=23 + +[Image_TitleBg] +._WndType=Image +._Parent=Handle_Title +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=200 +Width=128 +Height=23 +Frame=28 + +[Text_Title] +._WndType=Text +._Parent=Handle_Title +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Width=128 +Height=23 +FontScheme=18 +HAlign=1 +VAlign=1 +OrgText=1 + +[Handle_Roles] +._WndType=Handle +._Parent=Handle_Cols +HandleType=3 +PosType=8 +Width=128 +Height=233 +RowSpacing=0 diff --git a/MY_Cataclysm/ui/MY_CataclysmParty_Item.CATACLYSM.ini b/MY_Cataclysm/ui/MY_CataclysmParty_Item.CATACLYSM.ini new file mode 100644 index 000000000..3f9046ab7 --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmParty_Item.CATACLYSM.ini @@ -0,0 +1,1120 @@ +[MY_CataclysmParty_Item] +._WndType=WndFrame +._Parent=Normal +Left=120 +Top=220 +Width=210 +Height=21 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_Total] +._WndType=Handle +._Parent=MY_CataclysmParty_Item +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Handle_Dummy] +._WndType=Handle +._Parent=Handle_Total +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=122 +Height=42 + +[Handle_RoleDummy] +._WndType=Handle +._Parent=Handle_Dummy +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=524597 +Width=122 +Height=56 + +[Handle_Life] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=2 +Top=2 +PosType=0 +PixelScroll=1 +Width=118 +Height=40 + +[Shadow_Life_Fade] +._WndType=Shadow +._Parent=Handle_Life +ShadowColor=red2 +Alpha=0 +PosType=0 +Left=0 +Top=0 +Width=118 +Height=42 +LockShowAndHide=1 + +[Shadow_Life] +._WndType=Shadow +._Parent=Handle_Life +ShadowColor=green2 +Alpha=210 +Left=0 +Top=-46 +Width=118 +Height=88 +PosType=0 +LockShowAndHide=1 + +[Image_Life] +._WndType=Image +._Parent=Handle_Life +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=59 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=118 +Height=42 +ImageType=1 +LockShowAndHide=1 + +[Image_LifeLine] +._WndType=Image +._Parent=Handle_Life +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=78 +Alpha=200 +Left=96 +Top=1 +PosType=0 +ImageType=0 +Width=20 +Height=40 +LockShowAndHide=1 + +[Handle_Mana] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=42 +PosType=0 +PixelScroll=1 +Width=113 +Height=10 + +[Shadow_Mana] +._WndType=Shadow +._Parent=Handle_Mana +ShadowColor=blue2 +Alpha=240 +Left=0 +Top=-5 +Width=113 +Height=20 +PosType=0 +LockShowAndHide=1 + +[Image_Mana] +._WndType=Image +._Parent=Handle_Mana +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=52 +Alpha=255 +Left=0 +Top=1 +PosType=0 +Width=113 +Height=10 +ImageType=1 +EventID=256 +LockShowAndHide=1 + +[Image_MemberBg] +._WndType=Image +._Parent=Handle_RoleDummy +Image=interface/MY/MY_Cataclysm/images/ForceColorBox.UITex +Frame=3 +Alpha=255 +Left=2 +Top=0 +PosType=0 +Width=119 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_PlayerBg] +._WndType=Image +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=0 +Frame=7 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Text_Mana] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=250 +Left=0 +Top=44 +PosType=0 +HAlign=1 +VAlign=1 +Width=122 +Height=10 +FontScheme=190 +OrgText=0 + +[Image_Selected] +._WndType=Image +._Parent=Handle_RoleDummy +Image=interface/MY/MY_Cataclysm/images/border.UITex +Frame=1 +Alpha=192 +Left=2 +Top=0 +PosType=0 +Width=118 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_Effect] +._WndType=Image +._Parent=Handle_RoleDummy +Image=interface/MY/MY_Cataclysm/images/border.UITex +Frame=4 +Alpha=180 +Left=2 +Top=0 +PosType=0 +Width=118 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_Threat] +._WndType=Image +._Parent=Handle_RoleDummy +Left=2 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=255 +._Comment=最高仇恨 +Width=118 +Height=56 +Frame=2 +LockShowAndHide=1 + +[Handle_TargetTarget] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=122 +Height=56 +LockShowAndHide=1 + +[Handle_TargetTarget_Fixed] +._WndType=Handle +._Parent=Handle_TargetTarget +Left=12 +Top=-23 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=100 +DisableScale=1 + +[Handle_TargetTarget_Scale] +._WndType=Handle +._Parent=Handle_TargetTarget +Left=12 +Top=-23 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=100 + +[SFX_TargetTarget] +._WndType=SFX +._Parent=Handle_TargetTarget +Left=62 +Top=27 +PosType=0 +SFXFile=data/source/other/新特效/其他/Pss/UI_戒指02.pss +Width=0 +Height=0 +Alpha=0.000000 + +[Animate_TargetTarget] +._WndType=Animate +._Parent=Handle_TargetTarget +Image=ui\Image\Common\Box.UITex +Group=17 +LoopCount=-1 +Alpha=220 +Left=2 +Top=0 +PosType=0 +Width=118 +Height=56 + +[Shadow_Attention] +._WndType=Shadow +._Parent=Handle_RoleDummy +ShadowColor=red2 +Alpha=90 +PosType=0 +Left=0 +Top=0 +Width=122 +Height=56 +LockShowAndHide=1 + +[Image_LifeLow] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=36 +Alpha=255 +Left=2 +Top=0 +PosType=0 +Width=118 +Height=42 +ImageType=10 +._Comment=血量少于30%,闪烁 +LockShowAndHide=1 + +[Image_SlotBg] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\Common\CommonPanel.UITex +Frame=74 +Alpha=180 +Left=0 +Top=0 +PosType=0 +Width=130 +Height=60 +ImageType=10 +LockShowAndHide=1 + +[Image_Slot] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=47 +Alpha=178 +Left=-2 +Top=-2 +PosType=0 +ImageType=10 +Width=132 +Height=60 +LockShowAndHide=1 + +[Image_ReadyCover] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=54 +Alpha=200 +Left=-3 +Top=0 +PosType=0 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Handle_TeamVoteWait] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=-3 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_TeamVoteWait] +._WndType=Shadow +._Parent=Handle_TeamVoteWait +Left=0 +Top=0 +PosType=0 +ShadowColor=orange1 +Alpha=150 +Width=128 +Height=56 + +[Handle_TeamVoteReject] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=-3 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_TeamVoteReject] +._WndType=Shadow +._Parent=Handle_TeamVoteReject +Left=0 +Top=0 +PosType=0 +ShadowColor=red2 +Alpha=150 +Width=128 +Height=56 + +[Image_Icon] +._WndType=Image +._Parent=Handle_RoleDummy +Alpha=255 +Left=-2 +Top=-4 +PosType=0 +Width=25 +Height=25 +Image=ui\Image\TargetPanel\Target.UITex +Frame=49 +LockShowAndHide=1 + +[Text_School_Name] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=3 +Top=4 +PosType=0 +HAlign=0 +VAlign=1 +AutoEtc=0 +ShowAll=1 +FontScheme=40 +MlAutoAdj=0 +OrgText=0 +Width=15 +Height=18 + +[Text_Name] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=26 +Top=0 +PosType=0 +Width=101 +Height=45 +VAlign=0 +FontScheme=234 +AutoEtc=1 +HAlign=0 +OrgText=0 +ShowAll=0 + +[Text_Life] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=250 +Left=4 +Top=0 +PosType=0 +HAlign=2 +VAlign=2 +Width=114 +Height=45 +FontScheme=212 +OrgText=0 + +[Text_Death] +._WndType=Text +._Parent=Handle_RoleDummy +Left=4 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_DEAD +Width=114 +Height=45 +HAlign=2 +VAlign=1 +FontScheme=17 +OrgText=0 +LockShowAndHide=1 + +[Text_OffLine] +._WndType=Text +._Parent=Handle_RoleDummy +Left=4 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_RAID_OFFLINE +Width=114 +Height=45 +HAlign=2 +VAlign=1 +FontScheme=169 +OrgText=0 +LockShowAndHide=1 + +[Handle_Caution] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=122 +Height=56 +LockShowAndHide=1 + +[Handle_Caution_Fixed] +._WndType=Handle +._Parent=Handle_Caution +Left=14 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=105 +Height=48 +DisableScale=1 + +[Handle_Caution_Scale] +._WndType=Handle +._Parent=Handle_Caution +Left=14 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=105 +Height=48 + +[SFX_Caution] +._WndType=SFX +._Parent=Handle_Caution +Left=58 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\D_点名特效_长.pss +Loop=1 +Width=0 +Height=0 +DisableScale=1 + +[Handle_Buff_Boxes] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +Left=3 +Top=0 +PosType=0 +Width=118 +Height=54 +VAlign=2 +HAlign=0 +FirstItemPosType=10 +PixelScroll=1 + +[Image_NotReady] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=119 +Alpha=255 +Left=3 +Top=24 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Handle_SkillCD] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=100 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=20 +LockShowAndHide=1 + +[Box_SkillCD] +._WndType=Box +._Parent=Handle_SkillCD +Left=0 +Top=0 +PosType=0 +IconID=666 +Width=20 +Height=20 + +[Text_SkillCD] +._WndType=Text +._Parent=Handle_SkillCD +Left=-4 +Top=-2 +PosType=0 +RowSpacing=0 +FontSpacing=0 +FontScheme=357 +Alpha=255 +OrgText=1 +$Text=59" +HAlign=2 +Width=20 +Height=20 + +[Handle_Icons] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Image_Marker] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=95 +Alpha=255 +Left=113 +Top=0 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Leader] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=94 +Alpha=255 +Left=113 +Top=13 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Looter] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=92 +Alpha=255 +Left=113 +Top=22 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Matrix] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=93 +Alpha=255 +Left=113 +Top=37 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Handle_Platform] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=102 +Top=-6 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=23 +LockShowAndHide=1 +EventID=768 + +[Image_Mobile] +._WndType=Image +._Parent=Handle_Platform +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=170 +Alpha=255 +Left=0 +Top=5 +PosType=0 +Width=12 +Height=13 + +[Text_Distance] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=250 +Left=68 +Top=3 +PosType=0 +HAlign=2 +VAlign=1 +Width=60 +Height=10 +FontScheme=162 +OrgText=0 + +[Handle_Sputtering] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_Sputtering] +._WndType=Shadow +._Parent=Handle_Sputtering +Left=107 +Top=0 +PosType=0 +ShadowColor=green7 +Alpha=255 +Width=18 +Height=18 + +[Text_Sputtering] +._WndType=Text +._Parent=Handle_Sputtering +Left=107 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +FontScheme=192 +HAlign=1 +VAlign=1 +Width=18 +Height=18 + +[Handle_Speaker] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=89 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=30 +Height=21 +LockShowAndHide=1 + +[Shadow_SpeakerBg] +._WndType=Shadow +._Parent=Handle_Speaker +Left=0 +Top=4 +PosType=0 +ShadowColor=black +Alpha=180 +Width=30 +Height=22 + +[Animate_SpeakerEffect] +._WndType=Animate +._Parent=Handle_Speaker +Left=0 +Top=3 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Group=1 +LoopCount=-1 +Width=32 +Height=24 + +[Handle_ForbidSpeaker] +._WndType=Handle +._Parent=Handle_Speaker +Left=0 +Top=2 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=18 +Height=18 + +[Image_Speaker] +._WndType=Image +._Parent=Handle_ForbidSpeaker +Left=2 +Top=5 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=37 +Width=11 +Height=16 + +[Image_ForbidSpeaker] +._WndType=Image +._Parent=Handle_ForbidSpeaker +Left=12 +Top=5 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=34 +Width=16 +Height=16 + +[Image_MarkImage] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=67 +Alpha=220 +Left=66 +Top=-5 +PosType=0 +Width=24 +Height=24 +LockShowAndHide=1 + +[Animate_Ready] +._WndType=Animate +._Parent=Handle_RoleDummy +Image=ui\Image\Common\Animate.UITex +Group=5 +LoopCount=1 +Left=-22 +Top=-46 +PosType=0 +Width=200 +Height=150 +LockShowAndHide=1 + +[Image_CoverFangshi] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=51 +Alpha=255 +Left=4 +Top=4 +PosType=0 +Width=95 +Height=43 +ImageType=10 +LockShowAndHide=1 + +[Image_Cover] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=38 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=122 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_Fangshi] +._WndType=Image +._Parent=Handle_RoleDummy +Left=75 +Top=22 +PosType=0 +Image=ui\Image\UICommon\JiangHu2.UITex +Alpha=255 +Frame=18 +LockShowAndHide=1 + +[Image_Newbie] +._WndType=Image +._Parent=Handle_RoleDummy +Left=73 +Top=20 +PosType=0 +Image=ui\Image\UICommon\AssistNewbie.UITex +Alpha=255 +Frame=4 +Width=24 +Height=23 +TipTableType=1 +$Tip=STR_NEWBIE2 +EventID=768 +TipRichText=0 +ShowTipType=0 +LockShowAndHide=1 + +[Image_Helper] +._WndType=Image +._Parent=Handle_RoleDummy +Left=73 +Top=21 +PosType=0 +Image=ui\Image\UICommon\AssistNewbie.UITex +Alpha=255 +Frame=22 +Width=24 +Height=23 +TipTableType=1 +$Tip=STR_NEWBIE +EventID=768 +TipRichText=0 +ShowTipType=0 +LockShowAndHide=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Handle_Buff] +._WndType=Handle +._Parent=Handle_Dummy +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=32 +Height=32 +EventID=525077 + +[Shadow_BG] +._WndType=Shadow +._Parent=Handle_Buff +ShadowColor=black +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=32 +Height=32 + +[Box] +._WndType=Box +._Parent=Handle_Buff +Left=1 +Top=1 +PosType=0 +Width=30 +Height=30 +Alpha=225 +IconID=407 + +[Handle_RbgBorders] +._WndType=Handle +._Parent=Handle_Buff +Left=1 +Top=1 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_T] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=3 +Top=0 +PosType=0 +Width=27 +Height=3 + +[Shadow_R] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=27 +Top=3 +PosType=0 +Width=3 +Height=27 + +[Shadow_B] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=0 +Top=27 +PosType=0 +Width=27 +Height=3 + +[Shadow_L] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=0 +Top=0 +PosType=0 +Width=3 +Height=27 + +[Handle_InnerBorders] +._WndType=Handle +._Parent=Handle_Buff +Left=4 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_T_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=1 +Top=0 +PosType=0 +Width=23 +Height=1 + +[Shadow_R_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=23 +Top=1 +PosType=0 +Width=1 +Height=23 + +[Shadow_B_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=0 +Top=23 +PosType=0 +Width=23 +Height=1 + +[Shadow_L_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=0 +Top=0 +PosType=0 +Width=1 +Height=23 + +[Text_Reminder] +._WndType=Text +._Parent=Handle_Buff +Left=0 +Top=20 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +HAlign=0 +FontScheme=17 +FontColor= +VAlign=2 +Width=32 +Height=14 +AutoEtc=0 +ShowAll=0 + +[Text_StackNum] +._WndType=Text +._Parent=Handle_Buff +Left=0 +Top=20 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +HAlign=2 +FontScheme=17 +FontColor= +VAlign=2 +Width=31 +Height=14 + +[Text_Time] +._WndType=Text +._Parent=Handle_Buff +Left=1 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +FontScheme=17 +FontColor= +HAlign=0 +VAlign=2 +Width=30 +Height=14 + diff --git a/MY_Cataclysm/ui/MY_CataclysmParty_Item.OFFICIAL.ini b/MY_Cataclysm/ui/MY_CataclysmParty_Item.OFFICIAL.ini new file mode 100644 index 000000000..cb3a4fa01 --- /dev/null +++ b/MY_Cataclysm/ui/MY_CataclysmParty_Item.OFFICIAL.ini @@ -0,0 +1,1113 @@ +[MY_CataclysmParty_Item] +._WndType=WndFrame +._Parent=Normal +Left=10 +Top=50 +Width=210 +Height=21 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_Main] +._WndType=Handle +._Parent=MY_CataclysmParty_Item +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Handle_Dummy] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=121 +Height=42 + +[Handle_RoleDummy] +._WndType=Handle +._Parent=Handle_Dummy +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=524597 +Width=128 +Height=56 + +[Image_MemberBg] +._WndType=Image +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=180 +Frame=7 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_PlayerBg] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=49 +Alpha=255 +Left=3 +Top=4 +PosType=0 +ImageType=10 +Width=122 +Height=50 +LockShowAndHide=1 + +[Handle_Life] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=6 +PosType=0 +PixelScroll=1 +Width=118 +Height=38 + +[Shadow_Life_Fade] +._WndType=Shadow +._Parent=Handle_Life +ShadowColor=red2 +Alpha=0 +PosType=0 +Left=0 +Top=0 +Width=118 +Height=38 +LockShowAndHide=1 + +[Shadow_Life] +._WndType=Shadow +._Parent=Handle_Life +ShadowColor=green2 +Alpha=210 +Left=0 +Top=-30 +Width=118 +Height=68 +PosType=0 +LockShowAndHide=1 + +[Image_Life] +._WndType=Image +._Parent=Handle_Life +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=59 +Alpha=255 +Left=0 +Top=1 +PosType=0 +Width=118 +Height=37 +ImageType=1 +LockShowAndHide=1 + +[Image_LifeLine] +._WndType=Image +._Parent=Handle_Life +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=78 +Alpha=200 +Left=96 +Top=1 +PosType=0 +ImageType=0 +Width=20 +Height=37 +LockShowAndHide=1 + +[Handle_Mana] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=45 +PosType=0 +PixelScroll=1 +Width=118 +Height=7 + +[Shadow_Mana] +._WndType=Shadow +._Parent=Handle_Mana +ShadowColor=blue2 +Alpha=240 +Left=0 +Top=-5 +Width=118 +Height=17 +PosType=0 +LockShowAndHide=1 + +[Image_Mana] +._WndType=Image +._Parent=Handle_Mana +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=52 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=118 +Height=7 +ImageType=1 +EventID=256 +LockShowAndHide=1 + +[Text_Mana] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=250 +Left=0 +Top=43 +PosType=0 +HAlign=1 +VAlign=1 +Width=128 +Height=10 +FontScheme=190 +OrgText=0 + +[Image_Selected] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=3 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=0 +._Comment=当前目标 +Width=128 +Height=56 +LockShowAndHide=1 + +[Image_Effect] +._WndType=Image +._Parent=Handle_RoleDummy +Image=interface/MY/MY_Cataclysm/images/border.UITex +Frame=4 +Alpha=180 +Left=2 +Top=3 +PosType=0 +Width=124 +Height=51 +ImageType=10 +LockShowAndHide=1 + +[Image_Threat] +._WndType=Image +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=255 +._Comment=最高仇恨 +Width=129 +Height=56 +Frame=2 +LockShowAndHide=1 + +[Shadow_Attention] +._WndType=Shadow +._Parent=Handle_RoleDummy +ShadowColor=red2 +Alpha=100 +PosType=0 +Left=0 +Top=0 +Width=128 +Height=56 +LockShowAndHide=1 + +[Image_LifeLow] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=36 +Alpha=255 +Left=2 +Top=0 +PosType=0 +Width=119 +Height=42 +ImageType=10 +._Comment=血量少于30%,闪烁 +LockShowAndHide=1 + +[Handle_TargetTarget] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=122 +Height=56 +LockShowAndHide=1 + +[Handle_TargetTarget_Fixed] +._WndType=Handle +._Parent=Handle_TargetTarget +Left=14 +Top=-21 +PosType=0 +HandleType=0 +FirstItemPosType=0 +DisableScale=1 +Width=100 +Height=100 + +[Handle_TargetTarget_Scale] +._WndType=Handle +._Parent=Handle_TargetTarget +Left=14 +Top=-21 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=100 + +[SFX_TargetTarget] +._WndType=SFX +._Parent=Handle_TargetTarget +Left=64 +Top=29 +PosType=0 +SFXFile=data/source/other/新特效/其他/Pss/UI_戒指02.pss +Width=0 +Height=0 + +[Animate_TargetTarget] +._WndType=Animate +._Parent=Handle_TargetTarget +Image=ui\Image\Common\Box.UITex +Group=17 +LoopCount=-1 +Alpha=220 +Left=2 +Top=0 +PosType=0 +Width=118 +Height=56 +LockShowAndHide=1 + +[Image_SlotBg] +._WndType=Image +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=180 +Frame=7 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_Slot] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=47 +Alpha=178 +Left=-2 +Top=-2 +PosType=0 +ImageType=10 +Width=132 +Height=60 +LockShowAndHide=1 + +[Image_ReadyCover] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=54 +Alpha=200 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Handle_TeamVoteWait] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_TeamVoteWait] +._WndType=Shadow +._Parent=Handle_TeamVoteWait +Left=0 +Top=0 +PosType=0 +ShadowColor=orange1 +Alpha=150 +Width=128 +Height=56 + +[Handle_TeamVoteReject] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_TeamVoteReject] +._WndType=Shadow +._Parent=Handle_TeamVoteReject +Left=0 +Top=0 +PosType=0 +ShadowColor=red2 +Alpha=150 +Width=128 +Height=56 + +[Image_Icon] +._WndType=Image +._Parent=Handle_RoleDummy +Alpha=255 +Left=-2 +Top=-2 +PosType=0 +Width=25 +Height=25 +Image=ui\Image\TargetPanel\Target.UITex +Frame=49 +LockShowAndHide=1 + +[Text_School_Name] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=4 +Top=4 +PosType=0 +HAlign=0 +VAlign=1 +AutoEtc=0 +ShowAll=1 +FontScheme=40 +MlAutoAdj=0 +OrgText=0 +Width=15 +Height=18 + +[Handle_SkillCD] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=108 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=20 +LockShowAndHide=1 + +[Box_SkillCD] +._WndType=Box +._Parent=Handle_SkillCD +Left=0 +Top=0 +PosType=0 +IconID=666 +Width=20 +Height=20 + +[Text_SkillCD] +._WndType=Text +._Parent=Handle_SkillCD +Left=-4 +Top=-2 +PosType=0 +RowSpacing=0 +FontSpacing=0 +FontScheme=357 +Alpha=255 +OrgText=1 +$Text=59" +HAlign=2 +Width=20 +Height=20 + +[Handle_Icons] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Image_Leader] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=94 +Alpha=255 +Left=26 +Top=0 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Looter] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=92 +Alpha=255 +Left=40 +Top=0 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Matrix] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=93 +Alpha=255 +Left=54 +Top=0 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Image_Marker] +._WndType=Image +._Parent=Handle_Icons +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=95 +Alpha=255 +Left=78 +Top=0 +PosType=0 +Width=14 +Height=14 +LockShowAndHide=1 + +[Handle_Platform] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=112 +Top=-5 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=20 +Height=23 +LockShowAndHide=1 +EventID=768 + +[Image_Mobile] +._WndType=Image +._Parent=Handle_Platform +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=170 +Alpha=255 +Left=0 +Top=4 +PosType=0 +Width=13 +Height=15 + +[Text_Name] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=10 +Top=7 +PosType=0 +Width=109 +Height=40 +VAlign=0 +FontScheme=234 +AutoEtc=1 +HAlign=1 +OrgText=0 +ShowAll=0 + +[Text_Life] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=10 +Top=9 +PosType=0 +HAlign=1 +VAlign=2 +Width=118 +Height=38 +FontScheme=212 +OrgText=0 + +[Text_Death] +._WndType=Text +._Parent=Handle_RoleDummy +Left=10 +Top=9 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_DEAD +Width=118 +Height=40 +HAlign=1 +VAlign=1 +FontScheme=17 +OrgText=0 +LockShowAndHide=1 + +[Text_OffLine] +._WndType=Text +._Parent=Handle_RoleDummy +Left=10 +Top=7 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_RAID_OFFLINE +Width=118 +Height=42 +HAlign=1 +VAlign=1 +FontScheme=169 +OrgText=0 +LockShowAndHide=1 + +[Handle_Caution] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=128 +Height=56 +LockShowAndHide=1 + +[Handle_Caution_Fixed] +._WndType=Handle +._Parent=Handle_Caution +Left=14 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=104 +Height=46 +DisableScale=1 + +[Handle_Caution_Scale] +._WndType=Handle +._Parent=Handle_Caution +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=104 +Height=46 + +[SFX_Caution] +._WndType=SFX +._Parent=Handle_Caution +Left=61 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\D_点名特效_长.pss +Loop=1 +Width=0 +Height=0 +DisableScale=1 + +[Handle_Buff_Boxes] +._WndType=Handle +._Parent=Handle_RoleDummy +HandleType=0 +Left=3 +Top=0 +PosType=0 +Width=121 +Height=55 +FirstItemPosType=1 +PixelScroll=1 + +[Text_Distance] +._WndType=Text +._Parent=Handle_RoleDummy +RowSpacing=0 +FontSpacing=0 +Alpha=250 +Left=68 +Top=3 +PosType=0 +HAlign=2 +VAlign=1 +Width=60 +Height=10 +FontScheme=162 + +[Handle_Sputtering] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Shadow_Sputtering] +._WndType=Shadow +._Parent=Handle_Sputtering +Left=109 +Top=0 +PosType=0 +ShadowColor=green7 +Alpha=255 +Width=18 +Height=18 + +[Text_Sputtering] +._WndType=Text +._Parent=Handle_Sputtering +Left=109 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=18 +Height=18 +FontScheme=192 +HAlign=1 +VAlign=1 + +[Handle_Speaker] +._WndType=Handle +._Parent=Handle_RoleDummy +Left=89 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=30 +Height=21 +LockShowAndHide=1 + +[Shadow_SpeakerBg] +._WndType=Shadow +._Parent=Handle_Speaker +Left=0 +Top=2 +PosType=0 +ShadowColor=black +Alpha=0 +Width=30 +Height=22 + +[Animate_SpeakerEffect] +._WndType=Animate +._Parent=Handle_Speaker +Left=0 +Top=3 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Group=1 +LoopCount=-1 +Width=32 +Height=24 + +[Handle_ForbidSpeaker] +._WndType=Handle +._Parent=Handle_Speaker +Left=0 +Top=2 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=18 +Height=18 + +[Image_Speaker] +._WndType=Image +._Parent=Handle_ForbidSpeaker +Left=2 +Top=5 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=37 +Width=11 +Height=16 + +[Image_ForbidSpeaker] +._WndType=Image +._Parent=Handle_ForbidSpeaker +Left=12 +Top=5 +PosType=0 +Image=ui\Image\UITga\Voice.UITex +Alpha=255 +Frame=34 +Width=16 +Height=16 + +[Image_MarkImage] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=67 +Alpha=220 +Left=66 +Top=-6 +PosType=0 +Width=24 +Height=24 +LockShowAndHide=1 + +[Image_NotReady] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=119 +Alpha=255 +Left=28 +Top=24 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Animate_Ready] +._WndType=Animate +._Parent=Handle_RoleDummy +Image=ui\Image\Common\Animate.UITex +Group=5 +LoopCount=1 +Left=-23 +Top=-47 +PosType=0 +Width=200 +Height=150 +LockShowAndHide=1 + +[Image_CoverFangshi] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=51 +Alpha=255 +Left=4 +Top=4 +PosType=0 +Width=95 +Height=43 +ImageType=10 +LockShowAndHide=1 + +[Image_Cover] +._WndType=Image +._Parent=Handle_RoleDummy +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=38 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=128 +Height=56 +ImageType=10 +LockShowAndHide=1 + +[Image_Fangshi] +._WndType=Image +._Parent=Handle_RoleDummy +Left=75 +Top=22 +PosType=0 +Image=ui\Image\UICommon\JiangHu2.UITex +Alpha=255 +Frame=18 +LockShowAndHide=1 + +[Image_Newbie] +._WndType=Image +._Parent=Handle_RoleDummy +Left=73 +Top=20 +PosType=0 +Image=ui\Image\UICommon\AssistNewbie.UITex +Alpha=255 +Frame=4 +Width=24 +Height=23 +TipTableType=1 +$Tip=STR_NEWBIE2 +EventID=768 +TipRichText=0 +ShowTipType=0 +LockShowAndHide=1 + +[Image_Helper] +._WndType=Image +._Parent=Handle_RoleDummy +Left=73 +Top=21 +PosType=0 +Image=ui\Image\UICommon\AssistNewbie.UITex +Alpha=255 +Frame=22 +Width=24 +Height=23 +TipTableType=1 +$Tip=STR_NEWBIE +EventID=768 +TipRichText=0 +ShowTipType=0 +LockShowAndHide=1 + +[Handle_Buff] +._WndType=Handle +._Parent=Handle_Dummy +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=28 +Height=28 +EventID=525077 + +[Shadow_BG] +._WndType=Shadow +._Parent=Handle_Buff +ShadowColor=black +Alpha=192 +Left=0 +Top=0 +PosType=0 +Width=28 +Height=28 + +[Box] +._WndType=Box +._Parent=Handle_Buff +Left=1 +Top=1 +PosType=0 +Width=26 +Height=26 +Alpha=225 +IconID=414 + +[Handle_RbgBorders] +._WndType=Handle +._Parent=Handle_Buff +Left=1 +Top=1 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_T] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=3 +Top=0 +PosType=0 +Width=23 +Height=3 + +[Shadow_R] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=23 +Top=3 +PosType=0 +Width=3 +Height=23 + +[Shadow_B] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=0 +Top=23 +PosType=0 +Width=23 +Height=3 + +[Shadow_L] +._WndType=Shadow +._Parent=Handle_RbgBorders +ShadowColor=red2 +Alpha=192 +Left=0 +Top=0 +PosType=0 +Width=3 +Height=23 + +[Handle_InnerBorders] +._WndType=Handle +._Parent=Handle_Buff +Left=4 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_T_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=1 +Top=0 +PosType=0 +Width=19 +Height=1 + +[Shadow_R_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=19 +Top=1 +PosType=0 +Width=1 +Height=19 + +[Shadow_B_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=0 +Top=19 +PosType=0 +Width=19 +Height=1 + +[Shadow_L_0] +._WndType=Shadow +._Parent=Handle_InnerBorders +ShadowColor=black +Alpha=192 +Left=0 +Top=0 +PosType=0 +Width=1 +Height=19 + +[Text_Reminder] +._WndType=Text +._Parent=Handle_Buff +Left=-1 +Top=16 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +Width=26 +Height=13 +HAlign=0 +FontScheme=17 +FontColor= +VAlign=2 +ShowAll=0 +AutoEtc=0 + +[Text_Time] +._WndType=Text +._Parent=Handle_Buff +Left=1 +Top=-2 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +FontScheme=17 +FontColor= +Width=26 +Height=15 +VAlign=2 + +[Text_StackNum] +._WndType=Text +._Parent=Handle_Buff +Left=0 +Top=18 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=0 +Width=27 +Height=13 +HAlign=2 +FontScheme=17 +FontColor= +VAlign=2 + diff --git a/MY_Chat/audio/MsgArrive.ogg b/MY_Chat/audio/MsgArrive.ogg new file mode 100644 index 000000000..e22ab1a56 Binary files /dev/null and b/MY_Chat/audio/MsgArrive.ogg differ diff --git "a/MY_Chat/audio/\345\246\202\344\275\225\350\207\252\345\256\232\344\271\211\345\243\260\351\237\263.txt" "b/MY_Chat/audio/\345\246\202\344\275\225\350\207\252\345\256\232\344\271\211\345\243\260\351\237\263.txt" new file mode 100644 index 000000000..2738fa73d --- /dev/null +++ "b/MY_Chat/audio/\345\246\202\344\275\225\350\207\252\345\256\232\344\271\211\345\243\260\351\237\263.txt" @@ -0,0 +1,10 @@ +方法:将同名文件放到 Interface/MY#DATA/!all-users@zhcn/audio/MY_Chat/audio 目录下即可 + +如 MsgArrive.ogg 则放到 Interface/MY#DATA/!all-users@zhcn/audio/MY_Chat/audio/MsgArrive.ogg 下 +插件检测到有 Interface/MY#DATA/!all-users@zhcn/audio/MY_Chat/audio/MsgArrive.ogg 存在就不会播放默认音频 + +Good Luck + +茗伊 @tinymins [20140803] + +『茗伊@挽月堂@双梦镇』 diff --git a/MY_Chat/img/MY_ChatSwitch.Tga b/MY_Chat/img/MY_ChatSwitch.Tga new file mode 100644 index 000000000..e737102ab Binary files /dev/null and b/MY_Chat/img/MY_ChatSwitch.Tga differ diff --git a/MY_Chat/img/MY_ChatSwitch.UITex b/MY_Chat/img/MY_ChatSwitch.UITex new file mode 100644 index 000000000..d628d3696 Binary files /dev/null and b/MY_Chat/img/MY_ChatSwitch.UITex differ diff --git a/MY_Chat/img/MY_ChatSwitch.txt b/MY_Chat/img/MY_ChatSwitch.txt new file mode 100644 index 000000000..d4bbbf3b6 --- /dev/null +++ b/MY_Chat/img/MY_ChatSwitch.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 202 32 C:\Users\root\Desktop\势力底.TGA diff --git a/MY_Chat/info.ini b/MY_Chat/info.ini new file mode 100644 index 000000000..079fc7c44 --- /dev/null +++ b/MY_Chat/info.ini @@ -0,0 +1,20 @@ +[MY_Chat] +name=聊天辅助 +desc=聊天切换复制过滤打码监控喊话以及队伍泡泡 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Chat.lua +lua_1=src\MY_ChatCopy.lua +lua_2=src\MY_ChatSwitch.lua +lua_3=src\MY_ChatMosaics.lua +lua_4=src\MY_TeamBalloon.lua +lua_5=src\MY_WhisperMention.lua +lua_6=src\MY_AutoHideChat.lua +lua_7=src\MY_ChatEmotion.lua +lua_8=src\PS.lua +lua_9=src\MY_TalkEx.lua +lua_10=src\MY_ChatBlock.lua +lua_11=src\MY_ChatFilter.lua +lua_12=src\MY_ChatMonitor.lua +package=MY diff --git a/MY_Chat/info.ini.zh_TW b/MY_Chat/info.ini.zh_TW new file mode 100644 index 000000000..cd5ae2c84 --- /dev/null +++ b/MY_Chat/info.ini.zh_TW @@ -0,0 +1,20 @@ +[MY_Chat] +name=鑱婂ぉ杓斿姪 +desc=鑱婂ぉ鍒囨彌瑜囪=閬庢烤鎵撶⒓鐩f帶鍠婅┍浠ュ強闅婁紞娉℃场 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Chat.lua +lua_1=src\MY_ChatCopy.lua +lua_2=src\MY_ChatSwitch.lua +lua_3=src\MY_ChatMosaics.lua +lua_4=src\MY_TeamBalloon.lua +lua_5=src\MY_WhisperMention.lua +lua_6=src\MY_AutoHideChat.lua +lua_7=src\MY_ChatEmotion.lua +lua_8=src\PS.lua +lua_9=src\MY_TalkEx.lua +lua_10=src\MY_ChatBlock.lua +lua_11=src\MY_ChatFilter.lua +lua_12=src\MY_ChatMonitor.lua +package=MY diff --git a/MY_Chat/lang/default.jx3dat b/MY_Chat/lang/default.jx3dat new file mode 100644 index 000000000..c5f4dbc73 --- /dev/null +++ b/MY_Chat/lang/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['MOSAICS_CHAR'] = '*', +} diff --git a/MY_Chat/lang/zhcn.jx3dat b/MY_Chat/lang/zhcn.jx3dat new file mode 100644 index 000000000..578a80126 --- /dev/null +++ b/MY_Chat/lang/zhcn.jx3dat @@ -0,0 +1,182 @@ +return { + ['MY_Chat'] = '聊天助手', + ['MY_AutoHideChat'] = '自动隐藏聊天栏', + ['MY_ChatSwitch'] = '聊天助手', + ['MY_ChatCopy'] = '聊天复制', + ['MY_ChatEmotion'] = '聊天表情', + ['MY_ChatMosaics'] = '聊天打马', + ['MY_TeamBalloon'] = '聊天泡泡', + ['MY_WhisperMention'] = '聊天点名提醒', + + ['SAY'] = '说', + ['MAP'] = '地', + ['WORLD'] = '世', + ['PARTY'] = '队', + ['TEAM'] = '团', + ['ROOM'] = '房', + ['BATTLE'] = '战', + ['FACTION'] = '帮', + ['SCHOOL'] = '派', + ['CAMP'] = '阵', + ['FRIEND'] = '友', + ['ALLIANCE'] = '盟', + ['WHISPER' ] = '密', + ['CLS'] = '清', + ['AWAY'] = '离', + ['BUSY'] = '扰', + ['MOSAICS'] = '马', + ['Please input whisper name'] = '请输入密聊角色名', + ['Today: %d\nDaily limit: %d'] = '当日已发:%d\n每日上限:%d', + ['Today: %d\nDaily limit: no limitation'] = '当日已发:%d\n每日上限:无限制', + + ['chat helper'] = '聊天助手', + ['chat switch'] = '频道切换', + ['Max log: %d'] = '最大记录:%d', + + ['clear chat panel'] = '清空聊天栏', + ['Are you sure you want to clear current message panel?\nPress CTRL when click can clear without alert.\nPress ALT when click can clear all window.'] = '你确定要清空当前聊天栏消息吗?\n按住CTRL点击可以跳过该警告。\n按住ALT点击可以清空所有聊天栏。', + ['Are you sure you want to clear all message panel?'] = '你确定要清空所有聊天栏消息吗?', + + ['display panel'] = '显示聊天频道快速切换面板', + ['lock postion'] = '锁定聊天频道快速切换面板位置', + ['team balloon'] = '显示队伍聊天泡泡', + ['chat copy'] = '聊天复制', + ['Right click quick copy chat'] = '右键点击快速复制到当前频道', + ['chat time'] = '聊天时间', + ['hh:mm'] = '时:分', + ['hh:mm:ss'] = '时:分:秒', + ['channel setting'] = '频道设置', + ['away message'] = '暂离消息', + ['busy message'] = '勿扰消息', + + ['always show *'] = '总是显示※号', + ['always be white'] = '永远显示为白色', + ['hide system msg copy'] = '不复制系统消息', + ['chat time format'] = '聊天时间格式', + + ['Chat panel namelink ext function'] = '聊天栏角色名高级操作', + ['Alt show equip, shift select.'] = '按住 ALT 点击可查看装备,按住 SHIFT 点击可快速选中目标(目标在附近且当前不在特殊对战地图)。', + + ['MOSAICS_CHAR'] = '…', + ['chat mosaics'] = '聊天打马', + ['chat mosaics (mosaics names in chat panel)'] = '聊天打马(聊天栏中名字打上马赛克)', + ['mosaics mode'] = '打马模式', + ['no mosaics on my own name'] = '自己的名字不打马', + ['part mosaics A (mosaics except 1st and last character)'] = '打马模式壹(第一个字不打马)', + ['part mosaics B (mosaics except 1st character)' ] = '打马模式贰(最后一个字不打马)', + ['part mosaics C (mosaics except last character)' ] = '打马模式叁(第一个字和最后一个字不打马)', + ['part mosaics D (mosaics all character)' ] = '打马模式肆(所有字打马)', + ['mosaics character'] = '输入马赛克字符', + ['unmosaics names (split by comma)'] = '不打马的名字(英文半角逗号','分隔多个名字)', + + ['Auto hide chat panel'] = '自动隐藏聊天栏', + ['Auto switch talk channel when into battle field'] = '进出战场、名剑大会时自动切换团队/战场频道', + ['Redirect mention to whisper'] = '记录其他频道提及我的点名内容到密聊频道', + ['Filter official mention'] = '屏蔽官方点名记录功能', + + ['Resize emotion'] = '统一表情尺寸', + ['Emotion size'] = '表情尺寸', + ['Size: %d'] = '大小:%dpx。', + + -- MY_TalkEx.lua + ['MY_TalkEx'] = '喊话辅助', + + ['Everyone'] = '所有人', + ['TalkEx Talk'] = '喊话辅助 - 发送', + ['Send'] = '发送', + ['Send to'] = '发送到', + + ['Joke talk'] = '骚话大全', + ['Search'] = '搜索', + ['Click to search jokes.'] = '搜索骚话', + ['Copy'] = '复制', + ['Click to copy joke to chat panel.'] = '复制骚话到聊天栏', + ['Share'] = '分享', + ['Click to share your joke to remote.'] = '分享您编写的骚话到公共库中', + ['Confirm share joke:'] = '确认分享下方骚话内容到公共库中?(分享可能由于审核关系不会实时更新)', + ['Share onymously'] = '分享', + ['Share anonymously'] = '匿名分享', + ['Share error: server error.'] = '分享失败,服务无响应。', + + ['Have a trick with'] = '调侃一下', + ['Trick'] = '调侃一下', + ['Teammates where'] = '团队中', + ['Nearby players where'] = '附近的', + ['Please input something.'] = '请先输入一些内容。', + ['SLIGHT_PAUSE_MARK'] = '、', + ['You are talking too quick!'] = '操作太过频繁,静待片刻方可!', + ['No trick target found.'] = '找不到可以调侃的玩家,您可以尝试更改筛选条件。', + ['$zj look around and have a little thought.'] = '$zj斜眼看了身边的羊群,冥想了一会。', + ['$zj epilate $mb\'s feather clearly.'] = '$zj麻利的拔光了$mb的羊毛。', + ['$zj collected the feather epilated just now and wanted it sold well.'] = '$zj收拾了一下背包里的羊毛,希望今年能卖个好价钱。', + + ['Talk text'] = '喊话输入框', + ['Talk channel'] = '喊话频道', + ['Trick channel'] = '调侃发送频道', + ['Trick filter'] = '调侃对象范围过滤器', + ['Trick force'] = '调侃门派过滤器', + ['Trick text begin'] = '调侃内容输入框:第一句', + ['Trick text'] = '调侃内容输入框:调侃内容', + ['Trick text end'] = '调侃内容输入框:最后一句', + + -- MY_ChatBlock, MY_ChatFilter + ['MY_ChatBlock'] = '聊天过滤', + ['MY_ChatFilter'] = '刷屏屏蔽', + + ['Channels'] = '频道设置', + ['Enable'] = '启用', + ['Enable state'] = '启用状态', + ['BlockWords'] = '屏蔽词设置', + ['Team building'] = '团队招募', + ['From tong name'] = '所属帮会', + ['If talker\'s tong name equals with keyword, chat message will be blocked, only apply for target you\'ve met.'] = '如果发言者帮会名称与关键字相同则过滤发言,注意该功能仅对遇见过的侠士生效。', + ['Edit'] = '编辑', + ['Please input keyword:'] = '请输入关键字:', + ['Total %d messages blocked, recently blocked %d:'] = '该条目已过滤消息总计 %d 条,最近过滤消息 %d 条:', + ['No messages blocked yet.'] = '该条目尚未过滤消息。', + ['Add'] = '添加', + ['Delete'] = '删除', + + ['Ignore spaces'] = '忽略空格', + ['Ignore case'] = '忽略大写小写', + ['Ignore enem'] = '忽略全角半角', + ['Ignore acquaintance'] = '忽略认识的人', + ['Type keyword, right click list to config.'] = '输入关键字添加 右键列表可配置详情', + + ['duplicate chat filter' ] = '刷屏屏蔽', + ['filter duplicate chat' ] = '开启刷屏屏蔽(相同聊天内容只显示第一条)', + ['filter duplicate chat ignore id' ] = '刷屏屏蔽不同玩家发送的相同聊天内容也屏蔽', + ['only filter continuous duplicate chat'] = '刷屏屏蔽只屏蔽连续发送的刷屏聊天记录', + ['select duplicate channels' ] = '选择启用刷屏屏蔽的频道', + ['filter duplicate addon message' ] = '屏蔽相同内容的插件喊话', + + -- MY_ChatMonitor.lua + ['MY_ChatMonitor'] = '聊天监控', + ['Enable'] = '启用', + ['Edit'] = '编辑', + ['Delete'] = '删除', + ['Add'] = '添加', + ['Please input keyword:'] = '请输入监控关键字:', + ['Click to config monitors'] = '配置监控项', + ['start'] = '开始', + ['stop'] = '停止', + ['clear'] = '清空', + ['waiting...'] = '等待中…', + ['load preset'] = '加载预设', + ['regexp'] = '正则', + ['regular expression'] = '正则表达式', + ['show message preview box'] = '新消息弹窗', + ['play new message alert sound'] = '播放提示音', + ['output to system channel'] = '输出聊天栏', + ['timestrap format'] = '时间戳格式', + ['custom'] = '自定义', + ['max record count'] = '最大记录量', + ['custom timestrap (eg:[%yyyy/%MM/%dd_%hh:%mm:%ss])'] = '输入格式字符串 如:[%yyyy/%MM/%dd_%hh:%mm:%ss]', + ['ignore same message'] = '不显示重复', + ['Realtime save'] = '实时存记录', + ['Distinct server'] = '服务器共享', + ['key words:'] = '关键字:', + ['Are you sure you want to turn on regex mode?\nRegex is something advanced, make sure you know what you are doing.\nHold shift key next time to skip this alert.'] = '你确定要开启正则表达式模式吗?\n正则表达式是一种高级匹配规则,如果您不知道这是什么,请点击取消。\n更多关于正则表达式请上网搜索『Lua正则表达式』。\n下次按住SHIFT键点击监控配置可以跳过该警告。', + ['CHAT_MONITOR_KEYWORDS_SAMPLE'] = '10|十人,血战天策|XZTC,!小铁被吃了,!开宴黑铁;大战', + ['CHAT_MONITOR_TIP'] = '关键字过滤器\n说明:\n半角分号;分隔多个条件\n每个条件中用半角逗号,表示且\n每个条件中用半角分隔符|表示或\n每个条件中用半角感叹号!表示非\n\n例1:大明宫;DMG;血战天策;XZTC\n————————————————————————\n如上例子代表匹配含有DMG或大明宫或XZTC或血战天策的聊天记录。\n\n例2:25,大明宫;10,血战天策\n————————————————————————\n如上例子代表匹配同时含有“25”和“大明宫”或者同时含有“10”和“血战天策”的聊天记录。\n\n例3:\n10|十人,血战天策|XZTC,!小铁被吃了,!开宴黑铁;大战\n————————————————————————\n如上例子代表匹配同时含有“10”或“十人”,“XZTC”或“血战天策”,并且不含有“小铁被吃了”,也不含有“开宴黑铁”的句子;或者含有“大战”的聊天记录。\n\n关于正则表达式,不会正则切勿随意勾选,注意【Lua正则】和其他语言不完全一致,建议阅读相关文档后使用。', +} diff --git a/MY_Chat/lang/zhtw.jx3dat b/MY_Chat/lang/zhtw.jx3dat new file mode 100644 index 000000000..9c9c31a45 --- /dev/null +++ b/MY_Chat/lang/zhtw.jx3dat @@ -0,0 +1,182 @@ +return { + ['MY_Chat'] = '鑱婂ぉ鍔╂墜', + ['MY_AutoHideChat'] = '鑷嫊闅辫棌鑱婂ぉ娆', + ['MY_ChatSwitch'] = '鑱婂ぉ鍔╂墜', + ['MY_ChatCopy'] = '鑱婂ぉ瑜囪=', + ['MY_ChatEmotion'] = '鑱婂ぉ琛ㄦ儏', + ['MY_ChatMosaics'] = '鑱婂ぉ鎵撻Μ', + ['MY_TeamBalloon'] = '鑱婂ぉ娉℃场', + ['MY_WhisperMention'] = '鑱婂ぉ榛炲悕鎻愰啋', + + ['SAY'] = '瑾', + ['MAP'] = '鍦', + ['WORLD'] = '涓', + ['PARTY'] = '闅', + ['TEAM'] = '鍦', + ['ROOM'] = '鎴', + ['BATTLE'] = '鎴', + ['FACTION'] = '骞', + ['SCHOOL'] = '娲', + ['CAMP'] = '闄', + ['FRIEND'] = '鍙', + ['ALLIANCE'] = '鐩', + ['WHISPER' ] = '瀵', + ['CLS'] = '娓', + ['AWAY'] = '闆', + ['BUSY'] = '鎿', + ['MOSAICS'] = '棣', + ['Please input whisper name'] = '璜嬭几鍏ュ瘑鑱婅鑹插悕', + ['Today: %d\nDaily limit: %d'] = '鐣舵棩宸茬櫦锛%d\n姣忔棩涓婇檺锛%d', + ['Today: %d\nDaily limit: no limitation'] = '鐣舵棩宸茬櫦锛%d\n姣忔棩涓婇檺锛氱劇闄愬埗', + + ['chat helper'] = '鑱婂ぉ鍔╂墜', + ['chat switch'] = '闋婚亾鍒囨彌', + ['Max log: %d'] = '鏈澶ц閷勶細%d', + + ['clear chat panel'] = '娓呯┖鑱婂ぉ娆', + ['Are you sure you want to clear current message panel?\nPress CTRL when click can clear without alert.\nPress ALT when click can clear all window.'] = '浣犵⒑瀹氳娓呯┖鐣跺墠鑱婂ぉ娆勬秷鎭棊锛焅n鎸変綇CTRL榛炴搳鍙互璺抽亷瑭茶鍛娿俓n鎸変綇ALT榛炴搳鍙互娓呯┖鎵鏈夎亰澶╂瑒銆', + ['Are you sure you want to clear all message panel?'] = '浣犵⒑瀹氳娓呯┖鎵鏈夎亰澶╂瑒娑堟伅鍡庯紵', + + ['display panel'] = '椤ず鑱婂ぉ闋婚亾蹇熷垏鎻涢潰鏉', + ['lock postion'] = '閹栧畾鑱婂ぉ闋婚亾蹇熷垏鎻涢潰鏉夸綅缃', + ['team balloon'] = '椤ず闅婁紞鑱婂ぉ娉℃场', + ['chat copy'] = '鑱婂ぉ瑜囪=', + ['Right click quick copy chat'] = '鍙抽嵉榛炴搳蹇熻瑁藉埌鐣跺墠闋婚亾', + ['chat time'] = '鑱婂ぉ鏅傞枔', + ['hh:mm'] = '鏅傦細鍒', + ['hh:mm:ss'] = '鏅傦細鍒嗭細绉', + ['channel setting'] = '闋婚亾瑷疆', + ['away message'] = '鏆洟娑堟伅', + ['busy message'] = '鍕挎摼娑堟伅', + + ['always show *'] = '绺芥槸椤ず鈥昏櫉', + ['always be white'] = '姘搁仩椤ず鐐虹櫧鑹', + ['hide system msg copy'] = '涓嶈瑁界郴绲辨秷鎭', + ['chat time format'] = '鑱婂ぉ鏅傞枔鏍煎紡', + + ['Chat panel namelink ext function'] = '鑱婂ぉ娆勮鑹插悕楂樼礆鎿嶄綔', + ['Alt show equip, shift select.'] = '鎸変綇 ALT 榛炴搳鍙煡鐪嬭鍌欙紝鎸変綇 SHIFT 榛炴搳鍙揩閫熼伕涓洰妯欙紙鐩鍦ㄩ檮杩戜笖鐣跺墠涓嶅湪鐗规畩灏嶆埌鍦板湒锛夈', + + ['MOSAICS_CHAR'] = '鈥', + ['chat mosaics'] = '鑱婂ぉ鎵撻Μ', + ['chat mosaics (mosaics names in chat panel)'] = '鑱婂ぉ鎵撻Μ锛堣亰澶╂瑒涓悕瀛楁墦涓婇Μ璩藉厠锛', + ['mosaics mode'] = '鎵撻Μ妯″紡', + ['no mosaics on my own name'] = '鑷繁鐨勫悕瀛椾笉鎵撻Μ', + ['part mosaics A (mosaics except 1st and last character)'] = '鎵撻Μ妯″紡澹癸紙绗竴鍊嬪瓧涓嶆墦棣級', + ['part mosaics B (mosaics except 1st character)' ] = '鎵撻Μ妯″紡璨筹紙鏈寰屼竴鍊嬪瓧涓嶆墦棣級', + ['part mosaics C (mosaics except last character)' ] = '鎵撻Μ妯″紡鍙勶紙绗竴鍊嬪瓧鍜屾渶寰屼竴鍊嬪瓧涓嶆墦棣級', + ['part mosaics D (mosaics all character)' ] = '鎵撻Μ妯″紡鑲嗭紙鎵鏈夊瓧鎵撻Μ锛', + ['mosaics character'] = '杓稿叆棣辰鍏嬪瓧鍏', + ['unmosaics names (split by comma)'] = '涓嶆墦棣殑鍚嶅瓧锛堣嫳鏂囧崐褰㈤楄櫉','鍒嗛殧澶氬嬪悕瀛楋級', + + ['Auto hide chat panel'] = '鑷嫊闅辫棌鑱婂ぉ娆', + ['Auto switch talk channel when into battle field'] = '閫插嚭鎴板牬銆佸悕鍔嶅ぇ鏈冩檪鑷嫊鍒囨彌鍦橀殜/鎴板牬闋婚亾', + ['Redirect mention to whisper'] = '瑷橀寗鍏朵粬闋婚亾鎻愬強鎴戠殑榛炲悕鍏у鍒板瘑鑱婇牷閬', + ['Filter official mention'] = '灞忚斀瀹樻柟榛炲悕瑷橀寗鍔熻兘', + + ['Resize emotion'] = '绲变竴琛ㄦ儏灏哄', + ['Emotion size'] = '琛ㄦ儏灏哄', + ['Size: %d'] = '澶у皬锛%dpx銆', + + -- MY_TalkEx.lua + ['MY_TalkEx'] = '鍠婅┍杓斿姪', + + ['Everyone'] = '鎵鏈変汉', + ['TalkEx Talk'] = '鍠婅┍杓斿姪 - 鐧奸', + ['Send'] = '鐧奸', + ['Send to'] = '鐧奸佸埌', + + ['Joke talk'] = '楱疯┍澶у叏', + ['Search'] = '鎼滅储', + ['Click to search jokes.'] = '鎼滅储楱疯┍', + ['Copy'] = '瑜囪=', + ['Click to copy joke to chat panel.'] = '瑜囪=楱疯┍鍒拌亰澶╂瑒', + ['Share'] = '鍒嗕韩', + ['Click to share your joke to remote.'] = '鍒嗕韩鎮ㄧ法瀵殑楱疯┍鍒板叕鍏卞韩涓', + ['Confirm share joke:'] = '纰鸿獚鍒嗕韩涓嬫柟楱疯┍鍏у鍒板叕鍏卞韩涓紵锛堝垎浜彲鑳界敱鏂煎鏍搁棞淇備笉鏈冨鏅傛洿鏂帮級', + ['Share onymously'] = '鍒嗕韩', + ['Share anonymously'] = '鍖垮悕鍒嗕韩', + ['Share error: server error.'] = '鍒嗕韩澶辨晽锛屾湇鍕欑劇闊挎噳銆', + + ['Have a trick with'] = '瑾夸緝涓涓', + ['Trick'] = '瑾夸緝涓涓', + ['Teammates where'] = '鍦橀殜涓', + ['Nearby players where'] = '闄勮繎鐨', + ['Please input something.'] = '璜嬪厛杓稿叆涓浜涘収瀹广', + ['SLIGHT_PAUSE_MARK'] = '銆', + ['You are talking too quick!'] = '鎿嶄綔澶亷闋荤箒锛岄潨寰呯墖鍒绘柟鍙紒', + ['No trick target found.'] = '鎵句笉鍒板彲浠ヨ渚冪殑鐜╁锛屾偍鍙互鍢楄│鏇存敼绡╅伕姊濅欢銆', + ['$zj look around and have a little thought.'] = '$zj鏂滅溂鐪嬩簡韬倞鐨勭緤缇わ紝鍐ユ兂浜嗕竴鏈冦', + ['$zj epilate $mb\'s feather clearly.'] = '$zj楹诲埄鐨勬嫈鍏変簡$mb鐨勭緤姣涖', + ['$zj collected the feather epilated just now and wanted it sold well.'] = '$zj鏀舵嬀浜嗕竴涓嬭儗鍖呴噷鐨勭緤姣涳紝甯屾湜浠婂勾鑳借常鍊嬪ソ鍍归將銆', + + ['Talk text'] = '鍠婅┍杓稿叆妗', + ['Talk channel'] = '鍠婅┍闋婚亾', + ['Trick channel'] = '瑾夸緝鐧奸侀牷閬', + ['Trick filter'] = '瑾夸緝灏嶈薄绡勫湇閬庢烤鍣', + ['Trick force'] = '瑾夸緝闁娲鹃亷婵惧櫒', + ['Trick text begin'] = '瑾夸緝鍏у杓稿叆妗嗭細绗竴鍙', + ['Trick text'] = '瑾夸緝鍏у杓稿叆妗嗭細瑾夸緝鍏у', + ['Trick text end'] = '瑾夸緝鍏у杓稿叆妗嗭細鏈寰屼竴鍙', + + -- MY_ChatBlock, MY_ChatFilter + ['MY_ChatBlock'] = '鑱婂ぉ閬庢烤', + ['MY_ChatFilter'] = '鍒峰睆灞忚斀', + + ['Channels'] = '闋婚亾瑷疆', + ['Enable'] = '鍟熺敤', + ['Enable state'] = '鍟熺敤鐙鎱', + ['BlockWords'] = '灞忚斀瑭炶ō缃', + ['Team building'] = '鍦橀殜鎷涘嫙', + ['From tong name'] = '鎵灞公鏈', + ['If talker\'s tong name equals with keyword, chat message will be blocked, only apply for target you\'ve met.'] = '濡傛灉鐧艰█鑰呭公鏈冨悕绋辫垏闂滈嵉瀛楃浉鍚屽墖閬庢烤鐧艰█锛屾敞鎰忚┎鍔熻兘鍍呭皪閬囪閬庣殑淇犲+鐢熸晥銆', + ['Edit'] = '绶ㄨ集', + ['Please input keyword:'] = '璜嬭几鍏ラ棞閸靛瓧锛', + ['Total %d messages blocked, recently blocked %d:'] = '瑭叉鐩凡閬庢烤娑堟伅绺借▓ %d 姊濓紝鏈杩戦亷婵炬秷鎭 %d 姊濓細', + ['No messages blocked yet.'] = '瑭叉鐩皻鏈亷婵炬秷鎭', + ['Add'] = '娣诲姞', + ['Delete'] = '鍒櫎', + + ['Ignore spaces'] = '蹇界暐绌烘牸', + ['Ignore case'] = '蹇界暐澶у灏忓', + ['Ignore enem'] = '蹇界暐鍏ㄥ舰鍗婂舰', + ['Ignore acquaintance'] = '蹇界暐瑾嶈瓨鐨勪汉', + ['Type keyword, right click list to config.'] = '杓稿叆闂滈嵉瀛楁坊鍔 鍙抽嵉鍒楄〃鍙厤缃┏鎯', + + ['duplicate chat filter' ] = '鍒峰睆灞忚斀', + ['filter duplicate chat' ] = '闁嬪暉鍒峰睆灞忚斀锛堢浉鍚岃亰澶╁収瀹瑰彧椤ず绗竴姊濓級', + ['filter duplicate chat ignore id' ] = '鍒峰睆灞忚斀涓嶅悓鐜╁鐧奸佺殑鐩稿悓鑱婂ぉ鍏у涔熷睆钄', + ['only filter continuous duplicate chat'] = '鍒峰睆灞忚斀鍙睆钄介g簩鐧奸佺殑鍒峰睆鑱婂ぉ瑷橀寗', + ['select duplicate channels' ] = '閬告搰鍟熺敤鍒峰睆灞忚斀鐨勯牷閬', + ['filter duplicate addon message' ] = '灞忚斀鐩稿悓鍏у鐨勬彃浠跺枈瑭', + + -- MY_ChatMonitor.lua + ['MY_ChatMonitor'] = '鑱婂ぉ鐩f帶', + ['Enable'] = '鍟熺敤', + ['Edit'] = '绶ㄨ集', + ['Delete'] = '鍒櫎', + ['Add'] = '娣诲姞', + ['Please input keyword:'] = '璜嬭几鍏ョ洠鎺ч棞閸靛瓧锛', + ['Click to config monitors'] = '閰嶇疆鐩f帶闋', + ['start'] = '闁嬪', + ['stop'] = '鍋滄', + ['clear'] = '娓呯┖', + ['waiting...'] = '绛夊緟涓', + ['load preset'] = '杓夊叆闋愯ō', + ['regexp'] = '姝e墖', + ['regular expression'] = '姝e墖琛ㄩ仈寮', + ['show message preview box'] = '鏂版秷鎭綀绐', + ['play new message alert sound'] = '鎾斁鎻愮ず闊', + ['output to system channel'] = '杓稿嚭鑱婂ぉ娆', + ['timestrap format'] = '鏅傞枔鎴虫牸寮', + ['custom'] = '鑷畾缇', + ['max record count'] = '鏈澶ц閷勯噺', + ['custom timestrap (eg:[%yyyy/%MM/%dd_%hh:%mm:%ss])'] = '杓稿叆鏍煎紡瀛楀厓涓 濡傦細[%yyyy/%MM/%dd_%hh:%mm:%ss]', + ['ignore same message'] = '涓嶉’绀洪噸瑕', + ['Realtime save'] = '瀵︽檪瀛樿閷', + ['Distinct server'] = '浼烘湇鍣ㄥ叡浜', + ['key words:'] = '闂滈嵉瀛楋細', + ['Are you sure you want to turn on regex mode?\nRegex is something advanced, make sure you know what you are doing.\nHold shift key next time to skip this alert.'] = '浣犵⒑瀹氳闁嬪暉姝e墖琛ㄩ仈寮忔ā寮忓棊锛焅n姝e墖琛ㄩ仈寮忔槸涓绋珮绱氬尮閰嶈鍓囷紝濡傛灉鎮ㄤ笉鐭ラ亾閫欐槸浠楹硷紝璜嬮粸鎿婂彇娑堛俓n鏇村闂滄柤姝e墖琛ㄩ仈寮忚珛涓婄恫鎼滅储銆嶭ua姝e墖琛ㄩ仈寮忋忋俓n涓嬫鎸変綇SHIFT閸甸粸鎿婄洠鎺ч厤缃彲浠ヨ烦閬庤┎璀﹀憡銆', + ['CHAT_MONITOR_KEYWORDS_SAMPLE'] = '10|鍗佷汉,琛鎴板ぉ绛東XZTC,!灏忛惖琚悆浜,!闁嬪榛戦惖;澶ф埌', + ['CHAT_MONITOR_TIP'] = '闂滈嵉瀛楅亷婵惧櫒\n瑾槑锛歕n鍗婂舰鍒嗚櫉;鍒嗛殧澶氬嬫浠禱n姣忓嬫浠朵腑鐢ㄥ崐褰㈤楄櫉,琛ㄧず涓擻n姣忓嬫浠朵腑鐢ㄥ崐褰㈠垎闅旂|琛ㄧず鎴朶n姣忓嬫浠朵腑鐢ㄥ崐褰㈡劅鍢嗚櫉!琛ㄧず闈瀄n\n渚1锛氬ぇ鏄庡;DMG;琛鎴板ぉ绛;XZTC\n鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺擻n濡備笂渚嬪瓙浠h〃鍖归厤鍚湁DMG鎴栧ぇ鏄庡鎴朮ZTC鎴栬鎴板ぉ绛栫殑鑱婂ぉ瑷橀寗銆俓n\n渚2锛25,澶ф槑瀹;10,琛鎴板ぉ绛朶n鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺擻n濡備笂渚嬪瓙浠h〃鍖归厤鍚屾檪鍚湁鈥25鈥濆拰鈥滃ぇ鏄庡鈥濇垨鑰呭悓鏅傚惈鏈夆10鈥濆拰鈥滆鎴板ぉ绛栤濈殑鑱婂ぉ瑷橀寗銆俓n\n渚3锛歕n10|鍗佷汉,琛鎴板ぉ绛東XZTC,!灏忛惖琚悆浜,!闁嬪榛戦惖;澶ф埌\n鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺擻n濡備笂渚嬪瓙浠h〃鍖归厤鍚屾檪鍚湁鈥10鈥濇垨鈥滃崄浜衡濓紝鈥淴ZTC鈥濇垨鈥滆鎴板ぉ绛栤濓紝涓︿笖涓嶅惈鏈夆滃皬閻佃鍚冧簡鈥濓紝涔熶笉鍚湁鈥滈枊瀹撮粦閻碘濈殑鍙ュ瓙锛涙垨鑰呭惈鏈夆滃ぇ鎴扳濈殑鑱婂ぉ瑷橀寗銆俓n\n闂滄柤姝e墖琛ㄩ仈寮忥紝涓嶆渻姝e墖鍒囧嬁闅ㄦ剰鍕鹃伕锛屾敞鎰忋怢ua姝e墖銆戝拰鍏朵粬瑾炶█涓嶅畬鍏ㄤ竴鑷达紝寤鸿闁辫畝鐩搁棞鏂囨獢寰屼娇鐢ㄣ', +} diff --git a/MY_Chat/src/MY_AutoHideChat.lua b/MY_Chat/src/MY_AutoHideChat.lua new file mode 100644 index 000000000..dbc2214ac --- /dev/null +++ b/MY_Chat/src/MY_AutoHideChat.lua @@ -0,0 +1,306 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动隐藏聊天栏 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_AutoHideChat' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Chat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local STATE = { + SHOW = 1, -- 已显示 + HIDE = 2, -- 已隐藏 + SHOWING = 3, -- 渐变显示中 + HIDDING = 4, -- 渐变隐藏中 +} +local m_nState = STATE.SHOW +local O = X.CreateUserSettingsModule('MY_Chat', _L['Chat'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['Auto hide chat panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +-- get sys chat bg alpha +function D.GetBgAlpha() + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + return hFrame:Lookup('Wnd_Message', 'Shadow_Back'):GetAlpha() / 255 + end + end +end + +-- show panel +function D.ShowChatPanel(nShowFrame, nDelayFrame, callback) + -- 渐变出现帧数 + if not nShowFrame then + nShowFrame = X.ENVIRONMENT.GAME_FPS / 4 + end + -- 隐藏延迟帧数 + if not nDelayFrame then + nDelayFrame = 0 + end + -- switch case + if m_nState == STATE.SHOW then + -- return when chat panel is visible + if callback then + X.Call(callback) + end + return + elseif m_nState == STATE.SHOWING then + return + elseif m_nState == STATE.HIDE then + -- show each + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + hFrame:SetMousePenetrable(false) + end + end + elseif m_nState == STATE.HIDDING then + -- unregister hide animate + X.BreatheCall('MY_AutoHideChat_Hide', false) + end + m_nState = STATE.SHOWING + + -- get start alpha + local nStartAlpha = Station.Lookup('Lowest1/ChatTitleBG'):GetAlpha() + local nStartFrame = GetLogicFrameCount() + -- register animate breathe call + X.BreatheCall('MY_AutoHideChat_Show', function() + local nFrame = GetLogicFrameCount() + if nFrame - nDelayFrame < nStartFrame then + D.fAhBgAlpha = D.GetBgAlpha() + return + end + -- calc new alpha + local nAlpha = math.min(math.ceil((nFrame - nDelayFrame - nStartFrame) / nShowFrame * (255 - nStartAlpha) + nStartAlpha), 255) + -- alpha each panel + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + hFrame:SetAlpha(nAlpha) + hFrame:Lookup('Wnd_Message', 'Shadow_Back'):SetAlpha(nAlpha * D.fAhBgAlpha) + end + end + Station.Lookup('Lowest1/ChatTitleBG'):SetAlpha(nAlpha) + Station.Lookup('Lowest1/ChatTitleBG', 'Image_BG'):SetAlpha(nAlpha * D.fAhBgAlpha) + if nAlpha == 255 then + m_nState = STATE.SHOW + if callback then + X.Call(callback) + end + return 0 + end + end) +end + +-- hide panel +function D.HideChatPanel(nHideFrame, nDelayFrame, callback) + -- 渐变消失帧数 + if not nHideFrame then + nHideFrame = X.ENVIRONMENT.GAME_FPS / 2 + end + -- 隐藏延迟帧数 + if not nDelayFrame then + nDelayFrame = X.ENVIRONMENT.GAME_FPS * 5 + end + -- switch case + if m_nState == STATE.SHOW then + -- get bg alpha + D.fAhBgAlpha = D.GetBgAlpha() + elseif m_nState == STATE.SHOWING then + return + elseif m_nState == STATE.HIDE then + -- return when chat panel is not visible + if callback then + X.Call(callback) + end + return + elseif m_nState == STATE.HIDDING then + -- unregister hide animate + X.BreatheCall('MY_AutoHideChat_Hide', false) + end + m_nState = STATE.HIDDING + + -- get start alpha + local nStartAlpha = Station.Lookup('Lowest1/ChatTitleBG'):GetAlpha() + local nStartFrame = GetLogicFrameCount() + -- register animate breathe call + X.BreatheCall('MY_AutoHideChat_Hide', function() + local nFrame = GetLogicFrameCount() + if nFrame - nDelayFrame < nStartFrame then + D.fAhBgAlpha = D.GetBgAlpha() + return + end + -- calc new alpha + local nAlpha = math.max(math.ceil((1 - (nFrame - nDelayFrame - nStartFrame) / nHideFrame) * nStartAlpha), 0) + -- if panel setting panel is opened then delay again + local hPanelSettingFrame = Station.Lookup('Normal/ChatSettingPanel') + if hPanelSettingFrame and hPanelSettingFrame:IsVisible() then + nStartFrame = GetLogicFrameCount() + return + end + -- if mouse over chat panel then delay again + local hMouseOverWnd = Station.GetMouseOverWindow() + if hMouseOverWnd and hMouseOverWnd:GetRoot():GetName():sub(1, 9) == 'ChatPanel' then + nStartFrame = GetLogicFrameCount() + nAlpha = 255 + end + -- alpha each panel + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + hFrame:SetAlpha(nAlpha) + hFrame:Lookup('Wnd_Message', 'Shadow_Back'):SetAlpha(nAlpha * D.fAhBgAlpha) + -- hide if alpha turns to zero + if nAlpha == 0 then + hFrame:SetMousePenetrable(true) + end + end + end + Station.Lookup('Lowest1/ChatTitleBG'):SetAlpha(nAlpha) + Station.Lookup('Lowest1/ChatTitleBG', 'Image_BG'):SetAlpha(nAlpha * D.fAhBgAlpha) + if nAlpha == 0 then + m_nState = STATE.HIDE + if callback then + X.Call(callback) + end + return 0 + end + end) +end + +-- 初始化/生效 设置 +function D.Apply() + local hFrame = X.GetChatPanel(1) + local editInput = X.GetChatInput() + if not hFrame or not editInput then + return + end + local shaBack = hFrame:Lookup('Wnd_Message', 'Shadow_Back') + if not shaBack then + return + end + if O.bEnable then + -- get bg alpha + if not D.fAhBgAlpha then + D.fAhBgAlpha = shaBack:GetAlpha() / 255 + D.bAhAnimate = D.bAhAnimate or false + end + -- hook chat panel as event listener + X.HookChatPanel('AFTER', 'MY_AutoHideChat', function(h) + -- if input box get focus then return + local focus = Station.GetFocusWindow() + if focus and focus == X.GetChatInput() then + return + end + -- show when new msg + D.ShowChatPanel(X.ENVIRONMENT.GAME_FPS / 4, 0, function() + -- hide after 5 sec + D.HideChatPanel(X.ENVIRONMENT.GAME_FPS / 2, X.ENVIRONMENT.GAME_FPS * 5) + end) + end) + + -- hook chat edit box + -- save org + if editInput._MY_T_AHCP_OnSetFocus == nil then + editInput._MY_T_AHCP_OnSetFocus = editInput.OnSetFocus or false + end + -- show when chat panel get focus + editInput.OnSetFocus = function() + D.ShowChatPanel(X.ENVIRONMENT.GAME_FPS / 4, 0) + if this._MY_T_AHCP_OnSetFocus then + this._MY_T_AHCP_OnSetFocus() + end + end + -- save org + if editInput._MY_T_AHCP_OnKillFocus == nil then + editInput._MY_T_AHCP_OnKillFocus = editInput.OnKillFocus or false + end + -- hide after input box lost focus for 5 sec + editInput.OnKillFocus = function() + D.HideChatPanel(X.ENVIRONMENT.GAME_FPS / 2, X.ENVIRONMENT.GAME_FPS * 5) + if this._MY_T_AHCP_OnKillFocus then + this._MY_T_AHCP_OnKillFocus() + end + end + else + if editInput._MY_T_AHCP_OnSetFocus then + editInput.OnSetFocus = editInput._MY_T_AHCP_OnSetFocus + else + editInput.OnSetFocus = nil + end + editInput._MY_T_AHCP_OnSetFocus = nil + + if editInput._MY_T_AHCP_OnKillFocus then + editInput.OnKillFocus = editInput._MY_T_AHCP_OnKillFocus + else + editInput.OnKillFocus = nil + end + editInput._MY_T_AHCP_OnKillFocus = nil + X.HookChatPanel('AFTER', 'MY_AutoHideChat', false) + + D.ShowChatPanel() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto hide chat panel'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.Apply() + end, + }):Width() + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_AutoHideChat', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_AutoHideChat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_AutoHideChat', D.Apply) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_Chat.lua b/MY_Chat/src/MY_Chat.lua new file mode 100644 index 000000000..e7d47d5bf --- /dev/null +++ b/MY_Chat/src/MY_Chat.lua @@ -0,0 +1,128 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天辅助 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_Chat' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatCopy' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +if RegisterMsgHook then + RegisterMsgHook( + function(szMsg, nFont, bRich, r, g, b, szType, dwTalkerID, szName) + if not bRich then + szMsg = GetFormatText(szMsg, nFont, r, g, b) + bRich = true + end + szMsg = ' name="MY_Chat" script="this.name=\'MY_Chat\';this.data=\'' + .. GetCurrentTime() + .. '/' .. (nFont or '') .. '/' .. (r or '') .. '/' .. (g or '') .. '/' .. (b or '') + .. '/' .. (szType or '') .. '/' .. (dwTalkerID or '') .. '/' .. (szName or '') + .. '\'" text="" lockshowhide=1' + .. szMsg + return szMsg, nFont, bRich, r, g, b + end, + X.Clone(X.CONSTANT.MSG_TYPE_LIST) + ) +end + +local function UnwrapRawMessage(szMsg) + return szMsg:gsub('^[^>]*name="MY_Chat"[^>]*', '') +end + +local function ParseMessageInfo(...) + local szInfo, szRawMessage + if X.IsElement((...)) then + local h, i, j = ... + for i = i, j do + local el = h:Lookup(i) + if el:GetType() == 'Text' and el:GetName() == 'MY_Chat' then + szInfo = el.data + break + end + end + elseif X.IsString((...)) then + local szMsg = ... + local szMatch = szMsg:match('script="this.name=\'MY_Chat\';this.data=\'([^\']+)\'"') + if szMatch then + szInfo = szMatch + szRawMessage = UnwrapRawMessage(szMsg) + end + end + if szInfo then + local aInfo = X.SplitString(szInfo, '/') + local tInfo = { + dwTime = tonumber(aInfo[1]), + nFont = tonumber(aInfo[2]), + nR = tonumber(aInfo[3]), + nG = tonumber(aInfo[4]), + nB = tonumber(aInfo[5]), + szChannel = aInfo[6] , + dwTalkerID = tonumber(aInfo[7]), + szTalkerName = aInfo[8] , + szRawMessage = szRawMessage , + } + return tInfo + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Chat', + exports = { + { + fields = { + ParseMessageInfo = ParseMessageInfo, + UnwrapRawMessage = UnwrapRawMessage, + }, + }, + }, +} +MY_Chat = X.CreateModule(settings) +end + +X.HookChatPanel('BEFORE', 'MY_Chat', function(h, szMsg, ...) + local aXMLNode = X.XMLDecode(szMsg) + if aXMLNode then + for _, node in ipairs(aXMLNode) do + local szType = X.XMLGetNodeType(node) + local szName = X.XMLGetNodeData(node, 'name') + local szText = X.XMLGetNodeData(node, 'text') + local szScript = X.XMLGetNodeData(node, 'script') + if szType == 'text' + and szName == 'eventlink' + and szText == 'ReputationLink' then -- 修复官方通过 eventlink 实现声望文本时没有处理聊天数据的问题 + local szReputation = szScript:match('this.szLinkInfo=\"Reputation/(%d+)\"') + if szReputation then + local dwReputation = tonumber(szReputation) + if dwReputation then + local reputation = Table_GetReputationForceInfo(dwReputation) + if reputation then + X.XMLSetNodeData(node, 'text', '[' .. reputation.szName .. ']') + end + end + end + end + end + szMsg = X.XMLEncode(aXMLNode) + end + return szMsg +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatBlock.lua b/MY_Chat/src/MY_ChatBlock.lua new file mode 100644 index 000000000..94acfc6fd --- /dev/null +++ b/MY_Chat/src/MY_ChatBlock.lua @@ -0,0 +1,559 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天辅助 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatBlock' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatBlock' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local TALK_CHANNEL_MSG_TYPE = { + [PLAYER_TALK_CHANNEL.NEARBY ] = 'MSG_NORMAL' , + [PLAYER_TALK_CHANNEL.SENCE ] = 'MSG_MAP' , + [PLAYER_TALK_CHANNEL.WORLD ] = 'MSG_WORLD' , + [PLAYER_TALK_CHANNEL.TEAM ] = 'MSG_PARTY' , + [PLAYER_TALK_CHANNEL.RAID ] = 'MSG_TEAM' , + [PLAYER_TALK_CHANNEL.BATTLE_FIELD ] = 'MSG_BATTLE_FILED' , + [PLAYER_TALK_CHANNEL.TONG ] = 'MSG_GUILD' , + [PLAYER_TALK_CHANNEL.FORCE ] = 'MSG_SCHOOL' , + [PLAYER_TALK_CHANNEL.CAMP ] = 'MSG_CAMP' , + [PLAYER_TALK_CHANNEL.WHISPER ] = 'MSG_WHISPER' , + [PLAYER_TALK_CHANNEL.FRIENDS ] = 'MSG_FRIEND' , + [PLAYER_TALK_CHANNEL.TONG_ALLIANCE] = 'MSG_GUILD_ALLIANCE', + [PLAYER_TALK_CHANNEL.LOCAL_SYS ] = 'MSG_SYS' , +} +local MSG_TYPE_TALK_CHANNEL = X.FlipObjectKV(TALK_CHANNEL_MSG_TYPE) + +local DEFAULT_KW_CONFIG = { + szKeyword = '', + tMsgType = { + ['MSG_NORMAL' ] = true, + ['MSG_MAP' ] = true, + ['MSG_WORLD' ] = true, + ['MSG_SCHOOL' ] = true, + ['MSG_CAMP' ] = true, + ['MSG_WHISPER' ] = true, + }, + bIgnoreAcquaintance = true, + bIgnoreCase = true, bIgnoreEnEm = true, bIgnoreSpace = true, +} + +local O = X.CreateUserSettingsModule('MY_ChatBlock', _L['Chat'], { + bBlockWords = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatBlock'], + szDescription = X.MakeCaption({ + _L['Enable state'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + aBlockWords = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ChatBlock'], + szDescription = X.MakeCaption({ + _L['BlockWords'], + }), + xSchema = X.Schema.Collection(X.Schema.Record({ + uuid = X.Schema.Optional(X.Schema.String), + szKeyword = X.Schema.String, + tMsgType = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + bTeamBuilding = X.Schema.Optional(X.Schema.Boolean), + bTongName = X.Schema.Optional(X.Schema.Boolean), + bIgnoreAcquaintance = X.Schema.Boolean, + bIgnoreCase = X.Schema.Boolean, + bIgnoreEnEm = X.Schema.Boolean, + bIgnoreSpace = X.Schema.Boolean, + })), + xDefaultValue = {}, + }, + tBlockHistory = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ChatBlock'], + bDataSet = true, + xSchema = X.Schema.Record({ + nCount = X.Schema.Number, + aRecent = X.Schema.Collection(X.Schema.String), + }), + xDefaultValue = { nCount = 0, aRecent = {} }, + bPersistImmediatelyOnChange = false, + }, +}) +local D = {} + +function D.IsBlockMsg(szText, szMsgType, dwTalkerID) + local bAcquaintance = dwTalkerID + and (X.IsFellowship(dwTalkerID) or X.IsFoe(dwTalkerID) or X.IsTongMember(dwTalkerID)) + or false + for _, bw in ipairs(D.aBlockWords) do + if bw.tMsgType[szMsgType] and (not bAcquaintance or not bw.bIgnoreAcquaintance) then + if X.StringSimpleMatch(szText, bw.szKeyword, not bw.bIgnoreCase, not bw.bIgnoreEnEm, bw.bIgnoreSpace) then + return true, bw.uuid + end + if bw.bTongName and _G.MY_Farbnamen and _G.MY_Farbnamen.Get then + local info = _G.MY_Farbnamen.Get(dwTalkerID) + if info and info.szTongName == bw.szKeyword then + return true, bw.uuid + end + end + end + end + return false +end + +function D.OnTalkFilter(nChannel, t, dwTalkerID, szName, bEcho, bOnlyShowBallon, bSecurity, bGMAccount, bCheater, dwTitleID, dwIdePetTemplateID) + local szType = TALK_CHANNEL_MSG_TYPE[nChannel] + if not szType then + return + end + local szText = X.StringifyChatText(t) + local bBlock, uuid = D.IsBlockMsg(szText, szType, dwTalkerID) + if bBlock then + if D.bReady and uuid then + O.tBlockHistory[uuid].nCount = O.tBlockHistory[uuid].nCount + 1 + if #O.tBlockHistory[uuid].aRecent >= 10 then + table.remove(O.tBlockHistory[uuid].aRecent, 1) + end + local szMsgType = TALK_CHANNEL_MSG_TYPE[nChannel] + local nFont = szMsgType and GetMsgFont(szMsgType) + local r, g, b = GetMsgFontColor(nFont, true) + table.insert( + O.tBlockHistory[uuid].aRecent, + X.GetChatTimeXML(GetCurrentTime(), { + r = r, g = g, b = b, f = nFont, + s = '[%yyyy/%MM/%dd][%hh:%mm:%ss]', + }) .. X.XmlifyChatData(t, r, g, b, nFont) + ) + O.tBlockHistory[uuid] = O.tBlockHistory[uuid] + end + return true + end +end + +function D.OnMsgFilter(szMsg, nFont, bRich, r, g, b, szType, dwTalkerID, szName) + local bBlock, uuid = D.IsBlockMsg(bRich and GetPureText(szMsg) or szMsg, szType, dwTalkerID) + if bBlock then + if D.bReady and uuid then + O.tBlockHistory[uuid].nCount = O.tBlockHistory[uuid].nCount + 1 + if #O.tBlockHistory[uuid].aRecent >= 10 then + table.remove(O.tBlockHistory[uuid].aRecent, 1) + end + table.insert( + O.tBlockHistory[uuid].aRecent, + X.GetChatTimeXML(GetCurrentTime(), { + r = r, g = g, b = b, f = nFont, + s = '[%yyyy/%MM/%dd][%hh:%mm:%ss]', + }) .. (bRich and szMsg or GetFormatText(szMsg, nFont, r, g, b)) + ) + O.tBlockHistory[uuid] = O.tBlockHistory[uuid] + end + return true + end +end + +function D.CheckEnable() + UnRegisterTalkFilter(D.OnTalkFilter) + UnRegisterMsgFilter(D.OnMsgFilter) + if not D.bReady or not D.aBlockWords or not O.bBlockWords then + return + end + local tChannel, tMsgType = {}, {} + for _, bw in ipairs(D.aBlockWords) do + for szType, bEnable in pairs(bw.tMsgType) do + if bEnable then + if MSG_TYPE_TALK_CHANNEL[szType] then + tChannel[MSG_TYPE_TALK_CHANNEL[szType]] = true + end + tMsgType[szType] = true + end + end + end + local aChannel, aMsgType = {}, {} + for k, _ in pairs(tChannel) do + table.insert(aChannel, k) + end + for k, _ in pairs(tMsgType) do + table.insert(aMsgType, k) + end + if not X.IsEmpty(aChannel) then + RegisterTalkFilter(D.OnTalkFilter, aChannel) + end + if not X.IsEmpty(aMsgType) then + RegisterMsgFilter(D.OnMsgFilter, aMsgType) + end +end + +function D.TeamBuildingGetText(res, edit) + local szText = res[1] + if D.bReady and D.aBlockWords and O.bBlockWords then + local szFilter = '' + for _, bw in ipairs(D.aBlockWords) do + if bw.bTeamBuilding + and not X.StringFindW(bw.szKeyword, ',') + and not X.StringFindW(bw.szKeyword, ';') + and not X.StringFindW(bw.szKeyword, '|') + and not X.StringFindW(bw.szKeyword, '!') then + if szFilter ~= '' then + szFilter = szFilter .. ',' + end + szFilter = szFilter .. '!' .. bw.szKeyword + end + end + if szFilter ~= '' then + local aText = X.SplitString(szText, ';') + for i, v in ipairs(aText) do + if v ~= '' then + v = v .. ',' + end + aText[i] = v .. szFilter + end + szText = table.concat(aText, ';') + end + end + return szText +end + +function D.OnTeamBuildingCreate(frame) + local edit = frame:Lookup('PageSet_TeamBuild/Page_TeamFinding/Edit_TeamFind') + local hList = frame:Lookup('PageSet_TeamBuild/Page_TeamFinding/WndScroll_TeamInfo', '') + if not edit or not hList then + return + end + edit:SetLimit(-1) + HookTableFunc(edit, 'GetText', D.TeamBuildingGetText, { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + HookTableFunc(hList, 'FormatAllItemPos', D.ApplyTeamBuildingFilters, { bAfterOrigin = false }) +end + +function D.ApplyTeamBuildingFilters() + if not D.bReady or not D.aBlockWords or not O.bBlockWords then + return + end + local hList = Station.Lookup('Normal/TeamBuilding/PageSet_TeamBuild/Page_TeamFinding/WndScroll_TeamInfo', '') + if hList then + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + local szText = hItem:Lookup('Text_Leader'):GetText() .. '\n' .. hItem:Lookup('Text_Desc'):GetText() + local bVisible = true + for _, bw in ipairs(D.aBlockWords) do + if bw.bTeamBuilding + and X.StringSimpleMatch(szText, bw.szKeyword, not bw.bIgnoreCase, not bw.bIgnoreEnEm, bw.bIgnoreSpace) then + bVisible = false + break + end + end + hItem:SetVisible(bVisible) + end + hList:SetIgnoreInvisibleChild(true) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatBlock', + exports = { + { + fields = { + 'bBlockWords', + }, + root = O, + }, + }, +} +MY_ChatBlock = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChatBlock', function() + D.bReady = true + D.aBlockWords = O.aBlockWords + D.CheckEnable() +end) +X.RegisterUserSettingsRelease('MY_ChatBlock', function() + D.bReady = false + D.CheckEnable() +end) +X.RegisterFrameCreate('TeamBuilding', 'MY_ChatBlock', function(name, frame) + D.OnTeamBuildingCreate(frame) +end) + +-------------------------------------------------------------------------------- +-- 面板注册 +-------------------------------------------------------------------------------- + +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nX, nY = 0, 0 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 70, + text = _L['Enable'], + checked = O.bBlockWords, + onCheck = function(bCheck) + O.bBlockWords = bCheck + D.CheckEnable() + end, + }) + nX = nX + 70 + + local edit = ui:Append('WndEditBox', { + name = 'WndEditBox_Keyword', + x = nX, y = nY, w = nW - 160 - nX, h = 25, + placeholder = _L['Type keyword, right click list to config.'], + }) + nX, nY = 0, nY + 30 + + local aBlockWords = O.aBlockWords + local function SeekBlockWord(uuid) + for i = #aBlockWords, 1, -1 do + if aBlockWords[i].uuid == uuid then + return aBlockWords[i] + end + end + end + + local function RemoveBlockWord(uuid) + for i = #aBlockWords, 1, -1 do + if aBlockWords[i].uuid == uuid then + table.remove(aBlockWords, i) + end + end + end + + local list = ui:Append('WndListBox', { x = nX, y = nY, w = nW, h = nH - 30 }) + local function ReloadBlockWords() + O('reload', {'aBlockWords'}) + aBlockWords = O.aBlockWords + + local bSave = false + for _, bw in ipairs(aBlockWords) do + if not bw.uuid then + bw.uuid = X.GetUUID() + bSave = true + end + end + if bSave then + O.aBlockWords = aBlockWords + end + aBlockWords = O.aBlockWords + + D.aBlockWords = aBlockWords + D.CheckEnable() + + local tSelected = {} + for _, v in ipairs(list:ListBox('select', 'selected')) do + if v.selected and v.id then + tSelected[v.id] = true + end + end + list:ListBox('clear') + for _, bw in ipairs(aBlockWords) do + list:ListBox('insert', { + id = bw.uuid, + text = bw.szKeyword, + data = bw, + selected = tSelected[bw.uuid], + }) + end + end + ReloadBlockWords() + + local function SaveBlockWords() + O.aBlockWords = aBlockWords + ReloadBlockWords() + end + + list:ListBox('onmenu', function(id, text, data) + local menu = {} + X.InsertMsgTypeMenu(menu, function(szMsgType) + return { + fnAction = function(szType) + local bw = SeekBlockWord(id) + if bw then + if bw.tMsgType[szType] then + bw.tMsgType[szType] = nil + else + bw.tMsgType[szType] = true + end + SaveBlockWords() + end + end, + bChecked = data.tMsgType[szMsgType] + } + end) + table.insert(menu, 1, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, 1, { + szOption = _L['Edit'], + fnAction = function() + GetUserInput(_L['Please input keyword:'], function(szText) + szText = X.TrimString(szText) + if X.IsEmpty(szText) then + return + end + local bw = SeekBlockWord(id) + if bw then + bw.szKeyword = szText + SaveBlockWords() + end + end, nil, nil, nil, data.szKeyword) + end, + }) + table.insert(menu, { + szOption = _L['Team building'], + bCheck = true, bChecked = data.bTeamBuilding, + fnAction = function() + data.bTeamBuilding = not data.bTeamBuilding + SaveBlockWords() + end, + }) + table.insert(menu, { + szOption = _L['From tong name'], + bCheck = true, bChecked = data.bTongName, + fnAction = function() + data.bTongName = not data.bTongName + SaveBlockWords() + end, + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['If talker\'s tong name equals with keyword, chat message will be blocked, only apply for target you\'ve met.'], nil, 255, 255, 0), 400, {nX, nY, nW, nH}, ALW.LEFT_RIGHT) + end, + fnMouseLeave = function() + HideTip() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Ignore spaces'], + bCheck = true, bChecked = data.bIgnoreSpace, + fnAction = function() + local bw = SeekBlockWord(id) + if bw then + bw.bIgnoreSpace = not bw.bIgnoreSpace + SaveBlockWords() + end + end, + }) + table.insert(menu, { + szOption = _L['Ignore enem'], + bCheck = true, bChecked = data.bIgnoreEnEm, + fnAction = function() + local bw = SeekBlockWord(id) + if bw then + bw.bIgnoreEnEm = not bw.bIgnoreEnEm + SaveBlockWords() + end + end, + }) + table.insert(menu, { + szOption = _L['Ignore case'], + bCheck = true, bChecked = data.bIgnoreCase, + fnAction = function() + local bw = SeekBlockWord(id) + if bw then + bw.bIgnoreCase = not bw.bIgnoreCase + SaveBlockWords() + end + end, + }) + table.insert(menu, { + szOption = _L['Ignore acquaintance'], + bCheck = true, bChecked = data.bIgnoreAcquaintance, + fnAction = function() + local bw = SeekBlockWord(id) + if bw then + bw.bIgnoreAcquaintance = not bw.bIgnoreAcquaintance + SaveBlockWords() + end + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Delete'], + fnAction = function() + RemoveBlockWord(id) + SaveBlockWords() + X.UI.ClosePopupMenu() + end, + }) + menu.szOption = _L['Channels'] + return menu + end):ListBox('onlclick', function(id, text, data, selected) + edit:Text(text) + end) + :ListBox( + 'onhover', + function(id, text, data, selected) + local history = O.tBlockHistory[id] + local aXml = {} + if history.nCount > 0 then + table.insert(aXml, X.GetFormatText(_L('Total %d messages blocked, recently blocked %d:', history.nCount, #history.aRecent), 162, 192, 192, 192)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + else + table.insert(aXml, X.GetFormatText(_L('No messages blocked yet.'), 162, 192, 192, 192)) + end + for _, v in ipairs(history.aRecent) do + table.insert(aXml, v) + if not X.GetPureText(v):find('\n', 1, true) then + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + end + end + X.OutputTip(X.UI(this):HoverItemRect(), table.concat(aXml, '\n'):gsub('\t', ' '), true, ALW.BOTTOM_TOP) + end, + function(id, text, data) + HideTip() + end + ) + -- add + ui:Append('WndButton', { + x = nW - 160, y= 0, w = 80, + text = _L['Add'], + onClick = function() + local szText = X.TrimString(edit:Text()) + if X.IsEmpty(szText) then + return + end + O('reload', {'aBlockWords'}) + local bw = X.Clone(DEFAULT_KW_CONFIG) + bw.uuid = X.GetUUID() + bw.szKeyword = szText + table.insert(aBlockWords, 1, bw) + SaveBlockWords() + end, + }) + -- del + ui:Append('WndButton', { + x = nW - 80, y = 0, w = 80, + text = _L['Delete'], + onClick = function() + O('reload', {'aBlockWords'}) + for _, v in ipairs(list:ListBox('select', 'selected')) do + RemoveBlockWord(v.id) + end + SaveBlockWords() + end, + }) +end +X.Panel.Register(_L['Chat'], 'MY_ChatBlock', _L['MY_ChatBlock'], 'UI/Image/Common/Money.UITex|243', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatCopy.lua b/MY_Chat/src/MY_ChatCopy.lua new file mode 100644 index 000000000..8b3691dc6 --- /dev/null +++ b/MY_Chat/src/MY_ChatCopy.lua @@ -0,0 +1,377 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天辅助 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatCopy' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatCopy' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_ChatCopy', _L['Chat'], { + bChatCopy = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['chat copy'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bChatQuickCopy = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['Right click quick copy chat'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bChatTime = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['chat time'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + eChatTime = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['chat time format'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'HOUR_MIN_SEC', + }, + bChatCopyAlwaysShowMask = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['always show *'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bChatCopyAlwaysWhite = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['always be white'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bChatCopyNoCopySysmsg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['hide system msg copy'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bChatNamelinkEx = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatCopy'], + _L['Chat panel namelink ext function'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +X.HookChatPanel('AFTER', 'MY_ChatCopy', function(h, i, szMsg, szChannel, dwTime, nR, nG, nB) + if szMsg and i and D.bReady and h:GetItemCount() > i and (O.bChatTime or O.bChatCopy) then + -- chat time + local nFont + local tInfo = MY_Chat.ParseMessageInfo(h, i, h:GetItemCount() - 1) + if tInfo then + dwTime = tInfo.dwTime + nFont = tInfo.nFont + nR = tInfo.nR + nG = tInfo.nG + nB = tInfo.nB + szChannel = tInfo.szChannel + else + -- 最近历史密聊兼容 + local el = h:Lookup(i) + local szText = el:GetType() == 'Text' and el:GetText() + if szText then + local szYear, szMonth, szDay, szHour, szMinute, szRawText = szText:match('^%[(%d+)%.(%d+)%.(%d+)%s(%d+):(%d+)%](.*)$') + if szYear then + dwTime = X.DateToTime(tonumber(szYear), tonumber(szMonth), tonumber(szDay), tonumber(szHour), tonumber(szMinute), 0) + if O.bChatTime then + el:SetText(szRawText) + end + end + end + end + for ii = i, h:GetItemCount() - 1 do + local el = h:Lookup(ii) + if el:GetType() == 'Text' and not el:GetName():find('^namelink_%d+$') and el:GetText() ~= '' then + nFont = el:GetFontScheme() + nR, nG, nB = el:GetFontColor() + break + end + end + -- check if timestamp can insert + if O.bChatCopyNoCopySysmsg and szChannel == 'SYS_MSG' then + return + end + -- check chat copy settings + local bChatCopy = true + local bChatQuickCopy = O.bChatQuickCopy == true + if szChannel == 'MSG_IDENTITY' then + bChatCopy = false + bChatQuickCopy = false + end + -- create timestamp text + local szTime = '' + if O.bChatCopy and (O.bChatCopyAlwaysShowMask or not (O.bChatTime and dwTime)) then + local _r, _g, _b = nR, nG, nB + if O.bChatCopyAlwaysWhite then + _r, _g, _b = 255, 255, 255 + end + szTime = X.GetChatCopyXML(_L[' * '], { + r = _r, g = _g, b = _b, f = nFont, + richtext = szMsg, + lclick = bChatCopy, + rclick = bChatQuickCopy, + }) + elseif O.bChatCopyAlwaysWhite then + nR, nG, nB = 255, 255, 255 + end + if O.bChatTime and dwTime then + local szDateFormat = '' + if math.ceil(dwTime / 86400) ~= math.ceil(GetCurrentTime() / 86400) then + szDateFormat = '[%yyyy/%MM/%dd]' + end + if O.eChatTime == 'HOUR_MIN_SEC' then + szTime = szTime .. X.GetChatTimeXML(dwTime, { + r = nR, g = nG, b = nB, f = nFont, + s = szDateFormat .. '[%hh:%mm:%ss]', + richtext = szMsg, + lclick = bChatCopy, + rclick = bChatQuickCopy, + }) + else + szTime = szTime .. X.GetChatTimeXML(dwTime, { + r = nR, g = nG, b = nB, f = nFont, + s = szDateFormat .. '[%hh:%mm]', + richtext = szMsg, + lclick = bChatCopy, + rclick = bChatQuickCopy, + }) + end + end + -- insert timestamp text + h:InsertItemFromString(i, false, szTime) + end +end) + +function D.OnChatPanelNamelinkLButtonDown(...) + X.ChatLinkEventHandlers.OnNameLClick(...) +end + +function D.CheckNamelinkHook(h, nIndex, nEnd) + local bEnable = D.bReady and O.bChatNamelinkEx + if not nEnd then + nEnd = h:GetItemCount() - 1 + end + for i = nIndex, nEnd do + local hItem = h:Lookup(i) + if hItem:GetName():find('^namelink_%d+$') then + UnhookTableFunc(hItem, 'OnItemLButtonDown', D.OnChatPanelNamelinkLButtonDown) + if bEnable then + HookTableFunc(hItem, 'OnItemLButtonDown', D.OnChatPanelNamelinkLButtonDown, { bAfterOrigin = true }) + end + end + end +end + +X.HookChatPanel('AFTER', 'MY_ChatCopy__Namelink', function(h, nIndex) + D.CheckNamelinkHook(h, nIndex) +end) + +function D.CheckNamelinkEnable() + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + local h = hFrame and hFrame:Lookup('Wnd_Message', 'Handle_Message') + if h then + D.CheckNamelinkHook(h, 0) + end + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['chat copy'], + checked = O.bChatCopy, + onCheck = function(bChecked) + O.bChatCopy = bChecked + end, + }):AutoWidth():Width() + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Right click quick copy chat'], + checked = O.bChatQuickCopy, + onCheck = function(bChecked) + O.bChatQuickCopy = bChecked + end, + autoEnable = function() return O.bChatCopy end, + }) + nY = nY + nLH + + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['chat time'], + checked = O.bChatTime, + onCheck = function(bChecked) + if bChecked and _G.HM_ToolBox then + _G.HM_ToolBox.bChatTime = false + end + O.bChatTime = bChecked + end, + }):AutoWidth():Width() + + ui:Append('WndComboBox', { + x = nX, y = nY, w = 150, + text = _L['chat time format'], + menu = function() + return {{ + szOption = _L['hh:mm'], + bMCheck = true, + bChecked = O.eChatTime == 'HOUR_MIN', + fnAction = function() + O.eChatTime = 'HOUR_MIN' + end, + fnDisable = function() + return not O.bChatTime + end, + },{ + szOption = _L['hh:mm:ss'], + bMCheck = true, + bChecked = O.eChatTime == 'HOUR_MIN_SEC', + fnAction = function() + O.eChatTime = 'HOUR_MIN_SEC' + end, + fnDisable = function() + return not O.bChatTime + end, + }} + end, + }) + nY = nY + nLH + + nX = nPaddingX + 25 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['always show *'], + checked = O.bChatCopyAlwaysShowMask, + onCheck = function(bChecked) + O.bChatCopyAlwaysShowMask = bChecked + end, + autoEnable = function() + return O.bChatCopy + end, + }) + nY = nY + nLH + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['always be white'], + checked = O.bChatCopyAlwaysWhite, + onCheck = function(bChecked) + O.bChatCopyAlwaysWhite = bChecked + end, + autoEnable = function() + return O.bChatCopy + end, + }) + nY = nY + nLH + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['hide system msg copy'], + checked = O.bChatCopyNoCopySysmsg, + onCheck = function(bChecked) + O.bChatCopyNoCopySysmsg = bChecked + end, + autoEnable = function() + return O.bChatCopy + end, + }) + nY = nY + nLH + + nX = nPaddingX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Chat panel namelink ext function'], + checked = O.bChatNamelinkEx, + onCheck = function(bChecked) + O.bChatNamelinkEx = bChecked + D.CheckNamelinkEnable() + end, + tip = { + render = _L['Alt show equip, shift select.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }) + nY = nY + nLH + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatCopy', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_ChatCopy = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChatCopy', function() + D.bReady = true + D.CheckNamelinkEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatEmotion.lua b/MY_Chat/src/MY_ChatEmotion.lua new file mode 100644 index 000000000..efa8467d8 --- /dev/null +++ b/MY_Chat/src/MY_ChatEmotion.lua @@ -0,0 +1,128 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天辅助 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatEmotion' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatEmotion' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_ChatEmotion', _L['Chat'], { + bFixSize = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatEmotion'], + _L['Resize emotion'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nSize = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatEmotion'], + _L['Emotion size'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 20, + }, +}) +local D = {} + +function D.Render(szMsg) + if D.bReady and O.bFixSize then + local aXMLNode = X.XMLDecode(szMsg) + if aXMLNode then + for _, node in ipairs(aXMLNode) do + local szType = X.XMLGetNodeType(node) + local szName = X.XMLGetNodeData(node, 'name') + if (szType == 'animate' or szType == 'image') + and szName and szName:sub(1, 8) == 'emotion_' then + X.XMLSetNodeData(node, 'w', O.nSize) + X.XMLSetNodeData(node, 'h', O.nSize) + X.XMLSetNodeData(node, 'disablescale', 0) + end + end + szMsg = X.XMLEncode(aXMLNode) + end + end + return szMsg +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Resize emotion'], + checked = O.bFixSize, + onCheck = function(bChecked) + O.bFixSize = bChecked + end, + }):AutoWidth():Width() + 5 + ui:Append('WndSlider', { + x = nX, y = nY, w = 100, h = 25, + value = O.nSize, + range = {1, 300}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(v) return _L('Size: %d', v) end, + onChange = function(val) + O.nSize = val + end, + autoEnable = function() return O.bFixSize end, + }) + nY = nY + nLH + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatEmotion', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + Render = D.Render, + }, + }, + }, +} +MY_ChatEmotion = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterInit('MY_ChatEmotion', function() + X.HookChatPanel('BEFORE', 'MY_ChatEmotion', function(h, szMsg, ...) + return D.Render(szMsg), ... + end) +end) + +X.RegisterUserSettingsInit('MY_ChatEmotion', function() + D.bReady = true +end) + +X.RegisterUserSettingsRelease('MY_ChatEmotion', function() + D.bReady = false +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatFilter.lua b/MY_Chat/src/MY_ChatFilter.lua new file mode 100644 index 000000000..a889592fc --- /dev/null +++ b/MY_Chat/src/MY_ChatFilter.lua @@ -0,0 +1,287 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天过滤 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatFilter' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatFilter' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['Chat'], { + bFilterDuplicate = { -- 屏蔽重复聊天 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatFilter'], + szDescription = X.MakeCaption({ + _L['filter duplicate chat'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bFilterDuplicateIgnoreID = { -- 不同玩家重复聊天也屏蔽 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatFilter'], + szDescription = X.MakeCaption({ + _L['filter duplicate chat ignore id'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFilterDuplicateContinuous = { -- 仅屏蔽连续的重复聊天 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatFilter'], + szDescription = X.MakeCaption({ + _L['only filter continuous duplicate chat'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bFilterDuplicateAddonTalk = { -- 屏蔽UUID相同的插件消息 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatFilter'], + szDescription = X.MakeCaption({ + _L['filter duplicate addon message'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tApplyDuplicateChannels = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatFilter'], + szDescription = X.MakeCaption({ + _L['select duplicate channels'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = { + ['MSG_NORMAL' ] = true, + ['MSG_PARTY' ] = false, + ['MSG_MAP' ] = true, + ['MSG_BATTLE_FILED' ] = true, + ['MSG_GUILD' ] = true, + ['MSG_GUILD_ALLIANCE'] = true, + ['MSG_SCHOOL' ] = true, + ['MSG_WORLD' ] = true, + ['MSG_TEAM' ] = false, + ['MSG_CAMP' ] = true, + ['MSG_GROUP' ] = true, + ['MSG_WHISPER' ] = false, + ['MSG_SEEK_MENTOR' ] = true, + ['MSG_FRIEND' ] = false, + }, + }, +}) +local D = {} +local MAX_CHAT_RECORD = 10 +local MAX_UUID_RECORD = 10 + +local l_tChannelHeader = { + ['MSG_WHISPER'] = g_tStrings.STR_TALK_HEAD_SAY, + ['MSG_NORMAL'] = g_tStrings.STR_TALK_HEAD_SAY, + ['MSG_NPC_NEARBY'] = g_tStrings.STR_TALK_HEAD_SAY, + ['MSG_PARTY'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_GUILD'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_GUILD_ALLIANCE'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_WORLD'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_SCHOOL'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_CAMP'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_FRIEND'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_TEAM'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_MAP'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_BATTLE_FILED'] = g_tStrings.STR_TALK_HEAD_SAY1, + ['MSG_NPC_PARTY'] = g_tStrings.STR_TALK_HEAD_SAY1, +} + +X.HookChatPanel('FILTER', 'MY_ChatFilter', function(h, szMsg, szChannel, dwTime) + local aXMLNode, aSay + local tInfo = MY_Chat.ParseMessageInfo(szMsg) + if tInfo then + dwTime = tInfo.dwTime + szChannel = tInfo.szChannel + end + -- 插件消息UUID过滤 + if D.bReady and O.bFilterDuplicateAddonTalk then + if not aXMLNode then + aXMLNode = X.XMLDecode(szMsg) + aSay = X.ParseChatData(aXMLNode) + end + if not h.MY_tDuplicateUUID then + h.MY_tDuplicateUUID = {} + end + for _, element in ipairs(aSay) do + if element.type == 'eventlink' and element.name == '' then + local data = X.DecodeJSON(element.linkinfo) + if X.IsTable(data) and data.uuid then + local szUUID = data.uuid + if szUUID then + for k, uuid in pairs(h.MY_tDuplicateUUID) do + if uuid == szUUID then + return false + end + end + table.insert(h.MY_tDuplicateUUID, 1, szUUID) + local nCount = #h.MY_tDuplicateUUID - MAX_UUID_RECORD + if nCount > 0 then + for i = nCount, 1, -1 do + table.remove(h.MY_tDuplicateUUID) + end + end + end + end + end + end + end + -- 重复内容刷屏屏蔽(系统频道除外) + if szChannel == 'MSG_SYS' and X.ContainsEchoMsgHeader(szMsg) then + if not aXMLNode then + aXMLNode = X.XMLDecode(szMsg) + aSay = X.ParseChatData(aXMLNode) + end + local bHasEcho, szEchoChannel = X.DecodeEchoMsgHeader(aXMLNode) + if bHasEcho and szEchoChannel then + szChannel = szEchoChannel + end + end + if D.bReady and O.bFilterDuplicate and O.tApplyDuplicateChannels[szChannel] and szChannel ~= 'MSG_SYS' then + if not aXMLNode then + aXMLNode = X.XMLDecode(szMsg) + aSay = X.ParseChatData(aXMLNode) + end + -- 解析聊天纯字符串 + local szText = X.StringifyChatText(aSay) + -- 解析发言人名字 + local szName = '' + if l_tChannelHeader[szChannel] then + local nS, nE = X.StringFindW(szText, l_tChannelHeader[szChannel]) + if nS and nE then + szName = '' + szText:sub(1, nE):gsub('(%[[^%[%]]-%])', function(s) + szName = szName .. s + end) + szText = szText:sub(nE + 1) + end + end + szText = szText:gsub('[ \n]', '') + -- 判断是否区分发言者 + if not O.bFilterDuplicateIgnoreID then + szText = szName .. ':' .. szText + end + -- 判断是否需要过滤 + if not h.MY_tDuplicateLog then + h.MY_tDuplicateLog = {} + elseif O.bFilterDuplicateContinuous then + if h.MY_tDuplicateLog[1] == szText then + return false + end + h.MY_tDuplicateLog[1] = szText + else + for i, szRecord in ipairs(h.MY_tDuplicateLog) do + if szRecord == szText then + return false + end + end + table.insert(h.MY_tDuplicateLog, 1, szText) + local nCount = #h.MY_tDuplicateLog - MAX_CHAT_RECORD + if nCount > 0 then + for i = nCount, 1, -1 do + table.remove(h.MY_tDuplicateLog) + end + end + end + end + return true +end) + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChatFilter', function() D.bReady = true end) + +-------------------------------------------------------------------------------- +-- 面板注册 +-------------------------------------------------------------------------------- + +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nX, nY = 20, 30 + + ui:Append('WndCheckBox', { + text = _L['filter duplicate chat'], + x = nX, y = nY, w = 400, + checked = O.bFilterDuplicate, + onCheck = function(bCheck) + O.bFilterDuplicate = bCheck + end, + }) + nY = nY + 30 + + ui:Append('WndCheckBox', { + text = _L['filter duplicate chat ignore id'], + x = nX, y = nY, w = 400, + checked = O.bFilterDuplicateIgnoreID, + onCheck = function(bCheck) + O.bFilterDuplicateIgnoreID = bCheck + end, + }) + nY = nY + 30 + + ui:Append('WndCheckBox', { + text = _L['only filter continuous duplicate chat'], + x = nX, y = nY, w = 400, + checked = O.bFilterDuplicateContinuous, + onCheck = function(bCheck) + O.bFilterDuplicateContinuous = bCheck + end, + }) + nY = nY + 30 + + ui:Append('WndComboBox', { + x = nX, y = nY, w = 330, h = 25, + menu = function() + local t = {} + for szChannelID, bFilter in pairs(O.tApplyDuplicateChannels) do + table.insert(t, { + szOption = g_tStrings.tChannelName[szChannelID], + bCheck = true, bChecked = bFilter, + rgb = GetMsgFontColor(szChannelID, true), + fnAction = function() + O.tApplyDuplicateChannels[szChannelID] = not O.tApplyDuplicateChannels[szChannelID] + O.tApplyDuplicateChannels = O.tApplyDuplicateChannels + end, + }) + end + return t + end, + text = _L['select duplicate channels'], + }) + nY = nY + 50 + + ui:Append('WndCheckBox', { + text = _L['filter duplicate addon message'], + x = nX, y = nY, w = 400, + checked = O.bFilterDuplicateAddonTalk, + onCheck = function(bCheck) + O.bFilterDuplicateAddonTalk = bCheck + end, + }) + nY = nY + 30 +end + +X.Panel.Register(_L['Chat'], 'MY_DuplicateChatFilter', _L['duplicate chat filter'], 'ui/Image/UICommon/yirong3.UITex|104', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatMonitor.lua b/MY_Chat/src/MY_ChatMonitor.lua new file mode 100644 index 000000000..820a50e4f --- /dev/null +++ b/MY_Chat/src/MY_ChatMonitor.lua @@ -0,0 +1,696 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天监控 按关键字过滤获取聊天消息 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatMonitor' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatMonitor' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +--[[ + RECORD_LIST = { + -- (数组部分)监控记录 + { + html = 消息A的UI序列化值(szMsg) 消息源数据UI XML, + hash = 消息A的HASH值 计算当前消息的哈希 用于过滤相同, + text = 消息A的纯文本 计算当前消息的纯文字内容 用于匹配, + }, ... + } + RECORD_HASH = { + -- (哈希部分)记录数量 + [消息A的HASH值] = 相同的消息A捕获的数量, -- 当为0时删除改HASH + ... + } +]] +local DATA_FILE = 'userdata/chatmonitor.jx3dat' +local CONFIG_FILE = 'config/chatmonitor.jx3dat' +local RECORD_LIST, RECORD_HASH = {}, {} +local DEFAULE_CHANNEL = { + ['MSG_NORMAL'] = true, ['MSG_CAMP' ] = true, ['MSG_WORLD' ] = true, ['MSG_MAP' ] = true, + ['MSG_SCHOOL'] = true, ['MSG_GUILD'] = true, ['MSG_FRIEND'] = true, ['MSG_IDENTITY'] = true, +} +local O = X.CreateUserSettingsModule('MY_ChatMonitor', _L['Chat'], { + aKeyword = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['key words:'] .. _L['Click to config monitors'], + }), + xSchema = X.Schema.Collection(X.Schema.Record({ + szKeyword = X.Schema.String, + bEnable = X.Schema.Boolean, + bIsRegexp = X.Schema.Boolean, + tChannel = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + })), + xDefaultValue = {{ + szKeyword = _L.CHAT_MONITOR_KEYWORDS_SAMPLE, + bEnable = true, + bIsRegexp = false, + tChannel = X.Clone(DEFAULE_CHANNEL), + }}, + }, + bCapture = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['start'] .. '/' .. _L['stop'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nMaxRecord = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['max record count'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 30, + }, + bShowPreview = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['show message preview box'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPlaySound = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['play new message alert sound'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bRedirectSysChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['output to system channel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bIgnoreSame = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['ignore same message'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + -- bRealtimeSave = { + -- ePathType = X.PATH_TYPE.ROLE, + -- szLabel = _L['MY_ChatMonitor'], + -- xSchema = X.Schema.Boolean, + -- xDefaultValue = false, + -- }, + bDistinctServer = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['Distinct server'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + szTimestrap = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['timestrap format'], + }), + xSchema = X.Schema.String, + xDefaultValue = '[%hh:%mm:%ss]', + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMonitor'], + szDescription = X.MakeCaption({ + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -100, y = -150, s = 'BOTTOMRIGHT', r = 'BOTTOMRIGHT' }, + }, +}) +local D = {} + +local l_uiBtn, l_uiBoard + +function D.LoadConfig() + local szPath = X.FormatPath({CONFIG_FILE, X.PATH_TYPE.GLOBAL}) + local aKeyword = X.LoadLUAData(szPath) + if aKeyword then + CPath.DelFile(szPath) + -- 兼容保留 + for i, p in ipairs(aKeyword) do + if X.IsString(p) then + aKeyword[i] = { + szKeyword = p, + bEnable = true, + bIsRegexp = false, + tChannel = X.Clone(DEFAULE_CHANNEL), + } + end + end + O.aKeyword = aKeyword + end +end + +function D.SaveData() + local TYPE = O.bDistinctServer + and X.PATH_TYPE.SERVER or X.PATH_TYPE.ROLE + X.SaveLUAData({DATA_FILE, TYPE}, {list = RECORD_LIST, hash = RECORD_HASH}) +end + +function D.LoadData() + local data = O.bDistinctServer + and (X.LoadLUAData({DATA_FILE, X.PATH_TYPE.SERVER}) or {}) + or (X.LoadLUAData({DATA_FILE, X.PATH_TYPE.ROLE}) or {}) + RECORD_LIST = data.list or {} + RECORD_HASH = data.hash or {} +end + +function D.GetHTML(rec) + -- render link event + local szMsg = X.RenderChatLink(rec.html) + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen and MY_Farbnamen.Render then + szMsg = MY_Farbnamen.Render(szMsg) + end + szMsg = X.GetChatTimeXML(rec.time, { + r = rec.r, g = rec.g, b = rec.b, + f = rec.font, s = O.szTimestrap, + richtext = szMsg, + }) .. szMsg + return szMsg +end + +function D.OnNotifyCB() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_ChatMonitor') + X.DismissNotify('MY_ChatMonitor') +end + +-- 插入聊天内容时监控聊天信息 +function D.OnMsgArrive(szChannel, szMsg, nFont, bRich, r, g, b, dwTalkerID, szName) + -- is enabled + if not D.bReady or not O.bCapture then + return + end + -------------------------------------------------------------------------------------- + -- 开始生成一条记录 + local rec = { text = '', hash = '', html = '' } + -- 计算消息源数据UI + if bRich then + rec.html = szMsg + -- 格式化消息 + local tMsgContent = X.ParseChatData(szMsg) + -- 拼接消息 + if szChannel == 'MSG_SYS' then -- 系统消息 + for i, v in ipairs(tMsgContent) do + rec.text = rec.text .. v.text + end + rec.hash = rec.text + else -- 如果不是系统信息则在哈希中舍弃第一个名字之前的东西 类似“[阵营][浩气盟][茗伊]说:” + -- STR_TALK_HEAD_WHISPER = '悄悄地说:', + -- STR_TALK_HEAD_WHISPER_REPLY = '你悄悄地对', + -- STR_TALK_HEAD_SAY = '说:', + -- STR_TALK_HEAD_SAY1 = ':', + -- STR_TALK_HEAD_SAY2 = '大声喊:', + local bSkiped = false + for i, v in ipairs(tMsgContent) do + if (i < 4 and not bSkiped) and ( + v.text == g_tStrings.STR_TALK_HEAD_WHISPER or + v.text == g_tStrings.STR_TALK_HEAD_SAY or + v.text == g_tStrings.STR_TALK_HEAD_SAY1 or + v.text == g_tStrings.STR_TALK_HEAD_SAY2 + ) then + bSkiped = true + rec.hash = '' + else + rec.text = rec.text .. v.text + rec.hash = rec.hash .. v.text + end + end + end + else + rec.text = szMsg + rec.hash = szMsg + rec.html = GetFormatText(szMsg, nil, GetMsgFontColor('MSG_SYS')) + end + + rec.fuzzy_text = rec.text + local szChannelName = g_tStrings.tChannelName[szChannel] + if szChannelName then + rec.fuzzy_text = '[' .. szChannelName .. ']\t' .. rec.fuzzy_text + end + rec.fuzzy_text = StringLowerW(rec.fuzzy_text) + + rec.hash = string.gsub(rec.hash, '[\n%s]+', '') + -------------------------------------------------------------------------------------- + -- 开始计算是否符合过滤器要求 + local bMatch = false + for _, p in ipairs(O.aKeyword) do + if p.bEnable and p.tChannel[szChannel] then + if p.bIsRegexp then -- regexp + if string.find(rec.text, p.szKeyword) then + bMatch = true + break + end + else -- normal + if X.StringSimpleMatch(rec.text, p.szKeyword) then + bMatch = true + break + end + end + end + end + if not bMatch then + return + end + -- 验证消息哈希 如果存在则跳过该消息 + if O.bIgnoreSame and RECORD_HASH[rec.hash] then + return + end + -------------------------------------------------------------------------------------- + -- 如果符合要求 + -- 开始渲染一条记录的UIXML字符串 + rec.r, rec.g, rec.b = r, g, b + rec.font = nFont + rec.time = GetCurrentTime() + local html = D.GetHTML(rec) + -- 如果设置重定向到系统消息则输出(输出时加个标记防止又被自己捕捉了死循环) + if O.bRedirectSysChannel and szChannel ~= 'MSG_SYS' then + OutputMessage('MSG_SYS', X.EncodeEchoMsgHeader(szChannel) .. szMsg, true) + end + -- 广播消息 + OutputMessage('MSG_MY_MONITOR', szMsg, true, nil, nil, dwTalkerID, szName) + -- 更新UI + if l_uiBoard then + local nPos = l_uiBoard:Scroll() + l_uiBoard:Append(html) + if nPos == 100 or nPos == -1 then + l_uiBoard:Scroll(100) + end + end + X.CreateNotify({ + szKey = 'MY_ChatMonitor', + szMsg = html, + fnAction = D.OnNotifyCB, + bPlaySound = O.bPlaySound, + szSound = PLUGIN_ROOT .. '/audio/MsgArrive.ogg', + bPopupPreview = O.bShowPreview, + }) + -------------------------------------------------------------------------------------- + -- 开始处理记录的数据保存 + -- 更新缓存数组 哈希表 + table.insert(RECORD_LIST, rec) + RECORD_HASH[rec.hash] = (RECORD_HASH[rec.hash] or 0) + 1 + -- 验证记录是否超过限制条数 + local nOverflowed = #RECORD_LIST - O.nMaxRecord + if nOverflowed > 0 then + -- 处理记录列表 + for i = nOverflowed, 1, -1 do + local hash = RECORD_LIST[1].hash + if hash and RECORD_HASH[hash] then + RECORD_HASH[hash] = RECORD_HASH[hash] - 1 + if RECORD_HASH[hash] <= 0 then + RECORD_HASH[hash] = nil + end + end + if l_uiBoard then + l_uiBoard:RemoveItemUntilNewLine() + end + table.remove(RECORD_LIST, 1) + end + end + -- if O.bRealtimeSave then + -- D.SaveData() + -- end +end + +function D.Init() + D.bReady = true + D.LoadConfig() + D.LoadData() + D.RegisterMsgMonitor() + X.RegisterWwiseSound(PLUGIN_ROOT .. '/audio/MsgArrive.ogg', 'UserPluginAudio_MY_Base_Notify') +end + +function D.Exit() + D.SaveData() +end + +function D.RegisterMsgMonitor() + for _, szChannel in ipairs(D.aCurrentChannel or X.CONSTANT.EMPTY_TABLE) do + X.RegisterMsgMonitor(szChannel, 'MY_ChatMonitor', false) + end + local aChannel = {} + if D.bReady then + local tChannel = {} + for _, p in ipairs(O.aKeyword) do + if p.bEnable then + for szChannel, bCapture in pairs(p.tChannel) do + if bCapture then + tChannel[szChannel] = true + end + end + end + end + for szChannel, _ in pairs(tChannel) do + table.insert(aChannel, szChannel) + end + for _, szChannel in ipairs(aChannel) do + X.RegisterMsgMonitor(szChannel, 'MY_ChatMonitor', D.OnMsgArrive) + end + end + D.aCurrentChannel = aChannel +end + +------------------------------------------------------------------------------------------------------- +-- 快捷键设置 +------------------------------------------------------------------------------------------------------- +X.RegisterHotKey('MY_ChatMonitor_Hotkey', _L['MY_ChatMonitor'], function() + if O.bCapture then + if l_uiBtn then + l_uiBtn:Text(_L['start']) + end + O.bCapture = false + else + if l_uiBtn then + l_uiBtn:Text(_L['stop']) + end + O.bCapture = true + end +end, nil) + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChatMonitor', D.Init) + +X.RegisterUserSettingsRelease('MY_ChatMonitor', function() + D.bReady = false + D.RegisterMsgMonitor() +end) +X.RegisterExit('MY_ChatMonitor', D.Exit) + +-------------------------------------------------------------------------------- +-- 面板注册 +-------------------------------------------------------------------------------- + +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + + ui:Append('Text', { x = 22, y = 15, w = 100, h = 25, text = _L['key words:'] }) + + ui:Append('WndComboBox', { + x = 80, y = 15, w = nW - 246, h = 25, + text = _L['Click to config monitors'], + menu = function() + local aKeyword = O.aKeyword + local menu = { bAlignWidth = true } + for i, p in ipairs(aKeyword) do + local m = {} + X.InsertMsgTypeMenu(m, function(szMsgType) + return { + fnAction = function(szChannel) + p.tChannel[szChannel] = not p.tChannel[szChannel] + O.aKeyword = aKeyword + D.RegisterMsgMonitor() + end, + bChecked = p.tChannel[szMsgType], + } + end) + for _, mm in ipairs(m) do + mm.fnDisable = function() + return not p.bEnable + end + end + table.insert(m, 1, X.CONSTANT.MENU_DIVIDER) + table.insert(m, 1, { + szOption = _L['Edit'], + fnAction = function() + GetUserInput(_L['Please input keyword:'], function(szText) + szText = X.TrimString(szText) + if X.IsEmpty(szText) then + return + end + p.szKeyword = szText + O.aKeyword = aKeyword + D.RegisterMsgMonitor() + end, nil, nil, nil, p.szKeyword) + end, + }) + table.insert(m, 1, X.CONSTANT.MENU_DIVIDER) + table.insert(m, 1, { + szOption = _L['Enable'], + bCheck = true, bChecked = p.bEnable, + fnAction = function() + p.bEnable = not p.bEnable + O.aKeyword = aKeyword + D.RegisterMsgMonitor() + end, + }) + table.insert(m, X.CONSTANT.MENU_DIVIDER) + table.insert(m, { + szOption = _L['regular expression'], + bCheck = true, bChecked = p.bIsRegexp, + fnAction = function() + if p.bIsRegexp or IsShiftKeyDown() then + p.bIsRegexp = not p.bIsRegexp + O.aKeyword = aKeyword + else + MessageBox({ + szName = 'MY_ChatMonitor_Regexp', + szMessage = _L['Are you sure you want to turn on regex mode?\nRegex is something advanced, make sure you know what you are doing.\nHold shift key next time to skip this alert.'], + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + p.bIsRegexp = not p.bIsRegexp + O.aKeyword = aKeyword + end, + }, + { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + }) + end + end, + fnDisable = function() return not p.bEnable end, + }) + table.insert(m, X.CONSTANT.MENU_DIVIDER) + table.insert(m, { + szOption = _L['Delete'], + fnAction = function() + table.remove(aKeyword, i) + O.aKeyword = aKeyword + O.aKeyword = aKeyword + D.RegisterMsgMonitor() + X.UI.ClosePopupMenu() + end, + }) + m.szOption = p.szKeyword + table.insert(menu, m) + end + if #menu > 0 then + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + table.insert(menu, { + szOption = _L['Add'], + fnAction = function() + GetUserInput(_L['Please input keyword:'], function(szText) + szText = X.TrimString(szText) + if X.IsEmpty(szText) then + return + end + table.insert(aKeyword, { + szKeyword = szText, + bEnable = true, + bIsRegexp = false, + tChannel = X.Clone(DEFAULE_CHANNEL), + }) + O.aKeyword = aKeyword + O.aKeyword = aKeyword + D.RegisterMsgMonitor() + end) + end, + }) + return menu + end, + }) + + ui:Append('Image', { + image = 'UI/Image/UICommon/Commonpanel2.UITex', imageFrame = 48, + x = nW - 160, y = 18, w = 20, h = 20, alpha = 180, + onHover = function(bIn) this:SetAlpha(bIn and 255 or 180) end, + onClick = function() + local szText = GetFormatText(_L['CHAT_MONITOR_TIP'], 162) + local x, y = Cursor.GetPos() + local w, h = this:GetSize() + OutputTip(szText, 450, {x, y, w, h}) + end, + }) + + ui:Append('WndButton', { + x = nW - 26, y = 15, w = 25, h = 25, + buttonStyle = 'OPTION', + menu = function() + local t = { + { + szOption = _L['timestrap format'], { + szOption = '[%hh:%mm:%ss]', + fnAction = function() + O.szTimestrap = '[%hh:%mm:%ss]' + end, + bCheck = true, bMCheck = true, + bChecked = O.szTimestrap == '[%hh:%mm:%ss]' + }, { + szOption = '[%MM/%dd %hh:%mm:%ss]', + fnAction = function() + O.szTimestrap = '[%MM/%dd %hh:%mm:%ss]' + end, + bCheck = true, bMCheck = true, + bChecked = O.szTimestrap == '[%MM/%dd %hh:%mm:%ss]' + }, { + szOption = _L['custom'], + fnAction = function() + GetUserInput(_L['custom timestrap (eg:[%yyyy/%MM/%dd_%hh:%mm:%ss])'], function(szText) + O.szTimestrap = szText + end, nil, nil, nil, O.szTimestrap) + end, + }, + }, + { + szOption = _L['max record count'], + fnAction = function() + GetUserInputNumber(O.nMaxRecord, 1000, nil, function(val) + O.nMaxRecord = val or O.nMaxRecord + end, nil, function() return not X.Panel.IsVisible() end) + end, + }, + { + szOption = _L['show message preview box'], + fnAction = function() + O.bShowPreview = not O.bShowPreview + end, + bCheck = true, + bChecked = O.bShowPreview + }, + { + szOption = _L['play new message alert sound'], + fnAction = function() + O.bPlaySound = not O.bPlaySound + end, + bCheck = true, + bChecked = O.bPlaySound + }, + { + szOption = _L['output to system channel'], + fnAction = function() + O.bRedirectSysChannel = not O.bRedirectSysChannel + end, + bCheck = true, + bChecked = O.bRedirectSysChannel + }, + { + szOption = _L['ignore same message'], + fnAction = function() + O.bIgnoreSame = not O.bIgnoreSame + end, + bCheck = true, + bChecked = O.bIgnoreSame + } + } + if IsShiftKeyDown() then + -- table.insert(t, { + -- szOption = _L['Realtime save'], + -- fnAction = function() + -- O.bRealtimeSave = not O.bRealtimeSave + -- end, + -- bCheck = true, + -- bChecked = O.bRealtimeSave + -- }) + table.insert(t, { + szOption = _L['Distinct server'], + fnAction = function() + O.bDistinctServer = not O.bDistinctServer + D.LoadData() + X.Panel.SwitchTab('MY_ChatMonitor', true) + end, + bCheck = true, + bChecked = O.bDistinctServer + }) + end + return t + end, + }) + + l_uiBtn = ui:Append('WndButton', { + name = 'Button_ChatMonitor_Switcher', + x = nW - 134, y = 15, w = 50, h = 25, + buttonStyle = 'FLAT', + text = (O.bCapture and _L['stop']) or _L['start'], + onClick = function() + if O.bCapture then + X.UI(this):Text(_L['start']) + O.bCapture = false + else + X.UI(this):Text(_L['stop']) + O.bCapture = true + end + end, + }) + + ui:Append('WndButton', { + x = nW - 79, y = 15, w = 50, h = 25, + buttonStyle = 'FLAT', + text = _L['clear'], + onClick = function() + RECORD_LIST = {} + RECORD_HASH = {} + l_uiBoard:Clear() + end, + }) + + l_uiBoard = ui:Append('WndScrollHandleBox', { + name = 'WndScrollHandleBox_TalkList', + x = 20, y = 50, w = nW - 21, h = nH - 70, handleStyle = 3, + }) + + for i = 1, #RECORD_LIST, 1 do + l_uiBoard:Append(D.GetHTML(RECORD_LIST[i])) + end + l_uiBoard:Scroll(100) +end + +function PS.OnPanelDeactive() + l_uiBtn = nil + l_uiBoard = nil +end + +X.Panel.Register(_L['Chat'], 'MY_ChatMonitor', _L['MY_ChatMonitor'], 'UI/Image/Minimap/Minimap.UITex|197', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatMosaics.lua b/MY_Chat/src/MY_ChatMosaics.lua new file mode 100644 index 000000000..76b60d34f --- /dev/null +++ b/MY_Chat/src/MY_ChatMosaics.lua @@ -0,0 +1,334 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天栏姓名一键打码 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatMosaics' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatMosaics' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['Chat'], { + tIgnoreNames = { -- 忽略名单 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMosaics'], + szDescription = X.MakeCaption({ + _L['unmosaics names (split by comma)'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, + nMosaicsMode = { -- 局部打码模式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMosaics'], + szDescription = X.MakeCaption({ + _L['mosaics mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 4, + }, + bIgnoreOwnName = { -- 不打码自己的名字 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatMosaics'], + szDescription = X.MakeCaption({ + _L['no mosaics on my own name'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + bEnabled = false, -- 启用状态 + szMosaics = _L.MOSAICS_CHAR, -- 马赛克字符 +} + +function D.OnMosaicsEnable() + if not D.tSysHeadTopState then + D.tSysHeadTopState = { + ['OTHERPLAYER_NAME' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.NAME ), + ['OTHERPLAYER_GUILD' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.GUILD), + ['CLIENTPLAYER_NAME' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME ), + ['CLIENTPLAYER_GUILD'] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD), + } + end + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, false) +end + +function D.OnMosaicsDisable() + if D.tSysHeadTopState then + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.NAME , D.tSysHeadTopState['OTHERPLAYER_NAME']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.GUILD, D.tSysHeadTopState['OTHERPLAYER_GUILD']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , D.tSysHeadTopState['CLIENTPLAYER_NAME']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, D.tSysHeadTopState['CLIENTPLAYER_GUILD']) + D.tSysHeadTopState = nil + end +end + +X.RegisterExit('MY_ChatMosaics', D.OnMosaicsDisable) + +function D.ResetMosaics() + -- re mosaics + D.bForceUpdate = true + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + D.Mosaics(hFrame:Lookup('Wnd_Message', 'Handle_Message')) + end + end + D.bForceUpdate = nil + -- hook chat panel + if D.bEnabled then + X.HookChatPanel('AFTER', 'MY_ChatMosaics', function(h, nIndex) + D.Mosaics(h, nIndex) + end) + D.OnMosaicsEnable() + else + X.HookChatPanel('AFTER', 'MY_ChatMosaics', false) + D.OnMosaicsDisable() + end + FireUIEvent('ON_MY_MOSAICS_RESET') +end + +function D.NameLink_GetText(h, ...) + return h.__MY_ChatMosaics_szText or h.__MY_ChatMosaics_GetText(h, ...) +end + +function D.MosaicsString(szText) + if not D.bEnabled then + return szText + end + local bQuote = szText:sub(1, 1) == '[' and szText:sub(-1, -1) == ']' + if bQuote then + szText = szText:sub(2, -2) -- 去掉[]括号 + end + if (not O.bIgnoreOwnName or szText ~= X.GetClientPlayer().szName) and not O.tIgnoreNames[szText] then + local nLen = X.StringLenW(szText) + if O.nMosaicsMode == 3 and nLen > 2 then + szText = X.StringSubW(szText, 1, 1) .. string.rep(D.szMosaics, nLen - 2) .. X.StringSubW(szText, nLen, nLen) + elseif O.nMosaicsMode == 1 and nLen > 1 then + szText = X.StringSubW(szText, 1, 1) .. string.rep(D.szMosaics, nLen - 1) + elseif O.nMosaicsMode == 2 and nLen > 1 then + szText = string.rep(D.szMosaics, nLen - 1) .. X.StringSubW(szText, nLen, nLen) + elseif O.nMosaicsMode == 4 or nLen <= 1 then + szText = string.rep(D.szMosaics, nLen) + else + szText = X.StringSubW(szText, 1, 1) .. string.rep(D.szMosaics, nLen - 1) + end + end + if bQuote then + szText = '[' .. szText .. ']' -- 加回[]括号 + end + return szText +end + +function D.Mosaics(h, nPos, nLen) + if not h then + return + end + if h:GetType() == 'Text' then + if D.bEnabled then + if not h.__MY_ChatMosaics_szText or D.bForceUpdate then + h.__MY_ChatMosaics_szText = h.__MY_ChatMosaics_szText or h:GetText() + if not h.__MY_ChatMosaics_GetText then + h.__MY_ChatMosaics_GetText = h.GetText + h.GetText = D.NameLink_GetText + end + h:SetText(D.MosaicsString(h.__MY_ChatMosaics_szText)) + h:AutoSize() + end + else + if h.__MY_ChatMosaics_GetText then + h.GetText = h.__MY_ChatMosaics_GetText + h.__MY_ChatMosaics_GetText = nil + end + if h.__MY_ChatMosaics_szText then + h:SetText(h.__MY_ChatMosaics_szText) + h.__MY_ChatMosaics_szText = nil + h:AutoSize() + end + end + elseif h:GetType() == 'Handle' then + local nEndPos = (nLen and (nPos + nLen)) or (h:GetItemCount() - 1) + for i = nPos or 0, nEndPos do + local hItem = h:Lookup(i) + if hItem and (hItem:GetName():sub(0, 9)) == 'namelink_' then + D.Mosaics(hItem) + end + end + h:FormatAllItemPos() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatMosaics', + exports = { + { + preset = 'UIEvent', + fields = { + 'Mosaics', + 'MosaicsString', + 'bEnabled', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'bEnabled', + }, + triggers = { + bEnabled = function () + D.ResetMosaics() + end, + }, + root = D, + }, + }, +} +MY_ChatMosaics = X.CreateModule(settings) +end + +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nX, nY = 20, 30 + + ui:Append('WndCheckBox', { + text = _L['chat mosaics (mosaics names in chat panel)'], + x = nX, y = nY, w = 400, + checked = MY_ChatMosaics.bEnabled, + onCheck = function(bCheck) + MY_ChatMosaics.bEnabled = bCheck + D.ResetMosaics() + end, + }) + nY = nY + 30 + + ui:Append('WndCheckBox', { + text = _L['no mosaics on my own name'], + x = nX, y = nY, w = 400, + checked = O.bIgnoreOwnName, + onCheck = function(bCheck) + O.bIgnoreOwnName = bCheck + D.ResetMosaics() + end, + }) + nY = nY + 30 + + ui:Append('WndRadioBox', { + text = _L['part mosaics A (mosaics except 1st and last character)'], + x = nX, y = nY, w = 400, + group = 'PART_MOSAICS', + checked = O.nMosaicsMode == 1, + onCheck = function(bCheck) + if bCheck then + O.nMosaicsMode = 1 + D.ResetMosaics() + end + end, + }) + nY = nY + 30 + + ui:Append('WndRadioBox', { + text = _L['part mosaics B (mosaics except 1st character)'], + x = nX, y = nY, w = 400, + group = 'PART_MOSAICS', + checked = O.nMosaicsMode == 2, + onCheck = function(bCheck) + if bCheck then + O.nMosaicsMode = 2 + D.ResetMosaics() + end + end, + }) + nY = nY + 30 + + ui:Append('WndRadioBox', { + text = _L['part mosaics C (mosaics except last character)'], + x = nX, y = nY, w = 400, + group = 'PART_MOSAICS', + checked = O.nMosaicsMode == 3, + onCheck = function(bCheck) + if bCheck then + O.nMosaicsMode = 3 + D.ResetMosaics() + end + end, + }) + nY = nY + 30 + + ui:Append('WndRadioBox', { + text = _L['part mosaics D (mosaics all character)'], + x = nX, y = nY, w = 400, + group = 'PART_MOSAICS', + checked = O.nMosaicsMode == 4, + onCheck = function(bCheck) + if bCheck then + O.nMosaicsMode = 4 + D.ResetMosaics() + end + end, + }) + nY = nY + 30 + + ui:Append('WndEditBox', { + placeholder = _L['mosaics character'], + x = nX, y = nY, w = nW - 2 * nX, h = 25, + text = D.szMosaics, + onChange = function(szText) + if szText == '' then + D.szMosaics = _L.MOSAICS_CHAR + else + D.szMosaics = szText + end + D.ResetMosaics() + end, + }) + nY = nY + 30 + + ui:Append('WndEditBox', { + placeholder = _L['unmosaics names (split by comma)'], + x = nX, y = nY, w = nW - 2 * nX, h = nH - nY - 50, + text = (function() + local t = {} + for szName, _ in pairs(O.tIgnoreNames) do + table.insert(t, szName) + end + table.concat(t, ',') + end)(), + onChange = function(szText) + local tIgnoreNames = {} + for _, szName in ipairs(X.SplitString(szText, ',')) do + tIgnoreNames[szName] = true + end + O.tIgnoreNames = tIgnoreNames + D.ResetMosaics() + end, + }) + nY = nY + 30 +end + +X.Panel.Register(_L['Chat'], 'MY_Chat_ChatMosaics', _L['chat mosaics'], 'ui/Image/UICommon/yirong3.UITex|50', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_ChatSwitch.lua b/MY_Chat/src/MY_ChatSwitch.lua new file mode 100644 index 000000000..959351619 --- /dev/null +++ b/MY_Chat/src/MY_ChatSwitch.lua @@ -0,0 +1,797 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天频道切换 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_ChatSwitch' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatSwitch' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['Chat'], { + bDisplayPanel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['display panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 10, y = -60, s = 'BOTTOMLEFT', r = 'BOTTOMLEFT' }, + }, + bLockPostion = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['lock postion'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tChennalVisible = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['channel setting'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, + aWhisper = { + ePathType = X.PATH_TYPE.ROLE, + bUserData = true, + xSchema = X.Schema.Collection( + X.Schema.Tuple( + X.Schema.String, -- szName + X.Schema.Collection( -- aHistory + X.Schema.OneOf( + X.Schema.String, -- szMsg + X.Schema.Tuple(X.Schema.String, X.Schema.Number) -- szMsg, nTime + ) + ) + ) + ), + xDefaultValue = {}, + }, + szAway = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['away message'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + szBusy = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['busy message'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + tChannelCount = { + ePathType = X.PATH_TYPE.ROLE, + bUserData = true, + xSchema = X.Schema.Record({ + szDate = X.Schema.String, + tCount = X.Schema.Map(X.Schema.Number, X.Schema.Number), + }), + xDefaultValue = { + szDate = '', + tCount = {}, + }, + }, + bAutoSwitchBfChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_ChatSwitch'], + _L['Auto switch talk channel when into battle field'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Chat/ui/MY_ChatSwitch.ini' +local CD_REFRESH_OFFSET = 7 * 60 * 60 -- 7点更新CD + +local function UpdateChannelDailyLimit(hRadio, bPlus) + local me = X.GetClientPlayer() + local shaCount = hRadio and hRadio.shaCount + if not (me and shaCount) then + return + end + + local dwPercent = 1 + local info = hRadio.info + local nChannel = info.channel + if nChannel then + local szDate = X.FormatTime(GetCurrentTime() - CD_REFRESH_OFFSET, '%yyyy%MM%dd') + local tChannelCount = D.tChannelCount + if tChannelCount.szDate ~= szDate then + tChannelCount = { + szDate = szDate, + tCount = {}, + } + D.tChannelCount = tChannelCount + D.bChannelCountChanged = true + end + local nDailyCount = (tChannelCount.tCount[nChannel] or 0) + (bPlus and 1 or 0) + if nDailyCount ~= tChannelCount.tCount[nChannel] then + tChannelCount.tCount[nChannel] = nDailyCount + D.bChannelCountChanged = true + end + local nDailyLimit = X.GetChatChannelDailyLimit(me.nLevel, nChannel) + if nDailyLimit then + if nDailyLimit > 0 then + dwPercent = (nDailyLimit - nDailyCount) / nDailyLimit + hRadio.szTip = GetFormatText(_L('Today: %d\nDaily limit: %d', nDailyCount, nDailyLimit), nil, 255, 255, 0) + else + hRadio.szTip = GetFormatText(_L('Today: %d\nDaily limit: no limitation', nDailyCount), nil, 255, 255, 0) + end + end + end + X.UI(shaCount):DrawCircle(nil, nil, nil, info.color[1], info.color[2], info.color[3], 100, math.pi / 2, math.pi * 2 * dwPercent) +end + +local CHANNEL_LIST = { + { -- 说 + id = 'nearby', + title = _L['SAY'], + channel = PLAYER_TALK_CHANNEL.NEARBY, + cd = 0, + color = {255, 255, 255}, + }, + { -- 地 + id = 'sence', + title = _L['MAP'], + channel = PLAYER_TALK_CHANNEL.SENCE, + cd = 10, + color = {255, 126, 126}, + }, + { -- 世 + id = 'world', + title = _L['WORLD'], + channel = PLAYER_TALK_CHANNEL.WORLD, + cd = 60, + color = {252, 204, 204}, + }, + { -- 队 + id = 'team', + title = _L['PARTY'], + channel = PLAYER_TALK_CHANNEL.TEAM, + cd = 0, + color = {140, 178, 253}, + }, + { -- 团 + id = 'raid', + title = _L['TEAM'], + channel = PLAYER_TALK_CHANNEL.RAID, + cd = 0, + color = { 73, 168, 241}, + }, + { -- 房 + id = 'room', + title = _L['ROOM'], + channel = PLAYER_TALK_CHANNEL.ROOM, + cd = 0, + color = { 73, 168, 241}, + }, + { -- 战 + id = 'battle_field', + title = _L['BATTLE'], + channel = PLAYER_TALK_CHANNEL.BATTLE_FIELD, + cd = 0, + color = {255, 126, 126}, + }, + { -- 帮 + id = 'tong', + title = _L['FACTION'], + channel = PLAYER_TALK_CHANNEL.TONG, + cd = 0, + color = { 0, 200, 72}, + }, + { -- 派 + id = 'force', + title = _L['SCHOOL'], + channel = PLAYER_TALK_CHANNEL.FORCE, + cd = 20, + color = { 0, 255, 255}, + }, + { -- 阵 + id = 'camp', + title = _L['CAMP'], + channel = PLAYER_TALK_CHANNEL.CAMP, + cd = 30, + color = {155, 230, 58}, + }, + { -- 友 + id = 'friends', + title = _L['FRIEND'], + channel = PLAYER_TALK_CHANNEL.FRIENDS, + cd = 10, + color = {241, 114, 183}, + }, + { -- 盟 + id = 'tong_alliance', + title = _L['ALLIANCE'], + channel = PLAYER_TALK_CHANNEL.TONG_ALLIANCE, + cd = 0, + color = {178, 240, 164}, + }, + { -- 密 + id = 'whisper', + title = _L['WHISPER'], + channel = PLAYER_TALK_CHANNEL.WHISPER, + cd = 0, + onClick = function() + if IsCtrlKeyDown() then + GetUserInput(_L['Please input whisper name'], function(szName) + if szName == '' then + return + end + X.SwitchChatChannel(szName) + X.DelayCall(X.FocusChatInput) + end, nil, nil, nil, '') + else + local t = {} + for i, whisper in ipairs(D.aWhisper) do + local info = MY_Farbnamen and MY_Farbnamen.Get(whisper[1]) + table.insert(t, { + szOption = whisper[1], + rgb = info and info.rgb or {202, 126, 255}, + fnAction = function() + X.SwitchChatChannel(whisper[1]) + X.DelayCall(X.FocusChatInput) + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + for i = #D.aWhisper, 1, -1 do + if D.aWhisper[i][1] == whisper[1] then + table.remove(D.aWhisper, i) + X.UI.ClosePopupMenu() + end + end + O.aWhisper = D.aWhisper + D.bWhisperChanged = false + end, + fnMouseEnter = function() + local t = {} + local today = X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd') + local r, g, b = GetMsgFontColor('MSG_WHISPER') + for _, v in ipairs(whisper[2]) do + if X.IsString(v) then + table.insert(t, v) + elseif X.IsTable(v) and X.IsString(v[1]) then + if today == X.FormatTime(v[2], '%yyyy%MM%dd') then + table.insert(t, X.GetChatTimeXML(v[2], {r = r, g = g, b = b, s = '[%hh:%mm:%ss]'}) .. v[1]) + else + table.insert(t, X.GetChatTimeXML(v[2], {r = r, g = g, b = b, s = '[%M.%dd.%hh:%mm:%ss]'}) .. v[1]) + end + end + end + local szMsg = table.concat(t, '') + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen then + szMsg = MY_Farbnamen.Render(szMsg) + end + OutputTip(szMsg, 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + }) + end + local x, y = this:GetAbsPos() + t.x = x + t.y = y - #D.aWhisper * 24 - 24 - 20 - 8 + if #t > 0 then + table.insert(t, 1, X.CONSTANT.MENU_DIVIDER) + table.insert(t, 1, { + szOption = g_tStrings.CHANNEL_WHISPER_SIGN, + rgb = {202, 126, 255}, + fnAction = function() + X.SwitchChatChannel(PLAYER_TALK_CHANNEL.WHISPER) + X.DelayCall(X.FocusChatInput) + end, + }) + PopupMenu(t) + else + X.SwitchChatChannel(PLAYER_TALK_CHANNEL.WHISPER) + end + end + this:Check(false) + end, + color = {202, 126, 255}, + }, + { -- 清 + id = 'cls', + title = _L['CLS'], + onClick = function() + local function Cls(bAll) + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + local hFrame = X.GetChatPanel(k) + if hFrame then + local h = hFrame:Lookup('Wnd_Message', 'Handle_Message') + local hCheck = hFrame:Lookup('CheckBox_Title') + if h and (bAll or (hCheck and hCheck:IsCheckBoxChecked())) then + h:Clear() + h:FormatAllItemPos() + end + end + end + end + if IsCtrlKeyDown() then + Cls() + elseif IsAltKeyDown() then + MessageBox({ + szName = 'CLS_CHATPANEL_ALL', + szMessage = _L['Are you sure you want to clear all message panel?'], { + szOption = g_tStrings.STR_HOTKEY_SURE, fnAction = function() + Cls(true) + end + }, { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + }) + else + MessageBox({ + szName = 'CLS_CHATPANEL', + szMessage = _L['Are you sure you want to clear current message panel?\nPress CTRL when click can clear without alert.\nPress ALT when click can clear all window.'], { + szOption = g_tStrings.STR_HOTKEY_SURE, fnAction = function() + Cls() + end + }, { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + }) + end + X.UI(this):Check(false) + end, + color = {255, 0, 0}, + }, + { -- 离 + id = 'away', + title = _L['AWAY'], + onCheck = function() + X.SwitchChatChannel('/afk') + local edit = X.GetChatInput() + if edit then + edit:GetRoot():Show() + if edit:GetText() == '' then + edit:InsertText( + X.IsEmpty(O.szAway) + and g_tStrings.STR_AUTO_REPLAY_LEAVE + or O.szAway + ) + edit:SelectAll() + end + Station.SetFocusWindow(edit) + end + end, + onUncheck = function() + X.SwitchChatChannel('/cafk') + end, + tip = function() + return X.IsEmpty(O.szAway) + and g_tStrings.STR_AUTO_REPLAY_LEAVE + or O.szAway + end, + color = {255, 255, 255}, + }, + { -- 扰 + id = 'busy', + title = _L['BUSY'], + onCheck = function() + X.SwitchChatChannel('/atr') + local edit = X.GetChatInput() + if edit then + edit:GetRoot():Show() + if edit:GetText() == '' then + edit:InsertText( + X.IsEmpty(O.szBusy) + and g_tStrings.STR_AUTO_REPLAY_LEAVE + or O.szBusy + ) + edit:SelectAll() + end + Station.SetFocusWindow(edit) + end + end, + onUncheck = function() + X.SwitchChatChannel('/catr') + end, + tip = function() + return X.IsEmpty(O.szBusy) + and g_tStrings.STR_AUTO_REPLAY_LEAVE + or O.szBusy + end, + color = {255, 255, 255}, + }, + { -- 马 + id = 'mosaics', + title = _L['MOSAICS'], + onCheck = function() + MY_ChatMosaics.bEnabled = true + end, + onUncheck = function() + MY_ChatMosaics.bEnabled = false + end, + color = {255, 255, 255}, + }, +} + +local CHANNEL_CD_TIME = {} +for i, v in ipairs(CHANNEL_LIST) do + if v.channel then + CHANNEL_CD_TIME[v.channel] = v.cd + end +end +local m_tChannelTime = {} + +local function OnChannelCheck() + X.SwitchChatChannel(this.info.channel) + local edit = X.GetChatInput() + if edit then + edit:GetRoot():Show() + Station.SetFocusWindow(edit) + end + this:Check(false) +end + +function D.ApplyBattlefieldChannelSwitch() + -- 名剑大会自动切换团队频道 + if O.bAutoSwitchBfChannel then + X.RegisterEvent('LOADING_ENDING', 'MY_ChatSwitch__AutoSwitchBattlefieldChannel', function() + local bIsBattleField = (X.GetClientPlayer().GetScene().nType == MAP_TYPE.BATTLE_FIELD) + local nChannel, szName = EditBox_GetChannel() + if bIsBattleField and (nChannel == PLAYER_TALK_CHANNEL.RAID or nChannel == PLAYER_TALK_CHANNEL.TEAM) then + D.nJJCAutoSwitchChatChannel_OrgChannel = nChannel + X.SwitchChatChannel(PLAYER_TALK_CHANNEL.BATTLE_FIELD) + elseif not bIsBattleField and nChannel == PLAYER_TALK_CHANNEL.BATTLE_FIELD then + X.SwitchChatChannel(D.nJJCAutoSwitchChatChannel_OrgChannel or PLAYER_TALK_CHANNEL.RAID) + end + end) + else + X.RegisterEvent('LOADING_ENDING', 'MY_ChatSwitch__AutoSwitchBattlefieldChannel') + end +end + +function D.OnFrameCreate() + this.tRadios = {} + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('PLAYER_SAY') + this:RegisterEvent('LOADING_ENDING') + this:EnableDrag(not O.bLockPostion) + + local nWidth, nHeight = 0, 0 + local container = this:Lookup('WndContainer_Radios') + container:Clear() + for i, v in ipairs(CHANNEL_LIST) do + if O.tChennalVisible[v.id] ~= false then + local wnd, chk, txtTitle, txtCooldown, shaCount + if v.onClick then + wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Channel') + chk = wnd:Lookup('WndRadioChannel') + txtTitle = chk:Lookup('', 'Text_Channel') + txtCooldown = chk:Lookup('', 'Text_CD') + shaCount = chk:Lookup('', 'Shadow_Count') + chk.OnCheckBoxCheck = v.onClick + elseif v.channel and X.CONSTANT.PLAYER_TALK_CHANNEL_HEADER[v.channel] then + wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Channel') + chk = wnd:Lookup('WndRadioChannel') + txtTitle = chk:Lookup('', 'Text_Channel') + txtCooldown = chk:Lookup('', 'Text_CD') + shaCount = chk:Lookup('', 'Shadow_Count') + chk.OnCheckBoxCheck = OnChannelCheck + elseif v.onCheck or v.onUncheck then + wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_CheckBox') + chk = wnd:Lookup('WndCheckBox') + txtTitle = chk:Lookup('', 'Text_CheckBox') + chk.OnCheckBoxCheck = v.onCheck + chk.OnCheckBoxUncheck = v.onUncheck + end + if wnd and chk then + wnd:SetRelX(nWidth) + nWidth = nWidth + math.ceil(wnd:GetW()) + nHeight = math.max(nHeight, math.ceil(wnd:GetH())) + chk.txtTitle = txtTitle + chk.txtCooldown = txtCooldown + chk.shaCount = shaCount + if v.channel then + this.tRadios[v.channel] = chk + end + if v.tip then + X.UI(chk):Tip(v.tip, X.UI.TIP_POSITION.CENTER) + end + if txtTitle then + txtTitle:SetText(v.title) + txtTitle:SetFontScheme(197) + txtTitle:SetFontColor(unpack(v.color or {255, 255, 255})) + end + if txtCooldown then + txtCooldown:SetText('') + txtCooldown:SetFontScheme(197) + txtCooldown:SetFontColor(unpack(v.color or {255, 255, 255})) + end + if shaCount then + X.UI(shaCount):DrawCircle(0, 0, 0) + end + chk.info = v + UpdateChannelDailyLimit(chk) + end + end + end + container:SetSize(nWidth, nHeight) + + this:Lookup('', 'Image_Bar'):SetW(nWidth + 35) + this:SetW(nWidth + 60) + D.UpdateAnchor(this) +end + +function D.OnEvent(event) + if event == 'PLAYER_SAY' then + local szContent, dwTalkerID, nChannel, szName, szMsg = arg0, arg1, arg2, arg3, arg9 + if not X.IsString(arg9) then + szMsg = arg11 + elseif X.IsString(arg11) then + szMsg = #arg9 > #arg11 and arg9 or arg11 + end + if nChannel == PLAYER_TALK_CHANNEL.WHISPER then + local t + for i = #D.aWhisper, 1, -1 do + if D.aWhisper[i][1] == szName then + t = table.remove(D.aWhisper, i) + end + end + while #D.aWhisper > 20 do + table.remove(D.aWhisper, 1) + end + if not t then + t = {szName, {}} + end + while #t[2] > 20 do + table.remove(t[2], 1) + end + table.insert(t[2], {szMsg, GetCurrentTime()}) + table.insert(D.aWhisper, t) + D.bWhisperChanged = true + end + if dwTalkerID ~= X.GetClientPlayerID() then + return + end + local hRadio = this.tRadios[nChannel] + if hRadio then + UpdateChannelDailyLimit(hRadio, true) + m_tChannelTime[nChannel] = GetCurrentTime() + end + elseif event == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif event == 'LOADING_ENDING' then + for nChannel, hRadio in pairs(this.tRadios) do + UpdateChannelDailyLimit(hRadio) + end + end +end + +function D.OnFrameBreathe() + for nChannel, nTime in pairs(m_tChannelTime) do + local nCooldown = (CHANNEL_CD_TIME[nChannel] or 0) - (GetCurrentTime() - nTime) + if nCooldown <= 0 then + m_tChannelTime[nChannel] = nil + end + + local hCheck = this.tRadios[nChannel] + local txtCooldown = hCheck and hCheck.txtCooldown + if txtCooldown then + txtCooldown:SetText(nCooldown > 0 and nCooldown or '') + end + end +end + +function D.OnMouseEnter() + if this.szTip then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(this.szTip, 450, {x, y, w, h}, ALW.RIGHT_LEFT_AND_BOTTOM_TOP) + end +end + +function D.OnMouseLeave() + HideTip() +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Option' then + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_ChatSwitch') + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.anchor = GetFrameAnchor(this) +end + +function D.OnFrameDragSetPosEnd() + this:CorrectPos() +end + +function D.UpdateAnchor(this) + local anchor = O.anchor + this:SetPoint(anchor.s, 0, 0, anchor.r, anchor.x, anchor.y) + this:CorrectPos() +end + +local function OnChatSetAFK() + if type(arg0) == 'table' then + O.szAway = X.StringifyChatText(arg0) + else + O.szAway = arg0 and tostring(arg0) or '' + end +end +X.RegisterEvent('ON_CHAT_SET_AFK', OnChatSetAFK) + +local function OnChatSetATR() + if type(arg0) == 'table' then + O.szBusy = X.StringifyChatText(arg0):sub(4) + else + O.szBusy = arg0 and tostring(arg0) or '' + end +end +X.RegisterEvent('ON_CHAT_SET_ATR', OnChatSetATR) + +function D.ReInitUI() + X.UI.CloseFrame('MY_ChatSwitch') + if not O.bDisplayPanel then + return + end + X.UI.OpenFrame(INI_PATH, 'MY_ChatSwitch') +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['display panel'], + checked = O.bDisplayPanel, + onCheck = function(bChecked) + O.bDisplayPanel = bChecked + D.ReInitUI() + end, + }) + nY = nY + nLH + + nX = nX + 25 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['lock postion'], + checked = O.bLockPostion, + onCheck = function(bChecked) + O.bLockPostion = bChecked + D.ReInitUI() + end, + autoEnable = function() + return O.bDisplayPanel + end, + }) + nY = nY + nLH + + ui:Append('WndComboBox', { + x = nX, y = nY, w = 150, h = 25, + text = _L['channel setting'], + menu = function() + local t = { + szOption = _L['channel setting'], + fnDisable = function() + return not O.bDisplayPanel + end, + } + for i, v in ipairs(CHANNEL_LIST) do + table.insert(t, { + szOption = v.title, rgb = v.color, + bCheck = true, bChecked = O.tChennalVisible[v.id] ~= false, + fnAction = function() + O.tChennalVisible[v.id] = not O.tChennalVisible[v.id] + O.tChennalVisible = O.tChennalVisible + D.ReInitUI() + end, + }) + end + return t + end, + autoEnable = function() + return O.bDisplayPanel + end, + }) + nY = nY + nLH + + nX = nPaddingX + -- 名剑大会频道切换 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto switch talk channel when into battle field'], + checked = O.bAutoSwitchBfChannel, + onCheck = function(bChecked) + O.bAutoSwitchBfChannel = bChecked + D.ApplyBattlefieldChannelSwitch() + end, + }) + nY = nY + nLH + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatSwitch', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + }, +} +MY_ChatSwitch = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChatSwitch__AutoSwitchBattlefieldChannel', function() + D.aWhisper = O.aWhisper + D.tChannelCount = O.tChannelCount + D.ApplyBattlefieldChannelSwitch() +end) + +X.RegisterUserSettingsRelease('MY_ChatSwitch__AutoSwitchBattlefieldChannel', function() + if D.bWhisperChanged then + O.aWhisper = D.aWhisper + end + if D.bChannelCountChanged then + O.tChannelCount = D.tChannelCount + end +end) + +X.RegisterUserSettingsInit('MY_ChatSwitch__UI', D.ReInitUI) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_TalkEx.lua b/MY_Chat/src/MY_TalkEx.lua new file mode 100644 index 000000000..70fcae1be --- /dev/null +++ b/MY_Chat/src/MY_TalkEx.lua @@ -0,0 +1,527 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 喊话辅助 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_TalkEx' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TalkEx' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = { + dwTalkTick = 0, + dwTalkCDTime = 0, +} +local O = X.CreateUserSettingsModule('MY_TalkEx', _L['Chat'], { + szTalkText = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Talk text'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + aTalkChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Talk channel'], + }), + xSchema = X.Schema.Collection(X.Schema.Number), + xDefaultValue = {}, + }, + nTrickChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick channel'], + }), + xSchema = X.Schema.Number, + xDefaultValue = PLAYER_TALK_CHANNEL.RAID, + }, + szTrickFilter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick filter'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'RAID', + }, + nTrickForce = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick force'], + }), + xSchema = X.Schema.Number, + xDefaultValue = X.CONSTANT.FORCE_TYPE.CHUN_YANG, + }, + szTrickTextBegin = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick text begin'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['$zj look around and have a little thought.'], + }, + szTrickText = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick text'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['$zj epilate $mb\'s feather clearly.'], + }, + szTrickTextEnd = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TalkEx'], + szDescription = X.MakeCaption({ + _L['Trick text end'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['$zj collected the feather epilated just now and wanted it sold well.'], + }, +}) + +-------------------------------------------------------------------------- + +local TALK_CHANNEL_LIST = { + { nChannel = PLAYER_TALK_CHANNEL.NEARBY , szID = 'MSG_NORMAL' }, + { nChannel = PLAYER_TALK_CHANNEL.TEAM , szID = 'MSG_PARTY' }, + { nChannel = PLAYER_TALK_CHANNEL.RAID , szID = 'MSG_TEAM' }, + { nChannel = PLAYER_TALK_CHANNEL.TONG , szID = 'MSG_GUILD' }, + { nChannel = PLAYER_TALK_CHANNEL.TONG_ALLIANCE, szID = 'MSG_GUILD_ALLIANCE' }, +} + +local FORCE_LIST = { + -- { dwForceID = -1, szLabel = _L['Everyone'] }, +} +for i, v in pairs(g_tStrings.tForceTitle) do + table.insert(FORCE_LIST, { dwForceID = i, szLabel = v }) +end +table.sort(FORCE_LIST, function(a, b) return a.dwForceID < b.dwForceID end) + +local TRICK_FILTER_LIST = { + -- { szKey = 'NEARBY', szLabel = _L['Nearby players where'] }, + { szKey = 'RAID' , szLabel = _L['Teammates where' ] }, +} + +local TRICK_CHANNEL_LIST = { + { nChannel = PLAYER_TALK_CHANNEL.TEAM , szName = _L['PTC_TEAM_CHANNEL' ], tCol = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.RAID , szName = _L['PTC_RAID_CHANNEL' ], tCol = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.TONG , szName = _L['PTC_TONG_CHANNEL' ], tCol = GetMsgFontColor('MSG_GUILD' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.TONG_ALLIANCE, szName = _L['PTC_TONG_ALLIANCE'], tCol = GetMsgFontColor('MSG_GUILD_ALLIANCE', true) }, +} + +-------------------------------------------------------------------------- + +function D.Talk() + if #O.szTalkText == 0 then + return X.OutputSystemAnnounceMessage(_L['Please input something.'], X.CONSTANT.MSG_THEME.ERROR) + end + -- 调试工具 + if X.ProcessCommand and string.sub(O.szTalkText, 1, 8) == '/script ' then + local szCommand = string.sub(O.szTalkText, 9) + return X.ProcessCommand(szCommand) + end + -- 防止刷屏 + if GetTime() - D.dwTalkTick < 1000 then + return OutputMessage('MSG_ANNOUNCE_YELLOW', _L['You are talking too quick!']) + end + D.dwTalkTick = GetTime() + -- 近聊不放在第一个会导致发不出去 + if X.Contains(O.aTalkChannel, PLAYER_TALK_CHANNEL.NEARBY) then + X.SendChat(PLAYER_TALK_CHANNEL.NEARBY, O.szTalkText) + end + -- 遍历发送队列 + for _, nChannel in ipairs(O.aTalkChannel) do + if nChannel ~= PLAYER_TALK_CHANNEL.NEARBY then + X.SendChat(nChannel, O.szTalkText) + end + end +end +X.RegisterHotKey('MY_TalkEx_Talk', _L['TalkEx Talk'], D.Talk, nil) + +function D.Trick() + if #O.szTrickText == 0 then + return X.OutputSystemMessage(_L['Please input something.'], X.CONSTANT.MSG_THEME.ERROR) + end + local t = {} + local me = X.GetClientPlayer() + if not me then + return + end + if O.szTrickFilter == 'RAID' then + local team = GetClientTeam() + if team and (me.IsInParty() or me.IsInRaid()) then + for _, dwID in ipairs(team.GetTeamMemberList()) do + local info = team.GetMemberInfo(dwID) + if info and (O.nTrickForce == -1 or O.nTrickForce == info.dwForceID) then + table.insert(t, info.szName) + end + end + end + elseif O.szTrickFilter == 'NEARBY' then + for _, p in ipairs(X.GetNearPlayer()) do + if O.nTrickForce == -1 or O.nTrickForce == p.dwForceID then + table.insert(t, p.szName) + end + end + end + -- 去掉自己 _(:з」∠)_调侃自己是闹哪样 + for i = #t, 1, -1 do + if t[i] == me.szName then + table.remove(t, i) + end + end + -- none target + if #t == 0 then + return X.OutputSystemAnnounceMessage(_L['No trick target found.'], X.CONSTANT.MSG_THEME.ERROR) + end + -- start tricking + if #O.szTrickTextBegin > 0 then + X.SendChat(O.nTrickChannel, O.szTrickTextBegin) + end + -- for _, szName in ipairs(t) do + -- X.SendChat(O.nTrickChannel, (O.szTrickText:gsub('%$mb', '[' .. szName .. ']'))) + -- end + for i, szName in ipairs(t) do + t[i] = '[' .. szName .. ']' + end + X.SendChat(O.nTrickChannel, (O.szTrickText:gsub('%$mb', table.concat(t, _L.SLIGHT_PAUSE_MARK)))) + if #O.szTrickTextEnd > 0 then + X.SendChat(O.nTrickChannel, O.szTrickTextEnd) + end + D.dwTalkCDTime = GetTime() +end + +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY, LH = 25, 20, 30 + local nX, nY, nLFY = nPaddingX, nPaddingY, nPaddingY + + ------------------------------------- + -- 喊话部分 + ------------------------------------- + -- 喊话输入框 + ui:Append('WndEditBox', { + x = nX, y = nY, + w = nW - 136, h = 148, multiline = true, + text = O.szTalkText, + onChange = function(text) + O.szTalkText = text + end, + }) + -- 喊话频道 + nY = nPaddingY + local nChannelCount = #TALK_CHANNEL_LIST + for i, p in ipairs(TALK_CHANNEL_LIST) do + ui:Append('WndCheckBox', { + x = nW - 110, y = nY + (i - 1) * 120 / nChannelCount, + text = g_tStrings.tChannelName[p.szID], + color = GetMsgFontColor(p.szID, true), + checked = X.Contains(O.aTalkChannel, p.nChannel), + onCheck = function(bCheck) + for i, v in X.ipairs_r(O.aTalkChannel) do + if v == p.nChannel then + table.remove(O.aTalkChannel, i) + end + end + if bCheck then + table.insert(O.aTalkChannel, p.nChannel) + end + O.aTalkChannel = O.aTalkChannel + end, + }) + end + -- 喊话按钮 + nY = nY + 122 + ui:Append('WndButton', { + x = nW - 110, y = nY, w = 90, + text = _L['Send'], + onLClick = function() + if IsCtrlKeyDown() or IsAltKeyDown() or IsShiftKeyDown() then + X.SetChatInput(O.szTalkText) + X.FocusChatInput() + else + D.Talk() + end + end, + onRClick = function() + X.SetChatInput(O.szTalkText) + X.FocusChatInput() + end, + }) + + ------------------------------------- + -- 骚话部分 + ------------------------------------- + --
+ nX = nPaddingX + nY = nY + 40 + ui:Append('Shadow', { x = nPaddingX, y = nY, w = nW - nPaddingX * 2, h = 1, color = {255, 255, 255}, alpha = 128 }) + -- 文本标题 + nY = nY + 5 + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', h = 25, text = _L['Joke talk'] }):Width() + 5 + -- 骚话内容搜索输入框 + nX = nPaddingX + nY = nY + LH + nX = ui:Append('WndEditBox', { + x = nX, y = nY, + w = 150, h = 25, + text = D.szJokeSearch, + onChange = function(szText) + D.szJokeSearch = szText + end, + }):Pos('BOTTOMRIGHT') + 5 + -- 骚话内容搜索按钮 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + w = 'auto', h = 25, + text = _L['Search'], + onClick = function() + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/joke/random', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + q = D.szJokeSearch or '', + }, + signature = X.SECRET['J3CX::JOKE_RANDOM'], + success = function(html, status) + local res = X.DecodeJSON(html) + if X.IsTable(res) then + ui:Fetch('WndEditBox_JokeText'):Text(res.data.content) + end + end, + }) + end, + tip = { + render = _L['Click to search jokes.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + -- 骚话复制按钮 + nX = ui:Append('WndButton', { + x = nX, y = nY, + w = 'auto', h = 25, + text = _L['Copy'], + onClick = function() + X.SetChatInput(D.szJokeText) + X.FocusChatInput() + end, + autoEnable = function() return not X.IsEmpty(D.szJokeText) end, + tip = { + render = _L['Click to copy joke to chat panel.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Pos('BOTTOMRIGHT') + 5 + -- 骚话分享按钮 + nX = ui:Append('WndButton', { + x = nX, y = nY, + w = 'auto', h = 25, + text = _L['Share'], + onClick = function() + local function fnAction(bAnonymous) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/joke', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + content = D.szJokeText or '', + server = X.GetServerOriginName(), + role = bAnonymous and '' or X.GetClientPlayerName(), + id = bAnonymous and '' or X.GetClientPlayerID(), + jx3id = bAnonymous and '' or X.GetClientPlayerGlobalID(), + }, + signature = X.SECRET['J3CX::JOKE'], + success = function(html, status) + local res = X.DecodeJSON(html) + if X.IsTable(res) then + X.Alert(X.ReplaceSensitiveWord(res.msg)) + else + X.OutputSystemAnnounceMessage(_L['Share error: server error.'], X.CONSTANT.MSG_THEME.ERROR) + end + end, + }) + end + local nW, nH = Station.GetClientSize() + local tMsg = { + x = nW / 2, y = nH / 3, + szName = 'MY_TalkEx_Joke', + szMessage = _L['Confirm share joke:'] .. '\n\n' .. D.szJokeText, + szAlignment = 'CENTER', + { szOption = _L['Share onymously'], fnAction = function() fnAction(false) end }, + { szOption = _L['Share anonymously'], fnAction = function() fnAction(true) end }, + { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + } + MessageBox(tMsg) + end, + autoEnable = function() return not X.IsEmpty(D.szJokeText) end, + tip = { + render = _L['Click to share your joke to remote.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Pos('BOTTOMRIGHT') + 5 + -- 骚话输入框 + nX = nPaddingX + nY = nY + LH + nX = nX + ui:Append('WndEditBox', { + name = 'WndEditBox_JokeText', + x = nX, y = nY, + w = nW - nPaddingX * 2, h = 75, + multiline = true, + text = D.szJokeText, + onChange = function(szText) + D.szJokeText = szText + end, + }):Width() + 5 + nY = nY + 75 + + nY = nY + 10 + + ------------------------------------- + -- 调侃部分 + ------------------------------------- + --
+ nX = nPaddingX + ui:Append('Shadow', { x = nPaddingX, y = nY, w = nW - nPaddingX * 2, h = 1, color = {255, 255, 255}, alpha = 128 }) + -- 文本标题 + nY = nY + 10 + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', h = 25, text = _L['Have a trick with'] }):Width() + 5 + -- 调侃对象范围过滤器 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 100, h = 25, + text = X.Get(X.Find(TRICK_FILTER_LIST, function(p) return p.szKey == O.szTrickFilter end), 'szLabel', '???'), + menu = function() + local ui = X.UI(this) + local t = {} + for _, p in ipairs(TRICK_FILTER_LIST) do + table.insert(t, { + szOption = p.szLabel, + fnAction = function() + ui:Text(p.szLabel) + O.szTrickFilter = p.szKey + X.UI.ClosePopupMenu() + end, + }) + end + return t + end, + }):Width() + 5 + -- 调侃门派过滤器 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 80, h = 25, + text = X.Get(X.Find(FORCE_LIST, function(p) return p.dwForceID == O.nTrickForce end), 'szLabel', '???'), + menu = function() + local ui = X.UI(this) + local t = {} + for _, p in ipairs(FORCE_LIST) do + table.insert(t, { + szOption = p.szLabel, + fnAction = function() + ui:Text(p.szLabel) + O.nTrickForce = p.dwForceID + X.UI.ClosePopupMenu() + end, + }) + end + return t + end, + }):Width() + 5 + nX = nPaddingX + nY = nY + LH + + -- 调侃内容输入框:第一句 + nY = nY + ui:Append('WndEditBox', { + x = nX, y = nY, + w = nW - nPaddingX * 2, h = 25, + text = O.szTrickTextBegin, + onChange = function(szText) + O.szTrickTextBegin = szText + end, + }):Height() + 5 + -- 调侃内容输入框:调侃内容 + nY = nY + ui:Append('WndEditBox', { + x = nX, y = nY, w = nW - nPaddingX * 2, h = 55, + multiline = true, text = O.szTrickText, + onChange = function(szText) + O.szTrickText = szText + end, + }):Height() + 5 + -- 调侃内容输入框:最后一句 + nY = nY + ui:Append('WndEditBox', { + x = nX, y = nY, w = nW - nPaddingX * 2, h = 25, + text = O.szTrickTextEnd, + onChange = function(szText) + O.szTrickTextEnd = szText + end, + }):Height() + 5 + -- 调侃发送频道提示框 + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', h = 25, text = _L['Send to'] }):Width() + 5 + -- 调侃发送频道 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 'auto', h = 25, + text = X.Get(X.Find(TRICK_CHANNEL_LIST, function(p) return p.nChannel == O.nTrickChannel end), 'szName', '???'), + color = X.Get(X.Find(TRICK_CHANNEL_LIST, function(p) return p.nChannel == O.nTrickChannel end), 'tCol'), + menu = function() + local ui = X.UI(this) + local t = {} + for _, p in ipairs(TRICK_CHANNEL_LIST) do + table.insert(t, { + rgb = p.tCol, + szOption = p.szName, + fnAction = function() + O.nTrickChannel = p.nChannel + ui:Text(p.szName) + ui:Color(p.tCol) + X.UI.ClosePopupMenu() + end, + }) + end + return t + end, + }):Width() + 5 + -- 调侃按钮 + local uiBtn = ui:Append('WndButton', { + x = nW - nPaddingX - 100, y = nY, w = 100, + color = {255, 255, 255}, + text = _L['Trick'], + onClick = D.Trick, + }) + X.BreatheCall('MY_TalkEx__Enable', function() + local dwTime = GetTime() - D.dwTalkCDTime + if dwTime > 10000 then + uiBtn:Enable(true) + uiBtn:Text(_L['Trick']) + else + uiBtn:Enable(false) + uiBtn:Text(_L['Trick'] .. '(' .. math.ceil((10000 - dwTime) / 1000) .. ')') + end + end) +end + +function PS.OnPanelDeactive() + X.BreatheCall('MY_TalkEx__Enable', false) +end + +X.Panel.Register(_L['Chat'], 'TalkEx', _L['MY_TalkEx'], 'UI/Image/UICommon/ScienceTreeNode.UITex|123', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_TeamBalloon.lua b/MY_Chat/src/MY_TeamBalloon.lua new file mode 100644 index 000000000..42a1abf20 --- /dev/null +++ b/MY_Chat/src/MY_TeamBalloon.lua @@ -0,0 +1,208 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天泡泡 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_TeamBalloon' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamBalloon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Chat/ui/MY_TeamBalloon.ini' +local DISPLAY_TIME = 5000 +local ANIMATE_SHOW_TIME = 500 +local ANIMATE_HIDE_TIME = 500 + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['Chat'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_TeamBalloon'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local function AppendBalloon(hFrame, dwID, szMsg) + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen then + szMsg = MY_Farbnamen.Render(szMsg) + end + local hTotal = hFrame:Lookup('', '') + local hBalloon = hTotal:Lookup('Balloon_' .. dwID) + if not hBalloon then + hBalloon = hTotal:AppendItemFromIni(INI_PATH, 'Handle_Balloon', 'Balloon_' .. dwID) + hBalloon.dwID = dwID + end + hBalloon.nTime = GetTime() + local hContent = hBalloon:Lookup('Handle_Content') + hContent:Show() + hContent:Clear() + hContent:SetSize(300, 131) + hContent:AppendItemFromString(szMsg) + hContent:FormatAllItemPos() + hContent:SetSizeByAllItemSize() + + -- Adjust balloon size + local w, h = hContent:GetSize() + w, h = w + 20, h + 20 + local image1 = hBalloon:Lookup('Image_Bg1') + image1:SetSize(w, h) + local image2 = hBalloon:Lookup('Image_Bg2') + image2:SetRelPos(math.min(w - 16 - 8, 32), h - 4) + hBalloon:SetSize(10000, 10000) + hBalloon:FormatAllItemPos() + hBalloon:SetSizeByAllItemSize() + + -- Show balloon + local hWnd = Station.Lookup('Normal/Teammate') + local hContent = hBalloon:Lookup('Handle_Content') + local x, y, w, h, _ + if hWnd and hWnd:IsVisible() then + local hTotal = hWnd:Lookup('', '') + local nCount = hTotal:GetItemCount() + for i = 0, nCount - 1 do + local hI = hTotal:Lookup(i) + if hI.dwID == dwID then + w, h = hContent:GetSize() + x, y = hI:GetAbsPos() + x, y = x + 205, y - h - 2 + end + end + elseif MY_CataclysmParty and MY_CataclysmParty.GetMemberHandle then + local hTotal = MY_CataclysmParty.GetMemberHandle(dwID) + if hTotal then + _, h = hContent:GetSize() + w, _ = hTotal:GetSize() + x, y = hTotal:GetAbsPos() + x, y = x + w, y - h - 2 + end + end + if x and y then + hBalloon:SetRelPos(x, y) + hBalloon:SetAbsPos(x, y) + end + hBalloon:SetAlpha(0) + hFrame:BringToTop() +end + + +local function OnSay(hFrame, szMsg, dwID, nChannel) + local player = X.GetClientPlayer() + if player and player.dwID ~= dwID and ( + nChannel == PLAYER_TALK_CHANNEL.TEAM or + nChannel == PLAYER_TALK_CHANNEL.RAID + ) and player.IsInParty() then + local hTeam = GetClientTeam() + if not hTeam then return end + if hTeam.nGroupNum > 1 then + return + end + local hGroup = hTeam.GetGroupInfo(0) + for k, v in pairs(hGroup.MemberList) do + if v == dwID then + AppendBalloon(hFrame, dwID, szMsg, false) + end + end + end +end + +function D.OnFrameCreate() + this:RegisterEvent('PLAYER_SAY') +end + +function D.OnEvent(event) + if event == 'PLAYER_SAY' then + OnSay(this, arg0, arg1, arg2) + end +end + +function D.OnFrameBreathe() + local hTotal = this:Lookup('', '') + for i = 0, hTotal:GetItemCount() - 1 do + local hBalloon = hTotal:Lookup(i) + if hBalloon and hBalloon.nTime then + local nTick = GetTime() - hBalloon.nTime + if nTick <= ANIMATE_SHOW_TIME then + hBalloon:SetAlpha(nTick / ANIMATE_SHOW_TIME * 255) + elseif nTick >= ANIMATE_SHOW_TIME + DISPLAY_TIME + ANIMATE_HIDE_TIME then + hTotal:RemoveItem(hBalloon) + elseif nTick >= ANIMATE_SHOW_TIME + DISPLAY_TIME then + hBalloon:SetAlpha((1 - (nTick - ANIMATE_SHOW_TIME - DISPLAY_TIME) / ANIMATE_HIDE_TIME) * 255) + end + end + end +end + +function D.Apply() + local bEnable = O.bEnable + if bEnable then + X.UI.OpenFrame(INI_PATH, 'MY_TeamBalloon') + else + X.UI.CloseFrame('MY_TeamBalloon') + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nPaddingX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['team balloon'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.Apply() + end, + }) + nY = nY + nLH + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamBalloon', + exports = { + { + root = D, + preset = 'UIEvent', + }, + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_TeamBalloon = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamBalloon', function() + D.Apply() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/MY_WhisperMention.lua b/MY_Chat/src/MY_WhisperMention.lua new file mode 100644 index 000000000..79b7f35ff --- /dev/null +++ b/MY_Chat/src/MY_WhisperMention.lua @@ -0,0 +1,223 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 记录点名到密聊频道 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/MY_WhisperMention' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Chat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_WhisperMention', _L['Chat'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_WhisperMention'], + _L['Redirect mention to whisper'], + }), + szVersion = '20241023', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bDisableOfficial = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Chat'], + szDescription = X.MakeCaption({ + _L['MY_WhisperMention'], + _L['Filter official mention'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + bEnable = false, + bDisableOfficial = false, + aMentionMsg = {}, +} + +function D.SyncSettings() + D.bEnable = O.bEnable + D.bDisableOfficial = O.bDisableOfficial +end + +function D.Apply() + if D.bEnable then + X.HookChatPanel('FILTER', 'MY_WhisperMention', function(h, szMsg, szChannel, dwTime) + local tInfo = MY_Chat.ParseMessageInfo(szMsg) + local szRawMessage = szMsg + if tInfo then + dwTime = tInfo.dwTime + szChannel = tInfo.szChannel + szRawMessage = tInfo.szRawMessage or szMsg + end + if h.__MY_LastMsg == szRawMessage and h.__MY_LastMsgChannel ~= szChannel and szChannel == 'MSG_WHISPER' then + return false + end + h.__MY_LastMsg = szMsg + h.__MY_LastMsgChannel = szChannel + return true + end) + else + X.HookChatPanel('FILTER', 'MY_WhisperMention', false) + end +end + +function D.ClearMsg(szMsg) + return MY_Chat.UnwrapRawMessage(szMsg) +end + +function D.OnMessageArrive(szChannel, szMsg, nFont, bRich, r, g, b, dwTalkerID, szName) + local me = X.GetClientPlayer() + if not me then + return + end + local bEcho = false + local aXMLNode = X.XMLDecode(szMsg) + if not X.IsTable(aXMLNode) then + return + end + for _, node in ipairs(aXMLNode) do + local nodeType = X.XMLGetNodeType(node) + local nodeName = X.XMLGetNodeData(node, 'name') or '' + local nodeText = X.XMLGetNodeData(node, 'text') + if nodeType == 'text' and nodeName:sub(1, 8) == 'namelink' and nodeText:sub(2, -2) == me.szName then + bEcho = true + break + end + end + if bEcho then + if D.bEnable and dwTalkerID ~= me.dwID then + OutputMessage('MSG_WHISPER', szMsg, bRich, nFont, {r, g, b}, dwTalkerID, szName) + end + table.insert(D.aMentionMsg, { + szChannel = szChannel, + szMsg = D.ClearMsg(szMsg), + dwTalkerID = dwTalkerID, + szName = szName, + dwTime = GetCurrentTime(), + }) + X.DelayCall('MY_WhisperMention', 1500, D.OnMentionMsgGC) + end +end + +function D.OnMentionMsgGC() + while true do + local tMention = D.aMentionMsg[1] + if not tMention or tMention.dwTime + 1 > GetCurrentTime() then + break + end + table.remove(D.aMentionMsg, 1) + end +end + +function D.OnMsgFilter(szMsgType, szMsg, nFont, bRich, r, g, b, dwTalkerID, szName) + if D.bEnable or D.bDisableOfficial then + szMsg = D.ClearMsg(szMsg) + for _, v in ipairs(D.aMentionMsg) do + if dwTalkerID == v.dwTalkerID and szMsg == v.szMsg and v.dwTime + 1 > GetCurrentTime() then + return true + end + end + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, lineHeight) + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Redirect mention to whisper'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.SyncSettings() + D.Apply() + end, + }):Width() + 5 + if X.IS_REMAKE then + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Filter official mention'], + checked = O.bDisableOfficial, + onCheck = function(bChecked) + O.bDisableOfficial = bChecked + D.SyncSettings() + end, + autoEnable = function() return not O.bEnable end, + }):Width() + 5 + end + nY = nY + lineHeight + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_WhisperMention', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_WhisperMention = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterMsgMonitor( + { + 'MSG_NORMAL', + 'MSG_PARTY', + 'MSG_MAP', + 'MSG_BATTLE_FILED', + 'MSG_GUILD', + 'MSG_GUILD_ALLIANCE', + 'MSG_SCHOOL', + 'MSG_WORLD', + 'MSG_TEAM', + 'MSG_CAMP', + 'MSG_GROUP', + 'MSG_SEEK_MENTOR', + 'MSG_FRIEND', + 'MSG_IDENTITY', + 'MSG_SYS', + 'MSG_NPC_NEARBY', + 'MSG_NPC_YELL', + 'MSG_NPC_PARTY', + 'MSG_NPC_WHISPER', + }, + 'MY_WhisperMention', + D.OnMessageArrive +) +X.RegisterMsgFilter('MSG_WHISPER', 'MY_WhisperMention', D.OnMsgFilter) + +X.RegisterUserSettingsInit('MY_WhisperMention', function() + D.SyncSettings() + D.Apply() +end) +X.RegisterUserSettingsRelease('MY_WhisperMention', function() + D.bEnable = false + D.Apply() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/src/PS.lua b/MY_Chat/src/PS.lua new file mode 100644 index 000000000..04ec42cf1 --- /dev/null +++ b/MY_Chat/src/PS.lua @@ -0,0 +1,43 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Chat/PS' +local PLUGIN_NAME = 'MY_Chat' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Chat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.3') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + local nLineH = 29 + + if MY_Farbnamen and MY_Farbnamen.OnPanelActivePartial then + nX, nY = MY_Farbnamen.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + end + nX, nY = MY_ChatSwitch.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + nX, nY = MY_TeamBalloon.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + nX, nY = MY_ChatCopy.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + nX, nY = MY_AutoHideChat.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + nX, nY = MY_WhisperMention.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) + nX, nY = MY_ChatEmotion.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLineH) +end +X.Panel.Register(_L['Chat'], 'MY_ChatSwitch', _L['chat helper'], 'UI/Image/UICommon/ActivePopularize2.UITex|20', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Chat/ui/MY_ChatSwitch.ini b/MY_Chat/ui/MY_ChatSwitch.ini new file mode 100644 index 000000000..3b2c38c76 --- /dev/null +++ b/MY_Chat/ui/MY_ChatSwitch.ini @@ -0,0 +1,260 @@ +[MY_ChatSwitch] +._WndType=WndFrame +._Parent=Normal +Left=54 +Top=288 +Width=450 +Height=50 +Alpha=255 +IsCustomDragable=1 +DragAreaTop=0 +DummyWnd=0 +DragAreaLeft=0 +DragAreaWidth=450 +DragAreaHeight=50 +Disable=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +Hover=Image_Move + +[Handle_Total] +._WndType=Handle +._Parent=MY_ChatSwitch +Left=0 +Top=0 +Width=100 +Height=50 +Alpha=255 +HandleType=0 +PosType=0 +FirstItemPosType=0 + +[Image_Bar] +._WndType=Image +._Parent=Handle_Total +Image=interface\MY\MY_Chat\img\MY_ChatSwitch.UITex +Frame=0 +Left=30 +Top=20 +Width=420 +Height=32 +PosType=0 +Alpha=255 +ImageType=10 + +[Image_Move] +._WndType=Image +._Parent=Handle_Total +Left=19 +Top=1 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=255 +Frame=22 +LockShowAndHide=1 + +[Btn_Option] +._WndType=WndButton +._Parent=MY_ChatSwitch +Left=0 +Top=21 +Width=30 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=22 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 + +[WndContainer_Radios] +._WndType=WndContainer +._Parent=MY_ChatSwitch +Left=52 +Top=0 +Width=398 +Height=50 +ContainerType=0 + +[Wnd_Channel] +._WndType=WndWindow +._Parent=WndContainer_Radios +Left=0 +Top=0 +Width=30 +Height=50 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndRadioChannel] +._WndType=WndCheckBox +._Parent=Wnd_Channel +Frame=0 +Left=0 +Top=25 +Width=22 +Height=22 +UnCheckAndEnable=60 +CheckAndEnable=4 +UnCheckAndDisable=114 +CheckAndDisable=115 +UnCheckedAndEnableWhenMouseOver=61 +CheckedAndEnableWhenMouseOver=24 +CheckedAndDisableWhenMouseOver=115 +UnCheckedAndDisableWhenMouseOver=114 +Checking=61 +UnChecking=24 +Image=ui\Image\button\CommonButton_1.UITex +DummyWnd=1 + +[Handle_Radio] +._WndType=Handle +._Parent=WndRadioChannel +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-25 +PosType=0 +EventID=512 +Width=30 +Height=50 + +[Text_Channel] +._WndType=Text +._Parent=Handle_Radio +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=3 +PosType=0 +Width=25 +Height=22 +FontScheme=18 +VAlign=1 +AutoEtc=0 +ShowAll=1 +HAlign=1 +$Text=CH +OrgText=1 + +[Text_CD] +._WndType=Text +._Parent=Handle_Radio +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=25 +PosType=0 +Width=25 +Height=22 +FontScheme=18 +VAlign=1 +AutoEtc=0 +ShowAll=1 +OrgText=1 +$Text=180 +HAlign=1 +CenterEachRow=0 + +[Shadow_Count] +._WndType=Shadow +._Parent=Handle_Radio +Left=2 +Top=26 +PosType=0 +ShadowColor=black +Alpha=0 +Width=18 +Height=18 + +[Wnd_CheckBox] +._WndType=WndWindow +._Parent=WndContainer_Radios +Left=0 +Top=0 +Width=30 +Height=50 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndCheckBox] +._WndType=WndCheckBox +._Parent=Wnd_CheckBox +Frame=56 +Left=0 +Top=22 +Width=25 +Height=25 +UnCheckAndEnable=5 +CheckAndEnable=6 +UnCheckAndDisable=5 +CheckAndDisable=6 +UnCheckedAndEnableWhenMouseOver=3 +CheckedAndEnableWhenMouseOver=7 +CheckedAndDisableWhenMouseOver=6 +UnCheckedAndDisableWhenMouseOver=5 +Checking=7 +UnChecking=3 +Image=ui\Image\button\CommonButton_1.UITex +$Tip= +ShowTipType=0 +DummyWnd=1 + +[Handle_CheckBox] +._WndType=Handle +._Parent=WndCheckBox +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-22 +PosType=0 +EventID=512 +Width=30 +Height=51 + +[Text_CheckBox] +._WndType=Text +._Parent=Handle_CheckBox +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=3 +PosType=0 +Width=25 +Height=22 +FontScheme=18 +ShowAll=1 +AutoEtc=0 +VAlign=1 +HAlign=1 +OrgText=1 +$Text=CH + diff --git a/MY_Chat/ui/MY_TeamBalloon.ini b/MY_Chat/ui/MY_TeamBalloon.ini new file mode 100644 index 000000000..8568fb9d4 --- /dev/null +++ b/MY_Chat/ui/MY_TeamBalloon.ini @@ -0,0 +1,80 @@ +[MY_TeamBalloon] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +Alpha=255 +IsCustomDragable=1 +DragAreaTop=0 +DummyWnd=0 +DragAreaLeft=0 +DragAreaWidth=450 +DragAreaHeight=50 +Disable=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +MousePenetrable=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamBalloon +Left=0 +Top=0 +Alpha=255 +HandleType=0 +PosType=0 +FirstItemPosType=0 + +[Handle_Balloon] +._WndType=Handle +._Parent=Handle_Total +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=0 +Height=0 +UnLoad=1 + +[Image_Bg1] +._WndType=Image +._Parent=Handle_Balloon +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=21 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=457 +Height=150 +ImageType=10 + +[Image_Bg2] +._WndType=Image +._Parent=Handle_Balloon +Image=ui\Image\Common\CommonPanel.UITex +Frame=71 +Alpha=255 +Left=438 +Top=144 +PosType=0 +DisableScale=1 + +[Handle_Content] +._WndType=Handle +._Parent=Handle_Balloon +HandleType=3 +Left=8 +Top=8 +PosType=0 +Width=436 +Height=131 +RowSpacing=0 + diff --git a/MY_ChatLog/info.ini b/MY_ChatLog/info.ini new file mode 100644 index 000000000..8b2a5fd16 --- /dev/null +++ b/MY_ChatLog/info.ini @@ -0,0 +1,14 @@ +[MY_ChatLog] +name=聊天记录 +desc=记录聊天内容方便日后查询回忆 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_ChatLog_DB.lua +lua_1=src\MY_ChatLog_DS.lua +lua_2=src\MY_ChatLog.lua +lua_3=src\MY_ChatLog_UI.lua +lua_4=src\MY_ChatLog_ExportDB.lua +lua_5=src\MY_ChatLog_ExportHTML.lua +lua_6=src\MY_ChatLog.PS.lua +package=MY diff --git a/MY_ChatLog/info.ini.zh_TW b/MY_ChatLog/info.ini.zh_TW new file mode 100644 index 000000000..f1f0e086f --- /dev/null +++ b/MY_ChatLog/info.ini.zh_TW @@ -0,0 +1,14 @@ +[MY_ChatLog] +name=鑱婂ぉ瑷橀寗 +desc=瑷橀寗鑱婂ぉ鍏у鏂逛究鏃ュ緦鏌ヨ鍥炴喍 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_ChatLog_DB.lua +lua_1=src\MY_ChatLog_DS.lua +lua_2=src\MY_ChatLog.lua +lua_3=src\MY_ChatLog_UI.lua +lua_4=src\MY_ChatLog_ExportDB.lua +lua_5=src\MY_ChatLog_ExportHTML.lua +lua_6=src\MY_ChatLog.PS.lua +package=MY diff --git a/MY_ChatLog/lang/default.jx3dat b/MY_ChatLog/lang/default.jx3dat new file mode 100644 index 000000000..c5f4dbc73 --- /dev/null +++ b/MY_ChatLog/lang/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['MOSAICS_CHAR'] = '*', +} diff --git a/MY_ChatLog/lang/zhcn.jx3dat b/MY_ChatLog/lang/zhcn.jx3dat new file mode 100644 index 000000000..ee4815ca1 --- /dev/null +++ b/MY_ChatLog/lang/zhcn.jx3dat @@ -0,0 +1,79 @@ +return { + ['MY_Chat'] = '聊天助手', + ['MY_ChatLog'] = '聊天记录', + ['Channel settings'] = '频道设置', + ['Rename channel'] = '重命名', + ['Other channel'] = '其它', + ['Please input new channel name:'] = '请输入新的频道名称:', + ['New channel'] = '新建频道', + ['Chat log filter'] = '消息过滤', + ['UI Channel Check State'] = '查看界面勾选的频道', + ['Exclude'] = '不可包含', + ['Include'] = '必须包含', + ['Pattern match'] = '模式匹配', + ['Edit'] = '编辑', + ['Delete'] = '删除', + ['Add'] = '添加', + ['Message must exclude:'] = '消息不可包含下列任何:', + ['Message must include:'] = '消息必须包含下列任何:', + ['Which kind of filter do you want to add?'] = '你想要设置什么样的消息才允许存入聊天记录?\n\n消息不可包含:消息不可包含任何一条过滤规则的内容\n消息必须包含:消息必须包含任何一条过滤规则的内容', + ['Message exclude'] = '消息不可包含', + ['Message include'] = '消息必须包含', + ['Are you sure to delete this filter?'] = '你确定要删除该条聊天记录过滤器吗?', + ['Clear chat log'] = '清空记录', + ['Are you sure to clear msg type chat log of %s? All chat logs in this msg type will be lost.'] = '确认要清空频道类型为[%s]的聊天记录吗?该频道下的聊天记录将会被彻底删除,确认后操作将无法撤销。', + ['Reset channel'] = '重置频道', + ['Are you sure to reset channel settings? Al custom channel settings will be lost.'] = '所有自定义频道设置将会丢失,确认要重置频道设置吗?', + ['Realtime database commit'] = '聊天记录实时写入数据库', + ['Auto connect database'] = '登录时自动连接数据库', + ['Export chatlog'] = '导出聊天记录', + ['Streaming client does not support export!'] = '云端客户端不支持导出功能!', + ['Optimize datebase'] = '优化数据库', + ['Optimize datebase will take a long time and may cause a disconnection, are you sure to continue?'] = '优化数据库可以加快查询速度解决部分顿卡问题,但如果本地聊天记录较多操作可能会造成客户端失去响应、角色掉线,请耐心等待,勿随意结束客户端,是否继续?', + ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '接下来如有客户端失去响应、角色掉线,请耐心等待,勿随意结束客户端,否则您的聊天记录可能造成不可逆的数据损坏,点击确认开始操作。', + ['Optimize finished!'] = '优化压缩处理完成!', + ['Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '数据库已损坏,需要修复后方可使用,但是修复可能造成客户端失去响应、角色掉线,请耐心等待,勿随意结束客户端,是否立即修复?', + ['Please select your chatlog database file.'] = '请选择需要导入的聊天记录文件', + ['%d chatlogs imported!'] = '成功导入%d条聊天记录', + ['Others chat log found, please do not import other role chat log!'] = '检测到导入数据中存在其他角色的聊天记录,已忽略该部分,请不要导入其他角色的聊天记录!', + ['Import chatlog'] = '导入聊天记录', + ['Upgrade succeed!'] = '升级成功!', + ['You\'ve achieved'] = '你完成了隐元秘鉴', + ['You got designation'] = '你获得称号后缀', + ['Fix succeed!'] = '修复成功!', + ['Preparing'] = '准备中', + ['Export succeed'] = '导出完成!', + ['Already exporting, please wait.'] = '聊天记录正在导出中,请稍后。', + ['Error: open file error %s [%s]'] = '打开文件%s失败:[%s]', + ['Chatlog export succeed, file saved as %s'] = '聊天记录导出成功:%s', + ['Exporting chatlog: %s, %.2f%%.'] = '聊天记录导出 - %s - %.2f%%', + ['Export failed, unknown suffix.'] = '记录导出失败,未知的后缀名。', + ['Please choose export mode.\nHTML mode will export chatlog to human-readable file.\nDB mode will export chatlog to re-importable backup file.'] = '请选择导出模式\n① HTML模式:导出为可阅读的文本文档,但无法再次导入。\n② DB模式:导出为备份数据文件,可再次导入。', + ['HTML mode'] = 'HTML模式', + ['DB mode'] = 'DB模式', + ['Hide blockwords'] = '关键字屏蔽', + ['Edit'] = '编辑', + + ['Total %d pages'] = '共%d页', + ['Delete record'] = '删除该条记录', + ['Copy this record'] = '复制该条消息', + ['View this message in all messages'] = '定位该条消息', + ['Open chatlog'] = '打开聊天记录', + ['New chat save feature has been disabled on HDD disk machine for performance issues, now on readonly mode.'] = '检测到游戏所在磁盘为机械硬盘,由于磁盘吞吐量限制,当前处于只读模式,无法保存新消息,仅可浏览历史聊天记录。', + ['MY - MY_ChatLog'] = '茗伊插件集 - 聊天记录', + ['Press enter to search ...'] = '输入回车键搜索...', + ['Clear channel chat log'] = '清空该分类聊天记录', + ['Are you sure to clear channel chat log of %s? All chat logs in this channel will be lost.'] = '确认要清空[%s]分类的聊天记录吗?该分类聊天记录将会被彻底删除,确认后操作将无法撤销。', + + ['Death Log'] = '重伤记录', + ['Journal Log'] = '交易流水', + ['MY Monitor'] = '聊天监控', + + ['Ancient chatlog detected, you can migrate chatlog database from them, that may take a while and cannot be break, do you want to do it now?'] = '发现旧版聊天记录,是否立即导入,导入可能导致客户端无响应一段时间,希望现在开始导入吗?', + ['Problem(s) detected on your chatlog database and must be fixed before use, would you like to do this now?'] = '检测到您的聊天记录数据受损,需要修复后方可使用,修复可能导致客户端无响应一段时间,是否立即开始修复?', + ['Your client may get no responding, please wait until it finished, otherwise your chatlog data may got lost, press yes to start.'] = '请点击确定开始操作,客户端可能失去响应、角色可能会掉线,请耐心等待。请勿随意结束客户端,否则您的聊天记录可能会永久丢失。', + + ['Settings'] = '设置', + ['Tips'] = '说明', + ['MY_ChatLog TIPS'] = '1、该功能用于记录角色聊天数据到本地便于日后翻阅,不涉及任何数据上传。\n2、聊天记录在角色退出游戏时存盘,直接关机或闪退将会丢失部分记录。\n3、登录其他角色时无法查看当前角色的聊天记录。\n4、只有登录过的角色信息才有可能存在记录,未登录过的角色不会有记录。\n5、由于玩法和官方接口随时可能更改,不保证聊天记录随时有效可用。\n6、由于聊天记录存储在本地,拥有丰富计算机经验的侠士或许可以篡改记录,所以不可作为截图证据使用。', +} diff --git a/MY_ChatLog/lang/zhtw.jx3dat b/MY_ChatLog/lang/zhtw.jx3dat new file mode 100644 index 000000000..b99a2eed9 --- /dev/null +++ b/MY_ChatLog/lang/zhtw.jx3dat @@ -0,0 +1,79 @@ +return { + ['MY_Chat'] = '鑱婂ぉ鍔╂墜', + ['MY_ChatLog'] = '鑱婂ぉ瑷橀寗', + ['Channel settings'] = '闋婚亾瑷疆', + ['Rename channel'] = '閲嶅懡鍚', + ['Other channel'] = '鍏跺畠', + ['Please input new channel name:'] = '璜嬭几鍏ユ柊鐨勯牷閬撳悕绋憋細', + ['New channel'] = '鏂板缓闋婚亾', + ['Chat log filter'] = '娑堟伅閬庢烤', + ['UI Channel Check State'] = '鏌ョ湅鐣岄潰鍕鹃伕鐨勯牷閬', + ['Exclude'] = '涓嶅彲鍖呭惈', + ['Include'] = '蹇呴爤鍖呭惈', + ['Pattern match'] = '妯″紡鍖归厤', + ['Edit'] = '绶ㄨ集', + ['Delete'] = '鍒櫎', + ['Add'] = '娣诲姞', + ['Message must exclude:'] = '娑堟伅涓嶅彲鍖呭惈涓嬪垪浠讳綍锛', + ['Message must include:'] = '娑堟伅蹇呴爤鍖呭惈涓嬪垪浠讳綍锛', + ['Which kind of filter do you want to add?'] = '浣犳兂瑕佽ō缃粈楹兼ǎ鐨勬秷鎭墠鍏佽ū瀛樺叆鑱婂ぉ瑷橀寗锛焅n\n娑堟伅涓嶅彲鍖呭惈锛氭秷鎭笉鍙寘鍚换浣曚竴姊濋亷婵捐鍓囩殑鍏у\n娑堟伅蹇呴爤鍖呭惈锛氭秷鎭繀闋堝寘鍚换浣曚竴姊濋亷婵捐鍓囩殑鍏у', + ['Message exclude'] = '娑堟伅涓嶅彲鍖呭惈', + ['Message include'] = '娑堟伅蹇呴爤鍖呭惈', + ['Are you sure to delete this filter?'] = '浣犵⒑瀹氳鍒櫎瑭叉鑱婂ぉ瑷橀寗閬庢烤鍣ㄥ棊锛', + ['Clear chat log'] = '娓呯┖瑷橀寗', + ['Are you sure to clear msg type chat log of %s? All chat logs in this msg type will be lost.'] = '纰鸿獚瑕佹竻绌洪牷閬撻鍨嬬偤[%s]鐨勮亰澶╄閷勫棊锛熻┎闋婚亾涓嬬殑鑱婂ぉ瑷橀寗灏囨渻琚竟搴曞埅闄わ紝纰鸿獚寰屾搷浣滃皣鐒℃硶鎾ら姺銆', + ['Reset channel'] = '閲嶇疆闋婚亾', + ['Are you sure to reset channel settings? Al custom channel settings will be lost.'] = '鎵鏈夎嚜瀹氱京闋婚亾瑷疆灏囨渻涓熷け锛岀⒑瑾嶈閲嶇疆闋婚亾瑷疆鍡庯紵', + ['Realtime database commit'] = '鑱婂ぉ瑷橀寗瀵︽檪瀵叆璩囨枡搴', + ['Auto connect database'] = '鐧婚寗鏅傝嚜鍕曢f帴璩囨枡搴', + ['Export chatlog'] = '灏庡嚭鑱婂ぉ瑷橀寗', + ['Streaming client does not support export!'] = '闆茬瀹㈡埗绔笉鏀寔灏庡嚭鍔熻兘锛', + ['Optimize datebase'] = '鍎寲璩囨枡搴', + ['Optimize datebase will take a long time and may cause a disconnection, are you sure to continue?'] = '鍎寲璩囨枡搴彲浠ュ姞蹇煡瑭㈤熷害瑙f焙閮ㄥ垎闋撳崱鍟忛锛屼絾濡傛灉鏈湴鑱婂ぉ瑷橀寗杓冨鎿嶄綔鍙兘鏈冮犳垚瀹㈡埗绔け鍘婚熆鎳夈佽鑹叉帀绶氾紝璜嬭愬績绛夊緟锛屽嬁闅ㄦ剰绲愭潫瀹㈡埗绔紝鏄惁绻肩簩锛', + ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '鎺ヤ笅渚嗗鏈夊鎴剁澶卞幓闊挎噳銆佽鑹叉帀绶氾紝璜嬭愬績绛夊緟锛屽嬁闅ㄦ剰绲愭潫瀹㈡埗绔紝鍚﹀墖鎮ㄧ殑鑱婂ぉ瑷橀寗鍙兘閫犳垚涓嶅彲閫嗙殑鏁告摎鎼嶅锛岄粸鎿婄⒑瑾嶉枊濮嬫搷浣溿', + ['Optimize finished!'] = '鍎寲澹撶府铏曠悊瀹屾垚锛', + ['Database is malformed, do you want to repair database now? Repair database may take a long time and cause a disconnection.'] = '璩囨枡搴凡鎼嶅锛岄渶瑕佷慨瑜囧緦鏂瑰彲浣跨敤锛屼絾鏄慨瑜囧彲鑳介犳垚瀹㈡埗绔け鍘婚熆鎳夈佽鑹叉帀绶氾紝璜嬭愬績绛夊緟锛屽嬁闅ㄦ剰绲愭潫瀹㈡埗绔紝鏄惁绔嬪嵆淇锛', + ['Please select your chatlog database file.'] = '璜嬮伕鎿囬渶瑕佸皫鍏ョ殑鑱婂ぉ瑷橀寗鏂囦欢', + ['%d chatlogs imported!'] = '鎴愬姛灏庡叆%d姊濊亰澶╄閷', + ['Others chat log found, please do not import other role chat log!'] = '妾㈡脯鍒板皫鍏ユ暩鎿氫腑瀛樺湪鍏朵粬瑙掕壊鐨勮亰澶╄閷勶紝宸插拷鐣ヨ┎閮ㄥ垎锛岃珛涓嶈灏庡叆鍏朵粬瑙掕壊鐨勮亰澶╄閷勶紒', + ['Import chatlog'] = '灏庡叆鑱婂ぉ瑷橀寗', + ['Upgrade succeed!'] = '鍗囩礆鎴愬姛锛', + ['You\'ve achieved'] = '浣犲畬鎴愪簡闅卞厓绉橀憭', + ['You got designation'] = '浣犵嵅寰楃ū铏熷緦缍', + ['Fix succeed!'] = '淇鎴愬姛锛', + ['Preparing'] = '婧栧倷涓', + ['Export succeed'] = '灏庡嚭瀹屾垚锛', + ['Already exporting, please wait.'] = '鑱婂ぉ瑷橀寗姝e湪灏庡嚭涓紝璜嬬◢寰屻', + ['Error: open file error %s [%s]'] = '鎵撻枊鏂囦欢%s澶辨晽锛歔%s]', + ['Chatlog export succeed, file saved as %s'] = '鑱婂ぉ瑷橀寗灏庡嚭鎴愬姛锛%s', + ['Exporting chatlog: %s, %.2f%%.'] = '鑱婂ぉ瑷橀寗灏庡嚭 - %s - %.2f%%', + ['Export failed, unknown suffix.'] = '瑷橀寗灏庡嚭澶辨晽锛屾湭鐭ョ殑寰岀洞鍚嶃', + ['Please choose export mode.\nHTML mode will export chatlog to human-readable file.\nDB mode will export chatlog to re-importable backup file.'] = '璜嬮伕鎿囧皫鍑烘ā寮廫n鈶 HTML妯″紡锛氬皫鍑虹偤鍙柋璁鐨勬枃鏈枃妾旓紝浣嗙劇娉曞啀娆″皫鍏ャ俓n鈶 DB妯″紡锛氬皫鍑虹偤鍌欎唤鏁告摎鏂囦欢锛屽彲鍐嶆灏庡叆銆', + ['HTML mode'] = 'HTML妯″紡', + ['DB mode'] = 'DB妯″紡', + ['Hide blockwords'] = '闂滈嵉瀛楀睆钄', + ['Edit'] = '绶ㄨ集', + + ['Total %d pages'] = '鍏%d闋', + ['Delete record'] = '鍒櫎瑭叉瑷橀寗', + ['Copy this record'] = '瑜囪=瑭叉娑堟伅', + ['View this message in all messages'] = '瀹氫綅瑭叉娑堟伅', + ['Open chatlog'] = '鎵撻枊鑱婂ぉ瑷橀寗', + ['New chat save feature has been disabled on HDD disk machine for performance issues, now on readonly mode.'] = '妾㈡脯鍒版父鎴叉墍鍦ㄧ纰熺偤姗熸纭锛岀敱鏂肩纰熷悶鍚愰噺闄愬埗锛岀暥鍓嶈檿鏂煎彧璁妯″紡锛岀劇娉曚繚瀛樻柊娑堟伅锛屽儏鍙忚姝峰彶鑱婂ぉ瑷橀寗銆', + ['MY - MY_ChatLog'] = '鑼椾紛鎻掍欢闆 - 鑱婂ぉ瑷橀寗', + ['Press enter to search ...'] = '杓稿叆鍥炶粖閸垫悳绱...', + ['Clear channel chat log'] = '娓呯┖瑭插垎椤炶亰澶╄閷', + ['Are you sure to clear channel chat log of %s? All chat logs in this channel will be lost.'] = '纰鸿獚瑕佹竻绌篬%s]鍒嗛鐨勮亰澶╄閷勫棊锛熻┎鍒嗛鑱婂ぉ瑷橀寗灏囨渻琚竟搴曞埅闄わ紝纰鸿獚寰屾搷浣滃皣鐒℃硶鎾ら姺銆', + + ['Death Log'] = '閲嶅偡瑷橀寗', + ['Journal Log'] = '浜ゆ槗娴佹按', + ['MY Monitor'] = '鑱婂ぉ鐩f帶', + + ['Ancient chatlog detected, you can migrate chatlog database from them, that may take a while and cannot be break, do you want to do it now?'] = '鐧肩従鑸婄増鑱婂ぉ瑷橀寗锛屾槸鍚︾珛鍗冲皫鍏ワ紝灏庡叆鍙兘灏庤嚧瀹㈡埗绔劇闊挎噳涓娈垫檪闁擄紝甯屾湜鐝惧湪闁嬪灏庡叆鍡庯紵', + ['Problem(s) detected on your chatlog database and must be fixed before use, would you like to do this now?'] = '妾㈡脯鍒版偍鐨勮亰澶╄閷勬暩鎿氬彈鎼嶏紝闇瑕佷慨瑜囧緦鏂瑰彲浣跨敤锛屼慨瑜囧彲鑳藉皫鑷村鎴剁鐒¢熆鎳変竴娈垫檪闁擄紝鏄惁绔嬪嵆闁嬪淇锛', + ['Your client may get no responding, please wait until it finished, otherwise your chatlog data may got lost, press yes to start.'] = '璜嬮粸鎿婄⒑瀹氶枊濮嬫搷浣滐紝瀹㈡埗绔彲鑳藉け鍘婚熆鎳夈佽鑹插彲鑳芥渻鎺夌窔锛岃珛鑰愬績绛夊緟銆傝珛鍕块毃鎰忕祼鏉熷鎴剁锛屽惁鍓囨偍鐨勮亰澶╄閷勫彲鑳芥渻姘镐箙涓熷け銆', + + ['Settings'] = '瑷疆', + ['Tips'] = '瑾槑', + ['MY_ChatLog TIPS'] = '1銆佽┎鍔熻兘鐢ㄦ柤瑷橀寗瑙掕壊鑱婂ぉ鏁告摎鍒版湰鍦颁究鏂兼棩寰岀炕闁憋紝涓嶆秹鍙婁换浣曟暩鎿氫笂鍌炽俓n2銆佽亰澶╄閷勫湪瑙掕壊閫鍑烘父鎴叉檪瀛樻獢锛岀洿鎺ラ棞姗熸垨闁冮灏囨渻涓熷け閮ㄥ垎瑷橀寗銆俓n3銆佺櫥閷勫叾浠栬鑹叉檪鐒℃硶鏌ョ湅鐣跺墠瑙掕壊鐨勮亰澶╄閷勩俓n4銆佸彧鏈夌櫥閷勯亷鐨勮鑹蹭俊鎭墠鏈夊彲鑳藉瓨鍦ㄨ閷勶紝鏈櫥閷勯亷鐨勮鑹蹭笉鏈冩湁瑷橀寗銆俓n5銆佺敱鏂肩帺娉曞拰瀹樻柟浠嬮潰闅ㄦ檪鍙兘鏇存敼锛屼笉淇濊瓑鑱婂ぉ瑷橀寗闅ㄦ檪鏈夋晥鍙敤銆俓n6銆佺敱鏂艰亰澶╄閷勫瓨鍎插湪鏈湴锛屾搧鏈夎睈瀵岄浕鑵︾稉椹楃殑淇犲+鎴栬ū鍙互绡℃敼瑷橀寗锛屾墍浠ヤ笉鍙綔鐐烘埅鍦栬瓑鎿氫娇鐢ㄣ', +} diff --git a/MY_ChatLog/src/MY_ChatLog.PS.lua b/MY_ChatLog/src/MY_ChatLog.PS.lua new file mode 100644 index 000000000..b94c1e622 --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog.PS.lua @@ -0,0 +1,501 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog.PS' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ChatLog.RealtimeCommit', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local D = {} + +------------------------------------------------------------------------------------------------------ +-- 数据导出 +------------------------------------------------------------------------------------------------------ + +function D.ExportConfirm() + if MY_ChatLog_ExportDB.IsRunning() or MY_ChatLog_ExportHTML.IsRunning() then + return X.OutputSystemMessage(_L['Already exporting, please wait.']) + end + local ui = X.UI.CreateFrame('MY_ChatLog_Export', { + theme = X.UI.FRAME_THEME.SIMPLE, esc = true, close = true, w = 140, + level = 'Normal1', text = _L['Export chatlog'], alpha = 233, + }) + local btnSure + local tChannels = {} + local nPaddingX, nPaddingY = 10, 10 + local x, y = nPaddingX, nPaddingY + local nMaxWidth = 0 + for nGroup, info in ipairs(MY_ChatLog.aChannel) do + x = x + ui:Append('WndCheckBox', { + x = x, y = y, w = 100, + text = info.szTitle, + checked = true, + onCheck = function(bChecked) + tChannels[nGroup] = bChecked + local bEnable = bChecked + if not bChecked then + for nGroup, _ in ipairs(MY_ChatLog.aChannel) do + if tChannels[nGroup] then + bEnable = true + break + end + end + end + btnSure:Enable(bEnable) + end, + }):AutoWidth():Width() + nMaxWidth = math.max(nMaxWidth, x + nPaddingX) + if nGroup % 2 == 0 or nGroup == #MY_ChatLog.aChannel then + x = nPaddingX + y = y + 30 + else + x = x + 5 + end + tChannels[nGroup] = true + end + y = y + 10 + + x = nPaddingX + 20 + btnSure = ui:Append('WndButton', { + x = x, y = y, w = nMaxWidth - x * 2, h = 35, + text = _L['Export chatlog'], + onClick = function() + if X.ENVIRONMENT.GAME_PROVIDER == 'remote' then + return X.Alert(_L['Streaming client does not support export!']) + end + local function doExport(szSuffix) + local aMsgType = {} + for nGroup, info in ipairs(MY_ChatLog.aChannel) do + if tChannels[nGroup] then + for _, szMsgType in ipairs(info.aMsgType) do + table.insert(aMsgType, szMsgType) + end + end + end + D.Export( + X.FormatPath({'export/ChatLog/{$name}@{$server}@' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss') .. szSuffix, X.PATH_TYPE.ROLE}), + aMsgType, 10, + function(title, progress) + OutputMessage('MSG_ANNOUNCE_YELLOW', _L('Exporting chatlog: %s, %.2f%%.', title, progress * 100)) + end + ) + ui:Remove() + end + X.Dialog( + _L['Please choose export mode.\nHTML mode will export chatlog to human-readable file.\nDB mode will export chatlog to re-importable backup file.'], { + { szOption = _L['HTML mode'], fnAction = function() doExport('.html') end }, + { szOption = _L['DB mode'], fnAction = function() doExport('.db') end }, + }) + end, + }) + y = y + 30 + ui:Size(nMaxWidth, y + 50) + ui:Anchor({s = 'CENTER', r = 'CENTER', x = 0, y = 0}) +end + +function D.Export(szExportFile, aMsgType, nPerSec, onProgress) + if MY_ChatLog_ExportDB.IsRunning() or MY_ChatLog_ExportHTML.IsRunning() then + return X.OutputSystemMessage(_L['Already exporting, please wait.']) + end + if szExportFile:sub(-3) == '.db' then + MY_ChatLog_ExportDB.Start(szExportFile, aMsgType, nPerSec, onProgress) + elseif szExportFile:sub(-5) == '.html' then + MY_ChatLog_ExportHTML.Start(szExportFile, aMsgType, nPerSec, onProgress) + else + onProgress(_L['Export failed, unknown suffix.'], 1) + end +end + +------------------------------------------------------------------------------------------------------ +-- 设置界面绘制 +------------------------------------------------------------------------------------------------------ +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 25, 25 + local nX, nY = nPaddingX, nPaddingY + local nDeltaY = 35 + local nComponentW = 200 + + -- 左侧 + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Settings'], font = 27 }) + nY = nY + nDeltaY + nX = nPaddingX + 10 + + local function InsertChatLogMsgTypeMenu(m, xInject) + -- 通用 + X.InsertMsgTypeMenu(m, xInject) + -- 自定义 + local m1 = { szOption = _L['Other channel'] } + for _, szMsgType in ipairs(MY_ChatLog.MSG_TYPE_CUSTOM) do + local tInject + if X.IsFunction(xInject) then + tInject = xInject(szMsgType) + elseif X.IsTable(xInject) then + tInject = xInject + end + local t1 = { + szOption = MY_ChatLog.MSG_TYPE_TITLE[szMsgType], + rgb = MY_ChatLog.MSG_TYPE_COLOR[szMsgType], + bCheck = true, + } + if tInject then + for k, v in pairs(tInject) do + t1[k] = v + end + end + table.insert(m1, t1) + end + table.insert(m, m1) + return m + end + + ui:Append('WndComboBox', { + x = nX, y = nY, w = nComponentW, h = 25, + text = _L['Channel settings'], + menu = function() + local menu = {} + for _, tChannel in ipairs(MY_ChatLog.aChannel) do + local tMsgTypeChecked = {} + for _, szMsgType in ipairs(tChannel.aMsgType) do + tMsgTypeChecked[szMsgType] = true + end + local m = { + szOption = tChannel.szTitle, + { + szOption = _L['Rename channel'], + fnAction = function() + GetUserInput(_L['Please input new channel name:'], function(szTitle) + tChannel.szTitle = szTitle + MY_ChatLog.aChannel = MY_ChatLog.aChannel + end, nil, nil, nil, tChannel.szTitle) + X.UI.ClosePopupMenu() + end, + }, + X.CONSTANT.MENU_DIVIDER, + } + InsertChatLogMsgTypeMenu(m, function(szMsgType) + return { + fnAction = function(szMsgType) + for i, v in ipairs(tChannel.aMsgType) do + if v == szMsgType then + table.remove(tChannel.aMsgType, i) + MY_ChatLog.aChannel = MY_ChatLog.aChannel + return + end + end + table.insert(tChannel.aMsgType, szMsgType) + MY_ChatLog.aChannel = MY_ChatLog.aChannel + end, + bChecked = tMsgTypeChecked[szMsgType], + } + end) + table.insert(menu, m) + end + if #menu > 0 then + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + table.insert(menu, { + szOption = _L['New channel'], + fnAction = function() + GetUserInput(_L['Please input new channel name:'], function(szTitle) + table.insert(MY_ChatLog.aChannel, { + szKey = X.GetUUID(), + szTitle = szTitle, + aMsgType = {}, + }) + MY_ChatLog.aChannel = MY_ChatLog.aChannel + end, nil, nil, nil, _L['New channel']) + X.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Reset channel'], + rgb = {255, 0, 0}, + fnAction = function() + X.Confirm(_L['Are you sure to reset channel settings? Al custom channel settings will be lost.'], function() + MY_ChatLog.ResetChannel() + end) + X.UI.ClosePopupMenu() + end, + }) + return menu + end, + }) + nY = nY + nDeltaY + + ui:Append('WndComboBox', { + x = nX, y = nY, w = nComponentW, h = 25, + text = _L['Chat log filter'], + menu = function() + return InsertChatLogMsgTypeMenu( + {}, + function(szMsgType) + local t1 = {} + -- 消息必须不包含下列任何: + local aExcludeFilter = MY_ChatLog.tExcludeFilter[szMsgType] or {} + if #aExcludeFilter > 0 then + table.insert(t1, { + szOption = _L['Message must exclude:'], + bDisable = true, + }) + end + for nIndex, tFilter in ipairs(aExcludeFilter) do + table.insert(t1, { + szOption = tFilter.szText, + { + szOption = _L['Pattern match'], + bCheck = true, bChecked = tFilter.bPattern, + fnAction = function() + tFilter.bPattern = not tFilter.bPattern + MY_ChatLog.tExcludeFilter[szMsgType] = aExcludeFilter + MY_ChatLog.tExcludeFilter = MY_ChatLog.tExcludeFilter + end, + }, + { + szOption = _L['Edit'], + fnAction = function() + GetUserInput('', function(szFilter) + aExcludeFilter[nIndex].szText = szFilter + MY_ChatLog.tExcludeFilter[szMsgType] = aExcludeFilter + MY_ChatLog.tExcludeFilter = MY_ChatLog.tExcludeFilter + end, nil, nil, nil, tFilter.szText) + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Delete'], + rgb = {255, 0, 0}, + fnAction = function() + X.Confirm(_L['Are you sure to delete this filter?'] .. '\n\n' .. tFilter.szText, function() + table.remove(aExcludeFilter, nIndex) + MY_ChatLog.tExcludeFilter[szMsgType] = aExcludeFilter + MY_ChatLog.tExcludeFilter = MY_ChatLog.tExcludeFilter + end) + X.UI.ClosePopupMenu() + end, + }, + }) + end + if #t1 > 0 then + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + end + -- 消息必须包含下列任何: + local aIncludeFilter = MY_ChatLog.tIncludeFilter[szMsgType] or {} + if #aIncludeFilter > 0 then + table.insert(t1, { + szOption = _L['Message must include:'], + bDisable = true, + }) + end + for nIndex, tFilter in ipairs(aIncludeFilter) do + table.insert(t1, { + szOption = tFilter.szText, + { + szOption = _L['Pattern match'], + bCheck = true, bChecked = tFilter.bPattern, + fnAction = function() + tFilter.bPattern = not tFilter.bPattern + MY_ChatLog.tIncludeFilter[szMsgType] = aIncludeFilter + MY_ChatLog.tIncludeFilter = MY_ChatLog.tIncludeFilter + end, + }, + { + szOption = _L['Edit'], + fnAction = function() + GetUserInput('', function(szFilter) + aIncludeFilter[nIndex].szText = szFilter + MY_ChatLog.tIncludeFilter[szMsgType] = aIncludeFilter + MY_ChatLog.tIncludeFilter = MY_ChatLog.tIncludeFilter + end, nil, nil, nil, tFilter.szText) + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Delete'], + rgb = {255, 0, 0}, + fnAction = function() + X.Confirm(_L['Are you sure to delete this filter?'] .. '\n\n' .. tFilter.szText, function() + table.remove(aIncludeFilter, nIndex) + MY_ChatLog.tIncludeFilter[szMsgType] = aIncludeFilter + MY_ChatLog.tIncludeFilter = MY_ChatLog.tIncludeFilter + end) + X.UI.ClosePopupMenu() + end, + }, + }) + end + if #t1 > 0 then + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + end + -- 添加 + table.insert(t1, { + szOption = _L['Add'], + fnAction = function() + X.Confirm('MY_ChatLog_PS_Filter_Add', _L['Which kind of filter do you want to add?'], { + szResolve = _L['Message exclude'], + fnResolve = function () + GetUserInput('', function(szFilter) + table.insert(aExcludeFilter, { + szText = szFilter, + bPattern = false, + }) + MY_ChatLog.tExcludeFilter[szMsgType] = aExcludeFilter + MY_ChatLog.tExcludeFilter = MY_ChatLog.tExcludeFilter + end, nil, nil, nil, '') + end, + szReject = _L['Message include'], + fnReject = function () + GetUserInput('', function(szFilter) + table.insert(aIncludeFilter, { + szText = szFilter, + bPattern = false, + }) + MY_ChatLog.tIncludeFilter[szMsgType] = aIncludeFilter + MY_ChatLog.tIncludeFilter = MY_ChatLog.tIncludeFilter + end, nil, nil, nil, '') + end, + }) + X.UI.ClosePopupMenu() + end, + }) + return t1 + end + ) + end, + }) + nY = nY + nDeltaY + + ui:Append('WndComboBox', { + x = nX, y = nY, w = nComponentW, h = 25, + text = _L['Clear chat log'], + r = 255, g = 0, b = 0, + menu = function() + local menu = InsertChatLogMsgTypeMenu( + {}, + { + fnAction = function(szMsgType) + X.Confirm(_L('Are you sure to clear msg type chat log of %s? All chat logs in this msg type will be lost.', MY_ChatLog.MSG_TYPE_TITLE[szMsgType] or g_tStrings.tChannelName[szMsgType] or szMsgType), function() + local ds = MY_ChatLog_DS(MY_ChatLog.GetRoot()) + ds:DeleteMsgByCondition({szMsgType}, '', 0, math.huge) + end) + X.UI.ClosePopupMenu() + end, + } + ) + return menu + end, + }) + nY = nY + nDeltaY + + if not X.IsRestricted('MY_ChatLog.RealtimeCommit') then + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Realtime database commit'], + checked = MY_ChatLog.bRealtimeCommit, + onCheck = function(bChecked) + MY_ChatLog.bRealtimeCommit = bChecked + end, + }) + nY = nY + nDeltaY + end + + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Auto connect database'], + checked = MY_ChatLog.bAutoConnectDB, + onCheck = function(bChecked) + MY_ChatLog.bAutoConnectDB = bChecked + end, + }) + nY = nY + nDeltaY + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, w = nW, text = _L['Tips'], font = 27, multiline = true, alignVertical = 0 }) + nY = nY + 30 + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, w = nW, text = _L['MY_ChatLog TIPS'], font = 27, multiline = true, alignVertical = 0 }) + + -- 右侧 + nX = nW - 150 + nY = nPaddingY + nDeltaY = 40 + ui:Append('WndButton', { + x = nX, y = nY, w = 125, h = 35, + text = _L['Open chatlog'], + onClick = function() + MY_ChatLog.Open() + end, + }) + nY = nY + nDeltaY + + ui:Append('WndButton', { + x = nX, y = nY, w = 125, h = 35, + text = _L['Export chatlog'], + onClick = function() + D.ExportConfirm() + end, + }) + nY = nY + nDeltaY + + ui:Append('WndButton', { + x = nX, y = nY, w = 125, h = 35, + text = _L['Optimize datebase'], + onClick = function() + X.Confirm(_L['Optimize datebase will take a long time and may cause a disconnection, are you sure to continue?'], function() + X.Confirm(_L['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'], function() + MY_ChatLog.OptimizeDB() + X.Alert(_L['Optimize finished!']) + end) + end) + end, + }) + nY = nY + nDeltaY + + ui:Append('WndButton', { + x = nX, y = nY, w = 125, h = 35, + text = _L['Import chatlog'], + onClick = function() + local szRoot = X.FormatPath({'export/ChatLog', X.PATH_TYPE.ROLE}) + if not IsLocalFileExist(szRoot) then + szRoot = X.FormatPath({'export/', X.PATH_TYPE.ROLE}) + end + if not IsLocalFileExist(szRoot) then + szRoot = X.FormatPath({'userdata/', X.PATH_TYPE.ROLE}) + end + local file = GetOpenFileName(_L['Please select your chatlog database file.'], 'Database File(*.db)\0*.db\0\0', szRoot) + if not X.IsEmpty(file) then + X.Confirm(_L['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'], function() + local nImport, bOthersFound = MY_ChatLog.ImportDB(file) + local szText = _L('%d chatlogs imported!', nImport) + if bOthersFound then + szText = szText .. _L['Others chat log found, please do not import other role chat log!'] + end + X.Alert(szText) + end) + end + end, + }) + nY = nY + nDeltaY +end +X.Panel.Register(_L['Chat'], 'ChatLog', _L['MY_ChatLog'], 'ui/Image/button/SystemButton.UITex|43', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog.lua b/MY_ChatLog/src/MY_ChatLog.lua new file mode 100644 index 000000000..d4eb2371f --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog.lua @@ -0,0 +1,637 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 记录团队/好友/帮会/密聊 供日后查询 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ChatLog.DEVELOP', { ['*'] = true }) +X.RegisterRestriction('MY_ChatLog.BanHDD', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local MSG_TYPE_CUSTOM = { + 'MSG_MY_MONITOR', +} + +local MSG_TYPE_TITLE = setmetatable({ + ['MSG_MY_MONITOR'] = _L['MY Monitor'], +}, {__index = g_tStrings.tChannelName}) + +local MSG_TYPE_COLOR = setmetatable({ + ['MSG_MY_MONITOR'] = {255, 255, 0}, +}, {__index = function(t, k) return GetMsgFontColor(k, true) end}) + +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['Chat'], { + bRealtimeCommit = { -- 实时写入数据库 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['Realtime database commit'], + }), + szRestriction = 'MY_ChatLog.DEVELOP', + xSchema = IsDebugClient() and X.Schema.Boolean or false, + xDefaultValue = false, + }, + bAutoConnectDB = { -- 登录时自动连接数据库 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['Auto connect database'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + aChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['Channel settings'], + }), + xSchema = X.Schema.Collection( + X.Schema.Record({ + szKey = X.Schema.String, + szTitle = X.Schema.String, + aMsgType = X.Schema.Collection(X.Schema.String), + }) + ), + xDefaultValue = (function() + local aChannel = { + { szKey = 'whisper', szTitle = MSG_TYPE_TITLE['MSG_WHISPER'], aMsgType = {'MSG_WHISPER', 'MSG_SSG_WHISPER'} }, + { szKey = 'party' , szTitle = MSG_TYPE_TITLE['MSG_PARTY'], aMsgType = {'MSG_PARTY'} }, + { szKey = 'team' , szTitle = MSG_TYPE_TITLE['MSG_TEAM'], aMsgType = {'MSG_TEAM'} }, + { szKey = 'room' , szTitle = MSG_TYPE_TITLE['MSG_ROOM'], aMsgType = {'MSG_ROOM'} }, + { szKey = 'friend' , szTitle = MSG_TYPE_TITLE['MSG_FRIEND'], aMsgType = {'MSG_FRIEND'} }, + { szKey = 'guild' , szTitle = MSG_TYPE_TITLE['MSG_GUILD'], aMsgType = {'MSG_GUILD'} }, + { szKey = 'guild_a', szTitle = MSG_TYPE_TITLE['MSG_GUILD_ALLIANCE'], aMsgType = {'MSG_GUILD_ALLIANCE'} }, + { szKey = 'death' , szTitle = _L['Death Log'], aMsgType = {'MSG_SELF_DEATH', 'MSG_SELF_KILL', 'MSG_PARTY_DEATH', 'MSG_PARTY_KILL'} }, + { + szKey = 'journal', szTitle = _L['Journal Log'], aMsgType = (function() + for _, v in ipairs(X.CONSTANT.MSG_TYPE_MENU) do + if v.szOption == g_tStrings.EARN then + local a = {} + for _, vv in ipairs(v) do + table.insert(a, vv) + end + return a + end + end + return { + 'MSG_MONEY', 'MSG_ITEM', --'MSG_EXP', 'MSG_REPUTATION', 'MSG_CONTRIBUTE', 'MSG_ATTRACTION', 'MSG_PRESTIGE', + -- 'MSG_TRAIN', 'MSG_MENTOR_VALUE', 'MSG_THEW_STAMINA', 'MSG_TONG_FUND' + } + end)(), + }, + { szKey = 'monitor', szTitle = MSG_TYPE_TITLE['MSG_MY_MONITOR'], aMsgType = {'MSG_MY_MONITOR'} }, + } + for i, v in X.ipairs_r(aChannel) do + if not v or not v.szTitle then + table.remove(aChannel, i) + end + end + return aChannel + end)(), + }, + tUncheckedChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['UI Channel Check State'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + }, + tExcludeFilter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['Chat log filter'], + _L['Exclude'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Collection(X.Schema.Record({ + szText = X.Schema.String, + bPattern = X.Schema.Boolean, + }))), + xDefaultValue = { + ['MSG_GUILD'] = { + { + szText = '^' .. X.EscapeString(g_tStrings.STR_TALK_HEAD_TONG .. g_tStrings.STR_GUILD_ONLINE_MSG), + bPattern = true, + }, + { + szText = '^' .. X.EscapeString(g_tStrings.STR_GUILD_MEMBER_LOGIN):gsub('', '.-'):gsub('\n', '%%s') .. '$', + bPattern = true, + }, + { + szText = '^' .. X.EscapeString(g_tStrings.STR_GUILD_MEMBER_LOGOUT):gsub('', '.-'):gsub('\n', '%%s') .. '$', + bPattern = true, + }, + }, + }, + }, + tIncludeFilter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ChatLog'], + szDescription = X.MakeCaption({ + _L['Chat log filter'], + _L['Include'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Collection(X.Schema.Record({ + szText = X.Schema.String, + bPattern = X.Schema.Boolean, + }))), + xDefaultValue = { + ['MSG_ACHIEVEMENT'] = { + { + szText = _L['You\'ve achieved'], + bPattern = false, + }, + }, + ['MSG_DESGNATION'] = { + { + szText = _L['You got designation'], + bPattern = false, + }, + }, + }, + }, +}) +local D = {} + +------------------------------------------------------------------------------------------------------ +-- 数据采集 +------------------------------------------------------------------------------------------------------ +local TONG_ONLINE_MSG = '^' .. X.EscapeString(g_tStrings.STR_TALK_HEAD_TONG .. g_tStrings.STR_GUILD_ONLINE_MSG) +local TONG_MEMBER_LOGIN_MSG = '^' .. X.EscapeString(g_tStrings.STR_GUILD_MEMBER_LOGIN):gsub('', '.-') .. '$' +local TONG_MEMBER_LOGOUT_MSG = '^' .. X.EscapeString(g_tStrings.STR_GUILD_MEMBER_LOGOUT):gsub('', '.-') .. '$' + +------------------------------------------------------------------------------------------------------ +-- 数据库控制器 +------------------------------------------------------------------------------------------------------ +local LOG_LIMIT = (X.ENVIRONMENT.GAME_PROVIDER == 'remote' and not X.IsDebugClient()) + and { + { aKey = {'whisper'}, nLimit = 5000 }, + { aKey = {'party', 'team', 'room'}, nLimit = 5000 }, + { aKey = {'friend'}, nLimit = 5000 }, + { aKey = {'guild', 'guild_a'}, nLimit = 1000 }, + { aKey = {'death', 'journal'}, nLimit = 1000 }, + { aKey = {'monitor'}, nLimit = 1000 }, + } + or {} +local UNSAVED_MSG_LIST, MAIN_DS = {} + +-- 旧版数据频道对应数据库中数值 +local V1_MSG_TYPE_MAP = { + [1] = 'MSG_WHISPER', + [2] = 'MSG_PARTY', + [3] = 'MSG_TEAM', + [4] = 'MSG_FRIEND', + [5] = 'MSG_GUILD', + [6] = 'MSG_GUILD_ALLIANCE', + [7] = 'MSG_SELF_DEATH', + [8] = 'MSG_SELF_KILL', + [9] = 'MSG_PARTY_DEATH', + [10] = 'MSG_PARTY_KILL', + [11] = 'MSG_MONEY', + [12] = 'MSG_EXP', + [13] = 'MSG_ITEM', + [14] = 'MSG_REPUTATION', + [15] = 'MSG_CONTRIBUTE', + [16] = 'MSG_ATTRACTION', + [17] = 'MSG_PRESTIGE', + [18] = 'MSG_TRAIN', + [19] = 'MSG_MENTOR_VALUE', + [20] = 'MSG_THEW_STAMINA', + [21] = 'MSG_TONG_FUND', + [22] = 'MSG_MY_MONITOR', + [23] = 'MSG_SSG_WHISPER', +} + +function D.UpdateEnable() + local bBan = X.IsRestricted('MY_ChatLog.BanHDD') and X.GetDiskType() == 'HDD' + D.bEnable = not bBan + D.RegisterMsgMonitor() +end + +function D.GetRoot() + local szRoot = X.FormatPath({'userdata/chat_log/', X.PATH_TYPE.ROLE}) + if not IsLocalFileExist(szRoot) then + CPath.MakeDir(szRoot) + end + return szRoot +end + +function D.Open() + MY_ChatLog_UI.Open(D.GetRoot()) +end + +function D.ResetChannel() + O('reset', { 'aChannel' }) + D.RegisterMsgMonitor() + FireUIEvent('ON_MY_CHAT_LOG_CHANNEL_CHANGE') +end + +function D.InitDB(szMode) + if MAIN_DS then + return true + end + if not szMode then + szMode = 'ask' + end + if szMode == 'silent' and not X.IsRestricted('MY_ChatLog.DEVELOP') then + szMode = 'sure' + end + local ds, bSuccess = MY_ChatLog_DS(D.GetRoot()), true + if not ds:InitDB() then + bSuccess = false + if szMode == 'ask' then + X.Confirm(_L['Problem(s) detected on your chatlog database and must be fixed before use, would you like to do this now?'], function() + X.Alert(_L['Your client may get no responding, please wait until it finished, otherwise your chatlog data may got lost, press yes to start.'], function() + D.InitDB('sure') + end) + end) + elseif szMode == 'sure' then + ds:InitDB(true):OptimizeDB() + MY.Alert(_L['Fix succeed!']) + bSuccess = true + end + end + if bSuccess then + for _, a in ipairs(UNSAVED_MSG_LIST) do + ds:InsertMsg(unpack(a)) + end + MAIN_DS, UNSAVED_MSG_LIST = ds, {} + end + return bSuccess +end + +-- 导入数据 +function D.ImportDB(aPath) + if X.IsString(aPath) then + aPath = {aPath} + end + -- 先释放存储集群防止出现缓存同步问题 + D.ReleaseDB() + -- 开始导入 + local nImportCount = 0 + local bOthersFound = false + for _, szPath in ipairs(aPath) do + local odb = X.SQLiteConnect(_L['MY_ChatLog'], szPath) + if odb then + -- 老版分表机制 + local szGlobalID = X.Get(X.SQLiteGetAll(odb, 'SELECT * FROM ChatLogInfo WHERE key = "userguid"'), {1, 'value'}) + if szGlobalID == X.GetClientPlayerGlobalID() then + for _, info in ipairs(X.SQLiteGetAll(odb, 'SELECT * FROM ChatLogIndex WHERE name IS NOT NULL ORDER BY stime ASC') or X.CONSTANT.EMPTY_TABLE) do + if info.etime == -1 then + info.etime = 0 + end + local db = MY_ChatLog_DB(D.GetRoot() .. info.name .. '.v2.db') + db:SetMinTime(info.stime) + db:SetMaxTime(info.etime) + db:SetInfo('version', '2') + db:SetInfo('user_global_id', szGlobalID) + for _, p in ipairs(X.SQLiteGetAll(odb, 'SELECT * FROM ' .. info.name .. ' WHERE talker IS NOT NULL ORDER BY time ASC') or X.CONSTANT.EMPTY_TABLE) do + local szMsgType = V1_MSG_TYPE_MAP[p.channel] + if szMsgType then + nImportCount = nImportCount + 1 + db:InsertMsg(szMsgType, p.text, p.msg, p.talker, p.time, p.hash) + end + end + db:Flush() + db:Disconnect() + end + elseif X.IsGlobalID(szGlobalID) then + bOthersFound = true + end + -- 新版导出数据 + local szGlobalID = X.DecodeLUAData(X.Get(X.SQLiteGetAll(odb, 'SELECT value FROM ChatInfo WHERE key = "user_global_id"'), {1, 'value'}, '')) or '' + if szGlobalID == X.GetClientPlayerGlobalID() then + local szVersion = X.DecodeLUAData(X.Get(X.SQLiteGetAll(odb, 'SELECT value FROM ChatInfo WHERE key = "version"'), {1, 'value'}, '')) or '' + local nCount = X.Get(X.SQLiteGetAll(odb, 'SELECT COUNT(*) AS nCount FROM ChatLog'), {1, 'nCount'}, 0) + if nCount > 0 then + local szRoot, nOffset, nLimit, szNewPath, dbNew = D.GetRoot(), 0, 20000 + local stmt, aRes = X.SQLitePrepare(odb, 'SELECT * FROM ChatLog WHERE talker IS NOT NULL ORDER BY time ASC LIMIT ' .. nLimit .. ' OFFSET ?') + while nOffset < nCount do + aRes = X.SQLitePrepareGetAll(stmt, nOffset) + if #aRes > 0 then + repeat + szNewPath = szRoot .. ('chatlog_%x'):format(X.Random(0x100000, 0xFFFFFF)) .. '.v2.db' + until not IsLocalFileExist(szNewPath) + dbNew = MY_ChatLog_DB(szNewPath) + dbNew:SetMinTime(aRes[1].time) + dbNew:SetMaxTime(aRes[#aRes].time) + dbNew:SetInfo('version', '2') + dbNew:SetInfo('user_global_id', szGlobalID) + for _, p in ipairs(aRes) do + if szVersion == '2' then + nImportCount = nImportCount + 1 + dbNew:InsertMsg(p.type, p.text, p.msg, p.talker, p.time, p.hash) + else + local szMsgType = V1_MSG_TYPE_MAP[p.channel] + if szMsgType then + nImportCount = nImportCount + 1 + dbNew:InsertMsg(szMsgType, p.text, p.msg, p.talker, p.time, p.hash) + end + end + end + dbNew:Flush() + dbNew:Disconnect() + end + nOffset = nOffset + nLimit + end + end + elseif X.IsGlobalID(szGlobalID) then + bOthersFound = true + end + odb:Release() + end + end + -- 优化集群数据 + local ds = MY_ChatLog_DS(D.GetRoot()) + ds:InitDB(true) + ds:OptimizeDB() + ds:ReleaseDB() + return nImportCount, bOthersFound +end + +function D.OptimizeDB() + if not D.InitDB('sure') then + return + end + MAIN_DS:OptimizeDB() +end + +-- 检查升级数据库版本 +function D.MigrateDB() + local aImportPath = {} + -- 旧版单文件 + local DB_V0_PATH = X.FormatPath({'userdata/chat_log.db', X.PATH_TYPE.ROLE}) + if IsLocalFileExist(DB_V0_PATH) then + table.insert(aImportPath, DB_V0_PATH) + end + -- 旧版集群V1 + for _, szName in ipairs(CPath.GetFileList(D.GetRoot()) or {}) do + if szName:find('^chatlog_[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]%.db$') then + table.insert(aImportPath, D.GetRoot() .. szName) + end + end + if X.IsEmpty(aImportPath) then + return + end + X.Confirm(_L['Ancient chatlog detected, you can migrate chatlog database from them, that may take a while and cannot be break, do you want to do it now?'], function() + X.Alert(_L['Your client may get no responding, please wait until it finished, otherwise your chatlog data may got lost, press yes to start.'], function() + D.ImportDB(aImportPath) + for _, szPath in ipairs(aImportPath) do + CPath.Move(szPath, szPath .. '.bak' .. GetCurrentTime()) + end + MY.Alert(_L['Upgrade succeed!']) + end) + end) +end + +local REGISTER_MONITOR_MSG_TYPE = {} +function D.RegisterMsgMonitor() + for szMsgType, _ in pairs(REGISTER_MONITOR_MSG_TYPE) do + X.RegisterMsgMonitor(szMsgType, 'MY_ChatLog', false) + end + if not D.bEnable then + return + end + local tMsgType = {} + for _, info in ipairs(MY_ChatLog.aChannel) do + for _, szMsgType in ipairs(info.aMsgType) do + tMsgType[szMsgType] = true + end + end + for szMsgType, _ in pairs(tMsgType) do + X.RegisterMsgMonitor(szMsgType, 'MY_ChatLog', function(szMsgType, szMsg, nFont, bRich, r, g, b, dwTalkerID, szTalker) + local szText = szMsg + if bRich then + szText = GetPureText(szMsg) + else + szMsg = GetFormatText(szMsg, nFont, r, g, b) + end + -- filters + if D.bReady then + local aExcludeFilter = O.tExcludeFilter[szMsgType] or {} + for _, v in ipairs(aExcludeFilter) do + if szText:find(v.szText, nil, not v.bPattern) then + return + end + end + local aIncludeFilter = O.tIncludeFilter[szMsgType] or {} + if #aIncludeFilter > 0 then + local bPass = false + for _, v in ipairs(aIncludeFilter) do + if szText:find(v.szText, nil, not v.bPattern) then + bPass = true + break + end + end + if not bPass then + return + end + end + end + if MY_Chat and MY_Chat.UnwrapRawMessage then + szMsg = MY_Chat.UnwrapRawMessage(szMsg) + end + if MAIN_DS then + MAIN_DS:InsertMsg(szMsgType, szText, szMsg, szTalker, GetCurrentTime()) + if D.bReady and O.bRealtimeCommit and not X.IsRestricted('MY_ChatLog.RealtimeCommit') then + D.FlushDB() + end + else + table.insert(UNSAVED_MSG_LIST, {szMsgType, szText, szMsg, szTalker, GetCurrentTime()}) + end + end) + end + REGISTER_MONITOR_MSG_TYPE = tMsgType +end + +function D.OnInit() + if not X.GetClientPlayer() then + return X.DelayCall(500, D.OnInit) + end + D.UpdateEnable() + if D.bEnable and O.bAutoConnectDB then + D.InitDB('ask') + end +end + +function D.FlushDB(bCheckExceed) + if not D.bEnable then + return + end + if not D.InitDB('silent') then + return + end + MAIN_DS:FlushDB() + -- 数据超限检查处理 + if not bCheckExceed then + return + end + local bExceed = false + for _, p in ipairs(LOG_LIMIT) do + local aMsgType = {} + for _, szKey in ipairs(p.aKey) do + for _, info in ipairs(MY_ChatLog.aChannel) do + if info.szKey == szKey then + for _, szMsgType in ipairs(info.aMsgType) do + table.insert(aMsgType, szMsgType) + end + end + end + end + local nCount = MAIN_DS:CountMsg(aMsgType) + if nCount > p.nLimit then + local aMsg = MAIN_DS:SelectMsg(aMsgType, nil, nil, nil, nCount - p.nLimit, 1) + if aMsg and aMsg[1] then + bExceed = true + MAIN_DS:DeleteMsgByCondition(aMsgType, '', 0, aMsg[1].nTime) + end + end + end + if bExceed then + D.OptimizeDB() + end +end + +function D.ReleaseDB() + FireUIEvent('ON_MY_CHAT_LOG_RELEASE_DB') + D.FlushDB(true) + if not MAIN_DS then + return + end + MAIN_DS:ReleaseDB() +end +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatLog', + exports = { + { + fields = { + MSG_TYPE_CUSTOM = MSG_TYPE_CUSTOM, + MSG_TYPE_TITLE = MSG_TYPE_TITLE, + MSG_TYPE_COLOR = MSG_TYPE_COLOR, + 'Open', + 'GetRoot', + 'InitDB', + 'MigrateDB', + 'OptimizeDB', + 'ImportDB', + 'ResetChannel', + }, + root = D, + }, + { + fields = { + 'bRealtimeCommit', + 'bAutoConnectDB', + 'aChannel', + 'tUncheckedChannel', + 'tExcludeFilter', + 'tIncludeFilter', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bRealtimeCommit', + 'bAutoConnectDB', + 'aChannel', + 'tUncheckedChannel', + 'tExcludeFilter', + 'tIncludeFilter', + }, + triggers = { + aChannel = function() + D.RegisterMsgMonitor() + FireUIEvent('ON_MY_CHAT_LOG_CHANNEL_CHANGE') + end, + }, + root = O, + }, + }, +} +MY_ChatLog = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('LOADING_ENDING', 'MY_ChatLog_Save', function() + if MAIN_DS then + D.FlushDB() + end +end) + +X.RegisterIdle('MY_ChatLog_Save', function() + if MAIN_DS and not X.IsRestricted('MY_ChatLog.DEVELOP') then + D.FlushDB() + end +end) + +X.RegisterInit('MY_ChatLog_InitDB', D.OnInit) +X.RegisterExit('MY_ChatLog_Release', D.ReleaseDB) + +X.RegisterUserSettingsInit('MY_ChatLog', function() + D.bReady = true + D.RegisterMsgMonitor() +end) +X.RegisterUserSettingsRelease('MY_ChatLog', function() + D.bReady = false +end) + +X.RegisterEvent('MY_RESTRICTION', 'MY_ChatLog.BanHDD', function() + if arg0 and arg0 ~= 'MY_ChatLog.BanHDD' then + return + end + D.UpdateEnable() +end) + +X.RegisterEvent('DISCONNECT', 'MY_ChatLog_Release', function() + if X.IsRestricted('MY_ChatLog.DEVELOP') then + return + end + D.ReleaseDB() +end) + +X.RegisterAddonMenu('MY_ChatLog_Menu', { + szOption = _L['MY_ChatLog'], + fnAction = D.Open, +}) +X.RegisterHotKey('MY_ChatLog', _L['MY_ChatLog'], D.Open, nil) + +-- ===== 性能测试 ===== +-- X.RegisterInit(function() +-- local ds = MY_ChatLog_DS(D.GetRoot()) +-- local szTalker = '名字@服务器' +-- local szMsg = g_tStrings.STR_TONG_BAO_DESC +-- local szText = GetPureText(szMsg) +-- for i = 0, 20001 do +-- ds:InsertMsg('MSG_WHISPER', szText, szMsg, szTalker, 110000 + i) +-- end +-- ds:FlushDB() +-- end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog_DB.lua b/MY_ChatLog/src/MY_ChatLog_DB.lua new file mode 100644 index 000000000..431155b30 --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog_DB.lua @@ -0,0 +1,438 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 数据库支持类 仅做读写功能 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog_DB' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local DB = class() +local DB_CACHE = setmetatable({}, {__mode = 'v'}) +local SELECT_MSG = 'SELECT hash AS szHash, type AS szMsgType, time AS nTime, talker AS szTalker, text AS szText, msg AS szMsg FROM ChatLog' +local DELETE_MSG = 'DELETE FROM ChatLog' + +local function FormatCommonParam(szSearch, nMinTime, nMaxTime, nOffset, nLimit) + if not szSearch then + szSearch = '' + end + if not nMinTime then + nMinTime = 0 + end + if not nMaxTime then + nMaxTime = math.huge + end + if not nOffset then + nOffset = 0 + end + if not nLimit then + nLimit = math.huge + end + return szSearch, nMinTime, nMaxTime, nOffset, nLimit +end + +local function AppendCommonWhere(szSQL, aValue, aMsgType, szSearch, nMinTime, nMaxTime) + local szWhere = '' + local aWhere = {} + if aMsgType then + for _, szMsgType in ipairs(aMsgType) do + table.insert(aWhere, 'type = ?') + table.insert(aValue, szMsgType) + end + end + if #aWhere > 0 then + if #szWhere > 0 then + szWhere = szWhere .. ' AND' + end + szWhere = szWhere .. ' (' .. table.concat(aWhere, ' OR ') .. ')' + end + if X.IsNumber(nMinTime) and nMinTime > 0 then + if #szWhere > 0 then + szWhere = szWhere .. ' AND' + end + szWhere = szWhere .. ' (time >= ?)' + table.insert(aValue, nMinTime) + end + if X.IsNumber(nMaxTime) and not X.IsHugeNumber(nMaxTime) then + if #szWhere > 0 then + szWhere = szWhere .. ' AND' + end + szWhere = szWhere .. ' (time <= ?)' + table.insert(aValue, nMaxTime) + end + if X.IsString(szSearch) and not X.IsEmpty(szSearch) then + if #szWhere > 0 then + szWhere = szWhere .. ' AND' + end + szWhere = szWhere .. ' (talker LIKE ? OR text LIKE ?)' + table.insert(aValue, szSearch) + table.insert(aValue, szSearch) + end + if #szWhere > 0 then + if X.StringFindW(szSQL, ' WHERE ') then + szSQL = szSQL .. ' AND' .. szWhere + else + szSQL = szSQL .. ' WHERE' .. szWhere + end + end + return szSQL +end + +local function AppendCommonLimit(szSQL, aValue, nOffset, nLimit) + if (nOffset and not nLimit) or X.IsHugeNumber(nLimit) then + nLimit = -1 + end + if nLimit then + szSQL = szSQL .. ' LIMIT ?' + table.insert(aValue, nLimit) + end + if nOffset then + szSQL = szSQL .. ' OFFSET ?' + table.insert(aValue, nOffset) + end + return szSQL +end + +function DB:ctor(szFilePath) + self.szFilePath = szFilePath + self.aInsertQueue = {} + self.aDeleteQueue = {} + return self +end + +function DB:GetFilePath() + return self.szFilePath +end + +function DB:ToString() + return '"' .. self:GetFilePath() .. '"(' .. self:GetMinTime() .. ',' .. self:GetMaxTime() .. ')' +end + +function DB:Connect(bCheck) + if not self:IsConnected() then + if bCheck then + self.db = X.SQLiteConnect(_L['MY_ChatLog'], self.szFilePath) + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Quick connect database: ' .. self.szFilePath, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + self.db = SQLite3_Open(self.szFilePath) + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Init database with STMT', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + if self.db then + X.SQLiteExecute(self.db, [[ + CREATE TABLE IF NOT EXISTS ChatInfo ( + key NVARCHAR(128) NOT NULL, + value NVARCHAR(4096) NOT NULL, + PRIMARY KEY (key) + ) + ]]) + self.stmtInfoGet = X.SQLitePrepare(self.db, 'SELECT value FROM ChatInfo WHERE key = ?') + self.stmtInfoSet = X.SQLitePrepare(self.db, 'REPLACE INTO ChatInfo (key, value) VALUES (?, ?)') + X.SQLiteExecute(self.db, [[ + CREATE TABLE IF NOT EXISTS ChatLog ( + hash INTEGER NOT NULL, + type VARCHAR(64) NOT NULL, + time INTEGER NOT NULL, + talker NVARCHAR(20) NOT NULL, + text NVARCHAR(400) NOT NULL, + msg NVARCHAR(4000) NOT NULL, + PRIMARY KEY (time, hash) + ) + ]]) + X.SQLiteExecute(self.db, 'CREATE INDEX IF NOT EXISTS ChatLog_type_idx ON ChatLog(type)') + X.SQLiteExecute(self.db, 'CREATE INDEX IF NOT EXISTS ChatLog_talker_idx ON ChatLog(talker)') + X.SQLiteExecute(self.db, 'CREATE INDEX IF NOT EXISTS ChatLog_text_idx ON ChatLog(text)') + self.stmtCount = X.SQLitePrepare(self.db, 'SELECT type AS szMsgType, COUNT(*) AS nCount FROM ChatLog WHERE talker LIKE ? OR text LIKE ? GROUP BY szMsgType') + self.stmtInsert = X.SQLitePrepare(self.db, 'REPLACE INTO ChatLog (hash, type, time, talker, text, msg) VALUES (?, ?, ?, ?, ?, ?)') + self.stmtDelete = X.SQLitePrepare(self.db, 'DELETE FROM ChatLog WHERE hash = ? AND time = ?') + end + if self:IsConnected() then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Init database finished: ' .. self.szFilePath, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return true + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Init database failed: ' .. self.szFilePath, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + self:Disconnect() + return false + end + return true +end + +function DB:IsConnected() + if self.db and self.stmtInfoGet and self.stmtInfoSet and self.stmtCount and self.stmtInsert and self.stmtDelete then + return true + end + return false +end + +function DB:Disconnect() + if self.db then + self.db:Release() + self.db = nil + self.stmtInfoGet = nil + self.stmtInfoSet = nil + self.stmtCount = nil + self.stmtInsert = nil + self.stmtDelete = nil + end + return true +end + +function DB:GarbageCollection() + if not self:Connect() then + return false + end + X.SQLiteExecute(self.db, 'VACUUM') + return true +end + +function DB:DeleteDB() + if not self:Disconnect() then + return false + end + CPath.DelFile(self.szFilePath) + return true +end + +function DB:SetInfo(szKey, oValue) + if not self:Connect() then + return false + end + X.SQLitePrepareExecute(self.stmtInfoSet, szKey, X.EncodeLUAData(oValue)) + return true +end + +function DB:GetInfo(szKey) + if not self:Connect() then + return nil, false + end + local res, success = X.Get(X.SQLitePrepareGetOne(self.stmtInfoGet, szKey), {'value'}) + if success then + res = X.DecodeLUAData(res) + end + return res, success +end + +function DB:SetMinTime(nMinTime) + if not self:Connect() then + return false + end + self:Flush() + local nMinRecTime = self:GetMinRecTime() + assert(nMinRecTime == -1 or nMinRecTime >= nMinTime, '[MY_ChatLog_DB:SetMinTime] MinTime cannot be larger than MinRecTime.') + self:SetInfo('min_time', nMinTime) + self._nMinTime = nMinTime + return true +end + +function DB:GetMinTime() + if not self._nMinTime then + self._nMinTime = self:GetInfo('min_time') or 0 + end + return self._nMinTime +end + +function DB:SetMaxTime(nMaxTime) + if not self:Connect() then + return false + end + self:Flush() + if nMaxTime <= 0 then + nMaxTime = math.huge + end + local nMaxRecTime = self:GetMaxRecTime() + assert(nMaxRecTime <= nMaxTime, '[MY_ChatLog_DB:SetMaxTime] MaxTime cannot be smaller than MaxRecTime.') + self:SetInfo('max_time', X.IsHugeNumber(nMaxTime) and 0 or nMaxTime) + self._nMaxTime = nMaxTime + return true +end + +function DB:GetMaxTime() + if not self._nMaxTime then + self._nMaxTime = self:GetInfo('max_time') or 0 + if self._nMaxTime == 0 then + self._nMaxTime = math.huge + end + end + return self._nMaxTime +end + +function DB:InsertMsg(szMsgType, szText, szMsg, szTalker, nTime, szHash) + local nMinTime, nMaxTime = self:GetMinTime(), self:GetMaxTime() + assert(nTime >= nMinTime and nTime <= nMaxTime, + '[MY_ChatLog_DB:InsertMsg] Time(' ..nTime .. ') must between MinTime(' .. nMinTime .. ') and MaxTime(' .. nMaxTime .. ').') + if not szMsgType or not nTime or X.IsEmpty(szMsg) or not szText or X.IsEmpty(szHash) then + return + end + table.insert(self.aInsertQueue, {szHash = szHash, szMsgType = szMsgType, nTime = nTime, szTalker = szTalker, szText = szText, szMsg = szMsg}) +end + +function DB:CountMsg(aMsgType, szSearch, nMinTime, nMaxTime) + if not self:Connect() then + return false + end + self:Flush() + if X.IsTable(aMsgType) and X.IsEmpty(aMsgType) then + return 0 + end + szSearch, nMinTime, nMaxTime = FormatCommonParam(szSearch, nMinTime, nMaxTime) + local bMinTime = X.IsNumber(nMinTime) and nMinTime > self:GetMinTime() + local bMaxTime = X.IsNumber(nMaxTime) and nMaxTime < self:GetMaxTime() + if not aMsgType and X.IsEmpty(szSearch) and not bMinTime and not bMaxTime then + if not self.nCountCache then + self.nCountCache = X.Get(X.SQLiteGetAll(self.db, 'SELECT COUNT(*) AS nCount FROM ChatLog'), {1, 'nCount'}, 0) + end + return self.nCountCache + end + if not self.tCountCache then + self.tCountCache = {} + end + local szKey = szSearch + .. '_' .. (bMinTime and nMinTime or '0') + .. '_' .. (bMaxTime and nMaxTime or 'inf') + local tCount = self.tCountCache[szKey] + if not tCount then + local aResult + if X.IsEmpty(szSearch) and not bMinTime and not bMaxTime then + aResult = X.SQLiteGetAll(self.db, 'SELECT type AS szMsgType, COUNT(*) AS nCount FROM ChatLog GROUP BY type') + elseif bMinTime or bMaxTime then + local szSQL = 'SELECT type AS szMsgType, COUNT(*) AS nCount FROM ChatLog' + local aValue = {} + szSQL = AppendCommonWhere(szSQL, aValue, aMsgType, szSearch, nMinTime, nMaxTime) + aResult = X.SQLitePrepareGetAll(X.SQLitePrepare(self.db, szSQL), unpack(aValue)) + else + aResult = X.SQLitePrepareGetAll(self.stmtCount, szSearch, szSearch) + end + tCount = {} + for _, rec in ipairs(aResult) do + if rec.szMsgType then + tCount[rec.szMsgType] = rec.nCount + end + end + self.tCountCache[szKey] = tCount + end + local nCount = 0 + if aMsgType then + for _, szMsgType in ipairs(aMsgType) do + nCount = nCount + (tCount[szMsgType] or 0) + end + else + for _, n in pairs(tCount) do + nCount = nCount + n + end + end + return nCount +end + +function DB:SelectMsg(aMsgType, szSearch, nMinTime, nMaxTime, nOffset, nLimit) + if not self:Connect() then + return false + end + self:Flush() + if X.IsTable(aMsgType) and X.IsEmpty(aMsgType) then + return {} + end + szSearch, nMinTime, nMaxTime, nOffset, nLimit = FormatCommonParam(szSearch, nMinTime, nMaxTime, nOffset, nLimit) + local szSQL, aValue = SELECT_MSG, {} + szSQL = AppendCommonWhere(szSQL, aValue, aMsgType, szSearch, nMinTime, nMaxTime) + szSQL = szSQL .. ' ORDER BY nTime ASC' + szSQL = AppendCommonLimit(szSQL, aValue, nOffset, nLimit) + return X.SQLiteGetAll(self.db, szSQL, unpack(aValue)) +end + +function DB:GetMinRecTime() + if not self:Connect() then + return false + end + self:Flush() + local rec = X.SQLiteGetAll(self.db, 'SELECT time AS nTime FROM ChatLog ORDER BY nTime ASC LIMIT 1')[1] + return rec and rec.nTime or -1 +end + +function DB:GetMaxRecTime() + if not self:Connect() then + return false + end + self:Flush() + local rec = X.SQLiteGetAll(self.db, 'SELECT time AS nTime FROM ChatLog ORDER BY nTime DESC LIMIT 1')[1] + return rec and rec.nTime or -1 +end + +function DB:DeleteMsg(szHash, nTime) + if nTime and not X.IsEmpty(szHash) then + table.insert(self.aDeleteQueue, {szHash = szHash, nTime = nTime}) + end +end + +function DB:DeleteMsgByCondition(aMsgType, szSearch, nMinTime, nMaxTime) + if not self:Connect() then + return false + end + self:Flush() + if X.IsTable(aMsgType) and X.IsEmpty(aMsgType) then + return true + end + szSearch, nMinTime, nMaxTime = FormatCommonParam(szSearch, nMinTime, nMaxTime) + local szSQL, aValue = DELETE_MSG, {} + szSQL = AppendCommonWhere(szSQL, aValue, aMsgType, szSearch, nMinTime, nMaxTime) + if szSQL ~= DELETE_MSG then + X.SQLiteGetAll(self.db, szSQL, unpack(aValue)) + self:FlushCache() + return true + end + return false +end + +function DB:Flush() + if not X.IsEmpty(self.aInsertQueue) or not X.IsEmpty(self.aDeleteQueue) then + if not self:Connect() then + return false + end + X.SQLiteBeginTransaction(self.db) + -- 插入记录 + for _, data in ipairs(self.aInsertQueue) do + X.SQLitePrepareExecute(self.stmtInsert, data.szHash, data.szMsgType, data.nTime, data.szTalker, data.szText, data.szMsg) + end + self.aInsertQueue = {} + -- 删除记录 + for _, data in ipairs(self.aDeleteQueue) do + X.SQLitePrepareExecute(self.stmtDelete, data.szHash, data.nTime) + end + self.aDeleteQueue = {} + X.SQLiteEndTransaction(self.db) + self:FlushCache() + end + return true +end + +function DB:FlushCache() + self.tCountCache = nil + self.nCountCache = nil +end + +function MY_ChatLog_DB(szFilePath) + if not DB_CACHE[szFilePath] then + DB_CACHE[szFilePath] = DB.new(szFilePath) + end + return DB_CACHE[szFilePath] +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog_DS.lua b/MY_ChatLog/src/MY_ChatLog_DS.lua new file mode 100644 index 000000000..145442734 --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog_DS.lua @@ -0,0 +1,596 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 数据库集群控制器 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog_DS' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +------------------------------------------------------------------------------------------------------ +-- 数据库控制器 +------------------------------------------------------------------------------------------------------ +local EXPORT_SLICE = 100 +local SINGLE_DB_AMOUNT = 20000 -- 单个数据库节点最大数量 + +local function FormatCommonParam(szSearch, nMinTime, nMaxTime, nOffset, nLimit) + if not szSearch then + szSearch = '' + end + if not nMinTime then + nMinTime = 0 + end + if not nMaxTime then + nMaxTime = math.huge + end + if not nOffset then + nOffset = 0 + end + if not nLimit then + nLimit = math.huge + end + return szSearch, nMinTime, nMaxTime, nOffset, nLimit +end + +local function NewDB(szRoot, nMinTime, nMaxTime) + local szPath + repeat + szPath = szRoot .. ('chatlog_%x'):format(X.Random(0x100000, 0xFFFFFF)) .. '.v2.db' + until not IsLocalFileExist(szPath) + local db = MY_ChatLog_DB(szPath) + db:SetMinTime(nMinTime) + db:SetMaxTime(nMaxTime) + db:SetInfo('version', '2') + db:SetInfo('user_global_id', X.GetClientPlayerGlobalID()) + return db +end + +local function SortDB(aDB) + table.sort(aDB, function(a, b) return a:GetMinTime() < b:GetMinTime() end) +end + +local DS = class() +local DS_CACHE = setmetatable({}, {__mode = 'v'}) + +function DS:ctor(szRoot) + self.szRoot = szRoot + self.aInsertQueue = {} + self.aDeleteQueue = {} + self.aInsertQueueAnsi = {} + return self +end + +function DS:InitDB(bFixProblem) + if not self.aDB then + -- 初始化数据库集群列表 + local aDB = {} + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Init node list...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + for _, szName in ipairs(CPath.GetFileList(self.szRoot) or {}) do + local db, bConn = szName:find('^chatlog_[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]%.v2%.db$') and MY_ChatLog_DB(self.szRoot .. szName) + if db then + if bFixProblem then + bConn = db:Connect(true) + if bConn then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Checking malformed node ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local nMinTime, nMinRecTime = db:GetMinTime(), db:GetMinRecTime() + if nMinRecTime < nMinTime then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix min time of ' .. db:ToString() .. ' from ' .. nMinTime .. ' to ' .. nMinRecTime, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:SetMinTime(nMinRecTime) + end + local nMaxTime, nMaxRecTime = db:GetMaxTime(), db:GetMaxRecTime() + if nMaxRecTime > nMaxTime then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix max time of ' .. db:ToString() .. ' from ' .. nMaxTime .. ' to ' .. nMaxRecTime, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:SetMaxTime(nMaxRecTime) + end + else + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Connect failed for checking malformed node ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + else + bConn = db:Connect() + end + if not bConn then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Ignore unconnectable node ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:Disconnect() + elseif db:GetInfo('user_global_id') ~= X.GetClientPlayerGlobalID() then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Ignore foreign node ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:Disconnect() + elseif db:GetInfo('version') ~= '2' then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Ignore other version node ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:Disconnect() + else + table.insert(aDB, db) + end + end + end + SortDB(aDB) + -- 删除集群中错误的空节点 + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Check empty node...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + for i, db in X.ipairs_r(aDB) do + if not (i == #aDB and X.IsHugeNumber(db:GetMaxTime())) and db:CountMsg() == 0 then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Removing unexpected empty node: ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:DeleteDB() + table.remove(aDB, i) + end + end + -- 修复覆盖区域不连续的节点(覆盖区中断问题、分段冲突问题) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Check node continuously...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + do + local i = 1 + while i < #aDB do + local db1, db2 = aDB[i], aDB[i + 1] + -- 检测中间节点最大值 + if X.IsHugeNumber(db1:GetMaxTime()) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Unexpected huge MaxTime: ' .. db1:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + if not bFixProblem then + return false + end + db1:SetMaxTime(db1:GetMaxRecTime()) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix unexpected huge MaxTime: ' .. db1:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + -- 检测区域连续性 + if db1:GetMaxTime() ~= db2:GetMinTime() then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Unexpected noncontinuously time between ' .. db1:ToString() .. ' and ' .. db2:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + if not bFixProblem then + return false + end + if db1:GetMaxRecTime() <= db2:GetMinTime() then -- 覆盖区中断 扩充左侧区域 + db1:SetMaxTime(db2:GetMinTime()) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix noncontinuously time by modify ' .. db1:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + elseif db1:GetMaxTime() <= db2:GetMinRecTime() then -- 覆盖区中断 扩充右侧区域 + db2:SetMinTime(db1:GetMaxTime()) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix noncontinuously time by modify ' .. db2:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + elseif db1:GetMaxTime() >= db2:GetMaxTime() then -- 覆盖区冲突 右侧区域完全被左侧区域包裹 将右侧节点并入左侧节点中 + for _, rec in ipairs(db2:SelectMsg()) do + db1:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + end + db1:Flush() + db2:DeleteDB() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix noncontinuously time by merge ' .. db2:ToString() .. ' to ' .. db1:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + table.remove(aDB, i + 1) + i = i - 1 + else -- 覆盖区域冲突 将右侧节点的冲突区域数据移动到左侧节点中 + db1:SetMaxTime(db1:GetMaxRecTime()) + for _, rec in ipairs(db2:SelectMsg(nil, nil, 0, db1:GetMaxTime())) do + db1:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + end + db1:Flush() + db2:DeleteMsgByCondition(nil, nil, 0, db1:GetMaxTime()) + db2:SetMinTime(db1:GetMaxTime()) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix noncontinuously time by moving data from ' .. db2:ToString() .. ' to ' .. db1:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + end + i = i + 1 + end + end + -- 检查集群最新活跃节点是否存在 + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Check latest node...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local db = aDB[#aDB] + if db and X.IsHugeNumber(db:GetMaxTime()) then -- 存在: 检查集群最新活跃节点压力是否超限 + if db:CountMsg() > SINGLE_DB_AMOUNT then + db:SetMaxTime(db:GetMaxRecTime()) + local dbNew = NewDB(self.szRoot, db:GetMaxTime(), math.huge) + table.insert(aDB, dbNew) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Create new empty active node ' .. dbNew:ToString() .. ' after ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + else -- 不存在: 创建 + local nMinTime = 0 + if db then + local nMaxTime = db:GetMaxRecTime() + db:SetMaxTime(nMaxTime) + nMinTime = nMaxTime + end + local dbNew = NewDB(self.szRoot, nMinTime, math.huge) + table.insert(aDB, dbNew) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Create new empty active node ' .. dbNew:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + -- 检查集群最久远节点开始时间是否为0 + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Check oldest node...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local db = aDB[1] + if db:GetMinTime() ~= 0 then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Unexpected MinTime for first DB: ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:SetMinTime(0) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix unexpected MinTime for first DB: ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + self.aDB = aDB + end + return self +end + +function DS:ReinitDB(bFixProblem) + self:FlushDB() + self:ReleaseDB() + self.aDB = nil + return self:InitDB(bFixProblem) +end + +function DS:OptimizeDB() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'OptimizeDB Start!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + if self:ReinitDB(true) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Checking node time zone overflow...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + for _, db in ipairs(self.aDB) do + local nMinTime, nMinRecTime = db:GetMinTime(), db:GetMinRecTime() + if nMinTime > nMinRecTime then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Node logic error detected: MinTime > MinRecTime in ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:SetMinTime(nMinRecTime) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix logic error: ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + local nMaxTime, nMaxRecTime = db:GetMaxTime(), db:GetMaxRecTime() + if nMaxTime < nMaxRecTime then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Node logic error detected: MaxTime < MaxRecTime in ' .. db:ToString(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + db:SetMaxTime(nMaxRecTime) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Fix logic error: ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + end + SortDB(self.aDB) + local i = 1 + while i <= #self.aDB do + local db = self.aDB[i] + if db:CountMsg() > SINGLE_DB_AMOUNT then -- 单个节点压力过大 转移超出部分到下一个节点 + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Node count exceed limit: ' .. db:ToString() .. ' ' .. db:CountMsg(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + local aRec = db:SelectMsg(nil, nil, nil, nil, SINGLE_DB_AMOUNT) + local nMaxTime, nMinTime = aRec[1].nTime, aRec[#aRec].nTime + -- 超出部分超过单个节点最大负载 直接独立节点 + local nCount, nOffset = #aRec, 0 + while nOffset + SINGLE_DB_AMOUNT < nCount do + local dbNew, rec = NewDB( + self.szRoot, + aRec[nOffset + 1].nTime, + (aRec[nOffset + SINGLE_DB_AMOUNT + 1] or aRec[nOffset + SINGLE_DB_AMOUNT]).nTime) + for i = 1, SINGLE_DB_AMOUNT do + rec = aRec[nOffset + i] + dbNew:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + db:DeleteMsg(rec.szHash, rec.nTime) + end + dbNew:Flush() + nOffset = nOffset + SINGLE_DB_AMOUNT + i = i + 1 + table.insert(self.aDB, i, dbNew) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Moving ' .. SINGLE_DB_AMOUNT .. ' records from ' .. db:ToString() .. ' to ' .. dbNew:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + -- 处理剩下不超过单个节点最大负载的结果 + if nCount - nOffset == 0 then + -- 刚好没有了 且当前是活跃节点 则创建新的活跃节点 + if i == #self.aDB then + local dbNew = NewDB(self.szRoot, nMinTime, math.huge) + i = i + 1 + table.insert(self.aDB, i, dbNew) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Create new active node: ' .. dbNew:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + else + -- 还有则合并到下一个节点 + local dbNext, rec + if i == #self.aDB then + dbNext = NewDB(self.szRoot, aRec[nOffset + 1].nTime, math.huge) + i = i + 1 + table.insert(self.aDB, i, dbNext) + else + dbNext = self.aDB[i + 1] + dbNext:SetMinTime(aRec[nOffset + 1].nTime) + end + for i = nOffset + 1, nCount do + rec = aRec[i] + db:DeleteMsg(rec.szHash, rec.nTime) + dbNext:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + end + dbNext:Flush() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Moving ' .. #aRec .. ' records from ' .. db:ToString() .. ' to ' .. dbNext:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + db:Flush() + db:SetMaxTime(nMaxTime) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Modify node property: ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + -- 压缩数据库 + db:GarbageCollection() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Node GarbageCollection: ' .. db:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + elseif db:CountMsg() < SINGLE_DB_AMOUNT then -- 单个节点压力过小 与下个节点合并 + if i < #self.aDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Node count insufficient: ' .. db:ToString() .. ' ' .. db:CountMsg(), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + local dbNext = self.aDB[i + 1] + dbNext:SetMinTime(db:GetMinTime()) + for _, rec in ipairs(db:SelectMsg()) do + dbNext:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + end + dbNext:Flush() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'Merge node ' .. db:ToString() .. ' to ' .. dbNext:ToString(), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + db:DeleteDB() + table.remove(self.aDB, i) + i = i - 1 + end + end + i = i + 1 + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ChatLog'], 'OptimizeDB Finished!', X.DEBUG_LEVEL.LOG) + else + X.OutputDebugMessage(_L['MY_ChatLog'], 'OptimizeDB Failed! ReinitDB Failed!', X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + return self +end + +function DS:InsertMsg(szMsgType, szText, szMsg, szTalker, nTime) + if not szTalker then + szTalker = '' + end + if szMsg and szText then + local szuMsg = AnsiToUTF8(szMsg) + local szuText = AnsiToUTF8(szText) + local szHash = GetStringCRC(szMsg) + local szuTalker = AnsiToUTF8(szTalker) + if szMsgType and nTime and not X.IsEmpty(szMsg) and szText and not X.IsEmpty(szHash) then + table.insert(self.aInsertQueue, {szHash = szHash, szMsgType = szMsgType, nTime = nTime, szTalker = szuTalker, szText = szuText, szMsg = szuMsg}) + table.insert(self.aInsertQueueAnsi, {szHash = szHash, szMsgType = szMsgType, nTime = nTime, szTalker = szTalker, szText = szText, szMsg = szMsg}) + end + end + FireUIEvent('ON_MY_CHATLOG_INSERT_MSG', self.szRoot) + return self +end + +function DS:CountMsg(aMsgType, szSearch, nMinTime, nMaxTime) + if X.IsTable(aMsgType) and X.IsEmpty(aMsgType) then + return 0 + end + if not self:InitDB() then + return 0 + end + szSearch, nMinTime, nMaxTime = FormatCommonParam(szSearch, nMinTime, nMaxTime) + local szuSearch = X.IsEmpty(szSearch) and '' or AnsiToUTF8('%' .. szSearch .. '%') + local nCount = 0 + for _, db in ipairs(self.aDB) do + nCount = nCount + db:CountMsg(aMsgType, szuSearch, nMinTime, nMaxTime) + end + local tMsgType = aMsgType and X.FlipObjectKV(aMsgType) + for _, rec in ipairs(self.aInsertQueueAnsi) do + if rec.nTime >= nMinTime + and rec.nTime <= nMaxTime + and (not tMsgType or tMsgType[rec.szMsgType]) + and (szSearch == '' or X.StringFindW(rec.szText, szSearch) or X.StringFindW(rec.szTalker, szSearch)) then + nCount = nCount + 1 + end + end + return nCount +end + +function DS:SelectMsg(aMsgType, szSearch, nMinTime, nMaxTime, nOffset, nLimit, bUTF8) + if X.IsTable(aMsgType) and X.IsEmpty(aMsgType) then + return {} + end + if not self:InitDB() then + return {} + end + szSearch, nMinTime, nMaxTime, nOffset, nLimit = FormatCommonParam(szSearch, nMinTime, nMaxTime, nOffset, nLimit) + local szuSearch = X.IsEmpty(szSearch) and '' or AnsiToUTF8('%' .. szSearch .. '%') + local aResult = {} + for _, db in ipairs(self.aDB) do + if nLimit == 0 then + break + end + local nCount = db:CountMsg(aMsgType, szuSearch, nMinTime, nMaxTime) + if nOffset < nCount then + local res = db:SelectMsg(aMsgType, szuSearch, nMinTime, nMaxTime, nOffset, nLimit) + if bUTF8 then + for _, p in ipairs(res) do + table.insert(aResult, p) + end + else + for _, p in ipairs(res) do + p.szMsgType = p.szMsgType + p.szTalker = UTF8ToAnsi(p.szTalker) + p.szText = UTF8ToAnsi(p.szText) + p.szMsg = UTF8ToAnsi(p.szMsg) + table.insert(aResult, p) + end + end + if not X.IsHugeNumber(nLimit) then + nLimit = math.max(nLimit - nCount + nOffset, 0) + end + end + nOffset = math.max(nOffset - nCount, 0) + end + if X.IsHugeNumber(nLimit) or nLimit > 0 then + local tMsgType = aMsgType and X.FlipObjectKV(aMsgType) + for i, rec in ipairs(self.aInsertQueueAnsi) do + if nLimit == 0 then + break + end + if rec.nTime >= nMinTime + and rec.nTime <= nMaxTime + and (not tMsgType or tMsgType[rec.szMsgType]) + and (szSearch == '' or X.StringFindW(rec.szText, szSearch) or X.StringFindW(rec.szTalker, szSearch)) then + if nOffset > 0 then + nOffset = nOffset - 1 + else + if bUTF8 then + table.insert(aResult, X.Clone(self.aInsertQueue[i])) + else + table.insert(aResult, X.Clone(rec)) + end + if not X.IsHugeNumber(nLimit) then + nLimit = nLimit - 1 + end + end + end + end + end + return aResult +end + +function DS:FindMsgIndex(aMsgType, szSearch, nMinTime, nMaxTime, nTime, szHash) + szSearch, nMinTime, nMaxTime = FormatCommonParam(szSearch, nMinTime, nMaxTime) + if nMinTime > nTime or nMaxTime < nTime then + return -1 + end + local nIndex = self:CountMsg(aMsgType, szSearch, nMinTime, nTime - 1) + local aMsg = self:SelectMsg(aMsgType, szSearch, nTime, nTime) + for _, v in ipairs(aMsg) do + if v.szHash == szHash then + return nIndex + end + nIndex = nIndex + 1 + end + return -1 +end + +function DS:DeleteMsg(szHash, nTime) + if nTime and not X.IsEmpty(szHash) then + table.insert(self.aDeleteQueue, {szHash = szHash, nTime = nTime}) + end + return self +end + +function DS:DeleteMsgByCondition(aMsgType, szSearch, nMinTime, nMaxTime) + if self:InitDB() then + self:FlushDB() + szSearch, nMinTime, nMaxTime = FormatCommonParam(szSearch, nMinTime, nMaxTime) + local szuSearch = X.IsEmpty(szSearch) and '' or AnsiToUTF8('%' .. szSearch .. '%') + for _, db in ipairs(self.aDB) do + if (X.IsEmpty(nMaxTime) or X.IsHugeNumber(nMaxTime) or db:GetMinTime() <= nMaxTime) + and (X.IsEmpty(nMinTime) or db:GetMaxTime() >= nMinTime) then + db:DeleteMsgByCondition(aMsgType, szuSearch, nMinTime, nMaxTime) + end + end + end + return self +end + +function DS:FlushDB() + if (not X.IsEmpty(self.aInsertQueue) or not X.IsEmpty(self.aDeleteQueue)) and self:InitDB() then + -- 插入记录 + table.sort(self.aInsertQueue, function(a, b) return a.nTime < b.nTime end) + local i, db = 1, self.aDB[1] + for _, p in ipairs(self.aInsertQueue) do + while db and p.nTime > db:GetMaxTime() do + i = i + 1 + db = self.aDB[i] + end + assert(db, 'ChatLog db indexing error while FlushDB: [i]' .. i .. ' [time]' .. p.nTime) + db:InsertMsg(p.szMsgType, p.szText, p.szMsg, p.szTalker, p.nTime, p.szHash) + end + self.aInsertQueue = {} + self.aInsertQueueAnsi = {} + -- 删除记录 + table.sort(self.aDeleteQueue, function(a, b) return a.nTime < b.nTime end) + local i, db = 1, self.aDB[1] + for _, p in ipairs(self.aDeleteQueue) do + while db and p.nTime > db:GetMaxTime() do + i = i + 1 + db = self.aDB[i] + end + assert(db, 'ChatLog db indexing error while FlushDB: [i]' .. i .. ' [time]' .. p.nTime) + db:DeleteMsg(p.szHash, p.nTime) + end + self.aDeleteQueue = {} + -- 执行数据库操作 + for _, db in ipairs(self.aDB) do + db:Flush() + end + end + return self +end + +function DS:ReleaseDB() + if self.aDB then + for _, db in ipairs(self.aDB) do + db:Disconnect() + end + self.aDB = nil + end + return self +end + +function MY_ChatLog_DS(szRoot) + if not DS_CACHE[szRoot] then + DS_CACHE[szRoot] = DS.new(szRoot) + end + return DS_CACHE[szRoot] +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog_ExportDB.lua b/MY_ChatLog/src/MY_ChatLog_ExportDB.lua new file mode 100644 index 000000000..46331081f --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog_ExportDB.lua @@ -0,0 +1,101 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog_ExportDB' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ChatLog.RealtimeCommit', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local D = { + bExporting = false, +} +local EXPORT_SLICE = 100 + +function D.Start(szExportFile, aMsgType, nPerSec, onProgress) + if D.bExporting then + return X.OutputSystemMessage(_L['Already exporting, please wait.']) + end + local ds = MY_ChatLog_DS(MY_ChatLog.GetRoot()) + if not ds then + return + end + local db = MY_ChatLog_DB(szExportFile) + if not db:Connect() then + return + end + db:SetMinTime(0) + db:SetMaxTime(math.huge) + db:SetInfo('version', '2') + db:SetInfo('user_global_id', X.GetClientPlayerGlobalID()) + D.bExporting = true + + if onProgress then + onProgress(_L['Preparing'], 0) + end + + local nPage, nPageCount = 0, math.ceil(ds:CountMsg(aMsgType, '') / EXPORT_SLICE) + local function Export() + if nPage > nPageCount then + D.bExporting = false + db:Disconnect() + local szFile = X.GetAbsolutePath(szExportFile) + X.Alert(_L('Chatlog export succeed, file saved as %s', szFile)) + X.OutputSystemMessage(_L('Chatlog export succeed, file saved as %s', szFile)) + return 0 + end + local data = ds:SelectMsg(aMsgType, '', nil, nil, nPage * EXPORT_SLICE, EXPORT_SLICE, true) + for i, rec in ipairs(data) do + db:InsertMsg(rec.szMsgType, rec.szText, rec.szMsg, rec.szTalker, rec.nTime, rec.szHash) + end + if onProgress then + onProgress(_L['exporting'], nPage / nPageCount) + end + db:Flush() + nPage = nPage + 1 + end + X.BreatheCall('MY_ChatLog_ExportDB', Export) +end + +function D.IsRunning() + return D.bExporting +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatLog_ExportDB', + exports = { + { + fields = { + 'Start', + 'IsRunning', + }, + root = D, + }, + }, +} +MY_ChatLog_ExportDB = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog_ExportHTML.lua b/MY_ChatLog/src/MY_ChatLog_ExportHTML.lua new file mode 100644 index 000000000..3a880f6d3 --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog_ExportHTML.lua @@ -0,0 +1,516 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog_ExportHTML' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ChatLog.RealtimeCommit', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local D = { + bExporting = false, +} +local EXPORT_SLICE = 100 +local MSG_TYPE_COLOR = MY_ChatLog.MSG_TYPE_COLOR + +--[[ +https://www.jx3box.com/joke +JSON.stringify([...document.querySelectorAll('.c-jx3box-emotion-item')].map(n => n.firstChild).map(n => { + const id = n.src.match(/\/\d+_(\d+)_/)[1]; + return {id: parseInt(id), src: n.src}; +})) +]] + +local EMOTION_LIST = '[{"id":1,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_1__%E5%BE%AE%E7%AC%91.gif"},{"id":2,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_2__%E5%8F%AF%E6%80%9C.gif"},{"id":3,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_3__%E5%90%90.gif"},{"id":4,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_4__%E5%AA%9A%E7%9C%BC.gif"},{"id":5,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_5__%E5%AE%B3%E7%BE%9E.gif"},{"id":6,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_6__%E5%B0%B4%E5%B0%AC.gif"},{"id":7,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_7__%E7%8B%82%E6%B1%97.gif"},{"id":8,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_8__%E6%81%90%E6%85%8C.gif"},{"id":9,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_9__%E7%94%9F%E6%B0%94.gif"},{"id":10,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_10__%E6%98%8F.gif"},{"id":11,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_11__%E6%B5%81%E6%B3%AA.gif"},{"id":12,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_12__%E4%BA%B2%E4%BA%B2.png"},{"id":13,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_13__%E6%B2%89%E9%BB%98.png"},{"id":14,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_14__%E6%97%A0%E5%A5%88.png"},{"id":15,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_15__%E5%82%B2%E6%85%A2.png"},{"id":16,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_16__%E5%86%B7%E6%B1%97.png"},{"id":17,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_17__%E5%A4%A7%E7%AC%91.png"},{"id":18,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_18__%E9%98%B4%E9%99%A9.png"},{"id":19,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_19__%E9%9A%BE%E8%BF%87.png"},{"id":20,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_20__%E8%AE%A8%E5%8E%8C.png"},{"id":21,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_21__%E5%B7%B4%E6%8E%8C.png"},{"id":22,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_22__%E6%B5%81%E6%B1%97.png"},{"id":23,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_23__%E5%8F%91%E6%80%92.png"},{"id":24,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_24__%E6%AC%A3%E5%96%9C.png"},{"id":25,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_25__%E5%8F%A3%E6%B0%B4.png"},{"id":26,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_26__%E5%90%93.png"},{"id":27,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_27__%E5%91%86.png"},{"id":28,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_28__%E5%99%A2.png"},{"id":29,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_29__%E5%91%B2%E7%89%99.png"},{"id":30,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_30__%E6%81%B6%E5%BF%83.png"},{"id":31,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_31__%E5%9B%B0.png"},{"id":32,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_32__%E5%87%B6%E6%81%B6.png"},{"id":33,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_33__%E7%8B%A1%E8%AF%88.png"},{"id":34,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_34__%E5%BE%97%E6%84%8F.png"},{"id":35,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_35__%E9%AC%BC%E8%84%B8.png"},{"id":36,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_36__%E6%89%81%E5%98%B4.png"},{"id":37,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_37__%E6%92%87%E5%98%B4.png"},{"id":38,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_38__%E6%99%95.png"},{"id":39,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_39__%E7%8B%A1%E7%8C%BE.png"},{"id":40,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_40__%E7%9D%A1.png"},{"id":41,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_41__%E8%88%8C%E5%A4%B4.png"},{"id":42,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_42__%E8%89%B2.png"},{"id":43,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_43__%E8%AE%B6%E5%BC%82.png"},{"id":44,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_44__%E9%84%99%E8%A7%86.png"},{"id":45,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_45__%E9%85%B7.png"},{"id":46,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_46__%E9%92%B1.gif"},{"id":47,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_47__%E9%94%A4%E5%AD%90.gif"},{"id":48,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_48__%E6%89%93%E9%9B%B7.gif"},{"id":49,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_49__%E9%97%AE%E5%8F%B7.gif"},{"id":50,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_50__%E7%BA%A2%E7%81%AF.gif"},{"id":51,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_51__%E7%BB%BF%E7%81%AF.gif"},{"id":52,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_52__%E9%BB%84%E7%81%AF.gif"},{"id":53,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_53__%E4%B8%8B%E9%9B%A8.gif"},{"id":54,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_54__%E5%88%80.gif"},{"id":55,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_55__%E5%92%96%E5%95%A1.gif"},{"id":56,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_56__%E5%96%9C%E6%AC%A2.gif"},{"id":57,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_57__%E5%98%B4.gif"},{"id":58,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_58__%E5%94%87.gif"},{"id":59,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_59__%E5%BF%83%E7%A2%8E.gif"},{"id":60,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_60__%E6%84%9F%E5%8F%B9%E5%8F%B7.gif"},{"id":61,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_61__%E6%8B%8D%E6%89%8B.gif"},{"id":62,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_62__%E6%8F%A1%E6%89%8B.gif"},{"id":63,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_63__%E7%8C%AA.gif"},{"id":64,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_64__%E7%8E%AB%E7%91%B0.gif"},{"id":65,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_65__%E7%94%B5%E8%AF%9D.gif"},{"id":66,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_66__%E7%81%AF%E6%B3%A1.gif"},{"id":67,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_67__%E7%AC%A8%E7%8C%AA.png"},{"id":68,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_68__%E6%9C%88%E4%BA%AE.png"},{"id":69,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_69__%E8%8F%A0%E8%90%9D.png"},{"id":70,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_70__%E9%AA%B7%E9%AB%85.png"},{"id":71,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_71__%E7%A4%BC%E7%89%A9.png"},{"id":72,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_72__%E4%B8%A5%E5%AF%92.png"},{"id":73,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_73__%E5%AF%92.png"},{"id":74,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_74__%E8%A1%B0.png"},{"id":75,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_75__%E8%8A%B1.png"},{"id":76,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_76__%E9%A6%99%E8%95%89.png"},{"id":77,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_77__%E9%9B%AA%E7%B3%95.png"},{"id":78,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_78__%E8%83%9C%E5%88%A9.png"},{"id":79,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_79__%E8%8B%B9%E6%9E%9C.png"},{"id":80,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_80__%E9%A5%AE%E6%96%99.png"},{"id":81,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_81__%E9%A6%92%E5%A4%B4.png"},{"id":82,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_82__%E8%A5%BF%E7%93%9C.png"},{"id":83,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_83__%E7%83%9F%E8%8A%B1.png"},{"id":84,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_84__%E6%A0%87%E8%AE%B0.png"},{"id":85,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_85__%E8%92%9C%E5%A4%B4.png"},{"id":86,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_86__%E5%A4%AA%E9%98%B3.png"},{"id":87,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_87__%E7%88%B1%E5%BF%83.png"},{"id":88,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_88__%E5%BC%BA.png"},{"id":89,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_89__%E5%B7%AE%E5%8A%B2.png"},{"id":90,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_90__%E6%A8%B1%E6%A1%83.png"},{"id":91,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_91__%E7%AC%AC%E4%B8%80%E5%90%8D.png"},{"id":92,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_92__%E7%AC%AC%E4%BA%8C%E5%90%8D.png"},{"id":93,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_93__%E7%AC%AC%E4%B8%89%E5%90%8D.png"},{"id":94,"src":"https://img.jx3box.com/emotion/output/%E9%BB%98%E8%AE%A4/0_94__%E8%9C%A1%E7%83%9B.gif"}]' + +local function htmlEncode(html) + return html + :gsub('&', '&') + :gsub(' ', ' ') + :gsub('<', '<') + :gsub('>', '>') + :gsub('"', '"') + :gsub('\n', '
') +end + +local function renderTemplateString(szTplString, tVar) + return (szTplString:gsub("{{%$(%w+)}}", function(varName) + return tVar[varName] or "" + end)) +end + +local function getHeader() + local szTplString = [[ + + + + + + +
Please allow running JavaScript on this page!
+ + +
+{{$title}}
+]] + local emotionStyles = '' + for _, emo in ipairs(X.DecodeJSON(EMOTION_LIST)) do + emotionStyles = emotionStyles .. '.emotion_' .. emo.id .. '{\n\tbackground-image: url(\''.. emo.src .. '\');\n}\n' + end + local forceStyles = '' + for k, v in pairs(g_tStrings.tForceTitle) do + forceStyles = forceStyles .. ('.force-%s{\n\tcolor:#%02X%02X%02X;\n}\n'):format(k, X.GetForceColor(k, 'foreground')) + end + local tVar = { + charset = (X.ENVIRONMENT.GAME_LANG == 'zhcn' and 'GBK') or 'UTF-8', + emotionStyles = emotionStyles, + forceStyles = forceStyles, + title = X.GetClientPlayer().szName .. ' @ ' .. X.GetServerName() .. ' Exported at ' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd %hh:%mm:%ss'), + } + return renderTemplateString(szTplString, tVar) +end + +local function getFooter() + return [[ + +
+ + +]] +end + +local function convertXml2MessageJSON(szXml) + local aXMLNode = X.XMLDecode(szXml) + local aMessage = {} + if aXMLNode then + local text, name, force, r, g, b, color + for i, node in ipairs(aXMLNode) do + text = X.XMLGetNodeData(node, 'text') + name = X.XMLGetNodeData(node, 'name') + if text then + text = htmlEncode(text) + force = nil + color = nil + if name and name:sub(1, 9) == 'namelink_' then + if MY_Farbnamen and MY_Farbnamen.Get then + local info = MY_Farbnamen.Get((text:gsub('[%[%]]', ''))) + if info then + force = info.dwForceID + end + end + table.insert(aMessage, { + type = 'namelink', + name = text, + force = force or -1, + }) + else + r = X.XMLGetNodeData(node, 'r') + g = X.XMLGetNodeData(node, 'g') + b = X.XMLGetNodeData(node, 'b') + if r and g and b then + color = ('#%02X%02X%02X'):format(r, g, b) + end + table.insert(aMessage, { + type = 'text', + text = text, + color = color, + }) + end + elseif name and name:sub(1, 8) == 'emotion_' then + local emotion_id = tonumber(name:match('emotion_(%d+)')) + table.insert(aMessage, { + type = 'emotion', + id = emotion_id, + }) + else + -- 金钱单位等图片解析 + local aSay = X.ParseChatData({ node }) + local item = aSay and aSay[1] + if item and item.text then + table.insert(aMessage, { + type = 'text', + text = item.text, + }) + end + end + end + end + return aMessage +end + +function D.Start(szExportFile, aMsgType, nPerSec, onProgress) + if D.bExporting then + return X.OutputSystemMessage(_L['Already exporting, please wait.']) + end + local ds = MY_ChatLog_DS(MY_ChatLog.GetRoot()) + if not ds then + return + end + local status = Log(szExportFile, getHeader(), 'clear') + if status ~= 'SUCCEED' then + return X.OutputSystemMessage(_L('Error: open file error %s [%s]', szExportFile, status)) + end + D.bExporting = true + + if onProgress then + onProgress(_L['Preparing'], 0) + end + + Log(szExportFile, '\n\n') + Log(szExportFile, getFooter(), 'close') + if onProgress then + onProgress(_L['Export succeed'], 1) + end + local szFile = X.GetAbsolutePath(szExportFile) + X.Alert(_L('Chatlog export succeed, file saved as %s', szFile)) + X.OutputSystemMessage(_L('Chatlog export succeed, file saved as %s', szFile)) + return 0 + end + local data = ds:SelectMsg(aMsgType, '', nil, nil, nPage * EXPORT_SLICE, EXPORT_SLICE) + for i, rec in ipairs(data) do + local color, r, g, b = nil, unpack(MSG_TYPE_COLOR[rec.szMsgType]) + if r and g and b then + color = ('#%02X%02X%02X'):format(r, g, b) + end + local aXMLNode = X.XMLDecode(rec.szMsg) + local aSay = X.ParseChatData(aXMLNode) + local szText = X.StringifyChatText(aSay) + local msg = { + time = rec.nTime, + talker = rec.szTalker or '', + color = color, + text = X.FormatTime(rec.nTime, '[%yyyy/%MM/%dd][%hh:%mm:%ss]') .. szText, + parts = convertXml2MessageJSON(rec.szMsg) + } + if nPage ~= 0 or i ~= 1 then + Log(szExportFile, ',') + end + Log(szExportFile, X.EncodeJSON(msg)) + end + if onProgress then + onProgress(_L['exporting'], nPage / nPageCount) + end + nPage = nPage + 1 + end + X.BreatheCall('MY_ChatLog_ExportHTML', Export) +end + +function D.IsRunning() + return D.bExporting +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatLog_ExportHTML', + exports = { + { + fields = { + 'Start', + 'IsRunning', + }, + root = D, + }, + }, +} +MY_ChatLog_ExportHTML = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/src/MY_ChatLog_UI.lua b/MY_ChatLog/src/MY_ChatLog_UI.lua new file mode 100644 index 000000000..c6d6309b0 --- /dev/null +++ b/MY_ChatLog/src/MY_ChatLog_UI.lua @@ -0,0 +1,558 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天记录 查询界面类 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ChatLog/MY_ChatLog_UI' +local PLUGIN_NAME = 'MY_ChatLog' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ChatLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} + +------------------------------------------------------------------------------------------------------ +-- 数据库核心 +------------------------------------------------------------------------------------------------------ +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_ChatLog/ui/MY_ChatLog_UI.ini' +local PAGE_AMOUNT = 150 +local MSG_TYPE_COLOR = MY_ChatLog.MSG_TYPE_COLOR + +function D.SetDS(hFrame, szRoot) + hFrame.szRoot = szRoot + hFrame.ds = MY_ChatLog_DS(szRoot) + D.UpdatePage(hFrame) +end + +function D.OnFrameCreate() + local hFrameTemp = X.UI.OpenFrame(SZ_INI, 'MY_ChatLog_UI_Temp') + local hWndMain = hFrameTemp:Lookup('Wnd_Main') + hWndMain:ChangeRelation(this:Lookup('Wnd_Total'), true, true) + hWndMain:SetRelPos(20, 55) + X.UI.CloseFrame(hFrameTemp) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel/Scroll_ChatChanel')) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog/Scroll_ChatLog')) + + local container = this:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel/WndContainer_ChatChanel') + container:Clear() + for _, info in pairs(MY_ChatLog.aChannel) do + local wnd = container:AppendContentFromIni(SZ_INI, 'Wnd_ChatChannel') + wnd.szTitle = info.szTitle + wnd.szKey = info.szKey + wnd.aMsgType = info.aMsgType + wnd:Lookup('CheckBox_ChatChannel', 'Text_ChatChannel'):SetText(info.szTitle) + wnd:Lookup('CheckBox_ChatChannel', 'Text_ChatChannel'):SetFontColor(unpack(MSG_TYPE_COLOR[info.aMsgType[1]])) + end + container:FormatAllContentPos() + + local handle = this:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog', 'Handle_ChatLogs') + handle:Clear() + for i = 1, PAGE_AMOUNT do + handle:AppendItemFromIni(SZ_INI, 'Handle_ChatLog') + end + handle:FormatAllItemPos() + + this:Lookup('Wnd_Total/Wnd_Main/Wnd_Search/Edit_Search'):SetPlaceholderText(_L['Press enter to search ...']) + + this:RegisterEvent('ON_MY_MOSAICS_RESET') + this:RegisterEvent('ON_MY_CHATLOG_INSERT_MSG') + this:RegisterEvent('ON_MY_CHAT_LOG_RELEASE_DB') + this:RegisterEvent('ON_MY_CHAT_LOG_CHANNEL_CHANGE') + + this:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + this:BringToTop() + + MY_ChatLog.MigrateDB() +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + D.UpdatePage(this, true) + elseif event == 'ON_MY_CHATLOG_INSERT_MSG' then + D.UpdatePage(this, true) + elseif event == 'ON_MY_CHAT_LOG_RELEASE_DB' then + this:Destroy() + elseif event == 'ON_MY_CHAT_LOG_CHANNEL_CHANGE' then + this:Destroy() + end +end + +function D.OnMouseIn() + local name = this:GetName() + if name == 'Wnd_ChatChannel' then + local szText = '' + for _, szMsgType in ipairs(this.aMsgType) do + local szMsgTypeName = g_tStrings.tChannelName[szMsgType] + if IsCtrlKeyDown() then + szMsgTypeName = (szMsgTypeName or '') .. '(' .. szMsgType .. ')' + end + if szMsgTypeName then + szText = szText .. GetFormatText(szMsgTypeName .. '\n', 162, GetMsgFontColor(szMsgType)) + end + end + X.OutputTip(this, szText, true, X.UI.TIP_POSITION.LEFT_RIGHT) + end +end + +function D.OnMouseOut() + local name = this:GetName() + if name == 'Wnd_ChatChannel' then + X.HideTip() + end +end + +function D.OnLButtonClick() + local name = this:GetName() + local hFrame = this:GetRoot() + if name == 'Btn_Close' then + X.UI.CloseFrame(this:GetRoot()) + elseif name == 'Btn_Only' then + local wnd = this:GetParent() + for _, info in pairs(MY_ChatLog.aChannel) do + if wnd.szKey == info.szKey then + hFrame.tUncheckedChannel[info.szKey] = nil + else + hFrame.tUncheckedChannel[info.szKey] = true + end + end + D.OnConditionChange(hFrame) + D.UpdatePage(hFrame) + elseif name == 'Btn_ChatChannelAll' then + for _, info in pairs(MY_ChatLog.aChannel) do + hFrame.tUncheckedChannel[info.szKey] = nil + end + hFrame.nCurrentPage = nil + hFrame.nLastClickIndex = nil + D.OnConditionChange(hFrame) + D.UpdatePage(hFrame) + end +end + +function D.OnRButtonClick() + local name = this:GetName() + local hFrame = this:GetRoot() + if name == 'CheckBox_ChatChannel' then + local hWnd = this:GetParent() + local aMsgType = hWnd.aMsgType + local szSearch = hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Search/Edit_Search'):GetText() + X.UI.PopupMenu({{ + szOption = _L['Clear channel chat log'], + rgb = {255, 0, 0}, + fnAction = function() + X.Confirm(_L('Are you sure to clear channel chat log of %s? All chat logs in this channel will be lost.', hWnd.szTitle), function() + hFrame.ds:DeleteMsgByCondition(aMsgType, szSearch, 0, math.huge) + end) + X.UI.ClosePopupMenu() + end, + }}) + end +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + local hFrame = this:GetRoot() + if name == 'CheckBox_ChatChannel' then + local wnd = this:GetParent() + hFrame.nCurrentPage = nil + hFrame.nLastClickIndex = nil + hFrame.tUncheckedChannel[wnd.szKey] = nil + D.OnConditionChange(hFrame) + D.UpdatePage(hFrame) + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + local hFrame = this:GetRoot() + if name == 'CheckBox_ChatChannel' then + local wnd = this:GetParent() + hFrame.nCurrentPage = nil + hFrame.nLastClickIndex = nil + hFrame.tUncheckedChannel[wnd.szKey] = true + D.OnConditionChange(hFrame) + D.UpdatePage(hFrame) + end +end + +function D.OnItemMouseIn() + local name = this:GetName() + if name == 'Handle_ChatLog' then + if IsCtrlKeyDown() and g_tStrings.tChannelName[this.szMsgType] then + local szXml = GetFormatText(g_tStrings.tChannelName[this.szMsgType] .. ' (' .. this.szMsgType .. ')', 162, GetMsgFontColor(this.szMsgType)) + X.OutputTip( this, szXml, true) + end + end +end + +function D.OnItemMouseOut() + local name = this:GetName() + if name == 'Handle_ChatLog' then + X.HideTip() + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + local hFrame = this:GetRoot() + if name == 'Handle_Index' then + hFrame.nCurrentPage = this.nPage + D.UpdatePage(hFrame) + elseif name == 'Handle_ChatLog' then + local nLastClickIndex = hFrame.nLastClickIndex + if IsCtrlKeyDown() then + this:Lookup('Shadow_ChatLogSelect'):SetVisible(not this:Lookup('Shadow_ChatLogSelect'):IsVisible()) + elseif IsShiftKeyDown() then + if nLastClickIndex then + local hList, hItem = this:GetParent() + for i = nLastClickIndex, this:GetIndex(), (nLastClickIndex - this:GetIndex() > 0 and -1 or 1) do + hItem = hList:Lookup(i) + if hItem:IsVisible() then + hItem:Lookup('Shadow_ChatLogSelect'):Show() + end + end + end + else + local hList, hItem = this:GetParent() + for i = 0, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if hItem:IsVisible() then + hItem:Lookup('Shadow_ChatLogSelect'):Hide() + end + end + this:Lookup('Shadow_ChatLogSelect'):Show() + end + hFrame.nLastClickIndex = this:GetIndex() + end +end + +function D.OnEditSpecialKeyDown() + local name = this:GetName() + local frame = this:GetRoot() + local szKey = GetKeyName(Station.GetMessageKey()) + if szKey == 'Enter' then + if name == 'WndEdit_Index' then + frame.nCurrentPage = tonumber(this:GetText()) or frame.nCurrentPage + end + D.UpdatePage(this:GetRoot()) + return 1 + end +end + +function D.OnItemRButtonClick() + local this = this + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Handle_ChatLog' then + local nLastClickIndex = this:GetRoot().nLastClickIndex + if IsCtrlKeyDown() then + this:Lookup('Shadow_ChatLogSelect'):SetVisible(not this:Lookup('Shadow_ChatLogSelect'):IsVisible()) + elseif IsShiftKeyDown() then + if nLastClickIndex then + local hList, hItem = this:GetParent() + for i = nLastClickIndex, this:GetIndex(), (nLastClickIndex - this:GetIndex() > 0 and -1 or 1) do + hItem = hList:Lookup(i) + if hItem:IsVisible() then + hItem:Lookup('Shadow_ChatLogSelect'):Show() + end + end + end + elseif not this:Lookup('Shadow_ChatLogSelect'):IsVisible() then + local hList, hItem = this:GetParent() + for i = 0, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if hItem:IsVisible() then + hItem:Lookup('Shadow_ChatLogSelect'):Hide() + end + end + this:Lookup('Shadow_ChatLogSelect'):Show() + end + this:GetRoot().nLastClickIndex = this:GetIndex() + + local menu = { + { + szOption = _L['Delete record'], + fnAction = function() + local hList, hItem = this:GetParent() + for i = 0, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if hItem:IsVisible() and hItem:Lookup('Shadow_ChatLogSelect'):IsVisible() then + frame.ds:DeleteMsg(hItem.szHash, hItem.nTime) + end + end + frame.ds:FlushDB() + this:GetRoot().nLastClickIndex = nil + D.UpdatePage(this:GetRoot(), true) + end, + }, + { + szOption = _L['Copy this record'], + fnAction = function() + X.CopyChatLine(this:Lookup('Handle_ChatLog_Msg'):Lookup(0), true) + end, + }, + { + szOption = _L['View this message in all messages'], + fnAction = function() + X.UI.ClosePopupMenu() + local nMsgIndex = frame.ds:FindMsgIndex(nil, '', 0, math.huge, this.nTime, this.szHash) + if nMsgIndex == -1 then + return + end + D.Open(frame.szRoot, nil, '', 0, math.huge, nMsgIndex) + end, + }, + } + PopupMenu(menu) + end +end + +function D.OnConditionChange(hFrame) + MY_ChatLog.tUncheckedChannel = X.Clone(hFrame.tUncheckedChannel) +end + +function D.UpdatePage(hFrame, bKeepScroll) + -- 更新大小 + local nW, nH = hFrame:GetW() - 40, hFrame:GetH() - 75 + hFrame:Lookup('Wnd_Total/Wnd_Main'):SetSize(nW, nH) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel'):SetH(nH - 25) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel', ''):SetH(nH - 25) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel', 'Image_ChatChanel'):SetH(nH - 25) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel/WndContainer_ChatChanel'):SetH(nH - 60) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel/Scroll_ChatChanel'):SetH(nH - 25) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog'):SetSize(nW - 200, nH - 30) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog', ''):SetSize(nW - 215, nH - 30) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog', 'Image_ChatLog'):SetSize(nW - 215, nH - 30) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog', 'Handle_ChatLogs'):SetSize(nW - 215, nH - 40) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog/Scroll_ChatLog'):SetRelX(nW - 215) + hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog/Scroll_ChatLog'):SetH(nH - 30) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index'):SetRelY(nH - 25) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index'):SetW(nW - 215) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index', ''):SetW(nW - 215) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index', 'Image_Index'):SetW(nW - 215) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index', 'Handle_IndexesOuter'):SetW(nW - 360) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index/Wnd_IndexEdit'):SetRelX(nW - 270) + hFrame:Lookup('Wnd_Total/Wnd_Main/Btn_ChatChannelAll'):SetRelY(nH - 17) + -- 重新渲染 + local container = hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatChanel/WndContainer_ChatChanel') + local aMsgType = {} + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + if not hFrame.tUncheckedChannel[wnd.szKey] then + for _, szMsgType in ipairs(wnd.aMsgType) do + table.insert(aMsgType, szMsgType) + end + end + wnd:Lookup('CheckBox_ChatChannel'):Check(not hFrame.tUncheckedChannel[wnd.szKey], WNDEVENT_FIRETYPE.PREVENT) + end + local szSearch = hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Search/Edit_Search'):GetText() + local nCount = hFrame.ds:CountMsg(aMsgType, szSearch) + local nPageCount = math.ceil(nCount / PAGE_AMOUNT) + local bInit = not hFrame.nCurrentPage + local nCurrentPage = bInit and nPageCount or math.min(math.max(hFrame.nCurrentPage, 1), nPageCount) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index/Wnd_IndexEdit/WndEdit_Index'):SetText(nCurrentPage) + hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index', 'Handle_IndexCount/Text_IndexCount'):SprintfText(_L['Total %d pages'], nPageCount) + + local hOuter = hFrame:Lookup('Wnd_Total/Wnd_Main/Wnd_Index', 'Handle_IndexesOuter') + local handle = hOuter:Lookup('Handle_Indexes') + local PAGE_DISPLAY = math.floor((hOuter:GetW() - 10) / 48) + handle:Clear() + for i = 1, PAGE_DISPLAY do + handle:AppendItemFromIni(SZ_INI, 'Handle_Index') + end + if nPageCount <= PAGE_DISPLAY then + for i = 0, PAGE_DISPLAY - 1 do + local hItem = handle:Lookup(i) + hItem.nPage = i + 1 + hItem:Lookup('Text_Index'):SetText(i + 1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(i + 1 == nCurrentPage) + hItem:SetVisible(i < nPageCount) + end + else + local hItem = handle:Lookup(0) + hItem.nPage = 1 + hItem:Lookup('Text_Index'):SetText(1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(1 == nCurrentPage) + hItem:Show() + + local hItem = handle:Lookup(PAGE_DISPLAY - 1) + hItem.nPage = nPageCount + hItem:Lookup('Text_Index'):SetText(nPageCount) + hItem:Lookup('Text_IndexUnderline'):SetVisible(nPageCount == nCurrentPage) + hItem:Show() + + local nStartPage + if nCurrentPage + math.ceil((PAGE_DISPLAY - 2) / 2) > nPageCount then + nStartPage = nPageCount - (PAGE_DISPLAY - 2) + elseif nCurrentPage - math.ceil((PAGE_DISPLAY - 2) / 2) < 2 then + nStartPage = 2 + else + nStartPage = nCurrentPage - math.ceil((PAGE_DISPLAY - 2) / 2) + end + for i = 1, PAGE_DISPLAY - 2 do + local hItem = handle:Lookup(i) + hItem.nPage = nStartPage + i - 1 + hItem:Lookup('Text_Index'):SetText(nStartPage + i - 1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(nStartPage + i - 1 == nCurrentPage) + hItem:SetVisible(true) + end + end + handle:SetSize(hOuter:GetSize()) + handle:FormatAllItemPos() + handle:SetSizeByAllItemSize() + hOuter:FormatAllItemPos() + + local data = hFrame.ds:SelectMsg(aMsgType, szSearch, nil, nil, (nCurrentPage - 1) * PAGE_AMOUNT, PAGE_AMOUNT) + local scroll = hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog/Scroll_ChatLog') + local bScrollBottom = scroll:GetScrollPos() == scroll:GetStepCount() + local handle = hFrame:Lookup('Wnd_Total/Wnd_Main/WndScroll_ChatLog', 'Handle_ChatLogs') + for i = 1, PAGE_AMOUNT do + local rec = data[i] + local hItem = handle:Lookup(i - 1) + if rec then + hItem:SetW(nW - 215) + hItem:Lookup('Shadow_ChatLogHover'):SetW(nW - 215) + hItem:Lookup('Shadow_ChatLogSelect'):SetW(nW - 215) + hItem:Lookup('Handle_ChatLog_Msg'):SetW(nW - 215) + local f = GetMsgFont(rec.szMsgType) + local r, g, b = unpack(MSG_TYPE_COLOR[rec.szMsgType]) + local h = hItem:Lookup('Handle_ChatLog_Msg') + h:Clear() + h:AppendItemFromString(X.GetChatTimeXML(rec.nTime, { + r = r, g = g, b = b, f = f, + s = '[%yyyy/%MM/%dd][%hh:%mm:%ss]', richtext = rec.szMsg, + })) + local nCount = h:GetItemCount() + local szMsg = rec.szMsg + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + h:AppendItemFromString(szMsg) + for i = nCount, h:GetItemCount() - 1 do + X.RenderChatLink(h:Lookup(i)) + end + if MY_Farbnamen and MY_Farbnamen.Render then + MY_Farbnamen.Render(h, { nStartIndex = nCount }) + end + if MY_ChatMosaics and MY_ChatMosaics.Mosaics then + MY_ChatMosaics.Mosaics(h) + end + local last = h:Lookup(h:GetItemCount() - 1) + if last and last:GetType() == 'Text' and last:GetText():sub(-1) == '\n' then + last:SetText(last:GetText():sub(0, -2)) + end + h:FormatAllItemPos() + local nW, nH = h:GetAllItemSize() + h:SetH(nH) + hItem:Lookup('Shadow_ChatLogHover'):SetH(nH + 3) + hItem:Lookup('Shadow_ChatLogSelect'):SetH(nH + 3) + hItem:SetH(nH + 3) + hItem.szHash = rec.szHash + hItem.nTime = rec.nTime + hItem.szText = rec.szText + hItem.szMsgType = rec.szMsgType + hItem:Lookup('Shadow_ChatLogSelect'):SetVisible(hFrame.nLastClickIndex == i - 1) + hItem:Show() + else + hItem:Hide() + end + end + handle:FormatAllItemPos() + + if bKeepScroll then + if bScrollBottom then + scroll:SetScrollPos(scroll:GetStepCount()) + end + else + if hFrame.nScrollIndex then + local nW, nH = handle:GetAllItemSize() + local nScrollY = nH - handle:GetH() + local nY = 0 + for i = 0, hFrame.nScrollIndex - 1 do + nY = nY + handle:Lookup(i):GetH() + end + scroll:SetScrollPos(math.floor(scroll:GetStepCount() * nY / nScrollY)) + else + scroll:SetScrollPos(bInit and scroll:GetStepCount() or 0) + end + end +end + +function D.Open(szRoot, aChannel, szSearch, nMinTime, nMaxTime, nInitMsgIndex) + if not MY_ChatLog.InitDB() then + return + end + if X.IsRestricted('MY_ChatLog.BanHDD') and X.GetDiskType() == 'HDD' then + X.Alert(_L['New chat save feature has been disabled on HDD disk machine for performance issues, now on readonly mode.']) + end + local tUncheckedChannel + if aChannel then + tUncheckedChannel = {} + for _, info in pairs(MY_ChatLog.aChannel) do + tUncheckedChannel[info.szKey] = true + end + for _, szKey in ipairs(aChannel) do + tUncheckedChannel[szKey] = nil + end + else + tUncheckedChannel = X.Clone(MY_ChatLog.tUncheckedChannel) + end + -- 创建窗体 + local hFrame = X.UI.CreateFrame('MY_ChatLog_UI', { + w = 1000, h = 700, + close = true, + maximize = true, + resize = true, + minWidth = 600, + minHeight = 400, + text = _L['MY - MY_ChatLog'], + anchor = 'CENTER', + onSizeChange = function() + D.UpdatePage(this) + end, + }):Raw() + -- 更新窗体数据 + local nIndex = 0 + while Station.Lookup('Normal/MY_ChatLog_UI#' .. nIndex) do + nIndex = nIndex + 1 + end + hFrame:SetName('MY_ChatLog_UI#' .. nIndex) + hFrame.nMinTime = nMinTime or 0 + hFrame.nMaxTime = nMaxTime or math.huge + hFrame.szSearch = szSearch or '' + hFrame.tUncheckedChannel = tUncheckedChannel + hFrame.nCurrentPage = nInitMsgIndex and (math.floor(nInitMsgIndex / PAGE_AMOUNT) + 1) or nil + hFrame.nScrollIndex = nInitMsgIndex and (nInitMsgIndex % PAGE_AMOUNT) or nil + hFrame.nLastClickIndex = hFrame.nScrollIndex + D.SetDS(hFrame, szRoot) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChatLog_UI', + exports = { + { + preset = 'UIEvent', + fields = { + 'Open', + }, + root = D, + }, + }, +} +MY_ChatLog_UI = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ChatLog/ui/MY_ChatLog_UI.ini b/MY_ChatLog/ui/MY_ChatLog_UI.ini new file mode 100644 index 000000000..678482544 --- /dev/null +++ b/MY_ChatLog/ui/MY_ChatLog_UI.ini @@ -0,0 +1,861 @@ +[MY_ChatLog_UI] +._WndType=WndFrame +._Parent=Normal +Left=50 +Top=250 +Width=960 +Height=600 +DragAreaWidth=960 +DragAreaHeight=50 +IsCustomDragable=1 +DisableBringToTop=0 +DummyWnd=0 +MultiFrame=0 +DragAreaLeft=0 +DragAreaTop=0 +BreatheWhenHide=1 +ViewMutexKey= + +[Wnd_Main] +._WndType=WndWindow +._Parent=MY_ChatLog_UI +Left=20 +Top=55 +DummyWnd=0 +Width=935 +Height=530 + +[Wnd_Search] +._WndType=WndWindow +._Parent=Wnd_Main +Left=0 +Top=0 +Width=195 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Search] +._WndType=Handle +._Parent=Wnd_Search +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=195 +Height=25 + +[Image_SearchBg] +._WndType=Image +._Parent=Handle_Search +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=-1 +Top=0 +PosType=0 +Width=192 +Height=25 +ImageType=10 + +[Image_Search] +._WndType=Image +._Parent=Handle_Search +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=162 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_Search] +._WndType=WndEdit +._Parent=Wnd_Search +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=159 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=输入回车键搜索... +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[WndScroll_ChatChanel] +._WndType=WndScroll +._Parent=Wnd_Main +Left=0 +Top=25 +Width=195 +Height=505 +ScrollHandle= +ScrollContainer=WndContainer_ChatChanel +VerScrollBar=Scroll_ChatChanel +ScrollButtonUp=WndButton_ChanelUp +ScrollButtonDown=WndButton_ChanelDown + +[Handle_ScrollChatChanel] +._WndType=Handle +._Parent=WndScroll_ChatChanel +Left=0 +Top=0 +Width=195 +Height=505 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_ChatChanel] +._WndType=Image +._Parent=Handle_ScrollChatChanel +Left=0 +Top=0 +Width=190 +Height=505 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[WndContainer_ChatChanel] +._WndType=WndContainer +._Parent=WndScroll_ChatChanel +Left=0 +Top=0 +Width=195 +Height=470 +ContainerType=1 +DrawStyle=1 + +[Wnd_ChatChannel] +._WndType=WndWindow +._Parent=WndContainer_ChatChanel +Left=0 +Top=0 +Width=195 +Height=50 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Hover=Image_ChatChannelBg_Hover|Btn_Only +MBStatus=Image_ChatChannelBg_Down + +[CheckBox_ChatChannel] +._WndType=WndCheckBox +._Parent=Wnd_ChatChannel +Frame=56 +Left=15 +Top=12 +Width=25 +Height=25 +UnCheckAndEnable=5 +CheckAndEnable=6 +UnCheckAndDisable=85 +CheckAndDisable=86 +UnCheckedAndEnableWhenMouseOver=3 +CheckedAndEnableWhenMouseOver=7 +CheckedAndDisableWhenMouseOver=86 +UnCheckedAndDisableWhenMouseOver=85 +Checking=7 +UnChecking=3 +Image=ui\Image\button\CommonButton_1.UITex +$Tip= +ShowTipType=0 +DummyWnd=1 +CheckedWhenCreate=1 + +[Handle_CheckChatChannel] +._WndType=Handle +._Parent=CheckBox_ChatChannel +HandleType=0 +FirstItemPosType=0 +Left=-14 +Top=-11 +PosType=0 +Width=190 +Height=50 +EventID=512 + +[Text_ChatChannel] +._WndType=Text +._Parent=Handle_CheckChatChannel +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=48 +Top=12 +PosType=0 +Width=111 +Height=25 +FontScheme=18 +ShowAll=0 +AutoEtc=1 +VAlign=1 +OrgText=1 +$Text=密聊频道 + +[Handle_ChatChannel] +._WndType=Handle +._Parent=Wnd_ChatChannel +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_ChatChannelBg] +._WndType=Image +._Parent=Handle_ChatChannel +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=0 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=50 +ImageType=10 + +[Image_ChatChannelBg_Hover] +._WndType=Image +._Parent=Handle_ChatChannel +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=1 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=50 +LockShowAndHide=1 +ImageType=10 + +[Image_ChatChannelBg_Down] +._WndType=Image +._Parent=Handle_ChatChannel +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=2 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=50 +LockShowAndHide=1 +ImageType=10 + +[Btn_Only] +._WndType=WndButton +._Parent=Wnd_ChatChannel +Frame=0 +Left=160 +Top=14 +Width=20 +Height=20 +NormalGroup=35 +MouseOverGroup=36 +MouseDownGroup=37 +DisableGroup=35 +Image=ui\Image\Common\Money.UITex +DummyWnd=0 +Alpha=200 +LockShowAndHide=1 + +[WndButton_ChanelUp] +._WndType=WndButton +._Parent=WndScroll_ChatChanel +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 + +[WndButton_ChanelDown] +._WndType=WndButton +._Parent=WndScroll_ChatChanel +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 + +[Scroll_ChatChanel] +._WndType=WndNewScrollBar +._Parent=WndScroll_ChatChanel +StepCount=0 +PageStepCount=7 +Left=180 +Top=0 +Width=15 +Height=505 +Type=1 +SlideBtn=WndButton_Scroll_ChatChanel +AutoHideSlideButton=0 +AutoResizeSlideButton=0 +DummyWnd=1 + +[WndButton_Scroll_ChatChanel] +._WndType=WndButton +._Parent=Scroll_ChatChanel +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + +[WndScroll_ChatLog] +._WndType=WndScroll +._Parent=Wnd_Main +Left=200 +Top=0 +Width=735 +Height=500 +ScrollHandle=Handle_ChatLogs +ScrollContainer= +VerScrollBar=Scroll_ChatLog +ScrollButtonUp=WndButton_Up +ScrollButtonDown=WndButton_Down + +[Handle_ScrollChatLog] +._WndType=Handle +._Parent=WndScroll_ChatLog +Left=0 +Top=0 +Width=720 +Height=500 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_ChatLog] +._WndType=Image +._Parent=Handle_ScrollChatLog +Left=0 +Top=0 +Width=720 +Height=500 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_ChatLogs] +._WndType=Handle +._Parent=Handle_ScrollChatLog +Left=0 +Top=10 +Width=720 +Height=490 +PosType=0 +HandleType=3 +PixelScroll=1 +EventId=515 +RowSpacing=0 +ControlShow=0 +IgnoreInvisibleChild=1 + +[Handle_ChatLog] +._WndType=Handle +._Parent=Handle_ChatLogs +PosType=8 +HandleType=0 +ControlShow=0 +Width=720 +Height=40 +Hover=Shadow_ChatLogHover +FirstItemPosType=0 +EventID=816 + +[Shadow_ChatLogHover] +._WndType=Shadow +._Parent=Handle_ChatLog +PosType=0 +ShadowColor=gray1 +Alpha=150 +Width=720 +Height=40 +Left=0 +Top=0 +LockShowAndHide=1 + +[Shadow_ChatLogSelect] +._WndType=Shadow +._Parent=Handle_ChatLog +PosType=0 +ShadowColor=gray1 +Alpha=150 +Width=720 +Height=40 +Left=0 +Top=0 +LockShowAndHide=1 + +[Handle_ChatLog_Msg] +._WndType=Handle +._Parent=Handle_ChatLog +PosType=0 +HandleType=4 +RowSpacing=0 +Left=0 +Top=0 +Width=700 +Height=37 + +[WndButton_Up] +._WndType=WndButton +._Parent=WndScroll_ChatLog +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 + +[WndButton_Down] +._WndType=WndButton +._Parent=WndScroll_ChatLog +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 + +[Scroll_ChatLog] +._WndType=WndNewScrollBar +._Parent=WndScroll_ChatLog +StepCount=0 +PageStepCount=7 +Left=720 +Top=0 +Width=15 +Height=500 +Type=1 +SlideBtn=WndButton_Scroll_ChatLog +AutoHideSlideButton=0 +AutoResizeSlideButton=0 +DummyWnd=1 + +[WndButton_Scroll_ChatLog] +._WndType=WndButton +._Parent=Scroll_ChatLog +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + +[Wnd_Index] +._WndType=WndWindow +._Parent=Wnd_Main +Left=200 +Top=505 +Width=720 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_IndexTotal] +._WndType=Handle +._Parent=Wnd_Index +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=720 +Height=25 + +[Image_Index] +._WndType=Image +._Parent=Handle_IndexTotal +Left=0 +Top=0 +Width=720 +Height=25 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_IndexesOuter] +._WndType=Handle +._Parent=Handle_IndexTotal +Left=90 +Top=0 +PosType=0 +HandleType=2 +Width=575 +Height=25 +RowSpacing=0 +HAlign=1 +VAlign=1 +IgnoreInvisibleChild=0 +MinRowHeight=0 +MaxRowHeight=1 + +[Handle_Indexes] +._WndType=Handle +._Parent=Handle_IndexesOuter +PosType=8 +HandleType=3 +HAlign=0 +RowSpacing=0 +Width=48 +Height=25 +IgnoreInvisibleChild=1 + +[Handle_Index] +._WndType=Handle +._Parent=Handle_Indexes +PosType=8 +HandleType=0 +Width=48 +Height=25 +HAlign=0 +VAlign=0 +FirstItemPosType=0 +Hover=Shadow_Index +EventID=784 + +[Shadow_Index] +._WndType=Shadow +._Parent=Handle_Index +Left=1 +Top=0 +PosType=0 +ShadowColor=orange1 +Alpha=225 +Width=46 +Height=25 +LockShowAndHide=1 + +[Text_Index] +._WndType=Text +._Parent=Handle_Index +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=9999 +Width=48 +Height=25 +HAlign=1 +VAlign=1 +Left=0 +Top=0 + +[Text_IndexUnderline] +._WndType=Text +._Parent=Handle_Index +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=_ +OrgText=1 +Width=48 +Height=25 +HAlign=1 +VAlign=2 + +[Handle_IndexCount] +._WndType=Handle +._Parent=Handle_IndexTotal +PosType=0 +HandleType=0 +Width=90 +Height=25 +HAlign=0 +VAlign=0 +FirstItemPosType=0 +Hover= +EventID=784 +Left=0 +Top=0 + +[Shadow_IndexCount] +._WndType=Shadow +._Parent=Handle_IndexCount +Left=0 +Top=0 +PosType=0 +ShadowColor=gray4 +Alpha=100 +Width=90 +Height=25 + +[Text_IndexCount] +._WndType=Text +._Parent=Handle_IndexCount +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=共101页 +Width=90 +Height=25 +HAlign=1 +VAlign=1 +Left=0 +Top=0 + +[Text_IndexCountUnderline] +._WndType=Text +._Parent=Handle_IndexCount +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=_ +OrgText=1 +Width=90 +Height=25 +HAlign=1 +VAlign=2 + +[Wnd_IndexEdit] +._WndType=WndWindow +._Parent=Wnd_Index +Left=665 +Top=0 +Width=55 +Height=25 + +[Handle_IndexEdit] +._WndType=Handle +._Parent=Wnd_IndexEdit +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=55 +Height=25 +EventID=2048 + +[Image_IndexEdit] +._WndType=Image +._Parent=Handle_IndexEdit +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=55 +Height=25 +ImageType=10 + +[WndEdit_Index] +._WndType=WndEdit +._Parent=Wnd_IndexEdit +Left=4 +Top=2 +Width=46 +Height=21 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=2 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black + +[Btn_ChatChannelAll] +._WndType=WndButton +._Parent=Wnd_Main +Left=4 +Top=513 +Width=37 +Height=10 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Trans=0 +Image=ui\Image\UICommon\LoginCommon.UITex +Frame=3 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=39 +MouseOverGroup=40 +MouseDownGroup=41 +DisableGroup=38 +ShowTipType=0 +NormalFont=162 +MouseOverFont=0 +MouseDownFont=162 +ButtonDisable=0 +DisableFont=161 + +[Handle_ChatChannelAll] +._WndType=Handle +._Parent=Btn_ChatChannelAll +HandleType=0 +FirstItemPosType=0 +Left=-11 +Top=-14 +PosType=0 +Width=50 +Height=25 +EventID=512 + +[Text_ChatChannelAll] +._WndType=Text +._Parent=Handle_ChatChannelAll +FontSpacing=0 +Alpha=255 +$Text=STR_MAILPANEL_SELECTALL +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +MultiLine=0 +RowSpacing=0 +FontScheme=162 + diff --git a/MY_CombatText/data/CombatText.jx3dat b/MY_CombatText/data/CombatText.jx3dat new file mode 100644 index 000000000..2f3179306 --- /dev/null +++ b/MY_CombatText/data/CombatText.jx3dat @@ -0,0 +1,177 @@ +-- 编辑器支持的话可以高亮成LUA文件看。 +-- 在本文件中可以修改一些游戏内没有列出的配置,例如文字轨迹等。 + +-- 本文件只是作为参考,实际使用请把本文件复制一份到以下位置后再做修改: +-- 点击插件主界面“配置存储”按钮,选择“全局数据”,然后进入 config 文件夹,将该配置文件复制进去,例如: +-- 重制版: interface/MY#DATA/!all-users@zhcn/config/CombatText.jx3dat +-- 国际版: interface/MY#DATA/!all-users@zhtw/config/CombatText.jx3dat (注:需要转为 UTF-8 编码) +-- 缘起版: interface/MY#DATA/!all-users@classic_yq/config/CombatText.jx3dat + +-- 在游戏内重新打开伤害样式设置界面,点击右上角载入配置可直接刷新本文件。 +-- 以下local定义不要去修改,只是作为注解和枚举。 +-- 不要改本文件,本文件只是做参考,而且每次插件更新会覆盖。 +-- 修改教程 详见 https://www.bilibili.com/video/av3409345 (部分参数可能已变更,以该文件为准) +-- 修改后 会心样式将失效 可以选择删除 COMBAT_TEXT_SCALE 重新使样式生效 + +local COMBAT_TEXT_TYPE = { + DAMAGE = 'DAMAGE' , -- 受伤 + + THERAPY = 'THERAPY' , -- 治疗 + EFFECTIVE_THERAPY = 'EFFECTIVE_THERAPY' , -- 有效治疗 + STEAL_LIFE = 'STEAL_LIFE' , -- 偷取气血 + + PHYSICS_DAMAGE = 'PHYSICS_DAMAGE' , -- 外功伤害 + SOLAR_MAGIC_DAMAGE = 'SOLAR_MAGIC_DAMAGE' , -- 阳性内功伤害 + NEUTRAL_MAGIC_DAMAGE = 'NEUTRAL_MAGIC_DAMAGE', -- 混元性内功伤害 + LUNAR_MAGIC_DAMAGE = 'LUNAR_MAGIC_DAMAGE' , -- 阴性内功伤害 + POISON_DAMAGE = 'POISON_DAMAGE' , -- 毒性伤害 + REFLECTED_DAMAGE = 'REFLECTED_DAMAGE' , -- 反弹伤害 + SPIRIT = 'SPIRIT' , -- 精神 + STAYING_POWER = 'STAYING_POWER' , -- 耐力 + + SHIELD_DAMAGE = 'SHIELD_DAMAGE' , -- 无效伤害 + ABSORB_DAMAGE = 'ABSORB_DAMAGE' , -- 化解伤害 + PARRY_DAMAGE = 'PARRY_DAMAGE' , -- 拆招/招架 + INSIGHT_DAMAGE = 'INSIGHT_DAMAGE' , -- 识破 + + SKILL_BUFF = 'SKILL_BUFF' , -- 增益效果 + SKILL_DEBUFF = 'SKILL_DEBUFF' , -- 减益效果 + SKILL_MISS = 'SKILL_MISS' , -- 招式偏离 + BUFF_IMMUNITY = 'BUFF_IMMUNITY' , -- 免疫气劲 + SKILL_DODGE = 'SKILL_DODGE' , -- 招式闪避 + EXP = 'EXP' , -- 角色经验 + MSG = 'MSG' , -- 普通消息 + CRITICAL_MSG = 'CRITICAL_MSG' , -- 重要消息 +} + +-- 从这里开始可以修改了 +return { + -- 需要会心和放大的类型 + COMBAT_TEXT_CRITICAL = { + [COMBAT_TEXT_TYPE.THERAPY ] = true, + [COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY ] = true, + [COMBAT_TEXT_TYPE.STEAL_LIFE ] = true, + [COMBAT_TEXT_TYPE.PHYSICS_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE] = true, + [COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.POISON_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.REFLECTED_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.EXP ] = true, + [COMBAT_TEXT_TYPE.CRITICAL_MSG ] = true, + }, + -- 各种伤害的缩放帧数 一共32个关键帧 后面是延长帧 + COMBAT_TEXT_SCALE = { + CRITICAL = { -- 会心 + 2, 4.5, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + }, + NORMAL = { -- 普通伤害 + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + }, + }, + -- 伤害位置移动 当然可以负数 + COMBAT_TEXT_POINT = { + TOP = { -- 伤害 往上的 分四组 普通 慢 慢 快~~ + 0, 6, 12, 18, 24, 30, 36, 42, + 45, 48, 51, 54, 57, 60, 63, 66, + 69, 72, 75, 78, 81, 84, 87, 90, + 100, 110, 120, 130, 140, 150, 160, 170, + }, + RIGHT = { -- 从左往右的 + 8, 16, 24, 32, 40, 48, 56, 64, + 72, 80, 88, 96, 104, 112, 120, 128, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 139, 142, 145, 148, 151, 154, 157, 160, + 163, 166, 169, 172, 175, 178, 181, 184, + }, + LEFT = { -- 从右到左 + 8, 16, 24, 32, 40, 48, 56, 64, + 72, 80, 88, 96, 104, 112, 120, 128, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 139, 142, 145, 148, 151, 154, 157, 160, + 163, 166, 169, 172, 175, 178, 181, 184, + }, + BOTTOM_LEFT = { -- 左下角 + 5, 10, 15, 20, 25, 30, 35, 40, + 45, 50, 55, 60, 65, 70, 75, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 82, 84, 86, 88, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, + }, + BOTTOM_RIGHT = { + 5, 10, 15, 20, 25, 30, 35, 40, + 45, 50, 55, 60, 65, 70, 75, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 82, 84, 86, 88, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, + }, + }, + -- 用于屏蔽事件,比如不需要BUFF可以删除 SKILL_BUFF + COMBAT_TEXT_EVENT = { + "COMMON_HEALTH_TEXT", + "SKILL_EFFECT_TEXT", + "SKILL_MISS", + "SKILL_DODGE", + "SKILL_BUFF", + "BUFF_IMMUNITY", + }, + -- 忽略不显示的招式 ID可以在团队监控近期招式记录找 普通攻击也是个招式 + COMBAT_TEXT_SKILL_IGNORE = { + -- [16] = true, -- XX普通攻击 + -- [4326] = true, -- 明教普通攻击 + -- 其他自己找了 都注解了 需要无视自己去掉 但是小心仙侣老3害人 + }, + -- 忽略自身施展的部分类型 明教可以忽略外功伤害 也可以忽略吸血 + COMBAT_TEXT_SKILL_TYPE_IGNORE = { + -- [COMBAT_TEXT_TYPE.STEAL_LIFE] = true, + }, + -- 各种类型战斗文字的配色 + COMBAT_TEXT_COLOR = { + -- 受伤 + [COMBAT_TEXT_TYPE.DAMAGE ] = { 253, 86, 86 }, -- 受伤 自己受到的伤害 + -- 治疗 + [COMBAT_TEXT_TYPE.THERAPY ] = { 0, 255, 0 }, -- 治疗 + [COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY ] = { 0, 255, 0 }, -- 有效治疗 + [COMBAT_TEXT_TYPE.STEAL_LIFE ] = { 0, 255, 0 }, -- 偷取气血 + -- 招式 + [COMBAT_TEXT_TYPE.PHYSICS_DAMAGE ] = { 255, 255, 255 }, -- 外功攻击 + [COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE ] = { 255, 128, 128 }, -- 阳性攻击 + [COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE] = { 255, 255, 0 }, -- 混元攻击 + [COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE ] = { 12, 242, 255 }, -- 阴性攻击 + [COMBAT_TEXT_TYPE.POISON_DAMAGE ] = { 128, 255, 128 }, -- 毒性攻击 + [COMBAT_TEXT_TYPE.REFLECTED_DAMAGE ] = { 255, 128, 128 }, -- 反弹伤害 + [COMBAT_TEXT_TYPE.SPIRIT ] = { 160, 0, 160 }, -- 精神 + [COMBAT_TEXT_TYPE.STAYING_POWER ] = { 255, 169, 0 }, -- 耐力 + + [COMBAT_TEXT_TYPE.SHIELD_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.ABSORB_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.PARRY_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.INSIGHT_DAMAGE ] = { 255, 255, 0 }, + + [COMBAT_TEXT_TYPE.SKILL_BUFF ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.SKILL_DEBUFF ] = { 255, 0, 0 }, + [COMBAT_TEXT_TYPE.SKILL_MISS ] = { 255, 255, 255 }, + [COMBAT_TEXT_TYPE.BUFF_IMMUNITY ] = { 255, 255, 255 }, + [COMBAT_TEXT_TYPE.SKILL_DODGE ] = { 255, 0, 0 }, + + [COMBAT_TEXT_TYPE.EXP ] = { 255, 0, 255 }, + [COMBAT_TEXT_TYPE.MSG ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.CRITICAL_MSG ] = { 255, 0, 0 }, + }, + -- 各种类型战斗文字会心时的配色,默认为空即与普通保持一致 + COMBAT_TEXT_CRITICAL_COLOR = {}, +} diff --git a/MY_CombatText/info.ini b/MY_CombatText/info.ini new file mode 100644 index 000000000..78ad3603c --- /dev/null +++ b/MY_CombatText/info.ini @@ -0,0 +1,8 @@ +[MY_CombatText] +name=战斗文字 +desc=漂亮的战斗浮动文字 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_CombatText.lua diff --git a/MY_CombatText/info.ini.zh_TW b/MY_CombatText/info.ini.zh_TW new file mode 100644 index 000000000..d908acc09 --- /dev/null +++ b/MY_CombatText/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_CombatText] +name=鎴伴鏂囧瓧 +desc=婕備寒鐨勬埌楝ユ诞鍕曟枃瀛 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_CombatText.lua diff --git a/MY_CombatText/lang/default.jx3dat b/MY_CombatText/lang/default.jx3dat new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/MY_CombatText/lang/default.jx3dat @@ -0,0 +1 @@ +return {} diff --git a/MY_CombatText/lang/zhcn.jx3dat b/MY_CombatText/lang/zhcn.jx3dat new file mode 100644 index 000000000..12c6c4777 --- /dev/null +++ b/MY_CombatText/lang/zhcn.jx3dat @@ -0,0 +1,84 @@ +return { + -- CombatText -- + ['MY_CombatText'] = '战斗文字', + + ['Combat text config loaded.'] = '战斗文字配置加载完成。', + ['Combat text config failed.'] = '战斗文字配置加载失败。', + + COMBAT_TEXT_TYPE_NAME = { + DAMAGE = '受伤', + + THERAPY = '治疗', + EFFECTIVE_THERAPY = '有效治疗', + STEAL_LIFE = '偷取气血', + + PHYSICS_DAMAGE = '外功攻击', + SOLAR_MAGIC_DAMAGE = '阳性攻击', + NEUTRAL_MAGIC_DAMAGE = '混元攻击', + LUNAR_MAGIC_DAMAGE = '阴性攻击', + POISON_DAMAGE = '毒性攻击', + REFLECTED_DAMAGE = '反弹伤害', + SPIRIT = '精神', + STAYING_POWER = '耐力', + + SHIELD_DAMAGE = '伤害化解', + ABSORB_DAMAGE = '伤害吸收', + PARRY_DAMAGE = '招式招架', + INSIGHT_DAMAGE = '招式识破', + + SKILL_BUFF = '有利气劲', + SKILL_DEBUFF = '不利气劲', + SKILL_MISS = '招式偏离', + BUFF_IMMUNITY = '免疫气劲', + SKILL_DODGE = '招式闪避', + EXP = '角色经验', + MSG = '普通消息', + CRITICAL_MSG = '重要消息', + }, + + -- PS + ['Combat text'] = '战斗文字', + ['Enable combat text'] = '启用战斗文字', + ['Enable render'] = '使用渲染帧(平滑)', + ['Only show my related combat text'] = '仅显示与我有关的战斗文字', + ['Disable immunity'] = '屏蔽免疫', + ['Optimize in roguelike'] = '八荒衡鉴地图优化', + ['Critical Strike'] = '致命一击', + ['Combine the same time combat text'] = '受伤/伤害超过目标最大血量35%时,合并一段时间的伤害,对万花玉石等爆DOT职业优化', + ['Show combine text'] = '显示致命一击', + ['Disable partner text'] = '隐藏侠客文本', + ['Max count'] = '最大数量', + ['Max same time combat text count limit'] = '最大同屏战斗文字数量', + ['Limit to %d'] = '不超过%d个', + ['Limitless'] = '不限数量', + ['Hold time'] = '动画时间', + ['Fade in time'] = '淡入时间', + ['Fade out time'] = '淡出时间', + ['frame'] = '帧', + ['Font size'] = '文字大小', + ['times'] = '倍', + ['Critical style'] = '会心样式', + ['Hit feel'] = '强打击感', + ['Low hit feel'] = '弱打击感', + ['Soft'] = '柔和', + ['Scale only'] = '仅缩放', + + ['Text style'] = '战斗文字格式设置', + ['Skill style'] = '招式文字格式', + ['Damage style'] = '受伤文字格式', + ['Therapy style'] = '治疗文字格式', + ['Tips: $name means caster\'s name, $sn means skill name, $crit means critical, $val means value.'] = '小提示:$name代表释放者名字,$sn招式名,$crit会心,$val数值。', + ['$name not me'] = '$name为自己时不显示', + ['$sn shorten(2)'] = '简写招式名', + ['Simplify value'] = '精简数值', + ['Therapy effective only'] = '仅显示有效治疗', + ['Font edit'] = '字体修改', + ['Current font: %d'] = '当前字体:%d', + + ['Color edit'] = '颜色修改', + ['Distinct critical color'] = '区分会心颜色', + ['Reset color'] = '重置配色', + ['Critical color'] = '会心颜色', + + ['Reload combat text config'] = '重新载入配置', +} diff --git a/MY_CombatText/lang/zhtw.jx3dat b/MY_CombatText/lang/zhtw.jx3dat new file mode 100644 index 000000000..cb4663a3b --- /dev/null +++ b/MY_CombatText/lang/zhtw.jx3dat @@ -0,0 +1,84 @@ +return { + -- CombatText -- + ['MY_CombatText'] = '鎴伴鏂囧瓧', + + ['Combat text config loaded.'] = '鎴伴鏂囧瓧閰嶇疆杓夊叆瀹屾垚銆', + ['Combat text config failed.'] = '鎴伴鏂囧瓧閰嶇疆杓夊叆澶辨晽銆', + + COMBAT_TEXT_TYPE_NAME = { + DAMAGE = '鍙楀偡', + + THERAPY = '娌荤檪', + EFFECTIVE_THERAPY = '鏈夋晥娌荤檪', + STEAL_LIFE = '鍋峰彇姘h', + + PHYSICS_DAMAGE = '澶栧姛鏀绘搳', + SOLAR_MAGIC_DAMAGE = '闄芥ф敾鎿', + NEUTRAL_MAGIC_DAMAGE = '娣峰厓鏀绘搳', + LUNAR_MAGIC_DAMAGE = '闄版ф敾鎿', + POISON_DAMAGE = '姣掓ф敾鎿', + REFLECTED_DAMAGE = '鍙嶅綀鍌峰', + SPIRIT = '绮剧', + STAYING_POWER = '鑰愬姏', + + SHIELD_DAMAGE = '鍌峰鍖栬В', + ABSORB_DAMAGE = '鍌峰鍚告敹', + PARRY_DAMAGE = '鎷涘紡鎷涙灦', + INSIGHT_DAMAGE = '鎷涘紡璀樼牬', + + SKILL_BUFF = '鏈夊埄姘e媮', + SKILL_DEBUFF = '涓嶅埄姘e媮', + SKILL_MISS = '鎷涘紡鍋忛洟', + BUFF_IMMUNITY = '鍏嶇柅姘e媮', + SKILL_DODGE = '鎷涘紡闁冮伩', + EXP = '瑙掕壊缍撻', + MSG = '鏅氭秷鎭', + CRITICAL_MSG = '閲嶈娑堟伅', + }, + + -- PS + ['Combat text'] = '鎴伴鏂囧瓧', + ['Enable combat text'] = '鍟熺敤鎴伴鏂囧瓧', + ['Enable render'] = '浣跨敤娓叉煋骞锛堝钩婊戯級', + ['Only show my related combat text'] = '鍍呴’绀鸿垏鎴戞湁闂滅殑鎴伴鏂囧瓧', + ['Disable immunity'] = '灞忚斀鍏嶇柅', + ['Optimize in roguelike'] = '鍏崚琛¢憭鍦板湒鍎寲', + ['Critical Strike'] = '鑷村懡涓鎿', + ['Combine the same time combat text'] = '鍙楀偡/鍌峰瓒呴亷鐩鏈澶ц閲35%鏅傦紝鍚堜降涓娈垫檪闁撶殑鍌峰锛屽皪钀姳鐜夌煶绛夌垎DOT鑱锋キ鍎寲', + ['Show combine text'] = '椤ず鑷村懡涓鎿', + ['Disable partner text'] = '闅辫棌淇犲鏂囨湰', + ['Max count'] = '鏈澶ф暩閲', + ['Max same time combat text count limit'] = '鏈澶у悓灞忔埌楝ユ枃瀛楁暩閲', + ['Limit to %d'] = '涓嶈秴閬%d鍊', + ['Limitless'] = '涓嶉檺鏁搁噺', + ['Hold time'] = '鍕曠暙鏅傞枔', + ['Fade in time'] = '娣″叆鏅傞枔', + ['Fade out time'] = '娣″嚭鏅傞枔', + ['frame'] = '骞', + ['Font size'] = '鏂囧瓧澶у皬', + ['times'] = '鍊', + ['Critical style'] = '鏈冨績妯e紡', + ['Hit feel'] = '寮锋墦鎿婃劅', + ['Low hit feel'] = '寮辨墦鎿婃劅', + ['Soft'] = '鏌斿拰', + ['Scale only'] = '鍍呯府鏀', + + ['Text style'] = '鎴伴鏂囧瓧鏍煎紡瑷疆', + ['Skill style'] = '鎷涘紡鏂囧瓧鏍煎紡', + ['Damage style'] = '鍙楀偡鏂囧瓧鏍煎紡', + ['Therapy style'] = '娌荤檪鏂囧瓧鏍煎紡', + ['Tips: $name means caster\'s name, $sn means skill name, $crit means critical, $val means value.'] = '灏忔彁绀猴細$name浠h〃閲嬫斁鑰呭悕瀛楋紝$sn鎷涘紡鍚嶏紝$crit鏈冨績锛$val鏁稿笺', + ['$name not me'] = '$name鐐鸿嚜宸辨檪涓嶉’绀', + ['$sn shorten(2)'] = '绨″鎷涘紡鍚', + ['Simplify value'] = '绮剧啊鏁稿', + ['Therapy effective only'] = '鍍呴’绀烘湁鏁堟不鐧', + ['Font edit'] = '瀛楅珨淇敼', + ['Current font: %d'] = '鐣跺墠瀛楅珨锛%d', + + ['Color edit'] = '椤忚壊淇敼', + ['Distinct critical color'] = '鍗鍒嗘渻蹇冮鑹', + ['Reset color'] = '閲嶇疆閰嶈壊', + ['Critical color'] = '鏈冨績椤忚壊', + + ['Reload combat text config'] = '閲嶆柊杓夊叆閰嶇疆', +} diff --git a/MY_CombatText/src/MY_CombatText.lua b/MY_CombatText/src/MY_CombatText.lua new file mode 100644 index 000000000..67e14267d --- /dev/null +++ b/MY_CombatText/src/MY_CombatText.lua @@ -0,0 +1,1819 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗浮动文字 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_CombatText/MY_CombatText' +local PLUGIN_NAME = 'MY_CombatText' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_CombatText' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local SKILL_RESULT_TYPE = SKILL_RESULT_TYPE +local GetSkill, Random = GetSkill, Random +local Table_GetBuffName, Table_GetSkillName, Table_BuffIsVisible = Table_GetBuffName, Table_GetSkillName, Table_BuffIsVisible + +-- 战斗浮动文字设计思路 +--[[ + 停留时间:使用(总帧数 * 每帧时间)来决定总停留时间, + alpha: 使用帧数来决定fadein和fadeout。 + 排序: 顶部使用简易见缝插针,分配空闲轨迹,最大程度上保证性能和浮动数值清晰。 + 坐标轨迹:使用关键帧形式,一共32关键帧,部分类型有延长帧。 + 出现: 对出现做1帧的延迟处理,即1帧出现5次伤害则分5帧依次出现。 + ------------------------------------------------------------------------------- + 初始坐标类型:分为 顶部 左 右 左下 右下 中心 + 顶部: + Y轴轨迹数 以 math.floor(3.5 / UI缩放) 决定,其初始Y轴高度不同。 + 在轨迹全部被占用后会随机分摊到屏幕顶部左右两边。 + 其他类型:使用轨迹合并16-32帧,后来的文本会顶走前面的文本,从而跳过这部分停留的帧数。 +]] + +local COMBAT_TEXT_INIFILE = X.PACKET_INFO.ROOT .. 'MY_CombatText/ui/MY_CombatText_Render.ini' +local COMBAT_TEXT_CONFIG = X.FormatPath({'config/CombatText.jx3dat', X.PATH_TYPE.GLOBAL}) +local COMBAT_TEXT_PLAYERID = 0 +local COMBAT_TEXT_IN_ROGUELIKE_MAP = false +local COMBAT_TEXT_TOTAL = 32 +local COMBAT_TEXT_UI_SCALE = 1 +local COMBAT_TEXT_TRAJECTORY = 4 -- 顶部Y轴轨迹数量 根据缩放大小变化 0.8就是5条了 屏幕小更多 + +local COMBAT_TEXT_TYPE = { + DAMAGE = 'DAMAGE' , + + THERAPY = 'THERAPY' , + EFFECTIVE_THERAPY = 'EFFECTIVE_THERAPY' , + STEAL_LIFE = 'STEAL_LIFE' , + + PHYSICS_DAMAGE = 'PHYSICS_DAMAGE' , + SOLAR_MAGIC_DAMAGE = 'SOLAR_MAGIC_DAMAGE' , + NEUTRAL_MAGIC_DAMAGE = 'NEUTRAL_MAGIC_DAMAGE', + LUNAR_MAGIC_DAMAGE = 'LUNAR_MAGIC_DAMAGE' , + POISON_DAMAGE = 'POISON_DAMAGE' , + REFLECTED_DAMAGE = 'REFLECTED_DAMAGE' , + SPIRIT = 'SPIRIT' , + STAYING_POWER = 'STAYING_POWER' , + + SHIELD_DAMAGE = 'SHIELD_DAMAGE' , + ABSORB_DAMAGE = 'ABSORB_DAMAGE' , + PARRY_DAMAGE = 'PARRY_DAMAGE' , + INSIGHT_DAMAGE = 'INSIGHT_DAMAGE' , + + SKILL_BUFF = 'SKILL_BUFF' , + SKILL_DEBUFF = 'SKILL_DEBUFF' , + SKILL_MISS = 'SKILL_MISS' , + BUFF_IMMUNITY = 'BUFF_IMMUNITY' , + SKILL_DODGE = 'SKILL_DODGE' , + EXP = 'EXP' , + MSG = 'MSG' , + CRITICAL_MSG = 'CRITICAL_MSG' , +} + +local COMBAT_TEXT_CRITICAL = { -- 需要会心跳帧的文字类型 + [COMBAT_TEXT_TYPE.THERAPY ] = true, + [COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY ] = true, + [COMBAT_TEXT_TYPE.STEAL_LIFE ] = true, + [COMBAT_TEXT_TYPE.PHYSICS_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE] = true, + [COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.POISON_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.REFLECTED_DAMAGE ] = true, + [COMBAT_TEXT_TYPE.EXP ] = true, + [COMBAT_TEXT_TYPE.CRITICAL_MSG ] = true, +} +local COMBAT_TEXT_EVENT = { 'COMMON_HEALTH_TEXT', 'SKILL_EFFECT_TEXT', 'SKILL_MISS', 'SKILL_DODGE', 'SKILL_BUFF', 'BUFF_IMMUNITY' } +local COMBAT_TEXT_OFFICIAL_EVENT = { 'SKILL_EFFECT_TEXT', 'COMMON_HEALTH_TEXT', 'SKILL_MISS', 'SKILL_DODGE', 'SKILL_BUFF', 'BUFF_IMMUNITY', 'ON_EXP_LOG', 'SYS_MSG', 'FIGHT_HINT' } +local COMBAT_TEXT_SKILL_IGNORE = {} +local COMBAT_TEXT_SKILL_TYPE_IGNORE = {} +local COMBAT_TEXT_SKILL_STATIC_STRING = X.KvpToObject({ -- 需要变成特定字符串的伤害类型 + {SKILL_RESULT_TYPE.SHIELD_DAMAGE , g_tStrings.STR_MSG_ABSORB }, + {SKILL_RESULT_TYPE.ABSORB_DAMAGE , g_tStrings.STR_MSG_ABSORB }, + {SKILL_RESULT_TYPE.PARRY_DAMAGE , g_tStrings.STR_MSG_COUNTERACT}, + {SKILL_RESULT_TYPE.INSIGHT_DAMAGE, g_tStrings.STR_MSG_INSIGHT }, +}) + +local COMBAT_TEXT_STYLES = { + [0] = { + 2, 4.5, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + }, + [1] = { + 2, 4.5, 4, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + }, + [2] = { + 1, 2, 3, 4.5, 3, 3, 3, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + }, + [3] = { + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + } +} + +local COMBAT_TEXT_SCALE = { -- 各种伤害的缩放帧数 一共32帧 + CRITICAL = { -- 会心 + 2, 4.5, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + }, + NORMAL = { -- 普通伤害 + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, + }, +} + +local COMBAT_TEXT_POINT = { + TOP = { -- 伤害 往上的 分四组 普通 慢 慢 快~~ + 0, 6, 12, 18, 24, 30, 36, 42, + 45, 48, 51, 54, 57, 60, 63, 66, + 69, 72, 75, 78, 81, 84, 87, 90, + 100, 110, 120, 130, 140, 150, 160, 170, + }, + RIGHT = { -- 从左往右的 + 8, 16, 24, 32, 40, 48, 56, 64, + 72, 80, 88, 96, 104, 112, 120, 128, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 139, 142, 145, 148, 151, 154, 157, 160, + 163, 166, 169, 172, 175, 178, 181, 184, + }, + LEFT = { -- 从右到左 + 8, 16, 24, 32, 40, 48, 56, 64, + 72, 80, 88, 96, 104, 112, 120, 128, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 139, 142, 145, 148, 151, 154, 157, 160, + 163, 166, 169, 172, 175, 178, 181, 184, + }, + BOTTOM_LEFT = { -- 左下角 + 5, 10, 15, 20, 25, 30, 35, 40, + 45, 50, 55, 60, 65, 70, 75, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 82, 84, 86, 88, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, + }, + BOTTOM_RIGHT = { + 5, 10, 15, 20, 25, 30, 35, 40, + 45, 50, 55, 60, 65, 70, 75, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, + 82, 84, 86, 88, 90, 92, 94, 96, + 98, 100, 102, 104, 106, 108, 110, 112, + }, +} + +local COMBAT_TEXT_COLOR = { + -- 受伤 + [COMBAT_TEXT_TYPE.DAMAGE ] = X.ENVIRONMENT.GAME_PROVIDER == 'remote' and { 253, 86, 86 } or { 255, 0, 0 }, -- 受伤 自己受到的伤害 + -- 治疗 + [COMBAT_TEXT_TYPE.THERAPY ] = { 0, 255, 0 }, -- 治疗 + [COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY ] = { 0, 255, 0 }, -- 有效治疗 + [COMBAT_TEXT_TYPE.STEAL_LIFE ] = { 0, 255, 0 }, -- 偷取气血 + -- 招式 + [COMBAT_TEXT_TYPE.PHYSICS_DAMAGE ] = { 255, 255, 255 }, -- 外功攻击 + [COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE ] = { 255, 128, 128 }, -- 阳性攻击 + [COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE] = { 255, 255, 0 }, -- 混元攻击 + [COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE ] = { 12, 242, 255 }, -- 阴性攻击 + [COMBAT_TEXT_TYPE.POISON_DAMAGE ] = { 128, 255, 128 }, -- 毒性攻击 + [COMBAT_TEXT_TYPE.REFLECTED_DAMAGE ] = { 255, 128, 128 }, -- 反弹伤害 + [COMBAT_TEXT_TYPE.SPIRIT ] = { 160, 0, 160 }, -- 精神 + [COMBAT_TEXT_TYPE.STAYING_POWER ] = { 255, 169, 0 }, -- 耐力 + + [COMBAT_TEXT_TYPE.SHIELD_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.ABSORB_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.PARRY_DAMAGE ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.INSIGHT_DAMAGE ] = { 255, 255, 0 }, + + [COMBAT_TEXT_TYPE.SKILL_BUFF ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.SKILL_DEBUFF ] = { 255, 0, 0 }, + [COMBAT_TEXT_TYPE.SKILL_MISS ] = { 255, 255, 255 }, + [COMBAT_TEXT_TYPE.BUFF_IMMUNITY ] = { 255, 255, 255 }, + [COMBAT_TEXT_TYPE.SKILL_DODGE ] = { 255, 0, 0 }, + + [COMBAT_TEXT_TYPE.EXP ] = { 255, 0, 255 }, + [COMBAT_TEXT_TYPE.MSG ] = { 255, 255, 0 }, + [COMBAT_TEXT_TYPE.CRITICAL_MSG ] = { 255, 0, 0 }, +} +local COMBAT_TEXT_CRITICAL_COLOR = {} + +local COMBAT_TEXT_TYPE_CLASS = { + [COMBAT_TEXT_TYPE.STEAL_LIFE ] = 'THERAPY', + [COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY] = 'THERAPY', + [COMBAT_TEXT_TYPE.THERAPY ] = 'THERAPY', +} + +local COMBAT_TEXT_LEAVE = {} +local COMBAT_TEXT_FREE = {} +-- 合并伤害 cache 记录方式是 dwTargetID + _ + szPoint = nValue +local COMBAT_TEXT_COMBINE = {} +local COMBAT_TEXT_SHADOW = {} +local COMBAT_TEXT_QUEUE = {} +local COMBAT_TEXT_CACHE = { -- buff的名字cache + BUFF = {}, + DEBUFF = {}, +} + +local COMBAT_TEXT_TYPE_NAME = setmetatable(_L.COMBAT_TEXT_TYPE_NAME or {}, { __index = function(_, k) return k end }) + +local O = X.CreateUserSettingsModule('MY_CombatText', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Enable combat text'], + }), + xSchema = X.Schema.Boolean, + szVersion = '20241105', + xDefaultValue = false, + }, + bRender = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Enable render'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + fScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Font size'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nStyle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Critical style'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nMaxAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + g_tStrings.STR_QUESTTRACE_CHANGE_ALPHA, + }), + xSchema = X.Schema.Number, + xDefaultValue = 240, + }, + nMaxCount = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Max count'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 300, + }, + nTime = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Hold time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 40, + }, + nFadeIn = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Fade in time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 4, + }, + nFadeOut = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Fade out time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 8, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Font edit'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 19, + }, + bImmunity = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Disable immunity'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOtherCharacter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Only show my related combat text'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bCritical = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Distinct critical color'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOptimizeRoguelike = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Optimize in roguelike'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + -- 显示合并文本(致命一击) + bEnableCombineText = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Show combine text'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bDisabledPartnerText = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Disable partner text'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + -- $name 名字 $sn 技能名 $crit 会心 $val 数值 + szSkill = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Skill style'], + }), + xSchema = X.Schema.String, + xDefaultValue = '$sn' .. g_tStrings.STR_COLON .. '$crit $val', + }, + szTherapy = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Therapy style'], + }), + xSchema = X.Schema.String, + xDefaultValue = '$sn' .. g_tStrings.STR_COLON .. '$crit +$val', + }, + szDamage = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Damage style'], + }), + xSchema = X.Schema.String, + xDefaultValue = '$sn' .. g_tStrings.STR_COLON .. '$crit -$val', + }, + bCasterNotI = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['$name not me'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSnShorten2 = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['$sn shorten(2)'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTherapyEffectiveOnly = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Therapy effective only'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Color edit'], + }), + xSchema = X.Schema.Map(X.Schema.OneOf(X.Schema.String, X.Schema.Number), X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number)), + xDefaultValue = {}, + }, + tCriticalColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Critical color'], + }), + xSchema = X.Schema.Map(X.Schema.OneOf(X.Schema.String, X.Schema.Number), X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number)), + xDefaultValue = {}, + }, + bSimplifyValue = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_CombatText'], + szDescription = X.MakeCaption({ + _L['Simplify value'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local function IsEnabled() + return D.bReady and O.bEnable +end + +local function IsCombatTextPlayerID(...) + if O.bOtherCharacter then + return true + end + for i = 1, select('#', ...) do + if select(i, ...) == COMBAT_TEXT_PLAYERID then + return true + end + end + return false +end + +function D.GetColor(eType, bCritical) + return (bCritical and O.bCritical) + and O.tCriticalColor[eType] + or O.tColor[eType] + or COMBAT_TEXT_COLOR[eType] + or { 255, 255, 255 } +end + +function D.GetTargetShowValue(nValue) + if O.bSimplifyValue then + return X.FormatNumberDot(nValue, 1, false, 10000) + end + return nValue +end + +function D.HideOfficialCombat() + local frame = Station.Lookup('Lowest/CombatText') + if frame then + for _, v in ipairs(COMBAT_TEXT_OFFICIAL_EVENT) do + frame:UnRegisterEvent(v) + end + end +end + +function D.ShowOfficialCombat() + local frame = Station.Lookup('Lowest/CombatText') + if frame then + for _, v in ipairs(COMBAT_TEXT_OFFICIAL_EVENT) do + frame:UnRegisterEvent(v) + frame:RegisterEvent(v) + end + end +end + +function D.OnFrameCreate() + for k, v in ipairs(COMBAT_TEXT_EVENT) do + this:RegisterEvent(v) + end + this:ShowWhenUIHide() + this:RegisterEvent('SYS_MSG') + this:RegisterEvent('FIGHT_HINT') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('LOADING_END') + this:RegisterEvent('NPC_ENTER_SCENE') + this:RegisterEvent('ON_EXP_LOG') + this:RegisterEvent('COINSHOP_ON_OPEN') + this:RegisterEvent('COINSHOP_ON_CLOSE') + this:RegisterEvent('ENTER_STORY_MODE') + this:RegisterEvent('LEAVE_STORY_MODE') + D.handle = this:Lookup('', '') + D.FreeQueue() + D.UpdateTrajectoryCount() + X.BreatheCall('COMBAT_TEXT_CACHE', 1000 * 60 * 5, function() + local count = 0 + for k, v in pairs(COMBAT_TEXT_LEAVE) do + count = count + 1 + end + if count > 10000 then + COMBAT_TEXT_LEAVE = {} + Log('[MY] CombatText cache beyond 10000 !!!') + end + end) + X.BreatheCall('COMBAT_TEXT_COMBINE', 200, function() + if not O.bEnableCombineText then + return + end + for k, v in pairs(COMBAT_TEXT_COMBINE) do + if v.nCount >= 3 then + local object = X.IsPlayer(v.dwTargetID) and X.GetPlayer(v.dwTargetID) or X.GetNpc(v.dwTargetID) + if object then + local _, fMaxLife = X.GetCharacterLife(object) + if v.nValue > fMaxLife * 0.35 then + local shadow = D.GetFreeShadow(true) + if shadow then + D.CreateText( + shadow, + v.dwTargetID, + _L['Critical Strike'] .. ' ' .. D.GetTargetShowValue(v.nValue), + v.szPoint, + COMBAT_TEXT_TYPE.CRITICAL_MSG, + true, + true + ) + end + end + end + end + COMBAT_TEXT_COMBINE[k] = nil + end + end) +end +-- for i=1,5 do FireUIEvent('SKILL_EFFECT_TEXT',1073745690,MY.GetClientPlayerID(),true,5,1111,111,1)end +-- for i=1,5 do FireUIEvent('SKILL_EFFECT_TEXT',MY.GetClientPlayerID(),1073745690,true,5,1111,111,1)end +-- for i=1,5 do FireUIEvent('SKILL_EFFECT_TEXT',X.GetClientPlayerID(),1073741860,false,5,1111,111,1)end +-- for i=1, 5 do FireEvent('SKILL_BUFF', X.GetClientPlayerID(), true, 103, 1) end +-- FireUIEvent('SKILL_MISS', X.GetClientPlayerID(), X.GetClientPlayerID()) +-- FireUIEvent('SYS_MSG', 'UI_OME_EXP_LOG', X.GetClientPlayerID(), X.GetClientPlayerID()) +function D.OnEvent(szEvent) + if szEvent == 'FIGHT_HINT' then -- 进出战斗文字 + if arg0 then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.STR_MSG_ENTER_FIGHT) + else + OutputMessage('MSG_ANNOUNCE_YELLOW', g_tStrings.STR_MSG_LEAVE_FIGHT) + end + elseif szEvent == 'COMMON_HEALTH_TEXT' then + if arg1 ~= 0 then + D.OnCommonHealth(arg0, arg1) + end + elseif szEvent == 'SKILL_EFFECT_TEXT' then + -- 贯体治疗有效值 SKILL_EFFECT_TEXT 无法显示,于是让所有有效治疗走 SYS_MSG -> UI_OME_SKILL_EFFECT_LOG 通道 + if arg3 == SKILL_RESULT_TYPE.EFFECTIVE_THERAPY then + return + end + D.OnSkillText(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + elseif szEvent == 'SKILL_BUFF' then + D.OnSkillBuff(arg0, arg1, arg2, arg3) + elseif szEvent == 'BUFF_IMMUNITY' then + if not O.bImmunity and IsCombatTextPlayerID(arg1) then + D.OnBuffImmunity(arg0) + end + elseif szEvent == 'SKILL_MISS' then + if IsCombatTextPlayerID(arg0, arg1) then + D.OnSkillMiss(arg1) + end + elseif szEvent == 'UI_SCALED' then + D.UpdateTrajectoryCount() + elseif szEvent == 'SKILL_DODGE' then + if IsCombatTextPlayerID(arg0, arg1) then + D.OnSkillDodge(arg1) + end + elseif szEvent == 'NPC_ENTER_SCENE' then + COMBAT_TEXT_LEAVE[arg0] = nil + elseif szEvent == 'ON_EXP_LOG' then + D.OnExpLog(arg0, arg1) + elseif szEvent == 'SYS_MSG' then + if arg0 == 'UI_OME_DEATH_NOTIFY' then + if not X.IsPlayer(arg1) then + COMBAT_TEXT_LEAVE[arg1] = true + end + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + -- 技能最终产生的效果(生命值的变化); + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)bReact:是否为反击 (arg4)nEffectType:Effect类型 (arg5)dwID:Effect的ID + -- (arg6)dwLevel:Effect的等级 (arg7)bCriticalStrike:是否会心 (arg8)nCount:tResultCount数据表中元素个数 (arg9)tResultCount:数值集合 + -- 贯体治疗有效值 SKILL_EFFECT_TEXT 无法显示,于是让所有有效治疗走 SYS_MSG -> UI_OME_SKILL_EFFECT_LOG 通道 + if arg9[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] then + D.OnSkillText(arg1, arg2, arg7, SKILL_RESULT_TYPE.EFFECTIVE_THERAPY, arg9[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY], arg5, arg6, arg4) + end + -- dwCasterID, dwTargetID, bCriticalStrike, nEffectType, nValue, dwSkillID, dwSkillLevel, nEffectType + end + elseif szEvent == 'LOADING_END' then + this:Show() + D.FreeQueue() + elseif szEvent == 'COINSHOP_ON_OPEN' or szEvent == 'ENTER_STORY_MODE' then + this:HideWhenUIHide() + elseif szEvent == 'COINSHOP_ON_CLOSE' or szEvent == 'LEAVE_STORY_MODE' then + this:ShowWhenUIHide() + end +end + +function D.FreeQueue() + COMBAT_TEXT_LEAVE = {} + COMBAT_TEXT_FREE = {} + COMBAT_TEXT_SHADOW = {} + COMBAT_TEXT_CACHE = { + BUFF = {}, + DEBUFF = {}, + } + D.handle:Clear() + COMBAT_TEXT_QUEUE = { + TOP = {}, + LEFT = {}, + RIGHT = {}, + BOTTOM_LEFT = {}, + BOTTOM_RIGHT = {}, + } + setmetatable(COMBAT_TEXT_QUEUE, { __index = function(me) return me['TOP'] end, __newindex = function(me) return me['TOP'] end }) +end +function D.OnFrameRender() + if not D.bReady then + return + end + local nTime = GetTime() + local nFadeIn = O.nFadeIn + local nFadeOut = O.nFadeOut + local nMaxAlpha = O.nMaxAlpha + local nFont = O.nFont + local nDelay = O.nTime + local g_fScale = O.fScale + for k, v in pairs(COMBAT_TEXT_SHADOW) do + local nFrame = (nTime - v.nTime) / nDelay + 1 -- 每一帧是多少毫秒 这里越小 动画越快 + local nBefore = math.floor(nFrame) + local nAfter = math.ceil(nFrame) + local fDiff = nFrame - nBefore + local nTotal = COMBAT_TEXT_POINT[v.szPoint] and #COMBAT_TEXT_POINT[v.szPoint] or COMBAT_TEXT_TOTAL + k:ClearTriangleFanPoint() + if nBefore < nTotal then + local nTop = 0 + local nLeft = 0 + local nAlpha = nMaxAlpha + local fScale = 1 + local bTop = true + -- alpha + if nFrame < nFadeIn then + nAlpha = nMaxAlpha * nFrame / nFadeIn + elseif nFrame > nTotal - nFadeOut then + nAlpha = nMaxAlpha * (nTotal - nFrame) / nFadeOut + end + -- 坐标 + if v.szPoint == 'TOP' or v.szPoint == 'TOP_LEFT' or v.szPoint == 'TOP_RIGHT' then + local tTop = COMBAT_TEXT_POINT[v.szPoint] + nTop = (-60 * g_fScale) + v.nSort * (-40 * g_fScale) - (tTop[nBefore] + (tTop[nAfter] - tTop[nBefore]) * fDiff) + if v.szPoint == 'TOP_LEFT' or v.szPoint == 'TOP_RIGHT' then + if v.szPoint == 'TOP_LEFT' then + nLeft = -250 + elseif v.szPoint == 'TOP_RIGHT' then + nLeft = 250 + end + nTop = nTop -50 + end + elseif v.szPoint == 'LEFT' then + local tLeft = COMBAT_TEXT_POINT[v.szPoint] + nLeft = -60 - (tLeft[nBefore] + (tLeft[nAfter] - tLeft[nBefore]) * fDiff) + nAlpha = nAlpha * 0.85 + elseif v.szPoint == 'RIGHT' then + local tLeft = COMBAT_TEXT_POINT[v.szPoint] + nLeft = 60 + (tLeft[nBefore] + (tLeft[nAfter] - tLeft[nBefore]) * fDiff) + nAlpha = nAlpha * 0.9 + elseif v.szPoint == 'BOTTOM_LEFT' or v.szPoint == 'BOTTOM_RIGHT' then + local tLeft = COMBAT_TEXT_POINT[v.szPoint] + local tTop = COMBAT_TEXT_POINT[v.szPoint] + if v.szPoint == 'BOTTOM_LEFT' then + nLeft = -130 - (tLeft[nBefore] + (tLeft[nAfter] - tLeft[nBefore]) * fDiff) + else + nLeft = 130 + (tLeft[nBefore] + (tLeft[nAfter] - tLeft[nBefore]) * fDiff) + end + nTop = 50 + tTop[nBefore] + (tTop[nAfter] - tTop[nBefore]) * fDiff + fScale = 1.5 + end + -- 缩放 + if COMBAT_TEXT_CRITICAL[v.eType] then + local tScale = v.bCriticalStrike and COMBAT_TEXT_SCALE.CRITICAL or COMBAT_TEXT_SCALE.NORMAL + fScale = tScale[nBefore] + if tScale[nBefore] > tScale[nAfter] then + fScale = fScale - ((tScale[nBefore] - tScale[nAfter]) * fDiff) + elseif tScale[nBefore] < tScale[nAfter] then + fScale = fScale + ((tScale[nAfter] - tScale[nBefore]) * fDiff) + end + if COMBAT_TEXT_TYPE_CLASS[v.eType] == 'THERAPY' then -- 治疗缩小 + if v.bCriticalStrike then + fScale = math.max(fScale * 0.7, COMBAT_TEXT_SCALE.NORMAL[#COMBAT_TEXT_SCALE.NORMAL] + 0.1) + end + if v.dwTargetID == COMBAT_TEXT_PLAYERID then + fScale = fScale * 0.95 + end + elseif v.szPoint == 'TOP_LEFT' or v.szPoint == 'TOP_RIGHT' then -- 左右缩小 + fScale = fScale * 0.85 + end + if v.szPoint == 'TOP' or v.szPoint == 'TOP_LEFT' or v.szPoint == 'TOP_RIGHT' then + fScale = fScale * g_fScale + end + end + -- draw + local r, g, b = unpack(v.col or {255, 255, 255}) + if not COMBAT_TEXT_LEAVE[v.dwTargetID] or not v.object or not v.tPoint[1] then + k:AppendCharacterID(v.dwTargetID, bTop, r, g, b, nAlpha, { 0, 0, 0, nLeft * COMBAT_TEXT_UI_SCALE, nTop * COMBAT_TEXT_UI_SCALE}, nFont, v.szText, 1, fScale) + if v.object and v.object.nX then + v.tPoint = { v.object.nX, v.object.nY, v.object.nZ } + else -- DEBUG JX3Client [Script index] pointer invalid. call stack: 暂无完美解决方案 都会造成内存泄露 + if not COMBAT_TEXT_LEAVE[v.dwTargetID] then + COMBAT_TEXT_LEAVE[v.dwTargetID] = true + end + end + else + local x, y, z = unpack(v.tPoint) + k:AppendTriangleFan3DPoint(x, y, z, r, g, b, nAlpha, { 0, 1.65 * 64, 0, nLeft * COMBAT_TEXT_UI_SCALE, nTop * COMBAT_TEXT_UI_SCALE}, nFont, v.szText, 1, fScale) + end + -- 合并伤害 后顶前 + if not v.bJump and v.szPoint ~= 'TOP' and nFrame >= 16 and nFrame <= 32 then + for kk, vv in pairs(COMBAT_TEXT_SHADOW) do + if k ~= kk + and vv.nFrame <= 32 + and v.szPoint == vv.szPoint + and not vv.bJump + and v.nTime > vv.nTime + then + vv.bJump = true + end + end + end + if v.bJump and v.szPoint ~= 'TOP' and nFrame >= 16 and nFrame <= 32 then + v.nTime = v.nTime - (32 - nFrame) * nDelay + else + v.nFrame = nFrame + end + else + if v.szPoint == 'RIGHT' and v.dwTargetID == COMBAT_TEXT_PLAYERID then + if v.eType == COMBAT_TEXT_TYPE.SKILL_BUFF and COMBAT_TEXT_CACHE.BUFF[v.szText] then + COMBAT_TEXT_CACHE.BUFF[v.szText] = nil + elseif v.eType == COMBAT_TEXT_TYPE.SKILL_DEBUFF and COMBAT_TEXT_CACHE.DEBUFF[v.szText] then + COMBAT_TEXT_CACHE.DEBUFF[v.szText] = nil + end + end + k.free = true + COMBAT_TEXT_SHADOW[k] = nil + end + end + for k, v in pairs(COMBAT_TEXT_QUEUE) do + for kk, vv in pairs(v) do + if #vv > 0 then + local dat = table.remove(vv, 1) + if dat.dat.szPoint == 'TOP' then + local nSort, szPoint = D.GetTrajectory(dat.dat.dwTargetID) + dat.dat.nSort = nSort + dat.dat.szPoint = szPoint + end + dat.dat.nTime = GetTime() + COMBAT_TEXT_SHADOW[dat.shadow] = dat.dat + else + COMBAT_TEXT_QUEUE[k][kk] = nil + end + end + end +end + +D.OnFrameBreathe = D.OnFrameRender +D.OnFrameRender = D.OnFrameRender + +function D.UpdateTrajectoryCount() + if D.bReady then + COMBAT_TEXT_UI_SCALE = Station.GetUIScale() * 0.6 + COMBAT_TEXT_TRAJECTORY = O.fScale < 1.5 + and math.floor(3.5 / COMBAT_TEXT_UI_SCALE / O.fScale) + or math.floor(3.5 / COMBAT_TEXT_UI_SCALE) + end +end + + +local function TrajectorySort(a, b) + if a.nCount == b.nCount then + return a.nSort < b.nSort + else + return a.nCount < b.nCount + end +end + +-- 最大程度上使用见缝插针效果 缺少缓存 待补充 +function D.GetTrajectory(dwTargetID, bCriticalStrike) + local tSort = {} + local fRange = 1 / COMBAT_TEXT_TRAJECTORY + for i = 1, COMBAT_TEXT_TRAJECTORY do + tSort[i] = { nSort = i, nCount = 0, fRange = i * fRange } + end + for k, v in pairs(COMBAT_TEXT_SHADOW) do + if v.dwTargetID == dwTargetID + and v.szPoint == 'TOP' + and v.nFrame < 15 + then + local fSort = (COMBAT_TEXT_POINT.TOP[math.floor(v.nFrame) + 1] + v.nSort * fRange * COMBAT_TEXT_POINT.TOP[COMBAT_TEXT_TOTAL]) / COMBAT_TEXT_POINT.TOP[COMBAT_TEXT_TOTAL] + for i = 1, COMBAT_TEXT_TRAJECTORY do + if fSort < tSort[i].fRange then + tSort[i].nCount = tSort[i].nCount + 1 + break + end + end + end + end + table.sort(tSort, TrajectorySort) + local nSort = tSort[1].nSort - 1 + local szPoint = 'TOP' + if tSort[1].nCount == 1 then + szPoint = Random(2) == 1 and 'TOP_LEFT' or 'TOP_RIGHT' + nSort = 0 + end + return nSort, szPoint +end + +function D.CreateColorText(shadow, dwTargetID, szText, szPoint, eType, bCriticalStrike, tCol, bIsCombineText) + local object, tPoint + local bIsPlayer = X.IsPlayer(dwTargetID) + if dwTargetID ~= COMBAT_TEXT_PLAYERID then + object = bIsPlayer and X.GetPlayer(dwTargetID) or X.GetNpc(dwTargetID) + if object and object.nX then + tPoint = { object.nX, object.nY, object.nZ } + end + end + local dat = { + szPoint = szPoint, + nSort = 0, + dwTargetID = dwTargetID, + szText = szText, + eType = eType, + nFrame = 0, + bCriticalStrike = bCriticalStrike, + col = tCol or D.GetColor(eType, bCriticalStrike), + object = object, + tPoint = tPoint, + } + if dat.bCriticalStrike or bIsCombineText then + if szPoint == 'TOP' and not bIsCombineText then + local nSort, point = D.GetTrajectory(dat.dwTargetID, true) + dat.nSort = nSort + dat.szPoint = point + end + dat.nTime = GetTime() + COMBAT_TEXT_SHADOW[shadow] = dat + else + COMBAT_TEXT_QUEUE[szPoint][dwTargetID] = COMBAT_TEXT_QUEUE[szPoint][dwTargetID] or {} + table.insert(COMBAT_TEXT_QUEUE[szPoint][dwTargetID], { shadow = shadow, dat = dat }) + end +end + +function D.CreateText(shadow, dwTargetID, szText, szPoint, eType, bCriticalStrike, bIsCombineText) + return D.CreateColorText(shadow, dwTargetID, szText, szPoint, eType, bCriticalStrike, nil, bIsCombineText) +end + +local SKILL_RESULT_TYPE_TO_COMBAT_TEXT_TYPE = X.KvpToObject({ + {SKILL_RESULT_TYPE.THERAPY , COMBAT_TEXT_TYPE.THERAPY }, + {SKILL_RESULT_TYPE.EFFECTIVE_THERAPY , COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY }, + {SKILL_RESULT_TYPE.STEAL_LIFE , COMBAT_TEXT_TYPE.STEAL_LIFE }, + {SKILL_RESULT_TYPE.PHYSICS_DAMAGE , COMBAT_TEXT_TYPE.PHYSICS_DAMAGE }, + {SKILL_RESULT_TYPE.SOLAR_MAGIC_DAMAGE , COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE }, + {SKILL_RESULT_TYPE.NEUTRAL_MAGIC_DAMAGE, COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE}, + {SKILL_RESULT_TYPE.LUNAR_MAGIC_DAMAGE , COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE }, + {SKILL_RESULT_TYPE.POISON_DAMAGE , COMBAT_TEXT_TYPE.POISON_DAMAGE }, + {SKILL_RESULT_TYPE.REFLECTIED_DAMAGE , COMBAT_TEXT_TYPE.REFLECTED_DAMAGE }, + {SKILL_RESULT_TYPE.SPIRIT , COMBAT_TEXT_TYPE.SPIRIT }, + {SKILL_RESULT_TYPE.STAYING_POWER , COMBAT_TEXT_TYPE.STAYING_POWER }, + {SKILL_RESULT_TYPE.SHIELD_DAMAGE , COMBAT_TEXT_TYPE.SHIELD_DAMAGE }, + {SKILL_RESULT_TYPE.ABSORB_DAMAGE , COMBAT_TEXT_TYPE.ABSORB_DAMAGE }, + {SKILL_RESULT_TYPE.PARRY_DAMAGE , COMBAT_TEXT_TYPE.PARRY_DAMAGE }, + {SKILL_RESULT_TYPE.INSIGHT_DAMAGE , COMBAT_TEXT_TYPE.INSIGHT_DAMAGE }, +}) + +function D.AppendCombineTable(dwTargetID, szPoint, nValue, szText) + -- 右下角治疗屏蔽 + if O.bEnableCombineText and not (szPoint == 'BOTTOM_RIGHT') then + local key = dwTargetID .. '_' .. szPoint + if not COMBAT_TEXT_COMBINE[key] then + COMBAT_TEXT_COMBINE[key] = { + dwTargetID = dwTargetID, + szPoint = szPoint, + nValue = 0, + nCount = 0, + aList = {} -- debug + } + end + COMBAT_TEXT_COMBINE[key].nValue = COMBAT_TEXT_COMBINE[key].nValue + (X.IsNumber(nValue) and nValue or 0) + COMBAT_TEXT_COMBINE[key].nCount = COMBAT_TEXT_COMBINE[key].nCount + 1 + table.insert(COMBAT_TEXT_COMBINE[key].aList, szText) + end +end + +function D.OnSkillText(dwCasterID, dwTargetID, bCriticalStrike, nSkillResultType, nValue, dwSkillID, dwSkillLevel, nEffectType) + local eType = SKILL_RESULT_TYPE_TO_COMBAT_TEXT_TYPE[nSkillResultType] + if not eType then + return + end + -- 特定类型的招式过滤 + if (dwCasterID == COMBAT_TEXT_PLAYERID or nSkillResultType == SKILL_RESULT_TYPE.STEAL_LIFE) + and COMBAT_TEXT_SKILL_TYPE_IGNORE[nSkillResultType] then + return + end + -- 特定的招式过滤 + if dwCasterID == COMBAT_TEXT_PLAYERID and COMBAT_TEXT_SKILL_IGNORE[dwSkillID] then + return + end + -- 有效治疗过滤 + if (eType == COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY and not O.bTherapyEffectiveOnly) + or (eType == COMBAT_TEXT_TYPE.THERAPY and O.bTherapyEffectiveOnly) then + return + end + -- 过滤无效治疗 + if COMBAT_TEXT_TYPE_CLASS[eType] == 'THERAPY' and nValue == 0 then + return + end + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and (COMBAT_TEXT_TYPE_CLASS[eType] == 'THERAPY' or dwTargetID == COMBAT_TEXT_PLAYERID) and O.bOptimizeRoguelike then + return + end + local bIsPlayer = X.IsPlayer(dwCasterID) + local KCaster = bIsPlayer and X.GetPlayer(dwCasterID) or X.GetNpc(dwCasterID) + local KEmployer, dwEmployerID + if not bIsPlayer and KCaster then + if O.bDisabledPartnerText and X.IsPartnerNpc(KCaster.dwTemplateID) then + return + end + dwEmployerID = KCaster.dwEmployer + if dwEmployerID ~= 0 then -- NPC要算归属圈 + KEmployer = X.GetPlayer(dwEmployerID) + end + end + -- 过滤他人数据 + if (dwCasterID ~= COMBAT_TEXT_PLAYERID and dwTargetID ~= COMBAT_TEXT_PLAYERID and dwEmployerID ~= COMBAT_TEXT_PLAYERID) + and not O.bOtherCharacter then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + + local szSkillName, szText, szReplaceText, bStaticSign + -- replace text / point / color + local szPoint = 'TOP' + -- skill type effect by class and presets + if COMBAT_TEXT_SKILL_STATIC_STRING[nSkillResultType] then -- 需要变成特定字符串的伤害类型 + szText = COMBAT_TEXT_SKILL_STATIC_STRING[nSkillResultType] + if dwTargetID == COMBAT_TEXT_PLAYERID then + szPoint = 'LEFT' + end + elseif COMBAT_TEXT_TYPE_CLASS[eType] == 'THERAPY' then + if dwTargetID == COMBAT_TEXT_PLAYERID then + szPoint = 'BOTTOM_RIGHT' + end + szReplaceText = O.szTherapy + elseif dwTargetID == COMBAT_TEXT_PLAYERID then + szPoint = 'BOTTOM_LEFT' + szReplaceText = O.szDamage + else + szReplaceText = O.szSkill + end + -- specific skill type overwrite + if eType == COMBAT_TEXT_TYPE.STEAL_LIFE then -- 吸血技能偷取避免重复获取 浪费性能 + szSkillName = g_tStrings.SKILL_STEAL_LIFE + elseif eType == COMBAT_TEXT_TYPE.SPIRIT then + if dwTargetID == COMBAT_TEXT_PLAYERID then + szPoint = 'BOTTOM_RIGHT' + end + szReplaceText = O.szSkill + szSkillName = g_tStrings.SKILL_SPIRIT + bStaticSign = true + elseif eType == COMBAT_TEXT_TYPE.STAYING_POWER then + if dwTargetID == COMBAT_TEXT_PLAYERID then + szPoint = 'BOTTOM_RIGHT' + end + szReplaceText = O.szSkill + szSkillName = g_tStrings.SKILL_STAYING_POWER + bStaticSign = true + end + -- skill name fallback + if not szSkillName then + szSkillName = nEffectType == SKILL_EFFECT_TYPE.BUFF + and Table_GetBuffName(dwSkillID, dwSkillLevel) + or Table_GetSkillName(dwSkillID, dwSkillLevel) + end + if szPoint == 'BOTTOM_LEFT' then -- 左下角肯定是伤害 + -- 苍云反弹技能修正颜色 + if KCaster and KCaster.dwID ~= COMBAT_TEXT_PLAYERID and KCaster.dwForceID == 21 and nEffectType ~= SKILL_EFFECT_TYPE.BUFF then + local hSkill = GetSkill(dwSkillID, dwSkillLevel) + if hSkill and hSkill.dwBelongSchool ~= 18 and hSkill.dwBelongSchool ~= 0 then + eType = COMBAT_TEXT_TYPE.REFLECTED_DAMAGE + end + end + if eType ~= COMBAT_TEXT_TYPE.REFLECTED_DAMAGE then + eType = COMBAT_TEXT_TYPE.DAMAGE + end + end + -- draw text + if not szText then -- 还未被定义的 + local szCasterName = '' + if KCaster then + if KEmployer then + szCasterName = KEmployer.szName + else + szCasterName = KCaster.szName + end + end + if O.bCasterNotI and (COMBAT_TEXT_PLAYERID == dwCasterID or COMBAT_TEXT_PLAYERID == dwEmployerID) then + szCasterName = '' + end + if O.bSnShorten2 then + szSkillName = X.StringSubW(szSkillName, 1, 2) -- wstring是兼容台服的 台服utf-8 + end + szText = szReplaceText + szText = szText:gsub('(%s?)$crit(%s?)', (bCriticalStrike and '%1'.. g_tStrings.STR_CS_NAME .. '%2' or '')) + szText = szText:gsub('$name', szCasterName) + szText = szText:gsub('$sn', szSkillName) + szText = szText:gsub('$val', (bStaticSign and X.IsNumber(nValue) and nValue > 0 and '+' or '') .. (nValue and D.GetTargetShowValue(nValue) or '')) + end + if COMBAT_TEXT_TYPE_CLASS[eType] ~= 'THERAPY' then + D.AppendCombineTable(dwTargetID, szPoint, nValue, szText) + end + D.CreateText(shadow, dwTargetID, szText, szPoint, eType, bCriticalStrike) +end + +function D.OnSkillBuff(dwCharacterID, bCanCancel, dwID, nLevel) + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and O.bOptimizeRoguelike then + return + end + if not Table_BuffIsVisible(dwID, nLevel) then + return + end + local szBuffName = Table_GetBuffName(dwID, nLevel) + if szBuffName == '' then + return + end + local tCache = bCanCancel and COMBAT_TEXT_CACHE.BUFF or COMBAT_TEXT_CACHE.DEBUFF + if tCache[szBuffName] then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + tCache[szBuffName] = true + D.CreateText(shadow, dwCharacterID, szBuffName, 'RIGHT', bCanCancel and COMBAT_TEXT_TYPE.SKILL_BUFF or COMBAT_TEXT_TYPE.SKILL_DEBUFF, false) +end + +function D.OnSkillMiss(dwTargetID) + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and O.bOptimizeRoguelike then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + local szPoint = dwTargetID == COMBAT_TEXT_PLAYERID and 'LEFT' or 'TOP' + D.CreateText(shadow, dwTargetID, g_tStrings.STR_MSG_MISS, szPoint, COMBAT_TEXT_TYPE.SKILL_MISS, false) +end + +function D.OnBuffImmunity(dwTargetID) + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and O.bOptimizeRoguelike then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + D.CreateText(shadow, dwTargetID, g_tStrings.STR_MSG_IMMUNITY, 'LEFT', COMBAT_TEXT_TYPE.BUFF_IMMUNITY, false) +end + +-- FireUIEvent('COMMON_HEALTH_TEXT', X.GetClientPlayer().dwID, -8888) +function D.OnCommonHealth(dwCharacterID, nDeltaLife) + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and O.bOptimizeRoguelike then + return + end + if nDeltaLife < 0 and not IsCombatTextPlayerID(dwCharacterID) then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + local szPoint = 'BOTTOM_LEFT' + if nDeltaLife > 0 then + if dwCharacterID ~= COMBAT_TEXT_PLAYERID then + szPoint = 'TOP' + else + szPoint = 'BOTTOM_RIGHT' + end + end + local szText = (nDeltaLife > 0 and '+' or '') .. D.GetTargetShowValue(nDeltaLife) + local eType = nDeltaLife > 0 and COMBAT_TEXT_TYPE.THERAPY or COMBAT_TEXT_TYPE.DAMAGE + D.CreateText(shadow, dwCharacterID, szText, szPoint, eType, false) +end + +function D.OnSkillDodge(dwTargetID) + -- 八荒衡鉴优化:保留玩家自己的伤害,屏蔽受到的伤害和治疗 + if COMBAT_TEXT_IN_ROGUELIKE_MAP and O.bOptimizeRoguelike then + return + end + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + D.CreateText(shadow, dwTargetID, g_tStrings.STR_MSG_DODGE, 'LEFT', COMBAT_TEXT_TYPE.SKILL_DODGE, false) +end + +function D.OnExpLog(dwCharacterID, nExp) + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + D.CreateText(shadow, dwCharacterID, g_tStrings.STR_COMBATMSG_EXP .. nExp, 'CENTER', COMBAT_TEXT_TYPE.EXP, true) +end + +function D.CreateMessage(szText, tOptions) + local shadow = D.GetFreeShadow() + if not shadow then -- 没有空闲的shadow + return + end + local dwTargetID = tOptions.dwTargetID or COMBAT_TEXT_PLAYERID + local szPosition = tOptions.szPosition or 'CENTER' + local bCritical = tOptions.bCritical or false + local eType = bCritical and COMBAT_TEXT_TYPE.CRITICAL_MSG or COMBAT_TEXT_TYPE.MSG + local tColor = tOptions.tColor + D.CreateColorText(shadow, dwTargetID, szText, szPosition, eType, bCritical, tColor) +end + +-- 获取的是否是合并的伤害 +function D.GetFreeShadow(bIsCombineText) + if not bIsCombineText then + for k, v in ipairs(COMBAT_TEXT_FREE) do + if v.free then + v.free = false + return v + end + end + end + + if bIsCombineText or (O.nMaxCount > 0 and #COMBAT_TEXT_FREE < O.nMaxCount) then + local handle = D.handle + local sha = handle:AppendItemFromIni(COMBAT_TEXT_INIFILE, bIsCombineText and 'Shadow_Content' or 'Shadow_Content_2') + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:ClearTriangleFanPoint() + table.insert(COMBAT_TEXT_FREE, sha) + return sha + end +end + +function D.LoadConfig() + local bExist = IsFileExist(COMBAT_TEXT_CONFIG) + if bExist then + local data = LoadLUAData(COMBAT_TEXT_CONFIG) + if data then + COMBAT_TEXT_CRITICAL = data.COMBAT_TEXT_CRITICAL or COMBAT_TEXT_CRITICAL + COMBAT_TEXT_SCALE = data.COMBAT_TEXT_SCALE or COMBAT_TEXT_SCALE + COMBAT_TEXT_POINT = data.COMBAT_TEXT_POINT or COMBAT_TEXT_POINT + COMBAT_TEXT_EVENT = data.COMBAT_TEXT_EVENT or COMBAT_TEXT_EVENT + COMBAT_TEXT_SKILL_IGNORE = data.COMBAT_TEXT_SKILL_IGNORE or {} + COMBAT_TEXT_SKILL_TYPE_IGNORE = data.COMBAT_TEXT_SKILL_TYPE_IGNORE or {} + COMBAT_TEXT_COLOR = data.COMBAT_TEXT_COLOR or COMBAT_TEXT_COLOR + COMBAT_TEXT_CRITICAL_COLOR = data.COMBAT_TEXT_CRITICAL_COLOR or COMBAT_TEXT_CRITICAL_COLOR + X.OutputSystemMessage(_L['Combat text config loaded.']) + else + X.OutputSystemMessage(_L['Combat text config failed.']) + end + end +end + +function D.CheckEnable() + local ui = Station.Lookup('Lowest/MY_CombatText') + if IsEnabled() then + if O.bRender then + COMBAT_TEXT_INIFILE = X.PACKET_INFO.ROOT .. 'MY_CombatText/ui/MY_CombatText_Render.ini' + else + COMBAT_TEXT_INIFILE = X.PACKET_INFO.ROOT .. 'MY_CombatText/ui/MY_CombatText.ini' + end + COMBAT_TEXT_SCALE.CRITICAL = COMBAT_TEXT_STYLES[O.nStyle] and COMBAT_TEXT_STYLES[O.nStyle] or COMBAT_TEXT_STYLES[0] + D.LoadConfig() + if ui then + X.UI.CloseFrame(ui) + end + X.UI.OpenFrame(COMBAT_TEXT_INIFILE, 'MY_CombatText') + D.HideOfficialCombat() + else + if ui then + D.FreeQueue() + X.UI.CloseFrame(ui) + X.BreatheCall('COMBAT_TEXT_CACHE', false) + X.BreatheCall('COMBAT_TEXT_COMBINE', false) + collectgarbage('collect') + end + D.ShowOfficialCombat() + end + setmetatable(COMBAT_TEXT_POINT, { __index = function(me, key) + if key == 'TOP_LEFT' or key == 'TOP_RIGHT' then + return me['TOP'] + end + end }) + local mt = { __index = function(me) + return me[#me] + end } + setmetatable(COMBAT_TEXT_SCALE.CRITICAL, mt) + setmetatable(COMBAT_TEXT_SCALE.NORMAL, mt) +end + + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_CombatText', + exports = { + { + preset = 'UIEvent', + fields = { + 'CreateMessage', + }, + root = D, + }, + }, +} +MY_CombatText = X.CreateModule(settings) +end + + +local PS = {} +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 20, 10 + local nX, nY = nPaddingX, nPaddingY + local nDeltaY = 28 + local nChapterPaddingTop = 5 + local nChapterPaddingBottom = 3 + + ui:Append('Text', { x = nX, y = nY, text = _L['Combat text'], font = 27 }) + nX = nX + 10 + nY = nY + nDeltaY + nChapterPaddingBottom + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Enable combat text'], + color = { 255, 128, 0 }, + checked = O.bEnable, + onCheck = function(bCheck) + O.bEnable = bCheck + D.CheckEnable() + end, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Enable render'], + checked = O.bRender, + onCheck = function(bCheck) + O.bRender = bCheck + D.CheckEnable() + end, + autoEnable = IsEnabled, + }):Width() + 5 + nY = nY + nDeltaY + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Only show my related combat text'], + checked = not O.bOtherCharacter, + onCheck = function(bCheck) + O.bOtherCharacter = not bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Disable immunity'], + checked = O.bImmunity, + onCheck = function(bCheck) + O.bImmunity = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Optimize in roguelike'], + checked = O.bOptimizeRoguelike, + onCheck = function(bCheck) + O.bOptimizeRoguelike = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + -- 显示合并文本 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show combine text'], + checked = O.bEnableCombineText, + tip = { + render = _L['Combine the same time combat text'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + onCheck = function(bCheck) + O.bEnableCombineText = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Disable partner text'], + checked = O.bDisabledPartnerText, + onCheck = function(bCheck) + O.bDisabledPartnerText = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = g_tStrings.STR_QUESTTRACE_CHANGE_ALPHA, color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, text = '', + range = {1, 255}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nMaxAlpha, + onChange = function(nVal) + O.nMaxAlpha = nVal + end, + autoEnable = IsEnabled, + }) + + nX = nX + 180 + ui:Append('Text', { x = nX, y = nY, text = _L['Hold time'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, textFormatter = function(val) return val .. _L['ms'] end, + range = {700, 2500}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nTime * COMBAT_TEXT_TOTAL, + onChange = function(nVal) + O.nTime = nVal / COMBAT_TEXT_TOTAL + end, + autoEnable = IsEnabled, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Fade in time'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, textFormatter = function(val) return val .. _L['frame'] end, + range = {0, 15}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nFadeIn, + onChange = function(nVal) + O.nFadeIn = nVal + end, + autoEnable = IsEnabled, + }) + + nX = nX + 180 + ui:Append('Text', { x = nX, y = nY, text = _L['Fade out time'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, textFormatter = function(val) return val .. _L['frame'] end, + rang = {0, 15}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nFadeOut, + onChange = function(nVal) + O.nFadeOut = nVal + end, + autoEnable = IsEnabled, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Font size'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, textFormatter = function(val) return (val / 100) .. _L['times'] end, + range = {50, 200}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.fScale * 100, + onChange = function(nVal) + O.fScale = nVal / 100 + D.UpdateTrajectoryCount() + end, + autoEnable = IsEnabled, + }) + nX = nX + 180 + + ui:Append('Text', { + x = nX, y = nY, + text = _L['Max count'], + tip = { + render = _L['Max same time combat text count limit'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + color = { 255, 255, 200 }, + autoEnable = IsEnabled, + }) + nX = nX + 70 + ui:Append('WndSlider', { + x = nX, y = nY, text = '', + textFormatter = function(val) + return val == 0 + and _L['Limitless'] + or _L('Limit to %d', val) + end, + range = {0, 500}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nMaxCount, + onChange = function(nVal) + O.nMaxCount = nVal + end, + autoEnable = IsEnabled, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Critical style'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 70 + + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, text = _L['Hit feel'], + group = 'style', + checked = O.nStyle == 0, + onCheck = function() + O.nStyle = 0 + COMBAT_TEXT_SCALE.CRITICAL = COMBAT_TEXT_STYLES[0] + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, text = _L['Low hit feel'], + group = 'style', + checked = O.nStyle == 1, + onCheck = function() + O.nStyle = 1 + COMBAT_TEXT_SCALE.CRITICAL = COMBAT_TEXT_STYLES[1] + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, text = _L['Soft'], + group = 'style', + checked = O.nStyle == 2, + onCheck = function() + O.nStyle = 2 + COMBAT_TEXT_SCALE.CRITICAL = COMBAT_TEXT_STYLES[2] + end, + autoEnable = IsEnabled, + }):Width() + 5 + + ui:Append('WndRadioBox', { + x = nX, y = nY, text = _L['Scale only'], + group = 'style', + checked = O.nStyle == 3, + onCheck = function() + O.nStyle = 3 + COMBAT_TEXT_SCALE.CRITICAL = COMBAT_TEXT_STYLES[3] + end, + autoEnable = IsEnabled, + }) + nX = nX + 90 + nY = nY + nDeltaY + + nX = nPaddingX + nY = nY + nChapterPaddingTop + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L['Text style'], font = 27, autoEnable = IsEnabled }):Width() + 5 + nX = nX + ui:Append('Text', { + x = nX, y = nY, + text = _L['Tips: $name means caster\'s name, $sn means skill name, $crit means critical, $val means value.'], + color = { 196, 196, 196 }, + autoEnable = IsEnabled, + }):Width() + 5 + nY = nY + nDeltaY + nChapterPaddingBottom + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Skill style'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 110 + ui:Append('WndEditBox', { + x = nX, y = nY, w = 250, h = 25, text = O.szSkill, limit = 30, + onChange = function(szText) + O.szSkill = szText + end, + autoEnable = IsEnabled, + }) + nX = nX + 250 + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Damage style'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 110 + ui:Append('WndEditBox', { + x = nX, y = nY, w = 250, h = 25, text = O.szDamage, limit = 30, + onChange = function(szText) + O.szDamage = szText + end, + autoEnable = IsEnabled, + }) + nX = nX + 250 + nY = nY + nDeltaY + + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Therapy style'], color = { 255, 255, 200 }, autoEnable = IsEnabled }) + nX = nX + 110 + ui:Append('WndEditBox', { + x = nX, y = nY, w = 250, h = 25, text = O.szTherapy, limit = 30, + onChange = function(szText) + O.szTherapy = szText + end, + autoEnable = IsEnabled, + }) + nX = nX + 250 + nY = nY + nDeltaY + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['$name not me'], checked = O.bCasterNotI, + onCheck = function(bCheck) + O.bCasterNotI = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['$sn shorten(2)'], checked = O.bSnShorten2, + onCheck = function(bCheck) + O.bSnShorten2 = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Simplify value'], checked = O.bSimplifyValue, + onCheck = function(bCheck) + O.bSimplifyValue = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Therapy effective only'], checked = O.bTherapyEffectiveOnly, + onCheck = function(bCheck) + O.bTherapyEffectiveOnly = bCheck + end, + autoEnable = IsEnabled, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, h = 24, + text = _L['Font edit'], + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + O.nFont = nFont + end) + end, + tip = { + render = function() return _L('Current font: %d', O.nFont) end, + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = IsEnabled, + }):Width() + 5 + nY = nY + nDeltaY + + nX = nPaddingX + nY = nY + nChapterPaddingTop + nX = nX + ui:Append('Text', { x = nX, y = nY, h = 24, text = _L['Color edit'], font = 27, autoEnable = IsEnabled }):Width() + 10 + nX = nX + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY + 2, h = 24, + text = _L['Distinct critical color'], + checked = O.bCritical, + onCheck = function(bCheck) + O.bCritical = bCheck + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_CombatText', true) + end, + autoEnable = IsEnabled, + }):Width() + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, w = 'auto', h = 24, + text = _L['Reset color'], + buttonStyle = 'FLAT', + onClick = function() + O('reset', { 'tColor', 'tCriticalColor' }) + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_CombatText', true) + end, + autoEnable = IsEnabled, + }):Width() + 10 + nY = nY + nDeltaY + nChapterPaddingBottom + + nX = nPaddingX + 20 + for _, eType in ipairs({ + COMBAT_TEXT_TYPE.DAMAGE , + COMBAT_TEXT_TYPE.THERAPY , + COMBAT_TEXT_TYPE.EFFECTIVE_THERAPY , + COMBAT_TEXT_TYPE.STEAL_LIFE , + COMBAT_TEXT_TYPE.PHYSICS_DAMAGE , + COMBAT_TEXT_TYPE.SOLAR_MAGIC_DAMAGE , + COMBAT_TEXT_TYPE.NEUTRAL_MAGIC_DAMAGE , + COMBAT_TEXT_TYPE.LUNAR_MAGIC_DAMAGE , + COMBAT_TEXT_TYPE.POISON_DAMAGE , + COMBAT_TEXT_TYPE.REFLECTED_DAMAGE , + }) do + if nX > nW - 100 then + nX = nPaddingX + 20 + nY = nY + 25 + end + local uiCritical + ui:Append('Shadow', { + x = nX, y = nY, color = D.GetColor(eType, false), w = 15, h = 15, + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + O.tColor[eType] = { r, g, b } + O.tColor = O.tColor + if uiCritical then + uiCritical:Color(D.GetColor(eType, true)) + end + X.UI(this):Color(r, g, b) + end) + end, + autoEnable = IsEnabled, + }) + nX = nX + 20 + if O.bCritical then + uiCritical = ui:Append('Shadow', { + x = nX, y = nY, color = D.GetColor(eType, true), w = 15, h = 15, + tip = { + render = _L['Critical color'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + O.tCriticalColor[eType] = { r, g, b } + O.tCriticalColor = O.tCriticalColor + X.UI(this):Color(r, g, b) + end) + end, + autoEnable = IsEnabled, + }) + nX = nX + 20 + end + nX = nX + math.max(ui:Append('Text', { + x = nX, y = nY, h = 15, + text = COMBAT_TEXT_TYPE_NAME[eType], + autoEnable = IsEnabled, + }):Width() + 10, 100) + end + nY = nY + 30 + + nX = nPaddingX + 20 + for _, eType in ipairs({ + COMBAT_TEXT_TYPE.SPIRIT , + COMBAT_TEXT_TYPE.STAYING_POWER , + COMBAT_TEXT_TYPE.SHIELD_DAMAGE , + COMBAT_TEXT_TYPE.ABSORB_DAMAGE , + COMBAT_TEXT_TYPE.PARRY_DAMAGE , + COMBAT_TEXT_TYPE.INSIGHT_DAMAGE , + COMBAT_TEXT_TYPE.SKILL_DODGE , + COMBAT_TEXT_TYPE.SKILL_BUFF , + COMBAT_TEXT_TYPE.SKILL_DEBUFF , + COMBAT_TEXT_TYPE.BUFF_IMMUNITY , + COMBAT_TEXT_TYPE.SKILL_MISS , + COMBAT_TEXT_TYPE.EXP , + COMBAT_TEXT_TYPE.MSG , + COMBAT_TEXT_TYPE.CRITICAL_MSG , + }) do + if nX > nW - 100 then + nX = nPaddingX + 20 + nY = nY + 25 + end + ui:Append('Shadow', { + x = nX, y = nY, color = D.GetColor(eType, false), w = 15, h = 15, + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + O.tColor[eType] = { r, g, b } + O.tColor = O.tColor + X.UI(this):Color(r, g, b) + end) + end, + autoEnable = IsEnabled, + }) + nX = nX + 20 + nX = nX + math.max(ui:Append('Text', { + x = nX, y = nY, h = 15, + text = COMBAT_TEXT_TYPE_NAME[eType], + autoEnable = IsEnabled, + }):Width() + 10, 100) + end + nY = nY + 30 + + ui:Append('WndWindow', { x = nX, y = nY + 10, w = nW, h = 0 }) -- 剑三的滚动有问题,必须使用一个 Wnd 才能触发滚动。。 + + if IsFileExist(COMBAT_TEXT_CONFIG) then + ui:Append('WndButton', { + x = nW - 130 - nPaddingX, y = 15, h = 40, + text = _L['Reload combat text config'], + buttonStyle = 'SKEUOMORPHISM_LACE_BORDER', + onClick = D.CheckEnable, + }) + end +end +X.Panel.Register(_L['System'], 'MY_CombatText', _L['MY_CombatText'], 2041, PS) + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +local function OnLoadingEnding() + local me = X.GetControlPlayer() + if not me then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('CombatText get player id failed!!! try again', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + X.DelayCall(1000, OnLoadingEnding) + return + end + COMBAT_TEXT_PLAYERID = me.dwID + --[[#DEBUG BEGIN]] + -- X.OutputDebugMessage('CombatText get player id ' .. me.dwID, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + COMBAT_TEXT_IN_ROGUELIKE_MAP = X.IsInRoguelikeMap() +end +X.RegisterUserSettingsInit('MY_CombatText', function() + D.bReady = true + D.UpdateTrajectoryCount() + D.CheckEnable() +end) +X.RegisterEvent('LOADING_ENDING', 'MY_CombatText', OnLoadingEnding) -- 很重要的优化 +X.RegisterEvent('ON_NEW_PROXY_SKILL_LIST_NOTIFY', 'MY_CombatText', OnLoadingEnding) -- 长歌控制主体ID切换 +X.RegisterEvent('ON_CLEAR_PROXY_SKILL_LIST_NOTIFY', 'MY_CombatText', OnLoadingEnding) -- 长歌控制主体ID切换 +X.RegisterEvent('ON_PVP_SHOW_SELECT_PLAYER', 'MY_CombatText', function() + COMBAT_TEXT_PLAYERID = arg0 +end) +X.RegisterEvent('FIRST_LOADING_END', 'MY_CombatText', D.CheckEnable) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_CombatText/ui/MY_CombatText.ini b/MY_CombatText/ui/MY_CombatText.ini new file mode 100644 index 000000000..84007b2d0 --- /dev/null +++ b/MY_CombatText/ui/MY_CombatText.ini @@ -0,0 +1,53 @@ +[MY_CombatText] +._WndType=WndFrame +._Parent=Lowest +Left=0 +Top=0 +Width=0 +Height=0 +MinWidth=0 +MinHeight=0 +MaxWidth=0 +MaxHeight=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +MousePenetrable=1 +DisableBringToTop=1 +RenderSampling=1 + +[Handle_CombatText] +._WndType=Handle +._Parent=MY_CombatText +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Shadow_Content] +._WndType=Shadow +._Parent=Handle_CombatText +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=0 + +[Shadow_Content_2] +._WndType=Shadow +._Parent=Handle_CombatText +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=0 + + diff --git a/MY_CombatText/ui/MY_CombatText_Render.ini b/MY_CombatText/ui/MY_CombatText_Render.ini new file mode 100644 index 000000000..c20142654 --- /dev/null +++ b/MY_CombatText/ui/MY_CombatText_Render.ini @@ -0,0 +1,53 @@ +[MY_CombatText] +._WndType=WndFrame +._Parent=Lowest +Left=0 +Top=0 +Width=0 +Height=0 +MinWidth=0 +MinHeight=0 +MaxWidth=0 +MaxHeight=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +MousePenetrable=1 +DisableBringToTop=1 +RenderSampling=1 +DisableBreath=1 +RenderEvent=1 + +[Handle_CombatText] +._WndType=Handle +._Parent=MY_CombatText +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Shadow_Content] +._WndType=Shadow +._Parent=Handle_CombatText +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=0 + +[Shadow_Content_2] +._WndType=Shadow +._Parent=Handle_CombatText +Left=0 +Top=0 +PosType=0 +ShadowColor= +Alpha=0 diff --git a/MY_Farbnamen/info.ini b/MY_Farbnamen/info.ini new file mode 100644 index 000000000..992059207 --- /dev/null +++ b/MY_Farbnamen/info.ini @@ -0,0 +1,8 @@ +[MY_Farbnamen] +name=门派染色 +desc=聊天栏玩家门派染色和基本信息显示 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Farbnamen.lua +package=MY diff --git a/MY_Farbnamen/info.ini.zh_TW b/MY_Farbnamen/info.ini.zh_TW new file mode 100644 index 000000000..dff49b641 --- /dev/null +++ b/MY_Farbnamen/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_Farbnamen] +name=闁娲炬煋鑹 +desc=鑱婂ぉ娆勭帺瀹堕杸娲炬煋鑹插拰鍩烘湰淇℃伅椤ず +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Farbnamen.lua +package=MY diff --git a/MY_Farbnamen/lang/zhcn.jx3dat b/MY_Farbnamen/lang/zhcn.jx3dat new file mode 100644 index 000000000..f13e56568 --- /dev/null +++ b/MY_Farbnamen/lang/zhcn.jx3dat @@ -0,0 +1,69 @@ +return { + ['MY_Farbnamen'] = '门派染色', + ['Enable MY_Farbnamen'] = '启用门派染色', + ['Save talker information to database'] = '缓存门派染色数据到本地磁盘', + ['Insert force icon'] = '显示门派图标', + ['Icon size'] = '图标大小', + ['Icon size: %dpx'] = '图标大小:%dpx', + ['Are you sure to reset farbnamen data? All character\'s data cache will be removed.'] = '确定要清空门派染色本地缓存数据吗?\n缓存数据记录着您曾经遇见过的所有侠士的门派、等级和帮会等基本信息,清空后聊天栏短时间内染色可能不全。(原因是未曾有过一面之缘的侠士本地无法从缓存中获得基础信息,也就无法染色)', + ['Reset data'] = '重置数据', + ['Import data'] = '导入数据', + ['Please select your farbnamen database file.'] = '请选择你要导入的门派染色数据文件:', + ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '接下来如有客户端失去响应、角色掉线,请耐心等待,勿随意结束客户端,否则您的数据库可能造成不可逆的数据损坏,点击确认开始操作。', + ['%d chars imported, %d chars skipped, %d tongs imported, %d tongs skipped!'] = '成功导入%d条角色数据、跳过%d条角色数据,导入%d条帮会数据、跳过%d条帮会数据。', + ['Export data'] = '导出数据', + ['Copy .db file to share.'] = '复制该.db文件即可完成染色数据导出。', + ['Cache data deleted.'] = '缓存已清除。', + ['Save to database'] = '缓存到本地磁盘', + ['This feature has been disabled on HDD disk machine for performance issues.'] = '检测到游戏所在磁盘为机械硬盘,由于磁盘吞吐量限制,该功能无法正常启用,请将游戏移动到固态硬盘后再尝试开启。', + ['Show analysis'] = '显示统计', + ['[Teammate]'] = '〔队友〕', + ['Load default setting'] = '恢复默认设置', + ['Player RemoteID: %d'] = '玩家跨服ID:%d', + ['Player ID: %d'] = '玩家ID:%d', + ['Player GUID: %s'] = '玩家唯一ID:%s', + ['Cannot connect to database!!!'] = '无法连接到角色数据库!', + ['Retry time: %d'] = '第%d次重试连接……', + ['Unknown force'] = '未知门派', + ['Unknown gender'] = '未知体型', + ['Unknown camp'] = '未知阵营', + ['Met stat: never met'] = '偶遇统计:尚未偶遇', + ['Met count: %s'] = '偶遇次数:%s次', + ['Last met time: %s'] = '最后偶遇时间:%s', + ['Last met map: %s'] = '最后偶遇地点:%s', + ['Copy debug information'] = '复制角色调试信息', + + ['Ancient database detected, do you want to migrate data from it?'] = '发现旧版染色数据,是否立即转换数据?', + ['Migrate succeed!'] = '染色数据迁移成功!', + + ['MY_Farbnamen__Analysis'] = '茗伊插件集·角色统计', + ['All server total player count: %d'] = '所有服务器角色总数量:%d个', + ['All server total tong count: %d'] = '所有服务器帮会总数量:%d个', + ['Current server total player count: %d'] = '当前服务器角色总数量:%d个', + ['Current server total tong count: %d'] = '当前服务器帮会总数量:%d个', + ['Total'] = '汇总', + ['By Camp'] = '按阵营', + ['By Force'] = '按门派', + ['By Server'] = '按服务器', + ['By Tong'] = '按帮会', + ['By Met Count'] = '按偶遇', + ['Unknown(%d)'] = '未知(%d)', + ['%d players'] = '%d人', + ['Camp'] = '阵营', + ['Server'] = '服务器', + ['Tong'] = '帮会', + ['Summary'] = '总计', + ['Player Count'] = '角色数量', + ['Force'] = '门派', + ['Name'] = '角色名', + ['Met Count'] = '偶遇次数', + ['%d times'] = '%d次', + ['---------------------------------------------'] = '———————————————————————————', + ['Counts based on local cache, only players you met will be analyzed.'] = '统计基于本地缓存,即只有你遇到过的角色才能参与统计。', + ['Show analysis of %d hours'] = '统计最近%d小时', + ['last %d hours'] = '最近%d小时', + ['Show analysis of last week'] = '统计最近一周', + ['last week'] = '最近一周', + ['Show analysis of last %d days'] = '统计最近%d天', + ['last %d days'] = '最近%d天', +} diff --git a/MY_Farbnamen/lang/zhtw.jx3dat b/MY_Farbnamen/lang/zhtw.jx3dat new file mode 100644 index 000000000..5e716570a --- /dev/null +++ b/MY_Farbnamen/lang/zhtw.jx3dat @@ -0,0 +1,69 @@ +return { + ['MY_Farbnamen'] = '闁娲炬煋鑹', + ['Enable MY_Farbnamen'] = '鍟熺敤闁娲炬煋鑹', + ['Save talker information to database'] = '绶╁瓨闁娲炬煋鑹叉暩鎿氬埌鏈湴纾佺', + ['Insert force icon'] = '椤ず闁娲惧湒妯', + ['Icon size'] = '鍦栨澶у皬', + ['Icon size: %dpx'] = '鍦栨澶у皬锛%dpx', + ['Are you sure to reset farbnamen data? All character\'s data cache will be removed.'] = '纰哄畾瑕佹竻绌洪杸娲炬煋鑹叉湰鍦扮珐瀛樻暩鎿氬棊锛焅n绶╁瓨鏁告摎瑷橀寗钁楁偍鏇剧稉閬囪閬庣殑鎵鏈変繝澹殑闁娲俱佺瓑绱氬拰骞渻绛夊熀鏈俊鎭紝娓呯┖寰岃亰澶╂瑒鐭檪闁撳収鏌撹壊鍙兘涓嶅叏銆傦紙鍘熷洜鏄湭鏇炬湁閬庝竴闈箣绶g殑淇犲+鏈湴鐒℃硶寰炵珐瀛樹腑鐛插緱鍩虹淇℃伅锛屼篃灏辩劇娉曟煋鑹诧級', + ['Reset data'] = '閲嶇疆鏁告摎', + ['Import data'] = '灏庡叆鏁告摎', + ['Please select your farbnamen database file.'] = '璜嬮伕鎿囦綘瑕佸皫鍏ョ殑闁娲炬煋鑹叉暩鎿氭枃浠讹細', + ['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'] = '鎺ヤ笅渚嗗鏈夊鎴剁澶卞幓闊挎噳銆佽鑹叉帀绶氾紝璜嬭愬績绛夊緟锛屽嬁闅ㄦ剰绲愭潫瀹㈡埗绔紝鍚﹀墖鎮ㄧ殑璩囨枡搴彲鑳介犳垚涓嶅彲閫嗙殑鏁告摎鎼嶅锛岄粸鎿婄⒑瑾嶉枊濮嬫搷浣溿', + ['%d chars imported, %d chars skipped, %d tongs imported, %d tongs skipped!'] = '鎴愬姛灏庡叆%d姊濊鑹叉暩鎿氥佽烦閬%d姊濊鑹叉暩鎿氾紝灏庡叆%d姊濆公鏈冩暩鎿氥佽烦閬%d姊濆公鏈冩暩鎿氥', + ['Export data'] = '灏庡嚭鏁告摎', + ['Copy .db file to share.'] = '瑜囪=瑭.db鏂囦欢鍗冲彲瀹屾垚鏌撹壊鏁告摎灏庡嚭銆', + ['Cache data deleted.'] = '绶╁瓨宸叉竻闄ゃ', + ['Save to database'] = '绶╁瓨鍒版湰鍦扮纰', + ['This feature has been disabled on HDD disk machine for performance issues.'] = '妾㈡脯鍒版父鎴叉墍鍦ㄧ纰熺偤姗熸纭锛岀敱鏂肩纰熷悶鍚愰噺闄愬埗锛岃┎鍔熻兘鐒℃硶姝e父鍟熺敤锛岃珛灏囨父鎴茬Щ鍕曞埌鍥烘厠纭寰屽啀鍢楄│闁嬪暉銆', + ['Show analysis'] = '椤ず绲辫▓', + ['[Teammate]'] = '銆旈殜鍙嬨', + ['Load default setting'] = '鎭㈠京榛樿獚瑷疆', + ['Player RemoteID: %d'] = '鐜╁璺ㄦ湇ID锛%d', + ['Player ID: %d'] = '鐜╁ID锛%d', + ['Player GUID: %s'] = '鐜╁鍞竴ID锛%s', + ['Cannot connect to database!!!'] = '鐒℃硶閫f帴鍒拌鑹茶硣鏂欏韩锛', + ['Retry time: %d'] = '绗%d娆¢噸瑭﹂f帴鈥︹', + ['Unknown force'] = '鏈煡闁娲', + ['Unknown gender'] = '鏈煡楂斿瀷', + ['Unknown camp'] = '鏈煡闄g嚐', + ['Met stat: never met'] = '鍋堕亣绲辫▓锛氬皻鏈伓閬', + ['Met count: %s'] = '鍋堕亣娆℃暩锛%s娆', + ['Last met time: %s'] = '鏈寰屽伓閬囨檪闁擄細%s', + ['Last met map: %s'] = '鏈寰屽伓閬囧湴榛烇細%s', + ['Copy debug information'] = '瑜囪=瑙掕壊瑾胯│淇℃伅', + + ['Ancient database detected, do you want to migrate data from it?'] = '鐧肩従鑸婄増鏌撹壊鏁告摎锛屾槸鍚︾珛鍗宠綁鎻涙暩鎿氾紵', + ['Migrate succeed!'] = '鏌撹壊鏁告摎閬风Щ鎴愬姛锛', + + ['MY_Farbnamen__Analysis'] = '鑼椾紛鎻掍欢闆喡疯鑹茬当瑷', + ['All server total player count: %d'] = '鎵鏈変己鏈嶅櫒瑙掕壊绺芥暩閲忥細%d鍊', + ['All server total tong count: %d'] = '鎵鏈変己鏈嶅櫒骞渻绺芥暩閲忥細%d鍊', + ['Current server total player count: %d'] = '鐣跺墠浼烘湇鍣ㄨ鑹茬附鏁搁噺锛%d鍊', + ['Current server total tong count: %d'] = '鐣跺墠浼烘湇鍣ㄥ公鏈冪附鏁搁噺锛%d鍊', + ['Total'] = '褰欑附', + ['By Camp'] = '鎸夐櫍鐕', + ['By Force'] = '鎸夐杸娲', + ['By Server'] = '鎸変己鏈嶅櫒', + ['By Tong'] = '鎸夊公鏈', + ['By Met Count'] = '鎸夊伓閬', + ['Unknown(%d)'] = '鏈煡(%d)', + ['%d players'] = '%d浜', + ['Camp'] = '闄g嚐', + ['Server'] = '浼烘湇鍣', + ['Tong'] = '骞渻', + ['Summary'] = '绺借▓', + ['Player Count'] = '瑙掕壊鏁搁噺', + ['Force'] = '闁娲', + ['Name'] = '瑙掕壊鍚', + ['Met Count'] = '鍋堕亣娆℃暩', + ['%d times'] = '%d娆', + ['---------------------------------------------'] = '鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺', + ['Counts based on local cache, only players you met will be analyzed.'] = '绲辫▓鍩烘柤鏈湴绶╁瓨锛屽嵆鍙湁浣犻亣鍒伴亷鐨勮鑹叉墠鑳藉弮鑸囩当瑷堛', + ['Show analysis of %d hours'] = '绲辫▓鏈杩%d灏忔檪', + ['last %d hours'] = '鏈杩%d灏忔檪', + ['Show analysis of last week'] = '绲辫▓鏈杩戜竴鍛', + ['last week'] = '鏈杩戜竴鍛', + ['Show analysis of last %d days'] = '绲辫▓鏈杩%d澶', + ['last %d days'] = '鏈杩%d澶', +} diff --git a/MY_Farbnamen/src/MY_Farbnamen.lua b/MY_Farbnamen/src/MY_Farbnamen.lua new file mode 100644 index 000000000..543372080 --- /dev/null +++ b/MY_Farbnamen/src/MY_Farbnamen.lua @@ -0,0 +1,1683 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 聊天窗口名称染色插件 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Farbnamen/MY_Farbnamen' +local PLUGIN_NAME = 'MY_Farbnamen' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Farbnamen' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_Farbnamen.BanHDD', { ['*'] = true, intl = false }) + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +-- 设置和数据 +-------------------------------------------------------------------------------- +X.CreateDataRoot(X.PATH_TYPE.GLOBAL) + +local O = X.CreateUserSettingsModule('MY_Farbnamen', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Farbnamen'], + szDescription = X.MakeCaption({ + _L['Enable MY_Farbnamen'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Farbnamen'], + szDescription = X.MakeCaption({ + _L['Save talker information to database'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_CLASSIC, + }, + bInsertIcon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Farbnamen'], + szDescription = X.MakeCaption({ + _L['Insert force icon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nInsertIconSize = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Farbnamen'], + szDescription = X.MakeCaption({ + _L['Icon size'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 20, + }, +}) +local D = { + bSaveDB = false, + tForceString = X.Clone(g_tStrings.tForceTitle), + tRoleType = { + [ROLE_TYPE.STANDARD_MALE ] = _L['Man'], + [ROLE_TYPE.STANDARD_FEMALE] = _L['Woman'], + [ROLE_TYPE.LITTLE_BOY ] = _L['Boy'], + [ROLE_TYPE.LITTLE_GIRL ] = _L['Girl'], + }, + tCampString = X.Clone(g_tStrings.STR_GUILD_CAMP_NAME), + aPlayerQueu = {}, +} +local NAME_ID_HEADER_XML = {} +local GUID_HEADER_XML = {} +local DB_ERR_COUNT, DB_MAX_ERR_COUNT = 0, 5 +local DB, DBP_W, DBP_RI, DBP_RN, DBP_RGI, DBT_W, DBT_RI + +local function InitDB() + if not D.bSaveDB then + return false + end + if DB then + return true + end + if DB_ERR_COUNT > DB_MAX_ERR_COUNT then + return false + end + CPath.MakeDir(X.FormatPath({'cache/farbnamen/', X.PATH_TYPE.GLOBAL})) + DB = X.SQLiteConnect(_L['MY_Farbnamen'], {'cache/farbnamen/farbnamen.v7.db', X.PATH_TYPE.GLOBAL}) + if not DB then + local szMsg = _L['Cannot connect to database!!!'] + if DB_ERR_COUNT > 0 then + szMsg = szMsg .. _L(' Retry time: %d', DB_ERR_COUNT) + end + DB_ERR_COUNT = DB_ERR_COUNT + 1 + X.OutputSystemMessage(_L['MY_Farbnamen'], szMsg, X.CONSTANT.MSG_THEME.ERROR) + return false + end + X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS Info ( + key NVARCHAR(128) NOT NULL, + value NVARCHAR(4096) NOT NULL, + PRIMARY KEY (key) + ) + ]]) + X.SQLiteExecute(DB, [[INSERT INTO Info (key, value) VALUES ('version', '7')]]) + X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS PlayerInfo ( + server NVARCHAR(10) NOT NULL, + id INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + guid NVARCHAR(20) NOT NULL, + force INTEGER NOT NULL, + role INTEGER NOT NULL, + level INTEGER NOT NULL, + title NVARCHAR(20) NOT NULL, + camp INTEGER NOT NULL, + tong INTEGER NOT NULL, + time INTEGER NOT NULL, + times INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY (server, id) + ) + ]]) + X.SQLiteExecute(DB, 'CREATE UNIQUE INDEX IF NOT EXISTS player_info_server_name_u_idx ON PlayerInfo(server, name)') + X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS player_info_guid_idx ON PlayerInfo(guid)') + local szSelectPlayerInfo = [[ + SELECT + server as szServerName, + id as dwID, + name as szName, + guid as szGlobalID, + force as dwForceID, + role as nRoleType, + level as nLevel, + title as szTitle, + camp as nCamp, + tong as dwTongID, + time as dwTime, + times as nTimes, + extra as szExtra + FROM PlayerInfo + ]] + DBP_W = X.SQLitePrepare(DB, 'REPLACE INTO PlayerInfo (server, id, name, guid, force, role, level, title, camp, tong, time, times, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)') + DBP_RI = X.SQLitePrepare(DB, szSelectPlayerInfo .. ' WHERE server = ? AND id = ?') + DBP_RN = X.SQLitePrepare(DB, szSelectPlayerInfo .. ' WHERE server = ? AND name = ?') + DBP_RGI = X.SQLitePrepare(DB, szSelectPlayerInfo .. ' WHERE guid = ? ORDER BY time DESC') + X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS TongInfo ( + server NVARCHAR(10) NOT NULL, + id INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + time INTEGER NOT NULL, + times INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(server, id) + ) + ]]) + local szSelectTongInfo = [[ + SELECT + id as dwID, + name as szName, + time as dwTime, + times as nTimes, + extra as szExtra + FROM TongInfo + ]] + DBT_W = X.SQLitePrepare(DB, 'REPLACE INTO TongInfo (server, id, name, time, times, extra) VALUES (?, ?, ?, ?, ?, ?)') + DBT_RI = X.SQLitePrepare(DB, szSelectTongInfo .. ' WHERE server = ? AND id = ?') + + -- 旧版文件缓存转换 + local SZ_IC_PATH = X.FormatPath({'cache/PLAYER_INFO/{$server_origin}/', X.PATH_TYPE.DATA}) + if IsLocalFileExist(SZ_IC_PATH) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen info cache trans from file to sqlite start!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local szServer = X.GetServerOriginName() + X.SQLiteBeginTransaction(DB) + for i = 0, 999 do + local data = X.LoadLUAData({'cache/PLAYER_INFO/{$server_origin}/DAT2/' .. i .. '.{$lang}.jx3dat', X.PATH_TYPE.DATA}) + if data then + for id, p in pairs(data) do + X.SQLitePrepareExecuteANSI(DBP_W, szServer, p[1], p[2], '', p[3], p[4], p[5], p[6], p[7], p[8], 0, 0, '') + end + end + end + X.SQLiteEndTransaction(DB) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen info cache trans from file to sqlite finished!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen tong cache trans from file to sqlite start!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.SQLiteBeginTransaction(DB) + for i = 0, 128 do + for j = 0, 128 do + local data = X.LoadLUAData({'cache/PLAYER_INFO/{$server_origin}/TONG/' .. i .. '-' .. j .. '.{$lang}.jx3dat', X.PATH_TYPE.DATA}) + if data then + for id, name in pairs(data) do + X.SQLitePrepareExecuteANSI(DBT_W, szServer, id, name, 0, 0, '') + end + end + end + end + X.SQLiteEndTransaction(DB) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen tong cache trans from file to sqlite finished!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen cleaning file cache start: ' .. SZ_IC_PATH, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + CPath.DelDir(SZ_IC_PATH) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Farbnamen', 'Farbnamen cleaning file cache finished!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + return true +end + +function D.Import(aFilePath, bTimes) + if X.IsString(aFilePath) then + aFilePath = {aFilePath} + end + local nImportChar, nSkipChar, nImportTong, nSkipTong = 0, 0, 0, 0 + for _, szFilePath in ipairs(aFilePath) do + local db = SQLite3_Open(szFilePath) + if db then + local nVersion = X.Get(X.SQLiteGetAll(db, [[SELECT value FROM Info WHERE key = 'version']]), {1, 'value'}, nil) + if nVersion then + nVersion = tonumber(nVersion) + else + local szSQL = X.Get(X.SQLiteGetAll(db, [[SELECT sql FROM sqlite_master WHERE type='table' AND name='InfoCache']]), {1, 'sql'}, ''):gsub('[%s]+', ' ') + if szSQL == 'CREATE TABLE InfoCache (id INTEGER PRIMARY KEY, name VARCHAR(20) NOT NULL, force INTEGER, role INTEGER, level INTEGER, title VARCHAR(20), camp INTEGER, tong INTEGER)' then + nVersion = 2 + elseif szSQL == 'CREATE TABLE InfoCache ( id INTEGER NOT NULL, name VARCHAR(20) NOT NULL, force INTEGER NOT NULL, role INTEGER NOT NULL, level INTEGER NOT NULL, title VARCHAR(20) NOT NULL, camp INTEGER NOT NULL, tong INTEGER NOT NULL, extra TEXT NOT NULL, PRIMARY KEY (id) )' then + nVersion = 3 + elseif szSQL == 'CREATE TABLE InfoCache ( id INTEGER NOT NULL, name NVARCHAR(20) NOT NULL, force INTEGER NOT NULL, role INTEGER NOT NULL, level INTEGER NOT NULL, title NVARCHAR(20) NOT NULL, camp INTEGER NOT NULL, tong INTEGER NOT NULL, extra TEXT NOT NULL, PRIMARY KEY (id) )' then + nVersion = 4 + elseif szSQL == 'CREATE TABLE InfoCache ( id INTEGER NOT NULL, name NVARCHAR(20) NOT NULL, guid NVARCHAR(20) NOT NULL, force INTEGER NOT NULL, role INTEGER NOT NULL, level INTEGER NOT NULL, title NVARCHAR(20) NOT NULL, camp INTEGER NOT NULL, tong INTEGER NOT NULL, extra TEXT NOT NULL, PRIMARY KEY (id) )' then + nVersion = 5 + end + end + if not nVersion then + nVersion = 0 + end + if nVersion > 0 and nVersion <= 6 then + local szServer = X.Get(X.SQLiteGetAll(db, [[SELECT value FROM Info WHERE key = 'server']]), {1, 'value'}, nil) + if szServer then + szServer = UTF8ToAnsi(szServer) + end + if nVersion and nVersion < 6 then + szServer = X.GetServerOriginName() + end + if szServer == X.GetServerOriginName() then + local bUTF8 = nVersion > 3 + local ProcessString = bUTF8 + and function(s) return s end + or function(s) return AnsiToUTF8(s) or '' end + X.SQLiteBeginTransaction(DB) + local nCount, nPageSize = X.Get(X.SQLiteGetAll(db, 'SELECT COUNT(*) AS count FROM InfoCache WHERE id IS NOT NULL'), {1, 'count'}, 0), 10000 + for i = 0, nCount / nPageSize do + local aInfoCache = X.SQLiteGetAll(db, 'SELECT * FROM InfoCache WHERE id IS NOT NULL LIMIT ' .. nPageSize .. ' OFFSET ' .. (i * nPageSize)) + if aInfoCache then + for _, rec in ipairs(aInfoCache) do + if rec.id and rec.name then + local data = X.SQLitePrepareGetOne(DBP_RI, rec.id) + local nTime = data and (data.dwTime or 0) or -1 + local nRecTime = rec.time or 0 + if nRecTime > nTime then + X.SQLitePrepareExecute( + DBP_W, + AnsiToUTF8(szServer), + rec.id, + ProcessString(rec.name), + X.IIf( + X.IsGlobalID(rec.guid), + ProcessString(rec.guid), + data and data.szGlobalID or '' + ), + rec.force or -1, + rec.role or -1, + rec.level or -1, + X.IIf( + not X.IsEmpty(rec.title), + ProcessString(rec.title), + data and data.szTitle or '' + ), + rec.camp or -1, + X.IIf( + X.IsPositiveNumber(rec.tong), + rec.tong, + data and data.dwTongID or -1 + ), + nRecTime, + data and data.nTimes or 0, + rec.extra or '' + ) + nImportChar = nImportChar + 1 + else + nSkipChar = nSkipChar + 1 + end + end + end + end + end + local nCount, nPageSize = X.Get(X.SQLiteGetAll(db, 'SELECT COUNT(*) AS count FROM TongCache WHERE id IS NOT NULL'), {1, 'count'}, 0), 10000 + for i = 0, nCount / nPageSize do + local aTongCache = X.SQLiteGetAll(db, 'SELECT * FROM TongCache WHERE id IS NOT NULL LIMIT ' .. nPageSize .. ' OFFSET ' .. (i * nPageSize)) + if aTongCache then + for _, rec in ipairs(aTongCache) do + if rec.id and rec.name then + local data = X.SQLitePrepareGetOne(DBT_RI, rec.id) + local nTime = data and (data.dwTime or 0) or -1 + local nRecTime = rec.time or 0 + if nRecTime > nTime then + X.SQLitePrepareExecute( + DBT_W, + AnsiToUTF8(szServer), + rec.id, + ProcessString(rec.name), + nRecTime, + data and data.nTimes or 0, + rec.extra or '' + ) + nImportTong = nImportTong + 1 + else + nSkipTong = nSkipTong + 1 + end + end + end + end + end + X.SQLiteEndTransaction(DB) + end + elseif nVersion == 7 then + X.SQLiteBeginTransaction(DB) + local nCount, nPageSize = X.Get(X.SQLiteGetAll(db, 'SELECT COUNT(*) AS count FROM PlayerInfo WHERE id IS NOT NULL'), {1, 'count'}, 0), 10000 + for i = 0, nCount / nPageSize do + local aPlayerInfo = X.SQLiteGetAll(db, 'SELECT * FROM PlayerInfo WHERE id IS NOT NULL LIMIT ' .. nPageSize .. ' OFFSET ' .. (i * nPageSize)) + if aPlayerInfo then + for _, rec in ipairs(aPlayerInfo) do + if rec.server and rec.id and rec.name then + local data = X.SQLitePrepareGetOne(DBP_RI, rec.id) + local nTime = data and (data.dwTime or 0) or -1 + local nRecTime = rec.time or 0 + if nRecTime > nTime then + X.SQLitePrepareExecute( + DBP_W, + rec.server, + rec.id, + rec.name, + X.IIf( + X.IsGlobalID(rec.guid), + rec.guid, + data and data.szGlobalID or '' + ), + rec.force or -1, + rec.role or -1, + rec.level or -1, + X.IIf( + not X.IsEmpty(rec.title), + rec.title, + data and data.szTitle or '' + ), + rec.camp or -1, + X.IIf( + X.IsPositiveNumber(rec.tong), + rec.tong, + data and data.dwTongID or -1 + ), + nRecTime, + data and data.nTimes or (bTimes and rec.time or 0), + rec.extra or '' + ) + nImportChar = nImportChar + 1 + else + nSkipChar = nSkipChar + 1 + end + end + end + end + end + local nCount, nPageSize = X.Get(X.SQLiteGetAll(db, 'SELECT COUNT(*) AS count FROM TongInfo WHERE id IS NOT NULL'), {1, 'count'}, 0), 10000 + for i = 0, nCount / nPageSize do + local aTongInfo = X.SQLiteGetAll(db, 'SELECT * FROM TongInfo WHERE id IS NOT NULL LIMIT ' .. nPageSize .. ' OFFSET ' .. (i * nPageSize)) + if aTongInfo then + for _, rec in ipairs(aTongInfo) do + if rec.id and rec.name then + local data = X.SQLitePrepareGetOne(DBT_RI, rec.id) + local nTime = data and (data.dwTime or 0) or -1 + local nRecTime = rec.time or 0 + if nRecTime > nTime then + X.SQLitePrepareExecute( + DBT_W, + rec.server, + rec.id, + rec.name, + nRecTime, + data and data.nTimes or (bTimes and rec.time or 0), + rec.extra or '' + ) + nImportTong = nImportTong + 1 + else + nSkipTong = nSkipTong + 1 + end + end + end + end + end + X.SQLiteEndTransaction(DB) + end + db:Release() + end + end + return nImportChar, nSkipChar, nImportTong, nSkipTong +end + +function D.Migration() + local aFilePath = {} + for _, szFilePath in ipairs({ + X.FormatPath({'cache/player_info.db', X.PATH_TYPE.SERVER}), + X.FormatPath({'cache/player_info.v2.db', X.PATH_TYPE.SERVER}), + X.FormatPath({'cache/farbnamen.v3.db', X.PATH_TYPE.SERVER}), + X.FormatPath({'cache/farbnamen.v4.db', X.PATH_TYPE.SERVER}), + X.FormatPath({'cache/farbnamen.v5.db', X.PATH_TYPE.SERVER}), + X.FormatPath({'cache/farbnamen.v6.db', X.PATH_TYPE.SERVER}), + }) do + if IsLocalFileExist(szFilePath) then + table.insert(aFilePath, szFilePath) + end + end + if X.IsEmpty(aFilePath) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + D.Import(aFilePath, true) + for _, szFilePath in ipairs(aFilePath) do + CPath.Move(szFilePath, szFilePath .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + X.Alert(_L['Migrate succeed!']) + end) +end + +function D.UpdateSaveDB() + local bBan = X.IsRestricted('MY_Farbnamen.BanHDD') and X.GetDiskType() == 'HDD' + D.bSaveDB = not bBan and D.bReady and O.bSaveDB +end + +--------------------------------------------------------------- +-- 聊天复制和时间显示相关 +--------------------------------------------------------------- +function D.RenderXml(szMsg, tOption) + -- text='[就是个阵眼]' font=10 r=255 g=255 b=255 name='namelink_4662931' eventid=515text='说:' font=10 r=255 g=255 b=255 text='[茗伊]' font=10 r=255 g=255 b=255 name='namelink_4662931' eventid=771text='\n' font=10 r=255 g=255 b=255 + local aXMLNode = X.XMLDecode(szMsg) + if aXMLNode then + local i, node, name = 1, nil, nil + while i <= #aXMLNode do + node = aXMLNode[i] + name = X.XMLIsNode(node) and X.XMLGetNodeData(node, 'name') + if name and name:sub(1, 9) == 'namelink_' then + if tOption.bColor or tOption.bInsertIcon then + local szName = string.gsub(X.XMLGetNodeData(node, 'text'), '[%[%]]', '') + local tInfo = D.Get(szName) + if tInfo then + if tOption.bColor then + X.XMLSetNodeData(node, 'r', tInfo.rgb[1]) + X.XMLSetNodeData(node, 'g', tInfo.rgb[2]) + X.XMLSetNodeData(node, 'b', tInfo.rgb[3]) + end + if tOption.bInsertIcon then + local szIcon, nFrame = GetForceImage(tInfo.dwForceID) + if szIcon and nFrame then + local nodeImage = X.XMLCreateNode('image') + X.XMLSetNodeData(nodeImage, 'w', tOption.nInsertIconSize) + X.XMLSetNodeData(nodeImage, 'h', tOption.nInsertIconSize) + X.XMLSetNodeData(nodeImage, 'path', szIcon) + X.XMLSetNodeData(nodeImage, 'frame', nFrame) + table.insert(aXMLNode, i, nodeImage) + i = i + 1 + end + end + end + end + if tOption.bTip then + X.XMLSetNodeData(node, 'eventid', 82803) + X.XMLSetNodeData(node, 'script', (X.XMLGetNodeData(node, 'script') or '') + .. '\nthis.OnItemMouseEnter=function() MY_Farbnamen.ShowTip(this) end' + .. '\nthis.OnItemMouseLeave=function() HideTip() end') + end + end + i = i + 1 + end + szMsg = X.XMLEncode(aXMLNode) + end + -- szMsg = string.gsub( szMsg, '([^<]-)text='([^<]-)'([^<]-name='namelink_%d-'[^<]-)', function (szExtra1, szName, szExtra2) + -- szName = string.gsub(szName, '[%[%]]', '') + -- local tInfo = D.Get(szName) + -- if tInfo then + -- szExtra1 = string.gsub(szExtra1, '[rgb]=%d+', '') + -- szExtra2 = string.gsub(szExtra2, '[rgb]=%d+', '') + -- szExtra1 = string.gsub(szExtra1, 'eventid=%d+', '') + -- szExtra2 = string.gsub(szExtra2, 'eventid=%d+', '') + -- return string.format( + -- '%stext='[%s]'%s eventid=883 script='this.OnItemMouseEnter=function() MY_Farbnamen.ShowTip(this) end\nthis.OnItemMouseLeave=function() HideTip() end' r=%d g=%d b=%d', + -- szExtra1, szName, szExtra2, tInfo.rgb[1], tInfo.rgb[2], tInfo.rgb[3] + -- ) + -- end + -- end) + return szMsg +end + +function D.RenderNameLink(hNameLink, tOption) + local ui, nNumOffset = X.UI(hNameLink), 0 + if tOption.bColor or tOption.bInsertIcon then + local szName = string.gsub(hNameLink:GetText(), '[%[%]]', '') + local tInfo = D.Get(szName) + if tInfo then + if tOption.bColor then + ui:Color(tInfo.rgb) + end + if tOption.bInsertIcon then + local szIcon, nFrame = GetForceImage(tInfo.dwForceID) + if szIcon and nFrame then + hNameLink:GetParent():InsertItemFromString( + hNameLink:GetIndex(), + false, + 'w=' .. tOption.nInsertIconSize .. ' h=' .. tOption.nInsertIconSize + .. ' path="' .. szIcon .. '" frame=' .. nFrame .. '') + nNumOffset = nNumOffset + 1 + end + end + end + end + if tOption.bTip then + ui:Hover(function(bIn) + if bIn then + D.ShowTip() + else + HideTip() + end + end) + end + return hNameLink, nNumOffset +end + +function D.RenderHandle(h, tOption, bIgnoreRange) + local nIndex = not bIgnoreRange and tOption.nStartIndex or 0 + local nEndIndex = not bIgnoreRange and tOption.nEndIndex or (h:GetItemCount() - 1) + while nIndex <= nEndIndex do + local _, nNumOffset = D.RenderEl(h:Lookup(nIndex), tOption, true) + nIndex = nIndex + 1 + nNumOffset + nEndIndex = nEndIndex + nNumOffset + end + return h, 0 +end + +function D.RenderEl(el, tOption, bIgnoreRange) + if el:GetType() == 'Text' then + local name = el:GetName() + if name == 'namelink' or name:sub(1, 9) == 'namelink_' then + return D.RenderNameLink(el, tOption) + end + end + if el:GetType() == 'Handle' then + return D.RenderHandle(el, tOption, bIgnoreRange) + end + return el, 0 +end + +function D.MergeOption(dst, src) + if X.IsTable(src) then + for k, _ in pairs(dst) do + if not X.IsNil(src[k]) then + dst[k] = src[k] + end + end + end + return dst +end + +-- 开放的名称染色接口 +-- (userdata) Render(userdata namelink) 处理namelink染色 namelink是一个姓名Text元素 +-- (string) Render(string szMsg) 格式化szMsg 处理里面的名字 +function D.Render(szMsg, tOption) + tOption = D.MergeOption( + { + bColor = true, + bTip = true, + bInsertIcon = O.bInsertIcon or false, + nInsertIconSize = O.nInsertIconSize or 23, + }, + tOption) + if X.IsString(szMsg) then + szMsg = D.RenderXml(szMsg, tOption) + elseif X.IsElement(szMsg) then + szMsg = D.RenderEl(szMsg, tOption) + end + return szMsg +end + +function D.RegisterNameIDHeader(szName, dwID, szHeaderXml) + if not NAME_ID_HEADER_XML[szName] then + NAME_ID_HEADER_XML[szName] = {} + end + if NAME_ID_HEADER_XML[szName][dwID] then + return X.OutputDebugMessage('ERROR', 'MY_Farbnamen Conflicted Name-ID: ' .. szName .. '(' .. dwID .. ')', X.DEBUG_LEVEL.ERROR) + end + if dwID == '*' then + szName = X.ExtractPlayerInitialName(szName) + end + NAME_ID_HEADER_XML[szName][dwID] = szHeaderXml +end + +function D.RegisterGlobalIDHeader(szGlobalID, szHeaderXml) + if GUID_HEADER_XML[szGlobalID] then + return X.OutputDebugMessage('ERROR', 'MY_Farbnamen Conflicted GUID: ' .. szGlobalID, X.DEBUG_LEVEL.ERROR) + end + GUID_HEADER_XML[szGlobalID] = szHeaderXml +end + +function D.GetTip(szName) + local tInfo = D.Get(szName) + if tInfo then + local tTip = {} + -- author info + if tInfo.dwID and tInfo.szName then + local szHeaderXml = GUID_HEADER_XML[tInfo.szGlobalID] + if not szHeaderXml and NAME_ID_HEADER_XML[tInfo.szName] then + szHeaderXml = NAME_ID_HEADER_XML[tInfo.szName][tInfo.dwID] + end + if not szHeaderXml then + local szInitialName = X.ExtractPlayerInitialName(tInfo.szName) + szHeaderXml = NAME_ID_HEADER_XML[szInitialName] and NAME_ID_HEADER_XML[szInitialName][tInfo.dwID] + end + if szHeaderXml then + table.insert(tTip, szHeaderXml) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + elseif tInfo.dwID ~= X.GetClientPlayerID() then + local szName = X.ExtractPlayerInitialName(tInfo.szName) + local szHeaderXml = NAME_ID_HEADER_XML[szName] and NAME_ID_HEADER_XML[szName]['*'] + if szHeaderXml then + table.insert(tTip, szHeaderXml) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + end + end + end + local szName = tInfo.szName + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + szName = MY_ChatMosaics.MosaicsString(szName) + end + -- 拼音 + if IsCtrlKeyDown() then + local szPinyin = X.Han2TonePinyin(X.ExtractPlayerInitialName(szName), true)[1] + if not X.IsEmpty(szPinyin) then + table.insert(tTip, GetFormatText(szPinyin .. '\n', 136)) + end + end + -- 名称 等级 + table.insert(tTip, GetFormatText(('%s(%d)'):format(szName, tInfo.nLevel), 136)) + -- 是否同队伍 + if X.GetClientPlayerID() ~= tInfo.dwID and X.IsTeammate(tInfo.dwID) then + table.insert(tTip, GetFormatText(_L['[Teammate]'], nil, 0, 255, 0)) + end + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + -- 称号 + if tInfo.szTitle and #tInfo.szTitle > 0 then + table.insert(tTip, GetFormatText('<' .. tInfo.szTitle .. '>', 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + end + -- 帮会 + if tInfo.szTongName and #tInfo.szTongName > 0 then + local szTongName = tInfo.szTongName + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + szTongName = MY_ChatMosaics.MosaicsString(szTongName) + end + table.insert(tTip, GetFormatText('[' .. szTongName .. ']', 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + end + -- 门派 体型 阵营 + table.insert(tTip, GetFormatText( + (D.tForceString[tInfo.dwForceID] or tInfo.dwForceID or _L['Unknown force']) .. _L.SPLIT_DOT .. + (D.tRoleType[tInfo.nRoleType] or tInfo.nRoleType or _L['Unknown gender']) .. _L.SPLIT_DOT .. + (D.tCampString[tInfo.nCamp] or tInfo.nCamp or _L['Unknown camp']), 136 + )) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + -- 偶遇统计 + if IsCtrlKeyDown() then + if X.IsEmpty(tInfo.nMetCount) or X.IsEmpty(tInfo.dwUpdateTime) then + table.insert(tTip, GetFormatText(_L('Met stat: never met'), 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + else + table.insert(tTip, GetFormatText(_L('Met count: %s', tInfo.nMetCount), 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + table.insert(tTip, GetFormatText(_L('Last met time: %s', X.FormatTime(tInfo.dwUpdateTime, '%yyyy/%MM/%dd %hh:%mm:%ss')), 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + if not X.IsEmpty(tInfo.dwMetMapID) then + table.insert(tTip, GetFormatText(_L('Last met map: %s', X.GetMapName(tInfo.dwMetMapID) or tInfo.dwMetMapID or ''), 136)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + end + end + end + -- 随身便笺 + if MY_PlayerRemark and MY_PlayerRemark.Get then + local tPlayer = MY_PlayerRemark.Get(tInfo.szGlobalID) or MY_PlayerRemark.Get(tInfo.dwID) + if tPlayer and tPlayer.szRemark ~= '' then + table.insert(tTip, GetFormatText(tPlayer.szRemark, 0)) + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + end + end + -- 调试信息 + if IsCtrlKeyDown() then + if tInfo.dwRemoteID then + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + table.insert(tTip, GetFormatText(_L('Player RemoteID: %d', tInfo.dwRemoteID), 102)) + end + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + table.insert(tTip, GetFormatText(_L('Player ID: %d', tInfo.dwID or 0), 102)) + if X.IsDebugging() then + table.insert(tTip, X.CONSTANT.XML_LINE_BREAKER) + table.insert(tTip, GetFormatText(_L('Player GUID: %s', tInfo.szGlobalID or 0), 102)) + end + end + -- 组装Tip + return table.concat(tTip) + end +end + +function D.ShowTip(hNameLink) + if type(hNameLink) ~= 'table' then + hNameLink = this + end + if not hNameLink then + return + end + local szName = string.gsub(hNameLink:GetText(), '[%[%]]', '') + local x, y = hNameLink:GetAbsPos() + local w, h = hNameLink:GetSize() + + local szTip = D.GetTip(szName) + if szTip then + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end +end + +--------------------------------------------------------------- +-- 数据存储 +--------------------------------------------------------------- +local PLAYER_INFO = {} -- 读取数据缓存 +local PLAYER_INFO_W = {} -- 修改数据缓存(UTF8) +local TONG_INFO = {} -- 帮会数据缓存 +local TONG_INFO_W = {} -- 帮会修改数据缓存(UTF8) + +function D.Flush() + if not D.bSaveDB or not InitDB() then + return + end + if DBP_W then + X.SQLiteBeginTransaction(DB) + for i, p in pairs(PLAYER_INFO_W) do + X.SQLitePrepareExecute( + DBP_W, + p.szServerName, + p.dwID, + p.szName, + p.szGlobalID, + p.dwForceID, + p.nRoleType, + p.nLevel, + p.szTitle, + p.nCamp, + p.dwTongID, + p.dwTime, + p.nTimes, + X.EncodeLUAData({ + m = p.dwMetMapID, + }) + ) + end + X.SQLiteEndTransaction(DB) + PLAYER_INFO_W = {} + end + if DBT_W then + X.SQLiteBeginTransaction(DB) + for _, p in pairs(TONG_INFO_W) do + X.SQLitePrepareExecute( + DBT_W, + p.szServerName, + p.dwID, + p.szName, + p.dwTime, + p.nTimes, + '' + ) + end + X.SQLiteEndTransaction(DB) + TONG_INFO_W = {} + end +end +X.RegisterFlush('MY_Farbnamen_Save', D.Flush) + +do +local function OnExit() + if not DB then + return + end + DB:Release() +end +X.RegisterExit('MY_Farbnamen_Save', OnExit) +end + +---从数据库与缓存中获取指定角色的信息表 +---@param xKey string | number @角色名、角色ID或角色唯一ID,其中通过ID只能获取当前服务器角色信息或跨服玩家角色信息,通过角色名或角色唯一ID可以获取其他服务器角色信息 +---@return table | nil @获取成功返回信息,否则返回空 +function D.GetPlayerInfo(xKey) + local tPlayer + if X.IsNumber(xKey) then + tPlayer = PLAYER_INFO[xKey] + if not tPlayer and InitDB() then + local szServer = X.GetServerOriginName() + tPlayer = X.SQLitePrepareGetOneANSI( + DBP_RI, + szServer, + xKey + ) + end + elseif X.IsGlobalID(xKey) then + tPlayer = PLAYER_INFO[xKey] + if not tPlayer and InitDB() then + tPlayer = X.SQLitePrepareGetOneANSI( + DBP_RGI, + xKey + ) + end + elseif X.IsString(xKey) then + local szName, szServer = X.DisassemblePlayerGlobalName(xKey, true) + xKey = X.AssemblePlayerGlobalName(szName, szServer) + tPlayer = PLAYER_INFO[xKey] + if not tPlayer and InitDB() then + tPlayer = X.SQLitePrepareGetOneANSI( + DBP_RN, + szServer, + szName + ) + end + end + -- 更新内存缓存 + if tPlayer then + if X.IsEmpty(tPlayer.szExtra) then + tPlayer.dwMetMapID = tPlayer.dwMetMapID or 0 + else + local tExtra = X.DecodeLUAData(tPlayer.szExtra) or {} + tPlayer.dwMetMapID = tExtra.m or 0 + tPlayer.szExtra = nil + end + if tPlayer.dwID and tPlayer.dwID ~= 0 and tPlayer.szServerName == X.GetServerOriginName() then + PLAYER_INFO[tPlayer.dwID] = tPlayer + end + if tPlayer.szName and tPlayer.szServerName then + PLAYER_INFO[X.AssemblePlayerGlobalName(tPlayer.szName, tPlayer.szServerName)] = tPlayer + end + -- 缘起兼容 + if X.IS_CLASSIC then + tPlayer.szGlobalID = '0' + end + if X.IsGlobalID(tPlayer.szGlobalID) then + PLAYER_INFO[tPlayer.szGlobalID] = tPlayer + end + end + return tPlayer +end + +---从数据库与缓存中获取指定帮会的信息表 +---@param szServerName string @所在服务器 +---@param dwTongID number @帮会ID +---@return table | nil @获取成功返回信息,否则返回空 +function D.GetTongInfo(szServerName, dwTongID) + if not szServerName or not dwTongID or dwTongID == 0 then + return + end + local tTong = TONG_INFO[szServerName .. g_tStrings.STR_CONNECT .. dwTongID] + -- 从数据库读取 + if not tTong and InitDB() then + tTong = X.SQLitePrepareGetOneANSI( + DBT_RI, + szServerName, + dwTongID + ) + end + -- 更新内存缓存 + if tTong then + TONG_INFO[szServerName .. g_tStrings.STR_CONNECT .. dwTongID] = tTong + end + return tTong +end + +---记录一个角色信息,提供自动适配跨服、部分信息等情况的逻辑 +---@param szServerName string @要记录的角色所在服务器 +---@param dwID number @要记录的角色ID +---@param szName string @要记录的角色名称 +---@param szGlobalID string @要记录的角色唯一ID +---@param dwForceID number @要记录的角色门派 +---@param nRoleType number @要记录的角色体型 +---@param nLevel number @要记录的角色等级 +---@param szTitle string @要记录的角色称号 +---@param nCamp number @要记录的角色阵营 +---@param dwTongID number @要记录的角色帮会ID +---@param bTimes boolean @是否增加偶遇次数 +function D.RecordPlayerInfo(szServerName, dwID, szName, szGlobalID, dwForceID, nRoleType, nLevel, szTitle, nCamp, dwTongID, bTimes) + -- 自动跨服处理 + do + local szNameExt, szServerNameExt = X.DisassemblePlayerGlobalName(szName, false) + if szServerNameExt then + szServerName = szServerNameExt + szName = szNameExt + elseif not szServerName and dwID ~= 0 and not IsRemotePlayer(dwID) then + szServerName = X.GetServerOriginName() + end + end + -- 更新角色信息缓存 + local tPlayer + if X.IsGlobalID(szGlobalID) then + tPlayer = D.GetPlayerInfo(szGlobalID) + end + if not tPlayer then + tPlayer = szServerName == X.GetServerOriginName() and not IsRemotePlayer(dwID) and D.GetPlayerInfo(dwID) + or (szServerName and D.GetPlayerInfo(X.AssemblePlayerGlobalName(szName, szServerName))) + or {} + end + tPlayer.szServerName = szServerName + tPlayer.dwID = X.IIf(IsRemotePlayer(dwID), tPlayer.dwID, dwID) + tPlayer.dwRemoteID = X.IIf(IsRemotePlayer(dwID), dwID, nil) + tPlayer.szName = szName + tPlayer.szGlobalID = X.IsGlobalID(szGlobalID) and szGlobalID or tPlayer.szGlobalID or '' + tPlayer.dwForceID = dwForceID or tPlayer.dwForceID or -1 + tPlayer.nRoleType = nRoleType or tPlayer.nRoleType or -1 + tPlayer.nLevel = nLevel or tPlayer.nLevel or -1 + tPlayer.szTitle = szTitle or tPlayer.szTitle or '' + tPlayer.nCamp = nCamp or tPlayer.nCamp or -1 + tPlayer.dwTongID = dwTongID or tPlayer.dwTongID or -1 + tPlayer.dwTime = bTimes and GetCurrentTime() or tPlayer.dwTime or 0 + tPlayer.nTimes = (tPlayer.nTimes or 0) + (bTimes and 1 or 0) + tPlayer.dwMetMapID = bTimes and X.GetMapID() or tPlayer.dwMetMapID or 0 + if X.IsGlobalID(tPlayer.szGlobalID) then + PLAYER_INFO[tPlayer.szGlobalID] = tPlayer + end + if tPlayer.dwRemoteID then + PLAYER_INFO[tPlayer.dwRemoteID] = tPlayer + end + if not tPlayer.szServerName then + return + end + if tPlayer.dwID and tPlayer.szServerName == X.GetServerOriginName() then + PLAYER_INFO[tPlayer.dwID] = tPlayer + end + PLAYER_INFO[X.AssemblePlayerGlobalName(tPlayer.szName, tPlayer.szServerName)] = tPlayer + if tPlayer.dwID then + PLAYER_INFO_W[X.AssemblePlayerGlobalName(tPlayer.szName, tPlayer.szServerName)] = X.ConvertToUTF8(tPlayer) + end + -- 更新帮会信息 + if tPlayer.dwID and tPlayer.szServerName == X.GetServerOriginName() then + if dwTongID and dwTongID ~= 0 then + local szTongName = X.GetTongName(dwTongID, 254) + if szTongName and szTongName ~= '' then + D.RecordTongInfo(tPlayer.szServerName, dwTongID, szTongName, bTimes) + end + end + end +end + +---记录一个帮会信息 +---@param szServerName string @要记录的帮会所在服务器 +---@param dwTongID number @要记录的帮会ID +---@param szTongName string @要记录的帮会名称 +---@param bTimes boolean @是否增加偶遇次数 +function D.RecordTongInfo(szServerName, dwTongID, szTongName, bTimes) + local tTong = D.GetTongInfo(szServerName, dwTongID) or {} + tTong.szServerName = szServerName + tTong.dwID = dwTongID + tTong.szName = szTongName + tTong.szExtra = tTong.extra or '' + tTong.dwTime = GetCurrentTime() + tTong.nTimes = (tTong.nTimes or 0) + (bTimes and 1 or 0) + TONG_INFO[szServerName .. g_tStrings.STR_CONNECT .. tTong.dwID] = tTong + TONG_INFO_W[tTong.dwID] = X.ConvertToUTF8(tTong) +end + +-- 保存指定dwID的玩家 +function D.AddAusID(dwID, bTimes) + local player = X.GetPlayer(dwID) + if not player or not player.szName or player.szName == '' then + return false + end + D.RecordPlayerInfo( + nil, + player.dwID, + player.szName, + X.GetPlayerGlobalID(player.dwID), + player.dwForceID, + player.nRoleType, + player.nLevel, + X.IIf(player.nX == 0, nil, player.szTitle), + player.nCamp, + X.IIf(IsRemotePlayer(dwID), nil, player.dwTongID), + bTimes + ) + return true +end + +-------------------------------------------------------------------------------- +-- 公共接口 +-------------------------------------------------------------------------------- + +---通过角色、ID或角色唯一ID获取信息,提供混合角色与帮会数据后的结果给外部使用 +---@param xKey string | number @角色名、角色ID或角色唯一ID,其中通过ID只能获取当前服务器角色信息或跨服玩家角色信息,通过角色名或角色唯一ID可以获取其他服务器角色信息 +---@return table | nil @获取成功返回信息,否则返回空 +function D.Get(xKey) + local tPlayer = D.GetPlayerInfo(xKey) + if tPlayer then + local tTong = D.GetTongInfo(tPlayer.szServerName, tPlayer.dwTongID) + return { + szServerName = tPlayer.szServerName, + dwID = tPlayer.dwID, + szName = tPlayer.szName, + szGlobalID = tPlayer.szGlobalID, + dwRemoteID = tPlayer.dwRemoteID, + dwForceID = tPlayer.dwForceID, + nRoleType = tPlayer.nRoleType, + nLevel = tPlayer.nLevel, + szTitle = tPlayer.szTitle, + nCamp = tPlayer.nCamp, + nMetCount = tPlayer.nTimes, + dwMetMapID = tPlayer.dwMetMapID, + dwUpdateTime = tPlayer.dwTime, + dwTongID = tPlayer.dwTongID, + szTongName = tTong and tTong.szName or '', + rgb = X.IsNumber(tPlayer.dwForceID) and { X.GetForceColor(tPlayer.dwForceID, 'foreground') } or { 255, 255, 255 }, + } + end +end + +---通过角色ID获取信息 +---@param dwID number @角色ID +---@return table | nil @获取到的角色信息,失败返回空 +function D.GetAusID(dwID) + D.AddAusID(dwID, false) + return D.Get(dwID) +end + +-------------------------------------------------------------------------------- +-- 统计界面 +-------------------------------------------------------------------------------- +function D.ShowAnalysis(nTimeLimit, szSubTitle) + local function BuildWhere(...) + local szWhere = '' + for _, v in ipairs({...}) do + if X.IsString(v) then + v = {v} + end + for _, vv in ipairs(v) do + if szWhere == '' then + szWhere = ' WHERE ' .. vv .. ' ' + else + szWhere = szWhere .. ' AND ' .. vv .. ' ' + end + end + end + return szWhere + end + local szServer = X.GetServerOriginName() + local szTitle = _L['MY_Farbnamen__Analysis'] .. g_tStrings.STR_CONNECT .. szServer + if szSubTitle then + szTitle = szTitle .. g_tStrings.STR_CONNECT .. szSubTitle + end + local aWhere = {} + if nTimeLimit then + table.insert(aWhere, 'time > ' .. (GetCurrentTime() - nTimeLimit)) + end + local ui = X.UI.CreateFrame('MY_Farbnamen__Analysis', { + theme = X.UI.FRAME_THEME.SIMPLE, + w = 640, h = 540, + text = szTitle, + close = true, + }) + local nPaddingX = 20 + local nX, nY = nPaddingX, 30 + local nDeltaY = 30 + + local uiTabs = ui:Append('WndTabs', { + x = 0, y = 0, + w = 640, h = 35, + }) + local uiWndTotal = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = true, + }) + local uiWndCamp = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = false, + }) + local uiWndForce = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = false, + }) + local uiWndServer = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = false, + }) + local uiWndTong = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = false, + }) + local uiWndMetCount = ui:Append('WndWindow', { + x = 0, y = 50, + w = 640, h = 480, + visible = false, + }) + + local nAllPlayerCount = X.Get(X.SQLiteGetAllANSI(DB, [[SELECT COUNT(*) AS count FROM PlayerInfo]] .. BuildWhere(aWhere)), {1, 'count'}, 0) + local nAllTongCount = X.Get(X.SQLiteGetAllANSI(DB, [[SELECT COUNT(*) AS count FROM TongInfo]] .. BuildWhere(aWhere)), {1, 'count'}, 0) + local nPlayerCount = X.Get(X.SQLiteGetAllANSI(DB, [[SELECT COUNT(*) AS count FROM PlayerInfo]] .. BuildWhere(aWhere, [[server = ?]]), szServer), {1, 'count'}, 0) + local nTongCount = X.Get(X.SQLiteGetAllANSI(DB, [[SELECT COUNT(*) AS count FROM TongInfo]] .. BuildWhere(aWhere, [[server = ?]]), szServer), {1, 'count'}, 0) + + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['Total'], + onCheck = function(bChecked) + uiWndTotal:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + local nY = 0 + uiWndTotal:Append('Text', { + x = nX, y = nY, + text = _L('All server total player count: %d', nAllPlayerCount), + }) + nY = nY + nDeltaY + uiWndTotal:Append('Text', { + x = nX, y = nY, + text = _L('All server total tong count: %d', nAllTongCount), + }) + nY = nY + nDeltaY + uiWndTotal:Append('Text', { + x = nX, y = nY, + text = _L('Current server total player count: %d', nPlayerCount), + }) + nY = nY + nDeltaY + uiWndTotal:Append('Text', { + x = nX, y = nY, + text = _L('Current server total tong count: %d', nTongCount), + }) + end, + }):Check(true) + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['By Camp'], + onCheck = function(bChecked) + uiWndCamp:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + uiWndCamp:Append('WndTable', { + x = 20, y = 0, + w = 600, h = 400, + columns = { + { + key = 'camp', + title = ' ' .. _L['Camp'], + width = 200, + alignHorizontal = 'left', + sorter = true, + render = function(value, record, index) + if record.summary then + return GetFormatText(' ' .. _L['Summary'], 162, 255, 255, 255) + end + return GetFormatText(' ' .. (g_tStrings.STR_CAMP_TITLE[value] or _L('Unknown(%d)', value)), 162, X.GetCampColor(value or -1)) + end, + }, + { + key = 'count', + title = ' ' .. _L['Player Count'], + sorter = true, + render = function(value, record, index) + return GetFormatText(' ' .. _L('%d players', value), 162, 255, 255, 255) + end, + }, + }, + dataSource = X.SQLiteGetAllANSI(DB, [[SELECT camp, COUNT(*) AS count FROM PlayerInfo]] .. BuildWhere(aWhere, [[server = ?]]) .. [[ GROUP BY camp]], szServer) or {}, + summary = { summary = true, count = nPlayerCount }, + sort = 'camp', + sortOrder = 'asc', + }) + end, + }) + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['By Force'], + onCheck = function(bChecked) + uiWndForce:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + uiWndForce:Append('WndTable', { + x = 20, y = 0, + w = 600, h = 400, + columns = { + { + key = 'force', + title = ' ' .. _L['Force'], + width = 200, + alignHorizontal = 'left', + sorter = true, + render = function(value, record, index) + if record.summary then + return GetFormatText(' ' .. _L['Summary'], 162, 255, 255, 255) + end + return GetFormatText(' ' .. (g_tStrings.tForceTitle[value] or _L('Unknown(%d)', value)), 162, X.GetForceColor(value or -1, 'foreground')) + end, + }, + { + key = 'count', + title = ' ' .. _L['Player Count'], + sorter = true, + render = function(value, record, index) + return GetFormatText(' ' .. _L('%d players', value), 162, 255, 255, 255) + end, + }, + }, + dataSource = X.SQLiteGetAllANSI(DB, [[SELECT force, COUNT(*) AS count FROM PlayerInfo]] .. BuildWhere(aWhere, [[server = ?]]) .. [[ GROUP BY force]], szServer) or {}, + summary = { summary = true, count = nPlayerCount }, + sort = 'force', + sortOrder = 'asc', + }) + end, + }) + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['By Server'], + onCheck = function(bChecked) + uiWndServer:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + uiWndServer:Append('WndTable', { + x = 20, y = 0, + w = 600, h = 400, + columns = { + { + key = 'server', + title = ' ' .. _L['Server'], + width = 200, + alignHorizontal = 'left', + sorter = true, + render = function(value, record, index) + if record.summary then + return GetFormatText(' ' .. _L['Summary'], 162, 255, 255, 255) + end + return GetFormatText(' ' .. value, 162, 255, 255, 255) + end, + }, + { + key = 'count', + title = ' ' .. _L['Player Count'], + sorter = true, + render = function(value, record, index) + return GetFormatText(' ' .. _L('%d players', value), 162, 255, 255, 255) + end, + }, + }, + dataSource = X.SQLiteGetAllANSI(DB, [[SELECT server, COUNT(*) AS count FROM PlayerInfo]] .. BuildWhere(aWhere) .. [[ GROUP BY server]]) or {}, + summary = { summary = true, count = nAllPlayerCount }, + sort = 'count', + sortOrder = 'desc', + }) + end, + }) + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['By Tong'], + onCheck = function(bChecked) + uiWndTong:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + uiWndTong:Append('WndTable', { + x = 20, y = 0, + w = 600, h = 400, + columns = { + { + key = 'name', + title = ' ' .. _L['Tong'], + width = 300, + alignHorizontal = 'left', + sorter = true, + render = function(value, record, index) + if record.summary then + return GetFormatText(' ' .. _L['Summary'], 162, 255, 255, 255) + end + return GetFormatText(' ' .. value, 162, 255, 255, 255) + end, + }, + { + key = 'count', + title = ' ' .. _L['Player Count'], + sorter = true, + render = function(value, record, index) + return GetFormatText(' ' .. _L('%d players', value), 162, 255, 255, 255) + end, + }, + }, + dataSource = X.SQLiteGetAllANSI(DB, [[ + SELECT t.name, p.count + FROM TongInfo t + JOIN ( + SELECT tong, COUNT(id) AS count + FROM PlayerInfo + ]] .. BuildWhere(aWhere, [[server = ?]]) .. [[ + GROUP BY tong + ) p ON t.id = p.tong + ORDER BY p.count DESC + LIMIT 500; + ]], szServer) or {}, + summary = { summary = true, count = nPlayerCount }, + sort = 'count', + sortOrder = 'desc', + }) + end, + }) + uiTabs:Append('WndTab', { + w = 100, h = 35, + text = _L['By Met Count'], + onCheck = function(bChecked) + uiWndMetCount:Visible(bChecked) + if this.bInit then + return + end + this.bInit = true + uiWndMetCount:Append('WndTable', { + x = 20, y = 0, + w = 600, h = 400, + columns = { + { + key = 'name', + title = ' ' .. _L['Name'], + width = 300, + alignHorizontal = 'left', + sorter = true, + render = function(value, record, index) + return GetFormatText(' ') + .. X.RenderChatLink(D.Render(GetFormatText(value or '', 162, 255, 255, 255, nil, nil, 'namelink_0'))) + end, + }, + { + key = 'times', + title = ' ' .. _L['Met Count'], + sorter = true, + render = function(value, record, index) + return GetFormatText(' ' .. _L('%d times', value), 162, 255, 255, 255) + end, + }, + }, + dataSource = X.SQLiteGetAllANSI(DB, [[SELECT name, times FROM PlayerInfo]] .. BuildWhere(aWhere, [[server = ?]]) .. [[ ORDER BY times DESC LIMIT 500]], szServer) or {}, + sort = 'times', + sortOrder = 'desc', + }) + end, + }) + + nY = 460 + ui:Append('Text', { + x = nX, y = nY, + text = _L['Counts based on local cache, only players you met will be analyzed.'], + }) + + ui:Anchor('CENTER') +end + +-------------------------------------------------------------------------------- +-- 菜单 +-------------------------------------------------------------------------------- +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + D.Migration() + + local bBan = X.IsRestricted('MY_Farbnamen.BanHDD') and X.GetDiskType() == 'HDD' + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Enable MY_Farbnamen'], + checked = O.bEnable, + onCheck = function() + O.bEnable = not O.bEnable + end, + }):Width() + 5 + + nX = nPaddingX + 25 + nY = nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Insert force icon'], + checked = O.bInsertIcon, + onCheck = function() + O.bInsertIcon = not O.bInsertIcon + end, + autoEnable = function() + return O.bEnable + end, + }):Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, w = 100, h = 25, + value = O.nInsertIconSize, + range = {1, 300}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(v) return _L('Icon size: %dpx', v) end, + onChange = function(val) + O.nInsertIconSize = val + end, + autoEnable = function() return O.bInsertIcon end, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + 25 + nY = nY + nLH + + nX = nPaddingX + 25 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Save to database'], + checked = not bBan and O.bSaveDB, + onCheck = function() + O.bSaveDB = not O.bSaveDB + end, + enable = not bBan, + tip = bBan and { + render = _L['This feature has been disabled on HDD disk machine for performance issues.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + } or nil, + }):Width() + 5 + + nX = nPaddingX + 25 + nY = nY + nLH + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 'auto', + buttonStyle = 'FLAT', + text = _L['Show analysis'], + onLClick = function() + D.Flush() + D.ShowAnalysis() + X.UI.ClosePopupMenu() + end, + menuRClick = function() + local menu = {} + for _, nHour in ipairs({ 12, 24, 48, 72 }) do + table.insert(menu, { + szOption = _L('Show analysis of %d hours', nHour), + fnAction = function() + D.Flush() + D.ShowAnalysis(nHour * 3600, _L('last %d hours', nHour)) + X.UI.ClosePopupMenu() + end, + }) + end + table.insert(menu, { + szOption = _L['Show analysis of last week'], + fnAction = function() + D.Flush() + D.ShowAnalysis(7 * 24 * 3600, _L['last week']) + X.UI.ClosePopupMenu() + end, + }) + for _, nDay in ipairs({ 30, 60, 90, 180, 365, 730 }) do + table.insert(menu, { + szOption = _L('Show analysis of last %d days', nDay), + fnAction = function() + D.Flush() + D.ShowAnalysis(nDay * 24 * 3600, _L('last %d days', nDay)) + X.UI.ClosePopupMenu() + end, + }) + end + return menu + end, + autoEnable = function() + return O.bEnable and O.bSaveDB + end, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 'auto', + buttonStyle = 'FLAT', + text = _L['Reset data'], + onClick = function() + X.Confirm(_L['Are you sure to reset farbnamen data? All character\'s data cache will be removed.'], function() + if not InitDB() then + return + end + X.SQLiteExecute(DB, 'DELETE FROM PlayerInfo') + X.OutputSystemMessage(_L['MY_Farbnamen'], _L['Cache data deleted.']) + end) + end, + autoEnable = function() + return O.bEnable and O.bSaveDB + end, + }):Width() + 5 + + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 'auto', + buttonStyle = 'FLAT', + text = _L['Import data'], + onClick = function() + local szRoot = X.FormatPath({'cache/', X.PATH_TYPE.GLOBAL}) + local file = GetOpenFileName(_L['Please select your farbnamen database file.'], 'Database File(*.db)\0*.db\0\0', szRoot) + if not X.IsEmpty(file) then + X.Confirm(_L['DO NOT KILL PROCESS BY FORCE, OR YOUR DATABASE MAY GOT A DAMAE, PRESS OK TO CONTINUE.'], function() + local nImportChar, nSkipChar, nImportTong, nSkipTong = D.Import(file, false) + X.Alert(_L('%d chars imported, %d chars skipped, %d tongs imported, %d tongs skipped!', nImportChar, nSkipChar, nImportTong, nSkipTong)) + end) + end + end, + autoEnable = function() + return O.bEnable and O.bSaveDB + end, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 'auto', + buttonStyle = 'FLAT', + text = _L['Export data'], + onClick = function() + X.OpenFolder(X.GetAbsolutePath({'cache/farbnamen/farbnamen.v7.db', X.PATH_TYPE.GLOBAL})) + X.Alert(_L['Copy .db file to share.']) + end, + autoEnable = function() + return O.bEnable and O.bSaveDB + end, + }):Width() + 5 + + nY = nY + nLH + + return nX, nY +end +X.RegisterAddonMenu('MY_Farbenamen', D.GetMenu) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Farbnamen', + exports = { + { + fields = { + Render = D.Render , + RegisterHeader = D.RegisterNameIDHeader , + RegisterNameIDHeader = D.RegisterNameIDHeader , + RegisterGlobalIDHeader = D.RegisterGlobalIDHeader, + GetTip = D.GetTip , + ShowTip = D.ShowTip , + Get = D.Get , + GetAusID = D.GetAusID , + GetAusName = D.Get , + OnPanelActivePartial = D.OnPanelActivePartial , + }, + }, + }, +} +MY_Farbnamen = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +do +local PEEK_LIST = {} +local function onBreathe() + for dwID, v in pairs(PEEK_LIST) do + if D.AddAusID(dwID, v.bTimes) or v.nRetryCount > 5 then + PEEK_LIST[dwID] = nil + else + PEEK_LIST[dwID].nRetryCount = v.nRetryCount + 1 + end + end +end +X.BreatheCall(250, onBreathe) + +local function OnPeekPlayer() + if arg0 == X.CONSTANT.PEEK_OTHER_PLAYER_RESPOND.SUCCESS then + PEEK_LIST[arg1] = { nRetryCount = 0, bTimes = false } + end +end +X.RegisterEvent('PEEK_OTHER_PLAYER', OnPeekPlayer) +X.RegisterEvent('MY_PLAYER_ENTER_SCENE', function() PEEK_LIST[arg0] = { nRetryCount = 0, bTimes = arg0 ~= X.GetClientPlayerID() } end) +X.RegisterEvent('ON_GET_TONG_NAME_NOTIFY', function() D.RecordTongInfo(X.GetServerOriginName(), arg1, arg2, true) end) +end + +X.RegisterEvent('PLAYER_CHAT', function () + local dwSenderID = arg1 + local szSenderName = arg2 + local szGlobalID = arg10 + -- local dwAvatar = arg11 + local dwForceID = arg12 + local nLevel = arg13 + local nCamp = arg14 + local nRoleType = arg15 + if not dwSenderID or not szSenderName or not dwForceID or not X.IsGlobalID(szGlobalID) then + return + end + if szGlobalID == X.GetClientPlayerGlobalID() then -- 密聊频道自己发言回显数据对不上 + return + end + D.RecordPlayerInfo(nil, dwSenderID, szSenderName, szGlobalID, dwForceID, nRoleType, nLevel, nil, nCamp, nil, false) +end) + +-- 插入聊天内容的 HOOK (过滤、加入时间 ) +X.HookChatPanel('BEFORE', 'MY_FARBNAMEN', function(h, szMsg, ...) + if D.bReady and O.bEnable then + szMsg = D.Render(szMsg, true) + end + return szMsg +end) +-- X.HookChatPanel('AFTER', 'MY_FARBNAMEN', function(h, nIndex) +-- if D.bReady and O.bEnable then +-- for i = h:GetItemCount() - 1, nIndex, -1 do +-- D.Render(h:Lookup(i), true) +-- end +-- end +-- end) + +X.RegisterChatPlayerAddonMenu('MY_Farbnamen', function(szName) + if not (IsCtrlKeyDown() and X.IsDebugging()) then + return + end + return { + { + szOption = _L['Copy debug information'], + fnAction = function() + local tInfo = D.Get(szName) + X.UI.OpenTextEditor(X.EncodeLUAData(tInfo, '\t')) + end, + }, + } +end) + +X.RegisterUserSettingsInit('MY_Farbnamen', function() + D.bReady = true + D.UpdateSaveDB() +end) +X.RegisterUserSettingsRelease('MY_Farbnamen', function() + D.bReady = false +end) +X.RegisterUserSettingsUpdate('MY_Farbnamen.bSaveDB', function() + D.UpdateSaveDB() +end) + +X.RegisterEvent('MY_RESTRICTION', 'MY_Farbnamen.BanHDD', function() + if arg0 and arg0 ~= 'MY_Farbnamen.BanHDD' then + return + end + D.UpdateSaveDB() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Focus/info.ini b/MY_Focus/info.ini new file mode 100644 index 000000000..4cb7c0272 --- /dev/null +++ b/MY_Focus/info.ini @@ -0,0 +1,10 @@ +[MY_Focus] +name=焦点列表 +desc=提供多种条件的焦点列表 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Focus.lua +lua_1=src\MY_Focus.UI.lua +lua_2=src\MY_Focus.PS.lua +package=MY diff --git a/MY_Focus/info.ini.zh_TW b/MY_Focus/info.ini.zh_TW new file mode 100644 index 000000000..08de779ef --- /dev/null +++ b/MY_Focus/info.ini.zh_TW @@ -0,0 +1,10 @@ +[MY_Focus] +name=鐒﹂粸鍒楄〃 +desc=鎻愪緵澶氱ó姊濅欢鐨勭劍榛炲垪琛 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Focus.lua +lua_1=src\MY_Focus.UI.lua +lua_2=src\MY_Focus.PS.lua +package=MY diff --git a/MY_Focus/lang/zhcn.jx3dat b/MY_Focus/lang/zhcn.jx3dat new file mode 100644 index 000000000..bcf7ab44d --- /dev/null +++ b/MY_Focus/lang/zhcn.jx3dat @@ -0,0 +1,108 @@ +return { + ['MY_Focus'] = '焦点列表', + ['Focus list'] = '焦点列表', + ['Enable'] = '启用', + ['Option'] = '设置', + ['Hide when empty'] = '无焦点时自动隐藏界面', + ['Auto focus very important npc'] = '自动焦点重要NPC', + ['Boss list is always been collecting and updating'] = '重要NPC列表不定时自动更新\n选中目标按住SHIFT右键点击目标头像可手动添加删除', + ['TeamMon focus'] = '团队监控焦点', + ['TeamMon focus is related to MY_TeamMon data.'] = '团队监控焦点依赖于“团队监控”子插件数据。', + ['Auto focus friend'] = '焦点附近好友', + ['Auto focus tong'] = '焦点附近帮会成员', + ['Auto focus only in public map'] = '仅在公共地图自动焦点', + ['Auto focus enemy'] = '焦点附近敌对玩家', + ['Auto focus party in arena'] = '焦点名剑大会友方队员', + ['Auto focus enemy in arena'] = '焦点名剑大会敌方队员', + ['MY_PlayerRemark auto focus'] = '焦点角色备注中的目标', + ['Show focus\'s target'] = '显示目标的目标', + ['Show 3d distance'] = '显示三维坐标距离', + ['Distance type'] = '默认距离计算方式', + ['Hide dead object'] = '隐藏重伤的目标', + ['Display kungfu icon instead of location'] = '显示内功心法图标', + ['Enable scene navi'] = '启用场景目标追踪', + ['Heal healper'] = '治疗辅助', + ['Select target when mouse enter'] = '鼠标移入时即选中目标', + ['Show tip at right bottom'] = '目标信息显示在屏幕右下角', + ['Right click list to delete'] = '右键点击列表可删除', + + ['Minimize'] = '最小化状态', + ['Max display count'] = '最大显示数量', + ['Scale-x'] = '界面X轴缩放', + ['Scale-y'] = '界面Y轴缩放', + + ['Auto focus' ] = '启用默认焦点', + ['Auto focus data' ] = '默认焦点数据', + ['Static focus data' ] = '永久焦点数据', + ['Add' ] = '添加', + ['Add auto focus' ] = '添加默认焦点', + ['Namelist manager' ] = '管理默认焦点', + ['Delete focus' ] = '删除焦点', + ['Add to temp focus list' ] = '加入茗伊临时焦点', + ['Add to static focus list'] = '加入茗伊永久焦点', + ['Max display count %d.' ] = '最大显示数量%d个。', + ['Sort by distance' ] = '优先焦点近距离目标', + ['Current scale-x is %d%%.'] = '界面X轴缩放%d%%。', + ['Current scale-y is %d%%.'] = '界面Y轴缩放%d%%。', + + ['Copy information'] = '复制信息', + ['Lock focus'] = '锁定目标', + ['Unlock focus'] = '取消锁定目标', + ['Can not use in shielded map!'] = '当前地图,禁止使用。', + + ['Loop target in focus'] = '焦点列表循环选择', + + ['Focus rule editor'] = '焦点编辑', + ['Target type'] = '目标类型', + ['Target life percentage'] = '目标血量百分比', + ['All'] = '全部', + ['All type'] = '所有类型', + ['All relation'] = '所有势力', + ['None type'] = '未选类型', + ['None relation'] = '未选势力', + ['Enable'] = '启用', + ['Judge method'] = '匹配方式', + JUDGE_METHOD = { + ['NAME'] = '按名字', + ['NAME_PATT'] = '按名字(模式匹配)', + ['ID'] = '按ID', + ['TEMPLATE_ID'] = '按模板ID', + ['TONG_NAME'] = '按帮会名字', + ['TONG_NAME_PATT'] = '按帮会名字(模式匹配)', + }, + TARGET = { + [TARGET.NPC] = 'NPC', + [TARGET.PLAYER] = '玩家', + [TARGET.DOODAD] = '交互物件', + }, + ['Target relation'] = '目标关系', + RELATION = { + Enemy = '敌对目标', + Ally = '非敌对目标', + }, + ['Operator'] = '运算符', + ['Value'] = '数值', + ['Name display'] = '名称显示', + ['Max distance'] = '最大距离', + ['Please input max distance, leave blank to disable:'] = '请输入最大距离(尺),留空禁用距离限制:', + ['Please input display name, leave blank to use its own name:'] = '请输入显示名称,留空显示目标默认名称:', + + ['Via:'] = '来源:', + ['Temp focus'] = '临时焦点', + ['Static focus'] = '永久焦点', + ['Auto focus'] = '默认焦点', + ['Auto focus in arena'] = '名剑大会自动焦点', + ['Auto focus party in arena'] = '名剑大会自动焦点队友', + ['Auto focus enemy in arena'] = '名剑大会自动焦点敌对', + ['Friend focus'] = '好友自动焦点', + ['Tong member focus'] = '帮会自动焦点', + ['Enemy focus'] = '敌对玩家自动焦点', + ['Important npc focus'] = '重要NPC自动焦点', + ['MY_PlayerRemark'] = '角色备注自动焦点', + ['PlayerRemark: '] = '备注:', + + ['Would you like to use MY focus?'] = '是否启用焦点列表?', + ['Use'] = '使用', + ['Not use'] = '不使用', + ['Sure to delete?'] = '确认要删除?', +} diff --git a/MY_Focus/lang/zhtw.jx3dat b/MY_Focus/lang/zhtw.jx3dat new file mode 100644 index 000000000..a62fb5de5 --- /dev/null +++ b/MY_Focus/lang/zhtw.jx3dat @@ -0,0 +1,108 @@ +return { + ['MY_Focus'] = '鐒﹂粸鍒楄〃', + ['Focus list'] = '鐒﹂粸鍒楄〃', + ['Enable'] = '鍟熺敤', + ['Option'] = '瑷疆', + ['Hide when empty'] = '鐒$劍榛炴檪鑷嫊闅辫棌鐣岄潰', + ['Auto focus very important npc'] = '鑷嫊鐒﹂粸閲嶈NPC', + ['Boss list is always been collecting and updating'] = '閲嶈NPC鍒楄〃涓嶅畾鏅傝嚜鍕曟洿鏂癨n閬镐腑鐩鎸変綇SHIFT鍙抽嵉榛炴搳鐩闋儚鍙墜鍕曟坊鍔犲埅闄', + ['TeamMon focus'] = '鍦橀殜鐩f帶鐒﹂粸', + ['TeamMon focus is related to MY_TeamMon data.'] = '鍦橀殜鐩f帶鐒﹂粸渚濊炒鏂尖滃湗闅婄洠鎺р濆瓙鎻掍欢鏁告摎銆', + ['Auto focus friend'] = '鐒﹂粸闄勮繎濂藉弸', + ['Auto focus tong'] = '鐒﹂粸闄勮繎骞渻鎴愬摗', + ['Auto focus only in public map'] = '鍍呭湪鍏叡鍦板湒鑷嫊鐒﹂粸', + ['Auto focus enemy'] = '鐒﹂粸闄勮繎鏁靛皪鐜╁', + ['Auto focus party in arena'] = '鐒﹂粸鍚嶅妽澶ф渻鍙嬫柟闅婂摗', + ['Auto focus enemy in arena'] = '鐒﹂粸鍚嶅妽澶ф渻鏁垫柟闅婂摗', + ['MY_PlayerRemark auto focus'] = '鐒﹂粸瑙掕壊鍌欐敞涓殑鐩', + ['Show focus\'s target'] = '椤ず鐩鐨勭洰妯', + ['Show 3d distance'] = '椤ず涓夌董鍧愭璺濋洟', + ['Distance type'] = '榛樿獚璺濋洟瑷堢畻鏂瑰紡', + ['Hide dead object'] = '闅辫棌閲嶅偡鐨勭洰妯', + ['Display kungfu icon instead of location'] = '椤ず鍏у姛蹇冩硶鍦栨', + ['Enable scene navi'] = '鍟熺敤鍫存櫙鐩杩借工', + ['Heal healper'] = '娌荤檪杓斿姪', + ['Select target when mouse enter'] = '婊戦紶绉诲叆鏅傚嵆閬镐腑鐩', + ['Show tip at right bottom'] = '鐩淇℃伅椤ず鍦ㄥ睆骞曞彸涓嬭', + ['Right click list to delete'] = '鍙抽嵉榛炴搳鍒楄〃鍙埅闄', + + ['Minimize'] = '鏈灏忓寲鐙鎱', + ['Max display count'] = '鏈澶ч’绀烘暩閲', + ['Scale-x'] = '鐣岄潰X杌哥府鏀', + ['Scale-y'] = '鐣岄潰Y杌哥府鏀', + + ['Auto focus' ] = '鍟熺敤榛樿獚鐒﹂粸', + ['Auto focus data' ] = '榛樿獚鐒﹂粸鏁告摎', + ['Static focus data' ] = '姘镐箙鐒﹂粸鏁告摎', + ['Add' ] = '娣诲姞', + ['Add auto focus' ] = '娣诲姞榛樿獚鐒﹂粸', + ['Namelist manager' ] = '绠$悊榛樿獚鐒﹂粸', + ['Delete focus' ] = '鍒櫎鐒﹂粸', + ['Add to temp focus list' ] = '鍔犲叆鑼椾紛鑷ㄦ檪鐒﹂粸', + ['Add to static focus list'] = '鍔犲叆鑼椾紛姘镐箙鐒﹂粸', + ['Max display count %d.' ] = '鏈澶ч’绀烘暩閲%d鍊嬨', + ['Sort by distance' ] = '鍎厛鐒﹂粸杩戣窛闆㈢洰妯', + ['Current scale-x is %d%%.'] = '鐣岄潰X杌哥府鏀%d%%銆', + ['Current scale-y is %d%%.'] = '鐣岄潰Y杌哥府鏀%d%%銆', + + ['Copy information'] = '瑜囪=淇℃伅', + ['Lock focus'] = '閹栧畾鐩', + ['Unlock focus'] = '鍙栨秷閹栧畾鐩', + ['Can not use in shielded map!'] = '鐣跺墠鍦板湒锛岀姝娇鐢ㄣ', + + ['Loop target in focus'] = '鐒﹂粸鍒楄〃寰挵閬告搰', + + ['Focus rule editor'] = '鐒﹂粸绶ㄨ集', + ['Target type'] = '鐩椤炲瀷', + ['Target life percentage'] = '鐩琛閲忕櫨鍒嗘瘮', + ['All'] = '鍏ㄩ儴', + ['All type'] = '鎵鏈夐鍨', + ['All relation'] = '鎵鏈夊嫝鍔', + ['None type'] = '鏈伕椤炲瀷', + ['None relation'] = '鏈伕鍕㈠姏', + ['Enable'] = '鍟熺敤', + ['Judge method'] = '鍖归厤鏂瑰紡', + JUDGE_METHOD = { + ['NAME'] = '鎸夊悕瀛', + ['NAME_PATT'] = '鎸夊悕瀛(妯″紡鍖归厤)', + ['ID'] = '鎸塈D', + ['TEMPLATE_ID'] = '鎸夋ā鏉縄D', + ['TONG_NAME'] = '鎸夊公鏈冨悕瀛', + ['TONG_NAME_PATT'] = '鎸夊公鏈冨悕瀛(妯″紡鍖归厤)', + }, + TARGET = { + [TARGET.NPC] = 'NPC', + [TARGET.PLAYER] = '鐜╁', + [TARGET.DOODAD] = '浜や簰鐗╀欢', + }, + ['Target relation'] = '鐩闂滀總', + RELATION = { + Enemy = '鏁靛皪鐩', + Ally = '闈炴暤灏嶇洰妯', + }, + ['Operator'] = '閬嬬畻绗', + ['Value'] = '鏁稿', + ['Name display'] = '鍚嶇ū椤ず', + ['Max distance'] = '鏈澶ц窛闆', + ['Please input max distance, leave blank to disable:'] = '璜嬭几鍏ユ渶澶ц窛闆紙灏猴級锛岀暀绌虹鐢ㄨ窛闆㈤檺鍒讹細', + ['Please input display name, leave blank to use its own name:'] = '璜嬭几鍏ラ’绀哄悕绋憋紝鐣欑┖椤ず鐩榛樿獚鍚嶇ū锛', + + ['Via:'] = '渚嗘簮锛', + ['Temp focus'] = '鑷ㄦ檪鐒﹂粸', + ['Static focus'] = '姘镐箙鐒﹂粸', + ['Auto focus'] = '榛樿獚鐒﹂粸', + ['Auto focus in arena'] = '鍚嶅妽澶ф渻鑷嫊鐒﹂粸', + ['Auto focus party in arena'] = '鍚嶅妽澶ф渻鑷嫊鐒﹂粸闅婂弸', + ['Auto focus enemy in arena'] = '鍚嶅妽澶ф渻鑷嫊鐒﹂粸鏁靛皪', + ['Friend focus'] = '濂藉弸鑷嫊鐒﹂粸', + ['Tong member focus'] = '骞渻鑷嫊鐒﹂粸', + ['Enemy focus'] = '鏁靛皪鐜╁鑷嫊鐒﹂粸', + ['Important npc focus'] = '閲嶈NPC鑷嫊鐒﹂粸', + ['MY_PlayerRemark'] = '瑙掕壊鍌欐敞鑷嫊鐒﹂粸', + ['PlayerRemark: '] = '鍌欒ɑ锛', + + ['Would you like to use MY focus?'] = '鏄惁鍟熺敤鐒﹂粸鍒楄〃锛', + ['Use'] = '浣跨敤', + ['Not use'] = '涓嶄娇鐢', + ['Sure to delete?'] = '纰鸿獚瑕佸埅闄わ紵', +} diff --git a/MY_Focus/src/MY_Focus.PS.lua b/MY_Focus/src/MY_Focus.PS.lua new file mode 100644 index 000000000..30719fa24 --- /dev/null +++ b/MY_Focus/src/MY_Focus.PS.lua @@ -0,0 +1,517 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 焦点列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Focus/MY_Focus.PS' +local PLUGIN_NAME = 'MY_Focus' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Focus' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local PS = { szRestriction = 'MY_Focus' } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local w = ui:Width() + local h = math.max(ui:Height(), 440) + local xr, yr, wr = w - 260, 5, 260 + local xl, yl, wl = 5, 5, w - wr -15 + + -- 左侧 + local x, y = xl, yl + x = x + ui:Append('WndCheckBox', { + x = x, y = y, w = 250, text = _L['Enable'], + r = 255, g = 255, b = 0, checked = MY_Focus.bEnable, + onCheck = function(bChecked) + MY_Focus.bEnable = bChecked + end, + tip = function() + if MY_Focus.IsShielded() then + return _L['Can not use in shielded map!'] + end + end, + autoEnable = function() return not MY_Focus.IsShielded() end, + }):AutoWidth():Width() + 10 + + x, y = xl, y + 25 + + --
+ ui:Append('Image', {x = x, y = y, w = wl, h = 1, image = 'UI/Image/UICommon/ScienceTreeNode.UITex', imageFrame = 62}) + y = y + 5 + + ui:Append('WndCheckBox', { + x = x, y = y, text = _L['Auto focus'], checked = MY_Focus.bAutoFocus, + onCheck = function(bChecked) + MY_Focus.bAutoFocus = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + + local list = ui:Append('WndListBox', { + x = x, y = y + 30, w = wl - x + xl, h = h - y - 40, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + -- 初始化list控件 + for _, v in ipairs(MY_Focus.GetAllFocusPattern()) do + list:ListBox('insert', { id = v, text = MY_Focus.FormatRuleText(v), data = v }) + end + list:ListBox('onmenu', function(oID, szText, tData) + local t = {{ + szOption = _L['Delete'], + fnAction = function() + MY_Focus.RemoveFocusPattern(tData.szPattern) + list:ListBox('delete', 'id', oID) + X.UI.ClosePopupMenu() + end, + }} + -- 匹配方式 + local t1 = { szOption = _L['Judge method'] } + for _, eType in ipairs({ 'NAME', 'NAME_PATT', 'ID', 'TEMPLATE_ID', 'TONG_NAME', 'TONG_NAME_PATT' }) do + table.insert(t1, { + szOption = _L.JUDGE_METHOD[eType], + bCheck = true, bMCheck = true, + bChecked = tData.szMethod == eType, + fnAction = function() + tData.szMethod = eType + MY_Focus.SetFocusPattern(tData.szPattern, tData) + end, + }) + end + table.insert(t, t1) + -- 目标类型 + local t1 = { + szOption = _L['Target type'], { + szOption = _L['All'], + bCheck = true, bChecked = tData.tType.bAll, + fnAction = function() + tData.tType.bAll = not tData.tType.bAll + MY_Focus.SetFocusPattern(tData.szPattern, tData) + list:ListBox('update', 'id', oID, {'text'}, {MY_Focus.FormatRuleText(tData)}) + end, + } + } + for _, eType in ipairs({ TARGET.NPC, TARGET.PLAYER, TARGET.DOODAD }) do + table.insert(t1, { + szOption = _L.TARGET[eType], + bCheck = true, bChecked = tData.tType[eType], + fnAction = function() + tData.tType[eType] = not tData.tType[eType] + MY_Focus.SetFocusPattern(tData.szPattern, tData) + list:ListBox('update', 'id', oID, {'text'}, {MY_Focus.FormatRuleText(tData)}) + end, + fnDisable = function() + return tData.tType.bAll + end, + }) + end + table.insert(t, t1) + -- 目标关系 + local t1 = { + szOption = _L['Target relation'], { + szOption = _L['All'], + bCheck = true, bChecked = tData.tRelation.bAll, + fnAction = function() + tData.tRelation.bAll = not tData.tRelation.bAll + MY_Focus.SetFocusPattern(tData.szPattern, tData) + list:ListBox('update', 'id', oID, {'text'}, {MY_Focus.FormatRuleText(tData)}) + end, + } + } + for _, szRelation in ipairs({ 'Enemy', 'Ally' }) do + table.insert(t1, { + szOption = _L.RELATION[szRelation], + bCheck = true, bChecked = tData.tRelation['b' .. szRelation], + fnAction = function() + tData.tRelation['b' .. szRelation] = not tData.tRelation['b' .. szRelation] + MY_Focus.SetFocusPattern(tData.szPattern, tData) + list:ListBox('update', 'id', oID, {'text'}, {MY_Focus.FormatRuleText(tData)}) + end, + fnDisable = function() + return tData.tRelation.bAll + end, + }) + end + table.insert(t, t1) + -- 目标血量百分比 + local t1 = { + szOption = _L['Target life percentage'], { + szOption = _L['Enable'], + bCheck = true, bChecked = tData.tLife.bEnable, + fnAction = function() + tData.tLife.bEnable = not tData.tLife.bEnable + end, + }, + X.InsertOperatorMenu({ + szOption = _L['Operator'], + fnDisable = function() return not tData.tLife.bEnable end, + }, tData.tLife.szOperator, function(op) + tData.tLife.szOperator = op + MY_Focus.SetFocusPattern(tData.szPattern, tData) + end), { + szOption = _L['Value'], + fnMouseEnter = function() + OutputTip(GetFormatText(tData.tLife.nValue .. '%', nil, 255, 255, 0), 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + fnAction = function() + GetUserInputNumber(tData.tLife.nValue, 100, nil, function(val) + tData.tLife.nValue = val + MY_Focus.SetFocusPattern(tData.szPattern, tData) + end, nil, function() return not X.Panel.IsVisible() end) + end, + fnDisable = function() return not tData.tLife.bEnable end, + }, + } + table.insert(t, t1) + -- 最远距离 + local t1 = { + szOption = _L['Max distance'], + fnMouseEnter = function() + if tData.nMaxDistance == 0 then + return + end + OutputTip(GetFormatText(tData.nMaxDistance .. g_tStrings.STR_METER , nil, 255, 255, 0), 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + fnAction = function() + GetUserInput(_L['Please input max distance, leave blank to disable:'], function(val) + tData.nMaxDistance = tonumber(val) or 0 + MY_Focus.SetFocusPattern(tData.szPattern, tData) + end, nil, function() return not X.Panel.IsVisible() end, nil, tData.nMaxDistance) + end, + } + table.insert(t, t1) + -- 名称显示 + local t1 = { + szOption = _L['Name display'], + fnMouseEnter = function() + if tData.szDisplay == '' then + return + end + OutputTip(GetFormatText(tData.szDisplay, nil, 255, 255, 0), 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + fnAction = function() + GetUserInput(_L['Please input display name, leave blank to use its own name:'], function(val) + tData.szDisplay = val + MY_Focus.SetFocusPattern(tData.szPattern, tData) + end, nil, function() return not X.Panel.IsVisible() end, nil, tData.szDisplay) + end, + } + table.insert(t, t1) + return t + end) + -- add + ui:Append('WndButton', { + x = wl - 80, y = y, w = 80, + text = _L['Add'], + onClick = function() + GetUserInput(_L['Add auto focus'], function(szText) + local tData = MY_Focus.SetFocusPattern(szText) + if not tData then + return + end + list:ListBox('insert', { id = tData, text = MY_Focus.FormatRuleText(tData), data = tData }) + end, function() end, function() end, nil, '') + end, + tip = _L['Right click list to delete'], + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + + -- 右侧 + local x, y = xr, yr + local deltaY = (h - y * 2) / 20 + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Hide when empty'], + checked = MY_Focus.bAutoHide, + onCheck = function(bChecked) + MY_Focus.bAutoHide = bChecked + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus very important npc'], + tip = { + render = _L['Boss list is always been collecting and updating'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + checked = MY_Focus.bFocusINpc, + onCheck = function(bChecked) + MY_Focus.bFocusINpc = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['TeamMon focus'], + tip = { + render = _L['TeamMon focus is related to MY_TeamMon data.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + checked = MY_Focus.bTeamMonFocus, + onCheck = function(bChecked) + MY_Focus.bTeamMonFocus = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus friend'], + checked = MY_Focus.bFocusFriend, + onCheck = function(bChecked) + MY_Focus.bFocusFriend = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('Image', { + x = x + 5, y = y - 3, w = 10, h = 8, + image = 'ui/Image/UICommon/ScienceTree.UITex', + imageFrame = 10, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus tong'], + checked = MY_Focus.bFocusTong, + onCheck = function(bChecked) + MY_Focus.bFocusTong = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('Image', { + x = x + 5, y = y - 3, w = 10, h = 8, + image = 'ui/Image/UICommon/ScienceTree.UITex', + imageFrame = 10, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['MY_PlayerRemark auto focus'], + checked = MY_Focus.bFocusPlayerRemark, + onCheck = function(bChecked) + MY_Focus.bFocusPlayerRemark = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('Image', { + x = x + 5, y = y, w = 10, h = 10, + image = 'ui/Image/UICommon/ScienceTree.UITex', + imageFrame = 10, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + ui:Append('Image', { + x = x + 10, y = y + 5, w = 10, h = 10, + image = 'ui/Image/UICommon/ScienceTree.UITex', + imageFrame = 8, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + ui:Append('WndCheckBox', { + x = x + 20, y = y, w = wr, text = _L['Auto focus only in public map'], + checked = MY_Focus.bOnlyPublicMap, + onCheck = function(bChecked) + MY_Focus.bOnlyPublicMap = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus enemy'], + checked = MY_Focus.bFocusEnemy, + onCheck = function(bChecked) + MY_Focus.bFocusEnemy = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus party in arena'], + checked = MY_Focus.bFocusJJCParty, + onCheck = function(bChecked) + MY_Focus.bFocusJJCParty = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Auto focus enemy in arena'], + checked = MY_Focus.bFocusJJCEnemy, + onCheck = function(bChecked) + MY_Focus.bFocusJJCEnemy = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Show focus\'s target'], + checked = MY_Focus.bShowTarget, + onCheck = function(bChecked) + MY_Focus.bShowTarget = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Hide dead object'], + checked = MY_Focus.bHideDeath, + onCheck = function(bChecked) + MY_Focus.bHideDeath = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Display kungfu icon instead of location'], + checked = MY_Focus.bDisplayKungfuIcon, + onCheck = function(bChecked) + MY_Focus.bDisplayKungfuIcon = bChecked + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_SortByDistance', + x = x, y = y, w = wr, + text = _L['Sort by distance'], + checked = MY_Focus.bSortByDistance, + onCheck = function(bChecked) + MY_Focus.bSortByDistance = bChecked + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_EnableSceneNavi', + x = x, y = y, w = wr, + text = _L['Enable scene navi'], + checked = MY_Focus.bEnableSceneNavi, + onCheck = function(bChecked) + MY_Focus.bEnableSceneNavi = bChecked + MY_Focus.RescanNearby() + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Show tip at right bottom'], + checked = MY_Focus.bShowTipRB, + onCheck = function(bChecked) + MY_Focus.bShowTipRB = bChecked + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + x = x + ui:Append('WndCheckBox', { + x = x, y = y, w = wr, text = _L['Heal healper'], + tip = { + render = _L['Select target when mouse enter'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_Focus.bHealHelper, + onCheck = function(bChecked) + MY_Focus.bHealHelper = bChecked + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }):AutoWidth():Width() + 5 + + ui:Append('WndComboBox', { + x = x, y = y, w = wr, text = _L['Distance type'], + menu = function() + return X.GetDistanceTypeMenu(true, MY_Focus.szDistanceType, function(p) + MY_Focus.szDistanceType = p.szType + end) + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }):AutoWidth() + + x = xr + y = y + deltaY + + ui:Append('WndSlider', { + x = x, y = y, w = 150, + textFormatter = function(val) return _L('Max display count %d.', val) end, + range = {1, 20}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = MY_Focus.nMaxDisplay, + onChange = function(val) + MY_Focus.nMaxDisplay = val + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndSlider', { + x = x, y = y, w = 150, + textFormatter = function(val) return _L('Current scale-x is %d%%.', val) end, + range = {10, 300}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = MY_Focus.fScaleX * 100, + onChange = function(val) + MY_Focus.fScaleX = val / 100 + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY + + ui:Append('WndSlider', { + x = x, y = y, w = 150, + textFormatter = function(val) return _L('Current scale-y is %d%%.', val) end, + range = {10, 300}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = MY_Focus.fScaleY * 100, + onChange = function(val) + MY_Focus.fScaleY = val / 100 + end, + autoEnable = function() return MY_Focus.IsEnabled() end, + }) + y = y + deltaY +end +X.Panel.Register(_L['Target'], 'MY_Focus', _L['Focus list'], 'ui/Image/button/SystemButton_1.UITex|9', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Focus/src/MY_Focus.UI.lua b/MY_Focus/src/MY_Focus.UI.lua new file mode 100644 index 000000000..1cf0da9f3 --- /dev/null +++ b/MY_Focus/src/MY_Focus.UI.lua @@ -0,0 +1,675 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 焦点列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Focus/MY_Focus.UI' +local PLUGIN_NAME = 'MY_Focus' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Focus' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Focus/ui/MY_Focus.ini' +local D = { + GetDisplayList = MY_Focus.GetDisplayList , + IsShielded = MY_Focus.IsShielded , + SortFocus = MY_Focus.SortFocus , + RescanNearby = MY_Focus.RescanNearby , + RemoveFocusID = MY_Focus.RemoveFocusID , + OnObjectEnterScene = MY_Focus.OnObjectEnterScene, + OnObjectLeaveScene = MY_Focus.OnObjectLeaveScene, +} +local TEMP_TARGET_TYPE, TEMP_TARGET_ID +local l_dwLockType, l_dwLockID, l_lockInDisplay + +function D.AdjustScaleRatio(frame, hList) + local hTotal = frame:Lookup('', '') + local hList = hTotal:Lookup('Handle_List') + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + -- 导航保持比例 + local hL = hItem:Lookup('Handle_L') + local nDeltaX = hL:GetH() / 70 * 50 - hL:GetW() + local fScaleL = 1 + nDeltaX / hL:GetW() + hL:Scale(fScaleL, 1) + local hR = hItem:Lookup('Handle_R') + local fScaleR = (hItem:GetW() - hL:GetW()) / hR:GetW() + hR:Scale(fScaleR, 1) + hR:SetRelX(hL:GetW()) + hItem:FormatAllItemPos() + -- 图标保持比例 + local hInfoList = hItem:Lookup('Handle_R/Handle_InfoList') + for i = 0, hInfoList:GetItemCount() - 1 do + local hInfo = hInfoList:Lookup(i) + hInfo:Scale(hInfo:GetH() / hInfo:GetW(), 1) + end + hInfoList:FormatAllItemPos() + -- 字体大小 + X.UI(hItem):Find('.Text'):FontScale(frame.fScaleY) + end + local nW, nH = hTotal:Lookup('Image_Title'):GetSize() + hTotal:Lookup('Text_Title'):SetRelX(nH * 1.1) + local btnSetting = frame:Lookup('Btn_Setting') + btnSetting:SetRelX(nH * 0.2) + btnSetting:Scale(btnSetting:GetH() / btnSetting:GetW(), 1) + local btnClose = frame:Lookup('Btn_Close') + btnClose:SetRelX(nW - nH) + btnClose:Scale(btnClose:GetH() / btnClose:GetW(), 1) + local chkMinimize = frame:Lookup('CheckBox_Minimize') + chkMinimize:Scale(chkMinimize:GetH() / chkMinimize:GetW(), 1) + chkMinimize:SetRelX(btnClose:GetRelX() - chkMinimize:GetW() - nH * 0.1) + hTotal:FormatAllItemPos() +end + +function D.Scale(frame) + if frame.fScaleX and frame.fScaleY then + frame:Scale(1 / frame.fScaleX, 1 / frame.fScaleY) + end + frame.fScaleX = MY_Focus.fScaleX + frame.fScaleY = MY_Focus.fScaleY + frame:Scale(frame.fScaleX, frame.fScaleY) + X.UI(frame):Find('.Text'):FontScale(frame.fScaleY) + D.AdjustScaleRatio(frame) +end + +function D.CreateList(frame) + local hList = frame:Lookup('', 'Handle_List') + hList:Clear() + for i = 1, MY_Focus.nMaxDisplay do + local hItem = hList:AppendItemFromIni(INI_PATH, 'Handle_Info') + if frame.fScaleX and frame.fScaleY then + hItem:Scale(frame.fScaleX, frame.fScaleY) + end + if X.UI.IS_GLASSMORPHISM then + hItem:Lookup('Handle_L/Handle_Compass/Image_Player'):SetSize(35, 35) + hItem:Lookup('Handle_L/Handle_Compass/Image_Player'):SetRelPos(2.5, -0.8) + hItem:FormatAllItemPos() + end + hItem:Hide() + end + hList:FormatAllItemPos() + D.AdjustScaleRatio(frame) +end + +function D.Open() + X.UI.OpenFrame(INI_PATH, 'MY_FocusUI') +end + +function D.Close() + local hFrame = D.GetFrame() + if hFrame then + X.UI.CloseFrame(hFrame) + end +end + +function D.GetFrame(szWnd, szItem) + if szWnd then + if szItem then + return Station.Lookup('Normal/MY_FocusUI/' .. szWnd, szItem) + else + return Station.Lookup('Normal/MY_FocusUI/' .. szWnd) + end + else + return Station.Lookup('Normal/MY_FocusUI') + end +end + +-- 自适应调整界面大小 +function D.AutosizeUI(frame) + local nHeight = 0 + local hList = frame:Lookup('', 'Handle_List') + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + if hItem:IsVisible() then + nHeight = nHeight + hItem:GetH() + end + end + hList:SetH(nHeight) + hList:SetVisible(not MY_Focus.bMinimize) + frame:SetVisible(nHeight > 0 or not MY_Focus.bAutoHide) + frame:SetH((MY_Focus.bMinimize and 0 or nHeight) + frame:Lookup('', 'Image_Title'):GetH()) +end + +-- 绘制指定的焦点Handle +function D.UpdateItem(hItem, p) + local dwType, dwID = p.dwType, p.dwID + local szVia, tRule = p.szVia, p.tRule + local bDeletable = p.bDeletable + local KObject = X.GetTargetHandle(dwType, dwID) + local tMemberInfo = X.GetTeamMemberInfo(dwID) + local szName = tRule and X.ReplaceSensitiveWord(tRule.szDisplay) + if not szName or szName == '' then + szName = X.GetTargetName(dwType, dwID) + end + local player = X.GetClientPlayer() + if not KObject then + return + end + hItem.dwType = dwType + hItem.dwID = dwID + hItem.szVia = szVia + hItem.bDeletable = bDeletable + + ---------- 左侧 ---------- + -- 小图标列表 + local hInfoList = hItem:Lookup('Handle_R/Handle_InfoList') + -- 锁定 + hInfoList:Lookup('Handle_Lock'):Hide() + if dwType == l_dwLockType and dwID == l_dwLockID then + l_lockInDisplay = true + hInfoList:Lookup('Handle_Lock'):Show() + end + -- 心法 + hInfoList:Lookup('Handle_Kungfu'):Hide() + if dwType == TARGET.PLAYER then + if tMemberInfo and tMemberInfo.dwActualKungfuID then + hItem:Lookup('Handle_L/Handle_KungfuName/Text_Kungfu'):SetText(X.GetKungfuName(tMemberInfo.dwActualKungfuID)) + hInfoList:Lookup('Handle_Kungfu'):Show() + hInfoList:Lookup('Handle_Kungfu/Image_Kungfu'):FromIconID(Table_GetSkillIconID(tMemberInfo.dwActualKungfuID, 1)) + else + local kungfu = KObject.GetKungfuMount() + if kungfu then + hItem:Lookup('Handle_L/Handle_KungfuName/Text_Kungfu'):SetText(X.GetKungfuName(kungfu.dwSkillID)) + hInfoList:Lookup('Handle_Kungfu'):Show() + hInfoList:Lookup('Handle_Kungfu/Image_Kungfu'):FromIconID(Table_GetSkillIconID(kungfu.dwSkillID, 1)) + else + hItem:Lookup('Handle_L/Handle_KungfuName/Text_Kungfu'):SetText(g_tStrings.tForceTitle[KObject.dwForceID]) + hInfoList:Lookup('Handle_Kungfu'):Show() + hInfoList:Lookup('Handle_Kungfu/Image_Kungfu'):FromUITex(GetForceImage(KObject.dwForceID)) + end + end + else + hItem:Lookup('Handle_L/Handle_KungfuName/Text_Kungfu'):SetText('') + end + -- 阵营 + hInfoList:Lookup('Handle_Camp'):Hide() + if dwType == TARGET.PLAYER then + local szCampImg, nCampFrame = X.GetCampImage(KObject.nCamp, KObject.bCampFlag) + if szCampImg then + hInfoList:Lookup('Handle_Camp'):Show() + hInfoList:Lookup('Handle_Camp/Image_Camp'):FromUITex(szCampImg, nCampFrame) + end + end + -- 标记 + hInfoList:Lookup('Handle_Mark'):Hide() + local KTeam = GetClientTeam() + if KTeam and X.IsClientPlayerInParty() and (dwType == TARGET.NPC or dwType == TARGET.PLAYER) then + local tMark = KTeam.GetTeamMark() + if tMark then + local nMarkID = tMark[dwID] + if nMarkID then + hInfoList:Lookup('Handle_Mark'):Show() + hInfoList:Lookup('Handle_Mark/Image_Mark'):FromUITex(PARTY_MARK_ICON_PATH, PARTY_MARK_ICON_FRAME_LIST[nMarkID]) + end + end + end + -- 角色备注 + hInfoList:Lookup('Handle_MY_PlayerRemark'):SetVisible(szVia == _L['MY_PlayerRemark']) + hInfoList:FormatAllItemPos() + + -- 目标距离 + local nDistance = 0 + if player then + nDistance = math.floor(X.GetCharacterDistance(player, KObject, MY_Focus.szDistanceType) * 10) / 10 + end + hItem:Lookup('Handle_L/Handle_Compass/Compass_Distance'):SetText(nDistance) + hItem:Lookup('Handle_L/Handle_School/School_Distance'):SetText(nDistance) + -- 自身面向 + if player then + hItem:Lookup('Handle_L/Handle_Compass/Image_Player'):Show() + hItem:Lookup('Handle_L/Handle_Compass/Image_Player'):SetRotate( - player.nFaceDirection / 128 * math.pi) + end + -- 左侧主要部分 + if MY_Focus.bDisplayKungfuIcon and dwType == TARGET.PLAYER then + hItem:Lookup('Handle_L/Handle_Compass'):Hide() + hItem:Lookup('Handle_L/Handle_School'):Show() + -- 心法图标 + if tMemberInfo and tMemberInfo.dwActualKungfuID then + hItem:Lookup('Handle_L/Handle_School/Image_School'):FromIconID(Table_GetSkillIconID(tMemberInfo.dwActualKungfuID, 1)) + else + local kungfu = KObject.GetKungfuMount() + if kungfu then + hItem:Lookup('Handle_L/Handle_School/Image_School'):FromIconID(Table_GetSkillIconID(kungfu.dwSkillID, 1)) + else + hItem:Lookup('Handle_L/Handle_School/Image_School'):FromUITex(GetForceImage(KObject.dwForceID)) + end + end + else + hItem:Lookup('Handle_L/Handle_School'):Hide() + hItem:Lookup('Handle_L/Handle_Compass'):Show() + -- 相对位置 + hItem:Lookup('Handle_L/Handle_Compass/Image_PointRed'):Hide() + hItem:Lookup('Handle_L/Handle_Compass/Image_PointGreen'):Hide() + if player and nDistance > 0 then + local h + if (dwType == TARGET.NPC or dwType == TARGET.PLAYER) and X.IsCharacterRelationEnemy(X.GetClientPlayerID(), dwID) then + h = hItem:Lookup('Handle_L/Handle_Compass/Image_PointRed') + else + h = hItem:Lookup('Handle_L/Handle_Compass/Image_PointGreen') + end + h:Show() + local nRotate = 0 + -- 特判角度 + if player.nX == KObject.nX then + if player.nY > KObject.nY then + nRotate = math.pi / 2 + else + nRotate = - math.pi / 2 + end + else + nRotate = math.atan((player.nY - KObject.nY) / (player.nX - KObject.nX)) + end + if nRotate < 0 then + nRotate = nRotate + math.pi + end + if KObject.nY < player.nY then + nRotate = math.pi + nRotate + end + local nRadius = 13.5 + h:SetRelPos((nRadius + nRadius * math.cos(nRotate) + 2) * MY_Focus.fScaleY, (nRadius - 3 - 13.5 * math.sin(nRotate)) * MY_Focus.fScaleY) + h:GetParent():FormatAllItemPos() + end + end + ---------- 右侧 ---------- + -- 名字 + hItem:Lookup('Handle_R/Handle_LMN/Text_Name'):SetText(szName or KObject.dwID) + -- 血量 + if dwType == TARGET.DOODAD then + hItem:Lookup('Handle_R/Handle_LMN/Image_Health'):SetPercentage(1) + hItem:Lookup('Handle_R/Handle_LMN/Text_Health'):SetText('') + hItem:Lookup('Handle_R/Handle_LMN/Image_Mana'):SetPercentage(1) + hItem:Lookup('Handle_R/Handle_LMN/Text_Mana'):SetText('') + else + local fCurrentLife, fMaxLife = X.GetCharacterLife(tMemberInfo or KObject) + local nCurrentMana, nMaxMana = tMemberInfo and tMemberInfo.nCurrentMana or KObject.nCurrentMana, tMemberInfo and tMemberInfo.nMaxMana or KObject.nMaxMana + local szLife = X.FormatNumberDot(fCurrentLife, 1) + if fMaxLife > 0 then + local nPercent = math.floor(fCurrentLife / fMaxLife * 100) + if nPercent > 100 then + nPercent = 100 + end + szLife = szLife .. '(' .. nPercent .. '%)' + hItem:Lookup('Handle_R/Handle_LMN/Image_Health'):SetPercentage(fCurrentLife / fMaxLife) + hItem:Lookup('Handle_R/Handle_LMN/Text_Health'):SetText(szLife) + end + if nMaxMana > 0 then + hItem:Lookup('Handle_R/Handle_LMN/Image_Mana'):SetPercentage(nCurrentMana / nMaxMana) + hItem:Lookup('Handle_R/Handle_LMN/Text_Mana'):SetText(X.FormatNumberDot(nCurrentMana, 1) .. '/' .. X.FormatNumberDot(nMaxMana, 1)) + end + end + -- 读条 + if dwType ~= TARGET.DOODAD then + local nType, dwSkillID, dwSkillLevel, fProgress = X.GetCharacterOTActionState(KObject) + if (nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE) + and dwSkillID and dwSkillLevel then + hItem:Lookup('Handle_R/Handle_Progress/Image_Progress'):SetPercentage(fProgress or 0) + hItem:Lookup('Handle_R/Handle_Progress/Text_Progress'):SetText(X.GetSkillName(dwSkillID, dwSkillLevel) or '') + else + hItem:Lookup('Handle_R/Handle_Progress/Image_Progress'):SetPercentage(0) + hItem:Lookup('Handle_R/Handle_Progress/Text_Progress'):SetText('') + end + end + -- 目标的目标 + if MY_Focus.bShowTarget and dwType ~= TARGET.DOODAD then + local tp, id = KObject.GetTarget() + local tar = X.GetTargetHandle(tp, id) + if tar then + hItem:Lookup('Handle_R/Handle_Progress/Text_Target'):SetText(X.GetTargetName(tp, id)) + else + hItem:Lookup('Handle_R/Handle_Progress/Text_Target'):SetText('') + end + end + -- 精耐 + local nSpirit, nMaxSpirit = X.GetCharacterSpirit(KObject) + local nEndurance, nMaxEndurance = X.GetCharacterEndurance(KObject) + if nSpirit and nMaxSpirit and nEndurance and nMaxEndurance then + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Taichi/Animate_SpiritEndurance_Taichi_SpiritBar'):SetAnimateType(ANIMATE.BOTTOM_TOP) + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Taichi/Animate_SpiritEndurance_Taichi_SpiritBar'):SetPercentage(nSpirit / nMaxSpirit) + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Taichi/Animate_SpiritEndurance_Taichi_EnduranceBar'):SetAnimateType(ANIMATE.BOTTOM_TOP) + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Taichi/Animate_SpiritEndurance_Taichi_EnduranceBar'):SetPercentage(nEndurance / nMaxEndurance) + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Number/Handle_SpiritNum/Text_Spirit_Num'):SetText(nSpirit) + hItem:Lookup('Handle_SpiritEndurance/Handle_SpiritEndurance_Number/Handle_EnduranceNum/Text_Endurance_Num'):SetText(nEndurance) + hItem:Lookup('Handle_SpiritEndurance'):Show() + else + hItem:Lookup('Handle_SpiritEndurance'):Hide() + end + -- 选中状态 + hItem:Lookup('Image_Select'):Hide() + if player then + local dwTargetType, dwTargetID = player.GetTarget() + if dwTargetType == dwType and dwTargetID == dwID then + hItem:Lookup('Image_Select'):Show() + end + end + hItem:FormatAllItemPos() +end + +-- 更新列表 +local NAVIGATOR_CACHE = {} +function D.UpdateList(frame) + l_lockInDisplay = false + local nCount = 0 + local tKeep = {} + local hList = frame:Lookup('', 'Handle_List') + local aList = D.GetDisplayList() + for i = 1, hList:GetItemCount() do + local p = aList[i] + local hItem = hList:Lookup(i - 1) + if p then + if not hItem:IsVisible() then + hItem:Show() + end + D.UpdateItem(hItem, p) + if MY_Focus.bEnableSceneNavi and Navigator_SetID then + local szKey = 'MY_FOCUS.' .. p.dwType .. '_' .. p.dwID + local szText = p.tRule and p.tRule.szDisplay ~= '' and X.ReplaceSensitiveWord(p.tRule.szDisplay) or p.szName + if NAVIGATOR_CACHE[szKey] ~= szText then + Navigator_SetID(szKey, p.dwType, p.dwID, szText) + end + tKeep[szKey] = szText + end + nCount = nCount + 1 + elseif hItem:IsVisible() then + hItem:Hide() + end + end + if frame.nCount ~= nCount then + D.AutosizeUI(frame) + frame.nCount = nCount + end + if Navigator_Remove then + for szKey, _ in pairs(NAVIGATOR_CACHE) do + if not tKeep[szKey] then + Navigator_Remove(szKey) + end + end + end + NAVIGATOR_CACHE = tKeep +end + +-- ########################################################################## -- +-- # # # -- +-- # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # -- +-- # # # # # # # # # # # # # # -- +-- # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # -- +-- # # # # -- +-- ########################################################################## -- +-- 周期重绘 +function D.OnFrameBreathe() + if not D.IsShielded() then + if l_dwLockType and l_dwLockID and l_lockInDisplay then + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + if dwType ~= l_dwLockType or dwID ~= l_dwLockID then + X.SetClientPlayerTarget(l_dwLockType, l_dwLockID) + end + end + if MY_Focus.bSortByDistance then + D.SortFocus() + end + end + D.UpdateList(this) +end + +function D.OnFrameCreate() + this:RegisterEvent('PARTY_SET_MARK') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('PLAYER_ENTER_SCENE') + this:RegisterEvent('NPC_ENTER_SCENE') + this:RegisterEvent('DOODAD_ENTER_SCENE') + this:RegisterEvent('PLAYER_LEAVE_SCENE') + this:RegisterEvent('NPC_LEAVE_SCENE') + this:RegisterEvent('DOODAD_LEAVE_SCENE') + this:RegisterEvent('MY_SET_IMPORTANT_NPC') + this:RegisterEvent('MY_FOCUS_LOCK_UPDATE') + this:RegisterEvent('MY_FOCUS_SCALE_UPDATE') + this:RegisterEvent('MY_FOCUS_MAX_DISPLAY_UPDATE') + this:RegisterEvent('MY_FOCUS_AUTO_HIDE_UPDATE') + this:RegisterEvent('MY_FOCUS_MINIMIZE_UPDATE') + this:Lookup('', 'Text_Title'):SetText(_L['Focus list']) + + D.Scale(this) + D.CreateList(this) + D.OnEvent('UI_SCALED') + D.RescanNearby() +end + +function D.OnFrameDestroy() + if Navigator_Remove then + for szKey, _ in pairs(NAVIGATOR_CACHE) do + Navigator_Remove(szKey) + end + NAVIGATOR_CACHE = {} + end +end + +function D.OnEvent(event) + if event == 'PARTY_SET_MARK' then + D.UpdateList(this) + elseif event == 'UI_SCALED' then + X.UI(this):Anchor(MY_Focus.anchor) + elseif event == 'PLAYER_ENTER_SCENE' then + D.OnObjectEnterScene(TARGET.PLAYER, arg0) + elseif event == 'NPC_ENTER_SCENE' then + D.OnObjectEnterScene(TARGET.NPC, arg0) + elseif event == 'DOODAD_ENTER_SCENE' then + D.OnObjectEnterScene(TARGET.DOODAD, arg0) + elseif event == 'PLAYER_LEAVE_SCENE' then + D.OnObjectLeaveScene(TARGET.PLAYER, arg0) + elseif event == 'NPC_LEAVE_SCENE' then + D.OnObjectLeaveScene(TARGET.NPC, arg0) + elseif event == 'DOODAD_LEAVE_SCENE' then + D.OnObjectLeaveScene(TARGET.DOODAD, arg0) + elseif event == 'MY_SET_IMPORTANT_NPC' then + D.RescanNearby() + elseif event == 'MY_FOCUS_LOCK_UPDATE' then + D.UpdateList(this) + elseif event == 'MY_FOCUS_SCALE_UPDATE' then + D.Scale(this) + elseif event == 'MY_FOCUS_MAX_DISPLAY_UPDATE' then + D.CreateList(this) + elseif event == 'MY_FOCUS_AUTO_HIDE_UPDATE' then + D.AutosizeUI(this) + elseif event == 'MY_FOCUS_MINIMIZE_UPDATE' then + D.AutosizeUI(this) + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + MY_Focus.anchor = X.UI(this):Anchor('TOPRIGHT') +end + +function D.OnFrameDragSetPosEnd() + this:CorrectPos() +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Info' then + this:Lookup('Image_Hover'):Show() + if MY_Focus.bHealHelper then + local me = X.GetClientPlayer() + TEMP_TARGET_TYPE, TEMP_TARGET_ID = X.GetCharacterTarget(me) + X.SetClientPlayerTarget(this.dwType, this.dwID) + end + D.OnItemRefreshTip() + end +end + +function D.OnItemRefreshTip() + local name = this:GetName() + if name == 'Handle_Info' then + local Rect + if not MY_Focus.bShowTipRB then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + Rect = { x, y, w, h } + end + X.OutputObjectTip(Rect, this.dwType, this.dwID, GetFormatText(_L['Via:'] .. this.szVia .. '\n', 82)) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Info' then + if this:Lookup('Image_Hover') then + if MY_Focus.bHealHelper and TEMP_TARGET_TYPE and TEMP_TARGET_ID then + X.SetClientPlayerTarget(TEMP_TARGET_TYPE, TEMP_TARGET_ID) + TEMP_TARGET_TYPE, TEMP_TARGET_ID = nil + end + this:Lookup('Image_Hover'):Hide() + end + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Info' then + if MY_Focus.bHealHelper then + TEMP_TARGET_TYPE, TEMP_TARGET_ID = nil + end + X.SetClientPlayerTarget(this.dwType, this.dwID) + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Handle_Info' then + local dwType, dwID = this.dwType, this.dwID + local t = X.InsertPlayerContextMenu({}, this:Lookup('Handle_R/Handle_LMN/Text_Name'):GetText(), dwID) + if this.bDeletable then + table.insert(t, 1, { + szOption = _L['Delete focus'], + fnAction = function() + if l_dwLockType == dwType and l_dwLockID == dwID then + l_dwLockType = nil + l_dwLockID = nil + end + D.RemoveFocusID(dwType, dwID) + end, + }) + else + table.insert(t, 1, { + szOption = _L['Option'], + fnAction = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_Focus') + end, + }) + end + table.insert(t, { + szOption = _L['Copy information'], + fnAction = function() + local aText = { + 'Type: ' .. dwType, + 'ID: ' .. dwID, + } + local obj = X.GetTargetHandle(dwType, dwID) + if obj then + table.insert(aText, 'Name: ' .. X.GetTargetName(dwType, dwID)) + table.insert(aText, 'TemplateID: ' .. obj.dwTemplateID) + table.insert(aText, 'Pos: ' .. '[' .. X.GetMapID() .. '] ' .. obj.nX .. ', ' .. obj.nY .. ', ' .. obj.nZ) + end + X.UI.OpenTextEditor((table.concat(aText, '\n'))) + end, + }) + local bLock = dwType == l_dwLockType and dwID == l_dwLockID + table.insert(t, { + szOption = bLock and _L['Unlock focus'] or _L['Lock focus'], + fnAction = function() + if bLock then + l_dwLockID = nil + l_dwLockType = nil + else + l_dwLockID = dwID + l_dwLockType = dwType + X.SetClientPlayerTarget(dwType, dwID) + end + FireUIEvent('MY_FOCUS_LOCK_UPDATE') + end, + }) + PopupMenu(t) + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Setting' then + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_Focus') + elseif name == 'Btn_Close' then + D.Close() + end +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_Minimize' then + MY_Focus.bMinimize = true + FireUIEvent('MY_FOCUS_MINIMIZE_UPDATE') + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + if name == 'CheckBox_Minimize' then + MY_Focus.bMinimize = false + FireUIEvent('MY_FOCUS_MINIMIZE_UPDATE') + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_FocusUI', + exports = { + { + preset = 'UIEvent', + fields = { + 'Open', + 'Close', + }, + root = D, + }, + }, +} +MY_FocusUI = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_FocusUI', function() + if MY_Focus.IsEnabled() then + D.Open() + else + D.Close() + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Focus/src/MY_Focus.lua b/MY_Focus/src/MY_Focus.lua new file mode 100644 index 000000000..df6d613d2 --- /dev/null +++ b/MY_Focus/src/MY_Focus.lua @@ -0,0 +1,1359 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 焦点列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Focus/MY_Focus' +local PLUGIN_NAME = 'MY_Focus' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Focus' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_Focus', { ['*'] = false }) +X.RegisterRestriction('MY_Focus.MapRestriction', { ['*'] = true }) +X.RegisterRestriction('MY_Focus.SHILDED_NPC', { ['*'] = true }) +X.RegisterRestriction('MY_Focus.CHANGGE_SHADOW', { ['*'] = true }) +-------------------------------------------------------------------------- + +local CHANGGE_REAL_SHADOW_TPLID = 46140 -- 清绝歌影 的主体影子 +local FOCUS_LIST = {} +local TEAMMON_FOCUS = {} +local l_tTempFocusList = { + [TARGET.PLAYER] = {}, -- dwID + [TARGET.NPC] = {}, -- dwTemplateID + [TARGET.DOODAD] = {}, -- dwTemplateID +} +local O = X.CreateUserSettingsModule('MY_Focus', _L['Target'], { + bEnable = { -- 是否启用 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bMinimize = { -- 是否最小化 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Minimize'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoHide = { -- 无焦点时隐藏 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Hide when empty'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nMaxDisplay = { -- 最大显示数量 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Max display count'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 5, + }, + fScaleX = { -- 缩放比例 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Scale-x'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + fScaleY = { -- 缩放比例 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Scale-y'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + anchor = { -- 默认坐标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x=-300, y=220, s='TOPRIGHT', r='TOPRIGHT' }, + }, + bFocusINpc = { -- 焦点重要NPC + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus very important npc'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bFocusFriend = { -- 焦点附近好友 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus friend'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFocusTong = { -- 焦点帮会成员 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus tong'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOnlyPublicMap = { -- 仅在公共地图焦点好友帮会成员 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus only in public map'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSortByDistance = { -- 优先焦点近距离目标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Sort by distance'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFocusEnemy = { -- 焦点敌对玩家 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus enemy'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFocusPlayerRemark = { -- 焦点角色备注记录在案的目标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['MY_PlayerRemark auto focus'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoFocus = { -- 启用默认焦点 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTeamMonFocus = { -- 启用团队监控焦点 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['TeamMon focus'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bHideDeath = { -- 隐藏死亡目标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Hide dead object'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bDisplayKungfuIcon = { -- 显示心法图标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Display kungfu icon instead of location'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFocusJJCParty = { -- 焦点名剑大会队友 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus party in arena'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFocusJJCEnemy = { -- 焦点名剑大会敌队 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus enemy in arena'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTarget = { -- 显示目标目标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Show focus\'s target'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + szDistanceType = { -- 坐标距离计算方式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Distance type'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'global', + }, + bHealHelper = { -- 辅助治疗模式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Heal healper'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTipRB = { -- 在屏幕右下角显示信息 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Show tip at right bottom'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEnableSceneNavi = { -- 场景追踪点 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Enable scene navi'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + aPatternFocus = { -- 默认焦点 + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Auto focus data'], + }), + xSchema = X.Schema.Collection(X.Schema.Record({ + szMethod = X.Schema.String, + szPattern = X.Schema.String, + szDisplay = X.Schema.String, + dwMapID = X.Schema.Number, + tType = X.Schema.MixedTable({ + bAll = X.Schema.Optional(X.Schema.Boolean), + [TARGET.NPC] = X.Schema.Optional(X.Schema.Boolean), + [TARGET.PLAYER] = X.Schema.Optional(X.Schema.Boolean), + [TARGET.DOODAD] = X.Schema.Optional(X.Schema.Boolean), + }), + tRelation = X.Schema.Record({ + bAll = X.Schema.Optional(X.Schema.Boolean), + bEnemy = X.Schema.Optional(X.Schema.Boolean), + bAlly = X.Schema.Optional(X.Schema.Boolean), + }), + tLife = X.Schema.Record({ + bEnable = X.Schema.Boolean, + szOperator = X.Schema.String, + nValue = X.Schema.Number, + }), + nMaxDistance = X.Schema.Number, + })), + xDefaultValue = {}, + }, + tStaticFocus = { -- 永久焦点 + ePathType = X.PATH_TYPE.SERVER, + szLabel = _L['MY_Focus'], + szDescription = X.MakeCaption({ + _L['Static focus data'], + }), + xSchema = X.Schema.MixedTable({ + [TARGET.PLAYER] = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), -- dwID + [TARGET.NPC] = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), -- dwTemplateID + [TARGET.DOODAD] = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), -- dwTemplateID + }), + xDefaultValue = { + [TARGET.PLAYER] = {}, -- dwID + [TARGET.NPC] = {}, -- dwTemplateID + [TARGET.DOODAD] = {}, -- dwTemplateID + }, + }, +}) +local D = {} + +function D.IsShielded() + if X.IsRestricted('MY_Focus') then + return true + end + return X.IsRestricted('MY_Focus.MapRestriction') and X.IsInShieldedMap() +end + +function D.IsEnabled() + return O.bEnable and not D.IsShielded() +end + +do +local ds = { + szMethod = 'NAME', + szPattern = '', + szDisplay = '', + dwMapID = -1, + tType = { + bAll = true, + [TARGET.NPC] = false, + [TARGET.PLAYER] = false, + [TARGET.DOODAD] = false, + }, + tRelation = { + bAll = true, + bEnemy = false, + bAlly = false, + }, + tLife = { + bEnable = false, + szOperator = '>', + nValue = 0, + }, + nMaxDistance = 0, +} +function D.FormatAutoFocusData(data) + return X.FormatDataStructure(data, ds) +end +local dsl = { + '__META__', + __VALUE__ = {}, + __CHILD_TEMPLATE__ = ds, +} +function D.FormatAutoFocusDataList(datalist) + return X.FormatDataStructure(datalist, dsl) +end +end + +function D.CheckFrameOpen(bForceReload) + if D.IsEnabled() then + if bForceReload then + MY_FocusUI.Close() + end + MY_FocusUI.Open() + else + MY_FocusUI.Close() + end +end + +function D.LoadConfig() + local szRolePath = X.FormatPath({'config/focus.jx3dat', X.PATH_TYPE.ROLE}) + local szGlobalPath = X.FormatPath({'config/focus/', X.PATH_TYPE.GLOBAL}) + local szServerPath = X.FormatPath({'config/focus/', X.PATH_TYPE.SERVER}) + local aPath = {} + for _, szPath in ipairs(CPath.GetFileList(szGlobalPath)) do + table.insert(aPath, szGlobalPath .. szPath) + end + for _, szPath in ipairs(CPath.GetFileList(szServerPath)) do + table.insert(aPath, szServerPath .. szPath) + end + table.insert(aPath, szRolePath) + for _, szPath in ipairs(aPath) do + local config = X.LoadLUAData(szPath) + CPath.DelFile(szPath) + if config then + for k, v in pairs(config) do + -- 永久焦点与默认焦点数据需要合并处理 + if k == 'tStaticFocus' then + for _, eType in ipairs({ TARGET.PLAYER, TARGET.NPC, TARGET.DOODAD }) do + if not X.IsTable(v[eType]) then + v[eType] = {} + end + for kk, vv in pairs(O.tStaticFocus[eType]) do + pcall(X.Set, v, kk, vv) + end + end + elseif k == 'aPatternFocus' then + for _, vv in ipairs(O.aPatternFocus) do + pcall(table.insert, v, vv) + end + end + pcall(X.Set, O, k, v) + end + end + end + -- 扫描附近玩家 + D.RescanNearby() +end + +function D.OnConfigChange(k, v) + if k == 'bEnable' then + D.CheckFrameOpen() + elseif k == 'fScaleX' or k == 'fScaleY' then + FireUIEvent('MY_FOCUS_SCALE_UPDATE') + elseif k == 'nMaxDisplay' then + FireUIEvent('MY_FOCUS_MAX_DISPLAY_UPDATE') + elseif k == 'bAutoHide' then + FireUIEvent('MY_FOCUS_AUTO_HIDE_UPDATE') + end +end + +function D.GetAllFocusPattern() + return X.Clone(O.aPatternFocus) +end + +-- 添加、修改默认焦点 +function D.SetFocusPattern(szPattern, tData) + local nIndex + szPattern = X.TrimString(szPattern) + for i, v in X.ipairs_r(O.aPatternFocus) do + if v.szPattern == szPattern then + nIndex = i + table.remove(O.aPatternFocus, i) + O.aPatternFocus = O.aPatternFocus + end + end + -- 格式化数据 + if not X.IsTable(tData) then + tData = { szPattern = szPattern } + end + tData = D.FormatAutoFocusData(tData) + -- 更新焦点列表 + if nIndex then + table.insert(O.aPatternFocus, nIndex, tData) + O.aPatternFocus = O.aPatternFocus + else + table.insert(O.aPatternFocus, tData) + O.aPatternFocus = O.aPatternFocus + end + D.RescanNearby() + return tData +end + +-- 删除默认焦点 +function D.RemoveFocusPattern(szPattern) + local p + for i = #O.aPatternFocus, 1, -1 do + if O.aPatternFocus[i].szPattern == szPattern then + p = O.aPatternFocus[i] + table.remove(O.aPatternFocus, i) + O.aPatternFocus = O.aPatternFocus + end + end + if not p then + return + end + -- 刷新UI + if p.szMethod == 'NAME' then + -- 全字符匹配模式:检查是否在永久焦点中 没有则删除Handle (节约性能) + for i = #FOCUS_LIST, 1, -1 do + local p = FOCUS_LIST[i] + local KObject = X.GetTargetHandle(p.dwType, p.dwID) + local dwTemplateID = p.dwType == TARGET.PLAYER and p.dwID or KObject.dwTemplateID + if KObject and X.GetTargetName(p.dwType, p.dwID, { eShowID = 'never' }) == szPattern + and not l_tTempFocusList[p.dwType][p.dwID] + and not O.tStaticFocus[p.dwType][dwTemplateID] then + D.OnObjectLeaveScene(p.dwType, p.dwID) + end + end + else + -- 其他模式:重绘焦点列表 + D.RescanNearby() + end +end + +-- 添加ID焦点 +function D.SetFocusID(dwType, dwID, bSave) + dwType, dwID = tonumber(dwType), tonumber(dwID) + if bSave then + local KObject = X.GetTargetHandle(dwType, dwID) + local dwTemplateID = dwType == TARGET.PLAYER and dwID or KObject.dwTemplateID + if O.tStaticFocus[dwType][dwTemplateID] then + return + end + O.tStaticFocus[dwType][dwTemplateID] = true + O.tStaticFocus = O.tStaticFocus + D.RescanNearby() + else + if l_tTempFocusList[dwType][dwID] then + return + end + l_tTempFocusList[dwType][dwID] = true + D.OnObjectEnterScene(dwType, dwID) + end +end + +-- 删除ID焦点 +function D.RemoveFocusID(dwType, dwID) + dwType, dwID = tonumber(dwType), tonumber(dwID) + if l_tTempFocusList[dwType][dwID] then + l_tTempFocusList[dwType][dwID] = nil + D.OnObjectLeaveScene(dwType, dwID) + end + local KObject = X.GetTargetHandle(dwType, dwID) + local dwTemplateID = dwType == TARGET.PLAYER and dwID or KObject.dwTemplateID + if O.tStaticFocus[dwType][dwTemplateID] then + O.tStaticFocus[dwType][dwTemplateID] = nil + O.tStaticFocus = O.tStaticFocus + D.RescanNearby() + end +end + +-- 清空焦点列表 +function D.ClearFocus() + FOCUS_LIST = {} + FireUIEvent('MY_FOCUS_UPDATE') +end + +-- 重新扫描附近对象更新焦点列表(只增不减) +function D.ScanNearby() + for _, dwID in ipairs(X.GetNearPlayerID()) do + D.OnObjectEnterScene(TARGET.PLAYER, dwID) + end + for _, dwID in ipairs(X.GetNearNpcID()) do + D.OnObjectEnterScene(TARGET.NPC, dwID) + end + for _, dwID in ipairs(X.GetNearDoodadID()) do + D.OnObjectEnterScene(TARGET.DOODAD, dwID) + end +end + +-- 重新扫描附近焦点 +function D.RescanNearby() + D.ClearFocus() + D.ScanNearby() +end +X.RegisterEvent('MY_PLAYER_REMARK_UPDATE', 'MY_Focus', D.RescanNearby) + +function D.GetEligibleRules(tRules, dwMapID, dwType, dwID, dwTemplateID, szName, szTong) + local aRule = {} + for _, v in ipairs(tRules) do + if (v.tType.bAll or v.tType[dwType]) + and (v.dwMapID == -1 or v.dwMapID == dwMapID) + and ( + (v.szMethod == 'NAME' and v.szPattern == szName) + or (v.szMethod == 'NAME_PATT' and szName:find(v.szPattern)) + or (v.szMethod == 'ID' and tonumber(v.szPattern) == dwID) + or (v.szMethod == 'TEMPLATE_ID' and tonumber(v.szPattern) == dwTemplateID) + or (v.szMethod == 'TONG_NAME' and v.szPattern == szTong) + or (v.szMethod == 'TONG_NAME_PATT' and szTong:find(v.szPattern)) + ) then + table.insert(aRule, v) + end + end + return aRule +end + +-- 对象进入视野 +function D.OnObjectEnterScene(dwType, dwID, nRetryCount) + if nRetryCount and nRetryCount > 5 then + return + end + local me = X.GetClientPlayer() + if not me then + return X.DelayCall(5000, function() D.OnObjectEnterScene(dwType, dwID) end) + end + local KObject = X.GetTargetHandle(dwType, dwID) + if not KObject then + return + end + + local szName = X.GetTargetName(dwType, dwID, { eShowID = 'never' }) + -- 解决玩家刚进入视野时名字为空的问题 + if (dwType == TARGET.PLAYER and not szName) or not me then -- 解决自身刚进入场景的时候的问题 + X.DelayCall(300, function() + D.OnObjectEnterScene(dwType, dwID, (nRetryCount or 0) + 1) + end) + else-- if szName then -- 判断是否需要焦点 + if not szName then + szName = X.GetTargetName(dwType, dwID, { eShowID = 'auto' }) + end + local szGlobalID = dwType == TARGET.PLAYER and X.GetPlayerGlobalID(dwID) or nil + local bFocus, aVia = false, {} + local dwMapID = X.GetMapID(true) + local dwTemplateID, szTong = -1, '' + if dwType == TARGET.PLAYER then + if KObject.dwTongID ~= 0 then + szTong = X.GetTongName(KObject.dwTongID, 253) + if not szTong or szTong == '' then -- 解决目标刚进入场景的时候帮会获取不到的问题 + X.DelayCall(300, function() + D.OnObjectEnterScene(dwType, dwID, (nRetryCount or 0) + 1) + end) + end + end + else + dwTemplateID = KObject.dwTemplateID + end + -- 判断临时焦点 + if l_tTempFocusList[dwType][dwID] then + table.insert(aVia, { + bDeletable = true, + szVia = _L['Temp focus'], + }) + bFocus = true + end + -- 判断永久焦点 + if not bFocus then + local dwTemplateID = dwType == TARGET.PLAYER and dwID or KObject.dwTemplateID + if O.tStaticFocus[dwType][dwTemplateID] + and not ( + dwType == TARGET.NPC + and dwTemplateID == CHANGGE_REAL_SHADOW_TPLID + and IsEnemy(X.GetClientPlayerID(), dwID) + and X.IsRestricted('MY_Focus.CHANGGE_SHADOW') + ) then + table.insert(aVia, { + bDeletable = true, + szVia = _L['Static focus'], + }) + bFocus = true + end + end + -- 判断默认焦点 + if not bFocus and O.bAutoFocus then + local aRule = D.GetEligibleRules(O.aPatternFocus, dwMapID, dwType, dwID, dwTemplateID, szName, szTong) + for _, tRule in ipairs(aRule) do + table.insert(aVia, { + tRule = tRule, + bDeletable = false, + szVia = _L['Auto focus'] .. ' ' .. tRule.szPattern, + }) + bFocus = true + end + end + -- 判断团队监控焦点 + if not bFocus and O.bTeamMonFocus then + local aRule = D.GetEligibleRules(TEAMMON_FOCUS, dwMapID, dwType, dwID, dwTemplateID, szName, szTong) + for _, tRule in ipairs(aRule) do + table.insert(aVia, { + tRule = tRule, + bDeletable = false, + szVia = _L['TeamMon focus'] .. ' ' .. tRule.szPattern, + }) + bFocus = true + end + end + + -- 判断名剑大会 + if not bFocus then + if X.IsInCompetitionMap() and not X.IsInBattlefieldMap() then + if dwType == TARGET.PLAYER then + if O.bFocusJJCEnemy and O.bFocusJJCParty then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Auto focus in arena'], + }) + bFocus = true + elseif O.bFocusJJCParty then + if not IsEnemy(X.GetClientPlayerID(), dwID) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Auto focus party in arena'], + }) + bFocus = true + end + elseif O.bFocusJJCEnemy then + if IsEnemy(X.GetClientPlayerID(), dwID) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Auto focus enemy in arena'], + }) + bFocus = true + end + end + elseif dwType == TARGET.NPC then + if O.bFocusJJCParty + and KObject.dwTemplateID == CHANGGE_REAL_SHADOW_TPLID + and not (IsEnemy(X.GetClientPlayerID(), dwID) and X.IsRestricted('MY_Focus.CHANGGE_SHADOW')) then + D.OnRemoveFocus(TARGET.PLAYER, KObject.dwEmployer) + table.insert(aVia, { + bDeletable = false, + szVia = _L['Auto focus party in arena'], + }) + bFocus = true + end + end + else + if not O.bOnlyPublicMap or (not X.IsInCompetitionMap() and not X.IsInDungeonMap()) then + -- 判断角色备注 + if dwType == TARGET.PLAYER + and O.bFocusPlayerRemark + and MY_PlayerRemark + and MY_PlayerRemark.Get then + local tRemark = szGlobalID + and MY_PlayerRemark.Get(szGlobalID) + or MY_PlayerRemark.Get(szName) + if tRemark then + table.insert(aVia, { + bDeletable = false, + szVia = _L['MY_PlayerRemark'] .. '\n' .. _L['PlayerRemark: '] .. tRemark.szRemark, + }) + bFocus = true + end + end + -- 判断好友 + if dwType == TARGET.PLAYER + and O.bFocusFriend + and ( + X.IsFellowship(dwID) + or (szGlobalID and X.IsFellowship(szGlobalID)) + ) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Friend focus'], + }) + bFocus = true + end + -- 判断同帮会 + if dwType == TARGET.PLAYER + and O.bFocusTong + and dwID ~= X.GetClientPlayerInfo().dwID + and X.IsTongMember(dwID) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Tong member focus'], + }) + bFocus = true + end + end + -- 判断敌对玩家 + if dwType == TARGET.PLAYER + and O.bFocusEnemy + and IsEnemy(X.GetClientPlayerID(), dwID) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Enemy focus'], + }) + bFocus = true + end + end + end + + -- 判断重要NPC + if not bFocus and O.bFocusINpc + and dwType == TARGET.NPC + and X.IsImportantNpc(dwMapID, KObject.dwTemplateID) then + table.insert(aVia, { + bDeletable = false, + szVia = _L['Important npc focus'], + }) + bFocus = true + end + + -- 判断屏蔽的NPC + if bFocus and dwType == TARGET.NPC and X.IsShieldedNpc(dwTemplateID, 'FOCUS') and X.IsRestricted('MY_Focus.SHILDED_NPC') then + bFocus = false + end + + -- 加入焦点 + if bFocus then + D.OnSetFocus(dwType, dwID, szName, aVia) + end + end +end + +-- 对象离开视野 +function D.OnObjectLeaveScene(dwType, dwID) + local KObject = X.GetTargetHandle(dwType, dwID) + if KObject then + if dwType == TARGET.NPC then + if D.bReady and O.bFocusJJCParty + and KObject.dwTemplateID == CHANGGE_REAL_SHADOW_TPLID + and X.IsInCompetitionMap() and not (IsEnemy(X.GetClientPlayerID(), dwID) and X.IsRestricted('MY_Focus.SHILDED_NPC')) then + D.OnSetFocus(TARGET.PLAYER, KObject.dwEmployer, X.GetTargetName(dwType, dwID, { eShowID = 'never' }), _L['Auto focus party in arena']) + end + end + end + D.OnRemoveFocus(dwType, dwID) +end + +-- 目标加入焦点列表 +function D.OnSetFocus(dwType, dwID, szName, aVia) + local nIndex + for i, p in ipairs(FOCUS_LIST) do + if p.dwType == dwType and p.dwID == dwID then + nIndex = i + break + end + end + if not nIndex then + table.insert(FOCUS_LIST, { + dwType = dwType, + dwID = dwID, + szName = szName, + aVia = aVia, + }) + nIndex = #FOCUS_LIST + end + FireUIEvent('MY_FOCUS_UPDATE') +end + +-- 目标移除焦点列表 +function D.OnRemoveFocus(dwType, dwID) + -- 从列表数据中删除 + for i = #FOCUS_LIST, 1, -1 do + local p = FOCUS_LIST[i] + if p.dwType == dwType and p.dwID == dwID then + table.remove(FOCUS_LIST, i) + break + end + end + FireUIEvent('MY_FOCUS_UPDATE') +end + +-- 排序 +function D.SortFocus(fn) + local p = X.GetClientPlayer() + fn = fn or function(p1, p2) + p1 = X.GetTargetHandle(p1.dwType, p1.dwID) + p2 = X.GetTargetHandle(p2.dwType, p2.dwID) + if p1 and p2 then + return math.pow(p.nX - p1.nX, 2) + math.pow(p.nY - p1.nY, 2) < math.pow(p.nX - p2.nX, 2) + math.pow(p.nY - p2.nY, 2) + end + return true + end + table.sort(FOCUS_LIST, fn) +end + +-- 获取焦点列表 +function D.GetFocusList() + local t = {} + for _, v in ipairs(FOCUS_LIST) do + table.insert(t, v) + end + return t +end + +-- 获取当前显示的焦点列表 +function D.GetDisplayList() + local t = {} + local me = X.GetClientPlayer() + if not D.IsShielded() and me then + for _, p in ipairs(FOCUS_LIST) do + if #t >= O.nMaxDisplay then + break + end + local KObject = X.GetTargetHandle(p.dwType, p.dwID) + if KObject then + local fCurrentLife, fMaxLife + if p.dwType == TARGET.PLAYER or p.dwType == TARGET.NPC then + fCurrentLife, fMaxLife = X.GetCharacterLife(KObject) + end + local bFocus, tRule, szVia, bDeletable = false + for _, via in ipairs(p.aVia) do + if via.tRule then + local bRuleFocus = true + if bRuleFocus and via.tRule.tLife.bEnable + and fCurrentLife and fMaxLife + and not X.JudgeOperator(via.tRule.tLife.szOperator, fCurrentLife / fMaxLife * 100, via.tRule.tLife.nValue) then + bRuleFocus = false + end + if bRuleFocus and via.tRule.nMaxDistance > 0 + and X.GetCharacterDistance(me, KObject, O.szDistanceType) > via.tRule.nMaxDistance then + bRuleFocus = false + end + if bRuleFocus and not via.tRule.tRelation.bAll then + if X.IsCharacterRelationEnemy(me.dwID, KObject.dwID) then + bRuleFocus = via.tRule.tRelation.bEnemy + else + bRuleFocus = via.tRule.tRelation.bAlly + end + end + if bRuleFocus then + --2025.8.16增加隐藏焦点方法,上述规则满足后,判断最大距离是否为-1,若为-1不显示焦点并跳出规则遍历 + bFocus = via.tRule.nMaxDistance ~= -1 + tRule = via.tRule + szVia = via.szVia + bDeletable = via.bDeletable + break + end + else + bFocus = true + szVia = via.szVia + bDeletable = via.bDeletable + end + end + if bFocus and (p.dwType == TARGET.NPC or p.dwType == TARGET.PLAYER) and X.IsCharacterIsolated(me) ~= X.IsCharacterIsolated(KObject) then + bFocus = false + end + if bFocus and O.bHideDeath then + if p.dwType == TARGET.NPC or p.dwType == TARGET.PLAYER then + bFocus = KObject.nMoveState ~= MOVE_STATE.ON_DEATH + else--if p.dwType == TARGET.DOODAD then + bFocus = KObject.nKind ~= DOODAD_KIND.CORPSE + end + end + if bFocus then + table.insert(t, setmetatable({ + tRule = tRule, + szVia = szVia, + bDeletable = bDeletable, + }, { __index = p })) + end + end + end + end + return t +end + +function D.GetTargetMenu(dwType, dwID) + return {{ + szOption = _L['Add to temp focus list'], + fnAction = function() + if not O.bEnable then + O.bEnable = true + MY_FocusUI.Open() + end + D.SetFocusID(dwType, dwID) + end, + }, { + szOption = _L['Add to static focus list'], + fnAction = function() + if not O.bEnable then + O.bEnable = true + MY_FocusUI.Open() + end + D.SetFocusID(dwType, dwID, true) + end, + }} +end + +function D.FormatRuleText(v, bNoBasic) + local aText = {} + if not bNoBasic then + if not v.tType or v.tType.bAll then + table.insert(aText, _L['All type']) + else + local aSub = {} + for _, eType in ipairs({ TARGET.NPC, TARGET.PLAYER, TARGET.DOODAD }) do + if v.tType[eType] then + table.insert(aSub, _L.TARGET[eType]) + end + end + table.insert(aText, #aSub == 0 and _L['None type'] or table.concat(aSub, '|')) + end + end + if not v.tRelation or v.tRelation.bAll then + table.insert(aText, _L['All relation']) + else + local aSub = {} + for _, szRelation in ipairs({ 'Enemy', 'Ally' }) do + if v.tRelation['b' .. szRelation] then + table.insert(aSub, _L.RELATION[szRelation]) + end + end + table.insert(aText, #aSub == 0 and _L['None relation'] or table.concat(aSub, '|')) + end + if not bNoBasic and v.szPattern then + return v.szPattern .. ' (' .. table.concat(aText, ',') .. ')' + end + return table.concat(aText, ',') +end + +function D.OpenRuleEditor(tData, onChangeNotify, bHideBase) + local tData = D.FormatAutoFocusData(tData) + local frame = X.UI.CreateFrame('MY_Focus_Editor', { close = true, text = _L['Focus rule editor'] }) + local ui = X.UI(frame) + local nPaddingX, nPaddingY, W = 30, 50, 350 + local nX, nY = nPaddingX, nPaddingY + local dY = 27 + if not bHideBase then + W = 450 + -- 匹配方式 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Judge method'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + for i, eType in ipairs({ 'NAME', 'NAME_PATT', 'ID', 'TEMPLATE_ID', 'TONG_NAME', 'TONG_NAME_PATT' }) do + if i == 5 then + nX, nY = nPaddingX + 10, nY + dY + end + nX = ui:Append('WndRadioBox', { + x = nX, y = nY, + group = 'judge_method', + text = _L.JUDGE_METHOD[eType], + checked = tData.szMethod == eType, + onCheck = function() + tData.szMethod = eType + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + end + nX, nY = nPaddingX, nY + dY + -- 目标类型 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Target type'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['All'], + checked = tData.tType.bAll, + onCheck = function() + tData.tType.bAll = not tData.tType.bAll + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + for _, eType in ipairs({ TARGET.NPC, TARGET.PLAYER, TARGET.DOODAD }) do + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L.TARGET[eType], + checked = tData.tType[eType], + onCheck = function() + tData.tType[eType] = not tData.tType[eType] + onChangeNotify(tData) + end, + autoEnable = function() return not tData.tType.bAll end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + end + nX, nY = nPaddingX, nY + dY + end + -- 目标关系 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Target relation'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['All'], + checked = tData.tRelation.bAll, + onCheck = function() + tData.tRelation.bAll = not tData.tRelation.bAll + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + for _, szRelation in ipairs({ 'Enemy', 'Ally' }) do + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L.RELATION[szRelation], + checked = tData.tRelation['b' .. szRelation], + onCheck = function() + tData.tRelation['b' .. szRelation] = not tData.tRelation['b' .. szRelation] + onChangeNotify(tData) + end, + autoEnable = function() return not tData.tRelation.bAll end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + end + nX, nY = nPaddingX, nY + dY + -- 目标血量百分比 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Target life percentage'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, w = 100, h = 25, + text = _L['Enable'], + checked = tData.tLife.bEnable, + onCheck = function() + tData.tLife.bEnable = not tData.tLife.bEnable + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndComboBox', { + x = nX, y = nY, w = 200, + text = X.GetOperatorName(tData.tLife.szOperator or '=='), + menu = function() + local this = this + return X.InsertOperatorMenu( + {}, + tData.tLife.szOperator, + function(szOp) + tData.tLife.szOperator = szOp + onChangeNotify(tData) + X.UI(this):Text(X.GetOperatorName(szOp)) + X.UI.ClosePopupMenu() + end + ) + end, + autoEnable = function() return tData.tLife.bEnable end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndEditBox', { + x = nX, y = nY, w = 100, h = 25, + text = tData.tLife.nValue, + onChange = function(szText) + local nValue = tonumber(szText) or 0 + tData.tLife.nValue = nValue + onChangeNotify(tData) + end, + autoEnable = function() return tData.tLife.bEnable end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX, nY = nPaddingX, nY + dY + -- 最远距离 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Max distance'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + nX = ui:Append('WndEditBox', { + x = nX, y = nY, w = 200, h = 25, + text = tData.nMaxDistance, + onChange = function(szText) + local nValue = tonumber(szText) or 0 + tData.nMaxDistance = nValue + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX, nY = nPaddingX, nY + dY + -- 名称显示 + ui:Append('Text', { x = nX, y = nY, color = {255, 255, 0}, text = _L['Name display'] }):AutoWidth() + nX, nY = nPaddingX + 10, nY + dY + nX = ui:Append('WndEditBox', { + x = nX, y = nY, w = 200, h = 25, + text = tData.szDisplay, + onChange = function(szText) + tData.szDisplay = szText + onChangeNotify(tData) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX, nY = nPaddingX, nY + dY + + nY = nY + 20 + ui:Append('WndButton', { + x = (W - 100) / 2, y = nY, w = 100, + text = _L['Delete'], color = { 255, 0, 0 }, + buttonStyle = 'FLAT', + onClick = function() + X.Confirm(_L['Sure to delete?'], function() + onChangeNotify() + ui:Remove() + end) + end, + }) + nX, nY = nPaddingX, nY + dY + + ui:Size(W, nY + 40):Anchor('CENTER') +end + +do +local function UpdateTeamMonData() + if MY_TeamMon and MY_TeamMon.IterTable and MY_TeamMon.GetTable then + local aFocus = {} + for _, ds in ipairs({ + { szType = 'NPC', dwType = TARGET.NPC}, + { szType = 'DOODAD', dwType = TARGET.DOODAD}, + }) do + for _, data in MY_TeamMon.IterTable(MY_TeamMon.GetTable(ds.szType), 0, true) do + if data.aFocus then + for _, p in ipairs(data.aFocus) do + local rule = X.Clone(p) + rule.szMethod = 'TEMPLATE_ID' + rule.szPattern = tostring(data.dwID) + rule.tType = { + bAll = false, + [TARGET.NPC] = false, + [TARGET.PLAYER] = false, + [TARGET.DOODAD] = false, + } + rule.tType[ds.dwType] = true + table.insert(aFocus, D.FormatAutoFocusData(rule)) + end + end + end + end + TEAMMON_FOCUS = aFocus + D.RescanNearby() + end +end +local function onTeamMonUpdate() + if arg0 and not arg0['NPC'] and not arg0['DOODAD'] then + return + end + UpdateTeamMonData() +end +X.RegisterEvent('MY_TEAM_MON_DATA_RELOAD', 'MY_Focus', onTeamMonUpdate) +end + +do +local function onMenu() + local dwType, dwID = X.GetClientPlayer().GetTarget() + return D.GetTargetMenu(dwType, dwID) +end +X.RegisterTargetAddonMenu('MY_Focus', onMenu) +end + +do +local function onHotKey() + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + local aList = D.GetDisplayList() + local t = aList[1] + if not t then + return + end + for i, p in ipairs(aList) do + if p.dwType == dwType and p.dwID == dwID then + t = aList[i + 1] or t + end + end + X.SetClientPlayerTarget(t.dwType, t.dwID) +end +X.RegisterHotKey('MY_Focus_LoopTarget', _L['Loop target in focus'], onHotKey) +end + +X.RegisterTutorial({ + szKey = 'MY_Focus', + szMessage = _L['Would you like to use MY focus?'], + fnRequire = function() return not O.bEnable end, + { + szOption = _L['Use'], + bDefault = true, + fnAction = function() + O.bEnable = true + MY_FocusUI.Open() + X.Panel.RedrawTab('MY_Focus') + end, + }, + { + szOption = _L['Not use'], + fnAction = function() + O.bEnable = false + MY_FocusUI.Close() + X.Panel.RedrawTab('MY_Focus') + end, + }, +}) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Focus', + exports = { + { + fields = { + 'GetTargetMenu', + 'IsShielded', + 'RescanNearby', + 'IsEnabled', + 'GetAllFocusPattern', + 'SetFocusPattern', + 'RemoveFocusPattern', + 'GetDisplayList', + 'OnObjectEnterScene', + 'OnObjectLeaveScene', + 'SetFocusID', + 'RemoveFocusID', + 'SortFocus', + 'OpenRuleEditor', + 'FormatRuleText', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'bMinimize', + 'bFocusINpc', + 'bFocusFriend', + 'bFocusTong', + 'bOnlyPublicMap', + 'bSortByDistance', + 'bFocusEnemy', + 'bFocusPlayerRemark', + 'bAutoHide', + 'nMaxDisplay', + 'bAutoFocus', + 'bTeamMonFocus', + 'bHideDeath', + 'bDisplayKungfuIcon', + 'bFocusJJCParty', + 'bFocusJJCEnemy', + 'bShowTarget', + 'szDistanceType', + 'bHealHelper', + 'bShowTipRB', + 'bEnableSceneNavi', + 'anchor', + 'fScaleX', + 'fScaleY', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bMinimize', + 'bFocusINpc', + 'bFocusFriend', + 'bFocusTong', + 'bOnlyPublicMap', + 'bSortByDistance', + 'bFocusEnemy', + 'bFocusPlayerRemark', + 'bAutoHide', + 'nMaxDisplay', + 'bAutoFocus', + 'bTeamMonFocus', + 'bHideDeath', + 'bDisplayKungfuIcon', + 'bFocusJJCParty', + 'bFocusJJCEnemy', + 'bShowTarget', + 'szDistanceType', + 'bHealHelper', + 'bShowTipRB', + 'bEnableSceneNavi', + 'anchor', + 'fScaleX', + 'fScaleY', + }, + triggers = { + bEnable = D.OnConfigChange, + bMinimize = D.OnConfigChange, + anchor = D.OnConfigChange, + bFocusINpc = D.OnConfigChange, + bFocusFriend = D.OnConfigChange, + bFocusTong = D.OnConfigChange, + bOnlyPublicMap = D.OnConfigChange, + bSortByDistance = D.OnConfigChange, + bFocusEnemy = D.OnConfigChange, + bFocusPlayerRemark = D.OnConfigChange, + bAutoHide = D.OnConfigChange, + nMaxDisplay = D.OnConfigChange, + bAutoFocus = D.OnConfigChange, + bTeamMonFocus = D.OnConfigChange, + bHideDeath = D.OnConfigChange, + bDisplayKungfuIcon = D.OnConfigChange, + bFocusJJCParty = D.OnConfigChange, + bFocusJJCEnemy = D.OnConfigChange, + bShowTarget = D.OnConfigChange, + szDistanceType = D.OnConfigChange, + bHealHelper = D.OnConfigChange, + bShowTipRB = D.OnConfigChange, + bEnableSceneNavi = D.OnConfigChange, + fScaleX = D.OnConfigChange, + fScaleY = D.OnConfigChange, + }, + root = O, + }, + }, +} +MY_Focus = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +-- 初始化需要等待 MY_FocusUI 加载完成 +X.RegisterUserSettingsInit('MY_Focus', function() + D.bReady = true + D.LoadConfig() + D.RescanNearby() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Focus/ui/MY_Focus.ini b/MY_Focus/ui/MY_Focus.ini new file mode 100644 index 000000000..cb7ce6c19 --- /dev/null +++ b/MY_Focus/ui/MY_Focus.ini @@ -0,0 +1,898 @@ +[MY_Focus] +._WndType=WndFrame +._Parent=Normal +Left=700 +Top=300 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=200 +DragAreaHeight=32 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +BreatheWhenHide=1 +IsCustomDragable=1 +MousePenetrable=0 +Width=240 +Height=32 +Moveable=1 +ViewMutexKey= + +[Btn_Setting] +._WndType=WndButton +._Parent=MY_Focus +Left=5 +Top=5 +Width=24 +Height=24 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=详细功能设置 +NormalGroup=59 +MouseOverGroup=58 +MouseDownGroup=57 +DisableGroup=56 +ShowTipType=0 +OrgTip=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[CheckBox_Minimize] +._WndType=WndCheckBox +._Parent=MY_Focus +Left=185 +Top=7 +Width=20 +Height=20 +UnCheckAndEnable=47 +CheckAndEnable=51 +UnCheckAndDisable=50 +CheckAndDisable=46 +UnCheckedAndEnableWhenMouseOver=48 +CheckedAndEnableWhenMouseOver=52 +CheckedAndDisableWhenMouseOver=49 +UnCheckedAndDisableWhenMouseOver=53 +Checking=49 +UnChecking=53 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=73 +CheckedWhenCreate=0 + +[Btn_Close] +._WndType=WndButton +._Parent=MY_Focus +Frame=0 +Left=210 +Top=7 +Width=20 +Height=20 +NormalGroup=22 +MouseOverGroup=21 +MouseDownGroup=19 +DisableGroup=23 +Image=ui\image\uicommon\commonpanel2.uitex +DummyWnd=0 + +[Handle_Total] +._WndType=Handle +._Parent=MY_Focus +HandleType=0 +Left=0 +Top=0 +PosType=0 +FirstItemPosType=0 + +[Image_Title] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\MapMark.UITex +Frame=74 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=240 +Height=32 + +[Text_Title] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=焦点列表 +Left=35 +Top=6 +PosType=0 +FontScheme=18 +VAlign=1 +Width=100 +Height=20 +OrgText=1 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +HandleType=3 +Left=0 +Top=30 +PosType=0 +RowSpacing=0 +Width=240 +Height=70 + +[Handle_Info] +._WndType=Handle +._Parent=Handle_List +HandleType=0 +FirstItemPosType=0 +PosType=8 +EventID=524799 +Width=240 +Height=70 + +[Handle_SpiritEndurance] +._WndType=Handle +._Parent=Handle_Info +Left=240 +Top=-1 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=76 +Height=135 +EventID=768 + +[Image_SpiritEnduranceBg] +._WndType=Image +._Parent=Handle_SpiritEndurance +Left=3 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Baizhan.UITex +Alpha=255 +Frame=25 +Width=60 +Height=74 + +[Handle_SpiritEndurance_Taichi] +._WndType=Handle +._Parent=Handle_SpiritEndurance +Left=6 +Top=10 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Animate_SpiritEndurance_Taichi_SpiritBar] +._WndType=Animate +._Parent=Handle_SpiritEndurance_Taichi +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\BaizhanSpiEnduBar.UITex +Group=1 +LoopCount=-1 +Alpha=255 +Width=28 +Height=49 + +[Animate_SpiritEndurance_Taichi_EnduranceBar] +._WndType=Animate +._Parent=Handle_SpiritEndurance_Taichi +Left=26 +Top=6 +PosType=0 +Image=ui\Image\UICommon\BaizhanSpiEnduBar.UITex +Group=0 +LoopCount=-1 +Alpha=255 +Width=28 +Height=49 + +[SFX_SpiritEndurance_Taichi_SpiritBar] +._WndType=SFX +._Parent=Handle_SpiritEndurance_Taichi +Left=14 +Top=25 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\UI_百战_破碎紫.pss +Alpha=255 +Angle=45.000000 +Width=0 +Height=0 + +[SFX_SpiritEndurance_Taichi_EnduranceBar] +._WndType=SFX +._Parent=Handle_SpiritEndurance_Taichi +Left=22 +Top=50 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\UI_百战_破碎橙.pss +Alpha=255 +Angle=45.000000 +Width=0 +Height=0 + +[Handle_SpiritEndurance_Number] +._WndType=Handle +._Parent=Handle_SpiritEndurance +Left=65 +Top=16 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=76 +Height=24 + +[Handle_SpiritNum] +._WndType=Handle +._Parent=Handle_SpiritEndurance_Number +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Spirit_Num_Bg] +._WndType=Image +._Parent=Handle_SpiritNum +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Baizhan.UITex +Alpha=255 +Frame=28 +ImageType=0 +Width=94 +Height=20 + +[Text_Spirit_Num] +._WndType=Text +._Parent=Handle_SpiritNum +Left=24 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +TableType=1 +$Text=13245 +FontScheme=18 +FontColor= +Width=45 +Height=16 + +[Handle_EnduranceNum] +._WndType=Handle +._Parent=Handle_SpiritEndurance_Number +Left=0 +Top=24 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Endurance_Num_Bg] +._WndType=Image +._Parent=Handle_EnduranceNum +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Baizhan.UITex +Alpha=255 +Frame=29 +ImageType=0 +Width=94 +Height=20 + +[Text_Endurance_Num] +._WndType=Text +._Parent=Handle_EnduranceNum +Left=24 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +TableType=1 +$Text=13245 +FontScheme=18 +FontColor= +Width=45 +Height=16 + +[Image_Bg] +._WndType=Image +._Parent=Handle_Info +Image=ui\Image\Minimap\MapMark.UITex +Frame=74 +Alpha=120 +PosType=0 +ImageType=10 +Width=240 +Height=70 +Left=0 +Top=0 + +[Image_Hover] +._WndType=Image +._Parent=Handle_Info +Image=ui\Image\uicommon\activepopularize.uitex +Frame=14 +Alpha=150 +Left=1 +Top=1 +PosType=0 +Width=238 +Height=70 +ImageType=0 +LockShowAndHide=1 + +[Image_Select] +._WndType=Image +._Parent=Handle_Info +Image=ui\Image\uicommon\activepopularize.uitex +Frame=16 +Alpha=150 +Left=1 +Top=1 +PosType=0 +Width=238 +Height=70 +ImageType=0 +LockShowAndHide=1 + +[Handle_L] +._WndType=Handle +._Parent=Handle_Info +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=50 +Height=70 + +[Handle_Fail] +._WndType=Handle +._Parent=Handle_L +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=15 +PosType=0 +LockShowAndHide=1 + +[Image_FailBg] +._WndType=Image +._Parent=Handle_Fail +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=71 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=44 +Height=44 + +[Image_Fail] +._WndType=Image +._Parent=Handle_Fail +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=72 +Alpha=255 +Left=8 +Top=8 +PosType=0 +Width=28 +Height=28 + +[Handle_Compass] +._WndType=Handle +._Parent=Handle_L +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=3 +PosType=0 + +[Image_CompassBg] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=71 +Alpha=255 +Left=4 +Top=0 +PosType=0 +Width=32 +Height=32 + +[Image_PointGreen] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=69 +Alpha=255 +Left=15 +Top=24 +PosType=0 + +[Image_PointRed] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=68 +Alpha=255 +Left=2 +Top=11 +PosType=0 + +[Image_Player] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=66 +Alpha=255 +Left=12 +Top=9 +PosType=0 +ImageType=6 + +[Compass_Distance] +._WndType=Text +._Parent=Handle_Compass +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=3 +Top=32 +PosType=0 +Width=40 +Height=15 +FontScheme=15 +HAlign=1 +OrgText=0 + +[Handle_School] +._WndType=Handle +._Parent=Handle_L +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=3 +PosType=0 +LockShowAndHide=1 + +[Image_School] +._WndType=Image +._Parent=Handle_School +Image=ui\Image\TargetPanel\Target.UITex +Frame=64 +Left=4 +Top=4 +PosType=0 +Width=36 +Height=36 +Alpha=255 + +[School_Distance] +._WndType=Text +._Parent=Handle_School +RowSpacing=0 +FontSpacing=0 +Left=3 +Top=32 +PosType=0 +HAlign=1 +FontScheme=15 +Alpha=255 +ShowAll=1 +MlAutoAdj=0 +Width=40 +Height=15 + +[Handle_State] +._WndType=Handle +._Parent=Handle_L +HandleType=0 +FirstItemPosType=0 +Left=5 +Top=3 +PosType=0 +LockShowAndHide=1 + +[Box_State] +._WndType=Box +._Parent=Handle_State +Left=0 +Top=2 +Width=42 +Height=44 +EventID=256 +PosType=0 +IconID=0 + +[Text_State] +._WndType=Text +._Parent=Handle_State +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=2 +Top=4 +PosType=0 +Width=42 +Height=44 +FontScheme=16 +VAlign=1 +HAlign=1 + +[Handle_KungfuName] +._WndType=Handle +._Parent=Handle_L +Left=0 +Top=50 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Kungfu] +._WndType=Text +._Parent=Handle_KungfuName +RowSpacing=0 +FontSpacing=0 +Left=5 +Top=0 +PosType=0 +FontScheme=162 +Width=40 +Height=15 +HAlign=1 +Alpha=255 +OrgText=0 +VAlign=0 + +[Handle_R] +._WndType=Handle +._Parent=Handle_Info +Left=50 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=190 +Height=70 + +[Handle_LMN] +._WndType=Handle +._Parent=Handle_R +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=6 +PosType=0 + +[Image_HealthBG] +._WndType=Image +._Parent=Handle_LMN +Image=ui\Image\Common\money.uitex +Frame=212 +Alpha=64 +Left=0 +Top=0 +PosType=0 +Width=185 +Height=31 + +[Image_Health] +._WndType=Image +._Parent=Handle_LMN +Image=ui\Image\Common\money.uitex +Frame=217 +Left=0 +Top=0 +PosType=0 +ImageType=1 +Width=185 +Height=31 +Alpha=255 + +[Image_ManaBG] +._WndType=Image +._Parent=Handle_LMN +Image=ui\Image\Common\money.uitex +Frame=212 +Alpha=64 +Left=0 +Top=30 +PosType=0 +Width=185 +Height=15 + +[Image_Mana] +._WndType=Image +._Parent=Handle_LMN +Image=ui\Image\Common\money.uitex +Frame=213 +Left=0 +Top=30 +PosType=0 +ImageType=1 +Width=185 +Height=15 +Alpha=255 + +[Text_Name] +._WndType=Text +._Parent=Handle_LMN +RowSpacing=0 +FontSpacing=0 +Left=0 +Top=0 +PosType=0 +FontScheme=162 +Width=75 +Height=30 +VAlign=1 +Alpha=255 +OrgText=0 + +[Text_Health] +._WndType=Text +._Parent=Handle_LMN +RowSpacing=0 +FontSpacing=0 +Left=0 +Top=0 +PosType=0 +Width=185 +Height=30 +VAlign=1 +HAlign=2 +FontScheme=162 +Alpha=255 +OrgText=0 + +[Text_Mana] +._WndType=Text +._Parent=Handle_LMN +RowSpacing=0 +FontSpacing=0 +Left=0 +Top=30 +PosType=0 +Width=185 +Height=15 +VAlign=1 +HAlign=2 +FontScheme=162 +Alpha=255 + +[Handle_SkillCD] +._WndType=Handle +._Parent=Handle_R +HandleType=0 +FirstItemPosType=2 +Left=70 +Top=8 +PosType=0 +LockShowAndHide=1 + +[Box] +._WndType=Box +._Parent=Handle_SkillCD +Index=0 +PosType=7 +Width=25 +Height=25 +EventID=262912 +IconID=0 + +[Handle_Progress] +._WndType=Handle +._Parent=Handle_R +HandleType=0 +FirstItemPosType=2 +Left=0 +Top=52 +PosType=0 + +[Image_ProgressBg] +._WndType=Image +._Parent=Handle_Progress +Image=ui\Image\Common\money.uitex +Frame=212 +Alpha=64 +Left=0 +Top=0 +PosType=0 +Width=185 +Height=15 + +[Image_Progress] +._WndType=Image +._Parent=Handle_Progress +Image=ui\Image\Common\money.uitex +Frame=215 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=185 +Height=15 +ImageType=1 +ImagePercent=0.000 + +[Text_Progress] +._WndType=Text +._Parent=Handle_Progress +RowSpacing=0 +FontSpacing=0 +Left=5 +Top=0 +PosType=0 +Width=180 +Height=15 +FontScheme=162 +Alpha=255 +OrgText=0 +HAlign=2 +VAlign=1 + +[Text_Target] +._WndType=Text +._Parent=Handle_Progress +RowSpacing=0 +FontSpacing=0 +Left=5 +Top=0 +PosType=0 +Width=180 +Height=15 +FontScheme=166 +Alpha=255 +OrgText=0 +VAlign=1 + +[Handle_InfoList] +._WndType=Handle +._Parent=Handle_R +Left=0 +Top=36 +PosType=0 +HandleType=3 +Width=185 +Height=16 +RowSpacing=0 +VAlign=0 +IgnoreInvisibleChild=1 + +[Handle_Lock] +._WndType=Handle +._Parent=Handle_InfoList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=24 +Height=24 + +[Image_Lock] +._WndType=Image +._Parent=Handle_Lock +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=109 +Alpha=255 +Left=2 +Top=-3 +PosType=0 +Width=17 +Height=20 + +[Handle_Mark] +._WndType=Handle +._Parent=Handle_InfoList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=25 +Height=25 + +[Image_Mark] +._WndType=Image +._Parent=Handle_Mark +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=67 +Alpha=255 +Left=0 +Top=-5 +PosType=0 +Width=25 +Height=25 + +[Handle_MY_PlayerRemark] +._WndType=Handle +._Parent=Handle_InfoList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=25 +Height=25 + +[Image_MY_PlayerRemark] +._WndType=Image +._Parent=Handle_MY_PlayerRemark +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=0 +Alpha=255 +Left=0 +Top=-5 +PosType=0 +Width=25 +Height=25 + +[Handle_Kungfu] +._WndType=Handle +._Parent=Handle_InfoList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=24 +Height=24 + +[Image_Kungfu] +._WndType=Image +._Parent=Handle_Kungfu +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=10 +Alpha=255 +Left=0 +Top=-7 +PosType=0 +Width=24 +Height=24 + +[Handle_Camp] +._WndType=Handle +._Parent=Handle_InfoList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=24 +Height=24 + +[Image_Camp] +._WndType=Image +._Parent=Handle_Camp +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=116 +Alpha=255 +Left=0 +Top=-1 +PosType=0 +Width=20 +Height=20 + diff --git a/MY_Font/info.ini b/MY_Font/info.ini new file mode 100644 index 000000000..d0462736b --- /dev/null +++ b/MY_Font/info.ini @@ -0,0 +1,8 @@ +[MY_Font] +name=字体管理 +desc=更加自由的设置游戏字体 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Font.lua +package=MY diff --git a/MY_Font/info.ini.zh_TW b/MY_Font/info.ini.zh_TW new file mode 100644 index 000000000..6ee17e257 --- /dev/null +++ b/MY_Font/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_Font] +name=瀛楅珨绠$悊 +desc=鏇村姞鑷敱鐨勮ō缃父鎴插瓧楂 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Font.lua +package=MY diff --git a/MY_Font/lang/zhcn.jx3dat b/MY_Font/lang/zhcn.jx3dat new file mode 100644 index 000000000..7e2180fd3 --- /dev/null +++ b/MY_Font/lang/zhcn.jx3dat @@ -0,0 +1,23 @@ +return { + ['MY_Font'] = '游戏字体', + + ['Apply' ] = '应用', + + ['Common UI Text'] = '通用界面文本', + ['Chat Panel Text'] = '聊天框文本', + ['Combat Text'] = '战斗浮动伤害显示文本', + ['Lifebar Text'] = '头顶血条文本', + + ['Please select your font file.'] = '请选择字体文件', + + ['Please click apply or sure button to save change!'] = '请点击确定或应用按钮保存设置,否则下次登录时聊天字体将恢复初始设置。', + + ['1. This plugin only modifies in-game font settings and does not include font files. You need to prepare font files yourself.'] = '1. 本插件仅修改游戏内字体设置,不包含字体文件本身,用户需自行准备字体文件。', + ['2. Font files can be downloaded from various font websites. Please pay attention to copyright issues.'] = '2. 字体文件可从各大字体网站下载,注意版权问题。', + ['3. It is recommended to use common TTF or OTF format font files. Avoid using FON format to prevent compatibility issues.'] = '3. 推荐使用常见的 TTF 或 OTF 格式字体文件,避免使用 FON 格式以防兼容性问题。', + ['4. Place the prepared font files in the font directory to use them, click button below to open font folder.'] = '4. 将准备好的字体文件放置在字体目录下即可使用,点击下方按钮打开字体文件夹。', + + ['Open font folder'] = '打开字体文件夹', + ['Refresh font list'] = '刷新字体列表', + ['Get more fonts'] = '获取更多字体', +} diff --git a/MY_Font/lang/zhtw.jx3dat b/MY_Font/lang/zhtw.jx3dat new file mode 100644 index 000000000..bf5b7bf2e --- /dev/null +++ b/MY_Font/lang/zhtw.jx3dat @@ -0,0 +1,23 @@ +return { + ['MY_Font'] = '娓告埐瀛楅珨', + + ['Apply' ] = '鎳夌敤', + + ['Common UI Text'] = '閫氱敤鐣岄潰鏂囨湰', + ['Chat Panel Text'] = '鑱婂ぉ妗嗘枃鏈', + ['Combat Text'] = '鎴伴娴嫊鍌峰椤ず鏂囨湰', + ['Lifebar Text'] = '闋爞琛姊濇枃鏈', + + ['Please select your font file.'] = '璜嬮伕鎿囧瓧楂旀枃浠', + + ['Please click apply or sure button to save change!'] = '璜嬮粸鎿婄⒑瀹氭垨鎳夌敤鎸夐垥淇濆瓨瑷疆锛屽惁鍓囦笅娆$櫥閷勬檪鑱婂ぉ瀛楅珨灏囨仮寰╁垵濮嬭ō缃', + + ['1. This plugin only modifies in-game font settings and does not include font files. You need to prepare font files yourself.'] = '1. 鏈彃浠跺儏淇敼娓告埐鍏у瓧楂旇ō缃紝涓嶅寘鍚瓧楂旀枃浠舵湰韬紝鐢ㄦ埗闇鑷婧栧倷瀛楅珨鏂囦欢銆', + ['2. Font files can be downloaded from various font websites. Please pay attention to copyright issues.'] = '2. 瀛楅珨鏂囦欢鍙緸鍚勫ぇ瀛楅珨缍茬珯涓嬭級锛屾敞鎰忕増娆婂晱椤屻', + ['3. It is recommended to use common TTF or OTF format font files. Avoid using FON format to prevent compatibility issues.'] = '3. 鎺ㄨ枽浣跨敤甯歌鐨 TTF 鎴 OTF 鏍煎紡瀛楅珨鏂囦欢锛岄伩鍏嶄娇鐢 FON 鏍煎紡浠ラ槻鍏煎鎬у晱椤屻', + ['4. Place the prepared font files in the font directory to use them, click button below to open font folder.'] = '4. 灏囨簴鍌欏ソ鐨勫瓧楂旀枃浠舵斁缃湪瀛楅珨鐩寗涓嬪嵆鍙娇鐢紝榛炴搳涓嬫柟鎸夐垥鎵撻枊瀛楅珨鏂囦欢澶俱', + + ['Open font folder'] = '鎵撻枊瀛楅珨鏂囦欢澶', + ['Refresh font list'] = '鍒锋柊瀛楅珨鍒楄〃', + ['Get more fonts'] = '鐛插彇鏇村瀛楅珨', +} diff --git a/MY_Font/src/MY_Font.lua b/MY_Font/src/MY_Font.lua new file mode 100644 index 000000000..8059c06b5 --- /dev/null +++ b/MY_Font/src/MY_Font.lua @@ -0,0 +1,324 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 游戏字体 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Font/MY_Font' +local PLUGIN_NAME = 'MY_Font' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Font' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.2') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +-- 本地变量 +local D = {} +local CONFIG_PATH = {'config/fontconfig.jx3dat', X.PATH_TYPE.GLOBAL} +local CONFIG = X.LoadLUAData(CONFIG_PATH) or {} + +-- 设置字体 +function D.SetFont(tIDs, szName, szFile, nSize, tStyle) + -- tIDs : 要改变字体的类型组(标题/文本/姓名 等) + -- szName: 字体名称 + -- szFile: 字体路径 + -- nSize : 字体大小 + -- tStyle: { + -- ['vertical'] = (bool), + -- ['border' ] = (bool), + -- ['shadow' ] = (bool), + -- ['mono' ] = (bool), + -- ['mipmap' ] = (bool), + -- } + -- Ex: SetFont(Font.GetChatFontID(), '黑体', '\\UI\\Font\\方正黑体_GBK.ttf', 16, {['shadow'] = true}) + for _, dwID in ipairs(tIDs) do + local szName1, szFile1, nSize1, tStyle1 = Font.GetFont(dwID) + Font.SetFont(dwID, szName or szName1, szFile or szFile1, nSize or nSize1, tStyle or tStyle1) + if dwID == Font.GetChatFontID() then + X.UI.OpenFrame('ChatSettingPanel') + OutputWarningMessage('MSG_REWARD_GREEN', _L['Please click apply or sure button to save change!'], 10) + end + CONFIG[dwID] = {szName or szName1, szFile or szFile1, nSize or nSize1, tStyle or tStyle1} + end + X.SaveLUAData(CONFIG_PATH, CONFIG) + Station.SetUIScale(Station.GetUIScale(), true) +end + +-- 字体配置项 +local FONT_TYPE = { + { + szTitle = _L['Common UI Text'], + Get = function() + local szFontName, szFontFile = Font.GetFont(0) + return szFontName, szFontFile + end, + Set = function(szFontName, szFontFile) + D.SetFont({0, 1, 2, 3, 4, 6}, szFontName, szFontFile) + end, + }, + { + szTitle = _L['Chat Panel Text'], + Get = function() + local szFontName, szFontFile = Font.GetFont(Font.GetChatFontID()) + return szFontName, szFontFile + end, + Set = function(szFontName, szFontFile) + D.SetFont({Font.GetChatFontID()}, szFontName, szFontFile) + end, + }, + { + szTitle = _L['Combat Text'], + Get = function() + local szFontName, szFontFile = Font.GetFont(7) + return szFontName, szFontFile + end, + Set = function(szFontName, szFontFile) + D.SetFont({7}, szFontName, szFontFile) + end, + }, +} +if Global_SetCaptionParams then + table.insert(FONT_TYPE, { + szTitle = _L['Lifebar Text'], + Get = function() + local szFontName, szFontFile = '', g_tStrings.STR_CUSTOM_TEAM or '' + if Global_GetCaptionFontConfig then + szFontFile = Global_GetCaptionFontConfig().szFontFile or '' + for _, p in ipairs(X.GetFontList()) do + if p.szFile == szFontFile then + szFontName = p.szName + break + end + end + end + return szFontName, szFontFile + end, + Set = function(szFontName, szFontFile) + local tParams = { + { vtype = 's', key = 'FontFile', value = szFontFile }, + -- { vtype = 'f', key = 'FontZoomInScale', value = 3 }, + } + Global_SetCaptionParams(tParams) + end, + }) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Font', + exports = { + { + fields = { + 'SetFont', + }, + root = D, + }, + }, +} +MY_Font = X.CreateModule(settings) +end + +-- 配置界面 +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 10, 30 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + local aFontList = X.GetFontList() + local aFontName, aFontPath = {}, {} + + for _, p in ipairs(aFontList) do + table.insert(aFontName, p.szName) + table.insert(aFontPath, p.szFile) + end + + for _, p in ipairs(FONT_TYPE) do + local szFontName, szFontFile = p.Get() + local acFontFile, acFontName, btnApply + local function UpdateBtnEnable() + local szNewFile = acFontFile:Text() + local bFileExist = IsFileExist(szNewFile) + acFontFile:Color(bFileExist and {255, 255, 255} or {255, 0, 0}) + btnApply:Enable(bFileExist and szNewFile ~= szFontFile) + end + + ui:Append('Text', { text = _L[' * '] .. p.szTitle, x = nX, y = nY }) + nY = nY + 30 + + acFontFile = ui:Append('WndAutocomplete', { + x = nX, y = nY, w = nW - nX - 60 - 150 - 5 - 35 - 5 - nX - 5, h = 25, + text = szFontFile, + onChange = function(szText) + UpdateBtnEnable() + szText = StringLowerW(szText) + for _, p in ipairs(aFontList) do + if StringLowerW(p.szFile) == szText then + if acFontName:Text() ~= p.szName then + acFontName:Text(p.szName) + end + return + end + end + acFontName:Text(g_tStrings.STR_CUSTOM_TEAM) + end, + onClick = function() + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + else + X.UI(this):Autocomplete('search', '') + end + end, + autocomplete = {{'option', 'source', aFontPath}}, + }) + + ui:Append('WndButton', { + x = nW - nX - 60 - 150 - 5 - 35 - 5, y = nY, w = 35, h = 25, + text = '...', + buttonStyle = 'FLAT', + onClick = function() + local file = GetOpenFileName(_L['Please select your font file.'], 'Font File(*.ttf;*.otf;*.fon)\0*.ttf;*.otf;*.fon\0All Files(*.*)\0*.*\0\0') + if not X.IsEmpty(file) then + file = X.GetRelativePath(file, '') or file + acFontFile:Text(X.StringReplaceW(file, '/', '\\')) + end + end, + }) + + acFontName = ui:Append('WndAutocomplete', { + x = nW - nX - 60 - 150 - 5, y = nY, w = 150, h = 25, + text = szFontName, + onChange = function(szText) + UpdateBtnEnable() + szText = StringLowerW(szText) + for _, p in ipairs(aFontList) do + if StringLowerW(p.szName) == szText + and acFontFile:Text() ~= p.szFile then + acFontFile:Text(p.szFile) + return + end + end + end, + onClick = function() + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + else + X.UI(this):Autocomplete('search', '') + end + end, + autocomplete = {{'option', 'source', aFontName}}, + }) + + btnApply = ui:Append('WndButton', { + x = nW - nX - 60, y = nY, w = 60, h = 25, + text = _L['Apply'], enable = false, + buttonStyle = 'FLAT', + onClick = function() + p.Set(acFontName:Text(), acFontFile:Text()) + szFontName, szFontFile = p.Get() + acFontName:Text(szFontName, WNDEVENT_FIRETYPE.PREVENT) + acFontFile:Text(szFontFile, WNDEVENT_FIRETYPE.PREVENT) + UpdateBtnEnable() + end + }) + nY = nY + 40 + end + + nX = nPaddingX + 5 + nY = nY + 10 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['1. This plugin only modifies in-game font settings and does not include font files. You need to prepare font files yourself.'], + }):AutoHeight():Height() + 2 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['2. Font files can be downloaded from various font websites. Please pay attention to copyright issues.'], + }):AutoHeight():Height() + 2 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['3. It is recommended to use common TTF or OTF format font files. Avoid using FON format to prevent compatibility issues.'], + }):AutoHeight():Height() + 2 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['4. Place the prepared font files in the font directory to use them, click button below to open font folder.'], + }):AutoHeight():Height() + 2 + + nX = nPaddingX + nY = nY + 10 + ui:Append('WndButton', { + x = nX, y = nY, w = 150, h = 30, + text = _L['Open font folder'], + onClick = function() + X.OpenFolder(X.FormatPath({'font/', X.PATH_TYPE.GLOBAL})) + end, + }) + + ui:Append('WndButton', { + x = nX + 160, y = nY, w = 150, h = 30, + text = _L['Refresh font list'], + onClick = function() + X.Panel.SwitchTab('MY_Font', true) + end, + }) + + ui:Append('WndButton', { + x = nX + 320, y = nY, w = 150, h = 30, + text = _L['Get more fonts'], + onClick = function() + X.OpenBrowser('https://j3cx.com/fonts/' .. X.ENVIRONMENT.GAME_LOCALE, 'outer') + end, + }) +end +X.Panel.Register(_L['System'], 'MY_Font', _L['MY_Font'], 'ui/Image/UICommon/CommonPanel7.UITex|36', PS) + +-- 兼容历史位置 +do + local szSrcDir = X.PACKET_INFO.ROOT .. 'MY_FontResource/font/' + local aFontDesc = X.LoadLUAData(szSrcDir .. X.ENVIRONMENT.GAME_LANG .. '.jx3dat') + if aFontDesc then + local szDstDir = X.FormatPath({'font/', X.PATH_TYPE.GLOBAL}) + for _, tFont in ipairs(aFontDesc) do + if tFont.tLang[X.ENVIRONMENT.GAME_LANG] and tFont.szFile:sub(1, 2) == './' then + local szSrcFile = X.NormalizePath(szSrcDir .. tFont.szFile:sub(3)) + if IsFileExist(szSrcFile) then + local szExt = string.match(tFont.szFile, '%.([^%.]+)$') or 'ttf' + local szDstFile = szDstDir .. tFont.szName .. '.' .. szExt + CPath.Move(szSrcFile, szDstFile) + end + end + end + end +end + +-- 初始化设置 +do + local bChanged = false + for dwID, tConfig in pairs(CONFIG) do + local szName, szFile, nSize, tStyle = unpack(tConfig) + if IsFileExist(szFile) then + local szCurName, szCurFile, nCurSize, tCurStyle = Font.GetFont(dwID) + local szNewName, szNewFile, nNewSize, tNewStyle = szName or szCurName, szFile or szCurFile, nSize or nCurSize, tStyle or tCurStyle + if not X.IsEquals(szNewName, szCurName) or not X.IsEquals(szNewFile, szCurFile) + or not X.IsEquals(nNewSize, nCurSize) or not X.IsEquals(tNewStyle, tCurStyle) then + Font.SetFont(dwID, szNewName, szNewFile, nNewSize, tNewStyle) + bChanged = true + end + end + end + if bChanged then + Station.SetUIScale(Station.GetUIScale(), true) + end +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_FontResource/info.ini b/MY_FontResource/info.ini new file mode 100644 index 000000000..e6429ea46 --- /dev/null +++ b/MY_FontResource/info.ini @@ -0,0 +1,8 @@ +[MY_FontResource] +name=字体资源包 +desc=提供更多的字体选择 +default=1 +version=1.0 +dependence=MY_!Base +package=MY +lua_0=src/MY_FontResource.lua diff --git a/MY_FontResource/info.ini.zh_TW b/MY_FontResource/info.ini.zh_TW new file mode 100644 index 000000000..f4240aa3d --- /dev/null +++ b/MY_FontResource/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_FontResource] +name=瀛楅珨璩囨簮鍖 +desc=鎻愪緵鏇村鐨勫瓧楂旈伕鎿 +default=1 +version=1.0 +dependence=MY_!Base +package=MY +lua_0=src/MY_FontResource.lua diff --git a/MY_FontResource/src/MY_FontResource.lua b/MY_FontResource/src/MY_FontResource.lua new file mode 100644 index 000000000..5808f640c --- /dev/null +++ b/MY_FontResource/src/MY_FontResource.lua @@ -0,0 +1,22 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 字体资源 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_FontResource/MY_FontResource' +local PLUGIN_NAME = 'MY_FontResource' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_FontResource' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.2') then + return +end +-------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Force/info.ini b/MY_Force/info.ini new file mode 100644 index 000000000..aadc2edae --- /dev/null +++ b/MY_Force/info.ini @@ -0,0 +1,10 @@ +[MY_Force] +name=门派特色 +desc=门派特色提示、马匹饱食度提醒以及门派能量条等 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_Force.lua +lua_1=src/MY_ForceGuding.lua +lua_2=src/MY_ChangGeShadow.lua +package=MY diff --git a/MY_Force/info.ini.zh_TW b/MY_Force/info.ini.zh_TW new file mode 100644 index 000000000..7310ea298 --- /dev/null +++ b/MY_Force/info.ini.zh_TW @@ -0,0 +1,10 @@ +[MY_Force] +name=闁娲剧壒鑹 +desc=闁娲剧壒鑹叉彁绀恒侀Μ鍖归=椋熷害鎻愰啋浠ュ強闁娲捐兘閲忔绛 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_Force.lua +lua_1=src/MY_ForceGuding.lua +lua_2=src/MY_ChangGeShadow.lua +package=MY diff --git a/MY_Force/lang/zhcn.jx3dat b/MY_Force/lang/zhcn.jx3dat new file mode 100644 index 000000000..a28c9ca74 --- /dev/null +++ b/MY_Force/lang/zhcn.jx3dat @@ -0,0 +1,41 @@ +return { + -- MY_EnergyBar + ['MY_EnergyBar'] = '门派能量条', + ['Enable MY_EnergyBar'] = '显示门派能量条', + + -- MY_Force + ['MY_Force'] = '门派特色', + ['Your pet [%s] disappeared!'] = '您的宠物 [%s] 消失了!', + ['Alert when pet disappear unexpectedly (for 5D)'] = '五毒宠物意外消失提醒(献祭、召唤除外)', + ['Alert when horse is hungry'] = '坐骑饥饿上马时发出提醒', + ['Mark pet'] = '标记自己的宠物', + ['School feature'] = '职业特色辅助', + ['Your debuff of type [%s] reached [%d]'] = '您身上的 [%s] 减益效果达到 [%d] 个', + ['Alert when my same type of debuff reached a certain number '] = '提醒自身同类型减益效果达到一定数量', + ['Alert when I am wanted publishing online'] = '在线被悬赏时提醒自己', + ['Now somebody pay (%d+) gold to buy life of (.-)'] = '现有人愿付(%d+)金,对(.-)进行悬赏', + ['Congratulations, you offered a reward [%s] gold!'] = '恭喜你被悬赏 [%s],肥水不流外人田啊!!', + + -- MY_ForceGuding + ['I have put the GUDING, hurry to eat if you lack of mana. *la la la*'] = '法宝 [仙王蛊鼎] 已祭出,内力不足抓紧享用,用茗伊插件看得见~#玫瑰#玫瑰~~', + ['Auto eat GUDING'] = '自动吃仙王蛊鼎', + ['MY_ForceGuding'] = '蛊鼎助手', + ['Display GUDING of teammate, change color'] = '突出显示团队里的仙王蛊鼎,设置颜色', + ['Auto talk in team channel after puting GUDING'] = '喊话提醒队友来吃', + ['Talk message'] = '喊话内容', + ['Name color'] = '名字颜色', + ['Automatic eat GUDING when'] = '当血蓝条件满足设定自动吃蛊鼎', + ['Mana Mp'] = '蓝', + ['Mana Hp'] = '血', + ['Automatic eat GUDING when mana below '] = '自动吃蛊鼎,当蓝低于', + [', or life below '] = ',或血低于', + + -- MY_ChangGeShadow + ['MY_ChangGeShadow'] = '长歌影子助手', + ['Show changge shadow index'] = '显示长歌影子次序', + ['Show distance'] = '显示距离', + ['Show countdown'] = '显示时间', + ['Scale: %d%%.'] = '缩放: %d%%', + ['Scale'] = '缩放', + ['Changge force only'] = '仅长歌可用', +} diff --git a/MY_Force/lang/zhtw.jx3dat b/MY_Force/lang/zhtw.jx3dat new file mode 100644 index 000000000..e3dc7c75e --- /dev/null +++ b/MY_Force/lang/zhtw.jx3dat @@ -0,0 +1,41 @@ +return { + -- MY_EnergyBar + ['MY_EnergyBar'] = '闁娲捐兘閲忔', + ['Enable MY_EnergyBar'] = '椤ず闁娲捐兘閲忔', + + -- MY_Force + ['MY_Force'] = '闁娲剧壒鑹', + ['Your pet [%s] disappeared!'] = '鎮ㄧ殑瀵电墿 [%s] 娑堝け浜嗭紒', + ['Alert when pet disappear unexpectedly (for 5D)'] = '浜旀瘨瀵电墿鎰忓娑堝け鎻愰啋锛堢嵒绁佸彫鍠氶櫎澶栵級', + ['Alert when horse is hungry'] = '鍧愰◣楗戦涓婇Μ鏅傜櫦鍑烘彁閱', + ['Mark pet'] = '妯欒鑷繁鐨勫鐗', + ['School feature'] = '鑱锋キ鐗硅壊杓斿姪', + ['Your debuff of type [%s] reached [%d]'] = '鎮ㄨ韩涓婄殑 [%s] 娓涚泭鏁堟灉閬斿埌 [%d] 鍊', + ['Alert when my same type of debuff reached a certain number '] = '鎻愰啋鑷韩鍚岄鍨嬫笡鐩婃晥鏋滈仈鍒颁竴瀹氭暩閲', + ['Alert when I am wanted publishing online'] = '鍦ㄧ窔琚嚫璩炴檪鎻愰啋鑷繁', + ['Now somebody pay (%d+) gold to buy life of (.-)'] = '鐝炬湁浜洪浠(%d+)閲戯紝灏(.-)閫茶鎳歌碁', + ['Congratulations, you offered a reward [%s] gold!'] = '鎭枩浣犺鎳歌碁 [%s]锛岃偉姘翠笉娴佸浜虹敯鍟婏紒锛', + + -- MY_ForceGuding + ['I have put the GUDING, hurry to eat if you lack of mana. *la la la*'] = '娉曞 [浠欑帇锠遍紟] 宸茬キ鍑猴紝鍏у姏涓嶈冻鎶撶穵浜敤锛岀敤鑼椾紛鎻掍欢鐪嬪緱瑕媬#鐜懓#鐜懓~~', + ['Auto eat GUDING'] = '鑷嫊鍚冧粰鐜嬭牨榧', + ['MY_ForceGuding'] = '锠遍紟鍔╂墜', + ['Display GUDING of teammate, change color'] = '绐佸嚭椤ず鍦橀殜閲岀殑浠欑帇锠遍紟锛岃ō缃鑹', + ['Auto talk in team channel after puting GUDING'] = '鍠婅┍鎻愰啋闅婂弸渚嗗悆', + ['Talk message'] = '鍠婅┍鍏у', + ['Name color'] = '鍚嶅瓧椤忚壊', + ['Automatic eat GUDING when'] = '鐣惰钘嶆浠舵豢瓒宠ō瀹氳嚜鍕曞悆锠遍紟', + ['Mana Mp'] = '钘', + ['Mana Hp'] = '琛', + ['Automatic eat GUDING when mana below '] = '鑷嫊鍚冭牨榧庯紝鐣惰棈浣庢柤', + [', or life below '] = '锛屾垨琛浣庢柤', + + -- MY_ChangGeShadow + ['MY_ChangGeShadow'] = '闀锋瓕褰卞瓙鍔╂墜', + ['Show changge shadow index'] = '椤ず闀锋瓕褰卞瓙娆″簭', + ['Show distance'] = '椤ず璺濋洟', + ['Show countdown'] = '椤ず鏅傞枔', + ['Scale: %d%%.'] = '绺斁: %d%%', + ['Scale'] = '绺斁', + ['Changge force only'] = '鍍呴暦姝屽彲鐢', +} diff --git a/MY_Force/src/MY_ChangGeShadow.lua b/MY_Force/src/MY_ChangGeShadow.lua new file mode 100644 index 000000000..57a8b1e3b --- /dev/null +++ b/MY_Force/src/MY_ChangGeShadow.lua @@ -0,0 +1,246 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 长歌影子头顶次序 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Force/MY_ChangGeShadow' +local PLUGIN_NAME = 'MY_Force' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ChangGeShadow', _L['Target'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ChangGeShadow'], + _L['Show changge shadow index'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ChangGeShadow'], + _L['Show distance'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowCD = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ChangGeShadow'], + _L['Show countdown'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + fScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ChangGeShadow'], + _L['Scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1.5, + }, +}) +local D = {} + +function D.Apply() + if O.bEnable then + local MAX_LIMIT_TIME = 25 + local hList, hItem, nCount, sha, r, g, b, nDis, szText, fPer + local hShaList = X.UI.GetShadowHandle('MY_ChangGeShadow') + local MAX_SHADOW_COUNT = 10 + local nInterval = (O.bShowDistance or O.bShowCD) and 50 or 400 + X.BreatheCall('CHANGGE_SHADOW', nInterval, function() + local frame = Station.Lookup('Lowest1/ChangGeShadow') + if not frame then + if nCount and nCount > 0 then + for i = 0, nCount - 1 do + sha = hShaList:Lookup(i) + if sha then + sha:Hide() + end + end + nCount = 0 + end + return + end + local me = X.GetClientPlayer() + if not me then + return + end + hList = frame:Lookup('Wnd_Bar', 'Handle_Skill') + nCount = hList:GetItemCount() + for i = 0, nCount - 1 do + hItem = hList:Lookup(i) + sha = hShaList:Lookup(i) + if not sha then + hShaList:AppendItemFromString('') + sha = hShaList:Lookup(i) + end + local kNpc = X.GetNpc(hItem.nNpcID) + nDis = kNpc and X.GetCharacterDistance(me, kNpc) or -1 + if hItem.szState == 'disable' then + r, g, b = 191, 31, 31 + else + if nDis > 25 then + r, g, b = 255, 255, 31 + else + r, g, b = 63, 255, 31 + end + end + fPer = hItem:Lookup('Image_CD'):GetPercentage() + szText = tostring(i + 1) + if O.bShowDistance and nDis >= 0 then + szText = szText .. g_tStrings.STR_CONNECT .. KeepOneByteFloat(nDis) .. g_tStrings.STR_METER + end + if O.bShowCD then + szText = szText .. g_tStrings.STR_CONNECT .. math.floor(fPer * MAX_LIMIT_TIME) .. '"' + end + sha:Show() + sha:ClearTriangleFanPoint() + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:AppendCharacterID(hItem.nNpcID, true, r, g, b, 200, 0, 40, szText, 0, O.fScale) + end + for i = nCount, MAX_SHADOW_COUNT do + sha = hShaList:Lookup(i) + if sha then + sha:Hide() + end + end + end) + hShaList:Show() + else + X.BreatheCall('CHANGGE_SHADOW', false) + X.UI.GetShadowHandle('MY_ChangGeShadow'):Hide() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + if X.IS_REMAKE then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show changge shadow index'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.Apply() + end, + tip = { + render = function() + if not X.UI(this):Enable() then + return _L['Changge force only'] + end + end, + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() + local me = X.GetClientPlayer() + return me and me.dwForceID == X.CONSTANT.FORCE_TYPE.CHANG_GE + end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show distance'], + checked = O.bShowDistance, + onCheck = function(bChecked) + O.bShowDistance = bChecked + D.Apply() + end, + tip = { + render = function() + if not X.UI(this):Enable() then + return _L['Changge force only'] + end + end, + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() + local me = X.GetClientPlayer() + return me and me.dwForceID == X.CONSTANT.FORCE_TYPE.CHANG_GE + end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show countdown'], + checked = O.bShowCD, + onCheck = function(bChecked) + O.bShowCD = bChecked + D.Apply() + end, + tip = { + render = function() + if not X.UI(this):Enable() then + return _L['Changge force only'] + end + end, + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() + local me = X.GetClientPlayer() + return me and me.dwForceID == X.CONSTANT.FORCE_TYPE.CHANG_GE + end, + }):Width() + 5 + ui:Append('WndSlider', { + x = nX, y = nY, w = 150, + textFormatter = function(val) return _L('Scale: %d%%.', val) end, + range = {10, 800}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.fScale * 100, + onChange = function(val) + O.fScale = val / 100 + D.Apply() + end, + autoEnable = function() + local me = X.GetClientPlayer() + return me and me.dwForceID == X.CONSTANT.FORCE_TYPE.CHANG_GE + end, + }) + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ChangGeShadow', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_ChangGeShadow = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ChangGeShadow', D.Apply) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Force/src/MY_Force.lua b/MY_Force/src/MY_Force.lua new file mode 100644 index 000000000..1ace8860d --- /dev/null +++ b/MY_Force/src/MY_Force.lua @@ -0,0 +1,464 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 职业特色增强 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Force/MY_Force' +local PLUGIN_NAME = 'MY_Force' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Force' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_Force', { ['*'] = false }) +X.RegisterRestriction('MY_ForceGuding', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_Force', _L['Target'], { + bAlertPet = { -- 五毒宠物消失提醒 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Alert when pet disappear unexpectedly (for 5D)'], + }), + xSchema = X.Schema.Boolean, + szVersion = '20221109', + xDefaultValue = false, + }, + bMarkPet = { -- 五毒宠物标记 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Mark pet'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFeedHorse = { -- 提示喂马 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Alert when horse is hungry'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bWarningDebuff = { -- 警告 debuff 类型 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Alert when my same type of debuff reached a certain number '], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nDebuffNum = { -- debuff 类型达到几个时警告 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Alert when my same type of debuff reached a certain number '], + }), + xSchema = X.Schema.Number, + xDefaultValue = 3, + }, + bAlertWanted = { -- 在线被悬赏时提醒自己 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['Alert when I am wanted publishing online'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + nFrameXJ = 0, -- 献祭、各种召唤跟宠的帧数 +} + +-- check pet of 5D (XJ:2226) +function D.OnAlertPetChange() + local bAlertPet = O.bAlertPet + if bAlertPet then + X.RegisterEvent('NPC_LEAVE_SCENE', 'MY_Force__AlertPet', function() + local me = X.GetClientPlayer() + if me and me.dwForceID == FORCE_TYPE.WU_DU then + local pet = me.GetPet() + if pet and pet.dwID == arg0 and (GetLogicFrameCount() - D.nFrameXJ) >= 32 then + OutputWarningMessage('MSG_WARNING_YELLOW', _L('Your pet [%s] disappeared!', pet.szName)) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + end + end) + X.RegisterEvent('DO_SKILL_CAST', 'MY_Force__AlertPet', function() + if arg0 == X.GetClientPlayerID() then + -- 献祭、各种召唤:2965,2221 ~ 2226 + if arg1 == 2965 or (arg1 >= 2221 and arg1 <= 2226) then + D.nFrameXJ = GetLogicFrameCount() + end + end + end) + else + X.RegisterEvent('NPC_LEAVE_SCENE', 'MY_Force__AlertPet', false) + X.RegisterEvent('DO_SKILL_CAST', 'MY_Force__AlertPet', false) + end +end + +-- check to mark pet +do +local function UpdatePetMark(bMark) + local me = X.GetClientPlayer() + if not me then + return + end + local pet = me.GetPet() + if pet then + local dwEffect = 13 + if not bMark then + dwEffect = 0 + end + SceneObject_SetTitleEffect(TARGET.NPC, pet.dwID, dwEffect) + end +end +function D.OnMarkPetChange() + local bMarkPet = O.bMarkPet + if bMarkPet then + X.RegisterEvent({'NPC_ENTER_SCENE', 'NPC_DISPLAY_DATA_UPDATE'}, 'MY_Force__MarkPet', function() + local pet = X.GetClientPlayer().GetPet() + if pet and arg0 == pet.dwID then + X.DelayCall(500, function() + UpdatePetMark(true) + end) + else + local npc = X.GetNpc(arg0) + if npc.dwTemplateID == 46297 and npc.dwEmployer == X.GetClientPlayerID() then + SceneObject_SetTitleEffect(TARGET.NPC, npc.dwID, 13) + end + end + end) + else + X.RegisterEvent({'NPC_ENTER_SCENE', 'NPC_DISPLAY_DATA_UPDATE'}, 'MY_Force__MarkPet', false) + end + UpdatePetMark(bMarkPet) +end +end + +-- check feed horse +function D.OnFeedHorseChange() + local bFeedHorse = O.bFeedHorse + if bFeedHorse then + X.RegisterEvent('SYS_MSG', 'MY_Force__FeedHorse', function() + local me = X.GetClientPlayer() + -- 读条技能 + if arg0 == 'UI_OME_SKILL_CAST_LOG' and O.bFeedHorse and arg1 == me.dwID + and (arg2 == 433 or arg2 == 53 or Table_GetSkillName(arg2, 1) == Table_GetSkillName(53, 1)) then -- on prepare 骑乘 + local it = me.GetEquippedHorse() + if it then + local nFullLevel = it.GetHorseFullLevel() + if nFullLevel ~= FULL_LEVEL.FULL then + local itemInfo = GetItemInfo(it.dwTabType, it.dwIndex) + local tDisplay = Table_GetRideSubDisplay(itemInfo.nDetail) + local szFullMeasure = tDisplay['szFullMeasure' .. (nFullLevel + 1)] + OutputWarningMessage('MSG_WARNING_YELLOW', Table_GetItemName(it.nUiId) .. ': ' .. szFullMeasure) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + end + end + end) + else + X.RegisterEvent('SYS_MSG', 'MY_Force__FeedHorse', false) + end +end + +-- check warning buff type +function D.OnWarningDebuffChange() + local bWarningDebuff = O.bWarningDebuff + if bWarningDebuff then + X.RegisterEvent('BUFF_UPDATE', 'MY_Force__WarningDebuff', function() + -- buff update: + -- arg0:dwPlayerID,arg1:bDelete,arg2:nIndex,arg3:bCanCancel + -- arg4:dwBuffID,arg5:nStackNum,arg6:nEndFrame,arg7:?update all? + -- arg8:nLevel,arg9:dwSkillSrcID + local me = X.GetClientPlayer() + if arg0 ~= me.dwID or not O.bWarningDebuff or (not arg7 and arg3) then + return + end + local t, t2 = {}, {} + for _, buff in X.ipairs_c(X.GetBuffList(me)) do + if not buff.bCanCancel and not t2[buff.dwID] then + local info = GetBuffInfo(buff.dwID, buff.nLevel, {}) + if info and info.nDetachType > 2 then + if not t[info.nDetachType] then + t[info.nDetachType] = 1 + else + t[info.nDetachType] = t[info.nDetachType] + 1 + end + t2[buff.dwID] = true + end + end + end + for nType, nNum in pairs(t) do + if nNum >= O.nDebuffNum then + local szText = _L('Your debuff of type [%s] reached [%d]', g_tStrings.tBuffDetachType[nType], nNum) + OutputWarningMessage('MSG_WARNING_GREEN', szText) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + end + end) + else + X.RegisterEvent('BUFF_UPDATE', 'MY_Force__WarningDebuff', false) + end +end + +-- check on wanted msg +do +local function OnMsgAnnounce(szMsg) + local _, _, sM, sN = string.find(szMsg, _L['Now somebody pay (%d+) gold to buy life of (.-)']) + if sM and sN == X.GetClientPlayer().szName then + local fW = function() + OutputWarningMessage('MSG_WARNING_RED', _L('Congratulations, you offered a reward [%s] gold!', sM)) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + SceneObject_SetTitleEffect(TARGET.PLAYER, X.GetClientPlayerID(), 47) + fW() + X.DelayCall(2000, fW) + X.DelayCall(4000, fW) + D.bHasWanted = true + end +end +function D.OnAlertWantedChange() + local bAlertWanted = O.bAlertWanted + if bAlertWanted then + -- 变化时更新头顶效果 + X.RegisterEvent('PLAYER_STATE_UPDATE', 'MY_Force__AlertWanted', function() + if arg0 == X.GetClientPlayerID() then + if D.bHasWanted then + SceneObject_SetTitleEffect(TARGET.PLAYER, arg0, 47) + end + end + end) + -- 重伤后删除头顶效果 + X.RegisterEvent('SYS_MSG', 'MY_Force__AlertWanted', function() + if arg0 == 'UI_OME_DEATH_NOTIFY' then + if D.bHasWanted and arg1 == X.GetClientPlayerID() then + D.bHasWanted = nil + SceneObject_SetTitleEffect(TARGET.PLAYER, arg1, 0) + end + end + end) + RegisterMsgMonitor(OnMsgAnnounce, {'MSG_GM_ANNOUNCE'}) + else + X.RegisterEvent('PLAYER_STATE_UPDATE', 'MY_Force__AlertWanted', false) + X.RegisterEvent('SYS_MSG', 'MY_Force__AlertWanted', false) + UnRegisterMsgMonitor(OnMsgAnnounce, {'MSG_GM_ANNOUNCE'}) + end +end +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('LOADING_END', 'MY_Force', function() + local buff = Table_GetBuff(374, 1) + if buff then + buff.bShowTime = 1 + end +end) + +X.RegisterUserSettingsInit('MY_Force', function() + D.OnAlertPetChange() + D.OnMarkPetChange() + D.OnFeedHorseChange() + D.OnWarningDebuffChange() + D.OnAlertWantedChange() +end) + +------------------------------------- +-- 设置界面 +------------------------------------- +local PS = { szRestriction = 'MY_Force' } +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 25, 25 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + -- wu du + --------------- + ui:Append('Text', { text = g_tStrings.tForceTitle[X.CONSTANT.FORCE_TYPE.WU_DU], x = nX, y = nY, font = 27 }) + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + -- disappear + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Alert when pet disappear unexpectedly (for 5D)'], + checked = O.bAlertPet, + onCheck = function(bChecked) + O.bAlertPet = bChecked + D.OnAlertPetChange() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + -- mark pet + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Mark pet'], + checked = O.bMarkPet, + onCheck = function(bChecked) + O.bMarkPet = bChecked + D.OnMarkPetChange() + end, + }):AutoWidth() + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + -- guding + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display GUDING of teammate, change color'], + checked = MY_ForceGuding.bEnable, + onCheck = function(bChecked) + MY_ForceGuding.bEnable = bChecked + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 2 + nX = ui:Append('Shadow', { + x = nX, y = nY + 2, w = 18, h = 18, + color = MY_ForceGuding.color, + onClick = function() + local ui = X.UI(this) + OpenColorTablePanel(function(r, g, b) + ui:Color(r, g, b) + MY_ForceGuding.color = { r, g, b } + end) + end, + }):Pos('BOTTOMRIGHT') + 10 + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Auto talk in team channel after puting GUDING'], + checked = MY_ForceGuding.bAutoSay, + autoEnable = function() return MY_ForceGuding.bEnable end, + onCheck = function(bChecked) + MY_ForceGuding.bAutoSay = bChecked + end, + }) + nX = nPaddingX + 10 + nY = nY + 28 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nW - nX * 2, h = 50, + multiline = true, limit = 512, + text = MY_ForceGuding.szSay, + autoEnable = function() return MY_ForceGuding.bAutoSay end, + onChange = function(szText) + MY_ForceGuding.szSay = szText + end, + }) + -- crlf + nY = nY + 54 + if not X.IsRestricted('MY_ForceGuding') then + -- crlf + nX = nPaddingX + 10 + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + checked = MY_ForceGuding.bUseMana, + text = _L['Automatic eat GUDING when mana below '], + onCheck = function(bChecked) + MY_ForceGuding.bUseMana = bChecked + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndSlider', { + x = nX, y = nY, w = 70, h = 25, + range = {0, 100, 50}, + value = MY_ForceGuding.nManaMp, + onChange = function(nVal) MY_ForceGuding.nManaMp = nVal end, + autoEnable = function() return MY_ForceGuding.bUseMana end, + }):Pos('BOTTOMRIGHT') + 65 + nX = ui:Append('Text', { + x = nX, y = nY - 3, + text = _L[', or life below '], + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndSlider', { + x = nX, y = nY, w = 70, h = 25, + range = {0, 100, 50}, + value = MY_ForceGuding.nManaHp, + onChange = function(nVal) MY_ForceGuding.nManaHp = nVal end, + autoEnable = function() return MY_ForceGuding.bUseMana end, + }):Pos('BOTTOMRIGHT') + nY = nY + 36 + end + -- other + --------------- + nX = nPaddingX + ui:Append('Text', { text = _L['Others'], x = nX, y = nY, font = 27 }) + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + -- hungry + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Alert when horse is hungry'], + checked = O.bFeedHorse, + onCheck = function(bChecked) + O.bFeedHorse = bChecked + D.OnFeedHorseChange() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + -- be wanted alert + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Alert when I am wanted publishing online'], + checked = O.bAlertWanted, + onCheck = function(bChecked) + O.bAlertWanted = bChecked + D.OnAlertWantedChange() + end, + }) + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + -- debuff type num + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Alert when my same type of debuff reached a certain number '], + checked = O.bWarningDebuff, + onCheck = function(bChecked) + O.bWarningDebuff = bChecked + D.OnWarningDebuffChange() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 50, h = 25, + autoEnable = function() return O.bWarningDebuff end, + text = tostring(O.nDebuffNum), + menu = function() + local ui = X.UI(this) + local m0 = {} + for i = 1, 10 do + table.insert(m0, { + szOption = tostring(i), + fnAction = function() + O.nDebuffNum = i + ui:Text(tostring(i)) + end, + }) + end + return m0 + end, + }) + -- crlf + nX = nPaddingX + 10 + nY = nY + 28 + nX, nY = MY_ChangGeShadow.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) +end +X.Panel.Register(_L['Target'], 'MY_Force', _L['MY_Force'], 327, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Force/src/MY_ForceGuding.lua b/MY_Force/src/MY_ForceGuding.lua new file mode 100644 index 000000000..c56550dab --- /dev/null +++ b/MY_Force/src/MY_ForceGuding.lua @@ -0,0 +1,376 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 五毒仙王蛊鼎显示 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Force/MY_ForceGuding' +local PLUGIN_NAME = 'MY_Force' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Force' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ForceGuding', _L['Target'], { + bEnable = { -- 总开关 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Display GUDING of teammate, change color'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoSay = { -- 摆鼎后自动说话 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Auto talk in team channel after puting GUDING'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + szSay = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Talk message'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['I have put the GUDING, hurry to eat if you lack of mana. *la la la*'], + }, + color = { -- 名称颜色,默认绿色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Name color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 0, 128 }, + }, + bUseMana = { -- 路过时自动吃毒锅 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Automatic eat GUDING when'], + }), + szRestriction = 'MY_ForceGuding', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nManaMp = { -- 自动吃的 MP 百分比 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Automatic eat GUDING when'], + _L['Mana Mp'], + }), + szRestriction = 'MY_ForceGuding', + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + nManaHp = { -- 自动吃的 HP 百分比 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Force'], + szDescription = X.MakeCaption({ + _L['MY_ForceGuding'], + _L['Automatic eat GUDING when'], + _L['Mana Hp'], + }), + szRestriction = 'MY_ForceGuding', + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, +}) +local D = { + nMaxDelay = 500, -- 释放和出现的最大时差,单位毫秒 + nMaxTime = 60000, -- 存在的最大时间,单位毫秒 + dwSkillID = 2234, + dwTemplateID = 2418, + tList = {}, -- 显示记录 (#ID => nTime) + tCast = {}, -- 技能释放记录 + nFrame = 0, -- 上次自动吃鼎、绘制帧次 +} + +--[[#DEBUG BEGIN]] +-- debug +function D.OutputDebugMessage(szMsg) + X.OutputDebugMessage(_L['MY_ForceGuding'], szMsg, X.DEBUG_LEVEL.LOG) +end +--[[#DEBUG END]] + +-- add to list +function D.AddToList(tar, dwCaster, dwTime, szEvent) + D.tList[tar.dwID] = { dwCaster = dwCaster, dwTime = dwTime } + -- bg notify + local me = X.GetClientPlayer() + if szEvent == 'DO_SKILL_CAST' and me.IsInParty() then + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GUDING_NOTIFY', {tar.dwID, dwCaster}, true) + end + if O.bAutoSay and me.dwID == dwCaster then + local nChannel = PLAYER_TALK_CHANNEL.RAID + if not me.IsInParty() then + nChannel = PLAYER_TALK_CHANNEL.NEARBY + end + X.SendChat(nChannel, O.szSay) + end +end + +-- remove record +function D.RemoveFromList(dwID) + D.tList[dwID] = nil +end + +------------------------------------- +-- 事件处理函数 +------------------------------------- +-- skill cast log +function D.OnSkillCast(dwCaster, dwSkillID, dwLevel, szEvent) + local player = X.GetPlayer(dwCaster) + if player and dwSkillID == D.dwSkillID and (dwCaster == X.GetClientPlayerID() or X.IsTeammate(dwCaster)) then + table.insert(D.tCast, { dwCaster = dwCaster, dwTime = GetTime(), szEvent = szEvent }) + --[[#DEBUG BEGIN]] + D.OutputDebugMessage('[' .. player.szName .. '] cast [' .. X.GetSkillName(dwSkillID, dwLevel) .. '#' .. szEvent .. ']') + --[[#DEBUG END]] + end +end + +-- doodad enter +function D.OnDoodadEnter() + local tar = X.GetDoodad(arg0) + if not tar or D.tList[arg0] or tar.dwTemplateID ~= D.dwTemplateID then + return + end + --[[#DEBUG BEGIN]] + D.OutputDebugMessage('[' .. tar.szName .. '] enter scene') + --[[#DEBUG END]] + -- find caster + for k, v in ipairs(D.tCast) do + local nTime = GetTime() - v.dwTime + --[[#DEBUG BEGIN]] + D.OutputDebugMessage('checking [#' .. v.dwCaster .. '], delay [' .. nTime .. ']') + --[[#DEBUG END]] + if nTime < D.nMaxDelay then + table.remove(D.tCast, k) + D.AddToList(tar, v.dwCaster, v.dwTime, v.szEvent) + --[[#DEBUG BEGIN]] + D.OutputDebugMessage('matched [' .. tar.szName .. '] casted by [#' .. v.dwCaster .. ']') + --[[#DEBUG END]] + return + end + end + -- purge + for k, v in pairs(D.tCast) do + if (GetTime() - v.dwTime) > D.nMaxDelay then + table.remove(D.tCast, k) + end + end +end + +-- notify +function D.OnSkillNotify(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not bSelf then + local dwID = tonumber(data[1]) + if not D.tList[dwID] then + D.tList[dwID] = { dwCaster = tonumber(data[2]), dwTime = GetTime() } + --[[#DEBUG BEGIN]] + D.OutputDebugMessage('received notify from [#' .. data[2] .. ']') + --[[#DEBUG END]] + end + end +end + +function D.OnEnableChange() + local bEnable = D.bReady and O.bEnable + local h = X.UI.GetShadowHandle('MY_ForceGuding') + h:Clear() + if bEnable then + h:AppendItemFromString('name="Shadow_Label"') + D.pLabel = h:Lookup('Shadow_Label') + X.RegisterEvent('SYS_MSG', 'MY_ForceGuding', function() + if arg0 == 'UI_OME_SKILL_HIT_LOG' then + D.OnSkillCast(arg1, arg4, arg5, arg0) + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + D.OnSkillCast(arg1, arg5, arg6, arg0) + end + end) + X.RegisterEvent('DO_SKILL_CAST', 'MY_ForceGuding', function(event) + D.OnSkillCast(arg0, arg1, arg2, event) + end) + X.RegisterEvent('DOODAD_ENTER_SCENE', 'MY_ForceGuding', function() + D.OnDoodadEnter() + end) + X.RegisterBgMsg('MY_GUDING_NOTIFY', 'MY_ForceGuding', D.OnSkillNotify) + X.BreatheCall('MY_ForceGuding', function() + -- skip frame + local nFrame = GetLogicFrameCount() + if nFrame >= D.nFrame and (nFrame - D.nFrame) < 8 then + return + end + D.nFrame = nFrame + -- check empty + local sha, me = D.pLabel, X.GetClientPlayer() + if not me or not MY_ForceGuding.bEnable or X.IsEmpty(D.tList) then + return sha:Hide() + end + -- color, alpha + local r, g, b = unpack(MY_ForceGuding.color) + local a = 200 + local buff = X.GetBuff(me, 3488) + if buff and not buff.bCanCancel then + a = 120 + end + -- shadow text + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:ClearTriangleFanPoint() + sha:Show() + for k, v in pairs(D.tList) do + local nLeft = v.dwTime + D.nMaxTime - GetTime() + if nLeft < 0 then + D.RemoveFromList(k) + else + local tar = X.GetDoodad(k) + if tar then + -- show name + local szText = _L['-'] .. math.floor(nLeft / 1000) + local player = X.GetPlayer(v.dwCaster) + if player then + szText = player.szName .. szText + else + szText = tar.szName .. szText + end + sha:AppendDoodadID(tar.dwID, r, g, b, a, 192, 199, szText, 0, 1) + end + end + end + end) + else + X.RegisterEvent('SYS_MSG', 'MY_ForceGuding', false) + X.RegisterEvent('DO_SKILL_CAST', 'MY_ForceGuding', false) + X.RegisterEvent('DOODAD_ENTER_SCENE', 'MY_ForceGuding', false) + X.RegisterBgMsg('MY_GUDING_NOTIFY', 'MY_ForceGuding', false) + X.BreatheCall('MY_ForceGuding', false) + end +end + +function D.OnUseManaChange() + local bUseMana = D.bReady and O.bUseMana + if bUseMana and not X.IsRestricted('MY_ForceGuding') then + X.BreatheCall('MY_ForceGuding__UseMana', function() + local nFrame = GetLogicFrameCount() + -- check to use mana + if not O.bUseMana or (D.nManaFrame and D.nManaFrame > (nFrame - 4)) then + return + end + -- 没鼎 + local aList = D.tList + if X.IsEmpty(aList) then + return + end + -- 没自己 + local me = X.GetClientPlayer() + if not me then + return + end + local fCurrentLife, fMaxLife = X.GetCharacterLife(me) + -- 不在地上 + if me.bOnHorse or me.nMoveState ~= MOVE_STATE.ON_STAND then + return + end + -- 血蓝很足 + if (me.nCurrentMana / me.nMaxMana) > (O.nManaMp / 100) and (fCurrentLife / fMaxLife) > (O.nManaHp / 100) then + return + end + -- 在读条 + if X.GetCharacterOTActionState(me) ~= X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_IDLE then + return + end + -- 吃不了 + local buff = X.GetBuff(me, 3448) + if buff and not buff.bCanCancel then + return + end + -- 找鼎 + for k, _ in pairs(aList) do + local doo = X.GetDoodad(k) + if doo and X.GetCharacterDistance(me, doo) < 6 then + D.nManaFrame = GetLogicFrameCount() + X.InteractDoodad(doo.dwID) + X.OutputSystemMessage(_L['Auto eat GUDING']) + break + end + end + end) + else + X.BreatheCall('MY_ForceGuding__UseMana', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ForceGuding', + exports = { + { + fields = { + 'bEnable', + 'bAutoSay', + 'szSay', + 'color', + 'bUseMana', + 'nManaMp', + 'nManaHp', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bAutoSay', + 'szSay', + 'color', + 'bUseMana', + 'nManaMp', + 'nManaHp', + }, + triggers = { + bEnable = D.OnEnableChange, + bUseMana = D.OnUseManaChange, + }, + root = O, + }, + }, +} +MY_ForceGuding = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_ForceGuding', function() + D.bReady = true + D.OnEnableChange() + D.OnUseManaChange() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Force/ui/Playerbar.ini b/MY_Force/ui/Playerbar.ini new file mode 100644 index 000000000..ea2ef84a6 --- /dev/null +++ b/MY_Force/ui/Playerbar.ini @@ -0,0 +1,3070 @@ +[Playerbar] +._WndType=WndFrame +._Parent=Normal +Left=208 +Top=200 +Width=400 +Height=60 +MinWidth=0 +MinHeight=0 +MaxWidth=0 +MaxHeight=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaRight=0 +DragAreaBottom=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +ScriptFile=UI\Config\Default\Player.lua +DragAreaWidth=404 +DragAreaHeight=60 +DisableBringToTop=1 +IsCustomDragable=0 +DummyWnd=1 +MousePenetrable=0 +AnchorArgs=TOPLEFT,TOPLEFT,-10,73 +AnchorDst=client +ViewMutexKey= + +[Handle_PlayerBar] +._WndType=Handle +._Parent=Playerbar +HandleType=0 +FirstItemPosType=0 +PosType=0 +Width=400 +Height=60 +AreaFile=ui\Image\TargetPanel\Player.area +Left=8 +Top=0 + +[Handle_CY] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=110 +Top=19 +PosType=0 +LockShowAndHide=1 + +[CY_10] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=1 +LoopCount=-1 +Left=0 +Top=0 +PosType=0 +Alpha=255 + +[CY_11] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=0 +LoopCount=-1 +Left=0 +Top=0 +PosType=0 +Alpha=255 + +[CY_20] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=1 +LoopCount=-1 +Left=25 +Top=0 +PosType=0 +Alpha=255 +LockShowAndHide=1 + +[CY_21] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=0 +LoopCount=-1 +Left=25 +Top=0 +PosType=0 +LockShowAndHide=1 +Alpha=255 + +[CY_30] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=1 +LoopCount=-1 +Left=50 +Top=0 +PosType=0 +LockShowAndHide=1 +Alpha=255 + +[CY_31] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=0 +LoopCount=-1 +Left=50 +Top=0 +PosType=0 +LockShowAndHide=1 +Alpha=255 + +[CY_40] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=1 +LoopCount=-1 +Left=75 +Top=0 +PosType=0 +LockShowAndHide=1 +Alpha=255 + +[CY_41] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=0 +LoopCount=-1 +Left=75 +Top=0 +PosType=0 +Alpha=255 +LockShowAndHide=1 + +[CY_50] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=1 +LoopCount=-1 +Left=100 +Top=0 +PosType=0 +Alpha=255 +LockShowAndHide=1 + +[CY_51] +._WndType=Animate +._Parent=Handle_CY +Image=ui\Image\TargetPanel\Player.UITex +Group=0 +LoopCount=-1 +Left=100 +Top=0 +PosType=0 +Alpha=255 +LockShowAndHide=1 + +[Handle_SL] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=19 +Top=19 +PosType=0 +LockShowAndHide=1 + +[Image_Bg01] +._WndType=Image +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Frame=33 +Alpha=255 +Left=0 +Top=2 +PosType=0 +Width=30 +Height=30 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 +ShowTipType=0 +EventID=256 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_Bg02] +._WndType=Image +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Frame=43 +Alpha=255 +Left=27 +Top=1 +PosType=0 +Width=30 +Height=30 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 +ShowTipType=0 + +[Image_Bg03] +._WndType=Image +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Frame=53 +Alpha=255 +Left=55 +Top=1 +PosType=0 +Width=30 +Height=30 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 +ShowTipType=0 + +[SL_1] +._WndType=Animate +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Group=3 +LoopCount=-1 +Left=0 +Top=2 +PosType=0 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 + +[SL_2] +._WndType=Animate +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Group=4 +LoopCount=-1 +Left=27 +Top=1 +PosType=0 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 + +[SL_3] +._WndType=Animate +._Parent=Handle_SL +Image=ui\Image\TargetPanel\Player.UITex +Group=2 +LoopCount=-1 +Left=55 +Top=1 +PosType=0 +$Tip=STR_PLAYER_SLCOMBAT +TipRichText=0 + +[Handle_CJ] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=113 +Top=-2 +PosType=0 +Width=206 +Height=37 +LockShowAndHide=1 + +[Animate_Short] +._WndType=Animate +._Parent=Handle_CJ +Image=ui\Image\TargetPanel\CangJianAnimation1.UITex +Group=0 +LoopCount=-1 +Left=-4 +Top=-7 +PosType=0 +Width=210 +Height=45 +Alpha=255 + +[Image_Short] +._WndType=Image +._Parent=Handle_CJ +Image=ui\Image\TargetPanel\Player.UITex +Frame=66 +Alpha=255 +Left=25 +Top=12 +PosType=0 +ImageType=1 +Width=150 +Height=15 + +[Text_Short] +._WndType=Text +._Parent=Handle_CJ +RowSpacing=0 +Left=25 +Top=12 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +TipRichText=0 +$Tip=STR_PROPERTY_RAGE +ShowTipType=0 +Width=150 +Height=14 + +[Animate_Long] +._WndType=Animate +._Parent=Handle_CJ +Image=ui\Image\TargetPanel\CangJianAnimation2.UITex +Group=0 +LoopCount=-1 +Left=-8 +Top=-14 +PosType=0 +LockShowAndHide=1 + +[Image_Long] +._WndType=Image +._Parent=Handle_CJ +Image=ui\Image\TargetPanel\Player.UITex +Frame=65 +Alpha=255 +Left=13 +Top=6 +PosType=0 +ImageType=1 +LockShowAndHide=1 + +[Text_Long] +._WndType=Text +._Parent=Handle_CJ +RowSpacing=0 +Left=13 +Top=6 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +TipRichText=0 +$Tip=STR_PROPERTY_RAGE +ShowTipType=0 +Width=213 +Height=21 +LockShowAndHide=1 + +[Handle_TM] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=87 +Top=-5 +PosType=0 +Width=245 +Height=45 +LockShowAndHide=1 + +[Image_Frame] +._WndType=Image +._Parent=Handle_TM +Image=ui\Image\TargetPanel\Player.UITex +Frame=73 +Alpha=255 +Left=22 +Top=1 +PosType=0 +ImageType=0 +Width=216 +Height=41 +EventID=273 +TipRichText=0 + +[Image_Strip] +._WndType=Image +._Parent=Handle_TM +Image=ui\Image\TargetPanel\Player.UITex +Frame=72 +Alpha=255 +Left=39 +Top=14 +PosType=0 +Width=184 +Height=15 +ImageType=1 +EventID=256 +TipRichText=0 + +[Text_Energy] +._WndType=Text +._Parent=Handle_TM +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=100/100 +Left=82 +Top=15 +PosType=0 +OrgText=1 +Width=100 +Height=17 +VAlign=1 +HAlign=1 +FontScheme=65 + +[Handle_ACSJ] +._WndType=Handle +._Parent=Handle_TM +Left=53 +Top=35 +PosType=0 +HandleType=3 +Width=157 +Height=49 +RowSpacing=0 + +[Handle_ACSJMod] +._WndType=Handle +._Parent=Handle_ACSJ +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=48 +Height=48 + +[Image_ACSJBg] +._WndType=Image +._Parent=Handle_ACSJMod +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=9 +Width=47 +Height=47 + +[Image_ACSJProgress] +._WndType=Image +._Parent=Handle_ACSJMod +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=8 +Width=47 +Height=47 +ImageType=15 + +[Text_ACSJTime] +._WndType=Text +._Parent=Handle_ACSJMod +Left=0 +Top=44 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=52 +Height=17 +OrgText=1 +$Text=59" +HAlign=1 +VAlign=1 +FontScheme=18 +FontColor= + +[Handle_ACSJMod_0] +._WndType=Handle +._Parent=Handle_ACSJ +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=48 +Height=48 + +[Image_ACSJBg_0] +._WndType=Image +._Parent=Handle_ACSJMod_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=9 +Width=47 +Height=47 + +[Image_ACSJProgress_0] +._WndType=Image +._Parent=Handle_ACSJMod_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=8 +Width=47 +Height=47 +ImageType=15 + +[Text_ACSJTime_0] +._WndType=Text +._Parent=Handle_ACSJMod_0 +Left=0 +Top=44 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=52 +Height=17 +OrgText=1 +$Text=59" +HAlign=1 +VAlign=1 +FontScheme=18 +FontColor= + +[Handle_ACSJMod_1] +._WndType=Handle +._Parent=Handle_ACSJ +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=48 +Height=48 + +[Image_ACSJBg_0_0] +._WndType=Image +._Parent=Handle_ACSJMod_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=9 +Width=47 +Height=47 + +[Image_ACSJProgress_1] +._WndType=Image +._Parent=Handle_ACSJMod_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Player.UITex +Alpha=255 +Frame=8 +Width=47 +Height=47 +ImageType=15 + +[Text_ACSJTime_1] +._WndType=Text +._Parent=Handle_ACSJMod_1 +Left=0 +Top=44 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=52 +Height=17 +OrgText=1 +$Text=59" +HAlign=1 +VAlign=1 +FontScheme=18 +FontColor= + +[Handle_QX] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=95 +Top=18 +PosType=0 +Width=196 +Height=50 +LockShowAndHide=1 + +[Image_QxFrame] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=74 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=0 +Width=196 +Height=50 +TipRichText=0 + +[Image_QX_Btn] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=85 +Alpha=255 +Left=-3 +Top=-2 +PosType=0 +EventID=789 + +[QX_1] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=76 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_2] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=77 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_3] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=78 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_4] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=79 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_5] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=84 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_6] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=81 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_7] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=82 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_8] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=83 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_9] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=80 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[QX_10] +._WndType=Image +._Parent=Handle_QX +Image=ui\Image\TargetPanel\Player.UITex +Frame=75 +Alpha=255 +Left=51 +Top=16 +PosType=0 +Width=134 +Height=17 +ImageType=0 +EventID=256 +TipRichText=0 + +[Text_Layer] +._WndType=Text +._Parent=Handle_QX +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=100/100 +Left=43 +Top=27 +PosType=0 +OrgText=1 +Width=13 +Height=13 +VAlign=1 +HAlign=1 +FontScheme=207 + +[Handle_CangYun] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=107 +Top=-5 +PosType=0 +Width=237 +Height=55 +LockShowAndHide=1 + +[Image_RangBg] +._WndType=Image +._Parent=Handle_CangYun +Image=ui\Image\TargetPanel\Player.UITex +Frame=4 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +Width=210 +Height=32 + +[SFX_RangBg] +._WndType=SFX +._Parent=Handle_CangYun +Left=106 +Top=16 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\N_怒气过程.pss +Scale=1.100000 +Loop=1 +Alpha=255 + +[Image_Rang] +._WndType=Image +._Parent=Handle_CangYun +Image=ui\Image\TargetPanel\Player.UITex +Frame=1 +Alpha=255 +Left=42 +Top=10 +PosType=0 +ImageType=1 +Width=155 +Height=11 + +[SFX_Rang] +._WndType=SFX +._Parent=Handle_CangYun +Left=106 +Top=16 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\N_怒气充满.pss +Scale=1.100000 +Loop=1 + +[Text_Rang] +._WndType=Text +._Parent=Handle_CangYun +RowSpacing=0 +Left=38 +Top=10 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +EventID=768 +TipRichText=0 +$Tip=STR_PROPERTY_NUQI +ShowTipType=0 +Width=150 +Height=14 +OrgText=0 + +[Image_Sword] +._WndType=Image +._Parent=Handle_CangYun +Image=ui\Image\TargetPanel\Player.UITex +Frame=5 +Alpha=255 +Left=2 +Top=32 +PosType=0 +ImageType=1 +$Tip=STR_CANGYUN_DAO +EventID=768 +TipRichText=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_Shield] +._WndType=Image +._Parent=Handle_CangYun +Image=ui\Image\TargetPanel\Player.UITex +Frame=0 +Alpha=255 +Left=33 +Top=22 +PosType=0 +ImageType=1 +$Tip=STR_CANGYUN_DUN +EventID=768 +TipRichText=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +LockShowAndHide=1 + +[Handle_Sheild] +._WndType=Handle +._Parent=Handle_CangYun +HandleType=0 +FirstItemPosType=0 +Left=206 +Top=12 +PosType=0 +Width=27 +Height=44 +EventID=256 +TipRichText=1 + +[Image_Sheild] +._WndType=Image +._Parent=Handle_Sheild +Image=ui\Image\UICommon\HorsePanel3.UITex +Frame=11 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +$Tip=STR_SHEILD_TIP1 +EventID=768 +TipRichText=1 +ShowTipType=0 +Width=26 +Height=32 + +[Image_SheildRed] +._WndType=Image +._Parent=Handle_Sheild +Image=ui\Image\UICommon\HorsePanel3.UITex +Frame=12 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +$Tip=STR_SHEILD_TIP2 +EventID=768 +TipRichText=0 +ShowTipType=0 +Width=26 +Height=32 +LockShowAndHide=1 + +[Image_SheildProgress] +._WndType=Image +._Parent=Handle_Sheild +Image=ui\Image\UICommon\HorsePanel3.UITex +Frame=13 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=4 +Width=26 +Height=32 + +[Text_Num] +._WndType=Text +._Parent=Handle_Sheild +RowSpacing=0 +$Text=99 +Left=-2 +Top=-1 +PosType=0 +FontScheme=27 +HAlign=1 +VAlign=2 +FontSpacing=1 +Alpha=255 +TipRichText=1 +Width=33 +Height=46 +OrgText=1 +$Tip=STR_CANGYUN_DUNPAITIPS +EventID=768 +ShowTipType=0 + +[Handle_CG] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=107 +Top=22 +PosType=0 +Width=215 +Height=53 +LockShowAndHide=1 + +[Handle_YangChun] +._WndType=Handle +._Parent=Handle_CG +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Image_BgYangChun] +._WndType=Image +._Parent=Handle_YangChun +Left=-14 +Top=-8 +PosType=0 +Image=ui\Image\UICommon\ChangGe2.UITex +Alpha=255 +Frame=0 + +[SFX_YangChun] +._WndType=SFX +._Parent=Handle_YangChun +Left=152 +Top=20 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\C_长歌技能条UI_白雪.pss +Scale=5.000000 + +[Handle_GaoShan] +._WndType=Handle +._Parent=Handle_CG +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Image_BgGaoShan] +._WndType=Image +._Parent=Handle_GaoShan +Left=-14 +Top=-8 +PosType=0 +Image=ui\Image\UICommon\ChangGe2.UITex +Alpha=255 +Frame=2 + +[SFX_GaoShan] +._WndType=SFX +._Parent=Handle_GaoShan +Left=163 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\C_长歌技能条UI_高山.pss +Scale=5.000000 + +[Handle_PingSha] +._WndType=Handle +._Parent=Handle_CG +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[Image_BgPingSha] +._WndType=Image +._Parent=Handle_PingSha +Left=-14 +Top=-8 +PosType=0 +Image=ui\Image\UICommon\ChangGe2.UITex +Alpha=255 +Frame=1 + +[SFX_PingSha] +._WndType=SFX +._Parent=Handle_PingSha +Left=159 +Top=27 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\C_长歌技能条UI_羽毛.pss +Scale=5.000000 + +[Handle_MeiHua] +._WndType=Handle +._Parent=Handle_CG +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_BgMeiHua] +._WndType=Image +._Parent=Handle_MeiHua +Left=-14 +Top=-8 +PosType=0 +Image=ui\Image\UICommon\ChangGe2.UITex +Alpha=255 +Frame=6 + +[SFX_MeiHua] +._WndType=SFX +._Parent=Handle_MeiHua +Left=110 +Top=25 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\C_长歌技能条UI_梅花.pss + +[Handle_BaDao] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=112 +Top=-6 +PosType=0 +Width=291 +Height=62 +LockShowAndHide=1 + +[Handle_Default] +._WndType=Handle +._Parent=Handle_BaDao +Left=16 +Top=5 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=200 +Height=50 +LockShowAndHide=1 + +[Image_Default] +._WndType=Image +._Parent=Handle_Default +Left=-6 +Top=3 +PosType=0 +Image=ui\Image\UICommon\Badao01.UITex +Alpha=255 +Frame=25 + +[SFX_Default] +._WndType=SFX +._Parent=Handle_Default +Left=92 +Top=14 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\UI_霸刀蓝条02.pss +Scale=0.670000 +Loop=1 +LockShowAndHide=1 + +[Handle_BigKnife] +._WndType=Handle +._Parent=Handle_BaDao +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=200 +Height=50 +LockShowAndHide=1 + +[Handle_ProgressB] +._WndType=Handle +._Parent=Handle_BigKnife +Left=6 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=119 +Height=26 +PixelScroll=0 +ReverseMask=0 +HAlign=1 +VAlign=1 +EventID=768 +TipRichText=1 +$Tip=STR_PLAYER_BADAO3 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_ProgressB1] +._WndType=Image +._Parent=Handle_ProgressB +Left=4 +Top=-1 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=2 + +[Image_ProgressB2] +._WndType=Image +._Parent=Handle_ProgressB +Left=4 +Top=-1 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=3 + +[Image_ProgressB3] +._WndType=Image +._Parent=Handle_ProgressB +Left=9 +Top=5 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=0 + +[Image_ProgressB4] +._WndType=Image +._Parent=Handle_ProgressB +Left=37 +Top=5 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=1 +ImageType=1 + +[Handle_BigTime] +._WndType=Handle +._Parent=Handle_BigKnife +Left=45 +Top=8 +PosType=0 +HandleType=0 +FirstItemPosType=0 +PixelScroll=1 +ShapTexture=ui\Image\JiangHu\badao2z.tga +ReverseMask=0 +Width=161 +Height=23 + +[SFX_BigProgress] +._WndType=SFX +._Parent=Handle_BigTime +Left=25 +Top=11 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条02.pss + +[SFX_DToB] +._WndType=SFX +._Parent=Handle_BigKnife +Left=80 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_双刀切大刀.pss +LockShowAndHide=1 + +[SFX_QToB] +._WndType=SFX +._Parent=Handle_BigKnife +Left=80 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_鞘刀切大刀.pss +LockShowAndHide=1 + +[SFX_0ToB] +._WndType=SFX +._Parent=Handle_BigKnife +Left=80 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条切换01.pss +LockShowAndHide=1 + +[Text_ValueB] +._WndType=Text +._Parent=Handle_BigKnife +Left=49 +Top=10 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=90 +Height=20 +VAlign=1 +$Text=100/100 +OrgText=1 +FontScheme=16 +FontColor= +HAlign=2 +EventID=768 +TipRichText=1 +$Tip=STR_PLAYER_BADAO3 +ShowTipType=0 + +[Handle_QiaoKnife] +._WndType=Handle +._Parent=Handle_BaDao +Left=3 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=200 +Height=50 + +[Handle_ProgressQ] +._WndType=Handle +._Parent=Handle_QiaoKnife +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=212 +Height=46 +PixelScroll=0 +ReverseMask=0 +HAlign=1 +VAlign=1 +$Tip=STR_PLAYER_BADAO4 +EventID=768 +TipRichText=1 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_ProgressQ1] +._WndType=Image +._Parent=Handle_ProgressQ +Left=-9 +Top=-1 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=6 + +[Image_ProgressQ2] +._WndType=Image +._Parent=Handle_ProgressQ +Left=-9 +Top=-1 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=7 + +[Image_ProgressQ3] +._WndType=Image +._Parent=Handle_ProgressQ +Left=-4 +Top=5 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=4 + +[Image_ProgressQ4] +._WndType=Image +._Parent=Handle_ProgressQ +Left=41 +Top=5 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=5 +ImageType=1 + +[SFX_New_0] +._WndType=SFX +._Parent=Handle_ProgressQ +Left=44 +Top=20 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条01.pss +Scale=0.900000 +Alpha=255 + +[SFX_New_1] +._WndType=SFX +._Parent=Handle_ProgressQ +Left=162 +Top=30 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\UI_霸刀闪电.pss +Scale=0.900000 +Alpha=255 + +[Handle_QiaoTime] +._WndType=Handle +._Parent=Handle_QiaoKnife +Left=43 +Top=8 +PosType=0 +HandleType=0 +FirstItemPosType=0 +PixelScroll=1 +ShapTexture=ui\Image\JiangHu\badao2z.tga +ReverseMask=0 +Width=161 +Height=22 + +[SFX_QiaoProgress] +._WndType=SFX +._Parent=Handle_QiaoTime +Left=0 +Top=11 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条02.pss + +[SFX_BToQ] +._WndType=SFX +._Parent=Handle_QiaoKnife +Left=78 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_大刀切鞘刀.pss +LockShowAndHide=1 + +[SFX_DToQ] +._WndType=SFX +._Parent=Handle_QiaoKnife +Left=78 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_双刀切鞘刀.pss +LockShowAndHide=1 + +[SFX_0ToQ] +._WndType=SFX +._Parent=Handle_QiaoKnife +Left=78 +Top=26 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条切换01.pss +LockShowAndHide=1 + +[Text_ValueQ] +._WndType=Text +._Parent=Handle_QiaoKnife +Left=46 +Top=10 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=90 +Height=20 +VAlign=1 +OrgText=1 +FontScheme=16 +FontColor= +HAlign=2 +EventID=768 +TipRichText=1 +$Text=100/100 +$Tip=STR_PLAYER_BADAO4 +ShowTipType=0 + +[Handle_DoubleKnife] +._WndType=Handle +._Parent=Handle_BaDao +Left=1 +Top=-2 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=200 +Height=50 +LockShowAndHide=1 + +[Handle_ProgressD] +._WndType=Handle +._Parent=Handle_DoubleKnife +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=207 +Height=60 +PixelScroll=1 +ReverseMask=0 +HAlign=1 +VAlign=1 +$Tip=STR_PLAYER_BADAO2 +EventID=768 +TipRichText=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_ProgressD1] +._WndType=Image +._Parent=Handle_ProgressD +Left=12 +Top=2 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=10 + +[Image_ProgressD2] +._WndType=Image +._Parent=Handle_ProgressD +Left=12 +Top=2 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=11 + +[Image_ProgressD3] +._WndType=Image +._Parent=Handle_ProgressD +Left=15 +Top=7 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=8 + +[Image_ProgressD4] +._WndType=Image +._Parent=Handle_ProgressD +Left=45 +Top=12 +PosType=0 +Image=ui\Image\UICommon\Badao05.UITex +Alpha=255 +Frame=9 +ImageType=1 + +[Handle_DoubleTime] +._WndType=Handle +._Parent=Handle_DoubleKnife +Left=47 +Top=13 +PosType=0 +HandleType=0 +FirstItemPosType=0 +PixelScroll=1 +ShapTexture=ui\Image\JiangHu\SDzhedao.tga +ReverseMask=0 +Width=155 +Height=34 + +[SFX_DoubleProgress] +._WndType=SFX +._Parent=Handle_DoubleTime +Left=151 +Top=18 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条02.pss +Scale=1.400000 + +[SFX_BToD] +._WndType=SFX +._Parent=Handle_DoubleKnife +Left=79 +Top=28 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_大刀切双刀.pss +LockShowAndHide=1 + +[SFX_QToD] +._WndType=SFX +._Parent=Handle_DoubleKnife +Left=79 +Top=28 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\bd_鞘刀切双刀.pss +LockShowAndHide=1 + +[SFX_0ToD] +._WndType=SFX +._Parent=Handle_DoubleKnife +Left=79 +Top=28 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\B_霸刀读条切换01.pss +LockShowAndHide=1 + +[Text_ValueD] +._WndType=Text +._Parent=Handle_DoubleKnife +Left=48 +Top=12 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=90 +Height=20 +VAlign=1 +$Text=20/100 +OrgText=1 +FontScheme=16 +FontColor= +HAlign=2 +EventID=256 +TipRichText=1 +$Tip=STR_PLAYER_BADAO2 +ShowTipType=0 + +[Handle_SheildList] +._WndType=Handle +._Parent=Handle_BaDao +Left=194 +Top=7 +PosType=0 +HandleType=3 +Width=97 +Height=62 +RowSpacing=0 +IgnoreInvisibleChild=1 + +[Handle_SheildBig] +._WndType=Handle +._Parent=Handle_SheildList +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=30 +Height=50 +TipRichText=1 +EventID=768 +$Tip=STR_PLAYER_BADAO3 +ShowTipType=0 + +[Image_SheildB] +._WndType=Image +._Parent=Handle_SheildBig +Image=ui\Image\UICommon\Badao01.UITex +Frame=15 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +TipRichText=1 + +[Image_SheildProgressB] +._WndType=Image +._Parent=Handle_SheildBig +Image=ui\Image\UICommon\Badao01.UITex +Frame=16 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=4 +ImagePercent=0.500 +EventID=768 +TipRichText=1 +$Tip=STR_PLAYER_BADAO3 + +[Text_NumB] +._WndType=Text +._Parent=Handle_SheildBig +RowSpacing=0 +$Text=100 +Left=0 +Top=36 +PosType=0 +FontScheme=241 +HAlign=1 +VAlign=2 +FontSpacing=1 +Alpha=255 +TipRichText=0 +Width=24 +Height=15 +OrgText=1 +EventID=256 +FontColor= + +[Handle_SheildQiao] +._WndType=Handle +._Parent=Handle_SheildList +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=30 +Height=50 +TipRichText=1 +$Tip=STR_PLAYER_BADAO4 +EventID=768 + +[Image_SheildQ] +._WndType=Image +._Parent=Handle_SheildQiao +Image=ui\Image\UICommon\Badao01.UITex +Frame=17 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +TipRichText=1 + +[Image_SheildProgressQ] +._WndType=Image +._Parent=Handle_SheildQiao +Image=ui\Image\UICommon\Badao01.UITex +Frame=18 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=4 +ImagePercent=0.500 +$Tip=STR_PLAYER_BADAO4 +EventID=768 +TipRichText=1 + +[Text_NumQ] +._WndType=Text +._Parent=Handle_SheildQiao +RowSpacing=0 +$Text=100 +Left=0 +Top=36 +PosType=0 +FontScheme=241 +HAlign=1 +VAlign=2 +FontSpacing=1 +Alpha=255 +TipRichText=1 +Width=24 +Height=15 +OrgText=1 +FontColor= + +[Handle_SheildDouble] +._WndType=Handle +._Parent=Handle_SheildList +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=30 +Height=50 +TipRichText=1 +$Tip=STR_PLAYER_BADAO2 +EventID=768 + +[Image_SheildD] +._WndType=Image +._Parent=Handle_SheildDouble +Image=ui\Image\UICommon\Badao01.UITex +Frame=19 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +TipRichText=1 + +[Image_SheildProgressD] +._WndType=Image +._Parent=Handle_SheildDouble +Image=ui\Image\UICommon\Badao01.UITex +Frame=20 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=4 +ImagePercent=0.500 +TipRichText=1 +$Tip=STR_PLAYER_BADAO2 +EventID=768 + +[Text_NumD] +._WndType=Text +._Parent=Handle_SheildDouble +RowSpacing=0 +$Text=100 +Left=0 +Top=36 +PosType=0 +FontScheme=241 +HAlign=1 +VAlign=2 +FontSpacing=1 +Alpha=255 +TipRichText=1 +Width=24 +Height=15 +OrgText=1 +FontColor= + +[Handle_TC] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=125 +Top=24 +PosType=0 +Width=206 +Height=62 +LockShowAndHide=1 + +[Image_TCBg] +._WndType=Image +._Parent=Handle_TC +Image=ui\Image\TargetPanel\Player.UITex +Frame=6 +Alpha=255 +Left=-4 +Top=-4 +PosType=0 +ImageType=1 +Width=231 +Height=55 + +[Image_TC] +._WndType=Image +._Parent=Handle_TC +Image=ui\Image\TargetPanel\Player.UITex +Frame=7 +Alpha=255 +Left=33 +Top=23 +PosType=0 +ImageType=1 +Width=155 +Height=6 + +[Text_TC] +._WndType=Text +._Parent=Handle_TC +RowSpacing=0 +Left=38 +Top=3 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +EventID=768 +TipRichText=0 +$Tip=STR_PROPERTY_ZHANYI +ShowTipType=0 +Width=150 +Height=14 +OrgText=1 +$Text=100/100 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_Break] +._WndType=Image +._Parent=Handle_TC +Left=29 +Top=10 +PosType=0 +Image=ui\Image\Common\CommonPanel.UITex +Alpha=255 +Frame=17 +Width=20 +Height=30 +LockShowAndHide=1 + +[SFX_TC1] +._WndType=SFX +._Parent=Handle_TC +Left=101 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_天策能量条01.pss +Scale=1.100000 +Alpha=255 +LockShowAndHide=1 + +[SFX_TC2] +._WndType=SFX +._Parent=Handle_TC +Left=104 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_天策能量条02.pss +Scale=1.100000 +LockShowAndHide=1 +Alpha=255 + +[SFX_TC3] +._WndType=SFX +._Parent=Handle_TC +Left=111 +Top=26 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_天策能量条03.pss +Loop=1 +Scale=1.300000 +LockShowAndHide=1 +Alpha=255 + +[Handle_MJ] +._WndType=Handle +._Parent=Handle_PlayerBar +Left=114 +Top=4 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=215 +Height=40 +LockShowAndHide=1 + +[Image_MingJiaoBG1] +._WndType=Image +._Parent=Handle_MJ +Left=40 +Top=-1 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=17 + +[Image_MingJiaoBG2] +._WndType=Image +._Parent=Handle_MJ +Left=34 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=18 +LockShowAndHide=1 + +[Image_SunCao] +._WndType=Image +._Parent=Handle_MJ +Left=42 +Top=7 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=21 +ImageType=0 +Width=129 +Height=10 + +[Image_SunEnergy] +._WndType=Image +._Parent=Handle_MJ +Left=42 +Top=7 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=22 +EventID=768 +TipRichText=0 +ImageType=1 +Width=129 +Height=10 + +[Image_MoonCao] +._WndType=Image +._Parent=Handle_MJ +Left=42 +Top=25 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=21 +ImageType=0 +Width=129 +Height=10 + +[Image_MoonEnergy] +._WndType=Image +._Parent=Handle_MJ +Left=42 +Top=25 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=23 +EventID=768 +ImageType=1 +Width=129 +Height=10 + +[Image_SunBG] +._WndType=Image +._Parent=Handle_MJ +Left=35 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=19 +LockShowAndHide=1 + +[Image_MoonBG] +._WndType=Image +._Parent=Handle_MJ +Left=35 +Top=16 +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=20 +LockShowAndHide=1 + +[SFX_Sun] +._WndType=SFX +._Parent=Handle_MJ +Left=115 +Top=12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_明教图标_日.pss +LockShowAndHide=1 + +[SFX_Moon] +._WndType=SFX +._Parent=Handle_MJ +Left=115 +Top=28 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_明教图标_月.pss +Alpha=255 +LockShowAndHide=1 + +[Text_Sun] +._WndType=Text +._Parent=Handle_MJ +RowSpacing=0 +Left=32 +Top=5 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +TipRichText=0 +Width=150 +Height=14 +OrgText=1 +$Text=100/100 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Text_Moon] +._WndType=Text +._Parent=Handle_MJ +RowSpacing=0 +Left=32 +Top=25 +PosType=0 +FontScheme=16 +HAlign=1 +VAlign=1 +FontSpacing=1 +Alpha=255 +TipRichText=0 +Width=150 +Height=14 +OrgText=1 +$Text=100/100 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Handle_YT] +._WndType=Handle +._Parent=Handle_PlayerBar +HandleType=0 +FirstItemPosType=0 +Left=102 +Top=24 +PosType=0 + +[Handle_100] +._WndType=Handle +._Parent=Handle_YT +Left=40 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=182 +Height=52 +LockShowAndHide=1 + +[SFX_YZFrame_100] +._WndType=SFX +._Parent=Handle_100 +Left=60 +Top=12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量背景短01.pss +Alpha=150 + +[Handle_Line_100] +._WndType=Handle +._Parent=Handle_100 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=124 +Height=36 +PixelScroll=1 + +[SFX_Line_100_Normal] +._WndType=SFX +._Parent=Handle_Line_100 +Left=0 +Top=9 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量背景紫短01.pss +Alpha=255 +Width=141 +Height=30 +LockShowAndHide=1 + +[SFX_Line_100_Therapy] +._WndType=SFX +._Parent=Handle_Line_100 +Left=0 +Top=10 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量背景金短01.pss +Alpha=255 +Width=136 +Height=30 +LockShowAndHide=1 + +[Handle_Point_100_0] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=1 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_0_Normal] +._WndType=SFX +._Parent=Handle_Point_100_0 +Left=7 +Top=8 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[SFX_Point_100_0_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_0 +Left=7 +Top=8 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[Handle_Point_100_2] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_2_Normal] +._WndType=SFX +._Parent=Handle_Point_100_2 +Left=34 +Top=19 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[SFX_Point_100_2_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_2 +Left=34 +Top=19 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[Handle_Point_100_4] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_4_Normal] +._WndType=SFX +._Parent=Handle_Point_100_4 +Left=61 +Top=17 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[SFX_Point_100_4_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_4 +Left=61 +Top=17 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[Handle_Point_100_6] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_6_Normal] +._WndType=SFX +._Parent=Handle_Point_100_6 +Left=81 +Top=7 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[SFX_Point_100_6_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_6 +Left=81 +Top=7 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[Handle_Point_100_8] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_8_Normal] +._WndType=SFX +._Parent=Handle_Point_100_8 +Left=106 +Top=9 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[SFX_Point_100_8_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_8 +Left=106 +Top=9 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[Handle_Point_100_10] +._WndType=Handle +._Parent=Handle_100 +Left=-8 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_100_10_Normal] +._WndType=SFX +._Parent=Handle_Point_100_10 +Left=130 +Top=17 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[SFX_Point_100_10_Therapy] +._WndType=SFX +._Parent=Handle_Point_100_10 +Left=130 +Top=17 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.500000 +LockShowAndHide=1 + +[Handle_Symbol_100] +._WndType=Handle +._Parent=Handle_100 +Left=124 +Top=-15 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Water_100] +._WndType=Handle +._Parent=Handle_Symbol_100 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Water_100] +._WndType=SFX +._Parent=Handle_Water_100 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量水01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Handle_Fire_100] +._WndType=Handle +._Parent=Handle_Symbol_100 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Fire_100] +._WndType=SFX +._Parent=Handle_Fire_100 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量火01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Handle_Mountain_100] +._WndType=Handle +._Parent=Handle_Symbol_100 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Mountain_100] +._WndType=SFX +._Parent=Handle_Mountain_100 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量山01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Text_YZNum_100] +._WndType=Text +._Parent=Handle_100 +Left=36 +Top=32 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=100/200 +FontScheme=15 +FontColor= + +[Image_Point_100] +._WndType=Image +._Parent=Handle_100 +Left=68 +Top=10 +PosType=0 +Image=ui\Image\UICommon\YanTianZong.UITex +Alpha=100 +Frame=7 +Width=5 +Height=5 +LockShowAndHide=1 + +[SFX_YZ1] +._WndType=SFX +._Parent=Handle_100 +Left=77 +Top=18 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\W_外装七夕扇_飞星01.pss +Alpha=200 +Loop=1 +Scale=0.500000 +LockShowAndHide=1 + +[Handle_200] +._WndType=Handle +._Parent=Handle_YT +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_YZFrame_200] +._WndType=SFX +._Parent=Handle_200 +Left=84 +Top=12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量背景长01.pss +Alpha=150 + +[Handle_Line_200] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=169 +Height=36 +PixelScroll=1 + +[SFX_Line_200_Normal] +._WndType=SFX +._Parent=Handle_Line_200 +Left=1 +Top=9 +PosType=0 +SFXFile=data\\source\\other\\HD特效\\其他\\Pss\\ui_衍天宗能量背景紫长01.pss +Alpha=255 +Width=168 +Height=30 +LockShowAndHide=1 + +[SFX_Line_200_Therapy] +._WndType=SFX +._Parent=Handle_Line_200 +Left=1 +Top=9 +PosType=0 +SFXFile=data\\source\\other\\HD特效\\其他\\Pss\\ui_衍天宗能量背景金长01.pss +Alpha=255 +Width=168 +Height=30 +LockShowAndHide=1 + +[Handle_Point_200_0] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_0_Normal] +._WndType=SFX +._Parent=Handle_Point_200_0 +Left=2 +Top=10 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=200 +Scale=3.000000 +LockShowAndHide=1 + +[SFX_Point_200_0_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_0 +Left=2 +Top=10 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=200 +Scale=3.000000 +LockShowAndHide=1 + +[Handle_Point_200_2] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_2_Normal] +._WndType=SFX +._Parent=Handle_Point_200_2 +Left=19 +Top=19 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=200 +Scale=2.700000 +LockShowAndHide=1 + +[SFX_Point_200_2_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_2 +Left=19 +Top=19 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=200 +Scale=2.700000 +LockShowAndHide=1 + +[Handle_Point_200_4] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_4_Normal] +._WndType=SFX +._Parent=Handle_Point_200_4 +Left=37 +Top=15 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=200 +Scale=2.000000 + +[SFX_Point_200_4_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_4 +Left=37 +Top=15 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=200 +Scale=2.000000 +LockShowAndHide=1 + +[Handle_Point_200_6] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_6_Normal] +._WndType=SFX +._Parent=Handle_Point_200_6 +Left=53 +Top=8 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=200 +Scale=3.000000 +LockShowAndHide=1 + +[SFX_Point_200_6_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_6 +Left=53 +Top=8 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=200 +Scale=3.000000 +LockShowAndHide=1 + +[Handle_Point_200_8] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_8_Normal] +._WndType=SFX +._Parent=Handle_Point_200_8 +Left=71 +Top=10 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=200 +Scale=1.700000 +LockShowAndHide=1 + +[SFX_Point_200_8_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_8 +Left=71 +Top=10 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=200 +Scale=1.700000 +LockShowAndHide=1 + +[Handle_Point_200_10] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_10_Normal] +._WndType=SFX +._Parent=Handle_Point_200_10 +Left=86 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=1.500000 + +[SFX_Point_200_10_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_10 +Left=86 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=1.500000 +LockShowAndHide=1 + +[Handle_Point_200_12] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_12_Normal] +._WndType=SFX +._Parent=Handle_Point_200_12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Left=102 +Top=8 +Scale=2.500000 +LockShowAndHide=1 + +[SFX_Point_200_12_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.500000 +Left=102 +Top=7 +LockShowAndHide=1 + +[Handle_Point_200_14] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_14_Normal] +._WndType=SFX +._Parent=Handle_Point_200_14 +Left=122 +Top=9 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[SFX_Point_200_14_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_14 +Left=122 +Top=9 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[Handle_Point_200_16] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_16_Normal] +._WndType=SFX +._Parent=Handle_Point_200_16 +Left=143 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[SFX_Point_200_16_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_16 +Left=143 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[Handle_Point_200_18] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_18_Normal] +._WndType=SFX +._Parent=Handle_Point_200_18 +Left=159 +Top=12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[SFX_Point_200_18_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_18 +Left=159 +Top=12 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=2.000000 +LockShowAndHide=1 + +[Handle_Point_200_20] +._WndType=Handle +._Parent=Handle_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +LockShowAndHide=1 + +[SFX_Point_200_20_Normal] +._WndType=SFX +._Parent=Handle_Point_200_20 +Left=169 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量紫星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[SFX_Point_200_20_Therapy] +._WndType=SFX +._Parent=Handle_Point_200_20 +Left=169 +Top=16 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量金星出现加循环01.pss +Alpha=255 +Scale=1.700000 +LockShowAndHide=1 + +[Handle_Symbol_200] +._WndType=Handle +._Parent=Handle_200 +Left=169 +Top=-15 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Water_200] +._WndType=Handle +._Parent=Handle_Symbol_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Water_200] +._WndType=SFX +._Parent=Handle_Water_200 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量水01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Handle_Fire_200] +._WndType=Handle +._Parent=Handle_Symbol_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Fire_200] +._WndType=SFX +._Parent=Handle_Fire_200 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量火01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Handle_Mountain_200] +._WndType=Handle +._Parent=Handle_Symbol_200 +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=53 +LockShowAndHide=1 + +[SFX_Mountain_200] +._WndType=SFX +._Parent=Handle_Mountain_200 +Left=15 +Top=31 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\ui_衍天宗能量山01.pss +Alpha=255 +Loop=1 +Tween=ui\Animation\RoadChivalrousDetail_Ani.ini +TweenName=Handle_ModeItem_In + +[Text_YZNum_200] +._WndType=Text +._Parent=Handle_200 +Left=57 +Top=32 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=100/200 +FontScheme=15 +FontColor= + +[Image_Point_200] +._WndType=Image +._Parent=Handle_200 +Left=68 +Top=10 +PosType=0 +Image=ui\Image\UICommon\YanTianZong.UITex +Alpha=100 +Frame=7 +Width=5 +Height=5 +LockShowAndHide=1 + +[SFX_YZ2] +._WndType=SFX +._Parent=Handle_200 +Left=155 +Top=22 +PosType=0 +SFXFile=data\source\other\HD特效\其他\Pss\W_外装七夕扇_飞星01.pss +Alpha=200 +Scale=0.800000 +Loop=1 +LockShowAndHide=1 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=Playerbar +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 + +[CheckBox_Cap] +._WndType=WndCheckBox +._Parent=Playerbar +Left=118 +Top=3 +Width=44 +Height=40 +Frame=8 +UnCheckAndEnable=2 +CheckAndEnable=4 +UnCheckAndDisable=6 +CheckAndDisable=6 +UnCheckedAndEnableWhenMouseOver=2 +CheckedAndEnableWhenMouseOver=5 +CheckedAndDisableWhenMouseOver=6 +UnCheckedAndDisableWhenMouseOver=6 +Checking=6 +UnChecking=6 +Image=ui\Image\UICommon\skills2.UITex +CheckedWhenCreate=1 +LockShowAndHide=1 + diff --git a/MY_GKP/img/GKPLoot.Tga b/MY_GKP/img/GKPLoot.Tga new file mode 100644 index 000000000..5ff0990ee Binary files /dev/null and b/MY_GKP/img/GKPLoot.Tga differ diff --git a/MY_GKP/img/GKPLoot.UITex b/MY_GKP/img/GKPLoot.UITex new file mode 100644 index 000000000..b7f5da59e Binary files /dev/null and b/MY_GKP/img/GKPLoot.UITex differ diff --git a/MY_GKP/img/GKPLoot.txt b/MY_GKP/img/GKPLoot.txt new file mode 100644 index 000000000..22db359bc --- /dev/null +++ b/MY_GKP/img/GKPLoot.txt @@ -0,0 +1,3 @@ +Farme Left Top Width High File +0 0 0 28 20 C:\Users\root\Desktop\购买成功.tga +1 30 0 28 20 C:\Users\root\Desktop\(new)购买成功.tga diff --git a/MY_GKP/img/GKPSeal.Tga b/MY_GKP/img/GKPSeal.Tga new file mode 100644 index 000000000..900e4dbe8 Binary files /dev/null and b/MY_GKP/img/GKPSeal.Tga differ diff --git a/MY_GKP/img/GKPSeal.UITex b/MY_GKP/img/GKPSeal.UITex new file mode 100644 index 000000000..d6020a09f Binary files /dev/null and b/MY_GKP/img/GKPSeal.UITex differ diff --git a/MY_GKP/img/GKPSeal.txt b/MY_GKP/img/GKPSeal.txt new file mode 100644 index 000000000..b7cfed8f2 --- /dev/null +++ b/MY_GKP/img/GKPSeal.txt @@ -0,0 +1,8 @@ +Farme Left Top Width High File +0 0 0 250 250 D:\印章\背锅.tga +1 252 0 250 250 D:\印章\黑出翔.tga +2 0 252 250 250 D:\印章\脸帅.tga +3 252 252 250 250 D:\印章\特别红.tga +4 504 0 250 250 D:\印章\玄晶专用g.tga +5 756 0 250 250 D:\印章\玄晶专用r.tga +6 504 252 250 250 D:\印章\自称小红手.tga diff --git a/MY_GKP/info.ini b/MY_GKP/info.ini new file mode 100644 index 000000000..431c54db4 --- /dev/null +++ b/MY_GKP/info.ini @@ -0,0 +1,18 @@ +[MY_GKP] +name=金团记录 +desc=团队拍卖记账,好团长必备 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_GKP.lua +lua_1=src/MY_GKP_DS.lua +lua_2=src/MY_GKP_AuctionUI.lua +lua_3=src/MY_GKP_UI.lua +lua_4=src/MY_GKP_MI.lua +lua_5=src/MY_GKP.PS.lua +lua_6=src/MY_GKPLoot.lua +lua_7=src/MY_GKPChat.lua +lua_8=src/MY_GKPVote.lua +lua_9=src/MY_GKPDoodad.lua +lua_10=src/MY_GKPGoldTeamLootHook.lua diff --git a/MY_GKP/info.ini.zh_TW b/MY_GKP/info.ini.zh_TW new file mode 100644 index 000000000..b30dacdc1 --- /dev/null +++ b/MY_GKP/info.ini.zh_TW @@ -0,0 +1,18 @@ +[MY_GKP] +name=閲戝湗瑷橀寗 +desc=鍦橀殜鎷嶈常瑷樿超锛屽ソ鍦橀暦蹇呭倷 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_GKP.lua +lua_1=src/MY_GKP_DS.lua +lua_2=src/MY_GKP_AuctionUI.lua +lua_3=src/MY_GKP_UI.lua +lua_4=src/MY_GKP_MI.lua +lua_5=src/MY_GKP.PS.lua +lua_6=src/MY_GKPLoot.lua +lua_7=src/MY_GKPChat.lua +lua_8=src/MY_GKPVote.lua +lua_9=src/MY_GKPDoodad.lua +lua_10=src/MY_GKPGoldTeamLootHook.lua diff --git a/MY_GKP/lang/default.jx3dat b/MY_GKP/lang/default.jx3dat new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/MY_GKP/lang/default.jx3dat @@ -0,0 +1 @@ +return {} diff --git a/MY_GKP/lang/zhcn.jx3dat b/MY_GKP/lang/zhcn.jx3dat new file mode 100644 index 000000000..35d0368de --- /dev/null +++ b/MY_GKP/lang/zhcn.jx3dat @@ -0,0 +1,249 @@ +return { + ['MY_GKP'] = '金团记录', + ['MY GKP'] = '茗伊金团', + -- GKP.lua -- + ['Set Force Color'] = '牌子按照职业颜色着色', + ['select equip boss'] = '选择散件老板(右键可重选)', + ['GKP does not support bidding, please re open loot list.'] = '该物品需要拍卖分配,金团记录不支持拍团模式,请关闭拾取窗口重新打开系统拾取列表。', + ['Show Gold Brick'] = '显示单位为金砖', + ['salary'] = '工资发放', + ['Treasure Chests'] = '宝箱', + ['Boss'] = '老板', + ['Banquet Allowance'] = '宴席补贴', + ['Fines'] = '犯错罚款', + ['Other'] = '其他', + ['[Team]'] = '%[团队%]', + ['No open doodad'] = '没有打开Doodad', + ['Userdata is overdue, distribut failed, please try again.'] = 'userdata过期,分配失败,清重新尝试。', + ['Pick up time limit exceeded, please try again.'] = '拾取时间超出限制,请再试一次。', + ['No Pick up Object, may due to Network off - line'] = '没有拾取对象,可能是掉线了。', + ['Cannot distrubute items to Equipment Boss, may due to Equipment Boss is too far away or got dropline when looting.'] = '无法将物品分配给当前散件老板,可能因为散件老板不在线、距离太远或者物品拾取时散件老板掉线了。', + ['Please unlock talk lock, otherwise gkp will not able to sync to teammate.'] = '金团记录同步失败,请先解除聊天锁。', + + ['LClick to distrubute all equipment to '] = '鼠标左键点击分配所有装备给', + ['Ctrl + LClick to distrubute all lootable items to '] = '按住Ctrl点击鼠标左键分配所有物品给', + ['.'] = '。', + ['RClick to reselect Equipment Boss.'] = '右键点击重新选择散件老板。', + ['LClick to distrubute all equipment to Equipment Boss.'] = '鼠标左键点击分配所有装备给散件老板。', + ['Ctrl + LClick to distrubute all lootable items to Equipment Boss.'] = '按住Ctrl点击鼠标左键分配所有物品给散件老板。', + ['Click to select Equipment Boss.'] = '点击选择散件老板。', + + ['MY_GKP_Chat'] = '金团拍卖', + ['No Pick up Object, Please confirm that in the Dungeon.'] = '没有拾取对象,请确认在同一地图。', + ['Stop Bidding'] = '拍卖结束', + ['--- Stop Bidding ---'] = '------ 拍卖结束 ------', + ['GKP Golden Team Record'] = '金团记录', + ['Setting'] = '设置', + ['Add Manually'] = '手动添加', + ['You are not the distrubutor.'] = '你不是分配者。', + ['Debt Issued'] = '发布欠债记录', + ['Clear Record'] = '清空记录', + ['History record'] = '历史记录', + ['Load data source failed!'] = '数据源加载失败!', + ['Set current record'] = '设为当前记录', + ['Manual SYNC'] = '手动同步', + ['Keep Account to:'] = '记账到:', + ['Name of the Item:'] = '物品名称:', + ['Route of Acquiring:'] = '获得途径:', + ['Auction Price:'] = '拍卖价格:', + ['Please enter numbers'] = '请输入数字', + ['Equiptment Boss'] = '散件老板', + ['Gainer'] = '获得者', + ['Name of the Items'] = '物品名称', + ['Auction Price'] = '拍卖价格', + ['Source of the Object'] = '物品来源', + ['Distribution Time'] = '分配时间', + ['Transation Target'] = '交易对象', + ['Changes in Money'] = '金钱变动', + ['Ways of Money Change'] = '金钱变动方式', + ['The Map of Current Location when Money Changes'] = '金钱变动时所在地图', + ['The Change of Time'] = '变动时间', + ['Preference Setting'] = '偏好设置', + ['Open Panel'] = '打开面板', + ['Clause with 0 Gold as Record'] = '显示记录为0金的条目', + ['Auto Fill the amount of BiXi Fragment as Price'] = '自动填充碧玺碎片数量为价格', + ['Remind Wipe Data When Enter Dungeon'] = '进入秘境提醒清空数据', + ['Automatic Reception with Record From Distributor'] = '自动接收分配者发出的记录同步', + ['Sync system reception'] = '同步官方金团分配记录', + ['Prefer use new bidding panel'] = '默认使用新版拍卖界面', + ['Popup Record for Distributor'] = '分配者弹出价格记录框', + ['Allowance Protocols'] = '补贴方案', + ['Edit Allowance Protocols'] = '编辑补贴方案', + ['Auction Protocols'] = '拍卖方案', + ['Edit Auction Protocols'] = '编辑拍卖方案', + ['Money Record'] = '金钱记录', + ['Track Money Trend in the System'] = '记录系统金钱变动', + ['Enable Money Trend'] = '开启金钱变动喊话', + ['Money trend only distributor'] = '仅当自己或对方为分配者时', + ['Team Profile on Equipment Score'] = '团队概况显示装备分', + ['Add New Protocols'] = '添加新方案', + ['New Protocol Format: Protocol\'s Name, Money'] = '新方案 格式:方案名,金钱', + ['Edit All Protocols'] = '编辑所有方案', + ['New Protocol Format: Money, Step; Money, Step'] = '新方案 格式:底价,加价;底价,加价...', + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['No Record'] = '没有记录', + ['System Information as Shown Below\n\n'] = '---------- 统计信息如下 ----------\n\n', + ['Total Cosumption:'] = '总计消费:', + ['Total Allowance:'] = '总计补贴:', + ['Total Payment:'] = '总计付款:', + ['Money on Debt:'] = '欠债金额:', + ['Auction Money <=0.'] = '拍卖金额<=0。', + ['Left click to sync from others, right click to sync to others'] = '左键点击从他人同步数据,右键点击同步数据给他人。', + ['Please select which will be the one you are going to ask record for.'] = '请选择向谁获取记录', + ['Wheater replace the current record with the synchronization [%s]\'s record?\n Please notice, this means you are going to lose the information of current record.'] = '是否将当前的记录替换为[%s]的记录?\n请注意,这将失去你当前记录的信息。\n', + ['Asking for the sychoronization information...\n If no response in longtime, it may because [%s] is not using MY_GKP plugin or not responding.'] = '正在请求同步信息.... \n如果长时间没有反应可能是[%s]没有使用茗伊金团记录插件或未响应。', + ['Please select which will be the one you are going to send record to.'] = '请选择发送记录给谁', + ['Full raid.'] = '所有团员', + ['Wheater synchronize your record to [%s]?\n Please notice, this means the opposite sites are going to lose their information of current record.'] = '是否将当前的记录发送给[%s]?\n请注意,这将使对方失去当前记录的信息。\n', + ['Wheater synchronize your record to full raid?\n Please notice, this means the opposite sites are going to lose their information of current record.'] = '是否将当前的记录发送给全体团员?\n请注意,这将使对方失去当前记录的信息。\n', + ['Start Sychoronizing...'] = '同步开始....', + ['Sychoronizing data please wait %d%% loaded.'] = '同步数据中请稍等 当前进度:%d%%', + ['Sychoronization Complete'] = '同步已完成', + ['Abnormal with Data Sharing, Please contact and make feed back with the writer.'] = '数据共享异常,请联系作者反馈。', + ['Data Sharing Finished, you have one last chance to confirm wheather cover the current data with [%s]\'s data or not? \n data of team bidding: %s\n transation data: %s'] = '数据同步完毕,你还有最后一次机会确认是否接受[%s]的数据覆盖现有数据?\n拍团数据:%s\n交易数据:%s', + ['Print Ticket'] = '打印小票', + ['Shot screen succeed, file saved as %s .'] = '屏幕截图成功,小票保存路径:%s', + ['Operator:%s'] = '操作员:%s', + ['Print Time:%s'] = '打印时间:%s', + ['Loading Data of the Character\'s name: %s (edit by clicking)'] = '读取数据的角色名:%s(点击修改)', + ['Modify to Lead the Character\'s name'] = '修改导入角色名', + ['Are you sure to cover the current information with the last record data?'] = '你确定加载该记录覆盖当前金团数据吗?', + ['Set record caption'] = '设置标题', + ['Please input new caption'] = '请输入新标题', + ['Reocrd Recovered.'] = '记录恢复成功。', + ['Records are wiped'] = '金团记录成功清空。', + ['Are you sure to wipe all of the records?'] = '确定清空金团记录吗?', + ['Information on Debt'] = '------ 欠债情况 ------', + ['Received: %d Gold.'] = '收到:%d 金。', + ['Spending: %d Gold.'] = '支出:%d 金。', + ['--- Consumption ---'] = '------ 消费情况 ------', + ['Total Auction:'] = '总计拍卖:', + ['Salary Allowance:'] = '补贴金额:', + ['Reall Salary:'] = '实际工资:', + ['Spending:'] = '支出:', + ['Total income:'] = '总计收入:', + ['Reall income:'] = '实际收入:', + ['Total Auction: %d Gold.'] = '总计拍卖:%d 金。', + ['Total Amount of People with Output Settle Account'] = '输入结算的总人数', + ['Salary Settle Account'] = '------ 工资结算 ------', + ['Salary Statistic: income %d Gold.'] = '工资统计:收入 %d金。', + ['Salary Allowance: %d Gold.'] = '工资补贴:%d金。', + ['Reall Salary: %d Gold.'] = '实际工资:%d金。', + ['Amount of People with Settle Account: %d'] = '结算人数:%d', + ['Actual per person: %d Gold.'] = '实际每人:%d金。', + ['switch styles'] = '切换样式', + ['Link All Item'] = '贴出所有物品', + ['The Account is Negative, no money is coming out!'] = '记账的人肯定是猪,账是负的发不出钱了!', + ['GKP_TIPS'] = '《金团记录 - 拾取列表》操作指南。\n1、本拾取列表为金团记录插件提供,插件安装后关闭了官方自带的拾取列表,如想恢复请不要加载金团记录。\n2、拾取列表对特定的道具拥有分配记忆功能,例如小铁和裂石等,只需要按住Shift点击闪烁边框的道具即可分配给上一个人。\n3、拾取列表左上角有更换样式的按钮,可以自由选择喜欢的样式。\n4、分配时按住Shift会阻止弹出记录界面,达到快速分配的目的。\n5、如果分配时勾选了散件老板,那么会出现一键分配所有物品给这个成员的选项,在关闭按钮旁边。\n6、按住Alt可以预览外观。', + ['Roll the dice if you wang'] = ' 要的请Roll点,命令 /roll。', + ['Hold SHIFT click to raise ancient bidding panel.'] = '按住SHIFT点击,可打开旧版拍卖界面。', + ['Hold SHIFT click to raise new bidding panel.'] = '按住SHIFT点击,可打开新版拍卖界面。', + [' %d Gold Start Bidding, off a price if you want.'] = ' %d 金起拍,要的出价。', + ['You already distrubute [%s] with [%s], you can press Shift and select the object to make a fast distrubution, you can also make distribution to he or her by clicking this menu. \n'] = '上次你已经把 [%s] 分配给了 [%s] ,下次可以直接在物品图标上按住Shift快速分配给 [%s] ,也可以点击这个菜单分配给TA。\n', + ['No Equiptment left for Equiptment Boss'] = '没有剩余的装备可以分配给散件老板。', + ['Are you sure you want the following item\n'] = '你确定要将以下物品\n', + ['All distrubute to'] = '全部分配给', + ['Please entry the name of the item'] = '请输入物品名称', + ['Select a member who is in charge of account and put money in his account.'] = '选择一个记账的成员把钱记到他头上啊,你真笨!', + [' Distribute to '] = ' 分配给 ', + ['Make changes to the record.'] = ' 对记录做了修改。', + ['Manually make record to'] = ' 手动记录到 ', + ['A distribute record has produced, it has been ignored in the combat, it will automatically popup after breaking away from the combat.'] = '产生了一条分配记录,战斗中已忽略,脱离后自动弹出。', + ['Received'] = '收到', + ['The'] = '的', + ['Pay to'] = '支付给 ', + ['Player\'s transation'] = '玩家交易', + ['System'] = '系统', + ['Reward & other ways'] = '奖励&其他方式', + ['%s log in with %d Gold in possession'] = '%s 上线时身上有 %d 金。', + ['Golden Team Record'] = '金团记录', + ['Open/Close Golden Team Record'] = '打开/关闭金团记录', + ['Do you want to wipe the previous data when you enter the dungeon\'s map?'] = '您刚进入秘境,是否要清空上次金团记录?', + ['Spend time approx %d:%d'] = '所花时间 ≈ %d小时%d分钟', + ['Manually load from file.'] = '手动加载记录文件', + ['Please select gkp file.'] = '请选择GKP记录文件', + ['Confirm?'] = '确定执行这个操作?', + ['Loot item filter'] = '拾取显示过滤', + ['Hide filter items'] = '隐藏过滤物品', + ['Hide all filter items instead of collapse display them, will be reset after loading.'] = '勾选后隐藏被过滤的物品,而不是折叠显示过滤物品,将会在每次过图后禁用。', + ['Quality filter'] = '品级过滤', + ['Filter book read'] = '过滤已读书籍', + ['Filter book have'] = '过滤已有书籍', + ['Name filter'] = '名称过滤', + ['Name filter list'] = '名称过滤列表', + ['Enable'] = '启用', + ['Add'] = '添加', + ['Please input filter name'] = '请输入过滤物品名称', + ['Auto pickup'] = '物品自动拾取', + ['Auto pickup quest item'] = '自动拾取任务物品', + ['Auto pickup book'] = '自动拾取书籍', + ['Show 2nd kungfu fit icon'] = '显示第二心法装备推荐图标', + ['Sort loot list by weight'] = '按照价值高低排序掉落物品', + ['Confirm when distribute'] = '分配时二次确认', + ['Category'] = '分类', + ['Huangbaba' ] = '玄晶', + ['Book' ] = '书籍', + ['Pendant' ] = '挂件', + ['Outlook' ] = '肩饰披风', + ['Pet' ] = '跟宠', + ['Horse' ] = '坐骑', + ['HorseEquip'] = '马具', + ['Quality'] = '品级', + ['Filters have higher priority'] = '优先匹配过滤选项', + ['Auto pickup filters'] = '过滤拾取物品名称', + ['Auto pickup by item quality'] = '自动拾取物品品级', + ['Auto pickup by item quality data'] = '自动拾取物品品级数据', + ['Auto pickup names'] = '自动拾取物品名称', + ['Add new'] = '添加', + ['Please input new auto pickup filter:'] = '输入新的自动拾取物品名称过滤:', + ['Please input new auto pickup name:'] = '输入新的自动拾取物品名称:', + ['Reach %s'] = '达到%s', + ['Config'] = '详细设置', + ['Team Members: %d, %d agree %d%%'] = '团队共%d人,%d人已同意发放工资,当前比率%d%%。', + ['Onekey distrib this group'] = '一键分配该组物品', + ['Hold shift click to skip gkp record panel'] = '按住SHIFT点击可跳过价格记录界面', + ['Auto append'] = '茗伊金团追加', + -- Doodad + ['MY_GKPLoot'] = '采集拾取', + ['GKP Doodad helper'] = '金团拾取', + ['Enable MY_GKPLoot'] = '启用金团拾取', + ['Enable in checked map type'] = '在勾选地图类型中启用', + ['Team dungeon'] = '小队秘境', + ['Raid dungeon'] = '团队秘境', + ['Battlefield'] = '战场', + ['Other map'] = '其它地图', + ['MY_GKPLoot enabled in current map'] = '当前地图金团拾取状态:启用', + ['MY_GKPLoot disabled in current map'] = '当前地图金团拾取状态:禁用', + -- MY_GKPDoodad + ['MY_GKPDoodad'] = '采集助手', + ['Pickup helper'] = '拾取助手', + ['Enable auto pickup'] = '自动打开掉落', + ['Auto craft'] = '自动采集', + ['Pickup in fight'] = '战斗中也打开', + ['Craft assit'] = '采集助手', + ['Interact in fight'] = '战斗中也采集', + ['Show the head name'] = '显示头顶名字', + ['Head name color'] = '头顶名字颜色', + ['Head name font'] = '头顶名字字体', + ['Head name font scale'] = '头顶名字字体缩放', + ['Font'] = '字体', + ['Craft list'] = '草药、矿石列表', + ['Font scale is %d%%.'] = '缩放%d%%。', + ['Display minimap flag'] = '小地图中显示', + ['Mining doodad'] = '采金', + ['Herbalism doodad'] = '神农', + ['Skinning doodad'] = '庖丁', + ['Quest doodad'] = '任务', + ['Read inscription doodad'] = '已读碑铭', + ['Unread inscription doodad'] = '未读碑铭', + ['Other doodad'] = '其它物品', + ['Recent doodad'] = '最近采集物品', + ['Recent crafted doodads during current game'] = '本次游戏过程中主动采集过的物品', + ['All doodad'] = '全部物品', + ['Customs (split by | )'] = '自定义(用|分隔):', + ['Custom list'] = '自定义列表', + ['|'] = '|', + ['Tip: Enter the name of dead animals can be automatically Paoding!'] = '小提示:填入动物尸体名称可以自动庖丁!', + ['(Read)'] = '(已阅读)', + ['(Not read)'] = '(未阅读)', +} diff --git a/MY_GKP/lang/zhtw.jx3dat b/MY_GKP/lang/zhtw.jx3dat new file mode 100644 index 000000000..b5fbe223e --- /dev/null +++ b/MY_GKP/lang/zhtw.jx3dat @@ -0,0 +1,249 @@ +return { + ['MY_GKP'] = '閲戝湗瑷橀寗', + ['MY GKP'] = '鑼椾紛閲戝湗', + -- GKP.lua -- + ['Set Force Color'] = '鐗屽瓙鎸夌収鑱锋キ椤忚壊钁楄壊', + ['select equip boss'] = '閬告搰鏁d欢鑰侀梿锛堝彸閸靛彲閲嶉伕锛', + ['GKP does not support bidding, please re open loot list.'] = '瑭茬墿鍝侀渶瑕佹媿璩e垎閰嶏紝閲戝湗瑷橀寗涓嶆敮鎸佹媿鍦樻ā寮忥紝璜嬮棞闁夋嬀鍙栫獥鍙i噸鏂版墦闁嬬郴绲辨嬀鍙栧垪琛ㄣ', + ['Show Gold Brick'] = '椤ず鍠綅鐐洪噾纾', + ['salary'] = '宸ヨ硣鐧兼斁', + ['Treasure Chests'] = '瀵剁', + ['Boss'] = '鑰侀梿', + ['Banquet Allowance'] = '瀹村腑瑁滆布', + ['Fines'] = '鐘尟缃版', + ['Other'] = '鍏朵粬', + ['[Team]'] = '%[鍦橀殜%]', + ['No open doodad'] = '娌掓湁鎵撻枊Doodad', + ['Userdata is overdue, distribut failed, please try again.'] = 'userdata閬庢湡锛屽垎閰嶅け鏁楋紝娓呴噸鏂板槜瑭︺', + ['Pick up time limit exceeded, please try again.'] = '鎷惧彇鏅傞枔瓒呭嚭闄愬埗锛岃珛鍐嶈│涓娆°', + ['No Pick up Object, may due to Network off - line'] = '娌掓湁鎷惧彇灏嶈薄锛屽彲鑳芥槸鎺夌窔浜嗐', + ['Cannot distrubute items to Equipment Boss, may due to Equipment Boss is too far away or got dropline when looting.'] = '鐒℃硶灏囩墿鍝佸垎閰嶇郸鐣跺墠鏁d欢鑰侀梿锛屽彲鑳藉洜鐐烘暎浠惰侀梿涓嶅湪绶氥佽窛闆㈠お閬犳垨鑰呯墿鍝佹嬀鍙栨檪鏁d欢鑰侀梿鎺夌窔浜嗐', + ['Please unlock talk lock, otherwise gkp will not able to sync to teammate.'] = '閲戝湗瑷橀寗鍚屾澶辨晽锛岃珛鍏堣В闄よ亰澶╅帠銆', + + ['LClick to distrubute all equipment to '] = '婊戦紶宸﹂嵉榛炴搳鍒嗛厤鎵鏈夎鍌欑郸', + ['Ctrl + LClick to distrubute all lootable items to '] = '鎸変綇Ctrl榛炴搳婊戦紶宸﹂嵉鍒嗛厤鎵鏈夌墿鍝佺郸', + ['.'] = '銆', + ['RClick to reselect Equipment Boss.'] = '鍙抽嵉榛炴搳閲嶆柊閬告搰鏁d欢鑰侀梿銆', + ['LClick to distrubute all equipment to Equipment Boss.'] = '婊戦紶宸﹂嵉榛炴搳鍒嗛厤鎵鏈夎鍌欑郸鏁d欢鑰侀梿銆', + ['Ctrl + LClick to distrubute all lootable items to Equipment Boss.'] = '鎸変綇Ctrl榛炴搳婊戦紶宸﹂嵉鍒嗛厤鎵鏈夌墿鍝佺郸鏁d欢鑰侀梿銆', + ['Click to select Equipment Boss.'] = '榛炴搳閬告搰鏁d欢鑰侀梿銆', + + ['MY_GKP_Chat'] = '閲戝湗鎷嶈常', + ['No Pick up Object, Please confirm that in the Dungeon.'] = '娌掓湁鎷惧彇灏嶈薄锛岃珛纰鸿獚鍦ㄥ悓涓鍦板湒銆', + ['Stop Bidding'] = '鎷嶈常绲愭潫', + ['--- Stop Bidding ---'] = '------ 鎷嶈常绲愭潫 ------', + ['GKP Golden Team Record'] = '閲戝湗瑷橀寗', + ['Setting'] = '瑷疆', + ['Add Manually'] = '鎵嬪嫊娣诲姞', + ['You are not the distrubutor.'] = '浣犱笉鏄垎閰嶈呫', + ['Debt Issued'] = '鐧间綀娆犲偟瑷橀寗', + ['Clear Record'] = '娓呯┖瑷橀寗', + ['History record'] = '姝峰彶瑷橀寗', + ['Load data source failed!'] = '鏁告摎婧愯級鍏ュけ鏁楋紒', + ['Set current record'] = '瑷偤鐣跺墠瑷橀寗', + ['Manual SYNC'] = '鎵嬪嫊鍚屾', + ['Keep Account to:'] = '瑷樿超鍒帮細', + ['Name of the Item:'] = '鐗╁搧鍚嶇ū锛', + ['Route of Acquiring:'] = '鐛插緱閫斿緫锛', + ['Auction Price:'] = '鎷嶈常鍍规牸锛', + ['Please enter numbers'] = '璜嬭几鍏ユ暩瀛', + ['Equiptment Boss'] = '鏁d欢鑰侀梿', + ['Gainer'] = '鐛插緱鑰', + ['Name of the Items'] = '鐗╁搧鍚嶇ū', + ['Auction Price'] = '鎷嶈常鍍规牸', + ['Source of the Object'] = '鐗╁搧渚嗘簮', + ['Distribution Time'] = '鍒嗛厤鏅傞枔', + ['Transation Target'] = '浜ゆ槗灏嶈薄', + ['Changes in Money'] = '閲戦將璁婂嫊', + ['Ways of Money Change'] = '閲戦將璁婂嫊鏂瑰紡', + ['The Map of Current Location when Money Changes'] = '閲戦將璁婂嫊鏅傛墍鍦ㄥ湴鍦', + ['The Change of Time'] = '璁婂嫊鏅傞枔', + ['Preference Setting'] = '鍋忓ソ瑷疆', + ['Open Panel'] = '鎵撻枊闈㈡澘', + ['Clause with 0 Gold as Record'] = '椤ず瑷橀寗鐐0閲戠殑姊濈洰', + ['Auto Fill the amount of BiXi Fragment as Price'] = '鑷嫊濉厖纰х捊纰庣墖鏁搁噺鐐哄児鏍', + ['Remind Wipe Data When Enter Dungeon'] = '閫插叆绉樺鎻愰啋娓呯┖鏁告摎', + ['Automatic Reception with Record From Distributor'] = '鑷嫊鎺ユ敹鍒嗛厤鑰呯櫦鍑虹殑瑷橀寗鍚屾', + ['Sync system reception'] = '鍚屾瀹樻柟閲戝湗鍒嗛厤瑷橀寗', + ['Prefer use new bidding panel'] = '榛樿獚浣跨敤鏂扮増鎷嶈常鐣岄潰', + ['Popup Record for Distributor'] = '鍒嗛厤鑰呭綀鍑哄児鏍艰閷勬', + ['Allowance Protocols'] = '瑁滆布鏂规', + ['Edit Allowance Protocols'] = '绶ㄨ集瑁滆布鏂规', + ['Auction Protocols'] = '鎷嶈常鏂规', + ['Edit Auction Protocols'] = '绶ㄨ集鎷嶈常鏂规', + ['Money Record'] = '閲戦將瑷橀寗', + ['Track Money Trend in the System'] = '瑷橀寗绯荤当閲戦將璁婂嫊', + ['Enable Money Trend'] = '闁嬪暉閲戦將璁婂嫊鍠婅┍', + ['Money trend only distributor'] = '鍍呯暥鑷繁鎴栧皪鏂圭偤鍒嗛厤鑰呮檪', + ['Team Profile on Equipment Score'] = '鍦橀殜姒傛硜椤ず瑁濆倷鍒', + ['Add New Protocols'] = '娣诲姞鏂版柟妗', + ['New Protocol Format: Protocol\'s Name, Money'] = '鏂版柟妗 鏍煎紡锛氭柟妗堝悕,閲戦將', + ['Edit All Protocols'] = '绶ㄨ集鎵鏈夋柟妗', + ['New Protocol Format: Money, Step; Money, Step'] = '鏂版柟妗 鏍煎紡锛氬簳鍍,鍔犲児;搴曞児,鍔犲児...', + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['No Record'] = '娌掓湁瑷橀寗', + ['System Information as Shown Below\n\n'] = '---------- 绲辫▓淇℃伅濡備笅 ----------\n\n', + ['Total Cosumption:'] = '绺借▓娑堣不锛', + ['Total Allowance:'] = '绺借▓瑁滆布锛', + ['Total Payment:'] = '绺借▓浠樻锛', + ['Money on Debt:'] = '娆犲偟閲戦锛', + ['Auction Money <=0.'] = '鎷嶈常閲戦<=0銆', + ['Left click to sync from others, right click to sync to others'] = '宸﹂嵉榛炴搳寰炰粬浜哄悓姝ユ暩鎿氾紝鍙抽嵉榛炴搳鍚屾鏁告摎绲︿粬浜恒', + ['Please select which will be the one you are going to ask record for.'] = '璜嬮伕鎿囧悜瑾扮嵅鍙栬閷', + ['Wheater replace the current record with the synchronization [%s]\'s record?\n Please notice, this means you are going to lose the information of current record.'] = '鏄惁灏囩暥鍓嶇殑瑷橀寗鏇挎彌鐐篬%s]鐨勮閷勶紵\n璜嬫敞鎰忥紝閫欏皣澶卞幓浣犵暥鍓嶈閷勭殑淇℃伅銆俓n', + ['Asking for the sychoronization information...\n If no response in longtime, it may because [%s] is not using MY_GKP plugin or not responding.'] = '姝e湪璜嬫眰鍚屾淇℃伅.... \n濡傛灉闀锋檪闁撴矑鏈夊弽鎳夊彲鑳芥槸[%s]娌掓湁浣跨敤鑼椾紛閲戝湗瑷橀寗鎻掍欢鎴栨湭闊挎噳銆', + ['Please select which will be the one you are going to send record to.'] = '璜嬮伕鎿囩櫦閫佽閷勭郸瑾', + ['Full raid.'] = '鎵鏈夊湗鍝', + ['Wheater synchronize your record to [%s]?\n Please notice, this means the opposite sites are going to lose their information of current record.'] = '鏄惁灏囩暥鍓嶇殑瑷橀寗鐧奸佺郸[%s]锛焅n璜嬫敞鎰忥紝閫欏皣浣垮皪鏂瑰け鍘荤暥鍓嶈閷勭殑淇℃伅銆俓n', + ['Wheater synchronize your record to full raid?\n Please notice, this means the opposite sites are going to lose their information of current record.'] = '鏄惁灏囩暥鍓嶇殑瑷橀寗鐧奸佺郸鍏ㄩ珨鍦樺摗锛焅n璜嬫敞鎰忥紝閫欏皣浣垮皪鏂瑰け鍘荤暥鍓嶈閷勭殑淇℃伅銆俓n', + ['Start Sychoronizing...'] = '鍚屾闁嬪....', + ['Sychoronizing data please wait %d%% loaded.'] = '鍚屾鏁告摎涓珛绋嶇瓑 鐣跺墠閫插害锛%d%%', + ['Sychoronization Complete'] = '鍚屾宸插畬鎴', + ['Abnormal with Data Sharing, Please contact and make feed back with the writer.'] = '鏁告摎鍏变韩鐣板父锛岃珛鑱公浣滆呭弽楗嬨', + ['Data Sharing Finished, you have one last chance to confirm wheather cover the current data with [%s]\'s data or not? \n data of team bidding: %s\n transation data: %s'] = '鏁告摎鍚屾瀹岀暍锛屼綘閭勬湁鏈寰屼竴娆℃鏈冪⒑瑾嶆槸鍚︽帴鍙梉%s]鐨勬暩鎿氳钃嬬従鏈夋暩鎿氾紵\n鎷嶅湗鏁告摎锛%s\n浜ゆ槗鏁告摎锛%s', + ['Print Ticket'] = '鍒楀嵃灏忕エ', + ['Shot screen succeed, file saved as %s .'] = '灞忓箷鎴湒鎴愬姛锛屽皬绁ㄤ繚瀛樿矾寰戯細%s', + ['Operator:%s'] = '鎿嶄綔鍝★細%s', + ['Print Time:%s'] = '鍒楀嵃鏅傞枔锛%s', + ['Loading Data of the Character\'s name: %s (edit by clicking)'] = '璁鍙栨暩鎿氱殑瑙掕壊鍚嶏細%s锛堥粸鎿婁慨鏀癸級', + ['Modify to Lead the Character\'s name'] = '淇敼灏庡叆瑙掕壊鍚', + ['Are you sure to cover the current information with the last record data?'] = '浣犵⒑瀹氳級鍏ヨ┎瑷橀寗瑕嗚搵鐣跺墠閲戝湗鏁告摎鍡庯紵', + ['Set record caption'] = '瑷疆妯欓', + ['Please input new caption'] = '璜嬭几鍏ユ柊妯欓', + ['Reocrd Recovered.'] = '瑷橀寗鎭㈣鎴愬姛銆', + ['Records are wiped'] = '閲戝湗瑷橀寗鎴愬姛娓呯┖銆', + ['Are you sure to wipe all of the records?'] = '纰哄畾娓呯┖閲戝湗瑷橀寗鍡庯紵', + ['Information on Debt'] = '------ 娆犲偟鎯呮硜 ------', + ['Received: %d Gold.'] = '鏀跺埌锛%d 閲戙', + ['Spending: %d Gold.'] = '鏀嚭锛%d 閲戙', + ['--- Consumption ---'] = '------ 娑堣不鎯呮硜 ------', + ['Total Auction:'] = '绺借▓鎷嶈常锛', + ['Salary Allowance:'] = '瑁滆布閲戦锛', + ['Reall Salary:'] = '瀵﹂殯宸ヨ硣锛', + ['Spending:'] = '鏀嚭锛', + ['Total income:'] = '绺借▓鏀跺叆锛', + ['Reall income:'] = '瀵﹂殯鏀跺叆锛', + ['Total Auction: %d Gold.'] = '绺借▓鎷嶈常锛%d 閲戙', + ['Total Amount of People with Output Settle Account'] = '杓稿叆绲愮畻鐨勭附浜烘暩', + ['Salary Settle Account'] = '------ 宸ヨ硣绲愮畻 ------', + ['Salary Statistic: income %d Gold.'] = '宸ヨ硣绲辫▓锛氭敹鍏 %d閲戙', + ['Salary Allowance: %d Gold.'] = '宸ヨ硣瑁滆布锛%d閲戙', + ['Reall Salary: %d Gold.'] = '瀵﹂殯宸ヨ硣锛%d閲戙', + ['Amount of People with Settle Account: %d'] = '绲愮畻浜烘暩锛%d', + ['Actual per person: %d Gold.'] = '瀵﹂殯姣忎汉锛%d閲戙', + ['switch styles'] = '鍒囨彌妯e紡', + ['Link All Item'] = '璨煎嚭鎵鏈夌墿鍝', + ['The Account is Negative, no money is coming out!'] = '瑷樿超鐨勪汉鑲畾鏄爆锛岃超鏄矤鐨勭櫦涓嶅嚭閷簡锛', + ['GKP_TIPS'] = '銆婇噾鍦樿閷 - 鎷惧彇鍒楄〃銆嬫搷浣滄寚鍗椼俓n1銆佹湰鎷惧彇鍒楄〃鐐洪噾鍦樿閷勬彃浠舵彁渚涳紝鎻掍欢瀹夎寰岄棞闁変簡瀹樻柟鑷付鐨勬嬀鍙栧垪琛紝濡傛兂鎭㈠京璜嬩笉瑕佽級鍏ラ噾鍦樿閷勩俓n2銆佹嬀鍙栧垪琛ㄥ皪鐗瑰畾鐨勯亾鍏锋搧鏈夊垎閰嶈鎲跺姛鑳斤紝渚嬪灏忛惖鍜岃鐭崇瓑锛屽彧闇瑕佹寜浣廠hift榛炴搳闁冪垗閭婃鐨勯亾鍏峰嵆鍙垎閰嶇郸涓婁竴鍊嬩汉銆俓n3銆佹嬀鍙栧垪琛ㄥ乏涓婅鏈夋洿鎻涙ǎ寮忕殑鎸夐垥锛屽彲浠ヨ嚜鐢遍伕鎿囧枩姝$殑妯e紡銆俓n4銆佸垎閰嶆檪鎸変綇Shift鏈冮樆姝㈠綀鍑鸿閷勭晫闈紝閬斿埌蹇熷垎閰嶇殑鐩殑銆俓n5銆佸鏋滃垎閰嶆檪鍕鹃伕浜嗘暎浠惰侀梿锛岄偅楹兼渻鍑虹従涓閸靛垎閰嶆墍鏈夌墿鍝佺郸閫欏嬫垚鍝$殑閬搁爡锛屽湪闂滈枆鎸夐垥鏃侀倞銆俓n6銆佹寜浣廇lt鍙互闋愯澶栬銆', + ['Roll the dice if you wang'] = ' 瑕佺殑璜婻oll榛烇紝鍛戒护 /roll銆', + ['Hold SHIFT click to raise ancient bidding panel.'] = '鎸変綇SHIFT榛炴搳锛屽彲鎵撻枊鑸婄増鎷嶈常鐣岄潰銆', + ['Hold SHIFT click to raise new bidding panel.'] = '鎸変綇SHIFT榛炴搳锛屽彲鎵撻枊鏂扮増鎷嶈常鐣岄潰銆', + [' %d Gold Start Bidding, off a price if you want.'] = ' %d 閲戣捣鎷嶏紝瑕佺殑鍑哄児銆', + ['You already distrubute [%s] with [%s], you can press Shift and select the object to make a fast distrubution, you can also make distribution to he or her by clicking this menu. \n'] = '涓婃浣犲凡缍撴妸 [%s] 鍒嗛厤绲︿簡 [%s] 锛屼笅娆″彲浠ョ洿鎺ュ湪鐗╁搧鍦栨涓婃寜浣廠hift蹇熷垎閰嶇郸 [%s] 锛屼篃鍙互榛炴搳閫欏嬭彍鍠垎閰嶇郸TA銆俓n', + ['No Equiptment left for Equiptment Boss'] = '娌掓湁鍓╅鐨勮鍌欏彲浠ュ垎閰嶇郸鏁d欢鑰侀梿銆', + ['Are you sure you want the following item\n'] = '浣犵⒑瀹氳灏囦互涓嬬墿鍝乗n', + ['All distrubute to'] = '鍏ㄩ儴鍒嗛厤绲', + ['Please entry the name of the item'] = '璜嬭几鍏ョ墿鍝佸悕绋', + ['Select a member who is in charge of account and put money in his account.'] = '閬告搰涓鍊嬭璩殑鎴愬摗鎶婇將瑷樺埌浠栭牠涓婂晩锛屼綘鐪熺锛', + [' Distribute to '] = ' 鍒嗛厤绲 ', + ['Make changes to the record.'] = ' 灏嶈閷勫仛浜嗕慨鏀广', + ['Manually make record to'] = ' 鎵嬪嫊瑷橀寗鍒 ', + ['A distribute record has produced, it has been ignored in the combat, it will automatically popup after breaking away from the combat.'] = '鐢㈢敓浜嗕竴姊濆垎閰嶈閷勶紝鎴伴涓凡蹇界暐锛岃劔闆㈠緦鑷嫊褰堝嚭銆', + ['Received'] = '鏀跺埌', + ['The'] = '鐨', + ['Pay to'] = '鏀粯绲 ', + ['Player\'s transation'] = '鐜╁浜ゆ槗', + ['System'] = '绯荤当', + ['Reward & other ways'] = '鐛庡嫷&鍏朵粬鏂瑰紡', + ['%s log in with %d Gold in possession'] = '%s 涓婄窔鏅傝韩涓婃湁 %d 閲戙', + ['Golden Team Record'] = '閲戝湗瑷橀寗', + ['Open/Close Golden Team Record'] = '鎵撻枊/闂滈枆閲戝湗瑷橀寗', + ['Do you want to wipe the previous data when you enter the dungeon\'s map?'] = '鎮ㄥ墰閫插叆绉樺锛屾槸鍚﹁娓呯┖涓婃閲戝湗瑷橀寗锛', + ['Spend time approx %d:%d'] = '鎵鑺辨檪闁 鈮 %d灏忔檪%d鍒嗛悩', + ['Manually load from file.'] = '鎵嬪嫊杓夊叆瑷橀寗鏂囦欢', + ['Please select gkp file.'] = '璜嬮伕鎿嘒KP瑷橀寗鏂囦欢', + ['Confirm?'] = '纰哄畾鍩疯閫欏嬫搷浣滐紵', + ['Loot item filter'] = '鎷惧彇椤ず閬庢烤', + ['Hide filter items'] = '闅辫棌閬庢烤鐗╁搧', + ['Hide all filter items instead of collapse display them, will be reset after loading.'] = '鍕鹃伕寰岄毐钘忚閬庢烤鐨勭墿鍝侊紝鑰屼笉鏄懞鐤婇’绀洪亷婵剧墿鍝侊紝灏囨渻鍦ㄦ瘡娆¢亷鍦栧緦绂佺敤銆', + ['Quality filter'] = '鍝佺礆閬庢烤', + ['Filter book read'] = '閬庢烤宸茶畝鏇哥睄', + ['Filter book have'] = '閬庢烤宸叉湁鏇哥睄', + ['Name filter'] = '鍚嶇ū閬庢烤', + ['Name filter list'] = '鍚嶇ū閬庢烤鍒楄〃', + ['Enable'] = '鍟熺敤', + ['Add'] = '娣诲姞', + ['Please input filter name'] = '璜嬭几鍏ラ亷婵剧墿鍝佸悕绋', + ['Auto pickup'] = '鐗╁搧鑷嫊鎷惧彇', + ['Auto pickup quest item'] = '鑷嫊鎷惧彇浠诲嫏鐗╁搧', + ['Auto pickup book'] = '鑷嫊鎷惧彇鏇哥睄', + ['Show 2nd kungfu fit icon'] = '椤ず绗簩蹇冩硶瑁濆倷鎺ㄨ枽鍦栨', + ['Sort loot list by weight'] = '鎸夌収鍍瑰奸珮浣庢帓搴忔帀钀界墿鍝', + ['Confirm when distribute'] = '鍒嗛厤鏅備簩娆$⒑瑾', + ['Category'] = '鍒嗛', + ['Huangbaba' ] = '鐜勬櫠', + ['Book' ] = '鏇哥睄', + ['Pendant' ] = '鎺涗欢', + ['Outlook' ] = '鑲╅>鎶ⅷ', + ['Pet' ] = '璺熷', + ['Horse' ] = '鍧愰◣', + ['HorseEquip'] = '棣叿', + ['Quality'] = '鍝佺礆', + ['Filters have higher priority'] = '鍎厛鍖归厤閬庢烤閬搁爡', + ['Auto pickup filters'] = '閬庢烤鎷惧彇鐗╁搧鍚嶇ū', + ['Auto pickup by item quality'] = '鑷嫊鎷惧彇鐗╁搧鍝佺礆', + ['Auto pickup by item quality data'] = '鑷嫊鎷惧彇鐗╁搧鍝佺礆鏁告摎', + ['Auto pickup names'] = '鑷嫊鎷惧彇鐗╁搧鍚嶇ū', + ['Add new'] = '娣诲姞', + ['Please input new auto pickup filter:'] = '杓稿叆鏂扮殑鑷嫊鎷惧彇鐗╁搧鍚嶇ū閬庢烤锛', + ['Please input new auto pickup name:'] = '杓稿叆鏂扮殑鑷嫊鎷惧彇鐗╁搧鍚嶇ū锛', + ['Reach %s'] = '閬斿埌%s', + ['Config'] = '瑭崇窗瑷疆', + ['Team Members: %d, %d agree %d%%'] = '鍦橀殜鍏%d浜猴紝%d浜哄凡鍚屾剰鐧兼斁宸ヨ硣锛岀暥鍓嶆瘮鐜%d%%銆', + ['Onekey distrib this group'] = '涓閸靛垎閰嶈┎绲勭墿鍝', + ['Hold shift click to skip gkp record panel'] = '鎸変綇SHIFT榛炴搳鍙烦閬庡児鏍艰閷勭晫闈', + ['Auto append'] = '鑼椾紛閲戝湗杩藉姞', + -- Doodad + ['MY_GKPLoot'] = '鎺¢泦鎷惧彇', + ['GKP Doodad helper'] = '閲戝湗鎷惧彇', + ['Enable MY_GKPLoot'] = '鍟熺敤閲戝湗鎷惧彇', + ['Enable in checked map type'] = '鍦ㄥ嬀閬稿湴鍦栭鍨嬩腑鍟熺敤', + ['Team dungeon'] = '灏忛殜绉樺', + ['Raid dungeon'] = '鍦橀殜绉樺', + ['Battlefield'] = '鎴板牬', + ['Other map'] = '鍏跺畠鍦板湒', + ['MY_GKPLoot enabled in current map'] = '鐣跺墠鍦板湒閲戝湗鎷惧彇鐙鎱嬶細鍟熺敤', + ['MY_GKPLoot disabled in current map'] = '鐣跺墠鍦板湒閲戝湗鎷惧彇鐙鎱嬶細绂佺敤', + -- MY_GKPDoodad + ['MY_GKPDoodad'] = '鎺¢泦鍔╂墜', + ['Pickup helper'] = '鎷惧彇鍔╂墜', + ['Enable auto pickup'] = '鑷嫊鎵撻枊鎺夎惤', + ['Auto craft'] = '鑷嫊鎺¢泦', + ['Pickup in fight'] = '鎴伴涓篃鎵撻枊', + ['Craft assit'] = '鎺¢泦鍔╂墜', + ['Interact in fight'] = '鎴伴涓篃鎺¢泦', + ['Show the head name'] = '椤ず闋爞鍚嶅瓧', + ['Head name color'] = '闋爞鍚嶅瓧椤忚壊', + ['Head name font'] = '闋爞鍚嶅瓧瀛楅珨', + ['Head name font scale'] = '闋爞鍚嶅瓧瀛楅珨绺斁', + ['Font'] = '瀛楅珨', + ['Craft list'] = '鑽夎棩銆佺う鐭冲垪琛', + ['Font scale is %d%%.'] = '绺斁%d%%銆', + ['Display minimap flag'] = '灏忓湴鍦栦腑椤ず', + ['Mining doodad'] = '鎺¢噾', + ['Herbalism doodad'] = '绁炶静', + ['Skinning doodad'] = '搴栦竵', + ['Quest doodad'] = '浠诲嫏', + ['Read inscription doodad'] = '宸茶畝纰戦姌', + ['Unread inscription doodad'] = '鏈畝纰戦姌', + ['Other doodad'] = '鍏跺畠鐗╁搧', + ['Recent doodad'] = '鏈杩戞帯闆嗙墿鍝', + ['Recent crafted doodads during current game'] = '鏈娓告埐閬庣▼涓富鍕曟帯闆嗛亷鐨勭墿鍝', + ['All doodad'] = '鍏ㄩ儴鐗╁搧', + ['Customs (split by | )'] = '鑷畾缇╋紙鐢▅鍒嗛殧锛夛細', + ['Custom list'] = '鑷畾缇╁垪琛', + ['|'] = '锝', + ['Tip: Enter the name of dead animals can be automatically Paoding!'] = '灏忔彁绀猴細濉叆鍕曠墿灞嶉珨鍚嶇ū鍙互鑷嫊搴栦竵锛', + ['(Read)'] = '锛堝凡闁辫畝锛', + ['(Not read)'] = '锛堟湭闁辫畝锛', +} diff --git a/MY_GKP/src/MY_GKP.PS.lua b/MY_GKP/src/MY_GKP.PS.lua new file mode 100644 index 000000000..b7131d985 --- /dev/null +++ b/MY_GKP/src/MY_GKP.PS.lua @@ -0,0 +1,263 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP.PS' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} + +----------------------------------------------------------------------> +-- 获取补贴方案菜单 +----------------------------------------------------------------------< +function D.GetSubsidiesMenu() + local menu = { szOption = _L['Edit Allowance Protocols'], rgb = { 255, 0, 0 } } + table.insert(menu, { + szOption = _L['Add New Protocols'], + rgb = { 255, 255, 0 }, + fnAction = function() + GetUserInput(_L['New Protocol Format: Protocol\'s Name, Money'], function(txt) + local t = X.SplitString(txt, ',') + local aSubsidies = MY_GKP.aSubsidies + table.insert(aSubsidies, { t[1], tonumber(t[2]) or '', true }) + MY_GKP.aSubsidies = aSubsidies + end) + end, + }) + table.insert(menu, { bDevide = true}) + for k, v in ipairs(MY_GKP.aSubsidies) do + table.insert(menu, { + szOption = v[1], + bCheck = true, + bChecked = v[3], + fnAction = function() + v[3] = not v[3] + MY_GKP.aSubsidies = MY_GKP.aSubsidies + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + local aSubsidies = MY_GKP.aSubsidies + for ii, vv in ipairs(aSubsidies) do + if v == vv then + table.remove(aSubsidies, ii) + end + end + MY_GKP.aSubsidies = aSubsidies + X.UI.ClosePopupMenu() + end, + }) + end + return menu +end +----------------------------------------------------------------------> +-- 获取拍卖方案菜单 +----------------------------------------------------------------------< +function D.GetSchemeMenu() + local menu = { szOption = _L['Edit Auction Protocols'], rgb = { 255, 0, 0 } } + table.insert(menu,{ + szOption = _L['Edit All Protocols'], + rgb = { 255, 255, 0 }, + fnAction = function() + local a = {} + if X.IsTable(MY_GKP.aScheme) then + for k, v in ipairs(MY_GKP.aScheme) do + table.insert(a, tostring(v[1]) .. ',' .. tostring(v[2])) + end + end + GetUserInput(_L['New Protocol Format: Money, Step; Money, Step'], function(txt) + local t = X.SplitString(txt, ';') + local aScheme = {} + for k, v in ipairs(t) do + local a = X.SplitString(v, ',') + if a[1] and a[2] then + a[1] = tonumber(a[1]) + a[2] = tonumber(a[2]) + end + if not X.IsEmpty(a[1]) and not X.IsEmpty(a[2]) then + table.insert(aScheme, { a[1], a[2], true }) + end + end + MY_GKP.aScheme = aScheme + end, nil, nil, nil, table.concat(a, ';')) + end + }) + table.insert(menu, { bDevide = true }) + for k, v in ipairs(MY_GKP.aScheme) do + table.insert(menu,{ + szOption = v[1] .. ',' .. v[2], + bCheck = true, + bChecked = v[3], + fnAction = function() + v[3] = not v[3] + MY_GKP.aScheme = MY_GKP.aScheme + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + local aScheme = MY_GKP.aScheme + for ii, vv in ipairs(aScheme) do + if v == vv then + table.remove(aScheme, ii) + end + end + MY_GKP.aScheme = aScheme + X.UI.ClosePopupMenu() + end, + }) + end + + return menu +end + +local PS = { nPriority = 2 } + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 25, 25 + local nX, nY, nLFY = nPaddingX, nPaddingY, nPaddingY + local nLineHeightS, nLineHeightM, nLineHeightL = 22, 28, 32 + local nW, nH = ui:Size() + + ui:Append('WndButton', { + x = nW - 165, y = nPaddingY, w = 150, h = 38, + text = _L['Open Panel'], + buttonStyle = 'SKEUOMORPHISM_LACE_BORDER', + onClick = MY_GKP_MI.OpenPanel, + }) + + nX, nY, nLFY = MY_GKPLoot.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLineHeightM, nX, nY, nLFY) + nX, nY = nPaddingX, nLFY + 10 + + ui:Append('Text', { x = nX, y = nY, text = _L['Preference Setting'], font = 27 }) + nY = nY + 28 + + nX = nX + 10 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Popup Record for Distributor'], checked = MY_GKP.bOn, + onCheck = function(bChecked) + MY_GKP.bOn = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Clause with 0 Gold as Record'], checked = MY_GKP.bDisplayEmptyRecords, + onCheck = function(bChecked) + MY_GKP.bDisplayEmptyRecords = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + color = { 255, 128, 0 } , text = _L['Show Gold Brick'], checked = MY_GKP.bShowGoldBrick, + onCheck = function(bChecked) + MY_GKP.bShowGoldBrick = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Remind Wipe Data When Enter Dungeon'], checked = MY_GKP.bAlertMessage, + onCheck = function(bChecked) + MY_GKP.bAlertMessage = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Automatic Reception with Record From Distributor'], checked = MY_GKP.bAutoSync, + onCheck = function(bChecked) + MY_GKP.bAutoSync = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Sync system reception'], checked = MY_GKP.bSyncSystem, + onCheck = function(bChecked) + MY_GKP.bSyncSystem = bChecked + end, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, + text = _L['Prefer use new bidding panel'], checked = MY_GKP.bNewBidding, + onCheck = function(bChecked) + MY_GKP.bSyncSystem = bChecked + end, + }) + nY = nY + 28 + + nY = nY + 5 + ui:Append('WndComboBox', { x = nX, y = nY, w = 150, text = _L['Edit Allowance Protocols'], menu = D.GetSubsidiesMenu }) + ui:Append('WndComboBox', { x = nX + 160, y = nY, text = _L['Edit Auction Protocols'], menu = D.GetSchemeMenu }) + nY = nY + 28 + + nX = nPaddingX + nY = nY + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['Money Record'], font = 27 }) + nY = nY + 28 + + nX = nX + 10 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 150, checked = MY_GKP.bMoneySystem, text = _L['Track Money Trend in the System'], + onCheck = function(bChecked) + MY_GKP.bMoneySystem = bChecked + end, + }) + nY = nY + 28 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Enable Money Trend'], + checked = MY_GKP.bMoneyTalk, + onCheck = function(bChecked) + MY_GKP.bMoneyTalk = bChecked + end, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Money trend only distributor'], + checked = MY_GKP.bMoneyTalkOnlyDistributor, + onCheck = function(bChecked) + MY_GKP.bMoneyTalkOnlyDistributor = bChecked + end, + autoEnable = function() return MY_GKP.bMoneyTalk end, + }):Width() + 5 + nY = nY + 28 +end +X.Panel.Register(_L['General'], 'MY_GKP', _L['GKP Golden Team Record'], 2490, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKP.lua b/MY_GKP/src/MY_GKP.lua new file mode 100644 index 000000000..ca83fdebf --- /dev/null +++ b/MY_GKP/src/MY_GKP.lua @@ -0,0 +1,453 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_GKP', _L['General'], { + bOn = { -- enable + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Popup Record for Distributor'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bMoneyTalk = { -- 金钱变动喊话 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Enable Money Trend'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bMoneyTalkOnlyDistributor = { -- 金钱变动喊话仅分配者 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Money trend only distributor'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAlertMessage = { -- 进入秘境提醒清空数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Remind Wipe Data When Enter Dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bMoneySystem = { -- 记录系统金钱变动 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Track Money Trend in the System'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bDisplayEmptyRecords = { -- show 0 record + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Clause with 0 Gold as Record'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoSync = { -- 自动接收分配者的同步信息 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Automatic Reception with Record From Distributor'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowGoldBrick = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Show Gold Brick'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + aSubsidies = { -- 补贴方案 + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Allowance Protocols'], + }), + xSchema = X.Schema.Collection(X.Schema.Tuple( + X.Schema.String, + X.Schema.OneOf(X.Schema.String, X.Schema.Number), + X.Schema.Boolean + )), + xDefaultValue = { + { _L['Treasure Chests'], '', true}, + -- { X.GetItemNameByUIID(73214), '', true}, + { _L['Boss'], '', true}, + { _L['Banquet Allowance'], -1000, true}, + { _L['Fines'], '', true}, + { _L['Other'], '', true}, + }, + }, + aScheme = { -- 拍卖方案 + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Auction Protocols'], + }), + xSchema = X.Schema.Collection(X.Schema.Tuple( + X.Schema.Number, + X.Schema.Number, + X.Schema.Boolean + )), + xDefaultValue = { + { 100, 100, true }, + { 1000, 1000, true }, + { 2000, 1000, true }, + { 3000, 1000, true }, + { 4000, 1000, true }, + { 5000, 1000, true }, + { 6000, 1000, true }, + { 7000, 1000, true }, + { 8000, 1000, true }, + { 9000, 1000, true }, + { 10000, 2000, true }, + { 20000, 2000, true }, + { 50000, 2000, true }, + { 100000, 5000, true }, + }, + }, + bSyncSystem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Sync system reception'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bNewBidding = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKP'], + szDescription = X.MakeCaption({ + _L['Prefer use new bidding panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +----------------------------------------------------------------------> +-- 数据处理 +----------------------------------------------------------------------< +function D.LoadConfig() + local szPath = X.FormatPath({'config/gkp.cfg.jx3dat', X.PATH_TYPE.GLOBAL}) + local Config = X.LoadLUAData(szPath) + if Config then + CPath.DelFile(szPath) + X.SafeCall(X.Set, O, 'aSubsidies', Config.Subsidies) + X.SafeCall(X.Set, O, 'aScheme', Config.Scheme2 or O.aScheme) + end +end + +function D.OutputSystemMessage(szMsg) + X.OutputSystemMessage(_L['MY GKP'], szMsg) +end + +function D.GetTimeString(nTime, year) + if year then + return FormatTime('%H:%M:%S', nTime) + else + return FormatTime('%Y-%m-%d %H:%M:%S', nTime) + end +end + +function D.GetMoneyCol(Money) + local Money = tonumber(Money) + if Money then + if Money < 0 then + return 0, 128, 255 + elseif Money < 1000 then + return 255, 255, 255 + elseif Money < 10000 then + return 255, 255, 164 + elseif Money < 100000 then + return 255, 255, 0 + elseif Money < 1000000 then + return 255, 192, 0 + elseif Money < 10000000 then + return 255, 92, 0 + else + return 255, 0, 0 + end + else + return 255, 255, 255 + end +end + +function D.GetFormatLink(item, bName) + if type(item) == 'string' then + if bName then + return { type = 'name', name = item, text = '[' .. item ..']' } + else + return { type = 'text', text = item } + end + else + if item.nGenre == ITEM_GENRE.BOOK then + return { type = 'book', tabtype = item.dwTabType, index = item.dwIndex, bookinfo = item.nBookID, version = item.nVersion, text = '' } + else + return { type = 'iteminfo', version = item.nVersion, tabtype = item.dwTabType, index = item.dwIndex, text = '' } + end + end +end + +function D.GetMoneyTipText(nGold) + local szUitex = 'ui/image/common/money.UITex' + local r, g, b = D.GetMoneyCol(nGold) + if MY_GKP.bShowGoldBrick then + if nGold >= 0 then + return GetFormatText(math.floor(nGold / 10000), 41, r, g, b) .. GetFormatImage(szUitex, 27) .. GetFormatText(math.floor(nGold % 10000), 41, r, g, b) .. GetFormatImage(szUitex, 0) + else + nGold = nGold * -1 + return GetFormatText('-' .. math.floor(nGold / 10000), 41, r, g, b) .. GetFormatImage(szUitex, 27) .. GetFormatText(math.floor(nGold % 10000), 41, r, g, b) .. GetFormatImage(szUitex, 0) + end + else + return GetFormatText(nGold, 41, r, g, b) .. GetFormatImage(szUitex, 0) + end +end + +-- 发放工资 +function D.Bidding(nMoney) + local team = GetClientTeam() + if not X.IsClientPlayerTeamDistributor() then + return X.Alert(_L['You are not the distrubutor.']) + end + local nGold = nMoney + if nGold <= 0 then + return X.Alert(_L['Auction Money <=0.']) + end + local t, fnAction = {}, nil + InsertDistributeMenu(t, false) + for k, v in ipairs(t[1]) do + if v.szOption == g_tStrings.STR_LOOTMODE_GOLD_BID_RAID then + fnAction = v.fnAction + break + end + end + team.SetTeamLootMode(PARTY_LOOT_MODE.BIDDING) + local LeaderAddMoney = X.UI.OpenFrame('GoldTeamAddMoney') + local fx, fy = Station.GetClientSize() + local w2, h2 = LeaderAddMoney:GetSize() + LeaderAddMoney:SetAbsPos((fx - w2) / 2, (fy - h2) / 2) + LeaderAddMoney:Lookup('Edit_PriceB'):SetText(math.floor(nGold / 10000)) + LeaderAddMoney:Lookup('Edit_Price'):SetText(nGold % 10000) + LeaderAddMoney:Lookup('Edit_Reason'):SetText(_L['Auto append']) + LeaderAddMoney:Lookup('Btn_Ok').OnLButtonUp = function() + fnAction() + OpenGoldTeam() + Station.SetActiveFrame('GoldTeam') + Station.Lookup('Normal/GoldTeam/PageSet_Total'):ActivePage(1) + end +end + +function D.GetTeamMemberMenu(fnAction, bDisable, bSelf) + local tTeam, menu = {}, {} + for _, v in ipairs(GetClientTeam().GetTeamMemberList()) do + local info = X.GetTeamMemberInfo(v) + table.insert(tTeam, { szName = info.szName, dwID = v, dwForce = info.dwForceID, bOnline = info.bOnline}) + end + local dwID = X.GetClientPlayerID() + table.sort(tTeam, function(a, b) return a.dwForce < b.dwForce end) + for _, v in ipairs(tTeam) do + if v.dwID ~= dwID or bSelf then + local szIcon, nFrame = GetForceImage(v.dwForce) + table.insert(menu, { + szOption = v.szName, + szLayer = 'ICON_RIGHTMOST', + bDisable = bDisable and not v.bOnline, + szIcon = szIcon, + nFrame = nFrame, + rgb = { X.GetForceColor(v.dwForce) }, + fnAction = function() + fnAction(v) + X.UI.ClosePopupMenu() + end + }) + end + end + return menu +end + +function D.GetHistoryFiles() + local aFiles = {} + local szPath = X.FormatPath({'userdata/gkp/', X.PATH_TYPE.ROLE}):gsub('/', '\\') + for _, filename in ipairs(CPath.GetFileList(szPath)) do + local year, month, day, hour, minute, second, index = filename:match('^(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+).-%.gkp.jx3dat') + if not year then + year, month, day, hour, minute, second = filename:match('^(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+).-%.gkp.jx3dat') + end + if not year then + year, month, day = filename:match('^(%d+)%-(%d+)%-(%d+)%.gkp.jx3dat') + end + if year then + if year then + year = tonumber(year) + end + if month then + month = tonumber(month) + end + if day then + day = tonumber(day) + end + if hour then + hour = tonumber(hour) + end + if minute then + minute = tonumber(minute) + end + if second then + second = tonumber(second) + end + if index then + index = tonumber(index) + end + table.insert(aFiles, { + year, month, day, hour, minute, second, index, + filename = filename:sub(1, -12), + fullname = filename, + fullpath = szPath .. filename, + }) + end + end + local function sortFile(a, b) + local n = math.max(#a, #b) + for i = 1, n do + if not a[i] then + return true + elseif not b[i] then + return false + elseif a[i] ~= b[i] then + return a[i] > b[i] + end + end + return false + end + table.sort(aFiles, sortFile) + return aFiles +end + +function D.LimitHistoryFile() + local aFiles = D.GetHistoryFiles() + for i = 22, #aFiles do + local szFile = aFiles[i].fullname + local szPath = X.FormatPath({'userdata/gkp/' .. szFile, X.PATH_TYPE.ROLE}):gsub('/', '\\') + CPath.DelFile(szPath) + end +end + +X.RegisterInit('MY_GKP', function() + D.LoadConfig() +end) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKP', + exports = { + { + fields = { + 'Sysmsg', + 'GetTimeString', + 'GetMoneyCol', + 'GetFormatLink', + 'GetMoneyTipText', + 'Bidding', + 'GetTeamMemberMenu', + 'GetHistoryFiles', + 'DistributionItem', + }, + root = D, + }, + { + fields = { + 'bOn', + 'bMoneyTalk', + 'bMoneyTalkOnlyDistributor', + 'bAlertMessage', + 'bMoneySystem', + 'bDisplayEmptyRecords', + 'bAutoSync', + 'bShowGoldBrick', + 'aSubsidies', + 'aScheme', + 'bSyncSystem', + 'bNewBidding', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'DistributionItem', + }, + root = D, + }, + { + fields = { + 'bOn', + 'bMoneyTalk', + 'bMoneyTalkOnlyDistributor', + 'bAlertMessage', + 'bMoneySystem', + 'bDisplayEmptyRecords', + 'bAutoSync', + 'bShowGoldBrick', + 'aSubsidies', + 'aScheme', + 'bSyncSystem', + 'bNewBidding', + }, + triggers = { + bDisplayEmptyRecords = function() + FireUIEvent('MY_GKP_DATA_UPDATE', '', 'AUCTION') + end, + bShowGoldBrick = function() + FireUIEvent('MY_GKP_DATA_UPDATE', '', 'AUCTION') + FireUIEvent('MY_GKP_DATA_UPDATE', '', 'PAYMENT') + end, + }, + root = O, + }, + }, +} +MY_GKP = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKPChat.lua b/MY_GKP/src/MY_GKPChat.lua new file mode 100644 index 000000000..b18f428c1 --- /dev/null +++ b/MY_GKP/src/MY_GKPChat.lua @@ -0,0 +1,159 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKPChat' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} + +function D.OnEvent(szEvent) + if szEvent == 'DISTRIBUTE_ITEM' then + D.CloseFrame(GetItem(arg1)) + elseif szEvent == 'DOODAD_LEAVE_SCENE' then + if arg0 == this.box.data.dwDoodadID then + X.UI.CloseFrame(this) + end + end +end + +-- OnMsgArrive +function D.OnMsgArrive(szMsg) + local frame = D.GetFrame() + if frame then + local hScroll = frame:Lookup('WndScroll_Chat') + local h = hScroll:Lookup('', '') + szMsg = string.gsub(szMsg, _L['[Team]'], '') + local AppendText = function() + local t = TimeToDate(GetCurrentTime()) + return GetFormatText(string.format(' %02d:%02d:%02d ', t.hour, t.minute, t.second), 10, 255, 255, 255) + end + szMsg = AppendText() .. szMsg + if MY and X.SendChat and X.RenderChatLink then + szMsg = X.RenderChatLink(szMsg) + end + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen and MY_Farbnamen.Render then + szMsg = MY_Farbnamen.Render(szMsg) + end + local xml = 'path=' .. EncodeComponentsString('UI/Image/Button/ShopButton.uitex') .. ' frame=1 eventid=786 w=20 h=20 script="this.OnItemLButtonClick=MY_GKP.DistributionItem\nthis.OnItemMouseEnter=function() this:SetFrame(2) end\nthis.OnItemMouseLeave=function() this:SetFrame(1) end">' + h:AppendItemFromString(xml) + h:AppendItemFromString(szMsg) + h:FormatAllItemPos() + hScroll:Lookup('Scroll_All'):ScrollEnd() + end +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_GKP_Chat') +end + +-- 点击锤子图标预览 严格判断 +function MY_GKP.DistributionItem() + local h, i = this:GetParent(), this:GetIndex() + if not h or not i then + error('GKP_ERROR -> UI_ERROR') + end + local szName = string.match(h:Lookup(i + 3):GetText(), '%[(.*)%]') + local me = Station.Lookup('Normal/MY_GKP_Chat') + local box = me:Lookup('Wnd_Bg', 'Box') + local data = box.data + local aPartyMember = MY_GKPLoot.GetaPartyMember(data.dwDoodadID) + local member = aPartyMember(szName) + if member then + MY_GKPLoot.GetMessageBox(member.dwID, data.data) + else + return X.Alert(_L['No Pick up Object, may due to Network off - line']) + end +end + +function D.OpenFrame(item, menu, data) + local frame = D.GetFrame() + if not frame then + local ui = X.UI.CreateFrame('MY_GKP_Chat', { w = 500, h = 355, theme = X.UI.FRAME_THEME.SIMPLE, text = _L['MY_GKP_Chat'] }) + frame = ui:Raw() + X.UI.AppendFromIni(frame, X.PACKET_INFO.ROOT .. 'MY_GKP/ui/MY_GKP_Chat.ini', 'Wnd_Total', true) + ui:Append('WndButton', { + x = 380, y = 5, + text = _L['Stop Bidding'], + buttonStyle = 'FLAT', + onClick = function() + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['--- Stop Bidding ---']) + X.DelayCall(1000, function() UnRegisterMsgMonitor(D.OnMsgArrive) end) + end, + }) + frame.box = frame:Lookup('Wnd_Bg', 'Box') + frame:RegisterEvent('DISTRIBUTE_ITEM') + frame:RegisterEvent('DOODAD_LEAVE_SCENE') + X.UI.AdaptComponentAppearance(frame:Lookup('WndScroll_Chat/Scroll_All')) + end + local box = frame:Lookup('Wnd_Bg', 'Box') + local txt = frame:Lookup('Wnd_Bg', 'Text') + txt:SetText(X.GetItemNameByItem(item)) + txt:SetFontColor(GetItemFontColorByQuality(item.nQuality)) + local h = frame:Lookup('WndScroll_Chat'):Lookup('', '') + h:Clear() + UpdataItemInfoBoxObject(box, item.nVersion, item.dwTabType, item.dwIndex, (item.nGenre == ITEM_GENRE.BOOK and item.nBookID) or (item.bCanStack and item.nStackNum) or nil) + RegisterMsgMonitor(D.OnMsgArrive, { 'MSG_TEAM' }) + box.OnItemLButtonClick = function() + if IsCtrlKeyDown() or IsAltKeyDown() then + return + end + PopupMenu(menu) + end + box.data = data +end + +function D.CloseFrame(bCheck) + local frame = D.GetFrame() + if frame then + if type(bCheck) == 'userdata' then + local box = frame:Lookup('Wnd_Bg', 'Box') + local nUiId, nVersion, dwTabType, dwIndex = select(2, box:GetObject()) + if bCheck.nUiId ~= nUiId or bCheck.nVersion ~= nVersion or bCheck.dwTabType ~= dwTabType or bCheck.dwIndex ~= dwIndex then + return + end + end + UnRegisterMsgMonitor(D.OnMsgArrive) + X.UI.CloseFrame(frame) + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKP_Chat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenFrame', + }, + root = D, + }, + }, +} +MY_GKP_Chat = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKPDoodad.lua b/MY_GKP/src/MY_GKPDoodad.lua new file mode 100644 index 000000000..d753ec69b --- /dev/null +++ b/MY_GKP/src/MY_GKPDoodad.lua @@ -0,0 +1,1222 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : Doodad 物品采集拾取助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKPDoodad' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKPDoodad' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_GKPDoodad.HeadName', { ['*'] = false }) +X.RegisterRestriction('MY_GKPDoodad.AutoInteract', { ['*'] = true, intl = false }) +X.RegisterRestriction('MY_GKPDoodad.MapRestriction', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_GKPDoodad', _L['General'], { + bOpenLoot = { -- 自动打开掉落 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Enable auto pickup'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOpenLootEvenFight = { -- 战斗中也打开 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Pickup in fight'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowName = { -- 显示物品名称 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Show the head name'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tNameColor = { -- 头顶名称颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Head name color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 196, 64, 255 }, + }, + nNameFont = { -- 头顶名称字体 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Head name font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 40, + }, + fNameScale = { -- 头顶名称缩放 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Head name font scale'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + bMiniFlag = { -- 显示小地图标记 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Display minimap flag'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bInteract = { -- 自动采集 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto craft'], + }), + szRestriction = 'MY_GKPDoodad.MapRestriction', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bInteractEvenFight = { -- 战斗中也采集 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Interact in fight'], + }), + szRestriction = 'MY_GKPDoodad.MapRestriction', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tCraft = { -- 草药、矿石列表 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Craft list'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), + xDefaultValue = {}, + }, + bMiningDoodad = { -- 采金物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Mining doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bHerbalismDoodad = { -- 神农物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Herbalism doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSkinningDoodad = { -- 庖丁物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Skinning doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bQuestDoodad = { -- 任务物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Quest doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bReadInscriptionDoodad = { -- 已读碑铭 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Read inscription doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bUnreadInscriptionDoodad = { -- 未读碑铭 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Unread inscription doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOtherDoodad = { -- 其它物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Other doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAllDoodad = { -- 全部 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['All doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bCustom = { -- 启用自定义 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Customs (split by | )'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + szCustom = { -- 自定义列表 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Custom list'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + bRecent = { -- 启用自动最近5分钟采集 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Recent doodad'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local O2 = {} +RegisterCustomData('MY_GKPDoodad.tNameColor') +RegisterCustomData('MY_GKPDoodad.tCraft') +RegisterCustomData('MY_GKPDoodad.szCustom') + +--------------------------------------------------------------------- +-- 本地函数和变量 +--------------------------------------------------------------------- +local INI_SHADOW = X.PACKET_INFO.UI_COMPONENT_ROOT .. 'Shadow.ini' +local DOODAD_TYPE_VISIBLE = { + [X.CONSTANT.DOODAD_KIND.INVALID ] = false, + [X.CONSTANT.DOODAD_KIND.NORMAL ] = false, -- 普通的Doodad,有Tip,不能操作 + [X.CONSTANT.DOODAD_KIND.CORPSE ] = true , -- 尸体 + [X.CONSTANT.DOODAD_KIND.QUEST ] = true , -- 任务相关的Doodad + [X.CONSTANT.DOODAD_KIND.READ ] = true , -- 可以看的Doodad + [X.CONSTANT.DOODAD_KIND.DIALOG ] = true , -- 可以对话的Doodad + [X.CONSTANT.DOODAD_KIND.ACCEPT_QUEST] = true , -- 可以接任务的Doodad,本质上上面3个类型是一样的,只是图标不同而已 + [X.CONSTANT.DOODAD_KIND.TREASURE ] = true , -- 宝箱 + [X.CONSTANT.DOODAD_KIND.ORNAMENT ] = false, -- 装饰物,不能操作 + [X.CONSTANT.DOODAD_KIND.CRAFT_TARGET] = true , -- 生活技能的采集物 + [X.CONSTANT.DOODAD_KIND.CLIENT_ONLY ] = false, -- 客户端用 + [X.CONSTANT.DOODAD_KIND.CHAIR ] = true , -- 可以坐的Doodad + [X.CONSTANT.DOODAD_KIND.GUIDE ] = false, -- 路标 + [X.CONSTANT.DOODAD_KIND.DOOR ] = false, -- 门之类有动态障碍的Doodad + [X.CONSTANT.DOODAD_KIND.NPCDROP ] = false, -- 使用NPC掉落模式的doodad + [X.CONSTANT.DOODAD_KIND.SPRINT ] = false, -- 轻功落脚点 +} + +local function GetDoodadTemplateName(dwID) + local doodad = GetDoodadTemplate(dwID) + if not doodad then + return + end + return doodad.szName +end + +local function IsShowNameDisabled() + if X.IsRestricted('MY_GKPDoodad.HeadName') then + return true + end + if X.IsInShieldedMap() and X.IsRestricted('MY_GKPDoodad.MapRestriction') then + return true + end + return false +end + +local function IsAutoInteractDisabled() + return not O.bInteract or IsShiftKeyDown() or Station.Lookup('Normal/MY_GKPLoot') or X.IsRestricted('MY_GKPDoodad.AutoInteract') +end + +local D = { + -- 草药、矿石列表 + aCraft = { + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1015, 1016, 1017, 1018, 1019, 2641, + 2642, 2643, 3321, 3358, 3359, 3360, 3361, 4227, 4228, + 5659, 5660, + 0, -- switch + 1020, 1021, 1022, 1023, 1024, 1025, 1027, 2644, 2645, + 4229, 4230, 5661, 5662, + }, + tCraft = {}, + tCustom = {}, -- 自定义列表 + tRecent = {}, -- 最近采集的东西、自动继续采集 + tDoodad = {}, -- 待处理的 doodad 列表 + tLooted = {}, -- 已经拾取过的 doodad id 不再二次拾取 + dwUpdateMiniFlagTime = 0, -- 下次更新小地图位置时间戳 + dwAutoInteractDoodadTime = 0, -- 下次自动交互物件时间戳 +} +for _, v in ipairs(D.aCraft) do + D.tCraft[v] = true +end + +function D.IsCustomDoodad(doodad) + if O.bCustom and D.tCustom[doodad.szName] then + if doodad.nKind == DOODAD_KIND.CORPSE or doodad.nKind == DOODAD_KIND.NPCDROP then + local tpl = GetDoodadTemplate(doodad.dwTemplateID) + return tpl and tpl.dwCraftID == X.CONSTANT.CRAFT_TYPE.SKINNING + end + return true + end + return false +end + +function D.IsRecentDoodad(doodad) + if O.bRecent and D.tRecent[doodad.dwTemplateID] then + if doodad.nKind == DOODAD_KIND.CORPSE or doodad.nKind == DOODAD_KIND.NPCDROP then + local tpl = GetDoodadTemplate(doodad.dwTemplateID) + return tpl and tpl.dwCraftID == X.CONSTANT.CRAFT_TYPE.SKINNING + end + return true + end + return false +end + +function D.GetDoodadInfo(dwID) + local doodad = X.GetDoodad(dwID) + if not doodad then + return + end + local me = X.GetClientPlayer() + local tpl = GetDoodadTemplate(doodad.dwTemplateID) + local info = {} + if tpl then + info.dwCraftID = tpl.dwCraftID + end + local eOverwriteAction = (D.tLooted[doodad.dwID] == false or doodad.CanLoot(me.dwID)) and 'loot' or nil + -- 跳过非拾取类尸体之类交互物件 + if tpl and DOODAD_TYPE_VISIBLE[tpl.nKind] == false and eOverwriteAction ~= 'loot' then + return + end + -- 神农、采金 + if D.tCraft[doodad.dwTemplateID] then + info.eDoodadType = 'craft' + info.eActionType = eOverwriteAction or 'craft' + return info + end + -- 战场任务 + if doodad.dwTemplateID == 3713 -- 遗体 + or doodad.dwTemplateID == 3714 -- 遗体 + or doodad.dwTemplateID == 4733 -- 恶人谷菌箱 + or doodad.dwTemplateID == 4734 -- 浩气盟菌箱 + then + info.eDoodadType = 'quest' + info.eActionType = eOverwriteAction or 'craft' + return info + end + -- 通用任务 + if doodad.HaveQuest(me.dwID) then + info.eDoodadType = 'quest' + info.eActionType = 'quest' + return info + end + -- 采金 + if info.dwCraftID == X.CONSTANT.CRAFT_TYPE.MINING then + info.eDoodadType = 'mining' + info.eActionType = eOverwriteAction or 'craft' + return info + end + -- 神农 + if info.dwCraftID == X.CONSTANT.CRAFT_TYPE.HERBALISM then + info.eDoodadType = 'herbalism' + info.eActionType = eOverwriteAction or 'craft' + return info + end + -- 庖丁 + if info.dwCraftID == X.CONSTANT.CRAFT_TYPE.SKINNING then + info.eDoodadType = 'skinning' + info.eActionType = eOverwriteAction or 'craft' + return info + end + -- 碑铭 + local dwRecipeID = X.GetDoodadBookRecipeID(doodad.dwTemplateID), false + if dwRecipeID then + local dwBookID, dwSegmentID = X.RecipeToSegmentID(dwRecipeID) + if dwBookID and dwSegmentID then + info.eDoodadType = 'inscription' + info.eActionType = 'other' + info.bMemorized = me.IsBookMemorized(dwBookID, dwSegmentID) + return info + end + end + -- 尸体 + if (doodad.nKind == DOODAD_KIND.CORPSE or doodad.nKind == DOODAD_KIND.NPCDROP) and (not doodad.CanDialog(me) or doodad.CanLoot(me.dwID)) then + if eOverwriteAction == 'loot' then + info.eDoodadType = 'loot' + info.eActionType = 'loot' + return info + end + return + end + -- 其他 + if CanSelectDoodad(doodad.dwID) then + info.eDoodadType = 'other' + info.eActionType = 'other' + return info + end +end + +-- try to add +function D.TryAdd(dwID, bDelay) + if bDelay then + return X.DelayCall('MY_GKPDoodad__DelayTryAdd' .. dwID, 500, function() D.TryAdd(dwID) end) + end + local info = D.GetDoodadInfo(dwID) + if info then + local doodad = X.GetDoodad(dwID) + info.bCustom = D.IsCustomDoodad(doodad) + info.bRecent = D.IsRecentDoodad(doodad) + if info.eDoodadType == 'craft' and O.tCraft[doodad.dwTemplateID] then + info.eRuleType = 'craft' + elseif info.eDoodadType == 'quest' and O.bQuestDoodad then + info.eRuleType = 'quest' + elseif info.eDoodadType == 'mining' and O.bMiningDoodad then + info.eRuleType = 'mining' + elseif info.eDoodadType == 'herbalism' and O.bHerbalismDoodad then + info.eRuleType = 'herbalism' + elseif info.eDoodadType == 'skinning' and O.bSkinningDoodad then + info.eRuleType = 'skinning' + elseif info.eActionType == 'loot' and O.bOpenLoot and not D.tLooted[doodad.dwID] then + info.eRuleType = 'loot' + elseif info.eDoodadType == 'inscription' and info.bMemorized and O.bReadInscriptionDoodad then + if O.bUnreadInscriptionDoodad then + info.bMemorizedLabel = true + end + info.eRuleType = 'inscription' + elseif info.eDoodadType == 'inscription' and not info.bMemorized and O.bUnreadInscriptionDoodad then + if O.bReadInscriptionDoodad then + info.bMemorizedLabel = true + end + info.eRuleType = 'inscription' + elseif info.eDoodadType == 'other' and O.bOtherDoodad then + info.eRuleType = 'other' + elseif info.bCustom then + info.eRuleType = 'custom' + elseif info.bRecent then + info.eRuleType = 'recent' + elseif O.bAllDoodad then + info.eRuleType = 'all' + else + info = nil + end + if info then + D.tDoodad[dwID] = info + D.bUpdateLabel = true + end + end +end + +-- remove doodad +function D.Remove(dwID) + local info = D.tDoodad[dwID] + if info then + D.tDoodad[dwID] = nil + D.bUpdateLabel = true + end +end + +-- reload doodad +function D.RescanNearby(dwTemplateID) + if dwTemplateID then + for _, d in ipairs(X.GetNearDoodad()) do + if d.dwTemplateID == dwTemplateID then + D.Remove(d.dwID) + D.TryAdd(d.dwID) + D.bUpdateLabel = true + end + end + else + D.tDoodad = {} + for _, k in ipairs(X.GetNearDoodadID()) do + D.TryAdd(k) + end + D.bUpdateLabel = true + end +end + +function D.ReloadCustom() + local t = {} + local szText = StringReplaceW(O.szCustom, _L['|'], '|') + for _, v in ipairs(X.SplitString(szText, '|')) do + v = X.TrimString(v) + if v ~= '' then + t[v] = true + end + end + D.tCustom = t + D.tRecent = {} + D.RescanNearby() +end + +-- 开始采集时调用,用于预判断最近采集列表 +function D.OnPickPrepare(doodad, nFinishLFC) + if nFinishLFC - GetLogicFrameCount() <= 0 then + return + end + local t = GetDoodadTemplate(doodad.dwTemplateID) + if t.dwCraftID == X.CONSTANT.CRAFT_TYPE.MINING + or t.dwCraftID == X.CONSTANT.CRAFT_TYPE.HERBALISM + or t.dwCraftID == X.CONSTANT.CRAFT_TYPE.SKINNING then + D.nPickPrepareFinishLFC = nFinishLFC + D.dwPickPrepareDoodadID = doodad.dwID + D.dwPickPrepareDoodadTemplateID = doodad.dwTemplateID + D.tRecent[doodad.dwTemplateID] = true + D.RescanNearby(doodad.dwTemplateID) + end +end + +-- 结束采集时调用,如果符合最后一次采集物品信息,加入最近采集列表 +function D.OnPickPrepareStop(doodad) + local dwTemplateID = D.dwPickPrepareDoodadTemplateID + if dwTemplateID then + local bSuccess = doodad + and doodad.dwID == D.dwPickPrepareDoodadID + and math.abs(GetLogicFrameCount() - D.nPickPrepareFinishLFC) < X.ENVIRONMENT.GAME_FPS / 2 + D.nPickPrepareFinishLFC = nil + D.dwPickPrepareDoodadID = nil + D.dwPickPrepareDoodadTemplateID = nil + D.tRecent[dwTemplateID] = bSuccess and true or nil + D.RescanNearby(dwTemplateID) + end +end + +X.RegisterInit('MY_GKPDoodad', function() + for _, k in ipairs({'tNameColor', 'tCraft', 'szCustom'}) do + if O2[k] then + X.SafeCall(X.Set, O, k, O2[k]) + O2[k] = nil + end + end + -- 粮草堆,散落的镖银,阵营首领战利品、押运奖赏 + if X.IsEmpty(O.szCustom) then + local t = {} + for _, v in ipairs({ 3874, 4255, 4315, 5622, 5732 }) do + local szName = GetDoodadTemplateName(v) + if szName then + table.insert(t, szName) + end + end + O.szCustom = table.concat(t, '|') + D.ReloadCustom() + end +end) + +-- switch name +function D.CheckShowName() + local hName = X.UI.GetShadowHandle('MY_GKPDoodad') + local bShowName = O.bShowName and not IsShowNameDisabled() + if bShowName and not D.pLabel then + D.pLabel = hName:AppendItemFromIni(INI_SHADOW, 'Shadow', 'Shadow_Name') + X.BreatheCall('MY_GKPDoodad__HeadName', function() + if D.bUpdateLabel then + D.bUpdateLabel = false + D.UpdateHeadName() + end + end) + D.bUpdateLabel = true + elseif not bShowName and D.pLabel then + hName:Clear() + D.pLabel = nil + X.BreatheCall('MY_GKPDoodad__HeadName', false) + end +end + +------------------------------------- +-- 事件处理 +------------------------------------- +-- head name +function D.UpdateHeadName() + local sha = D.pLabel + if not sha then + return + end + local r, g, b = unpack(O.tNameColor) + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:ClearTriangleFanPoint() + for dwID, info in pairs(D.tDoodad) do + local tar = X.GetDoodad(dwID) + local bShow = info.eRuleType ~= 'loot' or info.bCustom or info.bRecent + if bShow or D.bDebug then + local szName = X.GetDoodadName(dwID, { eShowID = 'never' }) or '' + local fYDelta = 128 + local nR, nG, nB, nA, bDarken = r, g, b, 255, false + -- 将不可自动交互的颜色变暗 + if info.eActionType == 'other' then + bDarken = true + end + if info.eDoodadType == 'inscription' then + if info.bMemorized then + if info.bMemorizedLabel then + szName = szName .. _L['(Read)'] + end + bDarken = true + else + if info.bMemorizedLabel then + szName = szName .. _L['(Not read)'] + end + bDarken = false + end + fYDelta = 300 + end + if bDarken then + nR = nR * 0.85 + nG = nG * 0.85 + nB = nB * 0.85 + end + --[[#DEBUG BEGIN]] + if D.bDebug then + szName = szName .. '|D' .. info.eDoodadType .. '|R' .. info.eRuleType .. '|A' .. info.eActionType .. '|' .. dwID .. '|' .. (bShow and 'Y' or 'N') + end + --[[#DEBUG END]] + sha:AppendDoodadID(tar.dwID, nR, nG, nB, nA, fYDelta, O.nNameFont, szName, 0, O.fNameScale) + end + end + sha:Show() +end + +-- auto interact +function D.AutoInteractDoodad() + local me = X.GetClientPlayer() + -- auto interact + if not me or X.GetCharacterOTActionState(me) ~= X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_IDLE + or (me.nMoveState ~= MOVE_STATE.ON_STAND and me.nMoveState ~= MOVE_STATE.ON_FLOAT) + -- or IsDialoguePanelOpened() + then + return + end + local bAllowAutoIntr = (not me.bFightState or O.bInteractEvenFight) and not me.bOnHorse and not IsAutoInteractDisabled() + for dwID, info in pairs(D.tDoodad) do + local doodad, bIntr, bOpen = X.GetDoodad(dwID), false, false + if doodad and doodad.CanDialog(me) then -- 若存在却不能对话只简单保留 + local bAllowAutoOpen = not D.tLooted[doodad.dwID] + if info.bCustom then + if info.eActionType == 'loot' then + bOpen = bAllowAutoOpen + else + bIntr = bAllowAutoIntr + end + elseif info.bRecent then + bIntr = bAllowAutoIntr + elseif info.eActionType == 'loot' and O.bOpenLoot then -- 掉落是否可以打开 + bOpen = bAllowAutoOpen and (not me.bFightState or O.bOpenLootEvenFight) and doodad.CanLoot(me.dwID) + elseif (info.eRuleType == 'craft' and info.eActionType == 'craft') + or (info.eRuleType == 'mining' and info.eActionType == 'craft') + or (info.eRuleType == 'herbalism' and info.eActionType == 'craft') + or (info.eRuleType == 'skinning' and info.eActionType == 'craft') + then + bIntr = bAllowAutoIntr + elseif (info.eRuleType == 'quest' and info.eActionType == 'quest') + or (info.eRuleType ~= 'other' and info.eRuleType ~= 'all' and info.eActionType == 'craft') + then -- 任务和普通道具尝试 5 次 + bIntr = bAllowAutoIntr + -- 宴席只能吃队友的 + if doodad.dwOwnerID ~= 0 and X.IsPlayer(doodad.dwOwnerID) and not X.IsTeammate(doodad.dwOwnerID) then + bIntr = false + end + if bIntr then + if info.nActionCount and info.nActionCount >= 5 then + info.eActionType = 'other' + bIntr = false + D.bUpdateLabel = true + else + info.nActionCount = (info.nActionCount or 0) + 1 + end + end + end + end + if bOpen and doodad.CanLoot(me.dwID) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_GKPDoodad'], 'Auto open [' .. doodad.szName .. '].', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.dwOpenDoodadID = dwID + D.bUpdateLabel = true + D.dwAutoInteractDoodadTime = GetTime() + 500 + -- 掉落只摸一次 + D.tLooted[doodad.dwID] = true + return X.OpenDoodad(me, doodad) + end + if bIntr and not doodad.CanLoot(me.dwID) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_GKPDoodad'], 'Auto interact [' .. doodad.szName .. '].', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.dwAutoInteractDoodadTime = GetTime() + 500 + return X.InteractDoodad(dwID) + end + end +end + +function D.CloseLootWindow() + local me = X.GetClientPlayer() + if me and X.GetCharacterOTActionState(me) == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_PICKING then + me.OnCloseLootWindow() + end +end + +-- open doodad (loot) +function D.OnOpenDoodad(dwID) + local doodad = X.GetDoodad(dwID) + local info = D.tDoodad[dwID] + if info then + -- 摸掉落且开了插件拾取框 可以安全的起身 + if info.eActionType == 'loot' and MY_GKPLoot.IsEnabled() then + X.DelayCall('MY_GKPDoodad__OnOpenDoodad_1', 150, D.CloseLootWindow) + X.DelayCall('MY_GKPDoodad__OnOpenDoodad_2', 300, D.CloseLootWindow) + X.DelayCall('MY_GKPDoodad__OnOpenDoodad_3', 1000, D.CloseLootWindow) + end + -- 从列表删除 + D.Remove(dwID) + end + -- 如果来源非自动打开掉落、或者是自定义物品、或最近采集物品,需要继续加入该物品 + if doodad and (info.eRuleType ~= 'loot' or D.IsCustomDoodad(doodad) or D.IsRecentDoodad(doodad)) then + D.TryAdd(dwID) + end + X.OutputDebugMessage(_L['MY_GKPDoodad'], 'OnOpenDoodad [' .. X.GetDoodadName(dwID, { eShowID = 'always' }) .. ']', X.DEBUG_LEVEL.LOG) +end + +-- save manual doodad +function D.OnLootDoodad() + if not O.bRecent then + return + end + local doodad = X.GetDoodad(arg0) + if not doodad then + return + end + D.OnPickPrepareStop(doodad) +end + +-- mini flag +function D.UpdateMiniFlag() + if not D.bReady or not O.bMiniFlag or IsShowNameDisabled() then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + for dwID, info in pairs(D.tDoodad) do + if info.eRuleType ~= 'loot' and info.eActionType ~= 'loot' then + -- if info.eRuleType == 'quest' + -- or info.eRuleType == 'craft' or info.eRuleType == 'mining' + -- or info.eRuleType == 'herbalism' or info.eRuleType == 'skinning' + -- then + local doodad = X.GetDoodad(dwID) + local dwType, nF1, nF2 = 5, 169, 48 + if info.eRuleType == 'quest' then + nF1 = 114 + elseif info.dwCraftID == X.CONSTANT.CRAFT_TYPE.MINING then -- 采金类 + nF1, nF2 = 16, 47 + elseif info.dwCraftID == X.CONSTANT.CRAFT_TYPE.HERBALISM then -- 神农类 + nF1 = 2 + end + X.UpdateMinimapArrowPoint(dwType, doodad, nF1, nF2) + end + end +end + +function D.OnBreatheCall() + local me = X.GetClientPlayer() + if not me or not D.bReady then + return + end + for dwID, info in pairs(D.tDoodad) do + local doodad = X.GetDoodad(dwID) + if not doodad + or (info.eRuleType == 'quest' and info.eActionType == 'quest' and not doodad.HaveQuest(me.dwID)) + or (info.eActionType == 'loot' and not doodad.CanLoot(me.dwID)) + then + D.Remove(dwID) + D.TryAdd(dwID) + end + end + local dwTime = GetTime() + if dwTime >= D.dwAutoInteractDoodadTime then + D.AutoInteractDoodad() + end + if dwTime >= D.dwUpdateMiniFlagTime then + D.UpdateMiniFlag() + D.dwUpdateMiniFlagTime = dwTime + 500 + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKPDoodad', + exports = { + { + preset = 'UIEvent', + root = D, + }, + }, + imports = { + { + fields = { + 'tNameColor', + 'tCraft', + 'szCustom', + }, + root = O2, + }, + }, +} +MY_GKPDoodad = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- +X.RegisterEvent('LOADING_ENDING', function() + D.tLooted = {} + D.CheckShowName() +end) +X.RegisterEvent('DOODAD_ENTER_SCENE', function() + if not D.bReady then + return + end + D.TryAdd(arg0, true) +end) +X.RegisterEvent('DOODAD_LEAVE_SCENE', function() + if not D.bReady then + return + end + D.Remove(arg0) +end) +X.RegisterEvent('OPEN_DOODAD', D.OnLootDoodad) +X.RegisterEvent('HELP_EVENT', function() + if arg0 == 'OnOpenpanel' and arg1 == 'LOOT' and O.bOpenLoot then + local dwOpenDoodadID = D.dwOpenDoodadID + if dwOpenDoodadID then + D.dwOpenDoodadID = nil + D.OnOpenDoodad(dwOpenDoodadID) + end + end +end) +X.RegisterEvent('QUEST_ACCEPTED', function() + if D.bReady and O.bQuestDoodad then + D.RescanNearby() + end +end) +X.RegisterEvent('SYS_MSG', function() + if arg0 == 'UI_OME_CRAFT_RESPOND' and arg1 == CRAFT_RESULT_CODE.SUCCESS + and D.bReady and (O.bReadInscriptionDoodad or O.bUnreadInscriptionDoodad) then + D.RescanNearby() + end +end) +X.RegisterEvent('DO_PICK_PREPARE_PROGRESS', function() + local nTotalFrame, dwDoodadID = arg0, arg1 + if nTotalFrame == 0 then + return + end + local doodad = X.GetDoodad(dwDoodadID) + if doodad then + D.OnPickPrepare(doodad, GetLogicFrameCount() + nTotalFrame) + end +end) +X.RegisterEvent('OT_ACTION_PROGRESS_BREAK', function() + local dwID = arg0 + if dwID == X.GetClientPlayerID() then + D.OnPickPrepareStop(false) + end +end) +X.RegisterEvent('SYNC_LOOT_LIST', function() + D.tLooted[arg0] = false + D.TryAdd(arg0) +end) +X.RegisterInit('MY_GKPDoodad__BC', function() + X.BreatheCall('MY_GKPDoodad', D.OnBreatheCall) +end) +X.RegisterExit('MY_GKPDoodad__BC', function() + X.BreatheCall('MY_GKPDoodad', false) +end) +X.RegisterEvent('MY_RESTRICTION', function() + D.CheckShowName() +end) +X.RegisterUserSettingsInit('MY_GKPDoodad', function() + for _, dwID in ipairs(D.aCraft) do + if dwID ~= 0 then + if not X.IsBoolean(O.tCraft[dwID]) then + O.tCraft[dwID] = true + end + end + end + D.RescanNearby() + D.bReady = true +end) +X.RegisterUserSettingsRelease('MY_GKPDoodad', function() + D.bReady = false +end) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- +local PS = { nPriority = 2.1 } + +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 40, 10 + local nX, nY, nLFY = nPaddingX, nPaddingY, nPaddingY + local nLineHeightS, nLineHeightM, nLineHeightL = 22, 28, 32 + + -- loot + ui:Append('Text', { text = _L['Pickup helper'], x = nX, y = nY, font = 27 }) + + nX, nY = nPaddingX + 10, nPaddingY + nLineHeightM + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Enable auto pickup'], + checked = O.bOpenLoot, + onCheck = function(bChecked) + O.bOpenLoot = bChecked + D.RescanNearby() + ui:Fetch('Check_Fight'):Enable(bChecked) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + nX = ui:Append('WndCheckBox', { + name = 'Check_Fight', x = nX, y = nY, + text = _L['Pickup in fight'], + checked = O.bOpenLootEvenFight, + enable = O.bOpenLoot, + onCheck = function(bChecked) + O.bOpenLootEvenFight = bChecked + D.RescanNearby() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + nX, nY = nPaddingX + 10, nY + nLineHeightM + nLFY = nY + + nX, nY, nLFY = MY_GKPLoot.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLineHeightM, nX, nY, nLFY) + + -- doodad + if not X.IsRestricted('MY_GKPDoodad.HeadName') then + nX, nY = nPaddingX, nY + nLineHeightL + ui:Append('Text', { text = _L['Craft assit'], x = nX, y = nY, font = 27 }) + + nX, nY = nPaddingX + 10, nY + nLineHeightM + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Show the head name'], + checked = O.bShowName, + onCheck = function() + O.bShowName = not O.bShowName + D.CheckShowName() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + + nX = ui:Append('Shadow', { + name = 'Shadow_Color', x = nX + 2, y = nY + 4, w = 18, h = 18, + color = O.tNameColor, + onClick = function() + X.UI.OpenColorPicker(function(r, g, b) + ui:Fetch('Shadow_Color'):Color(r, g, b) + O.tNameColor = { r, g, b } + D.RescanNearby() + end) + end, + autoEnable = function() return O.bShowName end, + }):Pos('BOTTOMRIGHT') + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 65, h = 24, + buttonStyle = 'FLAT', + text = _L['Font'], + onClick = function() + X.UI.OpenFontPicker(function(nFont) + O.nNameFont = nFont + D.bUpdateLabel = true + end) + end, + autoEnable = function() return O.bShowName end, + }):Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, w = 150, + textFormatter = function(val) return _L('Font scale is %d%%.', val) end, + range = {10, 500}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.fNameScale * 100, + onChange = function(val) + O.fNameScale = val / 100 + D.bUpdateLabel = true + end, + autoEnable = function() return O.bShowName end, + }):Width() + 5 + + nX, nY = nPaddingX + 10, nY + nLineHeightM + nX = ui:Append('WndCheckBox', { + text = _L['Display minimap flag'], + x = nX, y = nY, + checked = O.bMiniFlag, + onCheck = function(bChecked) + O.bMiniFlag = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + if not X.IsRestricted('MY_GKPDoodad.AutoInteract') then + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Auto craft'], + checked = O.bInteract, + onCheck = function(bChecked) + O.bInteract = bChecked + D.RescanNearby() + ui:Fetch('Check_Interact_Fight'):Enable(bChecked) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + nX = ui:Append('WndCheckBox', { + name = 'Check_Interact_Fight', x = nX, y = nY, + text = _L['Interact in fight'], + checked = O.bInteractEvenFight, + enable = O.bInteract, + onCheck = function(bChecked) + O.bInteractEvenFight = bChecked + D.RescanNearby() + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + end + + --[[#DEBUG BEGIN]] + if X.IsDebugClient() then + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Debug'], + checked = D.bDebug, + onCheck = function(bChecked) + D.bDebug = bChecked + D.bUpdateLabel = true + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + end + --[[#DEBUG END]] + + -- craft + nX, nY = nPaddingX + 10, nY + nLineHeightM + for _, v in ipairs(D.aCraft) do + if v == 0 then + nY = nY + 8 + if nX ~= 10 then + nY = nY + nLineHeightS + nX = nPaddingX + 10 + end + else + local szName = GetDoodadTemplateName(v) + if szName then + if nX + 90 > nW - (nPaddingX + 10) then + nX = nPaddingX + 10 + nY = nY + nLineHeightS + end + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = szName, + checked = O.tCraft[v], + onCheck = function(bChecked) + if bChecked then + O.tCraft[v] = true + else + O.tCraft[v] = false + end + O.tCraft = O.tCraft + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }) + nX = nX + 90 + end + end + end + nX = nPaddingX + nY = nY + nLineHeightM + + nX = nPaddingX + 10 + nY = nY + 3 + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Mining doodad'], + checked = O.bMiningDoodad, + onCheck = function(bChecked) + O.bMiningDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Herbalism doodad'], + checked = O.bHerbalismDoodad, + onCheck = function(bChecked) + O.bHerbalismDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Skinning doodad'], + checked = O.bSkinningDoodad, + onCheck = function(bChecked) + O.bSkinningDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Quest doodad'], + checked = O.bQuestDoodad, + onCheck = function(bChecked) + O.bQuestDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Read inscription doodad'], + checked = O.bReadInscriptionDoodad, + onCheck = function(bChecked) + O.bReadInscriptionDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Unread inscription doodad'], + checked = O.bUnreadInscriptionDoodad, + onCheck = function(bChecked) + O.bUnreadInscriptionDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Other doodad'], + checked = O.bOtherDoodad, + onCheck = function(bChecked) + O.bOtherDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 7 + + -- recent / all + nX, nY = nPaddingX + 10, nY + nLineHeightM + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Recent doodad'], + checked = O.bRecent, + onCheck = function(bChecked) + O.bRecent = bChecked + D.RescanNearby() + end, + tip = { + render = _L['Recent crafted doodads during current game'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['All doodad'], + checked = O.bAllDoodad, + onCheck = function(bChecked) + O.bAllDoodad = bChecked + D.RescanNearby() + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + + -- custom + nX, nY = nPaddingX + 10, nY + nLineHeightM + nX = ui:Append('WndCheckBox', { + text = _L['Customs (split by | )'], + x = nX, y = nY, + checked = O.bCustom, + onCheck = function(bChecked) + O.bCustom = bChecked + D.RescanNearby() + ui:Fetch('Edit_Custom'):Enable(bChecked) + end, + autoEnable = function() return O.bShowName or O.bInteract end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + + ui:Append('WndEditBox', { + name = 'Edit_Custom', + x = nX, y = nY, w = 360, h = 27, + limit = 1024, text = O.szCustom, + enable = O.bCustom, + onChange = function(szText) + O.szCustom = szText + D.ReloadCustom() + end, + tip = { + render = function() + if X.IsRestricted('MY_GKPDoodad.AutoInteract') then + return + end + return _L['Tip: Enter the name of dead animals can be automatically Paoding!'] + end, + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + autoEnable = function() return (O.bShowName or O.bInteract) and O.bCustom end, + }) + end +end +X.Panel.Register(_L['General'], 'MY_GKPDoodad', _L['MY_GKPLoot'], 90, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKPGoldTeamLootHook.lua b/MY_GKP/src/MY_GKPGoldTeamLootHook.lua new file mode 100644 index 000000000..dc0380da9 --- /dev/null +++ b/MY_GKP/src/MY_GKPGoldTeamLootHook.lua @@ -0,0 +1,83 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录 系统拍团拾取界面HOOK +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKPGoldTeamLootHook' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} + +function D.OnGoldTeamLootListItemRButtonClick() + local tData = this:GetParent().tData + if not tData then + return + end + local d = X.GetDoodad(tData.dwDoodadID) + if not d then + return + end + local data = MY_GKPLoot.GetItemData(X.GetClientPlayer(), d, tData.nLootIndex) + if not data then + return + end + X.UI.PopupMenu(MY_GKPLoot.GetItemBiddingMenu(tData.dwDoodadID, data)) +end + +function D.HookGoldTeamLootList() + local h = Station.Lookup('Normal/GoldTeamLootList/WndScroll_LootList', 'Handle_LootList') + if not h then + return + end + for i = 0, h:GetItemCount() - 1 do + local hItem = h:Lookup(i) + local hBtn = hItem and hItem:Lookup('Handle_Btn_Bid') + if hBtn then + hBtn:RegisterEvent(42) + hBtn.OnItemRButtonClick = D.OnGoldTeamLootListItemRButtonClick + end + end + if not h.__FormatAllItemPos then + h.__FormatAllItemPos = h.FormatAllItemPos + h.FormatAllItemPos = function() + h:__FormatAllItemPos() + D.HookGoldTeamLootList() + end + end +end +X.RegisterFrameCreate('GoldTeamLootList', 'MY_GKPGoldTeamLootHook', D.HookGoldTeamLootList) + +function D.UnhookGoldTeamLootList() + local h = Station.Lookup('Normal/GoldTeamLootList/WndScroll_LootList', 'Handle_LootList') + if not h then + return + end + for i = 0, h:GetItemCount() - 1 do + local hItem = h:Lookup(i) + local hBtn = hItem and hItem:Lookup('Handle_Btn_Bid') + if hBtn then + hBtn.OnItemRButtonClick = nil + end + end + if h.__FormatAllItemPos then + h.FormatAllItemPos = h.__FormatAllItemPos + h.__FormatAllItemPos = nil + end +end +X.RegisterReload('MY_GKPGoldTeamLootHook', D.UnhookGoldTeamLootList) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKPLoot.lua b/MY_GKP/src/MY_GKPLoot.lua new file mode 100644 index 000000000..6235b5041 --- /dev/null +++ b/MY_GKP/src/MY_GKPLoot.lua @@ -0,0 +1,2556 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录 拾取界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKPLoot' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_GKPLoot.FastLoot', { ['*'] = true }) +X.RegisterRestriction('MY_GKPLoot.ForceLootOutsideDungeon', { ['*'] = true }) +X.RegisterRestriction('MY_GKPLoot.ForceLootInsideDungeon', { ['*'] = false, classic = true }) +X.RegisterRestriction('MY_GKPLoot.ForceTryAutoLoot', { ['*'] = true }) +X.RegisterRestriction('MY_GKPLoot.ShowUndialogable', { ['*'] = true }) +-------------------------------------------------------------------------- + +local DEBUG_LOOT = false -- 测试拾取分配 强制进入分配模式并最终不调用分配接口 +local GKP_LOOT_INIFILE = PLUGIN_ROOT .. '/ui/MY_GKPLoot.ini' +local MY_GKP_LOOT_BOSS -- 散件老板 +local GKP_AUTO_LOOT_DEBOUNCE_TIME = X.ENVIRONMENT.GAME_FPS / 2 -- 自动拾取时延 + +local GKP_LOOT_HUANGBABA_ICON = 2589 -- 玄晶图标 +local GKP_LOOT_HUANGBABA_QUALITY = X.CONSTANT.ITEM_QUALITY.NACARAT -- 玄晶品级 +local GKP_LOOT_ZIBABA_ICON = 2588 -- 小铁图标 +local GKP_LOOT_ZIBABA_QUALITY = X.CONSTANT.ITEM_QUALITY.PURPLE -- 小铁品级 + +local GKP_LOOT_RECENT = {} -- 记录上次物品或物品组分配给了谁 +local GKP_ITEM_QUALITIES = { + { nQuality = X.CONSTANT.ITEM_QUALITY.GRAY , szTitle = g_tStrings.STR_GRAY }, + { nQuality = X.CONSTANT.ITEM_QUALITY.WHITE , szTitle = g_tStrings.STR_WHITE }, + { nQuality = X.CONSTANT.ITEM_QUALITY.GREEN , szTitle = g_tStrings.STR_ROLLQUALITY_GREEN }, + { nQuality = X.CONSTANT.ITEM_QUALITY.BLUE , szTitle = g_tStrings.STR_ROLLQUALITY_BLUE }, + { nQuality = X.CONSTANT.ITEM_QUALITY.PURPLE , szTitle = g_tStrings.STR_ROLLQUALITY_PURPLE }, + { nQuality = X.CONSTANT.ITEM_QUALITY.NACARAT, szTitle = g_tStrings.STR_ROLLQUALITY_NACARAT }, +} + +local O = X.CreateUserSettingsModule('MY_GKPLoot', _L['General'], { + bOn = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Enable MY_GKPLoot'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bInTeamDungeon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Team dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bInRaidDungeon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Raid dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bInBattlefield = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Battlefield'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bInOtherMap = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Other map'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 0, y = 0, s = 'CENTER', r = 'CENTER' }, + }, + bVertical = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['switch styles'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSetColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Set Force Color'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nConfirmQuality = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Confirm when distribute'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 3, + }, + bShow2ndKungfuLoot = { -- 显示第二心法装备推荐提示图标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Show 2nd kungfu fit icon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSortLoot = { -- 按照价值高低排序掉落物品 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Sort loot list by weight'], + }), + szVersion = '20241113', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tConfirm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Confirm when distribute'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = { + Huangbaba = true, + Book = true, + Pendant = true, + Outlook = true, + Pet = true, + Horse = true, + HorseEquip = true, + }, + }, + tFilterQuality = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Loot item filter'], + _L['Quality filter'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), + xDefaultValue = { + [X.CONSTANT.ITEM_QUALITY.GRAY] = true, + }, + }, + bNameFilter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Loot item filter'], + _L['Name filter'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tNameFilter = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Loot item filter'], + _L['Name filter list'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, + bFilterBookRead = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Loot item filter'], + _L['Filter book read'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFilterBookHave = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Loot item filter'], + _L['Filter book have'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoPickupFilterBookRead = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Filter book read'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoPickupFilterBookHave = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Filter book have'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoPickupTaskItem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup quest item'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoPickupBook = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup book'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoPickupQuality = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup by item quality'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAutoPickupQuality = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup by item quality data'], + }), + xSchema = X.Schema.Map(X.Schema.Number, X.Schema.Boolean), + xDefaultValue = (function() + local t = {} + for _, p in ipairs(GKP_ITEM_QUALITIES) do + t[p.nQuality] = true + end + return t + end)(), + }, + tAutoPickupNames = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup names'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, + tAutoPickupFilters = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_GKPLoot'], + szDescription = X.MakeCaption({ + _L['Auto pickup'], + _L['Auto pickup filters'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, +}) +local D = { + aDoodadID = {}, + tDoodadInfo = {}, + tDoodadClosed = {}, +} +local ITEM_CONFIG = setmetatable({}, { + __index = function(_, k) + if k == 'tNameFilter' + or k == 'bFilterBookRead' + or k == 'bFilterBookHave' + or k == 'tFilterQuality' + or k == 'bNameFilter' + or k == 'bAutoPickupFilterBookRead' + or k == 'bAutoPickupFilterBookHave' + or k == 'bAutoPickupTaskItem' + or k == 'bAutoPickupBook' + or k == 'bAutoPickupQuality' + or k == 'tAutoPickupQuality' + or k == 'tAutoPickupNames' + or k == 'tAutoPickupFilters' + then + return O[k] + end + if k == 'bHideFiltered' + then + return D[k] + end + end, + __newindex = function(_, k, v) + if k == 'tNameFilter' + or k == 'bFilterBookRead' + or k == 'bFilterBookHave' + or k == 'tFilterQuality' + or k == 'bNameFilter' + or k == 'bAutoPickupFilterBookRead' + or k == 'bAutoPickupFilterBookHave' + or k == 'bAutoPickupTaskItem' + or k == 'bAutoPickupBook' + or k == 'bAutoPickupQuality' + or k == 'tAutoPickupQuality' + or k == 'tAutoPickupNames' + or k == 'tAutoPickupFilters' + then + O[k] = v + elseif k == 'bHideFiltered' + then + D[k] = v + end + end, +}) + +function D.UpdateShielded() + GKP_AUTO_LOOT_DEBOUNCE_TIME = X.IsRestricted('MY_GKPLoot.FastLoot') + and X.ENVIRONMENT.GAME_FPS / 2 + or 0 +end + +function D.InsertSceneLoot() + local GetInfo = X.GetGameAPI('GoldTeamBase_GetAllBiddingInfos') + local aInfo = GetInfo and GetInfo() + if not aInfo then + return + end + local aDoodadInfo, tDoodadID = {}, {} + for _, v in ipairs(aInfo) do + if not tDoodadID[v.dwDoodadID] then + table.insert(aDoodadInfo, { + dwDoodadID = v.dwDoodadID, + dwNpcTemplateID = v.dwNpcTemplateID, + }) + tDoodadID[v.dwDoodadID] = true + end + end + for _, v in ipairs(aDoodadInfo) do + if not D.tDoodadInfo[v.dwDoodadID] then + D.tDoodadInfo[v.dwDoodadID] = { + dwID = v.dwDoodadID, + szName = X.GetNpcTemplateName(v.dwNpcTemplateID) or '', + } + end + D.InsertLootList(v.dwDoodadID) + end +end + +function D.IsEnabled() + if not D.bReady then + return false + end + if not O.bOn then + return false + end + if O.bInTeamDungeon and O.bInRaidDungeon and O.bInBattlefield and O.bInOtherMap then + return true + end + if X.IsInDungeonMap(false) then + return O.bInTeamDungeon + end + if X.IsInDungeonMap(true) then + return O.bInRaidDungeon + end + if X.IsInBattlefieldMap() or X.IsInPubgMap() or X.IsInZombieMap() then + return O.bInBattlefield + end + return O.bInOtherMap +end + +function D.OutputEnable() + X.OutputSystemAnnounceMessage( + D.IsEnabled() + and _L['MY_GKPLoot enabled in current map'] + or _L['MY_GKPLoot disabled in current map'] + ) +end + +function D.CanDialog(tar, dwDoodadID) + local doodad = X.GetDoodad(dwDoodadID) + return doodad and doodad.CanDialog(tar) +end + +function D.IsItemDisplay(itemData, config) + -- 按品质过滤 + if X.IsTable(config.tFilterQuality) and config.tFilterQuality[itemData.nQuality] then + return false + end + -- 名称过滤 + if config.bNameFilter then + if config.tNameFilter[itemData.szName] then + return false + end + for k, v in pairs(config.tNameFilter) do + if v and k:sub(1, 1) == '^' and itemData.szName:find(k) then + return false + end + end + end + -- 过滤已读、已有书籍 + if (config.bFilterBookRead or config.bFilterBookHave) and itemData.nGenre == ITEM_GENRE.BOOK then + local me = X.GetClientPlayer() + if config.bFilterBookRead then + local nBookID, nSegmentID = X.RecipeToSegmentID(itemData.nBookID) + if me and me.IsBookMemorized(nBookID, nSegmentID) then + return false + end + end + if config.bFilterBookHave then + local nAmount = X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + + X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.BANK, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + if nAmount > 0 then + return false + end + end + end + return true +end + +function D.IsItemAutoPickup(itemData, config, doodadData, bCanDialog) + if not bCanDialog then + return false + end + -- 超过可拾取上限则不捡 + local itemInfo = GetItemInfo(itemData.dwTabType, itemData.dwIndex) + if itemInfo and itemInfo.nMaxExistAmount > 0 then + local nAmount = X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + + X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.BANK, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + if nAmount + itemData.nStackNum > itemInfo.nMaxExistAmount then + return false + end + end + + -- 不拾取已读、已有书籍 + if (config.bAutoPickupFilterBookRead or config.bAutoPickupFilterBookHave) and itemData.nGenre == ITEM_GENRE.BOOK then + local me = X.GetClientPlayer() + if config.bAutoPickupFilterBookRead then + local nBookID, nSegmentID = X.RecipeToSegmentID(itemData.nBookID) + if me and me.IsBookMemorized(nBookID, nSegmentID) then + return false + end + end + if config.bAutoPickupFilterBookHave then + local nAmount = X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + + X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.BANK, itemData.dwTabType, itemData.dwIndex, itemData.nBookID) + if nAmount > 0 then + return false + end + end + end + -- 自动拾取书籍 + if config.bAutoPickupBook and itemData.nGenre == ITEM_GENRE.BOOK then + return true + end + -- 自动拾取过滤 + if config.tAutoPickupFilters and config.tAutoPickupFilters[itemData.szName] then + return false + end + -- 自动拾取名单 + if config.tAutoPickupNames and config.tAutoPickupNames[itemData.szName] then + return true + end + -- 自动拾取任务物品 + if config.bAutoPickupTaskItem and itemData.nGenre == ITEM_GENRE.TASK_ITEM then + return true + end + -- 自动拾取品级 + if config.bAutoPickupQuality and config.tAutoPickupQuality[itemData.nQuality] then + return true + end + return false +end + +function D.CloseLootWindow() + local me = X.GetClientPlayer() + if me and X.GetCharacterOTActionState(me) == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_PICKING then + me.OnCloseLootWindow() + end +end + +function D.OnFrameCreate() + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('PARTY_LOOT_MODE_CHANGED') + this:RegisterEvent('PARTY_DISBAND') + this:RegisterEvent('PARTY_DELETE_MEMBER') + this:RegisterEvent('DOODAD_LEAVE_SCENE') + this:RegisterEvent('MY_GKP_LOOT_RELOAD') + this:RegisterEvent('MY_GKP_LOOT_BOSS') + local a = O.anchor + this:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + this:Lookup('Scroll_DoodadList/WndContainer_DoodadList'):Clear() + X.UI.AdaptComponentAppearance(this:Lookup('Scroll_DoodadList/ScrolBar_DoodadList')) + D.AdjustFrame(this) +end + +function D.OnFrameBreathe() + local nLFC = GetLogicFrameCount() + local me = X.GetClientPlayer() + local container = this:Lookup('Scroll_DoodadList/WndContainer_DoodadList') + local wnd = container:LookupContent(0) + local bRemoveUndialogable = X.IsInPubgMap() and X.IsRestricted('MY_GKPLoot.ShowUndialogable') + while wnd do + local doodadData = wnd.doodadData + -- 拾取判定 + local bCanDialog = D.CanDialog(me, doodadData.dwID) + local hList, hItem = wnd:Lookup('', 'Handle_ItemList') + for i = 0, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if (not hItem.nAutoLootLFC or nLFC - hItem.nAutoLootLFC >= GKP_AUTO_LOOT_DEBOUNCE_TIME) + and hItem:GetName() == 'Handle_Item' + and not hItem.itemData.bDist and not hItem.itemData.bNeedRoll and not hItem.itemData.bBidding + and ( + D.IsItemAutoPickup( + hItem.itemData, + ITEM_CONFIG, + doodadData, + bCanDialog or ((not X.IsRestricted('MY_GKPLoot.ForceTryAutoLoot') and not hItem.itemData.bAutoLooted)) + ) + ) + then + X.ExecuteWithThis(hItem, D.OnItemLButtonClick) + hItem.itemData.bAutoLooted = true + hItem.nAutoLootLFC = nLFC + end + end + wnd:Lookup('', 'Image_DoodadTitleBg'):SetFrame(bCanDialog and 0 or 3) + -- 目标距离 + local nDistance = -1 + if me and doodadData.nX and doodadData.nY then + nDistance = math.floor(math.sqrt(math.pow(me.nX - doodadData.nX, 2) + math.pow(me.nY - doodadData.nY, 2)) * 10 / 64) / 10 + end + if nDistance == -1 then + wnd:Lookup('', 'Handle_Compass'):Hide() + else + wnd:Lookup('', 'Handle_Compass'):Show() + wnd:Lookup('', 'Handle_Compass/Compass_Distance'):SetText(nDistance < 4 and '' or nDistance .. '"') + -- 自身面向 + if me then + wnd:Lookup('', 'Handle_Compass/Image_Player'):Show() + wnd:Lookup('', 'Handle_Compass/Image_Player'):SetRotate( - me.nFaceDirection / 128 * math.pi) + end + -- 物品位置 + local nRotate, nRadius = 0, 10.125 + if me and nDistance > 0 then + -- 特判角度 + if me.nX == doodadData.nX then + if me.nY > doodadData.nY then + nRotate = math.pi / 2 + else + nRotate = - math.pi / 2 + end + else + nRotate = math.atan((me.nY - doodadData.nY) / (me.nX - doodadData.nX)) + end + if nRotate < 0 then + nRotate = nRotate + math.pi + end + if doodadData.nY < me.nY then + nRotate = math.pi + nRotate + end + end + local nX = nRadius + nRadius * math.cos(nRotate) + 2 + local nY = nRadius - 3 - nRadius * math.sin(nRotate) + wnd:Lookup('', 'Handle_Compass/Image_PointGreen'):SetRelPos(nX, nY) + wnd:Lookup('', 'Handle_Compass'):FormatAllItemPos() + end + -- 移除不可交互的掉落 + if bRemoveUndialogable and not bCanDialog then + D.RemoveLootList(wnd.doodadData.dwID) + end + wnd = wnd:GetNext() + end +end + +function D.OnEvent(szEvent) + if szEvent == 'DOODAD_LEAVE_SCENE' then + if X.IsInDungeonMap() then + return + end + D.RemoveLootList(arg0) + elseif szEvent == 'PARTY_LOOT_MODE_CHANGED' then + if arg1 ~= PARTY_LOOT_MODE.DISTRIBUTE then + -- X.UI.CloseFrame(this) + end + elseif szEvent == 'PARTY_DISBAND' or szEvent == 'PARTY_DELETE_MEMBER' then + if szEvent == 'PARTY_DELETE_MEMBER' and arg1 ~= X.GetClientPlayerID() then + return + end + D.CloseFrame() + elseif szEvent == 'UI_SCALED' then + local a = this.anchor or O.anchor + this:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + elseif szEvent == 'MY_GKP_LOOT_RELOAD' or szEvent == 'MY_GKP_LOOT_BOSS' then + D.ReloadFrame() + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + this.anchor = GetFrameAnchor(this, 'LEFTTOP') + O.anchor = this.anchor +end + +function D.OnFrameDragSetPosEnd() + this:CorrectPos() +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_Mini' then + D.AdjustWnd(this:GetParent()) + D.AdjustFrame(this:GetRoot()) + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + if name == 'CheckBox_Mini' then + D.AdjustWnd(this:GetParent()) + D.AdjustFrame(this:GetRoot()) + end +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'Btn_Boss' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szXml = '' + local dwDoodadID = this:GetParent().doodadData.dwID + local aPartyMember = D.GetaPartyMember(dwDoodadID) + local p = MY_GKP_LOOT_BOSS and aPartyMember(MY_GKP_LOOT_BOSS) + if p then + local r, g, b = X.GetForceColor(p.dwForceID) + szXml = szXml .. GetFormatText(_L['LClick to distrubute all equipment to '], 136) + szXml = szXml .. GetFormatText('['.. p.szName ..']', 162, r, g, b) + szXml = szXml .. GetFormatText(_L['.'] .. '\n' .. _L['Ctrl + LClick to distrubute all lootable items to '], 136) + szXml = szXml .. GetFormatText('['.. p.szName ..']', 162, r, g, b) + szXml = szXml .. GetFormatText(_L['.'] .. '\n' .. _L['RClick to reselect Equipment Boss.'], 136) + elseif MY_GKP_LOOT_BOSS then + szXml = szXml .. GetFormatText(_L['LClick to distrubute all equipment to Equipment Boss.'] .. '\n', 136) + szXml = szXml .. GetFormatText(_L['Ctrl + LClick to distrubute all lootable items to Equipment Boss.'] .. '\n', 136) + szXml = szXml .. GetFormatText(_L['RClick to reselect Equipment Boss.'], 136) + else + szXml = szXml .. GetFormatText(_L['Click to select Equipment Boss.'], 136) + end + OutputTip(szXml, 450, {x, y, w, h}, ALW.TOP_BOTTOM) + end +end + +function D.OnMouseLeave() + local name = this:GetName() + if name == 'Btn_Boss' then + HideTip() + end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Close' then + if IsCtrlKeyDown() then + D.CloseFrame() + D.aDoodadID = {} + D.tDoodadInfo = {} + else + D.RemoveLootList(this:GetParent().doodadData.dwID, true) + end + elseif szName == 'Btn_Style' then + local wnd = this:GetParent() + local dwDoodadID = wnd.doodadData.dwID + local menu = { + { + szOption = _L['Link All Item'], + fnAction = function() + local aItemData = D.GetDoodadLootInfo(dwDoodadID) + local t = {} + for k, v in ipairs(aItemData) do + table.insert(t, MY_GKP.GetFormatLink(v.item)) + end + X.SendChat(PLAYER_TALK_CHANNEL.RAID, t) + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['switch styles'], + fnAction = function() + O.bVertical = not O.bVertical + FireUIEvent('MY_GKP_LOOT_RELOAD') + end, + }, + X.CONSTANT.MENU_DIVIDER, + D.GetFilterMenu(), + D.GetAutoPickupMenu(), + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Config'], + fnAction = function() + X.Panel.Show() + X.Panel.SwitchTab('MY_GKPDoodad') + end, + }, + { + szOption = _L['About'], + fnAction = function() + X.Alert(_L['GKP_TIPS']) + end, + }, + } + if IsCtrlKeyDown() then + table.insert(menu, 1, { szOption = dwDoodadID, bDisable = true }) + end + X.UI.PopupMenu(menu) + elseif szName == 'Btn_Boss' then + if not D.AuthCheck(this:GetParent().doodadData.dwID) then + return X.OutputAnnounceMessage(_L['You are not the distrubutor.']) + end + D.GetBossAction(this:GetParent().doodadData.dwID, type(MY_GKP_LOOT_BOSS) == 'nil') + end +end + +function D.OnRButtonClick() + local szName = this:GetName() + if szName == 'Btn_Boss' then + D.GetBossAction(this:GetParent().doodadData.dwID, true) + end +end + +function D.OnItemLButtonDown() + local szName = this:GetName() + if szName == 'Handle_Item' then + this = this:Lookup('Box_Item') + this.OnItemLButtonDown() + end +end + +function D.OnItemLButtonUp() + local szName = this:GetName() + if szName == 'Handle_Item' then + this = this:Lookup('Box_Item') + this.OnItemLButtonUp() + end +end + +function D.OnItemMouseEnter() + local szName = this:GetName() + if szName == 'Handle_Item' or szName == 'Box_Item' or szName == 'Handle_FilterItem' or szName == 'Box_FilterItem' then + local hItem = (szName == 'Handle_Item' or szName == 'Handle_FilterItem') and this or this:GetParent() + local box = hItem:Lookup('Box_Item') or hItem:Lookup('Box_FilterItem') + if IsAltKeyDown() and not IsCtrlKeyDown() and not IsShiftKeyDown() then + X.OutputTip(this, X.EncodeLUAData(hItem.itemData, ' ') .. '\n' .. X.EncodeLUAData({ + nUiId = hItem.itemData.item.nUiId, + dwID = hItem.itemData.item.dwID, + nGenre = hItem.itemData.item.nGenre, + nSub = hItem.itemData.item.nSub, + nDetail = hItem.itemData.item.nDetail, + nLevel = hItem.itemData.item.nLevel, + nPrice = hItem.itemData.item.nPrice, + dwScriptID = hItem.itemData.item.dwScriptID, + nMaxDurability = hItem.itemData.item.nMaxDurability, + nMaxExistAmount = hItem.itemData.item.nMaxExistAmount, + nMaxExistTime = hItem.itemData.item.nMaxExistTime, + bCanTrade = hItem.itemData.item.bCanTrade, + bCanDestory = hItem.itemData.item.bCanDestory, + szName = hItem.itemData.item.szName, + }, ' ')) + elseif szName == 'Handle_Item' then + X.ExecuteWithThis(box, box.OnItemMouseEnter) + end + -- local item = hItem.itemData.item + -- if itme and item.nGenre == ITEM_GENRE.EQUIPMENT then + -- if itme.nSub == X.CONSTANT.EQUIPMENT_SUB.MELEE_WEAPON then + -- this:SetOverText(3, g_tStrings.WeapenDetail[item.nDetail]) + -- else + -- this:SetOverText(3, g_tStrings.tEquipTypeNameTable[item.nSub]) + -- end + -- end + elseif szName == 'Image_GroupDistrib' then + local hItem = this:GetParent() + local hList = hItem:GetParent() + for i = 0, hList:GetItemCount() - 1 do + local h = hList:Lookup(i) + if h:GetName() == 'Handle_Item' then + h:Lookup('Shadow_Highlight'):SetVisible(h.itemData.szType == hItem.itemData.szType) + end + end + X.OutputTip(hItem, GetFormatText(_L['Onekey distrib this group'], 136), true) + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if szName == 'Handle_Item' or szName == 'Box_Item' then + if szName == 'Handle_Item' then + local box = this:Lookup('Box_Item') + if box and box.OnItemMouseLeave then + X.ExecuteWithThis(box, box.OnItemMouseLeave) + end + end + -- if this and this:IsValid() and this.SetOverText then + -- this:SetOverText(3, '') + -- end + elseif szName == 'Image_GroupDistrib' then + local hItem = this:GetParent() + local hList = hItem:GetParent() + for i = 0, hList:GetItemCount() - 1 do + hList:Lookup(i):Lookup('Shadow_Highlight'):Hide() + end + HideTip() + end +end + +-- 分配菜单 +function D.OnItemLButtonClick() + local szName = this:GetName() + if IsCtrlKeyDown() or IsAltKeyDown() then + return + end + if szName == 'Handle_Item' or szName == 'Box_Item' or szName == 'Handle_FilterItem' or szName == 'Box_FilterItem' then + local hItem = (szName == 'Handle_Item' or szName == 'Handle_FilterItem') and this or this:GetParent() + local box = hItem:Lookup('Box_Item') or hItem:Lookup('Box_FilterItem') + local data = hItem.itemData + local me, team = X.GetClientPlayer(), GetClientTeam() + local dwDoodadID = data.dwDoodadID + local doodad = X.GetDoodad(dwDoodadID) + if doodad and not data.bDist and not data.bNeedRoll and not data.bBidding then + if doodad.CanLoot(me.dwID) then + X.OpenDoodad(me, doodad) + elseif not doodad.CanDialog(me) then + X.OutputAnnounceMessage(g_tStrings.TIP_TOO_FAR) + end + end + if data.bDist then + if not doodad and not (X.IS_REMAKE and X.IsInDungeonMap()) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot:OnItemLButtonClick', 'Doodad does not exist!', X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + if not X.IsInDungeonMap() then + D.RemoveLootList(dwDoodadID) + end + return + end + if not D.AuthCheck(dwDoodadID) then + return + end + return X.UI.PopupMenu(D.GetDistributeMenu(data, data.item.nUiId)) + elseif data.bBidding then + if team.nLootMode ~= PARTY_LOOT_MODE.BIDDING then + return OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.GOLD_CHANGE_BID_LOOT) + end + X.OutputSystemMessage(_L['GKP does not support bidding, please re open loot list.']) + elseif data.bNeedRoll then + X.OutputAnnounceMessage(g_tStrings.ERROR_LOOT_ROLL) + else -- 左键摸走 + LootItem(dwDoodadID, data.dwID) + end + X.DelayCall('MY_GKPLoot__LootDoodad', 150, D.CloseLootWindow) + elseif szName == 'Image_GroupDistrib' then + local hItem = this:GetParent() + local hList = hItem:GetParent() + local aItemData = {} + for i = 0, hList:GetItemCount() - 1 do + local h = hList:Lookup(i) + if h:GetName() == 'Handle_Item' and h.itemData.szType == hItem.itemData.szType then + table.insert(aItemData, h.itemData) + end + end + for _, data in ipairs(aItemData) do + local dwDoodadID = data.dwDoodadID + local doodad = X.GetDoodad(dwDoodadID) + if not doodad then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot:OnItemLButtonClick', 'Doodad does not exist!', X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + if not X.IsInDungeonMap() then + D.RemoveLootList(dwDoodadID) + end + return + end + if not D.AuthCheck(dwDoodadID) then + return X.OutputAnnounceMessage(_L['You are not the distrubutor.']) + end + end + return X.UI.PopupMenu(D.GetDistributeMenu(aItemData, hItem.itemData.szType)) + end +end + +-- 右键拍卖 +function D.OnItemRButtonClick() + local szName = this:GetName() + if szName == 'Handle_Item' or szName == 'Box_Item' or szName == 'Handle_FilterItem' or szName == 'Box_FilterItem' then + local hItem = (szName == 'Handle_Item' or szName == 'Handle_FilterItem') and this or this:GetParent() + local box = hItem:Lookup('Box_Item') or hItem:Lookup('Box_FilterItem') + local data = hItem.itemData + if not data.bDist and not data.bBidding then + return + end + local dwDoodadID = data.dwDoodadID + if not D.AuthCheck(dwDoodadID, true) then + return + end + X.UI.PopupMenu(D.GetItemBiddingMenu(dwDoodadID, data)) + end +end + +function D.GetFilterMenu() + local t = { + szOption = _L['Loot item filter'], + -- 隐藏过滤物品 + { + szOption = _L['Hide filter items'], + bCheck = true, + bChecked = ITEM_CONFIG.bHideFiltered, + fnAction = function() + ITEM_CONFIG.bHideFiltered = not ITEM_CONFIG.bHideFiltered + D.ReloadFrame() + end, + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + local szText = GetFormatText(_L['Hide all filter items instead of collapse display them, will be reset after loading.'], nil, 255, 255, 0) + OutputTip(szText, 600, {nX, nY, nW, nH}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + }, + X.CONSTANT.MENU_DIVIDER, + } + + -- 品级过滤 + local t1 = { + szOption = _L['Quality filter'], + } + for i, p in ipairs(GKP_ITEM_QUALITIES) do + table.insert(t1, { + szOption = p.szTitle, + rgb = { GetItemFontColorByQuality(p.nQuality) }, + bCheck = true, + bChecked = ITEM_CONFIG.tFilterQuality[p.nQuality], + fnAction = function() + ITEM_CONFIG.tFilterQuality[p.nQuality] = not ITEM_CONFIG.tFilterQuality[p.nQuality] + ITEM_CONFIG.tFilterQuality = ITEM_CONFIG.tFilterQuality + D.ReloadFrame() + end, + }) + end + table.insert(t, t1) + + -- 名称过滤 + local t1 = { + szOption = _L['Name filter'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = ITEM_CONFIG.bNameFilter, + fnAction = function() + ITEM_CONFIG.bNameFilter = not ITEM_CONFIG.bNameFilter + D.ReloadFrame() + end, + }, + X.CONSTANT.MENU_DIVIDER, + } + for szName, bEnable in pairs(O.tNameFilter) do + table.insert(t1, { + szOption = szName, + bCheck = true, + bChecked = bEnable, + fnAction = function() + O.tNameFilter[szName] = not O.tNameFilter[szName] + O.tNameFilter = O.tNameFilter + D.ReloadFrame() + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tNameFilter[szName] = nil + O.tNameFilter = O.tNameFilter + X.UI.ClosePopupMenu() + D.ReloadFrame() + end, + fnDisable = function() return not ITEM_CONFIG.bNameFilter end, + }) + end + if not X.IsEmpty(O.tNameFilter) then + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t1, { + szOption = _L['Add'], + fnAction = function() + GetUserInput(_L['Please input filter name'], function(szText) + O.tNameFilter[szText] = true + O.tNameFilter = O.tNameFilter + D.ReloadFrame() + end, nil, nil, nil, '', nil) + end, + fnDisable = function() return not ITEM_CONFIG.bNameFilter end, + }) + table.insert(t, t1) + + -- 过滤已读书籍 + table.insert(t, { + szOption = _L['Filter book read'], + bCheck = true, + bChecked = O.bFilterBookRead, + fnAction = function() + O.bFilterBookRead = not O.bFilterBookRead + D.ReloadFrame() + end, + }) + + -- 过滤已有书籍 + table.insert(t, { + szOption = _L['Filter book have'], + bCheck = true, + bChecked = O.bFilterBookHave, + fnAction = function() + O.bFilterBookHave = not O.bFilterBookHave + D.ReloadFrame() + end, + }) + + return t +end + +function D.GetAutoPickupMenu() + local t = { szOption = _L['Auto pickup'] } + table.insert(t, { szOption = _L['Filters have higher priority'], bDisable = true }) + -- 拾取过滤 + -- 过滤已读书籍 + table.insert(t, { + szOption = _L['Filter book read'], + bCheck = true, + bChecked = O.bAutoPickupFilterBookRead, + fnAction = function() + O.bAutoPickupFilterBookRead = not O.bAutoPickupFilterBookRead + end, + }) + -- 过滤已有书籍 + table.insert(t, { + szOption = _L['Filter book have'], + bCheck = true, + bChecked = O.bAutoPickupFilterBookHave, + fnAction = function() + O.bAutoPickupFilterBookHave = not O.bAutoPickupFilterBookHave + end, + }) + -- 自动拾取物品过滤 + local t1 = { szOption = _L['Auto pickup filters'] } + for s, b in pairs(O.tAutoPickupFilters or {}) do + table.insert(t1, { + szOption = s, + bCheck = true, bChecked = b, + fnAction = function() + O.tAutoPickupFilters[s] = not O.tAutoPickupFilters[s] + O.tAutoPickupFilters = O.tAutoPickupFilters + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tAutoPickupFilters[s] = nil + O.tAutoPickupFilters = O.tAutoPickupFilters + X.UI.ClosePopupMenu() + end, + }) + end + if #t1 > 0 then + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t1, { + szOption = _L['Add new'], + fnAction = function() + GetUserInput(_L['Please input new auto pickup filter:'], function(text) + O.tAutoPickupFilters[text] = true + O.tAutoPickupFilters = O.tAutoPickupFilters + end) + end, + }) + table.insert(t, t1) + -- 自动拾取 + table.insert(t, X.CONSTANT.MENU_DIVIDER) + -- 自动拾取任务物品 + table.insert(t, { + szOption = _L['Auto pickup quest item'], + bCheck = true, bChecked = O.bAutoPickupTaskItem, + fnAction = function() + O.bAutoPickupTaskItem = not O.bAutoPickupTaskItem + end, + }) + -- 自动拾取书籍 + table.insert(t, { + szOption = _L['Auto pickup book'], + bCheck = true, bChecked = O.bAutoPickupBook, + fnAction = function() + O.bAutoPickupBook = not O.bAutoPickupBook + end, + }) + -- 自动拾取品级 + local t1 = { + szOption = _L['Auto pickup by item quality'], + { + szOption = _L['Enable'], + bCheck = true, + bChecked = O.bAutoPickupQuality, + fnAction = function() + O.bAutoPickupQuality = not O.bAutoPickupQuality + end, + }, + X.CONSTANT.MENU_DIVIDER, + } + for i, p in ipairs(GKP_ITEM_QUALITIES) do + table.insert(t1, { + szOption = p.szTitle, + rgb = { GetItemFontColorByQuality(p.nQuality) }, + bCheck = true, + bChecked = O.tAutoPickupQuality[p.nQuality], + fnAction = function() + O.tAutoPickupQuality[p.nQuality] = not O.tAutoPickupQuality[p.nQuality] + O.tAutoPickupQuality = O.tAutoPickupQuality + end, + fnDisable = function() return not O.bAutoPickupQuality end, + }) + end + table.insert(t, t1) + -- 自动拾取物品名称 + local t1 = { szOption = _L['Auto pickup names'] } + for s, b in pairs(O.tAutoPickupNames or {}) do + table.insert(t1, { + szOption = s, + bCheck = true, bChecked = b, + fnAction = function() + O.tAutoPickupNames[s] = not O.tAutoPickupNames[s] + O.tAutoPickupNames = O.tAutoPickupNames + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tAutoPickupNames[s] = nil + O.tAutoPickupNames = O.tAutoPickupNames + X.UI.ClosePopupMenu() + end, + }) + end + if #t1 > 0 then + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t1, { + szOption = _L['Add new'], + fnAction = function() + GetUserInput(_L['Please input new auto pickup name:'], function(text) + O.tAutoPickupNames[text] = true + O.tAutoPickupNames = O.tAutoPickupNames + end) + end, + }) + table.insert(t, t1) + return t +end + +function D.GetBossAction(dwDoodadID, bMenu) + if not D.AuthCheck(dwDoodadID) then + return + end + local aItemData = D.GetDoodadLootInfo(dwDoodadID) + local fnAction = function() + local aEquipmentItemData = {} + for k, v in ipairs(aItemData) do + if ( + (v.item.nGenre == ITEM_GENRE.EQUIPMENT and ( + v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.MELEE_WEAPON + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.RANGE_WEAPON + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.CHEST + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.HELM + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.AMULET + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.RING + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.WAIST + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.PENDANT + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.PANTS + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.BOOTS + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.BANGLE + or v.item.nSub == X.CONSTANT.EQUIPMENT_SUB.ARROW + )) + or IsCtrlKeyDown() + ) and v.bDist then -- 按住Ctrl的情况下 无视分类 否则只给装备 + table.insert(aEquipmentItemData, v) + end + end + if #aEquipmentItemData == 0 then + return X.Alert(_L['No Equiptment left for Equiptment Boss']) + end + local aPartyMember = D.GetaPartyMember(dwDoodadID) + local p = aPartyMember(MY_GKP_LOOT_BOSS) + if p and p.bOnlineFlag then -- 这个人存在团队的情况下 + local szXml = GetFormatText(_L['Are you sure you want the following item\n'], 162, 255, 255, 255) + local r, g, b = X.GetForceColor(p.dwForceID) + for k, v in ipairs(aEquipmentItemData) do + local r, g, b = GetItemFontColorByQuality(v.item.nQuality) + szXml = szXml .. GetFormatText('['.. X.GetItemNameByItem(v.item) ..']\n', 166, r, g, b) + end + szXml = szXml .. GetFormatText(_L['All distrubute to'], 162, 255, 255, 255) + szXml = szXml .. GetFormatText('['.. p.szName ..']', 162, r, g, b) + local msg = { + szMessage = szXml, + szName = 'GKP_Distribute', + szAlignment = 'CENTER', + bRichText = true, + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + D.DistributeItem(MY_GKP_LOOT_BOSS, aEquipmentItemData, nil, true) + end + }, + { + szOption = g_tStrings.STR_HOTKEY_CANCEL + }, + } + MessageBox(msg) + else + return X.Alert(_L['Cannot distrubute items to Equipment Boss, may due to Equipment Boss is too far away or got dropline when looting.']) + end + end + if bMenu then + local menu = MY_GKP.GetTeamMemberMenu(function(v) + MY_GKP_LOOT_BOSS = v.dwID + fnAction() + end, false, true) + table.insert(menu, 1, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, 1, { szOption = _L['select equip boss'], bDisable = true }) + X.UI.PopupMenu(menu) + else + fnAction() + end +end + +function D.AuthCheck(dwDoodadID, bIgnoreLootMode) + -- 需要自己是分配者 + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.ERROR_LOOT_DISTRIBUTE) + return false + end + local team = GetClientTeam() + -- 需要分配者模式 + local nLootMode = team.nLootMode + if not bIgnoreLootMode and nLootMode ~= PARTY_LOOT_MODE.DISTRIBUTE and not X.IsDebugging('MY_GKP') then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.GOLD_CHANGE_DISTRIBUTE_LOOT) + return false + end + -- 需要掉落所属是在自己队伍 + if not X.IsInDungeonMap() then + local doodad = X.GetDoodad(dwDoodadID) + if not doodad then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot:AuthCheck', 'Doodad does not exist!', X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + return + end + local dwBelongTeamID = doodad.GetBelongTeamID() + if dwBelongTeamID ~= team.dwTeamID then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.ERROR_LOOT_DISTRIBUTE) + return false + end + end + return true +end + +-- 拾取对象 +function D.GetaPartyMember(aDoodadID) + if not X.IsTable(aDoodadID) then + aDoodadID = {aDoodadID} + end + local team = GetClientTeam() + local tDoodadID = {} + local tPartyMember = {} + local aPartyMember = {} + for _, dwDoodadID in ipairs(aDoodadID) do + if not tDoodadID[dwDoodadID] then + local aLooterList = X.GetDoodadLooterList(dwDoodadID) + if aLooterList then + for _, p in ipairs(aLooterList) do + if not tPartyMember[p.dwID] then + table.insert(aPartyMember, p) + tPartyMember[p.dwID] = true + end + end + else + X.OutputSystemMessage(_L['Pick up time limit exceeded, please try again.']) + end + tDoodadID[dwDoodadID] = true + end + end + for k, v in ipairs(aPartyMember) do + local player = team.GetMemberInfo(v.dwID) + aPartyMember[k].dwForceID = player.dwForceID + aPartyMember[k].dwMapID = player.dwMapID + end + setmetatable(aPartyMember, { __call = function(me, dwID) + for k, v in ipairs(me) do + if v.dwID == dwID or v.szName == dwID then + return v + end + end + end }) + return aPartyMember +end + +-- 严格判断 +function D.DistributeItem(dwID, info, szAutoDistType, bSkipRecordPanel) + if X.IsArray(info) then + for _, p in ipairs(info) do + D.DistributeItem(dwID, p, szAutoDistType, bSkipRecordPanel) + end + return + end + if not D.AuthCheck(info.dwDoodadID) then + return + end + local me = X.GetClientPlayer() + local item = GetItem(info.dwID) + if not item then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot', 'Item does not exist, check!!', X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + local aItemData = D.GetDoodadLootInfo(info.dwDoodadID) + for k, v in ipairs(aItemData) do + if v.nQuality == info.nQuality and X.GetItemNameByItem(v.item) == info.szName then + info.dwID = v.item.dwID + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot', 'Item matching, ' .. X.GetItemNameByItem(v.item), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + break + end + end + end + local item = GetItem(info.dwID) + local playerInfo = X.GetTeamMemberInfo(dwID) + local aPartyMember = D.GetaPartyMember(info.dwDoodadID) + if item then + if not playerInfo or (playerInfo and not playerInfo.bOnline) then -- 不在线 + return X.Alert(_L['No Pick up Object, may due to Network off - line']) + end + if not aPartyMember(dwID) then -- 给不了 + return X.Alert(_L['No Pick up Object, may due to Network off - line']) + end + if playerInfo.dwMapID ~= me.GetMapID() then -- 不在同一地图 + return X.Alert(_L['No Pick up Object, Please confirm that in the Dungeon.']) + end + local tab = { + szPlayer = playerInfo.szName, + dwID = item.dwID, + nUiId = item.nUiId, + szNpcName = info.szDoodadName, + dwDoodadID = info.dwDoodadID, + dwTabType = item.dwTabType, + dwIndex = item.dwIndex, + nVersion = item.nVersion, + nTime = GetCurrentTime(), + nQuality = item.nQuality, + dwForceID = playerInfo.dwForceID, + szName = X.GetItemNameByItem(item), + nGenre = item.nGenre, + } + if item.bCanStack and item.nStackNum > 1 then + tab.nStackNum = item.nStackNum + end + if item.nGenre == ITEM_GENRE.BOOK then + tab.nBookID = item.nBookID + end + MY_GKP_MI.NewAuction(tab, IsShiftKeyDown() or bSkipRecordPanel) + if szAutoDistType then + GKP_LOOT_RECENT[szAutoDistType] = dwID + end + if DEBUG_LOOT then + return X.OutputSystemMessage('LOOT: ' .. info.dwID .. '->' .. dwID) -- !!! Debug + end + X.DistributeDoodadItem(info.dwDoodadID, info.dwID, dwID) + else + X.OutputSystemMessage(_L['Userdata is overdue, distribut failed, please try again.']) + end +end + +function D.GetMessageBox(dwID, aItemData, szAutoDistType, bSkipRecordPanel) + if not X.IsArray(aItemData) then + aItemData = {aItemData} + end + local team = GetClientTeam() + local info = team.GetMemberInfo(dwID) + local fr, fg, fb = X.GetForceColor(info.dwForceID) + local aItemName = {} + for _, data in ipairs(aItemData) do + local ir, ig, ib = GetItemFontColorByQuality(data.nQuality) + table.insert(aItemName, GetFormatText('['.. data.szName .. ']', 166, ir, ig, ib)) + end + local msg = { + szMessage = FormatLinkString( + g_tStrings.PARTY_DISTRIBUTE_ITEM_SURE, + 'font=162', + table.concat(aItemName, GetFormatText(g_tStrings.STR_PAUSE)), + GetFormatText('['.. info.szName .. ']', 162, fr, fg, fb) + ), + szName = 'GKP_Distribute', + bRichText = true, + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + D.DistributeItem(dwID, aItemData, szAutoDistType, bSkipRecordPanel) + end + }, + { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + } + MessageBox(msg) +end + +do +local function IsItemRequireConfirm(data) + if data.nQuality >= O.nConfirmQuality + or (O.tConfirm.Huangbaba -- 玄晶 + and data.item.nQuality == GKP_LOOT_HUANGBABA_QUALITY + and X.GetItemIconByUIID(data.item.nUiId) == GKP_LOOT_HUANGBABA_ICON + ) + or (O.tConfirm.Book and data.item.nGenre == ITEM_GENRE.BOOK) -- 书籍 + or (O.tConfirm.Pendant and data.item.nGenre == ITEM_GENRE.EQUIPMENT and ( -- 挂件 + data.item.nSub == EQUIPMENT_REPRESENT.WAIST_EXTEND + or data.item.nSub == EQUIPMENT_REPRESENT.BACK_EXTEND + or data.item.nSub == EQUIPMENT_REPRESENT.FACE_EXTEND + )) + or (O.tConfirm.Outlook and data.item.nGenre == ITEM_GENRE.EQUIPMENT and ( -- 肩饰披风 + data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.BACK_CLOAK_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.L_SHOULDER_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.R_SHOULDER_EXTEND + )) + or (O.tConfirm.Pet and ( -- 跟宠 + data.item.nGenre == ITEM_GENRE.CUB + or (data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.PET) + )) + or (O.tConfirm.Horse and ( -- 坐骑 + data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.HORSE + )) + or (O.tConfirm.HorseEquip and ( -- 马具 + data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.HORSE_EQUIP + )) + then + return true + end + return false +end +local function GetMemberMenu(member, aItemData, szAutoDistType, aDoodadID) + local frame = D.GetFrame() + local szIcon, nFrame = GetForceImage(member.dwForceID) + local szOption = member.szName + return { + szOption = szOption, + bDisable = not member.bOnlineFlag, + rgb = { X.GetForceColor(member.dwForceID) }, + szIcon = szIcon, nFrame = nFrame, + fnAutoClose = function() + for _, v in ipairs(aDoodadID) do + if D.GetDoodadWnd(frame, v) then + return false + end + end + return true + end, + szLayer = 'ICON_RIGHTMOST', + fnAction = function() + local bConfirm = false + for _, data in ipairs(aItemData) do + if IsItemRequireConfirm(data) then + bConfirm = true + break + end + end + if bConfirm then + D.GetMessageBox(member.dwID, aItemData, szAutoDistType, IsShiftKeyDown()) + else + D.DistributeItem(member.dwID, aItemData, szAutoDistType, IsShiftKeyDown()) + end + end, + fnMouseEnter = function() + X.OutputTip(_L['Hold shift click to skip gkp record panel'], 136) + end, + fnMouseLeave = function() + HideTip() + end, + } +end +function D.GetDistributeMenu(aItemData, szAutoDistType) + if not X.IsArray(aItemData) then + aItemData = {aItemData} + end + local aDoodadID = {} + for _, p in ipairs(aItemData) do + if p.bDist then + table.insert(aDoodadID, p.dwDoodadID) + end + end + local me, team = X.GetClientPlayer(), GetClientTeam() + local dwMapID = me.GetMapID() + local aPartyMember = D.GetaPartyMember(aDoodadID) + table.sort(aPartyMember, function(a, b) + return a.dwForceID < b.dwForceID + end) + local aItemName = {} + for _, p in ipairs(aItemData) do + table.insert(aItemName, p.szName) + end + local menu = { + { szOption = table.concat(aItemName, g_tStrings.STR_PAUSE), bDisable = true }, + X.CONSTANT.MENU_DIVIDER + } + local dwAutoDistID + if szAutoDistType then + dwAutoDistID = GKP_LOOT_RECENT[szAutoDistType] + if dwAutoDistID then + local member = aPartyMember(dwAutoDistID) + if member then + table.insert(menu, GetMemberMenu(member, aItemData, szAutoDistType, aDoodadID)) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + end + end + for _, member in ipairs(aPartyMember) do + table.insert(menu, GetMemberMenu(member, aItemData, szAutoDistType, aDoodadID)) + end + return menu +end +end + +function D.GetItemBiddingMenu(dwDoodadID, data) + local menu = {} + table.insert(menu, { szOption = data.szName , bDisable = true }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = 'Roll', + fnAction = function() + if MY_RollMonitor then + if MY_RollMonitor.OpenPanel and MY_RollMonitor.Clear then + MY_RollMonitor.OpenPanel() + MY_RollMonitor.Clear({echo=false}) + end + end + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { MY_GKP.GetFormatLink(data.item), MY_GKP.GetFormatLink(_L['Roll the dice if you wang']) }) + return 0 + end + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + for k, v in ipairs(MY_GKP.aScheme) do + if v[3] then + table.insert(menu, { + szOption = v[1] .. ',' .. v[2], + fnAction = function() + local bNewBidding = MY_GKP.bNewBidding == not IsShiftKeyDown() + if bNewBidding then + MY_Bidding.Open({ + nPriceMin = v[1], + nPriceStep = v[2], + nNumber = data.item.bCanStack and data.item.nStackNum or 1, + dwTabType = data.item.dwTabType, + dwTabIndex = data.item.dwIndex, + nBookID = data.item.nGenre == ITEM_GENRE.BOOK and data.item.nBookID or nil, + }) + return 0 + end + MY_GKP_Chat.OpenFrame(data.item, D.GetDistributeMenu(data, data.nUiId), { + dwDoodadID = dwDoodadID, + data = data, + }) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + MY_GKP.GetFormatLink(data.item), + MY_GKP.GetFormatLink(_L(' %d Gold Start Bidding, off a price if you want.', v[1])), + }) + return 0 + end, + fnMouseEnter = function() + local szMsg = GetFormatText( + MY_GKP.bNewBidding + and _L['Hold SHIFT click to raise ancient bidding panel.'] + or _L['Hold SHIFT click to raise new bidding panel.'] + , nil, 255, 255, 0) + OutputTip(szMsg, 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + }) + end + end + return menu +end + +function D.GetListWidth() + return O.bVertical and 270 or (52 * 8) +end + +function D.AdjustFrame(frame) + local scroll = frame:Lookup('Scroll_DoodadList') + local scrollbar = scroll:Lookup('ScrolBar_DoodadList') + local container = scroll:Lookup('WndContainer_DoodadList') + local nW, nH = frame:GetW(), 0 + local wnd = container:LookupContent(0) + while wnd do + nW = wnd:GetW() + nH = nH + wnd:GetH() + wnd = wnd:GetNext() + end + nH = math.min(nH, select(2, Station.GetClientSize()) * 4 / 5) + scroll:SetSize(nW, nH) + scrollbar:SetH(nH) + scrollbar:SetRelX(nW - 8) + container:SetSize(nW, nH) + container:FormatAllContentPos() + frame:SetSize(nW, nH) +end + +function D.AdjustWnd(wnd) + local nInnerW = D.GetListWidth() + local nOuterW = O.bVertical and nInnerW or (nInnerW + 10) + local hDoodad = wnd:Lookup('', '') + local hList = hDoodad:Lookup('Handle_ItemList') + local bMini = wnd:Lookup('CheckBox_Mini'):IsCheckBoxChecked() + hList:SetW(nInnerW) + hList:SetRelX((nOuterW - nInnerW) / 2) + hList:FormatAllItemPos() + hList:SetSizeByAllItemSize() + hList:SetVisible(not bMini) + hDoodad:SetSize(nOuterW, (bMini and 0 or hList:GetH()) + 30) + hDoodad:Lookup('Handle_Compass'):SetRelX(nOuterW - 107) + hDoodad:Lookup('Image_DoodadTitleBg'):SetW(nOuterW) + hDoodad:Lookup('Image_DoodadBg'):SetSize(nOuterW, hDoodad:GetH() - 20) + hDoodad:FormatAllItemPos() + wnd:SetSize(nOuterW, hDoodad:GetH()) + wnd:Lookup('Btn_Boss'):SetRelX(nOuterW - 80) + wnd:Lookup('CheckBox_Mini'):SetRelX(nOuterW - 50) + wnd:Lookup('Btn_Close'):SetRelX(nOuterW - 28) +end + +function D.GetDoodadWnd(frame, dwDoodadID, bCreate) + if not frame then + return + end + local container = frame:Lookup('Scroll_DoodadList/WndContainer_DoodadList') + local wnd = container:LookupContent(0) + while wnd and wnd.doodadData.dwID ~= dwDoodadID do + wnd = wnd:GetNext() + end + if not wnd and bCreate then + local tDoodadInfo = D.GetDoodadData(dwDoodadID) + if tDoodadInfo then + wnd = container:AppendContentFromIni(GKP_LOOT_INIFILE, 'Wnd_Doodad') + wnd.doodadData = tDoodadInfo + end + end + return wnd +end + +local function IsItemDataSuitable(data) + local me = X.GetClientPlayer() + if not me then + return 'NOT_SUITABLE' + end + local aKungfu = X.GetForceKungfuList(me.dwForceID) + if data.szType == 'BOOK' then + local nBookID, nSegmentID = X.RecipeToSegmentID(data.item.nBookID) + if me.IsBookMemorized(nBookID, nSegmentID) then + return 'NOT_SUITABLE' + end + return 'SUITABLE' + else + local szSuit = X.DoesEquipmentSuit(data.item, true) and 'SUITABLE' or 'NOT_SUITABLE' + if szSuit == 'SUITABLE' then + if data.szType == 'EQUIPMENT' or data.szType == 'WEAPON' then + szSuit = X.IsItemFitKungfu(data.item, me.GetKungfuMountID()) and 'SUITABLE' or 'NOT_SUITABLE' + if szSuit == 'NOT_SUITABLE' and O.bShow2ndKungfuLoot then + for _, dwKungfuID in ipairs(aKungfu) do + if X.IsItemFitKungfu(data.item, dwKungfuID) then + szSuit = 'MAYBE_SUITABLE' + break + end + end + end + elseif data.szType == 'EQUIPMENT_SIGN' then + szSuit = X.StringFindW(data.item.szName, g_tStrings.tForceTitle[me.dwForceID]) and 'SUITABLE' or 'NOT_SUITABLE' + end + end + if szSuit == 'SUITABLE' and X.IsBetterEquipment(data.item) then + return 'BETTER' + end + return szSuit + end +end + +function D.InsertLootList(dwDoodadID) + local bExist = false + for _, v in ipairs(D.aDoodadID) do + if v == dwDoodadID then + bExist = true + break + end + end + if not bExist then + table.insert(D.aDoodadID, dwDoodadID) + end + D.DrawLootList(dwDoodadID) +end + +function D.DrawLootList(dwDoodadID, bRemove) + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local frame = D.GetFrame() + local wnd = D.GetDoodadWnd(frame, dwDoodadID) + + if bRemove then + if wnd then + wnd:Destroy() + local container = frame:Lookup('Scroll_DoodadList/WndContainer_DoodadList') + if container:GetAllContentCount() == 0 then + D.CloseFrame() + else + D.AdjustFrame(frame) + end + end + else + local config = ITEM_CONFIG + -- 计算掉落 + local aItemData, nMoney, szName, bSpecial = D.GetDoodadLootInfo(dwDoodadID) + if nMoney > 0 then + LootMoney(dwDoodadID) + end + local nCount = #aItemData + local aNormalItemData = aItemData + local aFilterItemData = {} + if not X.IsEmpty(config.tFilterQuality) or config.bFilterBookRead or config.bFilterBookHave then + nCount = 0 + aNormalItemData = {} + for i, v in ipairs(aItemData) do + if D.IsItemDisplay(v, config) then + nCount = nCount + 1 + table.insert(aNormalItemData, v) + else + if not ITEM_CONFIG.bHideFiltered then + nCount = nCount + 1 + end + table.insert(aFilterItemData, v) + end + end + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot', ('Doodad %d, items %d, display %d.'):format(dwDoodadID, #aItemData, nCount), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + + if not szName or nCount == 0 then + if not szName then + D.RemoveLootList(dwDoodadID) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot:DrawLootList', 'Doodad does not exist!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + elseif frame then + D.DrawLootList(dwDoodadID, true) + end + return + end + + -- 获取/创建UI元素 + if not frame then + frame = D.OpenFrame() + end + if not wnd then + wnd = D.GetDoodadWnd(frame, dwDoodadID, true) + end + if not wnd then + D.RemoveLootList(dwDoodadID) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot:DrawLootList', 'Doodad wnd does not exist!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return + end + + -- 修改UI元素 + local bDist = false + local hDoodad = wnd:Lookup('', '') + local hList = hDoodad:Lookup('Handle_ItemList') + hList:Clear() + for i, itemData in ipairs(aNormalItemData) do + local item = itemData.item + local szName = X.GetItemNameByItem(item) + local h = hList:AppendItemFromIni(GKP_LOOT_INIFILE, 'Handle_Item') + local box = h:Lookup('Box_Item') + local txt = h:Lookup('Text_Item') + if O.bVertical then + txt:SetText(szName) + h:Lookup('Image_GroupDistrib'):SetVisible(itemData.bDist + and (i == 1 or aNormalItemData[i - 1].szType ~= itemData.szType or not aNormalItemData[i - 1].bDist)) + h:Lookup('Image_Spliter'):SetVisible(i ~= #aNormalItemData) + else + txt:SetText((szName:gsub('^.-' .. g_tStrings.STR_CONNECT, ''))) + txt:SetRelPos(2, 2) + txt:SetW(48) + txt:SetHAlign(2) + txt:SetVAlign(0) + txt:SetFontScheme(8) + box:SetSize(48, 48) + box:SetRelPos(2, 2) + h:Lookup('Image_Suitable'):SetRelPos(0, 35) + h:Lookup('Image_MaybeSuitable'):SetRelPos(0, 35) + h:Lookup('Image_Better'):SetRelPos(0, 32) + h:Lookup('Image_Better'):SetH(22) + h:SetSize(52, 52) + h:FormatAllItemPos() + h:Lookup('Image_GroupDistrib'):Hide() + h:Lookup('Image_Spliter'):Hide() + h:Lookup('Image_Hover'):SetSize(0, 0) + end + local szSuit = IsItemDataSuitable(itemData) + h:Lookup('Image_Suitable'):SetVisible(szSuit == 'SUITABLE') + h:Lookup('Image_MaybeSuitable'):SetVisible(szSuit == 'MAYBE_SUITABLE') + h:Lookup('Image_Better'):SetVisible(szSuit == 'BETTER') + txt:SetFontColor(GetItemFontColorByQuality(item.nQuality)) + UpdateBoxObject(box, UI_OBJECT_ITEM_ONLY_ID, item.dwID) + -- box:SetOverText(3, '') + -- box:SetOverTextFontScheme(3, 15) + -- box:SetOverTextPosition(3, ITEM_POSITION.LEFT_TOP) + if GKP_LOOT_RECENT[item.nUiId] then + box:SetObjectStaring(true) + end + if O.bSetColor and item.nGenre == ITEM_GENRE.MATERIAL then + for dwForceID, szForceTitle in pairs(g_tStrings.tForceTitle) do + if szName:find(szForceTitle) then + txt:SetFontColor(X.GetForceColor(dwForceID)) + break + end + end + end + if itemData.bDist then + bDist = true + end + h.itemData = itemData + h.nAutoLootLFC = nil + end + if #aFilterItemData > 0 and not ITEM_CONFIG.bHideFiltered then + local h = hList:AppendItemFromIni(GKP_LOOT_INIFILE, 'Handle_ItemFiltered') + local hFL = h:Lookup('Handle_FilterItemList') + hFL:Clear() + for i, itemData in ipairs(aFilterItemData) do + local item = itemData.item + local hFI = hFL:AppendItemFromIni(GKP_LOOT_INIFILE, 'Handle_FilterItem') + local box = hFI:Lookup('Box_FilterItem') + UpdateBoxObject(box, UI_OBJECT_ITEM_ONLY_ID, item.dwID) + if GKP_LOOT_RECENT[item.nUiId] then + box:SetObjectStaring(true) + end + if itemData.bDist then + bDist = true + end + hFI.itemData = itemData + end + local nW = D.GetListWidth() + if O.bVertical then + hFL:SetW(nW - 8) + hFL:FormatAllItemPos() + hFL:SetSizeByAllItemSize() + h:FormatAllItemPos() + h:SetSizeByAllItemSize() + h:SetW(nW) + else + local nRemainW = nW - (#aNormalItemData * 52) % nW + local nMaxRemainFilterItem = math.floor(nRemainW / 26) * 2 + if nMaxRemainFilterItem >= #aFilterItemData then + hFL:SetW(nRemainW) + else + hFL:SetW(nW - 8) + end + hFL:SetRelPos(0, 0) + hFL:FormatAllItemPos() + hFL:SetSizeByAllItemSize() + h:Lookup('Image_FilterSpliter'):Hide() + h:FormatAllItemPos() + h:SetSize(hFL:GetSize()) + end + end + if bSpecial then + hDoodad:Lookup('Image_DoodadBg'):FromUITex('ui/Image/OperationActivity/RedEnvelope2.uitex', 14) + hDoodad:Lookup('Image_DoodadTitleBg'):FromUITex('ui/Image/OperationActivity/RedEnvelope2.uitex', 14) + hDoodad:Lookup('Text_Title'):SetAlpha(255) + hDoodad:Lookup('SFX'):Show() + end + hDoodad:Lookup('Text_Title'):SetText((szName or g_tStrings.STR_NAME_UNKNOWN) .. ' (' .. nCount .. ')') + wnd:Lookup('Btn_Boss'):Enable(bDist) + + -- 修改UI大小 + D.AdjustWnd(wnd) + D.AdjustFrame(frame) + + -- 立即自动拾取一次 + X.ExecuteWithThis(frame, D.OnFrameBreathe) + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage( + _L['PMTool'], + _L('DrawLootList %d in %dms.', dwDoodadID, nTickCount), + X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] + end +end + +function D.RemoveLootList(dwDoodadID, bManually) + if bManually then + D.tDoodadClosed[dwDoodadID] = true + end + for i, v in ipairs(D.aDoodadID) do + if dwDoodadID == v then + table.remove(D.aDoodadID, i) + break + end + end + D.DrawLootList(dwDoodadID, true) +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_GKPLoot') +end + +function D.OpenFrame() + local frame = D.GetFrame() + if not frame then + frame = X.UI.OpenFrame(GKP_LOOT_INIFILE, 'MY_GKPLoot') + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) + end + return frame +end + +-- 手动关闭 不适用自定关闭 +function D.CloseFrame() + local frame = D.GetFrame() + if frame then + X.UI.CloseFrame(frame) + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) + end +end + +function D.ReloadFrame() + if #D.aDoodadID == 0 then + D.CloseFrame() + else + D.OpenFrame() + for _, dwDoodadID in ipairs(D.aDoodadID) do + D.DrawLootList(dwDoodadID) + end + end +end + +function D.GetDoodadData(dwDoodadID) + local doodad = X.GetDoodad(dwDoodadID) + if doodad then + D.tDoodadInfo[dwDoodadID] = { + dwID = doodad.dwID, + szName = doodad.szName, + nX = doodad.nX, + nY = doodad.nY, + } + end + return D.tDoodadInfo[dwDoodadID] +end + +local ITEM_DATA_WEIGHT = { + COIN_SHOP = 1, -- 外观 披风 礼盒 + OUTLOOK = 1, -- 外观 披风 礼盒 + PENDANT = 2, -- 挂件 + PET = 3, -- 宠物 + HORSE = 4, -- 坐骑 马 + HORSE_EQUIP = 5, -- 马具 + BOOK = 6, -- 书籍 + WEAPON = 7, -- 武器 + EQUIPMENT_SIGN = 8, -- 装备兑换牌 + EQUIPMENT = 9, -- 散件装备 + MATERIAL = 10, -- 材料 + ZIBABA = 11, -- 小铁 + ENCHANT_ITEM = 12, -- 附魔 + TASK_ITEM = 13, -- 任务道具 + OTHER = 14, + GARBAGE = 15, -- 垃圾 +} +local function GetItemDataType(data) + -- 外观 披风 礼盒 + if data.item.nGenre == ITEM_GENRE.COIN_SHOP_QUANTITY_LIMIT_ITEM then + return 'COIN_SHOP' + end + if data.item.nGenre == ITEM_GENRE.EQUIPMENT and ( + data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.L_SHOULDER_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.R_SHOULDER_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.BACK_CLOAK_EXTEND + ) then + return 'OUTLOOK' + end + -- 挂件 + if data.item.nGenre == ITEM_GENRE.EQUIPMENT and ( + data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.WAIST_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.BACK_EXTEND + or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.FACE_EXTEND + ) then + return 'PENDANT' + end + -- 宠物 + if (data.item.nGenre == ITEM_GENRE.CUB) + or (data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.PET) then + return 'PET' + end + -- 坐骑 马 + if (data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.HORSE) then + return 'HORSE' + end + -- 马具 + if (data.item.nGenre == ITEM_GENRE.EQUIPMENT and data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.HORSE_EQUIP) then + return 'HORSE_EQUIP' + end + -- 书籍 + if (data.item.nGenre == ITEM_GENRE.BOOK) then + return 'BOOK' + end + -- 武器 + if data.item.nGenre == ITEM_GENRE.EQUIPMENT + and (data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.MELEE_WEAPON or data.item.nSub == X.CONSTANT.EQUIPMENT_SUB.RANGE_WEAPON) then + return 'WEAPON' + end + -- 装备兑换牌 + if (data.item.nGenre == ITEM_GENRE.MATERIAL and data.item.nSub == 6) then -- TODO: 枚举? + return 'EQUIPMENT_SIGN' + end + -- 散件装备 + if data.item.nGenre == ITEM_GENRE.EQUIPMENT then -- TODO: 枚举? + return 'EQUIPMENT' + end + -- 材料 + if data.item.nGenre == ITEM_GENRE.MATERIAL then + -- 小铁 + if data.item.nQuality == GKP_LOOT_ZIBABA_QUALITY and X.GetItemIconByUIID(data.item.nUiId) == GKP_LOOT_ZIBABA_ICON then + return 'ZIBABA' + end + -- 材料 + return 'MATERIAL' + end + -- 附魔 + if data.item.nGenre == ITEM_GENRE.ENCHANT_ITEM then + return 'ENCHANT_ITEM' + end + -- 任务道具 + if data.item.nGenre == ITEM_GENRE.TASK_ITEM then + return 'TASK_ITEM' + end + -- 垃圾 + if data.item.nQuality == 0 then + return 'GARBAGE' + end + return 'OTHER' +end + +function D.GetItemData(dwDoodadID, nItemIndex) + local tDoodadInfo = D.tDoodadInfo[dwDoodadID] + local item, bNeedRoll, bDist, bBidding = X.GetDoodadLootItem(dwDoodadID, nItemIndex) + if item then + -- itemData + local data = { + dwDoodadID = dwDoodadID , + nItemIndex = nItemIndex , + szDoodadName = tDoodadInfo and tDoodadInfo.szName or '', + item = item , + szName = X.GetItemNameByItem(item), + dwID = item.dwID , + dwTabType = item.dwTabType, + dwIndex = item.dwIndex , + nUiId = item.nUiId , + nGenre = item.nGenre , + nSub = item.nSub , + nQuality = item.nQuality , + bNeedRoll = bNeedRoll , + bDist = bDist , + bBidding = bBidding , + nStackNum = item.bCanStack and item.nStackNum or 1, + bSpecial = item.nQuality == GKP_LOOT_HUANGBABA_QUALITY + and X.GetItemIconByUIID(item.nUiId) == GKP_LOOT_HUANGBABA_ICON, + } + if DEBUG_LOOT then + data.bDist = true -- !!! Debug + end + if item.nGenre == ITEM_GENRE.BOOK then + data.nBookID = item.nBookID + end + data.szType = GetItemDataType(data) + data.nWeight = ITEM_DATA_WEIGHT[data.szType] + return data + end +end + +local function LootItemWeightSorter(data1, data2) + return data1.nWeight < data2.nWeight +end + +local function LootItemIndexSorter(data1, data2) + return data1.nItemIndex > data2.nItemIndex +end + +-- 检查物品 +function D.GetDoodadLootInfo(dwDoodadID) + local tDoodadInfo = D.GetDoodadData(dwDoodadID) + local aItemData = {} + local bSpecial = false + local nMoney = X.GetDoodadLootMoney(dwDoodadID) or 0 + local szName = tDoodadInfo and tDoodadInfo.szName or nil + local nLootItemCount = X.GetDoodadLootItemCount(dwDoodadID) or 0 + for i = 1, nLootItemCount do + local data = D.GetItemData(dwDoodadID, i) + if data then + if data.bSpecial then + bSpecial = true + end + table.insert(aItemData, data) + end + end + if O.bSortLoot then + table.sort(aItemData, LootItemWeightSorter) + else + table.sort(aItemData, LootItemIndexSorter) + end + return aItemData, nMoney, szName, bSpecial +end + +function D.ShowSystemLoot() + for _, szName in ipairs({'LootList', 'GoldTeamLootList'}) do + local frame = Station.SearchFrame(szName) + if frame and frame:GetAbsX() == 4096 then + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + end + end +end + +function D.HideSystemLoot() + for _, szName in ipairs({'LootList', 'GoldTeamLootList'}) do + local frame = Station.SearchFrame(szName) + if frame and frame:GetAbsX() ~= 4096 then + frame:SetAbsPos(4096, 4096) + end + -- X.UI.CloseFrame(szName) + end +end + +function D.AutoSetSystemLootVisible() + local team = GetClientTeam() + local bCanBiddingDistribute = team and team.nLootMode == PARTY_LOOT_MODE.BIDDING + and team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE) == X.GetClientPlayerID() + if D.IsEnabled() and not bCanBiddingDistribute then + D.HideSystemLoot() + else + D.ShowSystemLoot() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + nX, nY = nPaddingX, nLFY + ui:Append('Text', { text = _L['GKP Doodad helper'], x = nX, y = nY, font = 27 }) + + nX, nY = nPaddingX + 10, nY + nLH + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Enable MY_GKPLoot'], + checked = O.bOn, + onCheck = function(bChecked) + O.bOn = bChecked + end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Team dungeon'], + checked = O.bInTeamDungeon, + onCheck = function(bChecked) + O.bInTeamDungeon = bChecked + D.OutputEnable() + end, + tip = { + render = _L['Enable in checked map type'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Raid dungeon'], + checked = O.bInRaidDungeon, + onCheck = function(bChecked) + O.bInRaidDungeon = bChecked + D.OutputEnable() + end, + tip = { + render = _L['Enable in checked map type'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Battlefield'], + checked = O.bInBattlefield, + onCheck = function(bChecked) + O.bInBattlefield = bChecked + D.OutputEnable() + end, + tip = { + render = _L['Enable in checked map type'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Other map'], + checked = O.bInOtherMap, + onCheck = function(bChecked) + O.bInOtherMap = bChecked + D.OutputEnable() + end, + tip = { + render = _L['Enable in checked map type'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX, nY = nPaddingX + 10, nY + nLH + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Set Force Color'], + checked = O.bSetColor, + onCheck = function() + O.bSetColor = not O.bSetColor + FireUIEvent('MY_GKP_LOOT_RELOAD') + end, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Show 2nd kungfu fit icon'], + checked = O.bShow2ndKungfuLoot, + onCheck = function() + O.bShow2ndKungfuLoot = not O.bShow2ndKungfuLoot + FireUIEvent('MY_GKP_LOOT_RELOAD') + end, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Sort loot list by weight'], + checked = O.bSortLoot, + onCheck = function() + O.bSortLoot = not O.bSortLoot + FireUIEvent('MY_GKP_LOOT_RELOAD') + end, + autoEnable = function() return O.bOn end, + }):Width() + 10 + + nX, nY = nPaddingX + 10, nY + nLH + + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, + text = _L['Confirm when distribute'], + menuLClick = function() + local t = {} + table.insert(t, { szOption = _L['Category'], bDisable = true }) + for _, szKey in ipairs({ + 'Huangbaba', + 'Book', + 'Pendant', + 'Outlook', + 'Pet', + 'Horse', + 'HorseEquip', + }) do + table.insert(t, { + szOption = _L[szKey], + bCheck = true, + bChecked = O.tConfirm[szKey], + fnAction = function() + O.tConfirm[szKey] = not O.tConfirm[szKey] + O.tConfirm = O.tConfirm + end, + }) + end + table.insert(t, X.CONSTANT.MENU_DIVIDER) + table.insert(t, { szOption = _L['Quality'], bDisable = true }) + for i, s in ipairs({ + [1] = g_tStrings.STR_WHITE, + [2] = g_tStrings.STR_ROLLQUALITY_GREEN, + [3] = g_tStrings.STR_ROLLQUALITY_BLUE, + [4] = g_tStrings.STR_ROLLQUALITY_PURPLE, + [5] = g_tStrings.STR_ROLLQUALITY_NACARAT, + }) do + table.insert(t, { + szOption = _L('Reach %s', s), + rgb = i == -1 and {255, 255, 255} or { GetItemFontColorByQuality(i) }, + bCheck = true, bMCheck = true, + bChecked = i == O.nConfirmQuality, + fnAction = function() + O.nConfirmQuality = i + end, + }) + end + return t + end, + autoEnable = function() return O.bOn end, + }):Width() + 5 + + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, + text = _L['Loot item filter'], + menu = D.GetFilterMenu, + autoEnable = function() return O.bOn end, + }):Width() + 5 + + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, + text = _L['Auto pickup'], + menu = D.GetAutoPickupMenu, + autoEnable = function() return O.bOn end, + }):Width() + 5 + + nLFY = nY + nLH + + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKPLoot', + exports = { + { + preset = 'UIEvent', + fields = { + 'IsEnabled', + 'CanDialog', + 'IsItemDisplay', + 'IsItemAutoPickup', + 'GetMessageBox', + 'GetaPartyMember', + 'GetItemData', + 'GetItemBiddingMenu', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bOn', + 'tAutoPickupQuality', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'CanDialog', + 'IsItemDisplay', + 'IsItemAutoPickup', + }, + root = D, + }, + { + fields = { + 'bOn', + }, + root = O, + }, + }, +} +MY_GKPLoot = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_GKPLoot', function() + if arg0 and arg0 ~= 'MY_GKPLoot.FastLoot' then + return + end + D.UpdateShielded() +end) + +X.RegisterEvent('LOADING_END', 'MY_GKPLoot', function() + D.UpdateShielded() + D.CloseFrame() + D.aDoodadID = {} + D.tDoodadInfo = {} + D.tDoodadClosed = {} + ITEM_CONFIG.bHideFiltered = false + D.InsertSceneLoot() +end) + +X.RegisterInit('MY_GKPLoot', function() + for _, k in ipairs({'tConfirm'}) do + if D[k] then + X.SafeCall(X.Set, O, k, D[k]) + D[k] = nil + end + end + if D.tItemConfig and X.IsTable(D.tItemConfig) then + for k, v in pairs(D.tItemConfig) do + X.SafeCall(X.Set, O, k, v) + end + D.tItemConfig = nil + end + D.bReady = true +end) + +X.RegisterFrameCreate('LootList', 'MY_GKPLoot', function() + HookTableFunc(arg0, 'SetPoint', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'SetRelPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'SetAbsPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'CorrectPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) +end) + +X.RegisterFrameCreate('GoldTeamLootList', 'MY_GKPLoot', function() + HookTableFunc(arg0, 'SetPoint', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'SetRelPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'SetAbsPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) + HookTableFunc(arg0, 'CorrectPos', D.AutoSetSystemLootVisible, { bAfterOrigin = true }) +end) + +X.RegisterEvent('TEAM_AUTHORITY_CHANGED', 'MY_GKPLoot', D.AutoSetSystemLootVisible) + +-- 摸箱子 +X.RegisterEvent('OPEN_DOODAD', function() + if not D.IsEnabled() then + return + end + if arg1 ~= X.GetClientPlayerID() then + return + end + local nM = X.GetDoodadLootMoney(arg0) or 0 + if nM > 0 then + LootMoney(arg0) + PlaySound(SOUND.UI_SOUND, g_sound.PickupMoney) + end + local data = D.GetDoodadLootInfo(arg0) + if #data == 0 then + return D.DrawLootList(arg0, true) + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKPLoot', 'Open Doodad: ' .. arg0, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.tDoodadClosed[arg0] = nil + D.InsertLootList(arg0) + D.HideSystemLoot() +end) + +-- 刷新箱子 +X.RegisterEvent('SYNC_LOOT_LIST', function() + if not D.IsEnabled() then + return + end + local frame = D.GetFrame() + local wnd = D.GetDoodadWnd(frame, arg0) + if not wnd then + if X.IsInDungeonMap() then + if X.IsRestricted('MY_GKPLoot.ForceLootInsideDungeon') then + return + end + else + if X.IsRestricted('MY_GKPLoot.ForceLootOutsideDungeon') then + return + end + end + end + if D.tDoodadClosed[arg0] then + return + end + D.InsertLootList(arg0) +end) + +X.RegisterEvent('MY_GKP_LOOT_BOSS', function() + if not arg0 then + MY_GKP_LOOT_BOSS = nil + GKP_LOOT_RECENT = {} + else + local team = GetClientTeam() + if team then + for k, v in ipairs(team.GetTeamMemberList()) do + local info = GetClientTeam().GetMemberInfo(v) + if info.szName == arg0 then + MY_GKP_LOOT_BOSS = v + break + end + end + end + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKPVote.lua b/MY_GKP/src/MY_GKPVote.lua new file mode 100644 index 000000000..5d25c8fc0 --- /dev/null +++ b/MY_GKP/src/MY_GKPVote.lua @@ -0,0 +1,59 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录 发放投票相关 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKPVote' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +-- 工资结算 +local TEAM_VOTE_REQUEST = {} +X.RegisterEvent('TEAM_VOTE_REQUEST', function() + if arg0 == 1 then + TEAM_VOTE_REQUEST = {} + local team = GetClientTeam() + for k, v in ipairs(team.GetTeamMemberList()) do + TEAM_VOTE_REQUEST[v] = false + end + end +end) + +X.RegisterEvent('TEAM_VOTE_RESPOND', function() + if arg0 == 1 and not X.IsEmpty(TEAM_VOTE_REQUEST) then + if arg2 == 1 then + TEAM_VOTE_REQUEST[arg1] = true + end + local team = GetClientTeam() + local num = team.GetTeamSize() + local agree = 0 + for k, v in pairs(TEAM_VOTE_REQUEST) do + if v then + agree = agree + 1 + end + end + X.OutputAnnounceMessage(_L('Team Members: %d, %d agree %d%%', num, agree, agree / num * 100)) + end +end) + +X.RegisterEvent('TEAM_INCOMEMONEY_CHANGE_NOTIFY', function() + local nTotalRaidMoney = GetClientTeam().nInComeMoney + if nTotalRaidMoney and nTotalRaidMoney == 0 then + TEAM_VOTE_REQUEST = {} + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKP_AuctionUI.lua b/MY_GKP/src/MY_GKP_AuctionUI.lua new file mode 100644 index 000000000..afa9bf553 --- /dev/null +++ b/MY_GKP/src/MY_GKP_AuctionUI.lua @@ -0,0 +1,288 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录记账页面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP_AuctionUI' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + GetMoneyCol = MY_GKP.GetMoneyCol, + GetMoneyTipText = MY_GKP.GetMoneyTipText, + GetFormatLink = MY_GKP.GetFormatLink, +} + +function D.Open(ds, tab, szMode) + -- CreateFrame + local szKey = X.IsTable(tab) and tab.key or X.GetUUID() + local ui = X.UI.CreateFrame('MY_GKP_Record#' .. GetStringCRC(szKey), { h = 380, w = 400, text = _L['GKP Golden Team Record'], close = true, focus = true }) + local x, y = 10, 55 + local nAuto = 0 + local dwForceID, item + local bProcessed = false -- 是否已处理 没处理自动设为0价发布 + + if X.IsTable(tab) then + if not X.IsEmpty(tab.dwID) then + item = GetItem(tab.dwID) + end + if not item and tab.dwTabType and tab.dwIndex then + item = GetItemInfo(tab.dwTabType, tab.dwIndex) + end + end + + local hBox = ui:Append('Box', { name = 'Box', x = x + 175, y = y + 40, h = 48, w = 48 }) + local hCheckBox = ui:Append('WndCheckBox', { name = 'WndCheckBox', x = x + 50, y = y + 260, font = 65, text = _L['Equiptment Boss'] }) + local hButton = ui:Append('WndButton', { name = 'Success', x = x + 175, y = y + 260, text = g_tStrings.STR_HOTKEY_SURE, buttonStyle = 'FLAT_LACE_BORDER' }) + ui:Remove(function() + if bProcessed then + return + end + if ui[1].userdata then + ui:Children('#Money'):Text(0) + hButton:Click() + end + end) + + ui:Append('Text', { x = x + 65, y = y + 10, font = 65, text = _L['Keep Account to:'] }) + ui:Append('Text', { x = x + 65, y = y + 90, font = 65, text = _L['Name of the Item:'] }) + ui:Append('Text', { x = x + 65, y = y + 120, font = 65, text = _L['Route of Acquiring:'] }) + ui:Append('Text', { x = x + 65, y = y + 150, font = 65, text = _L['Auction Price:'] }) + + local hPlayer = ui:Append('WndComboBox', { + name = 'PlayerList', + x = x + 140, y = y + 13, text = g_tStrings.PLAYER_NOT_EMPTY, + menu = function() + return MY_GKP.GetTeamMemberMenu(function(v) + local hTeamList = ui:Children('#PlayerList') + hTeamList:Text(v.szName):Color(X.GetForceColor(v.dwForce)) + dwForceID = v.dwForce + end, false, true) + end, + }) + local hSource = ui:Append('WndEditBox', { name = 'Source', x = x + 140, y = y + 121, w = 185, h = 25 }) + local hName = ui:Append('WndAutocomplete', { + name = 'Name', x = x + 140, y = y + 91, w = 185, h = 25, + autocomplete = { + { + 'option', 'beforeSearch', function(text) + local source = {} + for k, v in ipairs(MY_GKP.aSubsidies) do + if v[3] then + table.insert(source, v[1]) + end + end + X.UI(this):Autocomplete('option', 'source', source) + end, + }, + { + 'option', 'afterComplete', function(raw, option, search, text) + if text then + for k, v in ipairs(MY_GKP.aSubsidies) do + if v[1] == text then + ui:Children('#Money'):Text(v[2]) + end + end + ui:Children('#Money'):Focus() + end + end, + }, + }, + onClick = function() + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + else + X.UI(this):Autocomplete('search', '') + end + end, + }) + local hMoney = ui:Append('WndAutocomplete', { + name = 'Money', x = x + 140, y = y + 151, w = 185, h = 25, limit = 8, editType = X.UI.EDIT_TYPE.ASCII, + autocomplete = { + { + 'option', 'beforeSearch', function(text) + local source = {} + if tonumber(text) then + if tonumber(text) < 100 and tonumber(text) > -100 and tonumber(text) ~= 0 then + for k, v in ipairs({2, 3, 4}) do + local szMoney = string.format('%0.'.. v ..'f', text):gsub('%.', '') + table.insert(source, { + text = szMoney, + keyword = text, + display = D.GetMoneyTipText(tonumber(szMoney)), + richtext = true, + }) + end + table.insert(source, { divide = true, keyword = text }) + end + table.insert(source, { + text = text, + keyword = text, + display = D.GetMoneyTipText(tonumber(text)), + richtext = true, + }) + end + X.UI(this):Autocomplete('option', 'source', source) + end, + }, + }, + onChange = function(szText) + local ui = X.UI(this) + if tonumber(szText) or szText == '' or szText == '-' then + this.szText = szText + ui:Color(D.GetMoneyCol(szText)) + else + X.OutputSystemMessage(_L['Please enter numbers']) + ui:Text(this.szText or '') + end + end, + }) + -- set frame + if tab and type(item) == 'userdata' then + hPlayer:Text(tab.szPlayer):Color(X.GetForceColor(tab.dwForceID)) + hName:Text(tab.szName):Enable(false) + hSource:Text(tab.szNpcName):Enable(false) + ui[1].userdata = true + else + hPlayer:Text(g_tStrings.PLAYER_NOT_EMPTY):Color(255, 255, 255) + hSource:Text(_L['Add Manually']):Enable(false) + end + if tab and tab.key then -- 编辑 + hPlayer:Text(tab.szPlayer):Color(X.GetForceColor(tab.dwForceID)) + dwForceID = tab.dwForceID + hName:Text(tab.szName or X.GetItemNameByUIID(tab.nUiId)) + hMoney:Text(tab.nMoney) + hSource:Text(tab.szNpcName) + end + + if tab and tab.nVersion and tab.nUiId and tab.dwTabType and tab.dwIndex and tab.nUiId ~= 0 then + hBox:ItemInfo(tab.nVersion, tab.dwTabType, tab.dwIndex, tab.nBookID or tab.nStackNum) + else + hBox:ItemInfo() + hBox:Icon(582) + end + if nAuto == 0 and tab and not tab.key then -- edit/add killfocus + hMoney:Focus() + elseif nAuto > 0 and tab then + hMoney:Text(nAuto) -- OnEditChanged kill + ui:Focus() + elseif not tab then + hName:Focus() + end + hButton:Click(function() + bProcessed = true + if IsCtrlKeyDown() and IsShiftKeyDown() and IsAltKeyDown() then + return ui:Remove() + end + local tab = tab or { + nUiId = 0, + dwTabType = 0, + dwDoodadID = 0, + nQuality = 1, + nVersion = 0, + dwIndex = 0, + nTime = GetCurrentTime(), + dwForceID = dwForceID, + szName = hName:Text(), + } + local nMoney = tonumber(hMoney:Text()) or 0 + local szPlayer = hPlayer:Text() + if hName:Text() == '' then + return X.Alert(_L['Please entry the name of the item']) + end + if szPlayer == g_tStrings.PLAYER_NOT_EMPTY then + return X.Alert(_L['Select a member who is in charge of account and put money in his account.']) + end + tab.key = szKey + tab.szNpcName = hSource:Text() + tab.nMoney = nMoney + tab.szPlayer = szPlayer + tab.dwForceID = dwForceID or tab.dwForceID or 0 + if tab and type(item) == 'userdata' and szMode ~= 'EDIT' then + if X.IsClientPlayerTeamDistributor() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock, otherwise gkp will not able to sync to teammate.']) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + D.GetFormatLink(tab), + D.GetFormatLink(' '.. nMoney .. g_tStrings.STR_GOLD), + D.GetFormatLink(_L[' Distribute to ']), + D.GetFormatLink(tab.szPlayer, true) + }) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {'add', tab}, true) + end + elseif tab and szMode == 'EDIT' then + tab.szName = hName:Text() + tab.dwForceID = dwForceID or tab.dwForceID or 0 + tab.bEdit = true + if X.IsClientPlayerTeamDistributor() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock, otherwise gkp will not able to sync to teammate.']) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + D.GetFormatLink(tab.szPlayer, true), + D.GetFormatLink(' '.. tab.szName), + D.GetFormatLink(' '.. nMoney ..g_tStrings.STR_GOLD), + D.GetFormatLink(_L['Make changes to the record.']), + }) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {'edit', tab}, true) + end + else + if X.IsClientPlayerTeamDistributor() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock, otherwise gkp will not able to sync to teammate.']) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + D.GetFormatLink(tab.szName), + D.GetFormatLink(' '.. nMoney ..g_tStrings.STR_GOLD), + D.GetFormatLink(_L['Manually make record to']), + D.GetFormatLink(tab.szPlayer, true) + }) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {'add', tab}, true) + end + end + if ui:Children('#WndCheckBox'):Check() then + FireUIEvent('MY_GKP_LOOT_BOSS', tab.szPlayer) + end + ds:SetAuctionRec(tab) + ui:Remove() + end) + if szMode == 'SKIP' then + hButton:Click() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKP_AuctionUI', + exports = { + { + fields = { + Open = D.Open, + }, + }, + }, +} +MY_GKP_AuctionUI = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKP_DS.lua b/MY_GKP/src/MY_GKP_DS.lua new file mode 100644 index 000000000..fcf36713e --- /dev/null +++ b/MY_GKP/src/MY_GKP_DS.lua @@ -0,0 +1,445 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录数据源类 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP_DS' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local DS = class() +local DS_CACHE = setmetatable({}, { __mode = 'v' }) + +local function GetClearData() + return { + GKP_Map = '', + GKP_Time = 0, + GKP_Record = {}, + GKP_Account = {}, + } +end + +local function GetCache(DATA) + local CACHE = { + GKP_Record_Index = {}, + GKP_Account_Index = {}, + } + for i, rec in ipairs(DATA.GKP_Record) do + CACHE.GKP_Record_Index[rec.key] = i + end + for i, rec in ipairs(DATA.GKP_Account) do + CACHE.GKP_Account_Index[rec.key] = i + end + return CACHE +end + +function DS:ctor(szFilePath) + local t = X.LoadLUAData(szFilePath) + if t then + self.DATA = { + GKP_Map = t.GKP_Map or '', + GKP_Time = t.GKP_Time or 0, + GKP_Record = t.GKP_Record or {}, + GKP_Account = t.GKP_Account or {}, + } + self.CACHE = GetCache(self.DATA) + end + self.szFilePath = szFilePath +end + +function DS:IsDataInited() + return self.DATA and true or false +end + +function DS:InitData() + if not self.DATA then + self.DATA = GetClearData() + self.CACHE = GetCache(self.DATA) + end +end + +function DS:ClearData() + self.DATA = GetClearData() + self.CACHE = GetCache(self.DATA) + self:DelayFireUpdate('ALL') +end + +function DS:IsEmpty() + return #self.DATA.GKP_Record == 0 and #self.DATA.GKP_Account == 0 +end + +-- 数据存盘 +function DS:SaveData() + X.SaveLUAData(self:GetFilePath(), { + GKP_Map = self.DATA.GKP_Map, + GKP_Time = self.DATA.GKP_Time, + GKP_Record = self.DATA.GKP_Record, + GKP_Account = self.DATA.GKP_Account, + }) +end + +-- 下一帧存盘 +function DS:DelaySaveData() + X.DelayCall('MY_GKP_DS__DelaySaveData#' .. self:GetFilePath(), function() + self:SaveData() + end) +end + +-- 下一帧发送更新事件 +function DS:DelayFireUpdate(szType) + X.DelayCall('MY_GKP_DS__DelayFireUpdate#' .. self:GetFilePath() .. '#' .. szType, function() + FireUIEvent('MY_GKP_DATA_UPDATE', self:GetFilePath(), szType) + end) +end + +-- 获取数据路径(可作为事件标识符) +function DS:GetFilePath() + return self.szFilePath +end + +-- 设置时间 +function DS:SetTime(nTime) + if X.IsNumber(nTime) and nTime ~= self.DATA.GKP_Time then + self.DATA.GKP_Time = nTime + self:DelaySaveData() + self:DelayFireUpdate('TIME') + end +end + +-- 获取时间 +function DS:GetTime() + return self.DATA.GKP_Time +end + +-- 设置地图 +function DS:SetMap(szMap) + if X.IsString(szMap) and szMap ~= self.DATA.GKP_Map then + self.DATA.GKP_Map = szMap + self:DelaySaveData() + self:DelayFireUpdate('MAP') + end +end + +-- 获取地图 +function DS:GetMap() + return self.DATA.GKP_Map +end + +-- 设置、修改拍卖记录 +function DS:SetAuctionRec(rec) + local rec = X.Clone(rec) + if not rec.key then + rec.key = X.GetUUID() + end + local nIndex = self.CACHE.GKP_Record_Index[rec.key] + or (#self.DATA.GKP_Record + 1) + self.DATA.GKP_Record[nIndex] = rec + self.CACHE.GKP_Record_Index[rec.key] = nIndex + self:DelaySaveData() + self:DelayFireUpdate('AUCTION') +end + +-- 获取指定key的拍卖记录 +function DS:GetAuctionRec(szKey) + local nIndex = self.CACHE.GKP_Record_Index[szKey] + if nIndex then + return self.DATA.GKP_Record[nIndex] + end +end + +-- 替换拍卖记录 +function DS:SetAuctionList(aList) + local aList = X.Clone(aList) + for _, rec in ipairs(aList) do + if not rec.key then + rec.key = X.GetUUID() + end + end + self.DATA.GKP_Record = aList + self.CACHE = GetCache(self.DATA) + self:DelaySaveData() + self:DelayFireUpdate('AUCTION') +end + +-- 获取每个人拍卖总额 +function DS:GetAuctionPlayerSum(bAccurate) + -- 计算每个人的非系统金团欠款记录 + local tArrears = {} + for _, v in ipairs(self.DATA.GKP_Record) do + if not v.bDelete and not v.bSystem and v.nMoney > 0 then + if not tArrears[v.szPlayer] then + tArrears[v.szPlayer] = 0 + end + tArrears[v.szPlayer] = tArrears[v.szPlayer] + v.nMoney + end + end + -- 计算拍卖收入 + local tIncome, tSubsidy = {}, {} -- 正数是拍装备罚款金额 负数是宴席补贴钱金额 + for _, v in ipairs(self.DATA.GKP_Record) do + if not v.bDelete then + local nMoney = tonumber(v.nMoney) + if nMoney > 0 then + if v.bSystem and v.dwIndex == 0 and tArrears[v.szPlayer] then -- 系统金团同步来的追加 优先抵冲分配者记录欠款投币 + local nOffset = math.min(tArrears[v.szPlayer], nMoney) + nMoney = nMoney - nOffset + tArrears[v.szPlayer] = tArrears[v.szPlayer] - nOffset + end + if not tIncome[v.szPlayer] then + tIncome[v.szPlayer] = 0 + end + tIncome[v.szPlayer] = tIncome[v.szPlayer] + nMoney + else + if not tSubsidy[v.szPlayer] then + tSubsidy[v.szPlayer] = 0 + end + tSubsidy[v.szPlayer] = tSubsidy[v.szPlayer] + nMoney + end + end + end + if bAccurate then + local tAccurate = {} + for szPlayer, nMoney in pairs(tIncome) do + if not tAccurate[szPlayer] then + tAccurate[szPlayer] = 0 + end + tAccurate[szPlayer] = tAccurate[szPlayer] + nMoney + end + for szPlayer, nMoney in pairs(tSubsidy) do + if not tAccurate[szPlayer] then + tAccurate[szPlayer] = 0 + end + tAccurate[szPlayer] = tAccurate[szPlayer] + nMoney + end + return tAccurate + else + return tIncome, tSubsidy + end +end + +-- 获取拍卖总额 +function DS:GetAuctionSum(bAccurate) + if bAccurate then + local nAccurate = 0 + local tAccurate = self:GetAuctionPlayerSum(bAccurate) + for _, nMoney in pairs(tAccurate) do + nAccurate = nAccurate + nMoney + end + return nAccurate + else + local nIncome, nSubsidy = 0, 0 + local tIncome, tSubsidy = self:GetAuctionPlayerSum(bAccurate) + for _, nMoney in pairs(tIncome) do + nIncome = nIncome + nMoney + end + for _, nMoney in pairs(tSubsidy) do + nSubsidy = nSubsidy + nMoney + end + return nIncome, nSubsidy + end +end + +-- 获取拍卖记录(排序) +function DS:GetAuctionList(szKey, szSort) + if not szKey then + szKey = 'nTime' + end + if not szSort then + szSort = 'desc' + end + local aList = {} + for _, v in ipairs(self.DATA.GKP_Record) do + table.insert(aList, v) + end + table.sort(aList, function(a, b) + if a[szKey] and b[szKey] then + if szSort == 'asc' then + if a[szKey] ~= b[szKey] then + return a[szKey] < b[szKey] + elseif a.key and b.key then + return a.key < b.key + else + return a.nTime < b.nTime + end + else + if a[szKey] ~= b[szKey] then + return a[szKey] > b[szKey] + elseif a.key and b.key then + return a.key > b.key + else + return a.nTime > b.nTime + end + end + else + return false + end + end) + return aList +end + +-- 设置、修改收钱记录 +function DS:SetPaymentRec(rec) + local rec = X.Clone(rec) + if not rec.key then + rec.key = X.GetUUID() + end + local nIndex = self.CACHE.GKP_Account_Index[rec.key] + or (#self.DATA.GKP_Account + 1) + self.DATA.GKP_Account[nIndex] = rec + self.CACHE.GKP_Account_Index[rec.key] = nIndex + self:DelaySaveData() + self:DelayFireUpdate('PAYMENT') +end + +-- 获取指定key的收钱记录 +function DS:GetPaymentRec(szKey) + local nIndex = self.CACHE.GKP_Account_Index[szKey] + if nIndex then + return self.DATA.GKP_Account[nIndex] + end +end + +-- 替换收钱记录 +function DS:SetPaymentList(aList) + local aList = X.Clone(aList) + for _, rec in ipairs(aList) do + if not rec.key then + rec.key = X.GetUUID() + end + end + self.DATA.GKP_Account = aList + self.CACHE = GetCache(self.DATA) + self:DelaySaveData() + self:DelayFireUpdate('PAYMENT') +end + +-- 获取收钱记录列表(排序) +function DS:GetPaymentList(szKey, szSort) + if not szKey then + szKey = 'nTime' + end + if not szSort then + szSort = 'desc' + end + local aList = {} + for _, v in ipairs(self.DATA.GKP_Account) do + table.insert(aList, v) + end + table.sort(aList, function(a, b) + if a[szKey] and b[szKey] then + if szSort == 'asc' then + if a[szKey] ~= b[szKey] then + return a[szKey] < b[szKey] + elseif a.key and b.key then + return a.key < b.key + else + return a.nTime < b.nTime + end + else + if a[szKey] ~= b[szKey] then + return a[szKey] > b[szKey] + elseif a.key and b.key then + return a.key > b.key + else + return a.nTime > b.nTime + end + end + else + return false + end + end) + return aList +end + +-- 获取每个角色收钱总额 +function DS:GetPaymentPlayerSum(bAccurate) + local tIncome, tOutcome = {}, {} + for _, v in ipairs(self.DATA.GKP_Account) do + if not v.bDelete then + local nMoney = tonumber(v.nGold) + if nMoney > 0 then + if not tIncome[v.szPlayer] then + tIncome[v.szPlayer] = 0 + end + tIncome[v.szPlayer] = tIncome[v.szPlayer] + v.nGold + else + if not tOutcome[v.szPlayer] then + tOutcome[v.szPlayer] = 0 + end + tOutcome[v.szPlayer] = tOutcome[v.szPlayer] + v.nGold + end + end + end + if bAccurate then + local tAccurate = {} + for szPlayer, nMoney in pairs(tIncome) do + if not tAccurate[szPlayer] then + tAccurate[szPlayer] = 0 + end + tAccurate[szPlayer] = tAccurate[szPlayer] + nMoney + end + for szPlayer, nMoney in pairs(tOutcome) do + if not tAccurate[szPlayer] then + tAccurate[szPlayer] = 0 + end + tAccurate[szPlayer] = tAccurate[szPlayer] + nMoney + end + return tAccurate + else + return tIncome, tOutcome + end +end + +-- 获取收钱总额 +function DS:GetPaymentSum(bAccurate) + if bAccurate then + local nAccurate = 0 + local tAccurate = self:GetPaymentPlayerSum(bAccurate) + for _, nMoney in pairs(tAccurate) do + nAccurate = nAccurate + nMoney + end + return nAccurate + else + local nIncome, nOutcome = 0, 0 + local tIncome, tOutcome = self:GetPaymentPlayerSum(bAccurate) + for _, nMoney in pairs(tIncome) do + nIncome = nIncome + nMoney + end + for _, nMoney in pairs(tOutcome) do + nOutcome = nOutcome + nMoney + end + return nIncome, nOutcome + end +end + +-- 数据操作对象获取入口 +function MY_GKP_DS(szFilePath, bCreate) + szFilePath = szFilePath:lower():gsub('/', '\\') + if not X.StringFindW(szFilePath:sub(-7):lower(), '.jx3dat') then + szFilePath = szFilePath .. '.jx3dat' + end + if not DS_CACHE[szFilePath] then + DS_CACHE[szFilePath] = DS.new(szFilePath) + end + local ds = DS_CACHE[szFilePath] + if not ds:IsDataInited() then + if not bCreate then + return + end + ds:InitData() + end + return ds +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKP_MI.lua b/MY_GKP/src/MY_GKP_MI.lua new file mode 100644 index 000000000..91ddd2841 --- /dev/null +++ b/MY_GKP/src/MY_GKP_MI.lua @@ -0,0 +1,634 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录主数据源实例化逻辑 (Main Instance) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP_MI' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + Sysmsg = MY_GKP.OutputSystemMessage, + GetTimeString = MY_GKP.GetTimeString, + GetMoneyTipText = MY_GKP.GetMoneyTipText, + GetFormatLink = MY_GKP.GetFormatLink, +} +local O = { + ds = nil, + tSyncQueue = {}, + bSync = {}, + nSyncLen = 0, +} +local DS_ROOT = {'userdata/gkp/', X.PATH_TYPE.ROLE} +local DS_PATH = {'userdata/gkp/current.gkp', X.PATH_TYPE.ROLE} + +function D.Init() + if O.ds then + return + end + O.ds = MY_GKP_DS(X.FormatPath(DS_PATH), true) +end + +function D.GetDS() + D.Init() + return O.ds +end + +function D.NewDS(bSilent) + local ds = D.GetDS() + if not ds:IsEmpty() then + if not X.IsEmpty(ds:GetTime()) and not X.IsEmpty(ds:GetMap()) then + local szRoot = X.FormatPath(DS_ROOT) + local i, szNewPath = 0 + repeat + szNewPath = szRoot + .. X.FormatTime(ds:GetTime(), '%yyyy-%MM-%dd-%hh-%mm-%ss') + .. (i == 0 and '' or ('-' .. i)) + .. '_' .. ds:GetMap() + .. '.gkp.jx3dat' + i = i + 1 + until not IsLocalFileExist(X.FormatPath(szNewPath)) + local dsNew = MY_GKP_DS(szNewPath, true) + dsNew:SetTime(ds:GetTime()) + dsNew:SetMap(ds:GetMap()) + dsNew:SetAuctionList(ds:GetAuctionList()) + dsNew:SetPaymentList(ds:GetPaymentList()) + end + ds:ClearData() + end + D.UpdateDSMeta() + if not bSilent then + X.Alert(_L['Records are wiped']) + end + FireUIEvent('MY_GKP_LOOT_BOSS') +end + +function D.UpdateDSMeta() + local ds = D.GetDS() + local me = X.GetClientPlayer() + ds:SetTime(GetCurrentTime()) + ds:SetMap(me and Table_GetMapName(me.GetMapID()) or '') +end + +function D.NewAuction(tab, bSkipPanel) + local ds = D.GetDS() + if MY_GKP.bOn then + MY_GKP_AuctionUI.Open(ds, tab, bSkipPanel and 'SKIP' or '') + else -- 关闭的情况所有东西全部绕过 + if not tab.nMoney then + tab.nMoney = 0 + end + ds:SetAuctionRec(tab) + end +end + +function D.SyncSend(dwID, bSilent) + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + if not bSilent then + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock, otherwise gkp will not able to sync to teammate.']) + end + return + end + local ds = D.GetDS() + local tab = { + GKP_Record = ds:GetAuctionList(), + GKP_Account = ds:GetPaymentList(), + } + -- 密聊频道限制了字数 发起来太慢了 + local szKey = X.GetUUID():sub(1, 8) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP_SYNC_START', {dwID, szKey}) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP_SYNC_CONTENT_' .. szKey, {dwID, tab}) +end + +X.RegisterInit('MY_GKP_MI', function() + D.Init() +end) + +X.RegisterBgMsg('MY_GKP_SYNC_START', function(_, aData, nChannel, dwID, szName, bIsSelf) + local dwID, szKey = aData[1], aData[2] + if dwID == X.GetClientPlayerID() or dwID == 0 then + X.RegisterBgMsg('MY_GKP_SYNC_CONTENT_' .. szKey, szKey, function(_, aData, nChannel, dwID, szName, bIsSelf) + local dwID, tab = aData[1], aData[2] + if dwID == X.GetClientPlayerID() or dwID == 0 then + X.OutputAnnounceMessage(_L['Sychoronization Complete']) + if tab then + X.Confirm(_L('Data Sharing Finished, you have one last chance to confirm wheather cover the current data with [%s]\'s data or not? \n data of team bidding: %s\n transation data: %s', szName, #tab.GKP_Record, #tab.GKP_Account), function() + local ds = D.GetDS() + ds:SetAuctionList(tab.GKP_Record) + ds:SetPaymentList(tab.GKP_Account) + end) + else + D.OutputSystemMessage(_L['Abnormal with Data Sharing, Please contact and make feed back with the writer.']) + end + end + X.RegisterBgMsg('MY_GKP_SYNC_CONTENT_' .. szKey, szKey, false) + end, function(szMsgID, nSegCount, nSegRecv, nSegIndex, nChannel, dwID, szName, bIsSelf) + local fPercent = nSegRecv / nSegCount + X.OutputAnnounceMessage(_L('Sychoronizing data please wait %d%% loaded.', fPercent * 100)) + end) + end +end) + + +X.RegisterBgMsg('MY_GKP', function(_, data, nChannel, dwID, szName, bIsSelf) + local ds = D.GetDS() + local me = X.GetClientPlayer() + local team = GetClientTeam() + if team then + if not bIsSelf then + if data[1] == 'GKP_Sync' and data[2] == me.szName then + D.SyncSend(dwID, true) + elseif (data[1] == 'del' or data[1] == 'edit' or data[1] == 'add') and MY_GKP.bAutoSync then + local tab = data[2] + tab.bSync = true + ds:SetAuctionRec(tab) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKP', '#MY_GKP# Sync Success', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + end + if data[1] == 'GKP_CONSUMPTION' or data[1] == 'GKP_DEBT' then + local szFrameName = data[1] == 'GKP_CONSUMPTION' and 'MY_GKP_Consumption' or 'MY_GKP_Debt' + if data[2] == 'BEGIN' then + X.UI.CloseFrame(szFrameName) + local ui = X.UI.CreateFrame(szFrameName, { w = 800, h = 400, text = _L['GKP Golden Team Record'], close = true, anchor = 'CENTER' }) + local x, y = 20, 50 + local szCaption = data[1] == 'GKP_CONSUMPTION' and _L['--- Consumption ---'] or _L['Information on Debt'] + ui:Append('Text', { x = x, y = y, w = 760, h = 30, text = szCaption, alignHorizontal = 1, font = 236, color = { 255, 255, 0 } }) + ui:Append('WndButton', { name = 'ScreenShot', x = x + 590, y = y, text = _L['Print Ticket'], buttonStyle = 'FLAT_LACE_BORDER' }):Toggle(false):Click(function() + local scale = Station.GetUIScale() + local left, top = ui:Pos() + local width, height = ui:Size() + local right, bottom = left + width, top + height + local btn = this + local path = GetRootPath() .. string.format('\\ScreenShot\\GKP_Ticket_%s.png', FormatTime('%Y-%m-%d_%H.%M.%S', GetCurrentTime())) + btn:Hide() + X.DelayCall(function() + ScreenShot(path, 100, scale * left, scale * top, scale * right, scale * bottom) + X.DelayCall(function() + X.Alert(_L('Shot screen succeed, file saved as %s .', path)) + btn:Show() + end) + end, 50) + end) + ui:Append('Text', { w = 120, h = 30, x = x + 40, y = y + 35, text = _L('Operator:%s', szName), font = 41 }) + ui:Append('Text', { w = 720, h = 30, x = x, alignHorizontal = 2, y = y + 35, text = _L('Print Time:%s', D.GetTimeString(GetCurrentTime())), font = 41 }) + ui[1].key = data[3] + end + if data[2] == 'RECORD' then + if data[4] == me.szName and tonumber(data[5]) and tonumber(data[5]) < 0 then + X.OutputWhisperMessage(data[4] .. g_tStrings.STR_COLON .. data[5] .. g_tStrings.STR_GOLD, _L['MY_GKP']) + end + local frm = Station.SearchFrame(szFrameName) + if frm and frm.key == data[3] then + if not frm.n then + frm.n = 0 + end + if not frm.items then + frm.items = {} + end + for k, v in ipairs(data[7]) do + table.insert(frm.items, v) + end + local n = frm.n + local ui = X.UI(frm) + local x, y = 20, 50 + if n % 2 == 0 then + ui:Append('Image', { w = 760, h = 30, x = x, y = y + 70 + 30 * n, image = 'ui/Image/button/ShopButton.UITex', imageFrame = 75 }) + end + ui:Append('Image', { w = 28, h = 28, x = x + 30, y = y + 71 + 30 * n }):Image(GetForceImage(data[6])) + ui:Append('Text', { w = 140, h = 30, x = x + 60, y = y + 70 + 30 * n, text = data[4], color = { X.GetForceColor(data[6]) } }) + local handle = ui:Append('Handle', { w = 130, h = 20, x = x + 200, y = y + 70 + 30 * n, handleStyle = 3 })[1] + handle:AppendItemFromString(D.GetMoneyTipText(tonumber(data[5]))) + handle:FormatAllItemPos() + for k, v in ipairs(data[7]) do + if k > 12 then + ui:Append('Text', { x = x + 290 + k * 32 + 5, y = y + 71 + 30 * n, w = 28, h = 28, text = '.....', font = 23 }) + break + end + local hBox = ui:Append('Box', { x = x + 290 + k * 32, y = y + 71 + 30 * n, w = 28, h = 28, alpha = v.bDelete and 60 }) + if v[1] == 'M' then + hBox:Icon(582):Hover(function(bHover) + if bHover then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(v[2] .. g_tStrings.STR_TALK_HEAD_SAY1, 136) .. D.GetMoneyTipText(v[3]), 250, { x, y, w, h }) + else + HideTip() + end + end) + else + hBox:ItemInfo(X.ENVIRONMENT.GAME_VERSION, v[1], v[2], v[3]) + end + end + if frm.n > 5 then + ui:Size(800, 30 * frm.n + 250):Anchor('CENTER') + end + frm.n = frm.n + 1 + end + end + if data[2] == 'FINISH' then + local frm = Station.SearchFrame(szFrameName) + if frm and frm.key == data[3] then + if data[1] == 'GKP_CONSUMPTION' then + local ui = X.UI(frm) + local x, y = 20, 50 + local n = frm.n or 0 + local nMoney = tonumber(data[4]) or 0 + local handle = ui:Append('Handle', { w = 230, h = 20, x = x + 30, y = y + 70 + 30 * n + 5, handleStyle = 3 })[1] + handle:AppendItemFromString(GetFormatText(_L['Total Auction:'], 41) .. D.GetMoneyTipText(nMoney)) + handle:FormatAllItemPos() + if X.IsClientPlayerTeamDistributor() and X.IS_REMAKE then + ui:Append('WndButton', { + w = 91, h = 26, x = x + 620, y = y + 70 + 30 * n + 5, text = _L['salary'], + buttonStyle = 'SKEUOMORPHISM', + onClick = function() + X.Confirm(_L['Confirm?'], function() + MY_GKP.Bidding(nMoney) + end) + end, + }) + end + local nTime = tonumber(data[5]) or 0 + if nTime > 0 then + ui:Append('Text', { w = 725, h = 30, x = x + 0, y = y + 70 + 30 * n + 5, text = _L('Spend time approx %d:%d', nTime / 3600, nTime % 3600 / 60), alignHorizontal = 1 }) + end + X.UI(frm):Children('#ScreenShot'):Toggle(true) + if n >= 4 and data[6] then + local nGKPLevel = data[6] + local aGKPLevelFrame = { + 1, -- 黑出翔 + 0, -- 背锅 + 2, -- 脸帅 + 6, -- 自称小红手 + 3, -- 特别红 + 5, -- 玄晶专用 + } + local nFrame = aGKPLevelFrame[math.min(#aGKPLevelFrame, math.max(1, nGKPLevel))] + local nImgW, nImgH = 150, 150 + local nCenterX, nCenterY = x + 590 + nImgW / 2, y + n * 30 - 30 + nImgH / 2 + local nInitAlpha, nDistAlpha = 180, 60 + local img = ui:Append('Image', { + x = 0, y = 0, w = 0, h = 0, alpha = nInitAlpha, + image = X.PACKET_INFO.ROOT .. 'MY_GKP/img/GKPSeal.uitex', imageFrame = nFrame, + })[1] + local nStartTick = GetTime() + local SCALE_ANIMATE_TIME = 200 + local IDLE_ANIMATE_TIME = 1000 + local ALPHA_ANIMATE_TIME = 500 + X.RenderCall(function() + if not X.IsElement(img) then + return 0 + end + local nTime = GetTime() - nStartTick + local fScale = math.max(1, (1 - nTime / SCALE_ANIMATE_TIME) * 3 + 1) + img:SetSize(nImgW * fScale, nImgH * fScale) + img:SetRelPos(nCenterX - nImgW * fScale / 2, nCenterY - nImgH * fScale / 2) + img:SetAbsPos(img:GetParent():GetAbsX() + img:GetRelX(), img:GetParent():GetAbsY() + img:GetRelY()) + if nTime >= SCALE_ANIMATE_TIME + IDLE_ANIMATE_TIME then + img:SetAlpha(nDistAlpha + math.max(0, (1 - (nTime - SCALE_ANIMATE_TIME - IDLE_ANIMATE_TIME) / ALPHA_ANIMATE_TIME)) * (nInitAlpha - nDistAlpha)) + if nTime >= SCALE_ANIMATE_TIME + IDLE_ANIMATE_TIME + ALPHA_ANIMATE_TIME then + return 0 + end + end + end) + -- JH.Animate(img, 200):Scale(4) + end + frm.done = true + elseif data[1] == 'GKP_DEBT' and not frm:IsVisible() then + X.UI.CloseFrame(frm) + end + end + FireUIEvent('MY_GKP_SEND_FINISH') + end + end + end +end) + +X.RegisterEvent('ON_BG_CHANNEL_MSG', 'LR_GKP', function() + local szMsgID, nChannel, dwID, szName, data, bSelf = arg0, arg1, arg2, arg3, arg4, arg2 == X.GetClientPlayerID() + if szMsgID ~= 'LR_GKP' or bSelf then + return + end + if (data[1] == 'SYNC' or data[1] == 'DEL') and MY_GKP.bAutoSync then + local ds = D.GetDS() + local rawData = data[2] + local tab = { + bSync = true, + bEdit = true, + bDelete = data[1] == 'DEL', + szPlayer = rawData.szPurchaserName, + dwIndex = rawData.dwIndex, + dwTabType = rawData.dwTabType, + nQuality = rawData.nQuality, + nVersion = rawData.nVersion or 0, + nGenre = rawData.nGenre, + nTime = rawData.nCreateTime, + nMoney = rawData.nGold, + key = rawData.hash, + dwForceID = rawData.dwPurchaserForceID, + szName = rawData.szName, + dwDoodadID = rawData.dwDoodadID or 0, + nUiId = rawData.nUiId or 0, + szNpcName = rawData.szSourceName, + nBookID = rawData.nGenre == ITEM_GENRE.BOOK + and rawData.nBookID and rawData.nBookID ~= 0 + and rawData.nBookID or nil, + nStackNum = rawData.nStackNum, + } + ds:SetAuctionRec(tab) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_GKP', '#MY_GKP# Sync From LR Success', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end +end) + +X.RegisterEvent('LOADING_END',function() + local ds = D.GetDS() + if not ds:IsEmpty() then + if X.IsInDungeonMap() and MY_GKP.bAlertMessage then + X.Confirm(_L['Do you want to wipe the previous data when you enter the dungeon\'s map?'], D.NewDS) + end + else + D.UpdateDSMeta() + end +end) + +----------------------------------------------------------------------> +-- 金钱记录 +----------------------------------------------------------------------< +D.tTradingInfo = {} + +function D.MoneyUpdate(nGold, nSilver, nCopper) + if math.abs(nGold) < 1 then -- 不足1金不记录 + return + end + local szPeerName = 'System' + if D.tTradingInfo and D.tTradingInfo.dwPeerID + and D.tTradingInfo.bSelfConfirm and D.tTradingInfo.bPeerConfirm then + szPeerName = D.tTradingInfo.szPeerName + end + -- 不记录系统交易变动,则直接返回 + if szPeerName == 'System' and not MY_GKP.bMoneySystem then + return + end + -- 不记录10金以下系统交易变动 + if nGold < 10 and szPeerName == 'System' then + return + end + local ds = D.GetDS() + ds:SetPaymentRec({ + nGold = nGold, -- API给的有问题 …… 只算金 + szPlayer = szPeerName, + dwForceID = D.tTradingInfo.dwForceID, + nTime = GetCurrentTime(), + dwMapID = X.GetClientPlayer().GetMapID() + }) + if MY_GKP.bMoneyTalk and szPeerName ~= 'System' + and (not MY_GKP.bMoneyTalkOnlyDistributor or X.IsPlayerTeamDistributor(D.tTradingInfo.dwID) or X.IsClientPlayerTeamDistributor()) then + if nGold > 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + D.GetFormatLink(_L['Received']), + D.GetFormatLink(szPeerName, true), + D.GetFormatLink(_L['The'] .. nGold .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP), + }) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { + D.GetFormatLink(_L['Pay to']), + D.GetFormatLink(szPeerName, true), + D.GetFormatLink(' ' .. nGold * -1 .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP), + }) + end + end +end + +X.RegisterEvent('TRADING_OPEN_NOTIFY', function() -- 交易开始 + local tar = X.GetPlayer(arg0) + if not tar then + return + end + D.tTradingInfo = { dwPeerID = tar.dwID, dwForceID = tar.dwForceID, szPeerName = X.GetPlayerName(tar.dwID, { eShowID = 'never' }) or 'Unknown' } +end) +X.RegisterEvent('TRADING_UPDATE_CONFIRM', function() -- 交易确认 + local dwID, bConfirm = arg0, arg1 + if not D.tTradingInfo then + return + end + if dwID == X.GetClientPlayerID() then + D.tTradingInfo.bSelfConfirm = bConfirm + elseif dwID == D.tTradingInfo.dwPeerID then + D.tTradingInfo.bPeerConfirm = bConfirm + end +end) +X.RegisterEvent('MONEY_UPDATE', function() --金钱变动 + D.MoneyUpdate(arg0, arg1, arg2) +end) +X.RegisterEvent('TRADING_CLOSE', function() -- 交易结束 + D.tTradingInfo = {} +end) + +----------------------------------------------------------------------> +-- 系统金团 +----------------------------------------------------------------------< +function D.SyncSystemGKP() + if not MY_GKP.bSyncSystem then + return + end + local GetInfo = X.GetGameAPI('GoldTeamBase_GetAllBiddingInfos') + local aInfo = GetInfo and GetInfo() + if not aInfo then + return + end + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local ds = D.GetDS() + for _, v in ipairs(aInfo) do + local szKey = table.concat({ + tostring(v.nBiddingInfoIndex), + tostring(v.dwItemTabType), + tostring(v.dwItemTabIndex), + tostring(v.dwDoodadID), + tostring(v.nType), + tostring(v.nLootItemIndex), + tostring(v.nStartTime), + }, ',') + -- 拍卖记录 + local item = not X.IsEmpty(v.dwItemID) and GetItem(v.dwItemID) + local itemInfo = not X.IsEmpty(v.dwItemTabType) and not X.IsEmpty(v.dwItemTabIndex) and GetItemInfo(v.dwItemTabType, v.dwItemTabIndex) + local player = X.GetPlayer(v.dwDestPlayerID) + local dwForceID = player and player.dwForceID + if not dwForceID then + if MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(v.dwDestPlayerID) + if data then + dwForceID = data.dwForceID + end + end + end + local tab = ds:GetAuctionRec(szKey) or { + key = szKey, + nUiId = 0, + dwTabType = v.dwItemTabType or 0, + dwDoodadID = v.dwDoodadID or 0, + nQuality = 1, + nVersion = 0, + dwIndex = v.dwItemTabIndex or 0, + nTime = v.nStartTime or 0, + dwForceID = dwForceID or 0, + szPlayer = v.szDestPlayerName or 0, + nMoney = v.nPrice or 0, + szNpcName = X.IsEmpty(v.dwNpcTemplateID) and _L['Add Manually'] or X.GetNpcTemplateName(v.dwNpcTemplateID), + } + if item then + local szName = X.GetItemName(v.dwItemID, { eShowID = 'never' }) + if szName then + tab.szName = szName + end + if item.nGenre == ITEM_GENRE.BOOK then + tab.nBookID = item.nBookID + end + tab.nUiId = item.nUiId + tab.nQuality = item.nQuality + elseif itemInfo then + local szName = X.GetItemInfoName(v.dwItemTabType, v.dwItemTabIndex, 0, { eShowID = 'never' }) + if szName then + tab.szName = szName + end + tab.nUiId = itemInfo.nUiId + tab.nQuality = itemInfo.nQuality + end + if not tab.szName then + tab.szName = v.szComment + end + if X.IsEmpty(tab.dwForceID) and not X.IsEmpty(dwForceID) then + tab.dwForceID = dwForceID + end + tab.bDelete = v.nState == 0 + tab.bSystem = true + ds:SetAuctionRec(tab) + -- 付款记录 + if not X.IsEmpty(v.dwPayerID) and not X.IsEmpty(v.nPrice) then + local player = X.GetPlayer(v.dwDestPlayerID) -- 记账到欠款人头上方便统计 + local dwForceID = player and player.dwForceID + if not dwForceID then + if MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(v.dwDestPlayerID) + if data then + dwForceID = data.dwForceID + end + end + end + local tab = ds:GetPaymentRec(szKey) or { + key = szKey, + nGold = v.nPrice or 0, + szPlayer = v.szDestPlayerName or '', -- v.szPayerName + dwForceID = dwForceID or 0, + dwMapID = 0, + nTime = v.nStartTime or 0, + } + if X.IsEmpty(tab.dwForceID) and not X.IsEmpty(dwForceID) then + tab.dwForceID = dwForceID + end + tab.bSystem = true + ds:SetPaymentRec(tab) + end + end + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage( + _L['PMTool'], + _L('MY_GKP_MI SyncSystemGKP in %dms.', nTickCount), + X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end +X.RegisterEvent('BIDDING_OPERATION', function() + if not MY_GKP.bSyncSystem then + return + end + X.DelayCall('MY_GKP_MI__SyncSystemGKP', 150, D.SyncSystemGKP) +end) +X.RegisterInit('MY_GKP_MI__SyncSystemGKP', D.SyncSystemGKP) + +----------------------------------------------------------------------> +-- 主界面 +----------------------------------------------------------------------< +function D.OpenPanel() + MY_GKP_UI.Open(D.GetDS():GetFilePath()) +end + +function D.ClosePanel() + local frame = Station.Lookup('Normal/MY_GKP#MI') + if frame then + frame:Hide() + end +end + +function D.IsOpened() + local frame = Station.Lookup('Normal/MY_GKP#MI') + return frame and frame:IsVisible() +end + +function D.TogglePanel() + if D.IsOpened() then + D.ClosePanel() + else + D.OpenPanel() + end +end + +function D.LoadHistory(szFilePath) + local dsHist = MY_GKP_DS(szFilePath) + if dsHist then + local ds = D.GetDS() + D.NewDS(true) + ds:SetTime(dsHist:GetTime()) + ds:SetMap(dsHist:GetMap()) + ds:SetAuctionList(dsHist:GetAuctionList()) + ds:SetPaymentList(dsHist:GetPaymentList()) + CPath.DelFile(szFilePath) + end +end + +X.RegisterHotKey('MY_GKP', _L['Open/Close Golden Team Record'], D.TogglePanel) +X.RegisterAddonMenu({ szOption = _L['Golden Team Record'], fnAction = D.OpenPanel }) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKP_MI', + exports = { + { + fields = { + GetDS = D.GetDS, + NewDS = D.NewDS, + NewAuction = D.NewAuction, + SyncSend = D.SyncSend, + OpenPanel = D.OpenPanel, + ClosePanel = D.ClosePanel, + IsOpened = D.IsOpened, + TogglePanel = D.TogglePanel, + LoadHistory = D.LoadHistory, + }, + }, + }, +} +MY_GKP_MI = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/src/MY_GKP_UI.lua b/MY_GKP/src/MY_GKP_UI.lua new file mode 100644 index 000000000..cd23be422 --- /dev/null +++ b/MY_GKP/src/MY_GKP_UI.lua @@ -0,0 +1,927 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 金团记录界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_GKP/MY_GKP_UI' +local PLUGIN_NAME = 'MY_GKP' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_GKP' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local SZ_INI = PLUGIN_ROOT .. '/ui/MY_GKP.ini' +local D = { + GetMoneyTipText = MY_GKP.GetMoneyTipText, + GetTimeString = MY_GKP.GetTimeString, + GetMoneyCol = MY_GKP.GetMoneyCol, + GetFormatLink = MY_GKP.GetFormatLink, +} + +function D.SetDS(frame, szFilePath) + frame.ds = MY_GKP_DS(szFilePath) + if frame.ds then + D.UpdateMode(frame) + D.DrawTitle(frame) + D.DrawStat(frame) + D.DrawAuctionPage(frame) + D.DrawPaymentPage(frame) + else + X.UI.CloseFrame(frame) + X.Alert('MY_GKP_UI', _L['Load data source failed!']) + end +end + +----------------------------------------------------------------------> +-- 绘制界面 +----------------------------------------------------------------------< + +function D.UpdateMode(frame) + local bMainInstance = frame.ds == MY_GKP_MI.GetDS() + local ui = X.UI(frame) + ui:Fetch('Btn_AddManually'):Visible(bMainInstance) + ui:Fetch('Btn_Calculate'):Visible(bMainInstance) + ui:Fetch('GOLD_TEAM_BID_LIST'):Visible(bMainInstance) + ui:Fetch('Debt'):Visible(bMainInstance) + ui:Fetch('Btn_ClearRecord'):Visible(bMainInstance) + ui:Fetch('Btn_HistoryRecord'):Visible(bMainInstance) + ui:Fetch('Btn_SyncRecord'):Visible(bMainInstance) + ui:Fetch('Btn_SetCaption'):Visible(bMainInstance) + ui:Fetch('Btn_SetHistory'):Visible(not bMainInstance) +end + +function D.DrawTitle(frame) + local txtTitle = frame:Lookup('', 'Text_Title') + local szMap = frame.ds:GetMap() + local nTime = frame.ds:GetTime() + local szText = _L['GKP Golden Team Record'] + .. (szMap ~= '' and (' - ' .. szMap) or '') + .. (nTime ~= 0 and (' - ' .. X.FormatTime(nTime, '%yyyy-%MM-%dd-%hh-%mm-%ss')) or '') + txtTitle:SetText(szText) +end + +function D.DrawStat(frame) + local a, b = frame.ds:GetAuctionSum() + local c, d = frame.ds:GetPaymentSum() + local hStat = frame:Lookup('Wnd_Bg', 'Handle_Record_Stat') + local szXml = GetFormatText(_L['Reall Salary:'], 41) .. D.GetMoneyTipText(a + b) + if X.IsClientPlayerTeamDistributor() or not X.IsClientPlayerInParty() then + if c + d < 0 then + szXml = szXml .. GetFormatText(' || ' .. _L['Spending:'], 41) .. D.GetMoneyTipText(d) + elseif c ~= 0 then + szXml = szXml .. GetFormatText(' || ' .. _L['Reall income:'], 41) .. D.GetMoneyTipText(c + d) + end + local e = (a + b) - (c + d) + if a > 0 then + szXml = szXml .. GetFormatText(' || ' .. _L['Money on Debt:'], 41) .. D.GetMoneyTipText(e) + end + end + hStat:Clear() + hStat:AppendItemFromString(szXml) + hStat:FormatAllItemPos() + hStat:SetSizeByAllItemSize() + hStat.OnItemMouseEnter = function() + local br = GetFormatText('\n', 41) + local szXml = '' + if a > 0 then + szXml = szXml .. GetFormatText(_L['Total Auction:'], 41) .. D.GetMoneyTipText(a) .. br + if b ~= 0 then + szXml = szXml .. GetFormatText(_L['Salary Allowance:'], 41) .. D.GetMoneyTipText(b) .. br + szXml = szXml .. GetFormatText(_L['Reall Salary:'], 41) .. D.GetMoneyTipText(a + b) .. br + end + end + if (X.IsClientPlayerTeamDistributor() or not X.IsClientPlayerInParty()) and c > 0 then + szXml = szXml .. GetFormatText(_L['Total income:'], 41) .. D.GetMoneyTipText(c) .. br + if d ~= 0 then + szXml = szXml .. GetFormatText(_L['Spending:'], 41) .. D.GetMoneyTipText(d) .. br + szXml = szXml .. GetFormatText(_L['Reall income:'], 41) .. D.GetMoneyTipText(c + d) .. br + end + end + if szXml ~= '' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(szXml, 400, { x - w, y, w, h }) + end + end + FireUIEvent('GKP_RECORD_TOTAL', a, b) +end + +function D.DrawAuctionPage(frame, szKey, szSort) + if not szKey then + szKey = frame.hRecordContainer.key or 'nTime' + end + if not szSort then + szSort = frame.hRecordContainer.sort or 'desc' + end + local tab = frame.ds:GetAuctionList(szKey, szSort) + local bMainInstance = frame.ds == MY_GKP_MI.GetDS() + frame.hRecordContainer.key = szKey + frame.hRecordContainer.sort = szSort + frame.hRecordContainer:Clear() + for k, v in ipairs(tab) do + if MY_GKP.bDisplayEmptyRecords or v.nMoney ~= 0 then + local wnd = frame.hRecordContainer:AppendContentFromIni(PLUGIN_ROOT .. '/ui/MY_GKP_Record_Item.ini', 'WndWindow', k) + local item = wnd:Lookup('', '') + if k % 2 == 0 then + item:Lookup('Image_Line'):Hide() + end + item:RegisterEvent(32) + if bMainInstance then + item.OnItemRButtonClick = function() + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + MY_GKP_AuctionUI.Open(this:GetRoot().ds, v, 'EDIT') + end + end + item:Lookup('Text_No'):SetText(k) + item:Lookup('Image_NameIcon'):FromUITex(GetForceImage(v.dwForceID)) + item:Lookup('Text_Name'):SetText(v.szPlayer) + item:Lookup('Text_Name'):SetFontColor(X.GetForceColor(v.dwForceID)) + local szName = v.szName or X.GetItemNameByUIID(v.nUiId) + item:Lookup('Text_ItemName'):SetText(szName) + if v.nQuality then + item:Lookup('Text_ItemName'):SetFontColor(GetItemFontColorByQuality(v.nQuality)) + else + local KItem = v.dwTabType and v.dwIndex and GetItemInfo(v.dwTabType, v.dwIndex) + if KItem then + item:Lookup('Text_ItemName'):SetFontColor(GetItemFontColorByQuality(KItem.nQuality)) + else + item:Lookup('Text_ItemName'):SetFontColor(255, 255, 0) + end + end + item:Lookup('Handle_Money'):AppendItemFromString(D.GetMoneyTipText(v.nMoney)) + item:Lookup('Handle_Money'):FormatAllItemPos() + item:Lookup('Text_Source'):SetText(v.szNpcName) + if v.bSync then + item:Lookup('Text_Source'):SetFontColor(0,255,0) + end + item:Lookup('Text_Time'):SetText(D.GetTimeString(v.nTime)) + if v.bEdit then + item:Lookup('Text_Time'):SetFontColor(255,255,0) + end + local box = item:Lookup('Box_Item') + if v.dwTabType == 0 and v.dwIndex == 0 then + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN) + box:SetObjectIcon(582) + else + if v.nBookID then + UpdataItemInfoBoxObject(box, v.nVersion, v.dwTabType, v.dwIndex, 99999, v.nBookID) + else + UpdataItemInfoBoxObject(box, v.nVersion, v.dwTabType, v.dwIndex, v.nStackNum) + end + end + local hItemName = item:Lookup('Text_ItemName') + for kk, vv in ipairs({'OnItemMouseEnter', 'OnItemMouseLeave', 'OnItemLButtonDown', 'OnItemLButtonUp'}) do + hItemName[vv] = function() + if box[vv] then + this = box + box[vv]() + end + end + end + if bMainInstance then + wnd:Lookup('WndButton_Delete').OnLButtonClick = function() + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + v.bDelete = not v.bDelete + frame.ds:SetAuctionRec(v) + if X.IsClientPlayerTeamDistributor() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock, otherwise gkp will not able to sync to teammate.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {'edit', v}, true) + end + end + else + wnd:Lookup('WndButton_Delete'):Hide() + end + -- tip + item:Lookup('Text_Name').data = v + if v.bDelete then + wnd:SetAlpha(80) + end + end + end + frame.hRecordContainer:FormatAllContentPos() +end + +function D.DrawPaymentPage(frame, szKey, szSort) + if not szKey then + szKey = frame.hAccountContainer.key or 'szPlayer' + end + if not szSort then + szSort = frame.hAccountContainer.sort or 'desc' + end + local tab = frame.ds:GetPaymentList(szKey, szSort) + local bMainInstance = frame.ds == MY_GKP_MI.GetDS() + frame.hAccountContainer.key = szKey + frame.hAccountContainer.sort = szSort + frame.hAccountContainer:Clear() + local tMoney = X.GetClientPlayer().GetMoney() + for k, v in ipairs(tab) do + local c = frame.hAccountContainer:AppendContentFromIni(PLUGIN_ROOT .. '/ui/MY_GKP_Account_Item.ini', 'WndWindow', k) + local item = c:Lookup('', '') + if k % 2 == 0 then + item:Lookup('Image_Line'):Hide() + end + c:Lookup('', 'Handle_Money'):AppendItemFromString(D.GetMoneyTipText(v.nGold)) + c:Lookup('', 'Handle_Money'):FormatAllItemPos() + item:Lookup('Text_No'):SetText(k) + if v.szPlayer and v.szPlayer ~= 'System' then + item:Lookup('Image_NameIcon'):FromUITex(GetForceImage(v.dwForceID)) + item:Lookup('Text_Name'):SetText(v.szPlayer) + item:Lookup('Text_Change'):SetText(_L['Player\'s transation']) + item:Lookup('Text_Name'):SetFontColor(X.GetForceColor(v.dwForceID)) + else + item:Lookup('Image_NameIcon'):FromUITex('ui/Image/uicommon/commonpanel4.UITex',3) + item:Lookup('Text_Name'):SetText(_L['System']) + item:Lookup('Text_Change'):SetText(_L['Reward & other ways']) + end + item:Lookup('Text_Map'):SetText(X.IsEmpty(v.dwMapID) and '-' or Table_GetMapName(v.dwMapID)) + item:Lookup('Text_Time'):SetText(D.GetTimeString(v.nTime)) + if bMainInstance then + c:Lookup('WndButton_Delete').OnLButtonClick = function() + v.bDelete = not v.bDelete + frame.ds:SetPaymentRec(v) + end + else + c:Lookup('WndButton_Delete'):Hide() + end + -- tip + item:Lookup('Text_Name').data = v + if v.bDelete then + c:SetAlpha(80) + end + end + frame.hAccountContainer:FormatAllContentPos() +end + +----------------------------------------------------------------------> +-- 窗体创建时会被调用 +----------------------------------------------------------------------< +function D.InitFrame(frame) + X.UI.AppendFromIni(frame, SZ_INI, 'Wnd_Total', true) + frame.hRecordContainer = frame:Lookup('Page_GKP_Record/WndScroll_GKP_Record/WndContainer_Record_List') + frame.hAccountContainer = frame:Lookup('Page_GKP_Account/WndScroll_GKP_Account/WndContainer_Account_List') + X.UI.AdaptComponentAppearance(frame:Lookup('Page_GKP_Record/WndScroll_GKP_Record/Scroll_GKP_Record_All')) + X.UI.AdaptComponentAppearance(frame:Lookup('Page_GKP_Account/WndScroll_GKP_Account/Scroll_GKP_Account_All')) + local ui = X.UI(frame) + frame:Lookup('Page_GKP_Record'):Show() + frame:Lookup('Page_GKP_Account'):Hide() + ui:Text(_L['GKP Golden Team Record']):Anchor('CENTER') + ui:Append('Image', { + x = 10, y = -10, + w = 36, h = 36, + image = 'ui\\Image\\UICommon\\CommonPanel.UITex', imageFrame = 88, + }) + local uiTabs = ui:Append('WndTabs', { + x = 0, y = 40, w = frame:GetW(), h = 35, + }) + uiTabs:Append('WndTab', { + w = 150, h = 35, + text = g_tStrings.GOLD_BID_RECORD_STATIC_TITLE, + checked = true, + onCheck = function(bChecked) + frame:Lookup('Page_GKP_Record'):SetVisible(bChecked) + end, + }) + uiTabs:Append('WndTab', { + w = 150, h = 35, + text = g_tStrings.GOLD_BID_RPAY_STATIC_TITLE, + onCheck = function(bChecked) + frame:Lookup('Page_GKP_Account'):SetVisible(bChecked) + end, + }) + ui:Append('WndButton', { + x = 955, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + onClick = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_GKP') + end, + }) + ui:Append('WndButton', { + name = 'Btn_AddManually', + x = 20, y = 660, w = 120, text = _L['Add Manually'], + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then -- debug + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + MY_GKP_AuctionUI.Open(frame:GetRoot().ds) + end, + }) + local nW = 980 + -- 结算工资按钮 + local nX = nW - 120 - 5 + ui:Append('WndButton', { + name = 'Btn_Calculate', + x = nX, y = 620, w = 120, text = g_tStrings.GOLD_TEAM_SYLARY_LIST, + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + local ds = frame:GetRoot().ds + local me = X.GetClientPlayer() + if not me.IsInParty() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not in the team.']) + end + local team = GetClientTeam() + if X.IsEmpty(ds:GetAuctionList()) then + return X.Alert('MY_GKP_UI', _L['No Record']) + end + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + GetUserInput(_L['Total Amount of People with Output Settle Account'],function(num) + if not tonumber(num) then return end + local a, b = ds:GetAuctionSum() + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['Salary Settle Account']) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Salary Statistic: income %d Gold.', a)) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Salary Allowance: %d Gold.', b)) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Reall Salary: %d Gold.',a + b, a, b)) + if a + b >= 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Amount of People with Settle Account: %d',num)) + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Actual per person: %d Gold.',math.floor((a + b) / num))) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['The Account is Negative, no money is coming out!']) + end + end, nil, nil, nil, team.GetTeamSize()) + end, + }) + local function SendGKPInfoBgMsg(szMsgType, aBill, aAuction) + FireUIEvent('MY_GKP_SEND_BEGIN') + local szKey = X.GetUUID() + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {szMsgType, 'BEGIN', szKey}) + local nBeginTime, nEndTime = math.huge, 0 + local nMoney, nEquipNum, nEquipPrice, tEquipPrice = 0, 0, 0, {} + for k, v in ipairs(aBill) do + if v.szName ~= 'System' then + local dwForceID, aItem = -1, {} + for kk, vv in ipairs(aAuction) do + if vv.szPlayer == v.szName then + if vv.dwForceID and dwForceID == -1 then + dwForceID = vv.dwForceID + end + if vv.nUiId == 0 then + table.insert(aItem, { 'M', vv.szName, vv.nMoney }) + else + local KItemInfo = GetItemInfo(vv.dwTabType, vv.dwIndex) + if KItemInfo and KItemInfo.nGenre == ITEM_GENRE.EQUIPMENT and KItemInfo.nQuality >= X.CONSTANT.ITEM_QUALITY.PURPLE then + tEquipPrice[vv.nMoney] = true + nEquipNum = nEquipNum + 1 + nEquipPrice = nEquipPrice + vv.nMoney + end + table.insert(aItem, { vv.dwTabType, vv.dwIndex, vv.nStackNum or vv.nBookID }) + end + nMoney = nMoney + vv.nMoney + nBeginTime = math.min(nBeginTime, vv.nTime) + nEndTime = math.max(nEndTime, vv.nTime) + end + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {szMsgType, 'RECORD', szKey, v.szName, v.nGold, dwForceID, aItem}) + end + end + local nDuring = nEndTime >= nBeginTime and nEndTime - nBeginTime or 0 + local nGKPLevel = 0 + -- 根据总金额评分 + for k, v in ipairs({ + 50000 , -- 黑出翔 + 100000, -- 背锅 + 250000, -- 脸帅 + 500000, -- 自称小红手 + 500000, -- 特别红 + 500000, -- 玄晶专用 + }) do + if v >= nMoney then + nGKPLevel = k + break + end + end + if nEquipNum > 0 then + -- 根据装备平均溢价百分比评分 + local aEquipPrice = {} + for k, _ in pairs(tEquipPrice) do + table.insert(aEquipPrice, k) + end + table.sort(aEquipPrice, function(a, b) return a < b end) + local nEquipMinPrice = aEquipPrice[1] == 0 and aEquipPrice[2] or aEquipPrice[1] + for i = 1, #aEquipPrice - 1 do + nEquipMinPrice = math.min(nEquipMinPrice, aEquipPrice[i + 1] - aEquipPrice[i]) + end + local fEquipPrice = nEquipPrice / nEquipNum / nEquipMinPrice + for k, v in ipairs({ + 1, -- 黑出翔 + 1.5, -- 背锅 + 2, -- 脸帅 + 3, -- 自称小红手 + 5, -- 特别红 + }) do + if v >= fEquipPrice then + if k >= nGKPLevel then + nGKPLevel = k + end + break + end + end + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {szMsgType, 'FINISH', szKey, nMoney, nDuring, nGKPLevel}) + end + -- 发布拍卖记录 + nX = nW - 120 - 5 + ui:Append('WndButton', { + name = 'GOLD_TEAM_BID_LIST', + x = nX, y = 660, w = 120, text = g_tStrings.GOLD_TEAM_BID_LIST, + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + local ds = frame:GetRoot().ds + local me = X.GetClientPlayer() + if not me.IsInParty() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not in the team.']) + end + local tAuction = ds:GetAuctionPlayerSum() + local aAuction = ds:GetAuctionList('nTime', 'desc') + if X.IsEmpty(tAuction) then + return X.Alert('MY_GKP_UI', _L['No Record']) + end + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + -- 处理数据 + local nTime = aAuction[1].nTime - aAuction[#aAuction].nTime -- 所花费的时间 + local nAuctionSum = ds:GetAuctionSum() + local aBill = {} + for k, v in pairs(tAuction) do + table.insert(aBill, { szName = k, nGold = v }) + end + table.sort(aBill, function(a, b) return a.nGold < b.nGold end) + -- 聊天频道 + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['--- Consumption ---']) + for k, v in ipairs(aBill) do + if v.nGold > 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { D.GetFormatLink(v.szName, true), D.GetFormatLink(g_tStrings.STR_TALK_HEAD_SAY1 .. v.nGold .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP) }) + end + end + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Total Auction: %d Gold.', nAuctionSum)) + -- 弹出面板 + SendGKPInfoBgMsg('GKP_CONSUMPTION', aBill, aAuction) + end, + }) + -- 欠费情况 + nX = nX - 120 - 5 + ui:Append('WndButton', { + name = 'Debt', + x = nX, y = 660, w = 120, text = _L['Debt Issued'], + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + local ds = frame:GetRoot().ds + local me = X.GetClientPlayer() + if not me.IsInParty() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not in the team.']) + end + if not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + return X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + end + local tAuction = ds:GetAuctionPlayerSum() + local tPayment = ds:GetPaymentPlayerSum() + -- 处理数据 + local tBill = {} + -- 欠账 + for k, v in pairs(tAuction) do + tBill[k] = (tBill[k] or 0) - v + end + -- 正账 + for k, v in pairs(tPayment) do + tBill[k] = (tBill[k] or 0) + v + end + -- 排序 + local aBill = {} + for k, v in pairs(tBill) do + if k ~= 'System' and v ~= 0 then + table.insert(aBill, { szName = k, nGold = v }) + end + end + if X.IsEmpty(aBill) then + return X.Alert('MY_GKP_UI', _L['No Record']) + end + table.sort(aBill, function(a, b) return a.nGold < b.nGold end) + -- 聊天频道 + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['Information on Debt']) + for _, v in ipairs(aBill) do + if v.nGold < 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { D.GetFormatLink(v.szName, true), D.GetFormatLink(g_tStrings.STR_TALK_HEAD_SAY1 .. v.nGold .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP) }) + else + X.SendChat(PLAYER_TALK_CHANNEL.RAID, { D.GetFormatLink(v.szName, true), D.GetFormatLink(g_tStrings.STR_TALK_HEAD_SAY1 .. '+' .. v.nGold .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP) }) + end + end + local nGold, nGold2 = 0, 0 + for szPlayer, nMoney in pairs(tPayment) do + if szPlayer ~= 'System' then -- 必须要有交易对象 + if nMoney > 0 then + nGold = nGold + nMoney + else + nGold2 = nGold2 + nMoney + end + end + end + if nGold ~= 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Received: %d Gold.', nGold)) + end + if nGold2 ~= 0 then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('Spending: %d Gold.', nGold2 * -1)) + end + -- 弹出面板 + SendGKPInfoBgMsg('GKP_DEBT', aBill, ds:GetAuctionList()) + end, + }) + -- 清空数据 + nX = nX - 120 - 5 + ui:Append('WndButton', { + name = 'Btn_ClearRecord', + x = nX, y = 660, w = 120, text = _L['Clear Record'], + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + local fnAction = function() + MY_GKP_MI.NewDS() + end + X.Confirm(_L['Are you sure to wipe all of the records?'], fnAction) + end, + }) + -- 历史记录 + nX = nX - 120 - 5 + ui:Append('WndButton', { + name = 'Btn_HistoryRecord', + x = nX, y = 660, w = 120, text = _L['History record'], + buttonStyle = 'FLAT_LACE_BORDER', + menu = function() + local menu = {} + local aFiles = MY_GKP.GetHistoryFiles() + for i = 1, math.min(#aFiles, 21) do + local info = aFiles[i] + table.insert(menu, { + szOption = info.filename .. '.gkp', + fnAction = function() + D.Open(info.fullpath) + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + CPath.DelFile(info.fullpath) + X.UI.ClosePopupMenu() + end, + }) + end + if #menu > 0 then + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + table.insert(menu, { + szOption = _L['Manually load from file.'], + rgb = { 255, 255, 0 }, + fnAction = function() + local file = GetOpenFileName( + _L['Please select gkp file.'], + 'GKP File(*.gkp,*.gkp.jx3dat)\0*.gkp;*.gkp.jx3dat\0All Files(*.*)\0*.*\0\0', + X.FormatPath({'userdata/gkp', X.PATH_TYPE.ROLE}) + ) + if not X.IsEmpty(file) then + D.Open(file) + end + end, + }) + return menu + end, + }) + -- 同步数据 + nX = nX - 120 - 5 + ui:Append('WndButton', { + name = 'Btn_SyncRecord', + x = nX, y = 660, w = 120, text = _L['Manual SYNC'], + buttonStyle = 'FLAT_LACE_BORDER', + tip = { + render = _L['Left click to sync from others, right click to sync to others'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + menuLClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + local me = X.GetClientPlayer() + if me.IsInParty() then + local menu = MY_GKP.GetTeamMemberMenu(function(v) + X.Confirm(_L('Wheater replace the current record with the synchronization [%s]\'s record?\n Please notice, this means you are going to lose the information of current record.', v.szName), function() + X.Alert('MY_GKP_UI', _L('Asking for the sychoronization information...\n If no response in longtime, it may because [%s] is not using MY_GKP plugin or not responding.', v.szName)) + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_GKP', {'GKP_Sync', v.szName}) -- 请求同步信息 + end) + end, true) + table.insert(menu, 1, { bDevide = true }) + table.insert(menu, 1, { szOption = _L['Please select which will be the one you are going to ask record for.'], bDisable = true }) + return menu + else + X.Alert('MY_GKP_UI', _L['You are not in the team.']) + end + end, + menuRClick = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + local me = X.GetClientPlayer() + if not me.IsInParty() then + X.Alert('MY_GKP_UI', _L['You are not in the team.']) + elseif not X.IsClientPlayerTeamDistributor() and not X.IsDebugging('MY_GKP') then + X.Alert('MY_GKP_UI', _L['You are not the distrubutor.']) + else + local menu = MY_GKP.GetTeamMemberMenu(function(v) + X.Confirm(_L('Wheater synchronize your record to [%s]?\n Please notice, this means the opposite sites are going to lose their information of current record.', v.szName), function() + MY_GKP_MI.SyncSend(v.dwID) + end) + end, true) + table.insert(menu, { bDevide = true }) + table.insert(menu, { + szOption = _L['Full raid.'], + fnAction = function() + X.Confirm(_L['Wheater synchronize your record to full raid?\n Please notice, this means the opposite sites are going to lose their information of current record.'], function() + MY_GKP_MI.SyncSend(0) + end) + end, + }) + table.insert(menu, 1, { bDevide = true }) + table.insert(menu, 1, { szOption = _L['Please select which will be the one you are going to send record to.'], bDisable = true }) + return menu + end + end, + }) + -- 重命名 + nX = nX - 120 - 5 + ui:Append('WndButton', { + name = 'Btn_SetCaption', + x = nX, y = 660, w = 120, text = _L['Set record caption'], + buttonStyle = 'FLAT_LACE_BORDER', + menu = function() + local ds = frame:GetRoot().ds + GetUserInput(_L['Please input new caption'],function(szText) + if X.IsEmpty(szText) then + return + end + local a, b = ds:SetMap(szText) + end, nil, nil, nil, ds:GetMap()) + end, + }) + -- 恢复历史记录 + nX = (nW - 20 - 120) / 2 + ui:Append('WndButton', { + name = 'Btn_SetHistory', + x = nX, y = 660, w = 120, text = _L['Set current record'], + buttonStyle = 'FLAT_LACE_BORDER', + menu = function() + local frame = frame:GetRoot() + X.Confirm(_L['Are you sure to cover the current information with the last record data?'], function() + MY_GKP_MI.LoadHistory(frame.ds:GetFilePath()) + MY_GKP_MI.OpenPanel() + X.UI.CloseFrame(frame) + X.Alert('MY_GKP_UI', _L['Reocrd Recovered.']) + end) + end, + }) + + -- 排序 + local page = frame:Lookup('Page_GKP_Record') + local t = { + {'#', false}, + {'szPlayer', _L['Gainer']}, + {'szName', _L['Name of the Items']}, + {'nMoney', _L['Auction Price']}, + {'szNpcName', _L['Source of the Object']}, + {'nTime', _L['Distribution Time']}, + } + for k, v in ipairs(t) do + if v[2] then + local txt = page:Lookup('', 'Text_Record_Break' ..k) + txt:RegisterEvent(786) + txt:SetText(v[2]) + txt.OnItemLButtonClick = function() + local sort = txt.sort or 'asc' + D.DrawAuctionPage(frame:GetRoot(), v[1], sort) + if sort == 'asc' then + txt.sort = 'desc' + else + txt.sort = 'asc' + end + end + txt.OnItemMouseEnter = function() + this:SetFontColor(255, 128, 0) + end + txt.OnItemMouseLeave = function() + this:SetFontColor(255, 255, 255) + end + end + end + + -- 排序2 + local page = frame:Lookup('Page_GKP_Account') + local t = { + {'#', false}, + {'szPlayer', _L['Transation Target']}, + {'nGold', _L['Changes in Money']}, + {'szPlayer', _L['Ways of Money Change']}, + {'dwMapID', _L['The Map of Current Location when Money Changes']}, + {'nTime', _L['The Change of Time']}, + } + + for k, v in ipairs(t) do + if v[2] then + local txt = page:Lookup('', 'Text_Account_Break' .. k) + txt:RegisterEvent(786) + txt:SetText(v[2]) + txt.OnItemLButtonClick = function() + local sort = txt.sort or 'asc' + D.DrawPaymentPage(frame:GetRoot(), v[1], sort) + if sort == 'asc' then + txt.sort = 'desc' + else + txt.sort = 'asc' + end + end + txt.OnItemMouseEnter = function() + this:SetFontColor(255, 128, 0) + end + txt.OnItemMouseLeave = function() + this:SetFontColor(255, 255, 255) + end + end + end + + frame.SetDS = D.SetDS + frame:RegisterEvent('MY_GKP_DATA_UPDATE') + frame:RegisterEvent('MY_GKP_SEND_BEGIN') + frame:RegisterEvent('MY_GKP_SEND_FINISH') +end + +function D.OnFrameShow() + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) +end + +function D.OnFrameHide() + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) +end + +function D.OnEvent(event) + if event == 'MY_GKP_DATA_UPDATE' then + if arg0 == '' or arg0 == this.ds:GetFilePath() then + if arg1 == 'MAP' or arg1 == 'TIME' or arg1 == 'ALL' then + D.DrawTitle(this) + end + if arg1 == 'AUCTION' or arg1 == 'PAYMENT' or arg1 == 'ALL' then + if arg1 == 'AUCTION' or arg1 == 'ALL' then + D.DrawAuctionPage(this) + end + if arg1 == 'PAYMENT' or arg1 == 'ALL' then + D.DrawPaymentPage(this) + end + D.DrawStat(this) + end + end + elseif event == 'MY_GKP_SEND_BEGIN' then + this:Lookup('Debt'):Enable(false) + this:Lookup('GOLD_TEAM_BID_LIST'):Enable(false) + elseif event == 'MY_GKP_SEND_FINISH' then + this:Lookup('Debt'):Enable(true) + this:Lookup('GOLD_TEAM_BID_LIST'):Enable(true) + end +end + +function D.OnFrameKeyDown() + if GetKeyName(Station.GetMessageKey()) == 'Esc' then + X.UI.CloseFrame(this:GetRoot()) + return 1 + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Close' then + X.UI.CloseFrame(this:GetRoot()) + end +end + +function D.OnItemLButtonDown() + local szName = this:GetName() + if szName == 'Text_Name' then + if IsCtrlKeyDown() then + return X.EditBox_AppendLinkPlayer(this:GetText()) + end + end +end + +function D.OnItemMouseEnter() + local frame = this:GetRoot() + if this:GetName() == 'Text_Name' then + local data = this.data + if not data.dwForceID then + return + end + local szIcon, nFrame = GetForceImage(data.dwForceID) + local r, g, b = X.GetForceColor(data.dwForceID) + local aXml = { + GetFormatImage(szIcon,nFrame,20,20), + GetFormatText(' ' .. data.szPlayer .. g_tStrings.STR_COLON .. '\n', 136, r, g, b), + } + if IsCtrlKeyDown() then + table.insert(aXml, GetFormatText(g_tStrings.DEBUG_INFO_ITEM_TIP .. '\n', 136, 255, 0, 0)) + table.insert(aXml, GetFormatText(X.EncodeLUAData(data, ' '), 136, 255, 255, 255)) + else + local tAuction, tSubsidy = frame.ds:GetAuctionPlayerSum() + local tPayment = frame.ds:GetPaymentPlayerSum() + local nAuction = tAuction[data.szPlayer] or 0 + local nSubsidy = tSubsidy[data.szPlayer] or 0 + local nPayment = tPayment[data.szPlayer] or 0 + local nSummary = math.max(nAuction + nSubsidy - nPayment, 0) + table.insert(aXml, GetFormatText(_L['System Information as Shown Below\n\n'], 136, 255, 255, 255)) + local r, g, b = D.GetMoneyCol(nAuction) + table.insert(aXml, GetFormatText(_L['Total Cosumption:'], 136, 255, 128, 0)) + table.insert(aXml, GetFormatText(nAuction ..g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP .. '\n', 136, r, g, b)) + local r, g, b = D.GetMoneyCol(nSubsidy) + table.insert(aXml, GetFormatText(_L['Total Allowance:'], 136, 255, 128, 0)) + table.insert(aXml, GetFormatText(nSubsidy .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP .. '\n', 136, r, g, b)) + local r, g, b = D.GetMoneyCol(nPayment) + table.insert(aXml, GetFormatText(_L['Total Payment:'], 136, 255, 128, 0)) + table.insert(aXml, GetFormatText(nPayment .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP .. '\n', 136, r, g, b)) + local r, g, b = D.GetMoneyCol(nSummary) + table.insert(aXml, GetFormatText(_L['Money on Debt:'], 136, 255, 128, 0)) + table.insert(aXml, GetFormatText(nSummary .. g_tStrings.STR_GOLD .. g_tStrings.STR_FULL_STOP .. '\n', 136, r, g, b)) + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(table.concat(aXml), 400, { x, y, w, h }) + end +end + +function D.OnItemMouseLeave() + HideTip() +end + +do +local nIndex = 0 +function D.Open(szFilePath) + local szName = 'MY_GKP' + local ds = MY_GKP_DS(szFilePath) + if ds == MY_GKP_MI.GetDS() then + szName = szName .. '#MI' + local frame = Station.Lookup('Normal/' .. szName) + if frame then + frame:Show() + frame:BringToTop() + return + end + else + nIndex = nIndex + 1 + szName = szName .. '#' .. nIndex + end + local ui = X.UI.CreateFrame('MY_GKP_UI', { w = 1000, h = 700 }) + local frame = ui:Raw() + D.InitFrame(frame) + frame:SetName(szName) + frame:SetDS(szFilePath) + frame:BringToTop() +end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GKP_UI', + exports = { + { + preset = 'UIEvent', + fields = { + 'Open', + }, + root = D, + }, + }, +} +MY_GKP_UI = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_GKP/ui/MY_GKP.ini b/MY_GKP/ui/MY_GKP.ini new file mode 100644 index 000000000..7c1d72708 --- /dev/null +++ b/MY_GKP/ui/MY_GKP.ini @@ -0,0 +1,688 @@ +[MY_GKP] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +Left=50 +Top=250 +DragAreaWidth=1000 +DragAreaHeight=50 +IsCustomDragable=1 +DisableBringToTop=0 +DummyWnd=0 +MultiFrame=0 +DragAreaLeft=0 +DragAreaTop=0 +BreatheWhenHide=1 +ClassName=MY_GKP_UI +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_GKP +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Wnd_Bg] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 + +[Handle_Wnd_Bg] +._WndType=Handle +._Parent=Wnd_Bg +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Record_Stat] +._WndType=Handle +._Parent=Handle_Wnd_Bg +Left=20 +Top=620 +PosType=0 +HandleType=3 +HAlign=0 +VAlign=1 +RowSpacing=0 +EventID=256 + +[Page_GKP_Record] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=80 +Width=1000 +Height=530 +DummyWnd=0 +Frame=0 + +[Handle_Record] +._WndType=Handle +._Parent=Page_GKP_Record +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=510 +EventID=786 + +[Image_Record_BG] +._WndType=Image +._Parent=Handle_Record +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_Record_BG1] +._WndType=Image +._Parent=Handle_Record +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Record_Line1_0] +._WndType=Image +._Parent=Handle_Record +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Record_Break1] +._WndType=Image +._Parent=Handle_Record +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break1] +._WndType=Text +._Parent=Handle_Record +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=# +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +EventID=512 + +[Image_Record_Break2] +._WndType=Image +._Parent=Handle_Record +Left=250 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break2] +._WndType=Text +._Parent=Handle_Record +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 + +[Image_Record_Break3] +._WndType=Image +._Parent=Handle_Record +Left=430 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break3] +._WndType=Text +._Parent=Handle_Record +Left=250 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=180 +Height=30 + +[Image_Record_Break4] +._WndType=Image +._Parent=Handle_Record +Left=570 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break4] +._WndType=Text +._Parent=Handle_Record +Left=432 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=138 +Height=30 + +[Image_Record_Break5] +._WndType=Image +._Parent=Handle_Record +Left=700 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break5] +._WndType=Text +._Parent=Handle_Record +Left=570 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=130 +Height=30 + +[Image_Record_Break6] +._WndType=Image +._Parent=Handle_Record +Left=900 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Record_Break6] +._WndType=Text +._Parent=Handle_Record +Left=700 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=200 +Height=30 + +[WndScroll_GKP_Record] +._WndType=WndScroll +._Parent=Page_GKP_Record +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Record_List +VerScrollBar=Scroll_GKP_Record_All +ScrollButtonUp=Btn_GKP_Record_Up_1 +ScrollButtonDown=Btn_GKP_Record_Down_1 + +[WndContainer_Record_List] +._WndType=WndContainer +._Parent=WndScroll_GKP_Record +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 + +[Btn_GKP_Record_Up_1] +._WndType=WndButton +._Parent=WndScroll_GKP_Record +Frame=34 +Left=935 +Top=5 +Width=20 +Height=20 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_GKP_Record_Down_1] +._WndType=WndButton +._Parent=WndScroll_GKP_Record +Frame=38 +Left=935 +Top=455 +Width=20 +Height=20 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Scroll_GKP_Record_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_GKP_Record +StepCount=30 +PageStepCount=10 +Left=935 +Top=20 +Width=20 +Height=435 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=0 + +[Btn_GKP_Record_ListScroll] +._WndType=WndButton +._Parent=Scroll_GKP_Record_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Page_GKP_Account] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=80 +Width=1000 +Height=530 +DummyWnd=0 +Frame=0 + +[Handle_Account] +._WndType=Handle +._Parent=Page_GKP_Account +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=510 + +[Image_Account_BG] +._WndType=Image +._Parent=Handle_Account +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_Account_BG1] +._WndType=Image +._Parent=Handle_Account +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Account_Line1_0] +._WndType=Image +._Parent=Handle_Account +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Account_Break1] +._WndType=Image +._Parent=Handle_Account +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break1] +._WndType=Text +._Parent=Handle_Account +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=# +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 + +[Image_Account_Break2] +._WndType=Image +._Parent=Handle_Account +Left=250 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break2] +._WndType=Text +._Parent=Handle_Account +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 + +[Image_Account_Break3] +._WndType=Image +._Parent=Handle_Account +Left=370 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break3] +._WndType=Text +._Parent=Handle_Account +Left=250 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 + +[Image_Account_Break4] +._WndType=Image +._Parent=Handle_Account +Left=520 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break4] +._WndType=Text +._Parent=Handle_Account +Left=370 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 + +[Image_Account_Break5] +._WndType=Image +._Parent=Handle_Account +Left=700 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break5] +._WndType=Text +._Parent=Handle_Account +Left=520 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=180 +Height=30 + +[Image_Account_Break6] +._WndType=Image +._Parent=Handle_Account +Left=900 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Account_Break6] +._WndType=Text +._Parent=Handle_Account +Left=700 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=200 +Height=30 + +[WndScroll_GKP_Account] +._WndType=WndScroll +._Parent=Page_GKP_Account +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Account_List +VerScrollBar=Scroll_GKP_Account_All +ScrollButtonUp=Btn_GKP_Account_Up_1 +ScrollButtonDown=Btn_GKP_Account_Down_1 + +[WndContainer_Account_List] +._WndType=WndContainer +._Parent=WndScroll_GKP_Account +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Btn_GKP_Account_Up_1] +._WndType=WndButton +._Parent=WndScroll_GKP_Account +Frame=34 +Left=935 +Top=5 +Width=20 +Height=20 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_GKP_Account_Down_1] +._WndType=WndButton +._Parent=WndScroll_GKP_Account +Frame=38 +Left=935 +Top=455 +Width=20 +Height=20 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Scroll_GKP_Account_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_GKP_Account +StepCount=30 +PageStepCount=10 +Left=935 +Top=20 +Width=20 +Height=435 +SlideBtn=Btn_GKP_Account_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=0 + +[Btn_GKP_Account_ListScroll] +._WndType=WndButton +._Parent=Scroll_GKP_Account_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + diff --git a/MY_GKP/ui/MY_GKPLoot.ini b/MY_GKP/ui/MY_GKPLoot.ini new file mode 100644 index 000000000..2525e3036 --- /dev/null +++ b/MY_GKP/ui/MY_GKPLoot.ini @@ -0,0 +1,512 @@ +[MY_GKPLoot] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=270 +Height=380 +DragAreaWidth=400 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=0 +DragAreaLeft=0 +DragAreaTop=0 + +[Scroll_DoodadList] +._WndType=WndScroll +._Parent=MY_GKPLoot +Left=0 +Top=0 +Width=270 +Height=380 +ScrollHandle= +ScrollContainer=WndContainer_DoodadList +VerScrollBar=ScrolBar_DoodadList +ScrollButtonUp=Btn_DoodadList_Up +ScrollButtonDown=Btn_DoodadList_Down +MousePenetrable=0 + +[WndContainer_DoodadList] +._WndType=WndContainer +._Parent=Scroll_DoodadList +Left=0 +Top=0 +Width=270 +Height=380 +ContainerType=1 +DrawStyle=1 + +[Wnd_Doodad] +._WndType=WndWindow +._Parent=WndContainer_DoodadList +Left=0 +Top=0 +Width=270 +Height=380 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Doodad] +._WndType=Handle +._Parent=Wnd_Doodad +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=270 +Height=380 +IgnoreInvisibleChild=1 + +[Image_DoodadBg] +._WndType=Image +._Parent=Handle_Doodad +Image=ui\Image\UICommon\UISettingImage01.UITex +Alpha=255 +Frame=4 +PosType=0 +Width=270 +Height=350 +ImageType=10 +Left=0 +Top=24 + +[Image_DoodadTitleBg] +._WndType=Image +._Parent=Handle_Doodad +Image=ui\Image\UICommon\UISettingImage01.UITex +Alpha=255 +Frame=0 +PosType=0 +Width=270 +Height=30 +ImageType=10 +Left=0 +Top=0 + +[Text_Title] +._WndType=Text +._Parent=Handle_Doodad +RowSpacing=0 +FontSpacing=0 +Alpha=190 +Left=33 +Top=5 +PosType=0 +FontScheme=41 +VAlign=1 +HAlign=0 +Height=20 +Width=250 +AutoEtc=1 +ShowAll=0 +OrgText=1 +$Text=狼 + +[SFX] +._WndType=SFX +._Parent=Handle_Doodad +Left=150 +Top=75 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\UI_获得装备02.pss +Width=0 +Height=0 +LockShowAndHide=1 + +[Handle_ItemList] +._WndType=Handle +._Parent=Handle_Doodad +HandleType=3 +Left=0 +Top=30 +PosType=0 +Width=270 +Height=350 +RowSpacing=0 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_ItemList +HandleType=0 +PosType=8 +Width=270 +Height=56 +EventID=309 +FirstItemPosType=0 +Hover=Image_Hover + +[Shadow_Highlight] +._WndType=Shadow +._Parent=Handle_Item +Left=2 +Top=0 +PosType=0 +ShadowColor= +Alpha=180 +Width=266 +Height=56 +LockShowAndHide=1 + +[Box_Item] +._WndType=Box +._Parent=Handle_Item +Left=3 +Top=0 +Width=56 +Height=56 +PosType=0 +IconID=2014 + +[Text_Item] +._WndType=Text +._Parent=Handle_Item +Left=70 +Top=0 +FontScheme=41 +Width=200 +Height=56 +VAlign=1 +HAlign=0 +AutoEtc=1 +ShowAll=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=装备名称 + +[Image_Hover] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\Common\CoverShadow.UITex +Frame=1 +Alpha=255 +Left=2 +Top=0 +PosType=0 +Width=270 +Height=55 +LockShowAndHide=1 + +[Image_Spliter] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=45 +PosType=0 +Alpha=255 +Left=57 +Top=50 +Width=212 +Height=7 + +[Image_Suitable] +._WndType=Image +._Parent=Handle_Item +Image=interface\MY\MY_GKP\img\GKPLoot.UITex +Frame=0 +Alpha=255 +Left=235 +Top=21 +PosType=0 +Width=25 +Height=17 +LockShowAndHide=1 + +[Image_MaybeSuitable] +._WndType=Image +._Parent=Handle_Item +Image=interface\MY\MY_GKP\img\GKPLoot.UITex +Frame=1 +Alpha=255 +Left=235 +Top=21 +PosType=0 +Width=25 +Height=17 +LockShowAndHide=1 + +[Image_Better] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\TeachingPanel\TeachingPanel7.UITex +Frame=51 +Alpha=255 +Left=236 +Top=11 +PosType=0 +Width=23 +Height=35 +TipBgAlpha=0 +LockShowAndHide=1 + +[Image_GroupDistrib] +._WndType=Image +._Parent=Handle_Item +Left=242 +Top=0 +PosType=0 +Image=ui\Image\UICommon\Camera3.UITex +Alpha=255 +Frame=27 +Width=24 +Height=24 +EventID=277 + +[Handle_ItemFiltered] +._WndType=Handle +._Parent=Handle_ItemList +HandleType=0 +PosType=8 +Width=270 +Height=56 +EventID=309 +FirstItemPosType=0 +Hover=Image_Hover_0 + +[Handle_FilterItemList] +._WndType=Handle +._Parent=Handle_ItemFiltered +Left=4 +Top=0 +PosType=0 +HandleType=3 +Width=262 +Height=25 +RowSpacing=0 + +[Handle_FilterItem] +._WndType=Handle +._Parent=Handle_FilterItemList +PosType=8 +HandleType=0 +Width=26 +Height=26 +FirstItemPosType=0 + +[Box_FilterItem] +._WndType=Box +._Parent=Handle_FilterItem +Width=25 +Height=25 +PosType=8 +IconID=2014 +Left=0 +Top=0 + +[Image_FilterSpliter] +._WndType=Image +._Parent=Handle_ItemFiltered +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=45 +PosType=0 +Alpha=255 +Left=2 +Top=-6 +Width=267 +Height=7 + +[Handle_Compass] +._WndType=Handle +._Parent=Handle_Doodad +HandleType=0 +FirstItemPosType=0 +Left=163 +Top=3 +PosType=0 + +[Image_CompassBg] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=71 +Alpha=255 +Left=4 +Top=0 +PosType=0 +Width=24 +Height=24 + +[Image_PointGreen] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=69 +Alpha=255 +Left=11 +Top=18 +PosType=0 +Width=9 +Height=9 + +[Image_Player] +._WndType=Image +._Parent=Handle_Compass +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=66 +Alpha=255 +Left=9 +Top=6 +PosType=0 +ImageType=6 +Width=13 +Height=13 + +[Compass_Distance] +._WndType=Text +._Parent=Handle_Compass +RowSpacing=0 +FontSpacing=0 +Alpha=200 +Left=-39 +Top=5 +PosType=0 +Width=40 +Height=15 +FontScheme=15 +HAlign=2 +OrgText=1 +$Text=100" +VAlign=0 + +[Btn_Style] +._WndType=WndButton +._Parent=Wnd_Doodad +Frame=0 +Left=8 +Top=6 +Alpha=200 +Width=18 +Height=18 +Image=ui\Image\UICommon\CommonPanel2.UITex +NormalGroup=40 +MouseOverGroup=41 +MouseDownGroup=42 +DisableGroup=43 + +[Btn_Boss] +._WndType=WndButton +._Parent=Wnd_Doodad +Frame=0 +Left=190 +Top=3 +Alpha=255 +Width=25 +Height=25 +NormalGroup=12 +MouseOverGroup=13 +MouseDownGroup=14 +DisableGroup=15 +Image=UI/Image/Button/SystemButton.uitex +DummyWnd=0 + +[CheckBox_Mini] +._WndType=WndCheckBox +._Parent=Wnd_Doodad +Left=220 +Top=6 +Width=16 +Height=16 +Frame=9 +Alpha=255 +UnCheckAndEnable=35 +CheckAndEnable=31 +UnCheckAndDisable=38 +CheckAndDisable=34 +UnCheckedAndEnableWhenMouseOver=36 +CheckedAndEnableWhenMouseOver=32 +CheckedAndDisableWhenMouseOver=34 +UnCheckedAndDisableWhenMouseOver=38 +Checking=37 +UnChecking=33 +Image=ui\Image\UICommon\UISettingImage01.UITex +OrgTip=0 +DummyWnd=0 +CheckedWhenCreate=0 +DisableCheck=0 + +[Btn_Close] +._WndType=WndButton +._Parent=Wnd_Doodad +Frame=0 +Left=242 +Top=5 +Alpha=255 +$Tip=STR_CLOSE +OrgTip=0 +Width=27 +Height=27 +NormalGroup=43 +MouseOverGroup=44 +MouseDownGroup=45 +DisableGroup=42 +Image=ui\Image\UICommon\CommonPanel.UITex +DummyWnd=0 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Btn_DoodadList_Up] +._WndType=WndButton +._Parent=Scroll_DoodadList +Frame=34 +Left=0 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_DoodadList_Down] +._WndType=WndButton +._Parent=Scroll_DoodadList +Frame=38 +Left=0 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[ScrolBar_DoodadList] +._WndType=WndNewScrollBar +._Parent=Scroll_DoodadList +StepCount=30 +PageStepCount=10 +Left=262 +Top=0 +Width=8 +Height=370 +SlideBtn=Btn_DoodadList_Scroll +Type=1 +AutoHideSlideButton=0 + +[Btn_DoodadList_Scroll] +._WndType=WndButton +._Parent=ScrolBar_DoodadList +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=8 +Height=49 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + diff --git a/MY_GKP/ui/MY_GKP_Account_Item.ini b/MY_GKP/ui/MY_GKP_Account_Item.ini new file mode 100644 index 000000000..254982abd --- /dev/null +++ b/MY_GKP/ui/MY_GKP_Account_Item.ini @@ -0,0 +1,178 @@ +[WndWindow] +._WndType=WndWindow +._Parent=WndContainer_Account_List +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_Delete] +._WndType=WndButton +._Parent=WndWindow +Frame=0 +Left=910 +Top=3 +$Tip=STR_MAIL_DELETE +OrgTip=0 +Width=25 +Height=25 +NormalGroup=9 +MouseOverGroup=10 +MouseDownGroup=11 +DisableGroup=12 +Image=ui\Image\button\FrendNPartyButton.UITex + +[Handle_Account_Item] +._WndType=Handle +._Parent=WndWindow +PosType=8 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +Width=960 +Height=32 +EventID=768 + +[Image_Line] +._WndType=Image +._Parent=Handle_Account_Item +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Account_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=956 +Height=3 + +[Text_No] +._WndType=Text +._Parent=Handle_Account_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=998 +OrgText=1 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=100 +Height=29 + +[Image_NameIcon] +._WndType=Image +._Parent=Handle_Account_Item +Image=UI/Image/TargetPanel/Target.uitex +Frame=49 +Alpha=255 +Left=105 +Top=0 +PosType=0 +Width=28 +Height=28 + +[Text_Name] +._WndType=Text +._Parent=Handle_Account_Item +Left=135 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=105 +Height=29 +AutoEtc=1 +ShowAll=0 +EventID=257 + +[Handle_Money] +._WndType=Handle +._Parent=Handle_Account_Item +HandleType=2 +FirstItemPosType=0 +MinRowHeight=29 +MaxRowHeight=29 +Left=260 +Top=0 +VAlign=1 +Width=140 +Height=29 + +[Text_Change] +._WndType=Text +._Parent=Handle_Account_Item +Left=370 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=150 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Map] +._WndType=Text +._Parent=Handle_Account_Item +Left=525 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=170 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Time] +._WndType=Text +._Parent=Handle_Account_Item +Left=700 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=2014/01/01 11:11:11 +OrgText=1 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=200 +Height=29 +AutoEtc=1 +ShowAll=0 diff --git a/MY_GKP/ui/MY_GKP_Chat.ini b/MY_GKP/ui/MY_GKP_Chat.ini new file mode 100644 index 000000000..72ea097fe --- /dev/null +++ b/MY_GKP/ui/MY_GKP_Chat.ini @@ -0,0 +1,165 @@ +[MY_GKP_Chat] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=500 +Height=350 +DragAreaWidth=500 +DragAreaHeight=350 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_GKP_Chat +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Wnd_Bg] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=5 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Bg +HandleType=0 +FirstItemPosType=0 +PosType=10 + +[Image_Bg2] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\MapMark.UITex +Frame=74 +Alpha=160 +PosType=0 +ImageType=10 +Left=25 +Top=70 +Width=450 +Height=255 + +[Box] +._WndType=Box +._Parent=Handle_Total +Left=28 +Top=31 +Width=38 +Height=38 +EventID=786 +PosType=0 +IconID=0 + +[Text] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=70 +Top=31 +PosType=0 +FontScheme=41 +VAlign=1 +HAlign=0 +Height=38 +Width=0 + +[WndScroll_Chat] +._WndType=WndScroll +._Parent=Wnd_Total +Left=25 +Top=75 +Width=475 +Height=255 +ScrollHandle=Handle_List +VerScrollBar=Scroll_All +ScrollButtonUp=Btn_Up_1 +ScrollButtonDown=Btn_Down_1 + +[Handle_List] +._WndType=Handle +._Parent=WndScroll_Chat +Left=5 +Top=5 +Width=445 +Height=240 +HandleType=4 +PixelScroll=1 +ControlShow=1 + +[Btn_Up_1] +._WndType=WndButton +._Parent=WndScroll_Chat +Frame=34 +Left=450 +Top=5 +Width=20 +Height=20 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Down_1] +._WndType=WndButton +._Parent=WndScroll_Chat +Frame=38 +Left=450 +Top=235 +Width=20 +Height=20 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Scroll_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Chat +StepCount=20 +PageStepCount=20 +Left=450 +Top=20 +Width=20 +Height=217 +SlideBtn=Btn_ListScroll +Type=1 +AutoHideSlideButton=1 + +[Btn_ListScroll] +._WndType=WndButton +._Parent=Scroll_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + diff --git a/MY_GKP/ui/MY_GKP_Record_Item.ini b/MY_GKP/ui/MY_GKP_Record_Item.ini new file mode 100644 index 000000000..4e40e767b --- /dev/null +++ b/MY_GKP/ui/MY_GKP_Record_Item.ini @@ -0,0 +1,188 @@ +[WndWindow] +._WndType=WndWindow +._Parent=WndContainer_Record_List +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndButton_Delete] +._WndType=WndButton +._Parent=WndWindow +Frame=0 +Left=910 +Top=3 +$Tip=STR_MAIL_DELETE +OrgTip=0 +Width=25 +Height=25 +NormalGroup=9 +MouseOverGroup=10 +MouseDownGroup=11 +DisableGroup=12 +Image=ui\Image\button\FrendNPartyButton.UITex + +[Handle_Record_Item] +._WndType=Handle +._Parent=WndWindow +PosType=8 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +Width=960 +Height=32 +EventID=768 + +[Image_Line] +._WndType=Image +._Parent=Handle_Record_Item +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Record_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=956 +Height=3 + +[Text_No] +._WndType=Text +._Parent=Handle_Record_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=998 +OrgText=1 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=100 +Height=29 + +[Image_NameIcon] +._WndType=Image +._Parent=Handle_Record_Item +Image=UI/Image/TargetPanel/Target.uitex +Frame=49 +Alpha=255 +Left=105 +Top=0 +PosType=0 +Width=28 +Height=28 + +[Text_Name] +._WndType=Text +._Parent=Handle_Record_Item +Left=135 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=112 +Height=29 +AutoEtc=1 +ShowAll=0 +EventID=257 + +[Box_Item] +._WndType=Box +._Parent=Handle_Record_Item +Index=0 +Left=260 +Top=2 +PosType=0 +Width=27 +Height=27 +EventID=257 + +[Text_ItemName] +._WndType=Text +._Parent=Handle_Record_Item +Left=295 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=130 +Height=29 +AutoEtc=1 +ShowAll=0 +EventID=261 + +[Handle_Money] +._WndType=Handle +._Parent=Handle_Record_Item +HandleType=2 +FirstItemPosType=0 +MinRowHeight=29 +MaxRowHeight=29 +Left=440 +Top=0 +VAlign=1 +Width=125 +Height=29 + +[Text_Source] +._WndType=Text +._Parent=Handle_Record_Item +Left=570 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=125 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Time] +._WndType=Text +._Parent=Handle_Record_Item +Left=700 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=200 +Height=29 +AutoEtc=1 +ShowAll=0 diff --git a/MY_LifeBar/config/clear/zhcn.jx3dat b/MY_LifeBar/config/clear/zhcn.jx3dat new file mode 100644 index 000000000..f12a08630 --- /dev/null +++ b/MY_LifeBar/config/clear/zhcn.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'CLEAR', + fDesignUIScale = 0.95, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 60, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 1, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = true, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 100, + nLifeHeight = 8, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 27, + nLifeBorder = 1, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 85, + nLifePerOffsetY = 37, + + fTitleEffectScale = 0.5, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 200, + nFont = 16, + nDistance = 72 * 72 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 自己 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Party = { -- 团队 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Enemy = { -- 敌对 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 30, 30 }}, + {'Npc', { 255, 30, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 30, 30 }, + }, + Neutrality = { -- 中立 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 255, 0 }}, + {'Npc', { 255, 255, 0 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 255, 0 }, + }, + Ally = { -- 相同阵营 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30 , 255, 30 }}, + {'Npc', { 30 , 255, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30 , 255, 30 }, + }, + Foe = { -- 仇人 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 128, 255 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 128, 255 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/clear/zhtw.jx3dat b/MY_LifeBar/config/clear/zhtw.jx3dat new file mode 100644 index 000000000..5ae4cac08 --- /dev/null +++ b/MY_LifeBar/config/clear/zhtw.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'CLEAR', + fDesignUIScale = 0.95, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 60, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 1, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = true, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 100, + nLifeHeight = 8, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 27, + nLifeBorder = 1, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 85, + nLifePerOffsetY = 37, + + fTitleEffectScale = 0.5, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 200, + nFont = 16, + nDistance = 72 * 72 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 鑷繁 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Party = { -- 鍦橀殜 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Enemy = { -- 鏁靛皪 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 30, 30 }}, + {'Npc', { 255, 30, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 30, 30 }, + }, + Neutrality = { -- 涓珛 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 255, 0 }}, + {'Npc', { 255, 255, 0 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 255, 0 }, + }, + Ally = { -- 鐩稿悓闄g嚐 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30 , 255, 30 }}, + {'Npc', { 30 , 255, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30 , 255, 30 }, + }, + Foe = { -- 浠囦汉 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 128, 255 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 128, 255 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/default/zhcn.jx3dat b/MY_LifeBar/config/default/zhcn.jx3dat new file mode 100644 index 000000000..99917b366 --- /dev/null +++ b/MY_LifeBar/config/default/zhcn.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = '', + fDesignUIScale = 1, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 38, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = true, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 52, + nLifeHeight = 2, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 12, + nLifeBorder = 2, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 8, + + fTitleEffectScale = 0.7, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 255, + nFont = 7, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 自己 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 26, 156, 227 }}, + {'Npc', { 26, 156, 227 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 26, 156, 227 }, + }, + Party = { -- 团队 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 23, 133, 194 }}, + {'Npc', { 23, 133, 194 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 23, 133, 194 }, + }, + Enemy = { -- 敌对 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 203, 53, 9 }}, + {'Npc', { 203, 53, 9 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 203, 53, 9 }, + }, + Neutrality = { -- 中立 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 238, 238, 15 }}, + {'Npc', { 238, 238, 15 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 238, 238, 15 }, + }, + Ally = { -- 相同阵营 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 63 , 210, 94 }}, + {'Npc', { 63 , 210, 94 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 63 , 210, 94 }, + }, + Foe = { -- 仇人 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 197, 26, 201 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 197, 26, 201 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/default/zhtw.jx3dat b/MY_LifeBar/config/default/zhtw.jx3dat new file mode 100644 index 000000000..4735a3d49 --- /dev/null +++ b/MY_LifeBar/config/default/zhtw.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = '', + fDesignUIScale = 1, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 38, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = true, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 52, + nLifeHeight = 2, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 12, + nLifeBorder = 2, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 8, + + fTitleEffectScale = 0.7, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 255, + nFont = 7, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 鑷繁 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 26, 156, 227 }}, + {'Npc', { 26, 156, 227 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 26, 156, 227 }, + }, + Party = { -- 鍦橀殜 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 23, 133, 194 }}, + {'Npc', { 23, 133, 194 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 23, 133, 194 }, + }, + Enemy = { -- 鏁靛皪 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 203, 53, 9 }}, + {'Npc', { 203, 53, 9 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 203, 53, 9 }, + }, + Neutrality = { -- 涓珛 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 238, 238, 15 }}, + {'Npc', { 238, 238, 15 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 238, 238, 15 }, + }, + Ally = { -- 鐩稿悓闄g嚐 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 63 , 210, 94 }}, + {'Npc', { 63 , 210, 94 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 63 , 210, 94 }, + }, + Foe = { -- 浠囦汉 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 197, 26, 201 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 197, 26, 201 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/official/zhcn.jx3dat b/MY_LifeBar/config/official/zhcn.jx3dat new file mode 100644 index 000000000..b10172995 --- /dev/null +++ b/MY_LifeBar/config/official/zhcn.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'OFFICIAL', + fDesignUIScale = 1, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 38, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = false, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 52, + nLifeHeight = 2, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 12, + nLifeBorder = 2, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 8, + + fTitleEffectScale = 0.7, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 255, + nFont = 7, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 自己 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 26, 156, 227 }}, + {'Npc', { 26, 156, 227 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 26, 156, 227 }, + }, + Party = { -- 团队 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 23, 133, 194 }}, + {'Npc', { 23, 133, 194 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 23, 133, 194 }, + }, + Enemy = { -- 敌对 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 203, 53, 9 }}, + {'Npc', { 203, 53, 9 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 203, 53, 9 }, + }, + Neutrality = { -- 中立 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 238, 238, 15 }}, + {'Npc', { 238, 238, 15 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 238, 238, 15 }, + }, + Ally = { -- 相同阵营 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 63 , 210, 94 }}, + {'Npc', { 63 , 210, 94 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 63 , 210, 94 }, + }, + Foe = { -- 仇人 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 197, 26, 201 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 197, 26, 201 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/official/zhtw.jx3dat b/MY_LifeBar/config/official/zhtw.jx3dat new file mode 100644 index 000000000..26b178fef --- /dev/null +++ b/MY_LifeBar/config/official/zhtw.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'OFFICIAL', + fDesignUIScale = 1, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 38, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = false, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 52, + nLifeHeight = 2, + nLifePadding = 0, + nLifeOffsetX = 0, + nLifeOffsetY = 12, + nLifeBorder = 2, + nLifeBorderR = 0, + nLifeBorderG = 0, + nLifeBorderB = 0, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 8, + + fTitleEffectScale = 0.7, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 255, + nFont = 7, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 鑷繁 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 26, 156, 227 }}, + {'Npc', { 26, 156, 227 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 26, 156, 227 }, + }, + Party = { -- 鍦橀殜 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 23, 133, 194 }}, + {'Npc', { 23, 133, 194 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 23, 133, 194 }, + }, + Enemy = { -- 鏁靛皪 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 203, 53, 9 }}, + {'Npc', { 203, 53, 9 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 203, 53, 9 }, + }, + Neutrality = { -- 涓珛 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 238, 238, 15 }}, + {'Npc', { 238, 238, 15 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 238, 238, 15 }, + }, + Ally = { -- 鐩稿悓闄g嚐 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 63 , 210, 94 }}, + {'Npc', { 63 , 210, 94 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 63 , 210, 94 }, + }, + Foe = { -- 浠囦汉 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 197, 26, 201 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 197, 26, 201 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/xlifebar/zhcn.jx3dat b/MY_LifeBar/config/xlifebar/zhcn.jx3dat new file mode 100644 index 000000000..2d72f8c0e --- /dev/null +++ b/MY_LifeBar/config/xlifebar/zhcn.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'XLIFEBAR', + fDesignUIScale = 0.9, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 60, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = false, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 80, + nLifeHeight = 8, + nLifePadding = 1, + nLifeOffsetX = 0, + nLifeOffsetY = 27, + nLifeBorder = 1, + nLifeBorderR = 180, + nLifeBorderG = 180, + nLifeBorderB = 180, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 42, + + fTitleEffectScale = 0.5, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 200, + nFont = 16, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 自己 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Party = { -- 团队 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Enemy = { -- 敌对 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 30, 30 }}, + {'Npc', { 255, 30, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 30, 30 }, + }, + Neutrality = { -- 中立 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 255, 0 }}, + {'Npc', { 255, 255, 0 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 255, 0 }, + }, + Ally = { -- 相同阵营 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 255, 30 }}, + {'Npc', { 30, 255, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 30, 255, 30 }, + }, + Foe = { -- 仇人 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 128, 255 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 霸刀 + }, + __ARRAY_TEMPLATE__ = { 255, 128, 255 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/config/xlifebar/zhtw.jx3dat b/MY_LifeBar/config/xlifebar/zhtw.jx3dat new file mode 100644 index 000000000..3e1e299af --- /dev/null +++ b/MY_LifeBar/config/xlifebar/zhtw.jx3dat @@ -0,0 +1,340 @@ +local __META__ = {} +local __TEMPLATE__ = { + eCss = 'XLIFEBAR', + fDesignUIScale = 0.9, + nDesignFontOffset = 0, + + nCamp = -1, + bOnlyInArena = false, + bOnlyInDungeon = false, + bOnlyInBattleField = false, + + nTextOffsetY = 60, + nTextLineHeight = 20, + fTextScale = 1.2, + fTextSpacing = 0, + + bShowSpecialNpc = false, + bShowSpecialNpcOnlyEnemy = true, + bShowObjectID = false, + bShowObjectIDOnlyUnnamed = false, + bShowKungfu = false, + bShowDistance = false, + bShowDistanceOnlyTarget = false, + nDistanceDecimal = 0, + + nLifeWidth = 80, + nLifeHeight = 8, + nLifePadding = 1, + nLifeOffsetX = 0, + nLifeOffsetY = 27, + nLifeBorder = 1, + nLifeBorderR = 180, + nLifeBorderG = 180, + nLifeBorderB = 180, + szLifeDirection = "LEFT_RIGHT", + + nLifePerOffsetX = 0, + nLifePerOffsetY = 42, + + fTitleEffectScale = 0.5, + nTitleEffectOffsetY = 0, + nBalloonOffsetY = -20, + + nAlpha = 200, + nFont = 16, + nDistance = 80 * 80 * 64 * 64, + nVerticalDistance = 50 * 8 * 64, + + bHideLifePercentageWhenFight = false, + bHideLifePercentageDecimal = false, + + fGlobalUIScale = 1, + bSystemUIScale = true, + bShowWhenUIHide = true, + bMineOnTop = true, + bTargetOnTop = true, + bScreenPosSort = true, + + Color = { + Self = { -- 鑷繁 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Party = { -- 鍦橀殜 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 140, 220 }}, + {'Npc', { 30, 140, 220 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30, 140, 220 }, + }, + Enemy = { -- 鏁靛皪 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 30, 30 }}, + {'Npc', { 255, 30, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 30, 30 }, + }, + Neutrality = { -- 涓珛 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 255, 0 }}, + {'Npc', { 255, 255, 0 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 255, 0 }, + }, + Ally = { -- 鐩稿悓闄g嚐 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 30, 255, 30 }}, + {'Npc', { 30, 255, 30 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 30, 255, 30 }, + }, + Foe = { -- 浠囦汉 + __META__, + __VALUE__ = { + {'DifferentiateForce', false}, + {'Player', { 255, 128, 255 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 姹熸箹 + {FORCE_TYPE.SHAO_LIN , { 210, 180, 0 }}, -- 灏戞灄 + {FORCE_TYPE.WAN_HUA , { 127, 31 , 223 }}, -- 钀姳 + {FORCE_TYPE.TIAN_CE , { 160, 0 , 0 }}, -- 澶╃瓥 + {FORCE_TYPE.CHUN_YANG, { 56 , 175, 255 }}, -- 绱旈櫧 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 127, 255 }}, -- 涓冪 + {FORCE_TYPE.WU_DU , { 63 , 31 , 159 }}, -- 浜旀瘨 + {FORCE_TYPE.TANG_MEN , { 0 , 133, 144 }}, -- 鍞愰杸 + {FORCE_TYPE.CANG_JIAN, { 255, 255, 0 }}, -- 钘忓妽 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 涓愬公 + {FORCE_TYPE.MING_JIAO, { 253, 84 , 0 }}, -- 鏄庢暀 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 钂奸洸 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 闀锋瓕 + {FORCE_TYPE.BA_DAO , { 71 , 73 , 166 }}, -- 闇稿垁 + }, + __ARRAY_TEMPLATE__ = { 255, 128, 255 }, + }, + }, + ShowName = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTong = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Enemy = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Neutrality = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Ally = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowTitle = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLife = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowLifePer = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + ShowBalloon = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + BalloonChannel = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, +} +return { __TEMPLATE__, __META__ } diff --git a/MY_LifeBar/info.ini b/MY_LifeBar/info.ini new file mode 100644 index 000000000..05ec6c344 --- /dev/null +++ b/MY_LifeBar/info.ini @@ -0,0 +1,14 @@ +[MY_LifeBar] +name=头顶血条 +desc=显示更多信息的头顶血条增强功能 +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src\MY_LifeBar_Config.lua +lua_1=src\MY_LifeBar_ScreenArrow.lua +lua_2=src\MY_LifeBar_Official.lua +lua_3=src\MY_LifeBar_HP.lua +lua_4=src\MY_LifeBar_LB.lua +lua_5=src\MY_LifeBar.lua +lua_6=src\MY_LifeBar.PS.lua +package=MY diff --git a/MY_LifeBar/info.ini.zh_TW b/MY_LifeBar/info.ini.zh_TW new file mode 100644 index 000000000..4e6e167c5 --- /dev/null +++ b/MY_LifeBar/info.ini.zh_TW @@ -0,0 +1,14 @@ +[MY_LifeBar] +name=闋爞琛姊 +desc=椤ず鏇村淇℃伅鐨勯牠闋傝姊濆寮峰姛鑳 +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src\MY_LifeBar_Config.lua +lua_1=src\MY_LifeBar_ScreenArrow.lua +lua_2=src\MY_LifeBar_Official.lua +lua_3=src\MY_LifeBar_HP.lua +lua_4=src\MY_LifeBar_LB.lua +lua_5=src\MY_LifeBar.lua +lua_6=src\MY_LifeBar.PS.lua +package=MY diff --git a/MY_LifeBar/lang/zhcn.jx3dat b/MY_LifeBar/lang/zhcn.jx3dat new file mode 100644 index 000000000..3987f5e85 --- /dev/null +++ b/MY_LifeBar/lang/zhcn.jx3dat @@ -0,0 +1,197 @@ +return { + ['MY_LifeBar'] = '头顶血条', + + ['Enable'] = '启用', + ['Load ancient config'] = '加载旧版数据', + ['Please input ancient config name:'] = '请输入旧版数据配置名:', + + ['Auto hide system headtop'] = '自动隐藏官方头顶、聊天泡泡', + + ['Only enable in checked map types'] = '勾选后仅在勾选类型的地图中启用头顶血条,全部取消勾选表示所有地图启用。', + ['Arena'] = '名剑大会', + ['Battlefield'] = '战场', + ['Dungeon'] = '秘境', + + ['Color config'] = '颜色设置', + ['Player color config'] = '玩家颜色设置', + ['Npc color config'] = 'NPC颜色设置', + + ['Name display config'] = '名字显示设置', + ['Player name display'] = '玩家名字显示', + ['Npc name display'] = 'NPC名字显示', + + ['Title display config'] = '称号显示设置', + ['Player title display'] = '玩家称号显示', + ['Npc title display'] = 'NPC称号显示', + + ['Tong display config'] = '帮会显示设置', + ['Player tong display'] = '玩家帮会显示', + + ['Lifebar display config'] = '血条显示设置', + ['Player lifebar display'] = '玩家血条显示', + ['Npc lifebar display'] = 'NPC血条显示', + + ['Lifepercentage display config'] = '血量百分比显示设置', + ['Player lifepercentage display'] = '玩家百分比显示', + ['Npc lifepercentage display'] = 'NPC百分比显示', + + ['Balloon display config'] = '聊天泡泡显示设置', + ['Player balloon display'] = '玩家聊天泡泡显示', + ['Npc balloon display'] = 'NPC聊天泡泡显示', + ['Balloon channel config'] = '聊天泡泡频道设置', + ['Balloon display time'] = '泡泡显示时长', + + ['Show special npc'] = '显示特殊NPC', + ['Only enemy'] = '仅敌对', + ['Show object id'] = '显示ID', + ['Only unnamed'] = '仅无名目标', + ['Sort by screen pos'] = '根据位置调整遮挡顺序', + ['Self always on top'] = '置顶自身', + ['Target always on top'] = '置顶目标', + + ['Global UI scale: %.2f.'] = '整体缩放:%.2f。', + ['Max Distance: %s foot.'] = '最大显示距离:%s尺。', + ['Max Distance: Unlimited.'] = '最大显示距离:不限制。', + ['Max Vertical Distance: %s foot.'] = '最大高度差:%s尺。', + ['Max Vertical Distance: Unlimited.'] = '最大高度差:不限制。', + ['Font'] = '字体', + ['Lifebar width: %s px.'] = '血条宽度%spx。', + ['Lifebar height: %s px.'] = '血条高度%spx。', + ['Lifebar offset-x: %d px.'] = '血条水平偏移%spx。', + ['Lifebar offset-y: %d px.'] = '血条竖直偏移%spx。', + ['Lifebar padding: %d px.'] = '血条内边框宽度%spx。', + ['Lifebar border: %d px.'] = '血条外边框宽度%spx。', + ['Lifebar border color'] = '血条边框颜色', + ['Life percentage offset-x: %d px.'] = '血量百分比水平偏移%spx。', + ['Life percentage offset-y: %d px.'] = '血量百分比竖直偏移%spx。', + + ['Text offset-y: %d px.'] = '文字高度偏移%spx。', + ['Text line height: %d px.'] = '文字行高%spx。', + ['Text scale: %.1f%%.'] = '文字缩放:%.1f%%。', + ['Text spacing: %.1f.'] = '文字间距:%.1f。', + ['Title effect scale: %.2f%%.'] = '标记与任务卷轴缩放:%.2f。', + ['Title effect offset y: %d px.'] = '标记与任务卷轴竖直偏移%dpx。', + ['Balloon offset y: %d px.'] = '头顶泡泡竖直偏移%dpx。', + + ['Alpha: %.0f%%.'] = '透明度%.0f%%。', + + ['Set current camp'] = '设置当前阵营', + ['Auto detect'] = '自动获取', + + ['Ignore ui scale'] = '无视系统界面缩放', + ['Show when ui hide'] = '界面隐藏时仍然显示', + ['Show kungfu'] = '显示心法', + ['Show distance'] = '显示距离', + ['Decimal number'] = '精确小数点位数', + ['Show distance only target'] = '仅显示当前目标', + + ['Neutrality'] = '中立关系', + ['Enemy'] = '敌对关系', + ['Ally'] = '友好关系', + ['Party'] = '队友关系', + ['Self'] = '自己', + ['Foe'] = '仇人关系', + + ['Hide when unfight'] = '脱战时隐藏', + ['Hide when full life'] = '满血时隐藏', + ['Hide in dungeon'] = '秘境中隐藏', + ['Only target'] = '仅当前目标', + ['Hide pets'] = '不显示跟宠', + ['Hide decimal'] = '不显示小数', + + ['Default config cannot be loaded, please reinstall!!!'] = '默认配置加载失败,请重新安装!', + ['Unified force color'] = '统一染色', + ['Differentiate force color'] = '门派染色', + + ['Draw direction'] = '绘制方向', + ['DIRECTION'] = { + ['LEFT_RIGHT'] = '从左至右', + ['RIGHT_LEFT'] = '从右至左', + ['TOP_BOTTOM'] = '从上至下', + ['BOTTOM_TOP'] = '从下至上', + }, + ['Can not use in shielded map!'] = '当前地图,禁止使用。', + + ['Please choose your favorite lifebar style.\nYou can rechoose in setting panel.'] = '请选择您喜欢的血条面板样式:\n注:您可以随时前往面板设置界面重新选择。', + ['Official default style'] = '官方风格', + ['Official clear style'] = '清晰风格', + ['XLifeBar style'] = '扁平风格', + ['Keep current'] = '保持现状', + + ['This function has been shielded by official except in dungeon'] = '应官方要求,该功能已停止在秘境外使用', + ['Compressing: '] = '压缩数据:', + ['Reset config'] = '恢复默认设置', + + ['CSS Style'] = '风格', + ['Design UI Scale'] = '界面缩放', + ['Design Font Offset'] = '字体缩放', + ['Current Camp'] = '当前阵营', + ['Enable Only in Arena'] = '仅在名剑大会中启用', + ['Enable Only in Dungeon'] = '仅在秘境中启用', + ['Enable Only in Battlefield'] = '仅在战场中启用', + ['Text Offset Y'] = '文字高度偏移', + ['Text Line Height'] = '文字行高', + ['Text Scale'] = '文字缩放', + ['Text Spacing'] = '文字间距', + ['Show Special NPC'] = '显示特殊NPC', + ['Show Special NPC Only Enemy'] = '仅显示敌对特殊NPC', + ['Show Object ID'] = '显示对象ID', + ['Show Object ID Only Unnamed'] = '仅显示无名对象ID', + ['Show Kungfu'] = '显示心法', + ['Show Distance'] = '显示距离', + ['Show Distance Only for Target'] = '仅显示目标距离', + ['Distance Decimal'] = '距离小数位数', + ['Life Bar Width'] = '血条宽度', + ['Life Bar Height'] = '血条高度', + ['Life Bar Padding'] = '血条内边距', + ['Life Bar Offset X'] = '血条水平偏移', + ['Life Bar Offset Y'] = '血条竖直偏移', + ['Life Bar Border'] = '血条边框', + ['Life Bar Border Red'] = '血条边框红色', + ['Life Bar Border Green'] = '血条边框绿色', + ['Life Bar Border Blue'] = '血条边框蓝色', + ['Life Bar Direction'] = '血条方向', + ['Life Percentage Offset X'] = '血量百分比水平偏移', + ['Life Percentage Offset Y'] = '血量百分比竖直偏移', + ['Title Effect Scale'] = '标记效果缩放', + ['Title Effect Offset Y'] = '标记效果竖直偏移', + ['Balloon Offset Y'] = '头顶泡泡竖直偏移', + ['Alpha'] = '透明度', + ['Font'] = '字体', + ['Distance'] = '距离', + ['Vertical Distance'] = '垂直距离', + ['Hide Life Percentage When Fight'] = '战斗时隐藏血量百分比', + ['Hide Life Percentage Decimal'] = '隐藏血量百分比小数', + ['Global UI Scale'] = '全局界面缩放', + ['System UI Scale'] = '系统界面缩放', + ['Show When UI Hide'] = '界面隐藏时显示', + ['Mine On Top'] = '置顶自身', + ['Target On Top'] = '置顶目标', + ['Screen Position Sort'] = '按屏幕位置排序', + ['Color Configuration'] = '颜色配置', + ['Show Name Configuration'] = '名字显示配置', + ['Show Tong Configuration'] = '帮会显示配置', + ['Show Title Configuration'] = '称号显示配置', + ['Show Life Configuration'] = '血条显示配置', + ['Show Life Percentage Configuration'] = '血量百分比显示配置', + ['Show Balloon Configuration'] = '聊天泡泡显示配置', + ['Balloon Channel Configuration'] = '聊天泡泡频道配置', + + -- MY_LifeBar_ScreenArrow.lua -- + ['MY_LifeBar_ScreenArrow'] = '头顶报警', + ['Call Alert'] = '你被点名了', + ['Draw School Color'] = '绘制门派颜色', + ['UI scale'] = '界面缩放', + ['Text scale'] = '文字缩放', + ['Less life/mana head alert'] = '战斗中低血蓝头顶报警', + ['Enable'] = '启用', + ['[%s]'] = '【%s】', + ['While HP less than'] = '血量低于', + ['While MP less than'] = '蓝量低于', + ['Manually add (One per line)'] = '手动添加BUFF名称(每行一个)', + ['Manually add Npc Name (One per line)'] = '手动添加Npc名称(每行一个)', + ['Screen head alarm'] = '头顶报警', + ['Only monitor self'] = '仅监控自己', + ['Preview'] = '预览', + ['PVE everyday, Xuanjing everyday!'] = '每天一个本,周周见玄晶!', +} diff --git a/MY_LifeBar/lang/zhtw.jx3dat b/MY_LifeBar/lang/zhtw.jx3dat new file mode 100644 index 000000000..5ef28328f --- /dev/null +++ b/MY_LifeBar/lang/zhtw.jx3dat @@ -0,0 +1,197 @@ +return { + ['MY_LifeBar'] = '闋爞琛姊', + + ['Enable'] = '鍟熺敤', + ['Load ancient config'] = '杓夊叆鑸婄増鏁告摎', + ['Please input ancient config name:'] = '璜嬭几鍏ヨ垔鐗堟暩鎿氶厤缃悕锛', + + ['Auto hide system headtop'] = '鑷嫊闅辫棌瀹樻柟闋爞銆佽亰澶╂场娉', + + ['Only enable in checked map types'] = '鍕鹃伕寰屽儏鍦ㄥ嬀閬搁鍨嬬殑鍦板湒涓暉鐢ㄩ牠闋傝姊濓紝鍏ㄩ儴鍙栨秷鍕鹃伕琛ㄧず鎵鏈夊湴鍦栧暉鐢ㄣ', + ['Arena'] = '鍚嶅妽澶ф渻', + ['Battlefield'] = '鎴板牬', + ['Dungeon'] = '绉樺', + + ['Color config'] = '椤忚壊瑷疆', + ['Player color config'] = '鐜╁椤忚壊瑷疆', + ['Npc color config'] = 'NPC椤忚壊瑷疆', + + ['Name display config'] = '鍚嶅瓧椤ず瑷疆', + ['Player name display'] = '鐜╁鍚嶅瓧椤ず', + ['Npc name display'] = 'NPC鍚嶅瓧椤ず', + + ['Title display config'] = '绋辫櫉椤ず瑷疆', + ['Player title display'] = '鐜╁绋辫櫉椤ず', + ['Npc title display'] = 'NPC绋辫櫉椤ず', + + ['Tong display config'] = '骞渻椤ず瑷疆', + ['Player tong display'] = '鐜╁骞渻椤ず', + + ['Lifebar display config'] = '琛姊濋’绀鸿ō缃', + ['Player lifebar display'] = '鐜╁琛姊濋’绀', + ['Npc lifebar display'] = 'NPC琛姊濋’绀', + + ['Lifepercentage display config'] = '琛閲忕櫨鍒嗘瘮椤ず瑷疆', + ['Player lifepercentage display'] = '鐜╁鐧惧垎姣旈’绀', + ['Npc lifepercentage display'] = 'NPC鐧惧垎姣旈’绀', + + ['Balloon display config'] = '鑱婂ぉ娉℃场椤ず瑷疆', + ['Player balloon display'] = '鐜╁鑱婂ぉ娉℃场椤ず', + ['Npc balloon display'] = 'NPC鑱婂ぉ娉℃场椤ず', + ['Balloon channel config'] = '鑱婂ぉ娉℃场闋婚亾瑷疆', + ['Balloon display time'] = '娉℃场椤ず鏅傞暦', + + ['Show special npc'] = '椤ず鐗规畩NPC', + ['Only enemy'] = '鍍呮暤灏', + ['Show object id'] = '椤ずID', + ['Only unnamed'] = '鍍呯劇鍚嶇洰妯', + ['Sort by screen pos'] = '鏍规摎浣嶇疆瑾挎暣閬搵闋嗗簭', + ['Self always on top'] = '缃爞鑷韩', + ['Target always on top'] = '缃爞鐩', + + ['Global UI scale: %.2f.'] = '鏁撮珨绺斁锛%.2f銆', + ['Max Distance: %s foot.'] = '鏈澶ч’绀鸿窛闆細%s灏恒', + ['Max Distance: Unlimited.'] = '鏈澶ч’绀鸿窛闆細涓嶉檺鍒躲', + ['Max Vertical Distance: %s foot.'] = '鏈澶ч珮搴﹀樊锛%s灏恒', + ['Max Vertical Distance: Unlimited.'] = '鏈澶ч珮搴﹀樊锛氫笉闄愬埗銆', + ['Font'] = '瀛楅珨', + ['Lifebar width: %s px.'] = '琛姊濆搴%spx銆', + ['Lifebar height: %s px.'] = '琛姊濋珮搴%spx銆', + ['Lifebar offset-x: %d px.'] = '琛姊濇按骞冲亸绉%spx銆', + ['Lifebar offset-y: %d px.'] = '琛姊濊睅鐩村亸绉%spx銆', + ['Lifebar padding: %d px.'] = '琛姊濆収閭婃瀵害%spx銆', + ['Lifebar border: %d px.'] = '琛姊濆閭婃瀵害%spx銆', + ['Lifebar border color'] = '琛姊濋倞妗嗛鑹', + ['Life percentage offset-x: %d px.'] = '琛閲忕櫨鍒嗘瘮姘村钩鍋忕Щ%spx銆', + ['Life percentage offset-y: %d px.'] = '琛閲忕櫨鍒嗘瘮璞庣洿鍋忕Щ%spx銆', + + ['Text offset-y: %d px.'] = '鏂囧瓧楂樺害鍋忕Щ%spx銆', + ['Text line height: %d px.'] = '鏂囧瓧琛岄珮%spx銆', + ['Text scale: %.1f%%.'] = '鏂囧瓧绺斁锛%.1f%%銆', + ['Text spacing: %.1f.'] = '鏂囧瓧闁撹窛锛%.1f銆', + ['Title effect scale: %.2f%%.'] = '妯欒鑸囦换鍕欏嵎杌哥府鏀撅細%.2f銆', + ['Title effect offset y: %d px.'] = '妯欒鑸囦换鍕欏嵎杌歌睅鐩村亸绉%dpx銆', + ['Balloon offset y: %d px.'] = '闋爞娉℃场璞庣洿鍋忕Щ%dpx銆', + + ['Alpha: %.0f%%.'] = '閫忔槑搴%.0f%%銆', + + ['Set current camp'] = '瑷疆鐣跺墠闄g嚐', + ['Auto detect'] = '鑷嫊鐛插彇', + + ['Ignore ui scale'] = '鐒¤绯荤当鐣岄潰绺斁', + ['Show when ui hide'] = '鐣岄潰闅辫棌鏅備粛鐒堕’绀', + ['Show kungfu'] = '椤ず蹇冩硶', + ['Show distance'] = '椤ず璺濋洟', + ['Decimal number'] = '绮剧⒑灏忔暩榛炰綅鏁', + ['Show distance only target'] = '鍍呴’绀虹暥鍓嶇洰妯', + + ['Neutrality'] = '涓珛闂滀總', + ['Enemy'] = '鏁靛皪闂滀總', + ['Ally'] = '鍙嬪ソ闂滀總', + ['Party'] = '闅婂弸闂滀總', + ['Self'] = '鑷繁', + ['Foe'] = '浠囦汉闂滀總', + + ['Hide when unfight'] = '鑴埌鏅傞毐钘', + ['Hide when full life'] = '婊胯鏅傞毐钘', + ['Hide in dungeon'] = '绉樺涓毐钘', + ['Only target'] = '鍍呯暥鍓嶇洰妯', + ['Hide pets'] = '涓嶉’绀鸿窡瀵', + ['Hide decimal'] = '涓嶉’绀哄皬鏁', + + ['Default config cannot be loaded, please reinstall!!!'] = '榛樿獚閰嶇疆杓夊叆澶辨晽锛岃珛閲嶆柊瀹夎锛', + ['Unified force color'] = '绲变竴鏌撹壊', + ['Differentiate force color'] = '闁娲炬煋鑹', + + ['Draw direction'] = '绻=鏂瑰悜', + ['DIRECTION'] = { + ['LEFT_RIGHT'] = '寰炲乏鑷冲彸', + ['RIGHT_LEFT'] = '寰炲彸鑷冲乏', + ['TOP_BOTTOM'] = '寰炰笂鑷充笅', + ['BOTTOM_TOP'] = '寰炰笅鑷充笂', + }, + ['Can not use in shielded map!'] = '鐣跺墠鍦板湒锛岀姝娇鐢ㄣ', + + ['Please choose your favorite lifebar style.\nYou can rechoose in setting panel.'] = '璜嬮伕鎿囨偍鍠滄鐨勮姊濋潰鏉挎ǎ寮忥細\n瑷伙細鎮ㄥ彲浠ラ毃鏅傚墠寰闈㈡澘瑷疆鐣岄潰閲嶆柊閬告搰銆', + ['Official default style'] = '瀹樻柟棰ㄦ牸', + ['Official clear style'] = '娓呮櫚棰ㄦ牸', + ['XLifeBar style'] = '鎵佸钩棰ㄦ牸', + ['Keep current'] = '淇濇寔鐝剧媭', + + ['This function has been shielded by official except in dungeon'] = '鎳夊畼鏂硅姹傦紝瑭插姛鑳藉凡鍋滄鍦ㄧ澧冨浣跨敤', + ['Compressing: '] = '澹撶府鏁告摎锛', + ['Reset config'] = '鎭㈠京榛樿獚瑷疆', + + ['CSS Style'] = '棰ㄦ牸', + ['Design UI Scale'] = '鐣岄潰绺斁', + ['Design Font Offset'] = '瀛楅珨绺斁', + ['Current Camp'] = '鐣跺墠闄g嚐', + ['Enable Only in Arena'] = '鍍呭湪鍚嶅妽澶ф渻涓暉鐢', + ['Enable Only in Dungeon'] = '鍍呭湪绉樺涓暉鐢', + ['Enable Only in Battlefield'] = '鍍呭湪鎴板牬涓暉鐢', + ['Text Offset Y'] = '鏂囧瓧楂樺害鍋忕Щ', + ['Text Line Height'] = '鏂囧瓧琛岄珮', + ['Text Scale'] = '鏂囧瓧绺斁', + ['Text Spacing'] = '鏂囧瓧闁撹窛', + ['Show Special NPC'] = '椤ず鐗规畩NPC', + ['Show Special NPC Only Enemy'] = '鍍呴’绀烘暤灏嶇壒娈奛PC', + ['Show Object ID'] = '椤ず灏嶈薄ID', + ['Show Object ID Only Unnamed'] = '鍍呴’绀虹劇鍚嶅皪璞D', + ['Show Kungfu'] = '椤ず蹇冩硶', + ['Show Distance'] = '椤ず璺濋洟', + ['Show Distance Only for Target'] = '鍍呴’绀虹洰妯欒窛闆', + ['Distance Decimal'] = '璺濋洟灏忔暩浣嶆暩', + ['Life Bar Width'] = '琛姊濆搴', + ['Life Bar Height'] = '琛姊濋珮搴', + ['Life Bar Padding'] = '琛姊濆収閭婅窛', + ['Life Bar Offset X'] = '琛姊濇按骞冲亸绉', + ['Life Bar Offset Y'] = '琛姊濊睅鐩村亸绉', + ['Life Bar Border'] = '琛姊濋倞妗', + ['Life Bar Border Red'] = '琛姊濋倞妗嗙磪鑹', + ['Life Bar Border Green'] = '琛姊濋倞妗嗙稜鑹', + ['Life Bar Border Blue'] = '琛姊濋倞妗嗚棈鑹', + ['Life Bar Direction'] = '琛姊濇柟鍚', + ['Life Percentage Offset X'] = '琛閲忕櫨鍒嗘瘮姘村钩鍋忕Щ', + ['Life Percentage Offset Y'] = '琛閲忕櫨鍒嗘瘮璞庣洿鍋忕Щ', + ['Title Effect Scale'] = '妯欒鏁堟灉绺斁', + ['Title Effect Offset Y'] = '妯欒鏁堟灉璞庣洿鍋忕Щ', + ['Balloon Offset Y'] = '闋爞娉℃场璞庣洿鍋忕Щ', + ['Alpha'] = '閫忔槑搴', + ['Font'] = '瀛楅珨', + ['Distance'] = '璺濋洟', + ['Vertical Distance'] = '鍨傜洿璺濋洟', + ['Hide Life Percentage When Fight'] = '鎴伴鏅傞毐钘忚閲忕櫨鍒嗘瘮', + ['Hide Life Percentage Decimal'] = '闅辫棌琛閲忕櫨鍒嗘瘮灏忔暩', + ['Global UI Scale'] = '鍏ㄥ眬鐣岄潰绺斁', + ['System UI Scale'] = '绯荤当鐣岄潰绺斁', + ['Show When UI Hide'] = '鐣岄潰闅辫棌鏅傞’绀', + ['Mine On Top'] = '缃爞鑷韩', + ['Target On Top'] = '缃爞鐩', + ['Screen Position Sort'] = '鎸夊睆骞曚綅缃帓搴', + ['Color Configuration'] = '椤忚壊閰嶇疆', + ['Show Name Configuration'] = '鍚嶅瓧椤ず閰嶇疆', + ['Show Tong Configuration'] = '骞渻椤ず閰嶇疆', + ['Show Title Configuration'] = '绋辫櫉椤ず閰嶇疆', + ['Show Life Configuration'] = '琛姊濋’绀洪厤缃', + ['Show Life Percentage Configuration'] = '琛閲忕櫨鍒嗘瘮椤ず閰嶇疆', + ['Show Balloon Configuration'] = '鑱婂ぉ娉℃场椤ず閰嶇疆', + ['Balloon Channel Configuration'] = '鑱婂ぉ娉℃场闋婚亾閰嶇疆', + + -- MY_LifeBar_ScreenArrow.lua -- + ['MY_LifeBar_ScreenArrow'] = '闋爞鍫辫', + ['Call Alert'] = '浣犺榛炲悕浜', + ['Draw School Color'] = '绻=闁娲鹃鑹', + ['UI scale'] = '鐣岄潰绺斁', + ['Text scale'] = '鏂囧瓧绺斁', + ['Less life/mana head alert'] = '鎴伴涓綆琛钘嶉牠闋傚牨璀', + ['Enable'] = '鍟熺敤', + ['[%s]'] = '銆%s銆', + ['While HP less than'] = '琛閲忎綆鏂', + ['While MP less than'] = '钘嶉噺浣庢柤', + ['Manually add (One per line)'] = '鎵嬪嫊娣诲姞BUFF鍚嶇ū锛堟瘡琛屼竴鍊嬶級', + ['Manually add Npc Name (One per line)'] = '鎵嬪嫊娣诲姞Npc鍚嶇ū锛堟瘡琛屼竴鍊嬶級', + ['Screen head alarm'] = '闋爞鍫辫', + ['Only monitor self'] = '鍍呯洠鎺ц嚜宸', + ['Preview'] = '闋愯', + ['PVE everyday, Xuanjing everyday!'] = '姣忓ぉ涓鍊嬫湰锛屽懆鍛ㄨ鐜勬櫠锛', +} diff --git a/MY_LifeBar/src/MY_LifeBar.PS.lua b/MY_LifeBar/src/MY_LifeBar.PS.lua new file mode 100644 index 000000000..7f458ef49 --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar.PS.lua @@ -0,0 +1,1037 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条设置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar.PS' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local Config = MY_LifeBar_Config +if not Config then + return +end + +local D = { + Reset = MY_LifeBar.Reset, + Repaint = MY_LifeBar.Repaint, + IsEnabled = MY_LifeBar.IsEnabled, + IsShielded = MY_LifeBar.IsShielded, + UpdateShadowHandleParam = MY_LifeBar.UpdateShadowHandleParam, +} + +local PS = { nPriority = 1, szRestriction = 'MY_LifeBar' } +local function LoadUI(ui) + ui:Children('#WndSlider_GlobalUIScale'):Value(Config.fGlobalUIScale * 100 * X.GetUIScale()) + ui:Children('#WndSlider_LifeBarWidth'):Value(Config.nLifeWidth) + ui:Children('#WndSlider_LifeBarHeight'):Value(Config.nLifeHeight) + ui:Children('#WndSlider_LifeBarOffsetX'):Value(Config.nLifeOffsetX) + ui:Children('#WndSlider_LifeBarOffsetY'):Value(Config.nLifeOffsetY) + ui:Children('#WndSlider_LifeBarPadding'):Value(Config.nLifePadding) + ui:Children('#WndSlider_LifeBarBorder'):Value(Config.nLifeBorder) + ui:Children('#Shadow_LifeBarBorderRGB'):Color(Config.nLifeBorderR, Config.nLifeBorderG, Config.nLifeBorderB) + ui:Children('#WndSlider_TextOffsetY'):Value(Config.nTextOffsetY) + ui:Children('#WndSlider_TextLineHeight'):Value(Config.nTextLineHeight) + ui:Children('#WndSlider_TextScale'):Value(Config.fTextScale * 40) + ui:Children('#WndSlider_TextSpacing'):Value(Config.fTextSpacing * 10) + ui:Children('#WndSlider_TitleEffectScale'):Value(Config.fTitleEffectScale * 100) + ui:Children('#WndSlider_TitleEffectOffsetY'):Value(Config.nTitleEffectOffsetY) + ui:Children('#WndSlider_BalloonOffsetY'):Value(Config.nBalloonOffsetY) + ui:Children('#WndSlider_LifePerOffsetX'):Value(Config.nLifePerOffsetX) + ui:Children('#WndSlider_LifePerOffsetY'):Value(Config.nLifePerOffsetY) + ui:Children('#WndSlider_Distance'):Value(math.sqrt(Config.nDistance) / 64) + ui:Children('#WndSlider_VerticalDistance'):Value(Config.nVerticalDistance / 8 / 64) + ui:Children('#WndSlider_Alpha'):Value(Config.nAlpha) + ui:Children('#WndCheckBox_IgnoreUIScale'):Check(not Config.bSystemUIScale) + ui:Children('#WndCheckBox_ShowWhenUIHide'):Check(Config.bShowWhenUIHide) + ui:Children('#WndCheckBox_ShowObjectID'):Check(Config.bShowObjectID) + ui:Children('#WndCheckBox_ShowObjectIDOnlyUnnamed'):Check(Config.bShowObjectIDOnlyUnnamed) + ui:Children('#WndCheckBox_ShowSpecialNpc'):Check(Config.bShowSpecialNpc) + ui:Children('#WndCheckBox_ShowSpecialNpcOnlyEnemy'):Check(Config.bShowSpecialNpcOnlyEnemy) + ui:Children('#WndCheckBox_ShowKungfu'):Check(Config.bShowKungfu) + ui:Children('#WndCheckBox_ShowDistance'):Check(Config.bShowDistance) + ui:Children('#WndCheckBox_ShowDistanceOnlyTarget'):Check(Config.bShowDistanceOnlyTarget) + ui:Children('#WndCheckBox_ScreenPosSort'):Check(Config.bScreenPosSort) + ui:Children('#WndCheckBox_MineOnTop'):Check(Config.bMineOnTop) + ui:Children('#WndCheckBox_TargetOnTop'):Check(Config.bTargetOnTop) +end +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 10, 10 + local nX, nY = nPaddingX, nPaddingY + local nLH = 40 + + -- 开启 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Enable'], + checked = MY_LifeBar.bEnabled, + onCheck = function(bChecked) + MY_LifeBar.bEnabled = bChecked + end, + tip = function() + if D.IsShielded() then + return _L['Can not use in shielded map!'] + end + end, + autoEnable = function() return not D.IsShielded() end, + }):AutoWidth():Width() + 5 + -- 加载旧版配置文件 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 120, h = 25, + buttonStyle = 'FLAT', + text = _L['Load ancient config'], + onClick = function() + GetUserInput(_L['Please input ancient config name:'], function(szText) + Config('load', szText) + X.Panel.SwitchTab('MY_LifeBar', true) + end, nil, nil, nil, 'common') + end, + autoEnable = function() return D.IsEnabled() end, + }):Width() + 5 + nX = nW - 490 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 155, text = _L['Auto hide system headtop'], + checked = MY_LifeBar.bAutoHideSysHeadtop, + onCheck = function(bChecked) + MY_LifeBar.bAutoHideSysHeadtop = bChecked + D.Reset(true) + end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 80, text = _L['Arena'], + checked = Config.bOnlyInArena, + onCheck = function(bChecked) + Config.bOnlyInArena = bChecked + D.Reset(true) + end, + tip = { + render = _L['Only enable in checked map types'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 70, text = _L['Battlefield'], + checked = Config.bOnlyInBattleField, + onCheck = function(bChecked) + Config.bOnlyInBattleField = bChecked + D.Reset(true) + end, + tip = { + render = _L['Only enable in checked map types'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 70, text = _L['Dungeon'], + checked = Config.bOnlyInDungeon, + onCheck = function(bChecked) + Config.bOnlyInDungeon = bChecked + D.Reset(true) + end, + tip = { + render = _L['Only enable in checked map types'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + 5 + nY = nY + nLH + --
+ ui:Append('Image', { + name = 'Image_Spliter', + x = 10, y = nY, w = nW - 20, h = 1, + image = 'UI/Image/UICommon/ScienceTreeNode.UITex|62', + }) + + nPaddingX, nPaddingY = 15, nY + 10 + nX, nY = nPaddingX + 15, nPaddingY + nLH = 23.6 + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarWidth', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 5, 150 }, + text = function(value) return _L('Lifebar width: %s px.', value) end, -- 血条宽度 + value = Config.nLifeWidth, + onChange = function(value) + Config.nLifeWidth = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarHeight', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 1, 150 }, + text = function(value) return _L('Lifebar height: %s px.', value) end, -- 血条高度 + value = Config.nLifeHeight, + onChange = function(value) + Config.nLifeHeight = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarOffsetX', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { -150, 150 }, + text = function(value) return _L('Lifebar offset-x: %d px.', value) end, -- 血条水平偏移 + value = Config.nLifeOffsetX, + onChange = function(value) + Config.nLifeOffsetX = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarOffsetY', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 150 }, + text = function(value) return _L('Lifebar offset-y: %d px.', value) end, -- 血条竖直偏移 + value = Config.nLifeOffsetY, + onChange = function(value) + Config.nLifeOffsetY = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarPadding', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 10 }, + text = function(value) return _L('Lifebar padding: %d px.', value) end, -- 血条边框宽度 + value = Config.nLifePadding, + onChange = function(value) + Config.nLifePadding = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifeBarBorder', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 10 }, + text = function(value) return _L('Lifebar border: %d px.', value) end, -- 血条边框宽度 + value = Config.nLifeBorder, + onChange = function(value) + Config.nLifeBorder = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifePerOffsetX', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { -150, 150 }, + text = function(value) return _L('Life percentage offset-x: %d px.', value) end, -- 血量百分比水平偏移 + value = Config.nLifePerOffsetX, + onChange = function(value) + Config.nLifePerOffsetX = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_LifePerOffsetY', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 150 }, + text = function(value) return _L('Life percentage offset-y: %d px.', value) end, -- 血量百分比竖直偏移 + value = Config.nLifePerOffsetY, + onChange = function(value) + Config.nLifePerOffsetY = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TextOffsetY', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 150 }, + text = function(value) return _L('Text offset-y: %d px.', value) end, -- 第一行字高度 + value = Config.nTextOffsetY, + onChange = function(value) + Config.nTextOffsetY = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TextLineHeight', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 150 }, + text = function(value) return _L('Text line height: %d px.', value) end, -- 字行高度 + value = Config.nTextLineHeight, + onChange = function(value) + Config.nTextLineHeight = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TextScale', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 200 }, + text = function(value) return _L('Text scale: %.1f%%.', value / 40 * 100) end, -- 字缩放 + value = Config.fTextScale * 40, + onChange = function(value) + Config.fTextScale = value / 40 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TextSpacing', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 300 }, + text = function(value) return _L('Text spacing: %.1f.', value / 10) end, -- 字间距 + value = Config.fTextSpacing * 10, + onChange = function(value) + Config.fTextSpacing = value / 10 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TitleEffectScale', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 200 }, + text = function(value) return _L('Title effect scale: %.2f%%.', value / 100) end, -- 头顶特效缩放 + value = Config.fTitleEffectScale * 100, + onChange = function(value) + Config.fTitleEffectScale = value / 100 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_TitleEffectOffsetY', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { -150, 150 }, + text = function(value) return _L('Title effect offset y: %d px.', value) end, -- 头顶特效间距 + value = Config.nTitleEffectOffsetY, + onChange = function(value) + Config.nTitleEffectOffsetY = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_BalloonOffsetY', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { -150, 150 }, + text = function(value) return _L('Balloon offset y: %d px.', value) end, -- 头顶特效间距 + value = Config.nBalloonOffsetY, + onChange = function(value) + Config.nBalloonOffsetY = value + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_Distance', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 300 }, + text = function(value) return value == 0 and _L['Max Distance: Unlimited.'] or _L('Max Distance: %s foot.', value) end, + value = math.sqrt(Config.nDistance) / 64, + onChange = function(value) + Config.nDistance = value * value * 64 * 64 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_VerticalDistance', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 300 }, + text = function(value) return value == 0 and _L['Max Vertical Distance: Unlimited.'] or _L('Max Vertical Distance: %s foot.', value) end, + value = Config.nVerticalDistance / 8 / 64, + onChange = function(value) + Config.nVerticalDistance = value * 8 * 64 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_Alpha', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_PERCENT, range = { 0, 255 }, + text = function(value) return _L('Alpha: %.0f%%.', value) end, -- 透明度 + value = Config.nAlpha, + onChange = function(value) + Config.nAlpha = value * 255 / 100 + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + ui:Append('WndSlider', { + name = 'WndSlider_GlobalUIScale', + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 1, 200 }, + text = function(value) return _L('Global UI scale: %.2f.', value / 100) end, -- 字缩放 + value = Config.fGlobalUIScale * 100 * X.GetUIScale(), + onChange = function(value) + Config.fGlobalUIScale = value / 100 / X.GetUIScale() + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 右半边 + nPaddingX = nW - 250 + nX, nY = nPaddingX, nPaddingY + nLH = 27 + + -- 颜色设置 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Color config'], + menu = function() + local t = {} + local tColor = Config.Color + -- 玩家颜色设置 + table.insert(t, { szOption = _L['Player color config'], bDisable = true } ) + for relation, cfg in pairs(tColor) do + if cfg.Player then + local opt = {} + opt.szOption = _L[relation] + opt.rgb = cfg.Player + opt.szIcon = 'ui/Image/button/CommonButton_1.UITex' + opt.nFrame = 69 + opt.nMouseOverFrame = 70 + opt.szLayer = 'ICON_RIGHT' + opt.fnClickIcon = function() + X.UI.OpenColorPicker(function(r, g, b) + cfg.Player = { r, g, b } + opt.rgb = cfg.Player + Config.Color = tColor + end) + end + table.insert(opt, { + szOption = _L['Unified force color'], + bCheck = true, bMCheck = true, + bChecked = not cfg.DifferentiateForce, + fnAction = function(_, r, g, b) + cfg.DifferentiateForce = false + Config.Color = tColor + end, + rgb = cfg.Player, + fnChangeColor = function(_, r, g, b) + cfg.Player = {r, g, b} + opt.rgb = cfg.Player + Config.Color = tColor + end, + }) + table.insert(opt, { + szOption = _L['Differentiate force color'], + bCheck = true, bMCheck = true, + bChecked = cfg.DifferentiateForce, + fnAction = function(_, r, g, b) + cfg.DifferentiateForce = true + Config.Color = tColor + end, + }) + table.insert(opt, { bDevide = true }) + for dwForceID, szForceTitle in pairs(g_tStrings.tForceTitle) do + table.insert(opt, { + szOption = szForceTitle, + rgb = cfg[dwForceID], + fnChangeColor = function(_, r, g, b) + cfg[dwForceID] = { r, g, b } + Config.Color = tColor + end, + fnDisable = function() + return not cfg.DifferentiateForce + end, + }) + end + table.insert(t, opt) + end + end + table.insert(t, { bDevide = true } ) + -- NCP颜色设置 + table.insert(t, { szOption = _L['Npc color config'], bDisable = true } ) + for relation, cfg in pairs(tColor) do + if cfg.Npc then + local opt = {} + opt.szOption = _L[relation] + opt.rgb = cfg.Npc + opt.szIcon = 'ui/Image/button/CommonButton_1.UITex' + opt.nFrame = 69 + opt.nMouseOverFrame = 70 + opt.szLayer = 'ICON_RIGHT' + opt.fnClickIcon = function() + X.UI.OpenColorPicker(function(r, g, b) + cfg.Npc = { r, g, b } + opt.rgb = cfg.Npc + Config.Color = tColor + end) + end + table.insert(t, opt) + end + end + return t + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + local function GeneBooleanPopupMenu(szKey, szPlayerTip, szNpcTip) + local t = {} + local tRelationCfg = Config[szKey] + if szPlayerTip then + table.insert(t, { szOption = szPlayerTip, bDisable = true } ) + for relation, cfg in pairs(tRelationCfg) do + if cfg.Player then + table.insert(t, { + szOption = _L[relation], + rgb = Config.Color[relation].Player, + bCheck = true, + bChecked = cfg.Player.bEnable, + fnAction = function() + cfg.Player.bEnable = not cfg.Player.bEnable + Config[szKey] = tRelationCfg + D.Reset() + end, + { + szOption = _L['Hide when unfight'], + bCheck = true, + bChecked = cfg.Player.bOnlyFighting, + fnAction = function() + cfg.Player.bOnlyFighting = not cfg.Player.bOnlyFighting + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Hide when full life'], + bCheck = true, + bChecked = cfg.Player.bHideFullLife, + fnAction = function() + cfg.Player.bHideFullLife = not cfg.Player.bHideFullLife + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Hide in dungeon'], + bCheck = true, + bChecked = cfg.Player.bHideInDungeon, + fnAction = function() + cfg.Player.bHideInDungeon = not cfg.Player.bHideInDungeon + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Only target'], + bCheck = true, + bChecked = cfg.Player.bOnlyTarget, + fnAction = function() + cfg.Player.bOnlyTarget = not cfg.Player.bOnlyTarget + Config[szKey] = tRelationCfg + end, + }, + }) + end + end + end + if szPlayerTip and szNpcTip then + table.insert(t, { bDevide = true }) + end + if szNpcTip then + table.insert(t, { szOption = szNpcTip, bDisable = true } ) + for relation, cfg in pairs(tRelationCfg) do + if cfg.Npc then + table.insert(t, { + szOption = _L[relation], + rgb = Config.Color[relation].Npc, + bCheck = true, + bChecked = cfg.Npc.bEnable, + fnAction = function() + cfg.Npc.bEnable = not cfg.Npc.bEnable + Config[szKey] = tRelationCfg + D.Reset() + end, + { + szOption = _L['Hide when unfight'], + bCheck = true, + bChecked = cfg.Npc.bOnlyFighting, + fnAction = function() + cfg.Npc.bOnlyFighting = not cfg.Npc.bOnlyFighting + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Hide when full life'], + bCheck = true, + bChecked = cfg.Npc.bHideFullLife, + fnAction = function() + cfg.Npc.bHideFullLife = not cfg.Npc.bHideFullLife + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Hide in dungeon'], + bCheck = true, + bChecked = cfg.Npc.bHideInDungeon, + fnAction = function() + cfg.Npc.bHideInDungeon = not cfg.Npc.bHideInDungeon + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Only target'], + bCheck = true, + bChecked = cfg.Npc.bOnlyTarget, + fnAction = function() + cfg.Npc.bOnlyTarget = not cfg.Npc.bOnlyTarget + Config[szKey] = tRelationCfg + end, + }, + { + szOption = _L['Hide pets'], + bCheck = true, + bChecked = cfg.Npc.bHidePets, + fnAction = function() + cfg.Npc.bHidePets = not cfg.Npc.bHidePets + Config[szKey] = tRelationCfg + end, + }, + }) + end + end + end + return t + end + + -- 显示名字 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Name display config'], + menu = function() + return GeneBooleanPopupMenu('ShowName', _L['Player name display'], _L['Npc name display']) + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 称号 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Title display config'], + menu = function() + return GeneBooleanPopupMenu('ShowTitle', _L['Player title display'], _L['Npc title display']) + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 帮会 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Tong display config'], + menu = function() + return GeneBooleanPopupMenu('ShowTong', _L['Player tong display']) + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 血条设置 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Lifebar display config'], + menu = function() + local t = GeneBooleanPopupMenu('ShowLife', _L['Player lifebar display'], _L['Npc lifebar display']) + table.insert(t, { bDevide = true }) + local t1 = { + szOption = _L['Draw direction'], + } + for _, szDirection in ipairs({ 'LEFT_RIGHT', 'RIGHT_LEFT', 'TOP_BOTTOM', 'BOTTOM_TOP' }) do + table.insert(t1, { + szOption = _L.DIRECTION[szDirection], + bCheck = true, bMCheck = true, + bChecked = Config.szLifeDirection == szDirection, + fnAction = function() + Config.szLifeDirection = szDirection + end, + }) + end + table.insert(t, t1) + return t + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 显示血量% + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Lifepercentage display config'], + menu = function() + local t = GeneBooleanPopupMenu('ShowLifePer', _L['Player lifepercentage display'], _L['Npc lifepercentage display']) + table.insert(t, { bDevide = true }) + table.insert(t, { + szOption = _L['Hide decimal'], + bCheck = true, + bChecked = Config.bHideLifePercentageDecimal, + fnAction = function() + Config.bHideLifePercentageDecimal = not Config.bHideLifePercentageDecimal + end, + }) + return t + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 显示对话泡泡 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Balloon display config'], + menu = function() + local t = {} + local tShowBalloon = Config.ShowBalloon + table.insert(t, { szOption = _L['Player balloon display'], bDisable = true } ) + for relation, cfg in pairs(tShowBalloon) do + if cfg.Player then + table.insert(t, { + szOption = _L[relation], + rgb = Config.Color[relation].Player, + bCheck = true, + bChecked = cfg.Player.bEnable, + fnAction = function() + cfg.Player.bEnable = not cfg.Player.bEnable + Config.ShowBalloon = tShowBalloon + D.Reset() + end, + }) + end + end + table.insert(t, { bDevide = true }) + table.insert(t, { szOption = _L['Npc balloon display'], bDisable = true } ) + for relation, cfg in pairs(tShowBalloon) do + if cfg.Npc then + table.insert(t, { + szOption = _L[relation], + rgb = Config.Color[relation].Npc, + bCheck = true, + bChecked = cfg.Npc.bEnable, + fnAction = function() + cfg.Npc.bEnable = not cfg.Npc.bEnable + Config.ShowBalloon = tShowBalloon + D.Reset() + end, + }) + end + end + table.insert(t, { bDevide = true }) + local tBalloonChannel = Config.BalloonChannel + table.insert(t, { szOption = _L['Balloon channel config'], bDisable = true } ) + for szMsgType, cfg in pairs(tBalloonChannel) do + if g_tStrings.tChannelName[szMsgType] then + local t1 = { + szOption = _L['Balloon display time'], + fnDisable = function() return not cfg.bEnable end, + } + for _, nDuring in ipairs({ 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 15000, 20000 }) do + table.insert(t1, { + szOption = nDuring .. 'ms', + bCheck = true, bMCheck = true, + bChecked = cfg.nDuring == nDuring, + fnAction = function() + cfg.nDuring = nDuring + Config.BalloonChannel = tBalloonChannel + D.Reset() + end, + fnDisable = function() return not cfg.bEnable end, + }) + end + table.insert(t, { + szOption = g_tStrings.tChannelName[szMsgType], + rgb = GetMsgFontColor(szMsgType, true), + bCheck = true, bChecked = cfg.bEnable, + fnAction = function() + cfg.bEnable = not cfg.bEnable + Config.BalloonChannel = tBalloonChannel + D.Reset() + end, + t1, + }) + end + end + return t + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + -- 当前阵营 + ui:Append('WndComboBox', { + x = nX, y = nY, w = 220, text = _L['Set current camp'], + menu = function() + return {{ + szOption = _L['Auto detect'], + bCheck = true, bMCheck = true, + bChecked = Config.nCamp == -1, + fnAction = function() + Config.nCamp = -1 + end, + }, { + szOption = g_tStrings.STR_CAMP_TITLE[CAMP.GOOD], + bCheck = true, bMCheck = true, + bChecked = Config.nCamp == CAMP.GOOD, + fnAction = function() + Config.nCamp = CAMP.GOOD + end, + }, { + szOption = g_tStrings.STR_CAMP_TITLE[CAMP.EVIL], + bCheck = true, bMCheck = true, + bChecked = Config.nCamp == CAMP.EVIL, + fnAction = function() + Config.nCamp = CAMP.EVIL + end, + }, { + szOption = g_tStrings.STR_CAMP_TITLE[CAMP.NEUTRAL], + bCheck = true, bMCheck = true, + bChecked = Config.nCamp == CAMP.NEUTRAL, + fnAction = function() + Config.nCamp = CAMP.NEUTRAL + end, + }} + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + nLH = 36 + + ui:Append('Shadow', { + name = 'Shadow_LifeBarBorderRGB', -- 血条边框颜色 + x = nX + 4, y = nY + 6, + r = Config.nLifeBorderR, + g = Config.nLifeBorderG, + b = Config.nLifeBorderB, + onClick = function() + local this = this + X.UI.OpenColorPicker(function(r, g, b) + Config.nLifeBorderR = r + Config.nLifeBorderG = g + Config.nLifeBorderB = b + X.UI(this):Color(r, g, b) + end) + end, + autoEnable = function() return D.IsEnabled() end, + }) + ui:Append('Text', { text = _L['Lifebar border color'], x = nX + 25, y = nY + 2 }) + + nX = nPaddingX + nY = nY + nLH - 10 + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_IgnoreUIScale', + x = nX, y = nY, text = _L['Ignore ui scale'], + checked = not Config.bSystemUIScale, + onCheck = function(bChecked) + Config.bSystemUIScale = not bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + + nX = nPaddingX + nY = nY + nLH - 10 + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowWhenUIHide', + x = nX, y = nY, text = _L['Show when ui hide'], + checked = Config.bShowWhenUIHide, + onCheck = function(bChecked) + Config.bShowWhenUIHide = bChecked + D.UpdateShadowHandleParam() + end, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + + nX = nPaddingX + nY = nY + nLH - 10 + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowObjectID', + x = nX, y = nY, text = _L['Show object id'], + checked = Config.bShowObjectID, + onCheck = function(bChecked) + Config.bShowObjectID = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowObjectIDOnlyUnnamed', + x = nX, y = nY, text = _L['Only unnamed'], + checked = Config.bShowObjectIDOnlyUnnamed, + onCheck = function(bChecked) + Config.bShowObjectIDOnlyUnnamed = bChecked + end, + autoEnable = function() return D.IsEnabled() and Config.bShowObjectID end, + }):AutoWidth():Width() + + if not X.IsRestricted('MY_LifeBar.SpecialNpc') then + nX = nPaddingX + nY = nY + nLH - 10 + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowSpecialNpc', + x = nX, y = nY, text = _L['Show special npc'], + checked = Config.bShowSpecialNpc, + onCheck = function(bChecked) + Config.bShowSpecialNpc = bChecked + D.Reset() + end, + tip = { + render = _L['This function has been shielded by official except in dungeon'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return D.IsEnabled() end, + }):AutoWidth():Width() + 5 + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowSpecialNpcOnlyEnemy', + x = nX, y = nY, w = 'auto', + text = _L['Only enemy'], + checked = Config.bShowSpecialNpcOnlyEnemy, + onCheck = function(bChecked) + Config.bShowSpecialNpcOnlyEnemy = bChecked + D.Reset() + end, + tip = { + render = _L['This function has been shielded by official except in dungeon'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + autoEnable = function() return D.IsEnabled() and Config.bShowSpecialNpc end, + }) + end + + nX = nPaddingX + nY = nY + nLH - 10 + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowKungfu', + x = nX, y = nY, w = 'auto', + text = _L['Show kungfu'], + checked = Config.bShowKungfu, + onCheck = function(bChecked) + Config.bShowKungfu = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }) + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ShowDistance', + x = nX + 90, y = nY, w = 'auto', + text = _L['Show distance'], + checked = Config.bShowDistance, + onCheck = function(bChecked) + Config.bShowDistance = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }) + + ui:Append('WndButton', { + x = nX + 180, y = nY, w = 25, h = 25, + buttonStyle = 'OPTION', + menu = function() + local m = { szOption = _L['Decimal number'] } + for i = 0, 2 do + table.insert(m, { + szOption = i, + bCheck = true, bMCheck = true, + bChecked = Config.nDistanceDecimal == i, + fnAction = function() + Config.nDistanceDecimal = i + D.Reset() + end, + }) + end + return { + m, + { + szOption = _L['Show distance only target'], + bCheck = true, bChecked = Config.bShowDistanceOnlyTarget, + fnAction = function() + Config.bShowDistanceOnlyTarget = not Config.bShowDistanceOnlyTarget + end, + }, + } + end, + autoEnable = function() return D.IsEnabled() end, + }) + + nY = nY + nLH - 10 + ui:Append('WndCheckBox', { + name = 'WndCheckBox_ScreenPosSort', + x = nX, y = nY, w = 'auto', + text = _L['Sort by screen pos'], + checked = Config.bScreenPosSort, + onCheck = function(bChecked) + Config.bScreenPosSort = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }) + + nY = nY + nLH - 10 + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_MineOnTop', + x = nX, y = nY, w = 'auto', + text = _L['Self always on top'], + checked = Config.bMineOnTop, + onCheck = function(bChecked) + Config.bMineOnTop = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + name = 'WndCheckBox_TargetOnTop', + x = nX, y = nY, w = 'auto', + text = _L['Target always on top'], + checked = Config.bTargetOnTop, + onCheck = function(bChecked) + Config.bTargetOnTop = bChecked + end, + autoEnable = function() return D.IsEnabled() end, + }):Width() + 5 + + nX = nPaddingX + + nY = nY + nLH - 5 + ui:Append('WndButton', { + x = nX, y = nY, w = 65, + text = _L['Font'], + onClick = function() + X.UI.OpenFontPicker(function(nFont) + Config.nFont = nFont + end) + end, + autoEnable = function() return D.IsEnabled() end, + }) + + ui:Append('WndButton', { + x = nX + 65, y = nY, w = 125, text = _L['Reset config'], + onClick = function() + Config('reset') + end, + autoEnable = function() return D.IsEnabled() end, + }) + nY = nY + nLH + + local function onReset() + LoadUI(ui) + end + X.RegisterEvent('MY_LIFEBAR_CONFIG_LOADED', 'MY_LifeBarPS', onReset) + X.RegisterEvent('MY_LIFEBAR_CONFIG_UPDATE', 'MY_LifeBarPS', onReset) +end + +function PS.OnPanelDeactive() + X.RegisterEvent('MY_LIFEBAR_CONFIG_LOADED', 'MY_LifeBarPS') + X.RegisterEvent('MY_LIFEBAR_CONFIG_UPDATE', 'MY_LifeBarPS') +end +X.Panel.Register(_L['General'], 'MY_LifeBar', _L['MY_LifeBar'], 2148, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar.lua b/MY_LifeBar/src/MY_LifeBar.lua new file mode 100644 index 000000000..c683d3495 --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar.lua @@ -0,0 +1,987 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_LifeBar', { ['*'] = true }) +X.RegisterRestriction('MY_LifeBar.MapRestriction', { ['*'] = true }) +X.RegisterRestriction('MY_LifeBar.SpecialNpc', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------------- + +local Config = MY_LifeBar_Config +if not Config then + return +end + +local GetConfigValue, GetConfigComputeValue +do +local cfg, value, bInDungeon +function GetConfigValue(key, relation, force) + cfg, value = Config[key][relation], nil + if force == 'Npc' or force == 'Player' then + value = cfg[force] + else + if cfg.DifferentiateForce then + value = cfg[force] + end + if value == nil then + value = Config[key][relation]['Player'] + end + end + return value +end +function GetConfigComputeValue(key, relation, force, bFight, bPet, bCurrentTarget, bFullLife) + cfg = GetConfigValue(key, relation, force) + if not cfg then + return false + end + if not cfg.bEnable then + return false + end + if cfg.bOnlyFighting and not bFight then + return false + end + if cfg.bHideFullLife and bFullLife then + return false + end + if cfg.bHidePets and bPet then + return false + end + if cfg.bHideInDungeon and bInDungeon then + return false + end + if cfg.bOnlyTarget and not bCurrentTarget then + return false + end + return true +end +X.RegisterEvent('LOADING_ENDING', 'MY_LifeBar__GetConfigComputeValue', function() + bInDungeon = X.IsInDungeonMap() +end) +end +----------------------------------------------------------------------------------------- + +local NPC_HIDDEN = X.CONSTANT.NPC_HIDDEN +local LB_CACHE = {} +local TONG_NAME_CACHE = {} +local NPC_CACHE = {} +local PLAYER_CACHE = {} +local COUNTDOWN_CACHE = {} +local LAST_FIGHT_STATE = false +local SYS_HEAD_TOP_STATE +local LB = MY_LifeBar_LB +local CHANGGE_REAL_SHADOW_TPLID = 46140 -- 清绝歌影 的主体影子 +local OBJECT_SCREEN_POS_Y_CACHE = {} +local OBJECT_TITLE_EFFECT, OVERWRITE_TITLE_EFFECT = {}, {} +local DRAW_TARGET_TYPE, DRAW_TARGET_ID, LB_ADJUST_INDEX_ID = TARGET.PLAYER, nil, nil +do -- 头顶特效数据刷新 +local QUEST_TITLE_EFFECT = { + ['normal_unaccept_proper'] = 1, + ['repeat_unaccept_proper'] = 2, + ['activity_unaccept_proper'] = 45, + ['unaccept_high'] = 5, + ['unaccept_low'] = 6, + ['unaccept_lower'] = 43, + ['accpeted'] = 44, + ['normal_finished'] = 3, + ['repeat_finished'] = 4, + ['activity_finished'] = 46, + ['normal_notneedaccept'] = 44, + ['repeat_notneedaccept'] = 4, + ['activity_notneedaccept'] = 46, + ['lishijie_unaccept'] = 55, + ['lishijie_finished'] = 54, +} +local function UpdateTitleEffect(dwType, dwID) + local nEffectID = nil + if dwType == TARGET.PLAYER then + local nMark = X.GetCharacterTeamMark(dwID) + if nMark and PARTY_TITLE_MARK_EFFECT_LIST[nMark] then + nEffectID = PARTY_TITLE_MARK_EFFECT_LIST[nMark] + end + elseif dwType == TARGET.NPC then + local npc = X.GetNpc(dwID) + if npc then + local aQuestState = GetNpcQuestState(npc) or {} + if aQuestState.normal_finished_proper or aQuestState.normal_finished_high or aQuestState.normal_finished_higher + or aQuestState.normal_finished_low or aQuestState.normal_finished_lower or aQuestState.repeat_finished_proper + or aQuestState.repeat_finished_high or aQuestState.repeat_finished_higher or aQuestState.repeat_finished_low + or aQuestState.repeat_finished_lower or aQuestState.activity_finished_proper or aQuestState.activity_finished_high + or aQuestState.activity_finished_higher or aQuestState.activity_finished_low or aQuestState.activity_finished_lower then + nEffectID = QUEST_TITLE_EFFECT.normal_finished + elseif aQuestState.activity_unaccept_proper then + nEffectID = QUEST_TITLE_EFFECT.activity_unaccept_proper + elseif aQuestState.normal_unaccept_proper then + nEffectID = QUEST_TITLE_EFFECT.normal_unaccept_proper + elseif aQuestState.repeat_unaccept_proper then + nEffectID = QUEST_TITLE_EFFECT.repeat_unaccept_proper + elseif aQuestState.activity_notneedaccept_proper or aQuestState.activity_notneedaccept_low or aQuestState.activity_notneedaccept_lower + or aQuestState.activity_notneedaccept_high or aQuestState.activity_notneedaccept_higher then + nEffectID = QUEST_TITLE_EFFECT.activity_notneedaccept + elseif aQuestState.repeat_notneedaccept_proper or aQuestState.repeat_notneedaccept_low or aQuestState.repeat_notneedaccept_lower + or aQuestState.repeat_notneedaccept_high or aQuestState.repeat_notneedaccept_higher then + nEffectID = QUEST_TITLE_EFFECT.repeat_notneedaccept + elseif aQuestState.normal_notneedaccept_proper then + -- or aQuestState.normal_notneedaccept_low or aQuestState.normal_notneedaccept_lower + -- or aQuestState.normal_notneedaccept_high or aQuestState.normal_notneedaccept_higher + nEffectID = QUEST_TITLE_EFFECT.normal_notneedaccept + elseif X.GetCharacterTeamMark(dwID) and PARTY_TITLE_MARK_EFFECT_LIST[X.GetCharacterTeamMark(dwID)] then -- party mark + nEffectID = PARTY_TITLE_MARK_EFFECT_LIST[X.GetCharacterTeamMark(dwID)] + elseif aQuestState.normal_unaccept_high or aQuestState.repeat_unaccept_high or aQuestState.activity_unaccept_high then + nEffectID = QUEST_TITLE_EFFECT.unaccept_high + elseif aQuestState.normal_unaccept_low or aQuestState.repeat_unaccept_low or aQuestState.activity_unaccept_low then + nEffectID = QUEST_TITLE_EFFECT.unaccept_low + elseif aQuestState.normal_unaccept_lower or aQuestState.repeat_unaccept_lower or aQuestState.activity_unaccept_lower then + nEffectID = QUEST_TITLE_EFFECT.unaccept_lower + elseif aQuestState.normal_accepted_proper or aQuestState.normal_accepted_low + or aQuestState.normal_accepted_lower or aQuestState.normal_accepted_high -- or aQuestState.normal_accepted_higher + or aQuestState.repeat_accepted_proper or aQuestState.repeat_accepted_high -- or aQuestState.repeat_accepted_higher + or aQuestState.repeat_accepted_low or aQuestState.repeat_accepted_lower or aQuestState.activity_accepted_proper + or aQuestState.activity_accepted_low or aQuestState.activity_accepted_lower or aQuestState.activity_accepted_high then + nEffectID = QUEST_TITLE_EFFECT.accpeted + end + end + end + OBJECT_TITLE_EFFECT[dwID] = nEffectID and X.GetGlobalEffect(nEffectID) + OVERWRITE_TITLE_EFFECT[dwID] = not OBJECT_TITLE_EFFECT[dwID] -- 强刷系统头顶 +end +local function onPlayerStateUpdate() + UpdateTitleEffect(TARGET.PLAYER, arg0) +end +X.RegisterEvent('PLAYER_STATE_UPDATE', 'MY_LifeBar', onPlayerStateUpdate) + +local function onNpcQuestMarkUpdate() + UpdateTitleEffect(TARGET.NPC, arg0) +end +X.RegisterEvent('QUEST_MARK_UPDATE', 'MY_LifeBar', onNpcQuestMarkUpdate) +X.RegisterEvent('NPC_DISPLAY_DATA_UPDATE', 'MY_LifeBar', onNpcQuestMarkUpdate) + +local function onNpcQuestMarkUpdateAll() + for _, dwID in ipairs(X.GetNearNpcID()) do + UpdateTitleEffect(TARGET.NPC, dwID) + end +end +X.RegisterEvent('LEAVE_STORY_MODE', 'MY_LifeBar', onNpcQuestMarkUpdateAll) +X.RegisterInit('MY_LifeBar_onNpcQuestMarkUpdateAll', onNpcQuestMarkUpdateAll) + +local function onPartySetMark() + local tID = {} + for dwID, _ in pairs(OBJECT_TITLE_EFFECT) do + tID[dwID] = true + end + for dwID, _ in pairs(GetClientTeam().GetTeamMark() or {}) do + tID[dwID] = true + end + for dwID, _ in pairs(tID) do + UpdateTitleEffect(X.IsPlayer(dwID) and TARGET.PLAYER or TARGET.NPC, dwID) + end + OVERWRITE_TITLE_EFFECT = {} +end +X.RegisterInit('MY_LifeBar_onPartySetMark', onPartySetMark) +X.RegisterEvent('PARTY_SET_MARK', 'MY_LifeBar', onPartySetMark) +X.RegisterEvent('PARTY_DELETE_MEMBER', 'MY_LifeBar', function() + local me = X.GetClientPlayer() + if me.dwID == arg1 then + onPartySetMark() + end +end) +X.RegisterEvent('PARTY_DISBAND', 'MY_LifeBar', onPartySetMark) +X.RegisterEvent('PARTY_UPDATE_BASE_INFO', 'MY_LifeBar', onPartySetMark) + +local function onLoadingEnd() + OVERWRITE_TITLE_EFFECT = {} +end +X.RegisterEvent('LOADING_END', onLoadingEnd) +end + +local O = X.CreateUserSettingsModule('MY_LifeBar', _L['General'], { + bEnabled = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['Enable'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoHideSysHeadtop = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['Auto hide system headtop'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.IsShielded() + if X.IsRestricted('MY_LifeBar') then + return true + end + return X.IsRestricted('MY_LifeBar.MapRestriction') and X.IsInShieldedMap() +end + +function D.IsEnabled() + return D.bReady and O.bEnabled and not D.IsShielded() +end + +function D.IsMapEnabled() + return D.IsEnabled() and ( + not ( + Config.bOnlyInDungeon or + Config.bOnlyInArena or + Config.bOnlyInBattleField + ) or ( + (Config.bOnlyInDungeon and X.IsInDungeonMap()) or + (Config.bOnlyInArena and X.IsInArenaMap()) or + (Config.bOnlyInBattleField and (X.IsInBattlefieldMap() or X.IsInPubgMap() or X.IsInZombieMap())) + ) + ) +end + +function D.GetNz(nZ,nZ2) + return math.floor(((nZ/8 - nZ2/8) ^ 2) ^ 0.5)/64 +end + +function D.GetRelation(dwSrcID, dwTarID, KSrc, KTar) + if Config.nCamp == -1 or not X.IsPlayer(dwTarID) then + return X.GetCharacterRelation(dwSrcID, dwTarID) + else + if not KTar then + return 'Neutrality' + elseif dwTarID == dwSrcID then + return 'Self' + elseif IsParty(dwSrcID, dwTarID) then + return 'Party' + elseif X.IsFoe(dwTarID) then + return 'Foe' + elseif KTar.nCamp == Config.nCamp then + return 'Ally' + elseif not KTar.bCampFlag -- 没开阵营 + or KTar.nCamp == CAMP.NEUTRAL -- 目标中立 + or Config.nCamp == CAMP.NEUTRAL -- 自己中立 + or KSrc.GetScene().nCampType == MAP_CAMP_TYPE.ALL_PROTECT then -- 停战地图 + return 'Neutrality' + else + return 'Enemy' + end + end +end + +function D.GetForce(dwType, dwID, KObject) + if dwType == TARGET.PLAYER then + return KObject and KObject.dwForceID or 0 + else + return 'Npc' + end +end + +function D.GetTongName(dwTongID) + if not X.IsNumber(dwTongID) or dwTongID == 0 then + return + end + if not TONG_NAME_CACHE[dwTongID] then + TONG_NAME_CACHE[dwTongID] = X.GetTongName(dwTongID) + end + if TONG_NAME_CACHE[dwTongID] then + return TONG_NAME_CACHE[dwTongID] + end +end + +function D.AutoSwitchSysHeadTop() + if not Config('loaded') then + return + end + if D.bReady and Config.eCss == '' and D.IsMapEnabled() then + Config('reset') + end + if D.bReady and O.bAutoHideSysHeadtop and D.IsMapEnabled() then + D.SaveSysHeadTop() + D.HideSysHeadTop() + else + D.ResumeSysHeadTop() + end +end +function D.HideSysHeadTop() + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC, X.CONSTANT.GLOBAL_HEAD.NAME , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC, X.CONSTANT.GLOBAL_HEAD.TITLE, false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC, X.CONSTANT.GLOBAL_HEAD.LIFE , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.TITLE, false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.LIFE , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.TITLE, false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.LIFE , false) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, false) + X.SafeCall(_G.SetGlobalTopIntelligenceLife, false) + X.SafeCall(_G.Addon_ShowNpcBalloon, false) + X.SafeCall(_G.Addon_ShowPlayerBalloon, false) +end +function D.SaveSysHeadTop() + if SYS_HEAD_TOP_STATE then + return + end + SYS_HEAD_TOP_STATE = { + ['NPC_NAME' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.NAME ), + ['NPC_TITLE' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.TITLE), + ['NPC_LIFE' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.LIFE ), + ['OTHERPLAYER_NAME' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.NAME ), + ['OTHERPLAYER_TITLE' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.TITLE), + ['OTHERPLAYER_LIFE' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.LIFE ), + ['OTHERPLAYER_GUILD' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.GUILD), + ['CLIENTPLAYER_NAME' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME ), + ['CLIENTPLAYER_TITLE'] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.TITLE), + ['CLIENTPLAYER_LIFE' ] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.LIFE ), + ['CLIENTPLAYER_GUILD'] = GetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD), + ['INTELLIGENCE_LIFE' ] = select(2, X.SafeCall(_G.GetGlobalTopIntelligenceLife)), + ['NPC_BALLOON' ] = select(2, X.SafeCall(_G.Addon_IsNpcBalloon)), + ['PLAYER_BALLOON' ] = select(2, X.SafeCall(_G.Addon_IsPlayerBalloon)), + } +end +function D.ResumeSysHeadTop() + if not SYS_HEAD_TOP_STATE then + return + end + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.NAME , SYS_HEAD_TOP_STATE['NPC_NAME']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.TITLE, SYS_HEAD_TOP_STATE['NPC_TITLE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.NPC , X.CONSTANT.GLOBAL_HEAD.LIFE , SYS_HEAD_TOP_STATE['NPC_LIFE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.NAME , SYS_HEAD_TOP_STATE['OTHERPLAYER_NAME']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.TITLE, SYS_HEAD_TOP_STATE['OTHERPLAYER_TITLE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.LIFE , SYS_HEAD_TOP_STATE['OTHERPLAYER_LIFE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.OTHERPLAYER , X.CONSTANT.GLOBAL_HEAD.GUILD, SYS_HEAD_TOP_STATE['OTHERPLAYER_GUILD']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.NAME , SYS_HEAD_TOP_STATE['CLIENTPLAYER_NAME']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.TITLE, SYS_HEAD_TOP_STATE['CLIENTPLAYER_TITLE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.LIFE , SYS_HEAD_TOP_STATE['CLIENTPLAYER_LIFE']) + SetGlobalTopHeadFlag(X.CONSTANT.GLOBAL_HEAD.CLIENTPLAYER, X.CONSTANT.GLOBAL_HEAD.GUILD, SYS_HEAD_TOP_STATE['CLIENTPLAYER_GUILD']) + X.SafeCall(_G.SetGlobalTopIntelligenceLife, SYS_HEAD_TOP_STATE['INTELLIGENCE_LIFE']) + X.SafeCall(_G.Addon_ShowNpcBalloon, SYS_HEAD_TOP_STATE['NPC_BALLOON']) + X.SafeCall(_G.Addon_ShowPlayerBalloon, SYS_HEAD_TOP_STATE['PLAYER_BALLOON']) + SYS_HEAD_TOP_STATE = nil +end + +function D.Repaint() + for _, lb in pairs(LB_CACHE) do + lb:Paint(true) + end +end +X.RegisterEvent('UI_SCALED', D.Repaint) + +function D.UpdateShadowHandleParam() + local sh = X.UI.GetShadowHandle('MY_LifeBar') + if not sh then + return + end + if Config.bShowWhenUIHide then + sh:ShowWhenUIHide() + else + sh:HideWhenUIHide() + end +end + +function D.Reset() + if not D.bUserPreferencesReady then + return + end + -- 重置缓存 + LB_CACHE = {} + LB('clear') + D.UpdateShadowHandleParam() + -- 恢复官方标记 + for dwID, _ in pairs(OVERWRITE_TITLE_EFFECT) do + if OBJECT_TITLE_EFFECT[dwID] then + SceneObject_SetTitleEffect(X.IsPlayer(dwID) and TARGET.PLAYER or TARGET.NPC, dwID, OBJECT_TITLE_EFFECT[dwID].nID) + end + end + OVERWRITE_TITLE_EFFECT = {} + -- 自适应遮挡顺序 + if D.bReady and O.bEnabled and Config.bScreenPosSort then + local dwLastID, nCount + local function onGetCharacterTopScreenPos(dwID, xScreen, yScreen) + OBJECT_SCREEN_POS_Y_CACHE[dwID] = yScreen or 0 + end + local function onBreathe() + nCount = 0 + repeat + if LB_ADJUST_INDEX_ID and LB_CACHE[LB_ADJUST_INDEX_ID] == nil then + LB_ADJUST_INDEX_ID = nil + end + LB_ADJUST_INDEX_ID = next(LB_CACHE, LB_ADJUST_INDEX_ID) + if LB_ADJUST_INDEX_ID then + PostThreadCall(onGetCharacterTopScreenPos, LB_ADJUST_INDEX_ID, 'Scene_GetCharacterTopScreenPos', LB_ADJUST_INDEX_ID) + end + nCount = nCount + 1 + until nCount > 30 or LB_ADJUST_INDEX_ID == dwLastID + dwLastID = LB_ADJUST_INDEX_ID + end + X.BreatheCall('MY_LifeBar_ScreenPosSort', onBreathe) + else + X.BreatheCall('MY_LifeBar_ScreenPosSort', false) + end + D.AutoSwitchSysHeadTop() +end +X.RegisterEvent('MY_LIFEBAR_CONFIG_LOADED', D.Reset) +X.RegisterEvent('LOADING_END', D.AutoSwitchSysHeadTop) +X.RegisterEvent('MY_RESTRICTION', D.Reset) +X.RegisterEvent('COINSHOP_ON_CLOSE', D.AutoSwitchSysHeadTop) + +do +local CheckInvalidRect +do +local bRestrictedVersion = X.IsRestricted('MY_LifeBar.SpecialNpc') +X.RegisterEvent('MY_RESTRICTION', function() + if arg0 and arg0 ~= 'MY_LifeBar.SpecialNpc' then + return + end + bRestrictedVersion = X.IsRestricted('MY_LifeBar.SpecialNpc') +end) +local function fxTarget(r, g, b, a) return 255 - (255 - r) * 0.3, 255 - (255 - g) * 0.3, 255 - (255 - b) * 0.3, a end +local function fxDeath(r, g, b, a) return math.ceil(r * 0.4), math.ceil(g * 0.4), math.ceil(b * 0.4), a end +local function fxDeathTarget(r, g, b, a) return math.ceil(r * 0.45), math.ceil(g * 0.45), math.ceil(b * 0.45), a end +local lb, info, bVisible, bFight, nDisX, nDisY, nDisZ, fTextScale, dwTarType, dwTarID, relation, force, nPriority, szName, szTongName, r, g, b +local aCountDown, szCountDown, bPet, bShowName, bShowKungfu, kunfu, bShowTong, bShowTitle, bShowLife, bShowLifePercent, tEffect, fCurrentLife, fMaxLife +local bSpecialNpcVisible, bShowDistance, bCurrentTarget, bFullLife +local function IsSpecialNpcVisible(dwID, me, object) + if not X.IsBoolean(bSpecialNpcVisible) then + bSpecialNpcVisible = false + if object.dwTemplateID == CHANGGE_REAL_SHADOW_TPLID and (not bRestrictedVersion or not IsEnemy(me.dwID, dwID)) then + bSpecialNpcVisible = true + elseif not bRestrictedVersion + and Config.bShowSpecialNpc and (not bRestrictedVersion or X.IsInDungeonMap()) + and (not Config.bShowSpecialNpcOnlyEnemy or IsEnemy(me.dwID, dwID)) then + bSpecialNpcVisible = true + end + end + return bSpecialNpcVisible +end +function CheckInvalidRect(dwType, dwID, me, object) + lb = LB_CACHE[dwID] + info = dwType == TARGET.PLAYER and me.IsPlayerInMyParty(dwID) and GetClientTeam().GetMemberInfo(dwID) or nil + if not object then + if lb then + lb:Remove() + LB_CACHE[dwID] = nil + end + return + end + bVisible = true + bSpecialNpcVisible = nil + bCurrentTarget = dwID == dwTarID + -- 显示标记判断 + if bVisible and (dwType == TARGET.NPC or dwType == TARGET.PLAYER) and X.IsCharacterIsolated(me) ~= X.IsCharacterIsolated(object) then + bVisible = false + end + -- 距离判断 + if bVisible and Config.nDistance > 0 then + nDisX, nDisY, nDisZ = me.nX - object.nX, me.nY - object.nY, (me.nZ - object.nZ) * 0.125 + bVisible = nDisX * nDisX + nDisY * nDisY + nDisZ * nDisZ < Config.nDistance + end + -- 高度差判断 + if bVisible and Config.nVerticalDistance > 0 then + bVisible = me.nZ - object.nZ < Config.nVerticalDistance + end + -- 这是镜头补偿判断 但是不好用先不加 + -- if bVisible then + -- bVisible = fPitch > -0.8 or D.GetNz(me.nZ,object.nZ) < Config.nDistance / 2.5 + -- end + if bVisible and dwType == TARGET.NPC and NPC_HIDDEN[object.dwTemplateID] then + bVisible = false + end + if bVisible then + if not lb then + -- 创建和设置不会改变的东西 + lb = LB(dwType, dwID) + lb:SetDistanceFmt('%.' .. Config.nDistanceDecimal .. 'f' .. g_tStrings.STR_METER) + lb:SetDistance(0) + LB_CACHE[dwID] = lb + end + bFight = X.IsFighting() + fTextScale = Config.fTextScale + dwTarType, dwTarID = me.GetTarget() + relation = D.GetRelation(me.dwID, dwID, me, object) + force = D.GetForce(dwType, dwID, object) + fCurrentLife, fMaxLife = X.GetCharacterLife(info) + bFullLife = fCurrentLife == fMaxLife + nPriority = OBJECT_SCREEN_POS_Y_CACHE[dwID] or 0 -- 默认根据屏幕坐标排序 + if Config.bMineOnTop and dwType == TARGET.PLAYER and dwID == me.dwID then -- 自身永远最前 + nPriority = nPriority + 20000 + end + if Config.bTargetOnTop and bCurrentTarget then -- 目标永远最前 + nPriority = nPriority + 10000 + end + szName = X.GetTargetName(dwType, dwID, { + eShowID = Config.bShowObjectID and (Config.bShowObjectIDOnlyUnnamed and 'auto' or 'always') or 'never', + bShowSuffix = false, + bShowServerName = false, + }) + bPet = dwType == TARGET.NPC and object.dwEmployer ~= 0 and X.IsPlayer(object.dwEmployer) + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString and szName and (dwType == TARGET.PLAYER or bPet) then + szName = MY_ChatMosaics.MosaicsString(szName) + end + -- 常规配色 + r, g, b = unpack(GetConfigValue('Color', relation, force) or {255, 255, 255}) + -- 倒计时/名字/帮会/称号部分 + aCountDown, szCountDown = COUNTDOWN_CACHE[dwID], '' + while aCountDown and #aCountDown > 0 do + local tData, szText, nSec, fPer = aCountDown[1], nil, nil, nil + if tData.szType == 'BUFF' or tData.szType == 'DEBUFF' then + local KBuff = object.GetBuff(tData.dwBuffID, 0) + if KBuff then + nSec = (KBuff.GetEndTime() - GetLogicFrameCount()) / X.ENVIRONMENT.GAME_FPS + szText = tData.szText or X.GetBuffName(KBuff.dwID, KBuff.nLevel) + if KBuff.nStackNum > 1 then + szText = szText .. 'x' .. KBuff.nStackNum + end + end + elseif tData.szType == 'CASTING' then + local nType, dwSkillID, dwSkillLevel, fCastPercent = X.GetCharacterOTActionState(object) + if dwSkillID == tData.dwSkillID + and ( + nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE + ) then + fPer = fCastPercent + szText = tData.szText or X.GetSkillName(dwSkillID, dwSkillLevel) + end + elseif tData.szType == 'NPC' or tData.szType == 'DOODAD' then + szText = tData.szText or '' + else --if tData.szType == 'TIME' then + if tData.nLogicFrame then + nSec = (tData.nLogicFrame - GetLogicFrameCount()) / X.ENVIRONMENT.GAME_FPS + elseif tData.nTime then + nSec = (tData.nTime - GetTime()) / 1000 + end + if nSec > 0 then + szText = tData.szText or '' + end + end + if nSec and nSec <= 0 then + nSec = nil + end + if fPer and fPer <= 0 then + fPer = nil + end + if szText then + if tData.tColor then + r, g, b = unpack(tData.tColor) + end + nPriority = nPriority + 100000 + fTextScale = fTextScale * 1.15 + if not X.IsEmpty(szText) and not tData.bHideProgress then + if nSec then + szCountDown = X.FormatDuration(math.min(nSec, 5999), 'PRIME') + elseif fPer then + szCountDown = math.floor(fPer * 100) .. '%' + end + szCountDown = szText .. '_' .. szCountDown + end + break + else + table.remove(aCountDown, 1) + end + end + lb:SetCD(szCountDown) + -- 名字 + bShowName = GetConfigComputeValue('ShowName', relation, force, bFight, bPet, bCurrentTarget, bFullLife) + if bShowName and dwType == TARGET.NPC and not object.CanSeeName() then + bShowName = IsSpecialNpcVisible(dwID, me, object) + end + if bShowName then + lb:SetName(szName) + end + lb:SetNameVisible(bShowName) + -- 心法 + bShowKungfu = Config.bShowKungfu and dwType == TARGET.PLAYER and dwID ~= me.dwID + if bShowKungfu then + kunfu = object.GetKungfuMount() + if kunfu and kunfu.dwSkillID and kunfu.dwSkillID ~= 0 then + lb:SetKungfu(X.GetKungfuName(kunfu.dwSkillID, 'short')) + else + lb:SetKungfu(g_tStrings.tForceTitle[object.dwForceID]) + end + end + lb:SetKungfuVisible(bShowKungfu) + -- 距离 + bShowDistance = Config.bShowDistance and (not Config.bShowDistanceOnlyTarget or bCurrentTarget) + if bShowDistance then + lb:SetDistance(X.GetCharacterDistance(me, object)) + end + lb:SetDistanceVisible(bShowDistance) + -- 帮会 + bShowTong = GetConfigComputeValue('ShowTong', relation, force, bFight, bPet, bCurrentTarget, bFullLife) + if bShowTong then + szTongName = D.GetTongName(object.dwTongID) or '' + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString and szTongName and (dwType == TARGET.PLAYER or bPet) then + szTongName = MY_ChatMosaics.MosaicsString(szTongName) + end + lb:SetTong(szTongName) + end + lb:SetTongVisible(bShowTong) + -- 称号 + bShowTitle = GetConfigComputeValue('ShowTitle', relation, force, bFight, bPet, bCurrentTarget, bFullLife) + if bShowTitle then + lb:SetTitle(object.szTitle or '') + end + lb:SetTitleVisible(bShowTitle) + -- 血条部分 + if not fCurrentLife or fMaxLife == 0 then + fCurrentLife, fMaxLife = X.GetCharacterLife(object) + end + lb:SetLife(fCurrentLife, fMaxLife) + bShowLife = szName ~= '' and GetConfigComputeValue('ShowLife', relation, force, bFight, bPet, bCurrentTarget, bFullLife) + if bShowLife and dwType == TARGET.NPC and not object.CanSeeLifeBar() then + bShowLife = IsSpecialNpcVisible(dwID, me, object) + end + if bShowLife then + lb:SetLifeBar(Config.nLifeOffsetX, Config.nLifeOffsetY, Config.nLifeWidth, Config.nLifeHeight, Config.nLifePadding) + lb:SetLifeBarBorder(Config.nLifeBorder, Config.nLifeBorderR, Config.nLifeBorderG, Config.nLifeBorderB) + end + lb:SetLifeBarVisible(bShowLife) + -- 血量数值部分 + bShowLifePercent = GetConfigComputeValue('ShowLifePer', relation, force, bFight, bPet, bCurrentTarget, bFullLife) + if bShowLifePercent and dwType == TARGET.NPC and not object.CanSeeLifeBar() then + bShowLifePercent = IsSpecialNpcVisible(dwID, me, object) + end + if bShowLifePercent then + lb:SetLifeText(Config.nLifePerOffsetX, Config.nLifePerOffsetY, Config.bHideLifePercentageDecimal and '%.0f' or '%.1f') + end + lb:SetLifeTextVisible(bShowLifePercent) + -- 头顶特效 + tEffect = OBJECT_TITLE_EFFECT[dwID] + if tEffect then + lb:SetSFX(tEffect.szFilePath, tEffect.fScale * Config.fTitleEffectScale, Config.nTitleEffectOffsetY, tEffect.nWidth, tEffect.nHeight) + else + lb:ClearSFX() + end + -- 各种数据生效 + lb:SetScale(X.GetUIScale() * (Config.bSystemUIScale and X.GetUIScale() or 1) * Config.fGlobalUIScale) + lb:SetColor(r, g, b, Config.nAlpha) + lb:SetColorFx( + object.nMoveState == MOVE_STATE.ON_DEATH + and (bCurrentTarget and fxDeathTarget or fxDeath) + or (bCurrentTarget and fxTarget or nil) + ) + lb:SetFont(Config.nFont) + lb:SetTextsPos(Config.nTextOffsetY, Config.nTextLineHeight) + lb:SetTextsScale((Config.bSystemUIScale and X.GetFontScale() or 1) * fTextScale) + lb:SetTextsSpacing(Config.fTextSpacing) + lb:SetPriority(nPriority) + lb:Create():Paint() + elseif lb then + lb:Remove() + LB_CACHE[dwID] = nil + end + -- 屏蔽官方标记 + if OBJECT_TITLE_EFFECT[dwID] and not OVERWRITE_TITLE_EFFECT[dwID] and lb then + OVERWRITE_TITLE_EFFECT[dwID] = true + SceneObject_SetTitleEffect(dwType, dwID, TITLE_EFFECT_NONE) + elseif OVERWRITE_TITLE_EFFECT[dwID] and not lb then + if OBJECT_TITLE_EFFECT[dwID] then + SceneObject_SetTitleEffect(dwType, dwID, OBJECT_TITLE_EFFECT[dwID].nID) + end + OVERWRITE_TITLE_EFFECT[dwID] = nil + end +end +end + +do +local nRoundLeft, nRoundLimit = 0, 50 -- 每帧最大重绘血条数量 +local dwLastType, dwLastID, me, KTar, dwTarType, dwTarID +local function onBreathe() + if not D.IsMapEnabled() then + return + end + me = X.GetClientPlayer() + if not me then + return + end + -- local _, _, fPitch = Camera_GetRTParams() + -- 自己和目标最重要 每次都要绘制 + CheckInvalidRect(TARGET.PLAYER, me.dwID, me, me) + dwTarType, dwTarID = me.GetTarget() + if dwTarType == TARGET.PLAYER or dwTarType == TARGET.NPC then + KTar = X.GetTargetHandle(dwTarType, dwTarID) + if KTar then + CheckInvalidRect(dwTarType, dwTarID, me, KTar) + end + end + -- 轮流绘制其他目标 + nRoundLeft = nRoundLimit + while nRoundLeft > 0 do + if DRAW_TARGET_TYPE == TARGET.NPC then + if DRAW_TARGET_ID and NPC_CACHE[DRAW_TARGET_ID] == nil then + DRAW_TARGET_ID = nil + end + DRAW_TARGET_ID = next(NPC_CACHE, DRAW_TARGET_ID) + if DRAW_TARGET_ID then + KTar = NPC_CACHE[DRAW_TARGET_ID] + else + DRAW_TARGET_TYPE, DRAW_TARGET_ID = TARGET.PLAYER, nil + end + elseif DRAW_TARGET_TYPE == TARGET.PLAYER then + if DRAW_TARGET_ID and PLAYER_CACHE[DRAW_TARGET_ID] == nil then + DRAW_TARGET_ID = nil + end + DRAW_TARGET_ID = next(PLAYER_CACHE, DRAW_TARGET_ID) + if DRAW_TARGET_ID then + KTar = PLAYER_CACHE[DRAW_TARGET_ID] + else + DRAW_TARGET_TYPE, DRAW_TARGET_ID = TARGET.NPC, nil + end + end + if DRAW_TARGET_ID then + CheckInvalidRect(DRAW_TARGET_TYPE, DRAW_TARGET_ID, me, KTar) + if DRAW_TARGET_TYPE == dwLastType and DRAW_TARGET_ID == dwLastID then + return + end + end + nRoundLeft = nRoundLeft - 1 + end + dwLastType, dwLastID = DRAW_TARGET_TYPE, DRAW_TARGET_ID +end +X.FrameCall('MY_LifeBar', onBreathe) +end +end + +X.RegisterEvent('NPC_ENTER_SCENE',function() + NPC_CACHE[arg0] = X.GetNpc(arg0) +end) + +X.RegisterEvent('NPC_LEAVE_SCENE',function() + local lb = LB_CACHE[arg0] + if lb then + if LB_ADJUST_INDEX_ID == arg0 then + LB_ADJUST_INDEX_ID = next(LB_CACHE, LB_ADJUST_INDEX_ID) + end + lb:Remove() + LB_CACHE[arg0] = nil + end + if DRAW_TARGET_TYPE == TARGET.NPC and DRAW_TARGET_ID == arg0 then + DRAW_TARGET_ID = next(NPC_CACHE, DRAW_TARGET_ID) + if not DRAW_TARGET_ID then + DRAW_TARGET_TYPE = TARGET.PLAYER + end + end + NPC_CACHE[arg0] = nil +end) + +X.RegisterEvent('PLAYER_ENTER_SCENE',function() + PLAYER_CACHE[arg0] = X.GetPlayer(arg0) +end) + +X.RegisterEvent('PLAYER_LEAVE_SCENE',function() + local lb = LB_CACHE[arg0] + if lb then + if LB_ADJUST_INDEX_ID == arg0 then + LB_ADJUST_INDEX_ID = next(LB_CACHE, LB_ADJUST_INDEX_ID) + end + lb:Remove() + LB_CACHE[arg0] = nil + end + if DRAW_TARGET_TYPE == TARGET.PLAYER and DRAW_TARGET_ID == arg0 then + DRAW_TARGET_ID = next(PLAYER_CACHE, DRAW_TARGET_ID) + if not DRAW_TARGET_ID then + DRAW_TARGET_TYPE = TARGET.NPC + end + end + PLAYER_CACHE[arg0] = nil +end) + +local function PrioritySorter(a, b) + if a.nPriority == b.nPriority then + return false + end + if not b.nPriority then + return true + end + if not a.nPriority then + return false + end + return a.nPriority < b.nPriority +end +function D.ProcessCountdown(dwID, szType, szKey, tData) + if not D.IsEnabled() then + return false + end + if not COUNTDOWN_CACHE[dwID] then + COUNTDOWN_CACHE[dwID] = {} + end + for i, p in X.ipairs_r(COUNTDOWN_CACHE[dwID]) do + if p.szType == szType and p.szKey == szKey then + table.remove(COUNTDOWN_CACHE[dwID], i) + end + end + if tData then + local tData = X.Clone(tData) + if tData.col then + local r, g, b = X.HumanColor2RGB(tData.col) + if r and g and b then + tData.tColor = {r, g, b} + end + tData.col = nil + end + tData.szType = szType + tData.szKey = szKey + table.insert(COUNTDOWN_CACHE[dwID], 1, tData) + table.sort(COUNTDOWN_CACHE[dwID], PrioritySorter) + elseif #COUNTDOWN_CACHE[dwID] == 0 then + COUNTDOWN_CACHE[dwID] = nil + end + return true +end + +----------------------------------------------------------------------------------------- +-- 对话泡泡 +----------------------------------------------------------------------------------------- +local function OnCharacterSay(dwID, nChannel, szMsg) + if dwID == 0 or not D.bReady then + return + end + local szMsgType = X.CONSTANT.PLAYER_TALK_CHANNEL_TO_MSG_TYPE[nChannel] + local bc = szMsgType and Config.BalloonChannel[szMsgType] + if not bc or not bc.bEnable then + return + end + local dwType = X.IsPlayer(dwID) and TARGET.PLAYER or TARGET.NPC + local object = X.GetTargetHandle(dwType, dwID) + if not object then + return + end + local lb = LB_CACHE[dwID] + if not lb then + return + end + local me = X.GetClientPlayer() + local scene = me.GetScene() + if dwType == TARGET.PLAYER and IsEnemy(me.dwID, dwID) and (scene.bIsArenaMap or X.IsShieldedMap(scene.dwMapID)) then + return + end + local relation = D.GetRelation(me.dwID, dwID, me, object) + local force = D.GetForce(dwType, dwID, object) + local cfg = GetConfigValue('ShowBalloon', relation, force) + if not cfg.bEnable then + return + end + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen then + szMsg = MY_Farbnamen.Render(szMsg) + end + lb:SetBalloon(szMsg, GetTime(), bc.nDuring, Config.nBalloonOffsetY) +end + +local function onSwitch() + O.bEnabled = not O.bEnabled + D.Reset() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_LifeBar', + exports = { + { + fields = { + 'Reset', + 'Repaint', + 'IsEnabled', + 'IsShielded', + 'UpdateShadowHandleParam', + }, + root = D, + }, + { + fields = { + 'bEnabled', + 'bAutoHideSysHeadtop', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnabled', + 'bAutoHideSysHeadtop', + }, + triggers = { + bEnabled = function() + D.Reset(true) + end, + }, + root = O, + }, + }, +} +MY_LifeBar = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterHotKey('MY_LifeBar_S', _L['MY_LifeBar'], onSwitch) + +X.RegisterEvent('CHARACTER_SAY', function() + local szMsg = Table_GetSmartDialog(arg3, arg0) + szMsg = GetFormatText(szMsg) + OnCharacterSay(arg1, arg2, szMsg) +end) + +X.RegisterEvent('PLAYER_SAY', function() + OnCharacterSay(arg1, arg2, arg0) +end) + +X.RegisterEvent('MY_LIFEBAR_COUNTDOWN', function() + local dwID, szType, szKey, tData = arg0, arg1, arg2, arg3 + if MY_LifeBar_ScreenArrow.ProcessCountdown(dwID, szType, szKey, tData) then + return + end + if D.ProcessCountdown(dwID, szType, szKey, tData) then + return + end + MY_LifeBar_Official.ProcessCountdown(dwID, szType, szKey, tData) +end) + +X.RegisterEvent({'FIRST_SYNC_USER_PREFERENCES_END', 'RELOAD_UI_ADDON_END'}, function() + D.bUserPreferencesReady = true +end) + +X.RegisterUserSettingsInit('MY_LifeBar', function() + D.bReady = true + D.Reset() +end) + +X.RegisterUserSettingsRelease('MY_LifeBar', function() + D.bReady = false + D.Reset() +end) + +X.RegisterExit(D.ResumeSysHeadTop) +X.RegisterReload(D.ResumeSysHeadTop) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar_Config.lua b/MY_LifeBar/src/MY_LifeBar_Config.lua new file mode 100644 index 000000000..a46a8a4be --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar_Config.lua @@ -0,0 +1,1077 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条设置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar_Config' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local function SchemaRelationForce(itemschema) + return X.Schema.Map( + X.Schema.OneOf('Self', 'Party', 'Enemy', 'Neutrality', 'Ally', 'Foe'), + function(obj, path) + if not X.IsTable(obj) then + return X.Schema.Error('Invalid value: '..path..' must be table', path) + end + for k, v in pairs(obj) do + path:push(k) + if k == 'DifferentiateForce' then + if not X.IsBoolean(v) then + return X.Schema.Error('Invalid value: ' .. path .. ' must be boolean', path) + end + else + local err = itemschema(v, path) + if err then + return err + end + end + path:pop() + end + return nil + end + ) +end +local O = X.CreateUserSettingsModule(MODULE_NAME, _L['General'], { + eCss = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['CSS Style'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.String, + xDefaultValue = '', + }, + fDesignUIScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Design UI Scale'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nDesignFontOffset = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Design Font Offset'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nCamp = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Current Camp'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = -1, + }, + bOnlyInArena = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Enable Only in Arena'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOnlyInDungeon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Enable Only in Dungeon'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOnlyInBattleField = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Enable Only in Battlefield'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nTextOffsetY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Text Offset Y'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 38, + }, + nTextLineHeight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Text Line Height'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 20, + }, + fTextScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Text Scale'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 1.2, + }, + fTextSpacing = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Text Spacing'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + bShowSpecialNpc = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Special NPC'], + }), + szRestriction = 'MY_LifeBar.SpecialNpc', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowSpecialNpcOnlyEnemy = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Special NPC Only Enemy'], + }), + szRestriction = 'MY_LifeBar.SpecialNpc', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowObjectID = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Object ID'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowObjectIDOnlyUnnamed = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Object ID Only Unnamed'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowKungfu = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Kungfu'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Distance'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowDistanceOnlyTarget = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Distance Only for Target'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nDistanceDecimal = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Distance Decimal'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifeWidth = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Width'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 52, + }, + nLifeHeight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Height'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + nLifePadding = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Padding'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifeOffsetX = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Offset X'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifeOffsetY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Offset Y'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 12, + }, + nLifeBorder = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Border'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + nLifeBorderR = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Border Red'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifeBorderG = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Border Green'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifeBorderB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Border Blue'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + szLifeDirection = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Bar Direction'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.String, + xDefaultValue = 'LEFT_RIGHT', + }, + nLifePerOffsetX = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Percentage Offset X'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nLifePerOffsetY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Life Percentage Offset Y'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 8, + }, + fTitleEffectScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Title Effect Scale'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0.7, + }, + nTitleEffectOffsetY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Title Effect Offset Y'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nBalloonOffsetY = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Balloon Offset Y'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = -20, + }, + nAlpha = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Alpha'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 255, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Font'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 7, + }, + nDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Distance'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 80 * 80 * 64 * 64, + }, + nVerticalDistance = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Vertical Distance'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 50 * 8 * 64, + }, + bHideLifePercentageWhenFight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Hide Life Percentage When Fight'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bHideLifePercentageDecimal = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Hide Life Percentage Decimal'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + fGlobalUIScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Global UI Scale'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + bSystemUIScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['System UI Scale'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowWhenUIHide = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show When UI Hide'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bMineOnTop = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Mine On Top'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTargetOnTop = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Target On Top'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bScreenPosSort = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Screen Position Sort'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + Color = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Color Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number)), + xDefaultValue = { + Self = X.KvpToObject({ -- 自己 + {'DifferentiateForce', false}, + {'Player', { 26, 156, 227 }}, + {'Npc', { 26, 156, 227 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + Party = X.KvpToObject({ -- 团队 + {'DifferentiateForce', false}, + {'Player', { 23, 133, 194 }}, + {'Npc', { 23, 133, 194 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + Enemy = X.KvpToObject({ -- 敌对 + {'DifferentiateForce', false}, + {'Player', { 203, 53, 9 }}, + {'Npc', { 203, 53, 9 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + Neutrality = X.KvpToObject({ -- 中立 + {'DifferentiateForce', false}, + {'Player', { 238, 238, 15 }}, + {'Npc', { 238, 238, 15 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + Ally = X.KvpToObject({ -- 相同阵营 + {'DifferentiateForce', false}, + {'Player', { 63 , 210, 94 }}, + {'Npc', { 63 , 210, 94 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + Foe = X.KvpToObject({ -- 仇人 + {'DifferentiateForce', false}, + {'Player', { 197, 26, 201 }}, + {FORCE_TYPE.JIANG_HU , { 255, 255, 255 }}, -- 江湖 + {FORCE_TYPE.SHAO_LIN , { 255, 178, 95 }}, -- 少林 + {FORCE_TYPE.WAN_HUA , { 196, 152, 255 }}, -- 万花 + {FORCE_TYPE.TIAN_CE , { 255, 111, 83 }}, -- 天策 + {FORCE_TYPE.CHUN_YANG, { 22 , 216, 216 }}, -- 纯阳 56,175,255 + {FORCE_TYPE.QI_XIU , { 255, 129, 176 }}, -- 七秀 + {FORCE_TYPE.WU_DU , { 55 , 147, 255 }}, -- 五毒 + {FORCE_TYPE.TANG_MEN , { 121, 183, 54 }}, -- 唐门 + {FORCE_TYPE.CANG_JIAN, { 214, 249, 93 }}, -- 藏剑 + {FORCE_TYPE.GAI_BANG , { 205, 133, 63 }}, -- 丐帮 + {FORCE_TYPE.MING_JIAO, { 240, 70 , 96 }}, -- 明教 + {FORCE_TYPE.CANG_YUN , { 180, 60 , 0 }}, -- 苍云 + {FORCE_TYPE.CHANG_GE , { 100, 250, 180 }}, -- 长歌 + {FORCE_TYPE.BA_DAO , { 106, 108, 189 }}, -- 霸刀 + }), + }, + }, + ShowName = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Name Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + bOnlyFighting = X.Schema.Boolean, + bHideInDungeon = X.Schema.Optional(X.Schema.Boolean), + bHideFullLife = X.Schema.Optional(X.Schema.Boolean), + bOnlyTarget = X.Schema.Optional(X.Schema.Boolean), + bHidePets = X.Schema.Optional(X.Schema.Boolean), + })), + xDefaultValue = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false }, + }, + Foe = { Player = { bEnable = true, bOnlyFighting = false } }, + }, + }, + ShowTong = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Tong Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + bOnlyFighting = X.Schema.Boolean, + bHideInDungeon = X.Schema.Optional(X.Schema.Boolean), + bHideFullLife = X.Schema.Optional(X.Schema.Boolean), + bOnlyTarget = X.Schema.Optional(X.Schema.Boolean), + bHidePets = X.Schema.Optional(X.Schema.Boolean), + })), + xDefaultValue = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Party = { Player = { bEnable = false, bOnlyFighting = false } }, + Enemy = { Player = { bEnable = false, bOnlyFighting = false } }, + Neutrality = { Player = { bEnable = false, bOnlyFighting = false } }, + Ally = { Player = { bEnable = false, bOnlyFighting = false } }, + Foe = { Player = { bEnable = true, bOnlyFighting = false } }, + }, + }, + ShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Title Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + bOnlyFighting = X.Schema.Boolean, + bHideInDungeon = X.Schema.Optional(X.Schema.Boolean), + bHideFullLife = X.Schema.Optional(X.Schema.Boolean), + bOnlyTarget = X.Schema.Optional(X.Schema.Boolean), + bHidePets = X.Schema.Optional(X.Schema.Boolean), + })), + xDefaultValue = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Party = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Neutrality = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Ally = { + Npc = { bEnable = true, bOnlyFighting = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false } }, + }, + }, + ShowLife = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Life Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + bOnlyFighting = X.Schema.Boolean, + bHideInDungeon = X.Schema.Optional(X.Schema.Boolean), + bHideFullLife = X.Schema.Optional(X.Schema.Boolean), + bOnlyTarget = X.Schema.Optional(X.Schema.Boolean), + bHidePets = X.Schema.Optional(X.Schema.Boolean), + })), + xDefaultValue = { + Self = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = true, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = true, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + }, + ShowLifePer = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Life Percentage Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + bOnlyFighting = X.Schema.Boolean, + bHideInDungeon = X.Schema.Optional(X.Schema.Boolean), + bHideFullLife = X.Schema.Optional(X.Schema.Boolean), + bOnlyTarget = X.Schema.Optional(X.Schema.Boolean), + bHidePets = X.Schema.Optional(X.Schema.Boolean), + })), + xDefaultValue = { + Self = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Party = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Enemy = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Neutrality = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Ally = { + Npc = { bEnable = false, bOnlyFighting = false, bHideFullLife = false, bHidePets = false }, + Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false }, + }, + Foe = { Player = { bEnable = false, bOnlyFighting = false, bHideFullLife = false } }, + }, + }, + ShowBalloon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Show Balloon Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = SchemaRelationForce(X.Schema.Record({ + bEnable = X.Schema.Boolean, + })), + xDefaultValue = { + Self = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Party = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Enemy = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Neutrality = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Ally = { + Npc = { bEnable = true }, + Player = { bEnable = true }, + }, + Foe = { Player = { bEnable = true } }, + }, + }, + BalloonChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L[PLUGIN_NAME], + szDescription = X.MakeCaption({ + _L['Balloon Channel Configuration'], + }), + szRestriction = 'MY_LifeBar', + xSchema = X.Schema.Map( + X.Schema.String, + X.Schema.Record({ + bEnable = X.Schema.Boolean, + nDuring = X.Schema.Number, + }) + ), + xDefaultValue = { + ['MSG_NORMAL' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_TEAM' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_PARTY' ] = { bEnable = true, nDuring = 5000 }, + ['MSG_GUILD' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_MAP' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FILED' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_NEARBY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_PARTY' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_YELL' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_NPC_WHISPER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_NPC' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_STORY_PLAYER' ] = { bEnable = true, nDuring = 9000 }, + ['MSG_BATTLE_FIELD_SIDE'] = { bEnable = true, nDuring = 5000 }, + }, + }, +}) +local D = {} + +local function LoadDefaultTemplate(szStyle) + local template = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_LifeBar/config/' .. szStyle .. '/{$lang}.jx3dat') + if not template then + return + end + for _, szRelation in ipairs({ 'Self', 'Party', 'Enemy', 'Neutrality', 'Ally', 'Foe' }) do + local tVal = X.KvpToObject(template[1].Color[szRelation].__VALUE__) + for _, dwForceID in X.pairs_c(X.CONSTANT.FORCE_TYPE) do + if not tVal[dwForceID] then + tVal[dwForceID] = { X.GetForceColor(dwForceID, 'foreground') } + end + end + template[1].Color[szRelation].__VALUE__ = tVal + end + if X.ENVIRONMENT.GAME_PROVIDER == 'remote' then -- 云端微调对立颜色防止压缩模糊 + for _, szType in ipairs({ 'Player', 'Npc' }) do + template[1].Color.Enemy.__VALUE__[szType] = { 253, 86, 86 } + end + template[1].Color.Foe.__VALUE__.Player = { 202, 126, 255 } + end + return template +end + +local CONFIG_DEFAULTS = setmetatable({}, { + __index = function(t, k) + assert(k ~= 'DEFAULT', 'Default config not exist!!!') + return t.DEFAULT + end, +}) + +local function FormatConfigData(szStyle, d) + local template = CONFIG_DEFAULTS[szStyle] + return X.FormatDataStructure(d, template[1], true, template[2]) +end + +local Config = O +local ConfigLoaded = false + +function D.Init() + for _, p in ipairs({ + { key = 'DEFAULT' , name = 'default' }, + { key = 'OFFICIAL', name = 'official' }, + { key = 'CLEAR' , name = 'clear' }, + { key = 'XLIFEBAR', name = 'xlifebar' }, + }) do + local config = LoadDefaultTemplate(p.name) + if not config then + X.OutputDebugMessage(_L['MY_LifeBar'], _L['Default config cannot be loaded, please reinstall!!!'] .. ' (' .. p.name .. ')', X.DEBUG_LEVEL.ERROR) + end + CONFIG_DEFAULTS[p.key] = config + end +end + +-- 根据玩家自定义界面缩放设置反向缩放 实现默认设置不受用户缩放影响 +function D.AutoAdjustScale() + Config('reload', {'fDesignUIScale', 'fGlobalUIScale'}) + local fUIScale = X.GetUIScale() + if Config.fDesignUIScale ~= fUIScale then + Config.fGlobalUIScale = Config.fGlobalUIScale * Config.fDesignUIScale / fUIScale + Config.fDesignUIScale = fUIScale + end + Config('reload', {'nDesignFontOffset', 'fTextScale'}) + local nFontOffset = Font.GetOffset() + if Config.nDesignFontOffset ~= nFontOffset then + Config.fTextScale = Config.fTextScale * X.GetFontScale(Config.nDesignFontOffset) / X.GetFontScale() + Config.nDesignFontOffset = nFontOffset + end +end + +do +local function onUIScaled() + if not ConfigLoaded then + return + end + D.AutoAdjustScale() + FireUIEvent('MY_LIFEBAR_CONFIG_UPDATE') +end +X.RegisterEvent('UI_SCALED', 'MY_LifeBar_Config', onUIScaled) +end + +function D.LoadConfig(szConfig) + local tConfig + if X.IsTable(szConfig) then + tConfig = szConfig + elseif X.IsString(szConfig) then + tConfig = X.LoadLUAData({ 'config/xlifebar/' .. szConfig .. '.jx3dat', X.PATH_TYPE.GLOBAL }) + end + if tConfig then + if not tConfig.fDesignUIScale then -- 兼容老数据 + for _, key in ipairs({'ShowName', 'ShowTong', 'ShowTitle', 'ShowLife', 'ShowLifePer'}) do + for _, relation in ipairs({'Self', 'Party', 'Enemy', 'Neutrality', 'Ally', 'Foe'}) do + for _, tartype in ipairs({'Npc', 'Player'}) do + if tConfig[key] and X.IsTable(tConfig[key][relation]) and X.IsBoolean(tConfig[key][relation][tartype]) then + tConfig[key][relation][tartype] = { bEnable = tConfig[key][relation][tartype] } + end + end + end + end + tConfig.fDesignUIScale = X.GetUIScale() + tConfig.fMatchedFontOffset = Font.GetOffset() + end + tConfig = FormatConfigData(tConfig.eCss or 'DEFAULT', tConfig) + for k, v in pairs(tConfig) do + X.Call(X.Set, Config, {k}, v) + end + end + ConfigLoaded = true + FireUIEvent('MY_LIFEBAR_CONFIG_LOADED') +end + +MY_LifeBar_Config = setmetatable({}, { + __call = function(t, op, ...) + local argc = select('#', ...) + local argv = {...} + if op == 'get' then + local config = Config + for i = 1, argc do + if not X.IsTable(config) then + return + end + config = config[argv[i]] + end + return config + elseif op == 'set' then + local config = Config + for i = 1, argc - 2 do + if not X.IsTable(config) then + return + end + config = config[argv[i]] + end + if not X.IsTable(config) then + return + end + config[argv[argc - 1]] = argv[argc] + elseif op == 'reset' then + if not argv[1] then + MessageBox({ + szName = 'MY_LifeBar_Restore_Default', + szAlignment = 'CENTER', + szMessage = _L['Please choose your favorite lifebar style.\nYou can rechoose in setting panel.'], + { + szOption = _L['Official default style'], + fnAction = function() + D.LoadConfig(FormatConfigData('OFFICIAL')) + end, + }, + { + szOption = _L['Official clear style'], + fnAction = function() + D.LoadConfig(FormatConfigData('CLEAR')) + end, + }, + { + szOption = _L['XLifeBar style'], + fnAction = function() + D.LoadConfig(FormatConfigData('XLIFEBAR')) + end, + }, + { + szOption = _L['Keep current'], + fnAction = function() + if Config.eCss == '' then + Config.eCss = 'DEFAULT' + end + end, + }, + }) + else + D.LoadConfig(FormatConfigData(argv[1])) + end + elseif op == 'load' then + return D.LoadConfig(...) + elseif op == 'loaded' then + return ConfigLoaded + end + end, + __index = function(t, k) return Config[k] end, + __newindex = function(t, k, v) Config[k] = v end, +}) + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_LifeBar_Config', function() + D.Init() + D.LoadConfig() +end) + +X.RegisterInit('MY_LifeBar_Config', function() + D.AutoAdjustScale() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar_HP.lua b/MY_LifeBar/src/MY_LifeBar_HP.lua new file mode 100644 index 000000000..4846d0201 --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar_HP.lua @@ -0,0 +1,335 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条UI操作类 只做UI操作 不做任何逻辑判断 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar_HP' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local HP = class() +local CACHE = setmetatable({}, {__mode = 'v'}) +local REQUIRE_SORT = false + +function HP:ctor(dwType, dwID) -- KGobject + local hList = X.UI.GetShadowHandle('MY_LifeBar') + local szName = dwType .. '_' .. dwID + self.szName = szName + self.dwType = dwType + self.dwID = dwID + self.handle = hList:Lookup(self.szName) + return self +end + +function HP:IsHandleValid() + return self.handle and self.handle:IsValid() +end + +-- 创建 +function HP:Create() + if not self:IsHandleValid() then + local hList = X.UI.GetShadowHandle('MY_LifeBar') + hList:AppendItemFromString(FormatHandle(string.format('name="%s"', self.szName))) + local hItem = hList:Lookup(self.szName) + hItem:AppendItemFromString('name="hp_bg"') + hItem:AppendItemFromString('name="hp_bg2"') + hItem:AppendItemFromString('name="hp"') + hItem:AppendItemFromString('name="lines"') + hItem:AppendItemFromString('name="hp_title"') + hItem:AppendItemFromString('name="sfx"') + REQUIRE_SORT = true + self.handle = hItem + end + return self +end + +-- 删除 +function HP:Remove() + if self:IsHandleValid() then + local hList = X.UI.GetShadowHandle('MY_LifeBar') + hList:RemoveItem(self.handle) + self.handle = nil + end + return self +end + +function HP:SetPriority(nPriority) + if self:IsHandleValid() then + self.handle:SetUserData(nPriority) + REQUIRE_SORT = true + end + return self +end + +function HP:ClearShadow(szShadowName) + if self:IsHandleValid() then + local sha = self.handle:Lookup(szShadowName) + if sha then + sha:ClearTriangleFanPoint() + end + end + return self +end + +-- 绘制名字/帮会/称号 等等 行文字 +function HP:DrawTexts(aTexts, nY, nLineHeight, r, g, b, a, f, spacing, scale) + if self:IsHandleValid() then + local sha = self.handle:Lookup('lines') + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:ClearTriangleFanPoint() + + for _, szText in ipairs(aTexts) do + if szText ~= '' then + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, 0, -nY}, f, szText, spacing, scale / X.GetFontScale() / X.GetUIScale()) + nY = nY + nLineHeight + end + end + end + return self +end + +-- 绘制血量百分比文字(减少重绘次数所以和Wordlines分离) +function HP:DrawLifeText(text, x, y, r, g, b, a, f, spacing, scale) + if self:IsHandleValid() then + local sha = self.handle:Lookup('hp_title') + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:ClearTriangleFanPoint() + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, x, -y}, f, text, spacing, scale / X.GetFontScale() / X.GetUIScale()) + end + return self +end + +function HP:ClearLifeText() + return self:ClearShadow('hp_title') +end + +-- 填充边框 默认200的nAlpha +function HP:DrawBorder(szShadowName, szShadowName2, nWidth, nHeight, nOffsetX, nOffsetY, nBorder, nR, nG, nB, nAlpha) + if self:IsHandleValid() then + nAlpha = nAlpha or 200 + local handle = self.handle + + -- 绘制外边框 + local sha = handle:Lookup(szShadowName) + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + local bcX, bcY = -(nWidth / 2 + nBorder) + nOffsetX, -(nHeight / 2 + nBorder) - nOffsetY + + sha:AppendCharacterID(self.dwID, true, nR, nG, nB, nAlpha, {0, 0, 0, bcX, bcY}) + sha:AppendCharacterID(self.dwID, true, nR, nG, nB, nAlpha, {0, 0, 0, bcX + nWidth + nBorder * 2, bcY}) + sha:AppendCharacterID(self.dwID, true, nR, nG, nB, nAlpha, {0, 0, 0, bcX + nWidth + nBorder * 2, bcY + nHeight + nBorder * 2}) + sha:AppendCharacterID(self.dwID, true, nR, nG, nB, nAlpha, {0, 0, 0, bcX, bcY + nHeight + nBorder * 2}) + + -- 绘制内边框 + local sha = handle:Lookup(szShadowName2) + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + local bcX, bcY = -nWidth / 2 + nOffsetX, -nHeight / 2 - nOffsetY + + sha:AppendCharacterID(self.dwID, true, 30, 30, 30, nAlpha, {0, 0, 0, bcX, bcY}) + sha:AppendCharacterID(self.dwID, true, 30, 30, 30, nAlpha, {0, 0, 0, bcX + nWidth, bcY}) + sha:AppendCharacterID(self.dwID, true, 30, 30, 30, nAlpha, {0, 0, 0, bcX + nWidth, bcY + nHeight}) + sha:AppendCharacterID(self.dwID, true, 30, 30, 30, nAlpha, {0, 0, 0, bcX, bcY + nHeight}) + end + return self +end + +-- 填充血条边框 默认200的nAlpha +function HP:DrawLifeBorder(nWidth, nHeight, nOffsetX, nOffsetY, nBorder, nR, nG, nB, nAlpha) + return self:DrawBorder('hp_bg', 'hp_bg2', nWidth, nHeight, nOffsetX, nOffsetY, nBorder, nR, nG, nB, nAlpha) +end +function HP:ClearLifeBorder() + self:ClearShadow('hp_bg') + self:ClearShadow('hp_bg2') + return self +end + +-- 填充矩形(进度条/血条) +-- rgbap: 红,绿,蓝,透明度,进度,绘制方向 +function HP:DrawRect(szShadowName, nWidth, nHeight, nOffsetX, nOffsetY, nPadding, r, g, b, a, p, d) + if self:IsHandleValid() then + nWidth = math.max(0, nWidth - nPadding * 2) + nHeight = math.max(0, nHeight - nPadding * 2) + if not p or p > 1 then + p = 1 + elseif p < 0 then + p = 0 + end -- fix + local sha = self.handle:Lookup(szShadowName) + + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + + -- 计算实际绘制宽度高度起始位置 + local bcX, bcY = -nWidth / 2 + nOffsetX, -nHeight / 2 - nOffsetY + if d == 'TOP_BOTTOM' then + nWidth = nWidth + nHeight = nHeight * p + elseif d == 'BOTTOM_TOP' then + bcY = bcY + nHeight * (1 - p) + nWidth = nWidth + nHeight = nHeight * p + elseif d == 'RIGHT_LEFT' then + bcX = bcX + nWidth * (1 - p) + nWidth = nWidth * p + nHeight = nHeight + else -- if d == 'LEFT_RIGHT' then + nWidth = nWidth * p + nHeight = nHeight + end + + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, bcX, bcY}) + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, bcX + nWidth, bcY}) + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, bcX + nWidth, bcY + nHeight}) + sha:AppendCharacterID(self.dwID, true, r, g, b, a, {0, 0, 0, bcX, bcY + nHeight}) + end + return self +end + +-- 填充血条 +function HP:DrawLifeBar(nWidth, nHeight, nOffsetX, nOffsetY, nPadding, r, g, b, a, p, d) + return self:DrawRect('hp', nWidth, nHeight, nOffsetX, nOffsetY, nPadding, r, g, b, a, p, d) +end + +function HP:ClearLifeBar() + return self:ClearShadow('hp') +end + +-- 设置头顶特效 +-- szFile 特效文件 +-- fScale 特效缩放 +-- nWidth 缩放后的特效UI宽度 +-- nHeight 缩放后的特效UI高度 +function HP:SetSFX(szFile, fScale, nWidth, nHeight, nOffsetY) + if self:IsHandleValid() then + local sfx = self.handle:Lookup('sfx') + local szKey = 'MY_LIFEBAR_HP_SFX_' .. self.dwType .. '_' .. self.dwID + local dwCtcType = self.dwType == TARGET.DOODAD and CTCT.DOODAD_POS_2_SCREEN_POS or CTCT.CHARACTER_TOP_2_SCREEN_POS + if szFile then + sfx:LoadSFX(szFile) + sfx:SetModelScale(fScale) + sfx:Play(true) + sfx:Show() + X.RenderCall(szKey, function() + if sfx and sfx:IsValid() then + local nX, nY, bFront = X.CThreadCoor(dwCtcType, self.dwID) + nX, nY = Station.AdjustToOriginalPos(nX, nY) + sfx:SetAbsPos(nX, nY - nHeight / 2 - nOffsetY) + else + X.CThreadCoor(dwCtcType, self.dwID, szKey, false) + X.RenderCall(szKey, false) + end + end) + X.CThreadCoor(dwCtcType, self.dwID, szKey, true) + else + sfx:Hide() + X.RenderCall(szKey, false) + X.CThreadCoor(dwCtcType, self.dwID, szKey, false) + end + end + return self +end + +function HP:ClearSFX() + return self:SetSFX() +end + +function HP:SetBalloon(szMsg, nStartTick, nDuring, nOffsetY) + if self:IsHandleValid() then + local balloon = self.handle:Lookup('balloon') + local szKey = 'MY_LIFEBAR_HP_BALLOON_' .. self.dwType .. '_' .. self.dwID + local dwCtcType = self.dwType == TARGET.DOODAD and CTCT.DOODAD_POS_2_SCREEN_POS or CTCT.CHARACTER_TOP_2_SCREEN_POS + if not X.IsEmpty(szMsg) then + if not balloon then + self.handle:AppendItemFromString('name="balloon" handletype=0 name="Image_Bg1" path="ui\\Image\\UICommon\\CommonPanel.UITex" frame=21 postype=0 imagetype=10name="Image_Bg2" path="ui\\Image\\Common\\CommonPanel.UITex" frame=71 postype=0 disablescale=1name="content" x=15 y=10 handletype=4 valign=2 ') + balloon = self.handle:Lookup('balloon') + end + local hContent = balloon:Lookup('content') + hContent:Clear() + hContent:SetW(350) + hContent:AppendItemFromString(szMsg) + hContent:SetSizeByAllItemSize() + balloon:SetSize(math.max(hContent:GetW() + 30, 50), hContent:GetH() + 20) + balloon:Lookup('Image_Bg1'):SetSize(balloon:GetSize()) + balloon:Lookup('Image_Bg2'):SetRelPos(math.min(balloon:GetW() * 3 / 4, balloon:GetW() - balloon:Lookup('Image_Bg2'):GetW() - 10), balloon:GetH() - 3) + balloon:FormatAllItemPos() + local nEndTick = nStartTick + nDuring + local nAnimationTime = math.min(nDuring / 5, 1000) + balloon:Show() + balloon:SetAlpha(0) + local nTick, nX, nY, bFront, nAni + X.RenderCall(szKey, function() + nTick = GetTime() + if balloon and balloon:IsValid() and nTick <= nEndTick then + nX, nY, bFront = X.CThreadCoor(dwCtcType, self.dwID) + nX, nY = Station.AdjustToOriginalPos(nX, nY) + balloon:SetAbsPos(nX - balloon:GetW() / 2, nY - nOffsetY - balloon:GetH()) + nAni = math.min((nTick - nStartTick) * 2, nEndTick - nTick) -- 出现比消失快一倍比较舒服 + balloon:SetAlpha(nAni > nAnimationTime and 255 or nAni / nAnimationTime * 255) + else + if balloon and balloon:IsValid() then + balloon:Hide() + end + X.CThreadCoor(dwCtcType, self.dwID, szKey, false) + X.RenderCall(szKey, false) + end + end) + X.CThreadCoor(dwCtcType, self.dwID, szKey, true) + else + if balloon and balloon:IsValid() then + balloon:Hide() + end + X.RenderCall(szKey, false) + X.CThreadCoor(dwCtcType, self.dwID, szKey, false) + end + end + return self +end + +function HP:ClearBalloon() + return self:SetBalloon() +end + +function MY_LifeBar_HP(dwType, dwID) + if dwType == 'clear' then + CACHE = {} + X.UI.GetShadowHandle('MY_LifeBar'):Clear() + else + local szName = dwType .. '_' .. dwID + if not CACHE[szName] then + CACHE[szName] = HP.new(dwType, dwID) + end + return CACHE[szName] + end +end + +do local hList +local function onBreathe() + if REQUIRE_SORT then + if not (hList and hList:IsValid()) then + hList = X.UI.GetShadowHandle('MY_LifeBar') + end + hList:Sort() + REQUIRE_SORT = false + end +end +X.BreatheCall('MY_LifeBar_HP', onBreathe) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar_LB.lua b/MY_LifeBar/src/MY_LifeBar_LB.lua new file mode 100644 index 000000000..bfbefaf51 --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar_LB.lua @@ -0,0 +1,583 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条类 只做UI渲染控制 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar_LB' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local LB = class() +local HP = MY_LifeBar_HP +local CACHE = setmetatable({}, { __mode = 'v' }) + +local function InitConfigData(self) + -- 配色 + self.r = 0 + self.g = 0 + self.b = 0 + self.a = 0 + self.cfx = nil + self.font = 10 + self.scale = 1 + self.priority = 0 + self.priority_invalid = false + -- 倒计时/名字/帮会/称号部分 + self.cd_visible = true + self.cd_text = '' + self.name_visible = true + self.name_text = '' + self.kungfu_visible = true + self.kungfu_text = '' + self.distance_visible = true + self.distance = '' + self.distance_fmt = '' + self.tong_visible = true + self.tong_text = '' + self.title_visible = true + self.title_text = '' + self.texts_y = 100 + self.texts_height = 20 + self.texts_scale = 1 + self.texts_spacing = 1 + self.texts_invalid = true + self.texts_lines = 0 + -- 血量部分 + self.life = 1 + self.max_life = 1 + -- 血量数值部分 + self.life_text_visible = true + self.life_text_x = 0 + self.life_text_y = 42 + self.life_text_fmt = '' + self.life_text_invalid = true + -- 血条部分 + self.life_bar_visible = true + self.life_bar_x = 0 + self.life_bar_y = 0 + self.life_bar_w = 0 + self.life_bar_h = 0 + self.life_bar_padding = 0 + self.life_bar_direction = 'LEFT_RIGHT' + self.life_bar_invalid = true + self.life_bar_border = 0 + self.life_bar_border_r = 0 + self.life_bar_border_g = 0 + self.life_bar_border_b = 0 + self.life_bar_border_invalid = true + -- 特效 + self.sfx_file = nil + self.sfx_scale = 1 + self.sfx_w = 0 + self.sfx_h = 0 + self.sfx_invalid = true + -- 泡泡 + self.balloon_msg = '' + self.balloon_start = 0 + self.balloon_during = 0 + self.balloon_offset_y = 0 + self.balloon_invalid = true +end + +-- 构造函数 +function LB:ctor(dwType, dwID) + self.type = dwType + self.id = dwID + self.hp = HP(dwType, dwID) + InitConfigData(self) + return self +end + +-- 创建UI +function LB:Create() + if not self.hp.handle then + self.hp:Create() + self:SetInvalid('sfx', true) + self:SetInvalid('balloon', true) + self:SetInvalid('texts', true) + self:SetInvalid('priority', true) + self:SetInvalid('life_text', true) + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +-- 删除UI +function LB:Remove() + self.hp:Remove() + return self +end + +function LB:SetInvalid(key, force) + if force or self[key .. '_visible'] ~= false then + self[key .. '_invalid'] = true + end + return self +end + +-- 重绘无效区域 +function LB:Paint(force) + if self.hp.handle then + self:DrawLifeBorder(force) + self:DrawLife(force) + self:DrawTexts(force) + self:ApplySFX(force) + self:ApplyBalloon(force) + self:ApplyPriority(force) + end + return self +end + +function LB:SetColor(r, g, b, a) + if self.r ~= r or self.g ~= g + or self.b ~= b or self.a ~= a then + self.r = r + self.g = g + self.b = b + self.a = a + self:SetInvalid('life_bar') + self:SetInvalid('life_text') + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetColorFx(cfx) + if self.cfx ~= cfx then + self.cfx = cfx + self:SetInvalid('life_bar') + self:SetInvalid('life_text') + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetScale(scale) + if self.scale ~= scale then + self.scale = scale + self:SetInvalid('sfx', true) + self:SetInvalid('balloon', true) + self:SetInvalid('texts', true) + self:SetInvalid('life_text', true) + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetPriority(priority) + if self.priority ~= priority then + self.priority = priority + self:SetInvalid('priority', true) + end + return self +end + +function LB:ApplyPriority(force) + if self.priority_invalid or force then + self.hp:SetPriority(self.priority) + self.priority_invalid = false + end + return self +end + +function LB:SetFont(font) + if self.font ~= font then + self.font = font + self:SetInvalid('life_text') + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTextsPos(y, height) + if self.texts_y ~= y or self.texts_height ~= height then + self.texts_y = y + self.texts_height = height + self:SetInvalid('sfx', true) + self:SetInvalid('balloon', true) + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTextsScale(scale) + if self.texts_scale ~= scale then + self.texts_scale = scale + self:SetInvalid('texts', true) + self:SetInvalid('life_text', true) + end + return self +end + +function LB:SetTextsSpacing(spacing) + if self.texts_spacing ~= spacing then + self.texts_spacing = spacing + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetNameVisible(visible) + if self.name_visible ~= visible then + self.name_visible = visible + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetCD(text) + if self.cd_text ~= text then + self.cd_text = text + self:SetInvalid('texts', true) + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetName(text) + if self.name_text ~= text then + self.name_text = text + self:SetInvalid('texts', true) + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetDistanceVisible(visible) + if self.distance_visible ~= visible then + self.distance_visible = visible + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetDistance(distance) + if self.distance ~= distance then + self.distance = distance + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetDistanceFmt(fmt) + if self.distance_fmt ~= fmt then + self.distance_fmt = fmt + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetKungfuVisible(visible) + if self.kungfu_visible ~= visible then + self.kungfu_visible = visible + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetKungfu(text) + if self.kungfu_text ~= text then + self.kungfu_text = text + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTitleVisible(visible) + if self.title_visible ~= visible then + self.title_visible = visible + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTitle(text) + if self.title_text ~= text then + self.title_text = text + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTongVisible(visible) + if self.tong_visible ~= visible then + self.tong_visible = visible + self:SetInvalid('texts', true) + end + return self +end + +function LB:SetTong(text) + if self.tong_text ~= text then + self.tong_text = text + self:SetInvalid('texts', true) + end + return self +end + +function LB:DrawTexts(force) + if self.texts_invalid or force then + local aTexts = {} + local r, g, b, a, f = self.r, self.g, self.b, self.a, self.font + if self.cfx then + r, g, b, a = self.cfx(r, g, b, a) + end + if self.tong_visible and self.tong_text ~= '' then + table.insert(aTexts, '[' .. self.tong_text .. ']') + end + if self.title_visible and self.title_text ~= '' then + table.insert(aTexts, '<' .. self.title_text .. '>') + end + local text = '' + if self.name_visible then + if self.name_text and self.name_text ~= '' then + text = text .. self.name_text + end + if self.kungfu_visible and self.kungfu_text and self.kungfu_text ~= '' then + if text ~= '' then + text = text .. _L.SPLIT_DOT + end + text = text .. self.kungfu_text + end + if self.distance_visible and self.distance and self.distance ~= 0 then + if text ~= '' then + text = text .. _L.SPLIT_DOT + end + text = text .. self.distance_fmt:format(self.distance) + end + table.insert(aTexts, text) + end + if self.cd_visible and self.cd_text ~= '' then + table.insert(aTexts, self.cd_text) + end + self.hp:DrawTexts(aTexts, self.texts_y * self.scale, self.texts_height * self.texts_scale * self.scale, r, g, b, a, f, self.texts_spacing, self.texts_scale * self.scale) + -- 刷新与文本行数有关的东西 + local texts_lines = #aTexts + if self.texts_lines ~= texts_lines then + self.texts_lines = texts_lines + self:SetInvalid('sfx', true) + self:SetInvalid('balloon', true) + end + self.texts_invalid = false + end + return self +end + +-- 设置血量 +function LB:SetLife(life, max_life) + if self.life ~= life or self.max_life ~= max_life then + self.life = life + self.max_life = max_life + self:SetInvalid('life_bar') + self:SetInvalid('life_text') + end + return self +end + +function LB:SetLifeBarVisible(life_bar_visible) + if self.life_bar_visible ~= life_bar_visible then + self.life_bar_visible = life_bar_visible + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetLifeBar(x, y, w, h, padding) + if self.life_bar_x ~= x or self.life_bar_y ~= y or self.life_bar_w ~= w or self.life_bar_h ~= h or self.life_bar_padding ~= padding then + self.life_bar_x = x + self.life_bar_y = y + self.life_bar_w = w + self.life_bar_h = h + self.life_bar_padding = padding + self:SetInvalid('life_bar', true) + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetLifeBarBorder(n, r, g, b) + if self.life_bar_border ~= n or self.life_bar_border_r ~= r or self.life_bar_border_g ~= g or self.life_bar_border_b ~= b then + self.life_bar_border = n + self.life_bar_border_r = r + self.life_bar_border_g = g + self.life_bar_border_b = b + self:SetInvalid('life_bar_border', true) + end + return self +end + +function LB:SetLifeTextVisible(life_text_visible) + if self.life_text_visible ~= life_text_visible then + self.life_text_visible = life_text_visible + self:SetInvalid('life_text', true) + end + return self +end + +function LB:SetLifeText(x, y, fmt) + if self.life_text_x ~= x or self.life_text_y ~= y or self.life_text_fmt ~= fmt then + self.life_text_x = x + self.life_text_y = y + self.life_text_fmt = fmt + self:SetInvalid('life_text', true) + end + return self +end + +-- 血条边框 +function LB:DrawLifeBorder(force) + if self.life_bar_border_invalid or force then + if self.life_bar_visible then + self.hp:DrawLifeBorder( + self.life_bar_w * self.scale, self.life_bar_h * self.scale, + self.life_bar_x * self.scale, self.life_bar_y * self.scale, + self.life_bar_border, + self.life_bar_border_r, self.life_bar_border_g, self.life_bar_border_b, self.a + ) + else + self.hp:ClearLifeBorder() + end + self.life_bar_border_invalid = false + end + return self +end + +function LB:DrawLife(force) + if self.life_bar_invalid or self.life_bar_border_invalid or self.life_text_invalid or force then + local r, g, b, a, f = self.r, self.g, self.b, self.a, self.font + if self.cfx then + r, g, b, a = self.cfx(r, g, b, a) + end + if self.life_bar_invalid or force then + if self.life_bar_visible then + self.hp:DrawLifeBar( + self.life_bar_w * self.scale, self.life_bar_h * self.scale, + self.life_bar_x * self.scale, self.life_bar_y * self.scale, + self.life_bar_padding, r, g, b, a, + self.life / self.max_life, self.life_bar_direction + ) + else + self.hp:ClearLifeBar() + end + self.life_bar_invalid = false + end + if self.life_text_invalid or force then + if self.life_text_visible then + self.hp:DrawLifeText( + self.life_text_fmt:format(100 * self.life / self.max_life), + self.life_text_x * self.scale, self.life_text_y * self.scale, + r, g, b, a, f, + self.texts_spacing, self.texts_scale * self.scale + ) + else + self.hp:ClearLifeText() + end + self.life_text_invalid = false + end + end + return self +end + +function LB:SetSFX(file, scale, y, w, h) + if self.sfx_file ~= file or self.sfx_y ~= y + or self.sfx_scale ~= scale or self.sfx_w ~= w or self.sfx_h ~= h then + self.sfx_file = file + self.sfx_scale = scale or 0 + self.sfx_y = y or 0 + self.sfx_w = w or 0 + self.sfx_h = h or 0 + self:SetInvalid('sfx', true) + end + return self +end + +function LB:ClearSFX() + return self:SetSFX() +end + +function LB:ApplySFX(force) + if self.sfx_invalid or force then + if self.sfx_file then + self.hp:SetSFX( + self.sfx_file, + self.sfx_scale / Station.GetUIScale() * self.scale, + self.sfx_w * self.sfx_scale / Station.GetUIScale() * self.scale, + self.sfx_h * self.sfx_scale / Station.GetUIScale() * self.scale, + (self.texts_y + self.texts_height * self.texts_scale * self.texts_lines + self.sfx_y) / Station.GetUIScale() * self.scale + ) + else + self.hp:ClearSFX() + end + self.sfx_invalid = false + end + return self +end + +function LB:SetBalloon(msg, tick, during, offset_y) + if self.balloon_msg ~= msg or self.balloon_start ~= tick or self.balloon_offset_y ~= offset_y then + self.balloon_msg = msg + self.balloon_start = tick + self.balloon_during = during + self.balloon_offset_y = offset_y + self:SetInvalid('balloon', true) + end + return self +end + +function LB:ClearBalloon() + return self:SetBalloon() +end + +function LB:ApplyBalloon(force) + if self.balloon_invalid or force then + if self.balloon_msg then + self.hp:SetBalloon( + self.balloon_msg, + self.balloon_start, + self.balloon_during, + self.sfx_h * self.sfx_scale / Station.GetUIScale() * self.scale + + (self.texts_y + + self.texts_height * self.texts_scale * self.texts_lines + + self.sfx_y + + self.balloon_offset_y) / Station.GetUIScale() * self.scale + ) + else + self.hp:ClearBalloon() + end + self.balloon_invalid = false + end + return self +end + +function MY_LifeBar_LB(dwType, dwID) + if dwType == 'clear' then + CACHE = {} + HP('clear') + else + local szName = dwType .. '_' .. dwID + if not CACHE[szName] then + CACHE[szName] = LB.new(dwType, dwID) + end + return CACHE[szName] + end +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar_Official.lua b/MY_LifeBar/src/MY_LifeBar_Official.lua new file mode 100644 index 000000000..de0496cc2 --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar_Official.lua @@ -0,0 +1,299 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 扁平血条 - 官方托管 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar_Official' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local D = {} +local COUNTDOWN_CACHE = {} + +local CACHE_ON_TOP, nTop = {} +local function ApplyCaptionOnTop(dwID) + nTop = CACHE_ON_TOP[dwID] + if not nTop then + return + end + rlcmd('set caption on top ' .. dwID .. ' ' .. nTop) +end +local function SetCaptionOnTop(dwID, bTop) + nTop = bTop and 1 or 0 + if CACHE_ON_TOP[dwID] == nTop then + return + end + CACHE_ON_TOP[dwID] = nTop + ApplyCaptionOnTop(dwID) +end + +local CACHE_ZOOM_IN, nZoomIn = {} +local function ApplyCaptionZoomIn(dwID) + nZoomIn = CACHE_ZOOM_IN[dwID] + if not nZoomIn then + return + end + rlcmd('set caption zoom in ' .. dwID .. ' ' .. nZoomIn) +end +local function SetCaptionZoomIn(dwID, bZoomIn) + nZoomIn = bZoomIn and 1 or 0 + if CACHE_ZOOM_IN[dwID] == nZoomIn then + return + end + CACHE_ZOOM_IN[dwID] = nZoomIn + ApplyCaptionZoomIn(dwID) +end + +local CACHE_EXTRA_TEXT, szExtraText = {} +local function ApplyCaptionExtraText(dwID) + szExtraText = CACHE_EXTRA_TEXT[dwID] + if not szExtraText then + return + end + rlcmd('set caption extra text ' .. dwID .. ' ' .. szExtraText) +end +local function SetCaptionExtraText(dwID, szExtraText) + if CACHE_EXTRA_TEXT[dwID] == szExtraText then + return + end + CACHE_EXTRA_TEXT[dwID] = szExtraText + ApplyCaptionExtraText(dwID) +end + +local CACHE_CAPTION_COLOR, tColor = {} +local function RGB2Dword(nR, nG, nB, nA) return nA * 16777216 + nR * 65536 + nG * 256 + nB end +local function fxTarget(nR, nG, nB, nA) return math.ceil(255 - (255 - nR) * 0.3), math.ceil(255 - (255 - nG) * 0.3), math.ceil(255 - (255 - nB) * 0.3), nA end +local function fxDeath(nR, nG, nB, nA) return math.ceil(nR * 0.4), math.ceil(nG * 0.4), math.ceil(nB * 0.4), nA end +local function fxDeathTarget(nR, nG, nB, nA) return math.ceil(nR * 0.45), math.ceil(nG * 0.45), math.ceil(nB * 0.45), nA end +local function ApplyCaptionColor(dwID) + tColor = CACHE_CAPTION_COLOR[dwID] + if not tColor then + return + end + local KTarget, dwColor = (X.IsPlayer(dwID) and X.GetPlayer or X.GetNpc)(dwID), tColor.dwColor + if KTarget then + local me = X.GetClientPlayer() + if dwID == select(2, X.GetCharacterTarget(me)) then + if KTarget.nMoveState == MOVE_STATE.ON_DEATH then + dwColor = tColor.dwDeathTargetColor + else + dwColor = tColor.dwTargetColor + end + elseif KTarget.nMoveState == MOVE_STATE.ON_DEATH then + dwColor = tColor.dwDeathColor + end + end + rlcmd('set plugin caption color ' .. dwID .. ' 1 ' .. dwColor) +end +local function SetCaptionColor(dwID, nR, nG, nB) + tColor = CACHE_CAPTION_COLOR[dwID] + if tColor and tColor.nR == nR and tColor.nG == nG and tColor.nB == nB then + return + end + tColor = { + nR = nR, + nG = nG, + nB = nB, + dwColor = RGB2Dword(nR, nG, nB, 255), + dwTargetColor = RGB2Dword(fxTarget(nR, nG, nB, 255)), + dwDeathColor = RGB2Dword(fxDeath(nR, nG, nB, 255)), + dwDeathTargetColor = RGB2Dword(fxDeathTarget(nR, nG, nB, 255)), + } + CACHE_CAPTION_COLOR[dwID] = tColor + ApplyCaptionColor(dwID) +end +X.RegisterEvent('TARGET_CHANGE', 'MY_LifeBar_Official', function() + -- arg0: dwPrevID, arg1: dwPrevType, arg2: dwID, arg3: dwType + local dwPrevID, dwID = arg0, arg2 + ApplyCaptionColor(dwPrevID) + ApplyCaptionColor(dwID) +end) + +local function ApplyCaption(dwID) + ApplyCaptionOnTop(dwID) + ApplyCaptionZoomIn(dwID) + ApplyCaptionExtraText(dwID) + ApplyCaptionColor(dwID) +end + +local function ResetCaption(dwID) + CACHE_ON_TOP[dwID] = nil + CACHE_ZOOM_IN[dwID] = nil + CACHE_EXTRA_TEXT[dwID] = nil + CACHE_CAPTION_COLOR[dwID] = nil + rlcmd('reset caption ' .. dwID) +end + +function D.PrioritySorter(a, b) + if not a.nPriority then + return false + end + if not b.nPriority then + return true + end + return a.nPriority < b.nPriority +end + +local KTarget, aCountDown, nR, nG, nB, bReset +local tCountDownItem, szCountDownText, nCountDownSecond, fCountDownPercent +function D.DrawLifeBar(dwID) + KTarget = (X.IsPlayer(dwID) and X.GetPlayer or X.GetNpc)(dwID) + if not KTarget then + return + end + aCountDown = COUNTDOWN_CACHE[dwID] + nR, nG, nB, bReset = nil, nil, nil, false + while aCountDown and #aCountDown > 0 do + tCountDownItem, szCountDownText, nCountDownSecond, fCountDownPercent = aCountDown[1], nil, nil, nil + -- 根据不同类型倒计时计算倒计时时间、文字 + if tCountDownItem.szType == 'BUFF' or tCountDownItem.szType == 'DEBUFF' then + local KBuff = KTarget.GetBuff(tCountDownItem.dwBuffID, 0) + if KBuff then + nCountDownSecond = (KBuff.GetEndTime() - GetLogicFrameCount()) / X.ENVIRONMENT.GAME_FPS + szCountDownText = tCountDownItem.szText or X.GetBuffName(KBuff.dwID, KBuff.nLevel) + if KBuff.nStackNum > 1 then + szCountDownText = szCountDownText .. 'x' .. KBuff.nStackNum + end + end + elseif tCountDownItem.szType == 'CASTING' then + local nType, dwSkillID, dwSkillLevel, fCastPercent = X.GetCharacterOTActionState(KTarget) + if dwSkillID == tCountDownItem.dwSkillID + and ( + nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE + ) then + fCountDownPercent = fCastPercent + szCountDownText = tCountDownItem.szText or X.GetSkillName(dwSkillID, dwSkillLevel) + end + elseif tCountDownItem.szType == 'NPC' or tCountDownItem.szType == 'DOODAD' then + szCountDownText = tCountDownItem.szText or '' + else --if tData.szType == 'TIME' then + if tCountDownItem.nLogicFrame then + nCountDownSecond = (tCountDownItem.nLogicFrame - GetLogicFrameCount()) / X.ENVIRONMENT.GAME_FPS + elseif tCountDownItem.nTime then + nCountDownSecond = (tCountDownItem.nTime - GetTime()) / 1000 + end + if nCountDownSecond > 0 then + szCountDownText = tCountDownItem.szText or '' + end + end + -- 剩余时间不大于零不需要显示 + if nCountDownSecond and nCountDownSecond <= 0 then + nCountDownSecond = nil + end + -- 百分比不大于零不需要显示 + if fCountDownPercent and fCountDownPercent <= 0 then + fCountDownPercent = nil + end + -- 如果是可用倒计时显示,中断剩余的判断 + if szCountDownText then + if tCountDownItem.tColor then + nR, nG, nB = unpack(tCountDownItem.tColor) + end + if not X.IsEmpty(szCountDownText) and not tCountDownItem.bHideProgress then + if nCountDownSecond then + szCountDownText = szCountDownText .. '_' .. X.FormatDuration(math.min(nCountDownSecond, 5999), 'PRIME') + elseif fCountDownPercent then + szCountDownText = szCountDownText .. '_' .. math.floor(fCountDownPercent * 100) .. '%' + end + end + break + end + -- 如果没有找到可用倒计时,则移除该倒计时 + bReset = true + table.remove(aCountDown, 1) + end + if bReset then + ResetCaption(dwID) + end + if szCountDownText then + SetCaptionOnTop(dwID, true) + SetCaptionZoomIn(dwID, true) + SetCaptionExtraText(dwID, szCountDownText) + if nR and nG and nB then + SetCaptionColor(dwID, nR, nG, nB) + end + elseif #aCountDown == 0 then + COUNTDOWN_CACHE[dwID] = nil + end +end + +X.BreatheCall('MY_LifeBar_Official', function() + for dwID, _ in pairs(COUNTDOWN_CACHE) do + D.DrawLifeBar(dwID) + end +end) + +function D.ProcessCountdown(dwID, szType, szKey, tData) + if not COUNTDOWN_CACHE[dwID] then + COUNTDOWN_CACHE[dwID] = {} + end + local bReset = false + for i, p in X.ipairs_r(COUNTDOWN_CACHE[dwID]) do + if p.szType == szType and p.szKey == szKey then + bReset = true + table.remove(COUNTDOWN_CACHE[dwID], i) + end + end + if bReset then + ResetCaption(dwID) + end + if tData then + local tData = X.Clone(tData) + if tData.col then + local r, g, b = X.HumanColor2RGB(tData.col) + if r and g and b then + tData.tColor = {r, g, b} + end + tData.col = nil + end + tData.szType = szType + tData.szKey = szKey + table.insert(COUNTDOWN_CACHE[dwID], 1, tData) + table.sort(COUNTDOWN_CACHE[dwID], D.PrioritySorter) + elseif #COUNTDOWN_CACHE[dwID] == 0 then + COUNTDOWN_CACHE[dwID] = nil + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_LifeBar_Official', + exports = { + { + preset = 'UIEvent', + fields = { + 'ProcessCountdown' + }, + root = D, + }, + }, +} +MY_LifeBar_Official = X.CreateModule(settings) +end + +X.RegisterEvent({'PLAYER_ENTER_SCENE', 'NPC_ENTER_SCENE'}, 'MY_LifeBar_Official', function() + local dwID = arg0 + X.DelayCall(function() ApplyCaption(dwID) end) + X.DelayCall(200, function() ApplyCaption(dwID) end) + X.DelayCall(500, function() ApplyCaption(dwID) end) +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_LifeBar/src/MY_LifeBar_ScreenArrow.lua b/MY_LifeBar/src/MY_LifeBar_ScreenArrow.lua new file mode 100644 index 000000000..936d010da --- /dev/null +++ b/MY_LifeBar/src/MY_LifeBar_ScreenArrow.lua @@ -0,0 +1,888 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 头顶箭头 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_LifeBar/MY_LifeBar_ScreenArrow' +local PLUGIN_NAME = 'MY_LifeBar' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LifeBar_ScreenArrow' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_LifeBar_ScreenArrow', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_LifeBar_ScreenArrow', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Enable'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + fUIScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['UI scale'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Number, + xDefaultValue = 0.8, + }, + fTextScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Text scale'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Number, + xDefaultValue = 1.35, + }, + bAlert = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Less life/mana head alert'], + _L['Enable'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bOnlySelf = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Less life/mana head alert'], + _L['Only monitor self'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + fLifePer = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Less life/mana head alert'], + _L['While HP less than'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Number, + xDefaultValue = 0.3, + }, + fManaPer = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Less life/mana head alert'], + _L['While MP less than'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Number, + xDefaultValue = 0.1, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Less life/mana head alert'], + g_tStrings.FONT, + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Number, + xDefaultValue = 186, + }, + bDrawColor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_LifeBar'], + szDescription = X.MakeCaption({ + _L['MY_LifeBar_ScreenArrow'], + _L['Draw School Color'], + }), + szRestriction = 'MY_LifeBar_ScreenArrow', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + tCache = { + ['Life'] = {}, + ['Mana'] = {}, + } +} +local Config = MY_LifeBar_Config + +local UI_SCALE = 1 +local FORCE_DRAW = false +local HANDLE +local CACHE = { + [TARGET.DOODAD] = {}, + [TARGET.PLAYER] = {}, + [TARGET.NPC] = {}, +} +local SA = {} +SA.__index = SA + +local SA_COLOR = { + FONT = { + ['BUFF' ] = { 255, 128, 0 }, + ['DEBUFF' ] = { 255, 0, 255 }, + ['Life' ] = { 130, 255, 130 }, + ['Mana' ] = { 255, 255, 128 }, + ['NPC' ] = { 0, 255, 255 }, + ['CASTING'] = { 150, 200, 255 }, + ['DOODAD' ] = { 200, 200, 255 }, + ['TIME' ] = { 128, 255, 255 }, + }, + ARROW = { + ['BUFF' ] = { 0, 255, 0 }, + ['DEBUFF' ] = { 255, 0, 0 }, + ['Life' ] = { 255, 0, 0 }, + ['Mana' ] = { 0, 0, 255 }, + ['NPC' ] = { 0, 128, 255 }, + ['CASTING'] = { 255, 128, 0 }, + ['DOODAD' ] = { 200, 200, 255 }, + ['TIME' ] = { 255, 0, 0 }, + } +} +do + local mt = { __index = function() return { 255, 128, 0 } end } + setmetatable(SA_COLOR.FONT, mt) + setmetatable(SA_COLOR.ARROW, mt) +end + +local BASE_SA_POINT_C = { 25, 25, 180 } +local BASE_SA_POINT = { + { 15, 0, 100 }, + { 35, 0, 100 }, + { 35, 25, 180 }, + { 43, 25, 255 }, + { 25, 50, 180 }, + { 7, 25, 255 }, + { 15, 25, 180 }, +} + +local BASE_WIDTH +local BASE_HEIGHT +local BASE_PEAK +local BASE_EDGE +local SA_POINT_C = {} +local SA_POINT = {} +local BASE_POINT_START +local function SetUIScale() + local fScale = Station.GetMaxUIScale() * (D.bReady and O.fUIScale or 0.8) + UI_SCALE = Station.GetUIScale() + FORCE_DRAW = true + BASE_PEAK = -60 * fScale * 0.5 + BASE_WIDTH = 100 * fScale + BASE_HEIGHT = 12 * fScale + BASE_EDGE = fScale * 1.2 + BASE_POINT_START = 15 * fScale + SA_POINT_C = {} + SA_POINT = {} + for k, v in ipairs(BASE_SA_POINT_C) do + if k ~= 3 then + SA_POINT_C[k] = v * fScale + else + SA_POINT_C[k] = v + end + end + for k, v in ipairs(BASE_SA_POINT) do + SA_POINT[k] = {} + for kk, vv in ipairs(v) do + if kk ~= 3 then + SA_POINT[k][kk] = vv * fScale + else + SA_POINT[k][kk] = vv + end + end + end +end + +local function RGB2Dword(nR, nG, nB, nA) return (nA or 255) * 16777216 + nR * 65536 + nG * 256 + nB end + +-- for i=1, 2 do FireUIEvent('MY_LIFEBAR_COUNTDOWN', GetClientPlayer().dwID, 'TIME', { col = { 255, 255, 255 }, szText = 'test' })end +local function CreateScreenArrow(dwID, szType, tArgs) + if not D.IsEnabled() then + return + end + tArgs = tArgs or {} + if SA:ctor(dwID, szType, tArgs) then + return true + end + return false +end + +function D.IsEnabled() + return D.bReady and O.bEnable and not X.IsRestricted('MY_LifeBar_ScreenArrow') +end + +function D.ProcessCountdown(dwID, szType, szKey, tArgs) + if CreateScreenArrow(dwID, szType, tArgs) then + return true + end + return false +end + +function D.OnSort() + local t = {} + for k, v in pairs(HANDLE:GetAllItem(true)) do + PostThreadCall(function(v, xScreen, yScreen) + v.nIndex = yScreen or 0 + end, v, 'Scene_GetCharacterTopScreenPos', v.dwID) + table.insert(t, { handle = v, index = v.nIndex or 0 }) + end + table.sort(t, function(a, b) return a.index < b.index end) + for i = #t, 1, -1 do + if t[i].handle and t[i].handle:GetIndex() ~= i - 1 then + t[i].handle:ExchangeIndex(i - 1) + end + end +end + +function D.OnBreathe() + if not D.bReady then + return + end + local me = GetClientPlayer() + if not me then + return + end + local team = GetClientTeam() + local tTeamMark = team.dwTeamID > 0 and team.GetTeamMark() or EMPTY_TABLE + for dwType, tab in pairs(CACHE) do + for dwID, v in pairs(tab) do + local kTarget, tInfo = select(2, D.GetObject(dwType, dwID)) + if kTarget then + local oo = D.GetAction(dwType, dwID) + local fLifePer = oo.dwType == TARGET.DOODAD and 1 or tInfo.nCurrentLife / math.max(tInfo.nMaxLife, tInfo.nCurrentLife, 1) + local fManaPer = oo.dwType == TARGET.DOODAD and 1 or tInfo.nCurrentMana / math.max(tInfo.nMaxMana, tInfo.nCurrentMana, 1) + local szName = oo.szName + if not szName then + if dwType == TARGET.DOODAD then + szName = tInfo.szName + elseif dwType == TARGET.NPC then + szName = X.GetNpcTemplateName(kTarget.dwTemplateID) + else + szName = X.GetTargetName(dwType, dwID) + szName = X.ExtractPlayerBaseName(szName) + end + oo.szName = szName + end + if tTeamMark[dwID] then + szName = szName .. _L('[%s]', X.CONSTANT.TEAM_MARK_NAME[tTeamMark[dwID]]) + end + local txt = '' + if oo.szType == 'BUFF' or oo.szType == 'DEBUFF' then + -- local KBuff = GetBuff(obj.dwBuffID, object) -- 只判断dwID 反正不可能同时获得不同lv + local KBuff = kTarget.GetBuff(oo.dwBuffID, 0) -- 只判断dwID 反正不可能同时获得不同lv + if KBuff then + local nSec = X.GetEndTime(KBuff.GetEndTime()) + local szDuration = X.FormatDuration(math.min(nSec, 5999), 'PRIME') + if KBuff.nStackNum > 1 then + txt = string.format('%s(%d)_%s', oo.txt or X.GetBuffName(KBuff.dwID, KBuff.nLevel), KBuff.nStackNum, szDuration) + else + txt = string.format('%s_%s', oo.txt or X.GetBuffName(KBuff.dwID, KBuff.nLevel), szDuration) + end + else + return oo:Free() + end + elseif oo.szType == 'Life' or oo.szType == 'Mana' then + if kTarget.nMoveState == MOVE_STATE.ON_DEATH then + return oo:Free() + end + if oo.szType == 'Life' then + if fLifePer > O.fLifePer then + return oo:Free() + end + txt = g_tStrings.STR_SKILL_H_LIFE_COST .. string.format('%d/%d', tInfo.nCurrentLife, tInfo.nMaxLife) + elseif oo.szType == 'Mana' then + if fManaPer > O.fManaPer then + return oo:Free() + end + txt = g_tStrings.STR_SKILL_H_MANA_COST .. string.format('%d/%d', tInfo.nCurrentMana, tInfo.nMaxMana) + end + elseif oo.szType == 'CASTING' then + local nType, dwSkillID, dwSkillLevel, fCastPercent = X.GetCharacterOTActionState(kTarget) + if nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE then + txt = oo.txt or X.GetSkillName(dwSkillID, dwSkillLevel) + fManaPer = fCastPercent + else + return oo:Free() + end + elseif oo.szType == 'NPC' or oo.szType == 'DOODAD' then + txt = oo.txt or txt + elseif oo.szType == 'TIME' then + if (GetTime() - oo.nNow) / 1000 > 5 then + return oo:Free() + end + txt = oo.txt or _L['Call Alert'] + end + if not oo.init or FORCE_DRAW then + oo:DrawBackGround() + end + oo:DrawLifeBar(fLifePer, fManaPer):DrawText(txt, szName):DrawArrow() + if dwType == TARGET.PLAYER then + local dwKungfuID = -1 + if dwID == X.GetClientPlayerID() then + dwKungfuID = UI_GetPlayerMountKungfuID() + else + local info = X.GetTeamMemberInfo(dwID) + if info and not X.IsEmpty(info.dwActualKungfuID) then + dwKungfuID = info.dwActualKungfuID + else + local kungfu = kTarget.GetKungfuMount() + if kungfu then + dwKungfuID = kungfu.dwSkillID + end + end + end + rlcmd(string.format("set caption kungfu icon %u %u %u", dwID, 1, dwKungfuID)) + end + -- 这里要想办法覆盖C++的颜色设置 C++代码上有个强制逻辑 优先级比rlcmd还高 估计是两个人写的 + local szRelation = X.GetCharacterRelation(UI_GetClientPlayerID(), dwID) + local aColor = Config('get', 'Color', szRelation, IsPlayer(dwID) and 'Player' or 'Npc') + if aColor then + rlcmd(string.format("set plugin caption color %u %u %u", dwID, 1, RGB2Dword(unpack(aColor)))) + end + else + for _, vv in pairs(v) do + vv:Free() + end + end + end + end + FORCE_DRAW = false +end + +function D.GetAction(dwType, dwID) + local tab = CACHE[dwType][dwID] + if #tab > 1 then + for k, v in ipairs(CACHE[dwType][dwID]) do + v:Hide() + end + end + local obj = CACHE[dwType][dwID][#CACHE[dwType][dwID]] + return obj:Show() +end + +function D.GetObject(szType, dwID) + local dwType, kTarget, tInfo + if szType == 'DOODAD' or szType == TARGET.DOODAD then + dwType = TARGET.DOODAD + kTarget = GetDoodad(dwID) + elseif IsPlayer(dwID) then + dwType = TARGET.PLAYER + local me = GetClientPlayer() + if dwID == me.dwID then + kTarget = me + elseif X.IsTeammate(dwID) then + kTarget = GetPlayer(dwID) + tInfo = GetClientTeam().GetMemberInfo(dwID) + else + kTarget = GetPlayer(dwID) + end + else + dwType = TARGET.NPC + kTarget = GetNpc(dwID) + end + tInfo = tInfo and tInfo or kTarget + return dwType, kTarget, tInfo +end + +function D.RegisterFight() + if arg0 and O.bAlert then + X.BreatheCall('ScreenArrow_Fight', D.OnBreatheFight) + else + D.KillBreathe() + end +end + +function D.KillBreathe() + X.BreatheCall('ScreenArrow_Fight', false) + D.tCache['Mana'] = {} + D.tCache['Life'] = {} +end + +function D.OnBreatheFight() + local me = GetClientPlayer() + if not me then return end + if not me.bFightState then -- kill fix bug + return D.KillBreathe() + end + local team = GetClientTeam() + local list = {} + if me.IsInParty() and not O.bOnlySelf then + list = team.GetTeamMemberList() + else + list[1] = me.dwID + end + for k, v in ipairs(list) do + local kTarget, tInfo = select(2, D.GetObject(TARGET.PLAYER, v)) + if kTarget and tInfo then + if kTarget.nMoveState == MOVE_STATE.ON_DEATH then + D.tCache['Mana'][v] = nil + D.tCache['Life'][v] = nil + else + local fLifePer = tInfo.nCurrentLife / math.max(tInfo.nMaxLife, tInfo.nCurrentLife, 1) + local fManaPer = tInfo.nCurrentMana / math.max(tInfo.nMaxMana, tInfo.nCurrentMana, 1) + if fLifePer < O.fLifePer then + if not D.tCache['Life'][v] then + D.tCache['Life'][v] = true + CreateScreenArrow(v, 'Life') + end + else + D.tCache['Life'][v] = nil + end + if fManaPer < O.fManaPer and (kTarget.dwForceID < 7 or kTarget.dwForceID == 22) then + if not D.tCache['Mana'][v] then + D.tCache['Mana'][v] = true + CreateScreenArrow(v, 'Mana') + end + else + D.tCache['Mana'][v] = nil + end + end + end + end +end + +function SA:ctor(dwID, szType, tArgs) + local dwType, kTarget = D.GetObject(szType, dwID) + if not X.IsDebugging() and not X.IsInDungeonMap(true) then + if dwType == TARGET.NPC and kTarget.bDialogFlag then + return + end + end + local ui = HANDLE:New() + local col = tArgs.col + if col then + col = {X.HumanColor2RGB(tArgs.col)} + else + col = SA_COLOR.ARROW[szType] + end + + local oo = {} + setmetatable(oo, self) + oo.szName = tArgs.szName + oo.txt = tArgs.szText + oo.col = col + oo.dwBuffID = tArgs.dwBuffID + oo.szType = szType + + oo.Arrow = ui:Lookup(0) + oo.Text = ui:Lookup(1) + oo.BGB = ui:Lookup(2) + oo.BGI = ui:Lookup(3) + oo.Life = ui:Lookup(4) + oo.Mana = ui:Lookup(5) + + oo.ui = ui + oo.ui.dwID = dwID + oo.init = false + oo.bUp = false + oo.nTop = 10 + oo.dwID = dwID + oo.dwType = dwType + if szType == 'TIME' then + oo.nNow = GetTime() + end + oo.Text:SetTriangleFan(GEOMETRY_TYPE.TEXT) + for k, v in pairs({ oo.BGB, oo.BGI, oo.Life, oo.Mana, oo.Arrow }) do + v:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + v:SetD3DPT(D3DPT.TRIANGLEFAN) + end + CACHE[dwType][dwID] = CACHE[dwType][dwID] or {} + table.insert(CACHE[dwType][dwID], oo) + return oo +end + +-- 从下至上 依次绘制 +function SA:DrawText( ... ) + self.Text:ClearTriangleFanPoint() + local nTop = BASE_PEAK - (BASE_EDGE * 2) + -- local r, g, b = unpack(SA_COLOR.FONT[self.szType]) + local r, g, b = unpack(self.col) + local i = 1 + for k, v in ipairs({ ... }) do + if v and v ~= '' then + local top = nTop + i * -18 * O.fTextScale * UI_SCALE + if self.dwType == TARGET.DOODAD then + self.Text:AppendDoodadID(self.dwID, r, g, b, 240, { 0, 0, 0, 0, top }, O.nFont, v, 1, O.fTextScale) + else + if O.bDrawColor and self.dwType == TARGET.PLAYER and k ~= 1 then + local kTarget = select(2, D.GetObject(self.szType, self.dwID)) + if kTarget then + r, g, b = X.GetForceColor(kTarget.dwForceID, 'foreground') + end + end + self.Text:AppendCharacterID(self.dwID, true, r, g, b, 240, { 0, 0, 0, 0, top }, O.nFont, v, 1, O.fTextScale) + end + i = i + 1 + end + end + return self +end + +function SA:DrawBackGround() + local bcX, bcY = -BASE_WIDTH / 2, BASE_PEAK + local doubleEdge = BASE_EDGE * 2 + self.BGB:ClearTriangleFanPoint() + self.BGI:ClearTriangleFanPoint() + if self.dwType == TARGET.DOODAD then + self.BGB:AppendDoodadID(self.dwID, 255, 255, 255, 200, { 0, 0, 0, bcX, bcY }) + self.BGB:AppendDoodadID(self.dwID, 255, 255, 255, 200, { 0, 0, 0, bcX + BASE_WIDTH, bcY }) + self.BGB:AppendDoodadID(self.dwID, 255, 255, 255, 200, { 0, 0, 0, bcX + BASE_WIDTH, bcY + BASE_HEIGHT }) + self.BGB:AppendDoodadID(self.dwID, 255, 255, 255, 200, { 0, 0, 0, bcX, bcY + BASE_HEIGHT }) + bcX, bcY = -BASE_WIDTH / 2 + BASE_EDGE, BASE_PEAK + BASE_EDGE + self.BGI:AppendDoodadID(self.dwID, 120, 120, 120, 80, { 0, 0, 0, bcX, bcY }) + self.BGI:AppendDoodadID(self.dwID, 120, 120, 120, 80, { 0, 0, 0, bcX + BASE_WIDTH - doubleEdge, bcY }) + self.BGI:AppendDoodadID(self.dwID, 120, 120, 120, 80, { 0, 0, 0, bcX + BASE_WIDTH - doubleEdge, bcY + BASE_HEIGHT - doubleEdge }) + self.BGI:AppendDoodadID(self.dwID, 120, 120, 120, 80, { 0, 0, 0, bcX, bcY + BASE_HEIGHT - doubleEdge}) + else + self.BGB:AppendCharacterID(self.dwID, true, 255, 255, 255, 200, { 0, 0, 0, bcX, bcY }) + self.BGB:AppendCharacterID(self.dwID, true, 255, 255, 255, 200, { 0, 0, 0, bcX + BASE_WIDTH, bcY }) + self.BGB:AppendCharacterID(self.dwID, true, 255, 255, 255, 200, { 0, 0, 0, bcX + BASE_WIDTH, bcY + BASE_HEIGHT }) + self.BGB:AppendCharacterID(self.dwID, true, 255, 255, 255, 200, { 0, 0, 0, bcX, bcY + BASE_HEIGHT }) + bcX, bcY = -BASE_WIDTH / 2 + BASE_EDGE, BASE_PEAK + BASE_EDGE + self.BGI:AppendCharacterID(self.dwID, true, 120, 120, 120, 80, { 0, 0, 0, bcX, bcY }) + self.BGI:AppendCharacterID(self.dwID, true, 120, 120, 120, 80, { 0, 0, 0, bcX + BASE_WIDTH - doubleEdge, bcY }) + self.BGI:AppendCharacterID(self.dwID, true, 120, 120, 120, 80, { 0, 0, 0, bcX + BASE_WIDTH - doubleEdge, bcY + BASE_HEIGHT - doubleEdge }) + self.BGI:AppendCharacterID(self.dwID, true, 120, 120, 120, 80, { 0, 0, 0, bcX, bcY + BASE_HEIGHT - doubleEdge}) + end + self.init = true + return self +end + +function SA:DrawLifeBar(fLifePer, fManaPer) + local height = BASE_HEIGHT / 2 - BASE_EDGE + local width = BASE_WIDTH - (BASE_EDGE * 2) + if fLifePer ~= self.fLifePer or FORCE_DRAW then + self.Life:ClearTriangleFanPoint() + if fLifePer > 0 then + local bcX, bcY = -BASE_WIDTH / 2 + BASE_EDGE, BASE_PEAK + BASE_EDGE + local r, g ,b = 220, 40, 0 + if self.dwType == TARGET.DOODAD then + self.Life:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX, bcY }) + self.Life:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX + (width * fLifePer), bcY }) + self.Life:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX + (width * fLifePer), bcY + height }) + self.Life:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX, bcY + height }) + else + self.Life:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX, bcY }) + self.Life:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX + (width * fLifePer), bcY }) + self.Life:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX + (width * fLifePer), bcY + height }) + self.Life:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX, bcY + height }) + end + end + self.fLifePer = fLifePer + end + if fManaPer ~= self.fManaPer or FORCE_DRAW then + self.Mana:ClearTriangleFanPoint() + if fManaPer > 0 then + local bcX, bcY = -BASE_WIDTH / 2 + BASE_EDGE, BASE_PEAK + height + BASE_EDGE + local r, g ,b = 50, 100, 255 + if self.szType == 'CASTING' then + r, g ,b = 255, 128, 0 + end + if self.dwType == TARGET.DOODAD then + self.Mana:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX, bcY }) + self.Mana:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX + (width * fManaPer), bcY }) + self.Mana:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX + (width * fManaPer), bcY + height }) + self.Mana:AppendDoodadID(self.dwID, r, g, b, 225, { 0, 0, 0, bcX, bcY + height }) + else + self.Mana:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX, bcY }) + self.Mana:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX + (width * fManaPer), bcY }) + self.Mana:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX + (width * fManaPer), bcY + height }) + self.Mana:AppendCharacterID(self.dwID, true, r, g, b, 225, { 0, 0, 0, bcX, bcY + height }) + end + end + self.fManaPer = fManaPer + end + return self +end + +function SA:DrawArrow() + local cX, cY, cA = unpack(SA_POINT_C) + cX, cY = cX * 0.7, cY * 0.7 + local fX, fY = BASE_POINT_START, -BASE_PEAK - BASE_HEIGHT + if self.bUp then + self.nTop = self.nTop + 2 + if self.nTop >= 10 then + self.bUp = false + end + else + self.nTop = self.nTop - 2 + if self.nTop <= 0 then + self.bUp = true + end + end + fY = fY - self.nTop + + self.Arrow:ClearTriangleFanPoint() + local r, g, b = unpack(self.col) + if self.dwType == TARGET.DOODAD then + self.Arrow:AppendDoodadID(self.dwID, r, g, b, cA, { 0, 0, 0, cX - fX, cY - fY }) + for k, v in ipairs(SA_POINT) do + local x, y, a = unpack(v) + x, y = x * 0.7, y * 0.7 + self.Arrow:AppendDoodadID(self.dwID, r, g, b, a, { 0, 0, 0, x - fX, y - fY }) + end + local x, y, a = unpack(SA_POINT[1]) + self.Arrow:AppendDoodadID(self.dwID, r, g, b, a, { 0, 0, 0, x - fX, y - fY }) + else + self.Arrow:AppendCharacterID(self.dwID, true, r, g, b, cA, { 0, 0, 0, cX - fX, cY - fY }) + for k, v in ipairs(SA_POINT) do + local x, y, a = unpack(v) + x, y = x * 0.7, y * 0.7 + self.Arrow:AppendCharacterID(self.dwID, true, r, g, b, a, { 0, 0, 0, x - fX, y - fY }) + end + local x, y, a = unpack(SA_POINT[1]) + self.Arrow:AppendCharacterID(self.dwID, true, r, g, b, a, { 0, 0, 0, x- fX, y - fY }) + end + return self +end + +function SA:Show() + self.ui:Show() + return self +end + +function SA:Hide() + self.ui:Hide() + return self +end + +function SA:Free() + rlcmd(string.format("set caption kungfu icon %u %u", self.dwID, 0)) + rlcmd(string.format("reset caption %u", self.dwID)) + + local tab = CACHE[self.dwType][self.dwID] + if #tab == 1 then + CACHE[self.dwType][self.dwID] = nil + else + for k, v in pairs(tab) do + if v.ui == self.ui then + table.remove(tab, k) + break + end + end + end + HANDLE:Free(self.ui) +end + +local PS = { nPriority = 13, szRestriction = 'MY_LifeBar_ScreenArrow' } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 30, 30 + local nX, nY = nPaddingX, nPaddingY + + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Screen head alarm'], font = 27 }):Height() + 5 + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox',{ + x = nX, y = nY, + text = _L['Enable'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + end + }):Width() + nY = nY + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Draw School Color'], + checked = O.bDrawColor, + onCheck = function(bChecked) + O.bDrawColor = bChecked + end, + autoEnable = function() return O.bEnable end, + }):Height() + 5 + + nX = nPaddingX + 10 + nX = nX + ui:Append('Text', { + x = nX, y = nY, + text = _L['UI scale'], + autoEnable = function() return O.bEnable end, + }):Width() + nY = nY + ui:Append('WndSlider', { + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 400 }, + text = function(value) return _L('%.1f%%', value) end, + value = O.fUIScale * 100, + onChange = function(value) + O.fUIScale = value / 100 + SetUIScale() + end, + autoEnable = function() return O.bEnable end, + }):Height() + + nX = nPaddingX + 10 + nX = nX + ui:Append('Text', { + x = nX, y = nY, + text = _L['Text scale'], + autoEnable = function() return O.bEnable end, + }):Width() + nY = nY + ui:Append('WndSlider', { + x = nX, y = nY, sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = { 0, 400 }, + text = function(value) return _L('%.1f%%', value) end, + value = O.fTextScale * 100, + onChange = function(value) + O.fTextScale = value / 100 + SetUIScale() + end, + autoEnable = function() return O.bEnable end, + }):Height() + + nX = nPaddingX + nY = nY + 10 + nY = nY + ui:Append('Text', { x = nX, y = nY + 5, text = _L['Less life/mana head alert'], font = 27 }):Height() + 10 + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox',{ + x = nX, y = nY, + text = _L['Enable'], + checked = O.bAlert, + onCheck = function(bChecked) + O.bAlert = bChecked + local me = GetClientPlayer() + if bChecked and me.bFightState then + X.BreatheCall('ScreenArrow_Fight', D.OnBreatheFight) + else + D.KillBreathe() + end + end, + autoEnable = function() return O.bEnable end, + }):Width() + 10 + nY = nY + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Only monitor self'], + checked = O.bOnlySelf, + onCheck = function(bChecked) + O.bOnlySelf = bChecked + end, + autoEnable = function() return O.bEnable and O.bAlert end, + }):Height() + 5 + + nX = nPaddingX + 10 + nX = nX + ui:Append('Text', { + x = nX, y = nY, + text = _L['While HP less than'], + autoEnable = function() return O.bEnable and O.bAlert end, + }):Width() + 10 + nY = nY + ui:Append('WndSlider', { + x = nX, y = nY + 3, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {0, 100}, + text = function(value) return value .. '%' end, + value = O.fLifePer * 100, + onChange = function(nVal) O.fLifePer = nVal / 100 end, + autoEnable = function() return O.bEnable and O.bAlert end, + }):Height() + + nX = nPaddingX + 10 + nX = nX + ui:Append('Text', { + x = nX, y = nY, + text = _L['While MP less than'], + autoEnable = function() return O.bEnable and O.bAlert end, + }):Width() + nX = nX + 10 + nY = nY + ui:Append('WndSlider', { + x = nX, y = nY + 3, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {0, 100}, + text = function(value) return value .. '%' end, + value = O.fManaPer * 100, + onChange = function(nVal) O.fManaPer = nVal / 100 end, + autoEnable = function() return O.bEnable and O.bAlert end, + }):Height() + + nX = nPaddingX + nY = nY + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 5, + text = g_tStrings.FONT, + onClick = function() + X.UI.OpenFontPicker(function(nFont) + O.nFont = nFont + end) + end, + autoEnable = function() return O.bEnable end, + }):Width() + nX = nX + 10 + ui:Append('WndButton', { + x = nX, y = nY + 5, + text = _L['Preview'], + onClick = function() + CreateScreenArrow(GetClientPlayer().dwID, 'TIME', { szText = _L['PVE everyday, Xuanjing everyday!'] }) + end, + autoEnable = function() return O.bEnable end, + }) +end +X.Panel.Register(_L['Raid'], 'MY_LifeBar_ScreenArrow', _L['MY_LifeBar_ScreenArrow'], 431, PS) + +function D.Init() + HANDLE = X.UI.HandlePool(X.UI.GetShadowHandle('ScreenArrow'), FormatHandle(string.rep('', 6))) + SetUIScale() + X.BreatheCall('ScreenArrow_Sort', 500, D.OnSort) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_LifeBar_ScreenArrow', + exports = { + { + preset = 'UIEvent', + fields = { + 'IsEnabled', + 'ProcessCountdown' + }, + root = D, + }, + }, +} +MY_LifeBar_ScreenArrow = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.BreatheCall('MY_LifeBar_ScreenArrow', D.OnBreathe) +X.RegisterEvent('FIGHT_HINT', 'MY_LifeBar_ScreenArrow', D.RegisterFight) +X.RegisterEvent('LOGIN_GAME', 'MY_LifeBar_ScreenArrow', D.Init) +X.RegisterEvent('UI_SCALED' , 'MY_LifeBar_ScreenArrow', SetUIScale) + +X.RegisterUserSettingsInit('MY_LifeBar_ScreenArrow', function() + D.bReady = true +end) +X.RegisterUserSettingsRelease('MY_LifeBar_ScreenArrow', function() + D.bReady = false +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Logoff/info.ini b/MY_Logoff/info.ini new file mode 100644 index 000000000..dbe816a30 --- /dev/null +++ b/MY_Logoff/info.ini @@ -0,0 +1,8 @@ +[MY_Logoff] +name=快速登出 +desc=提供快速登出、定时登出游戏的功能 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Logoff.lua +package=MY diff --git a/MY_Logoff/info.ini.zh_TW b/MY_Logoff/info.ini.zh_TW new file mode 100644 index 000000000..fb3d7ffe8 --- /dev/null +++ b/MY_Logoff/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_Logoff] +name=蹇熺櫥鍑 +desc=鎻愪緵蹇熺櫥鍑恒佸畾鏅傜櫥鍑烘父鎴茬殑鍔熻兘 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Logoff.lua +package=MY diff --git a/MY_Logoff/lang/zhcn.jx3dat b/MY_Logoff/lang/zhcn.jx3dat new file mode 100644 index 000000000..b580b5893 --- /dev/null +++ b/MY_Logoff/lang/zhcn.jx3dat @@ -0,0 +1,31 @@ +return { + -- MY_Logoff.lua + ['MY_Logoff'] = '快速登出', + ['Express logoff'] = '快速登出', + ['Hotkey setting'] = '快捷键设置', + ['Return to role list'] = '返回角色选择', + ['Return to game login'] = '返回账号登录', + ['Return to role list while not fight'] = '脱战后返回角色选择', + ['Return to game login while not fight'] = '脱战后返回账号登录', + ['Return to role list while not fight and not dead'] = '脱战未重伤返回角色页', + ['Return to game login while not fight and not dead'] = '脱战未重伤返回登录页', + ['Return to role list while leaving fighting.'] = '在下一次脱离战斗的一瞬间返回角色选择页面。', + ['Return to game login while leaving fighting.'] = '在下一次脱离战斗的一瞬间返回账户登录页面。', + + ['Logoff has been cancelled.'] = '自动登出已取消。', + ['Logoff is ready for your casting unfight skill.'] = '脱战登出已启动,请释放脱战招式,游戏将在脱战瞬间下线。', + ['Idle off has been cancelled.'] = '暂离登出已取消。', + ['Idle off notice: you\'ll auto logoff if you keep idle for %ds.'] = '暂离登出提醒:如果您继续保持离开状态%d秒后,您将会自动登出游戏。', + ['Idle off notice: you\'ll auto logoff if you keep idle for %dm %ds.'] = '暂离登出提醒:如果您继续保持离开状态%d分%d秒后,您将会自动登出游戏。', + ['Idle off has been started, you\'ll auto logoff if you keep idle for %dm.'] = '暂离登出已启动,当您进入离开状态%d分钟后,您将会自动登出游戏。', + + ['Idle logoff'] = '暂离登出', + ['Enable'] = '启用', + ['Auto logoff when keep idle for'] = '暂离后自动返回登录界面', + ['Auto logoff when keep idle for %dmin.'] = '暂离%s分钟后将自动返回登录界面。', + + ['Tips'] = '说明', + ['MY_Logoff TIPS'] = '1、点击上方按钮,即可快速登出到角色选择、账号登录页。\n2、登出原理为调用官方提供的接口,不会涉及任何第三方数据传输。\n3、由于官方的战斗保护机制,如果您在战斗中强行登出游戏,官方服务器会将您的角色强行保持在线30秒左右,这段时间内您仍然可能被首领或其他玩家重伤。', + + ['Set hotkey'] = '设置快捷键', +} diff --git a/MY_Logoff/lang/zhtw.jx3dat b/MY_Logoff/lang/zhtw.jx3dat new file mode 100644 index 000000000..97f80411d --- /dev/null +++ b/MY_Logoff/lang/zhtw.jx3dat @@ -0,0 +1,31 @@ +return { + -- MY_Logoff.lua + ['MY_Logoff'] = '蹇熺櫥鍑', + ['Express logoff'] = '蹇熺櫥鍑', + ['Hotkey setting'] = '蹇嵎閸佃ō缃', + ['Return to role list'] = '杩斿洖瑙掕壊閬告搰', + ['Return to game login'] = '杩斿洖璩櫉鐧婚寗', + ['Return to role list while not fight'] = '鑴埌寰岃繑鍥炶鑹查伕鎿', + ['Return to game login while not fight'] = '鑴埌寰岃繑鍥炶超铏熺櫥閷', + ['Return to role list while not fight and not dead'] = '鑴埌鏈噸鍌疯繑鍥炶鑹查爜', + ['Return to game login while not fight and not dead'] = '鑴埌鏈噸鍌疯繑鍥炵櫥閷勯爜', + ['Return to role list while leaving fighting.'] = '鍦ㄤ笅涓娆¤劔闆㈡埌楝ョ殑涓鐬枔杩斿洖瑙掕壊閬告搰闋侀潰銆', + ['Return to game login while leaving fighting.'] = '鍦ㄤ笅涓娆¤劔闆㈡埌楝ョ殑涓鐬枔杩斿洖璩埗鐧婚寗闋侀潰銆', + + ['Logoff has been cancelled.'] = '鑷嫊鐧诲嚭宸插彇娑堛', + ['Logoff is ready for your casting unfight skill.'] = '鑴埌鐧诲嚭宸插暉鍕曪紝璜嬮噵鏀捐劔鎴版嫑寮忥紝娓告埐灏囧湪鑴埌鐬枔涓嬬窔銆', + ['Idle off has been cancelled.'] = '鏆洟鐧诲嚭宸插彇娑堛', + ['Idle off notice: you\'ll auto logoff if you keep idle for %ds.'] = '鏆洟鐧诲嚭鎻愰啋锛氬鏋滄偍绻肩簩淇濇寔闆㈤枊鐙鎱%d绉掑緦锛屾偍灏囨渻鑷嫊鐧诲嚭娓告埐銆', + ['Idle off notice: you\'ll auto logoff if you keep idle for %dm %ds.'] = '鏆洟鐧诲嚭鎻愰啋锛氬鏋滄偍绻肩簩淇濇寔闆㈤枊鐙鎱%d鍒%d绉掑緦锛屾偍灏囨渻鑷嫊鐧诲嚭娓告埐銆', + ['Idle off has been started, you\'ll auto logoff if you keep idle for %dm.'] = '鏆洟鐧诲嚭宸插暉鍕曪紝鐣舵偍閫插叆闆㈤枊鐙鎱%d鍒嗛悩寰岋紝鎮ㄥ皣鏈冭嚜鍕曠櫥鍑烘父鎴层', + + ['Idle logoff'] = '鏆洟鐧诲嚭', + ['Enable'] = '鍟熺敤', + ['Auto logoff when keep idle for'] = '鏆洟寰岃嚜鍕曡繑鍥炵櫥閷勭晫闈', + ['Auto logoff when keep idle for %dmin.'] = '鏆洟%s鍒嗛悩寰屽皣鑷嫊杩斿洖鐧婚寗鐣岄潰銆', + + ['Tips'] = '瑾槑', + ['MY_Logoff TIPS'] = '1銆侀粸鎿婁笂鏂规寜閳曪紝鍗冲彲蹇熺櫥鍑哄埌瑙掕壊閬告搰銆佽超铏熺櫥閷勯爜銆俓n2銆佺櫥鍑哄師鐞嗙偤瑾跨敤瀹樻柟鎻愪緵鐨勪粙闈紝涓嶆渻娑夊強浠讳綍绗笁鏂规暩鎿氬偝杓搞俓n3銆佺敱鏂煎畼鏂圭殑鎴伴淇濊姗熷埗锛屽鏋滄偍鍦ㄦ埌楝ヤ腑寮疯鐧诲嚭娓告埐锛屽畼鏂逛己鏈嶅櫒鏈冨皣鎮ㄧ殑瑙掕壊寮疯淇濇寔鍦ㄧ窔30绉掑乏鍙筹紝閫欐鏅傞枔鍏ф偍浠嶇劧鍙兘琚闋樻垨鍏朵粬鐜╁閲嶅偡銆', + + ['Set hotkey'] = '瑷疆蹇嵎閸', +} diff --git a/MY_Logoff/src/MY_Logoff.lua b/MY_Logoff/src/MY_Logoff.lua new file mode 100644 index 000000000..61b065d33 --- /dev/null +++ b/MY_Logoff/src/MY_Logoff.lua @@ -0,0 +1,248 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 快速登出 指定条件退队/下线 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Logoff/MY_Logoff' +local PLUGIN_NAME = 'MY_Logoff' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Logoff' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_Logoff', _L['System'], { + bIdleOff = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Logoff'], + szDescription = X.MakeCaption({ + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nIdleOffTime = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Logoff'], + szDescription = X.MakeCaption({ + _L['Auto logoff when keep idle for'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 30, + }, +}) + +local function Logoff(bCompletely, bUnfight, bNotDead) + if X.BreatheCall('MY_LOGOFF') then + X.BreatheCall('MY_LOGOFF', false) + X.OutputSystemMessage(_L['Logoff has been cancelled.']) + return + end + local function onBreatheCall() + local me = X.GetClientPlayer() + if not me then + return + end + if bUnfight and me.bFightState then + return + end + if bNotDead and me.nMoveState == MOVE_STATE.ON_DEATH then + return + end + X.Logout(bCompletely) + end + onBreatheCall() + if bUnfight then + X.OutputSystemMessage(_L['Logoff is ready for your casting unfight skill.']) + end + X.BreatheCall('MY_LOGOFF', onBreatheCall) +end + +local function IdleOff() + if not O.bIdleOff then + if X.BreatheCall('MY_LOGOFF_IDLE') then + X.OutputSystemMessage(_L['Idle off has been cancelled.']) + X.BreatheCall('MY_LOGOFF_IDLE', false) + end + return + end + if X.BreatheCall('MY_LOGOFF_IDLE') then + return + end + local function onBreatheCall() + local nIdleTime = (Station.GetIdleTime()) / 1000 - 300 + local remainTime = O.nIdleOffTime * 60 - nIdleTime + if remainTime <= 0 then + return X.Logout(true) + end + if remainTime > 1200 and remainTime % 600 ~= 0 then + return + end + if remainTime > 300 and remainTime % 300 ~= 0 then + return + end + if remainTime > 10 and remainTime % 10 ~= 0 then + return + end + if remainTime <= 60 then + local szMessage = _L('Idle off notice: you\'ll auto logoff if you keep idle for %ds.', remainTime) + if remainTime <= 10 then + OutputMessage('MSG_ANNOUNCE_YELLOW', szMessage) + end + X.OutputSystemMessage(szMessage) + else + X.OutputSystemMessage(_L('Idle off notice: you\'ll auto logoff if you keep idle for %dm %ds.', remainTime / 60, remainTime % 60)) + end + end + X.BreatheCall('MY_LOGOFF_IDLE', 1000, onBreatheCall) + X.OutputSystemMessage(_L('Idle off has been started, you\'ll auto logoff if you keep idle for %dm.', O.nIdleOffTime)) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +do +local menu = { + szOption = _L['Express logoff'], + { + szOption = _L['Return to role list'], + fnAction = function() + Logoff(false) + end, + }, { + szOption = _L['Return to game login'], + fnAction = function() + Logoff(true) + end, + }, { + szOption = _L['Return to role list while not fight'], + fnAction = function() + Logoff(false, true) + end, + }, { + szOption = _L['Return to game login while not fight'], + fnAction = function() + Logoff(true, true) + end, + }, { + bDevide = true, + }, { + szOption = _L['Set hotkey'], + fnAction = function() + X.SetHotKey() + end, + }, +} +X.RegisterAddonMenu('MY_LOGOFF_MENU', menu) +end + +X.RegisterHotKey('MY_LogOff_RUI', _L['Return to role list'], function() Logoff(false) end, nil) +X.RegisterHotKey('MY_LogOff_RRL', _L['Return to game login'], function() Logoff(true) end, nil) +X.RegisterHotKey('MY_LogOff_RUI_UNFIGHT', _L['Return to role list while not fight'], function() Logoff(false, true) end, nil) +X.RegisterHotKey('MY_LogOff_RRL_UNFIGHT', _L['Return to game login while not fight'], function() Logoff(true, true) end, nil) +X.RegisterHotKey('MY_LogOff_RUI_UNFIGHT_ALIVE', _L['Return to role list while not fight and not dead'], function() Logoff(false, true, true) end, nil) +X.RegisterHotKey('MY_LogOff_RRL_UNFIGHT_ALIVE', _L['Return to game login while not fight and not dead'], function() Logoff(true, true, true) end, nil) + +local function onInit() + X.DelayCall(2000, IdleOff) +end +X.RegisterUserSettingsInit('MY_Logoff', onInit) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- + +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + + -- 暂离登出 + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Idle logoff'], font = 27 }) + nY = nY + 35 + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Enable'], + checked = O.bIdleOff, + onCheck = function(bChecked) + O.bIdleOff = bChecked + IdleOff() + end, + }):AutoWidth():Width() + 5 + + ui:Append('WndSlider', { + x = nX, y = nY, w = 150, + textFormatter = function(val) return _L('Auto logoff when keep idle for %dmin.', val) end, + range = {1, 1440}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + value = O.nIdleOffTime, + onChange = function(val) + O.nIdleOffTime = val + X.DelayCall('MY_LOGOFF_IDLE_TIME_CHANGE', 500, IdleOff) + end, + autoEnable = function() return O.bIdleOff end, + }) + nY = nY + 40 + + -- 快速登出 + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Express logoff'], font = 27 }) + nY = nY + 35 + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Return to role list'], buttonStyle = 'FLAT', + onClick = function() Logoff(false) end, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Return to role list while not fight'], buttonStyle = 'FLAT', + onClick = function() Logoff(false,true) end, + }):Width() + 5 + + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Hotkey setting'], buttonStyle = 'FLAT', + onClick = function() X.SetHotKey() end, + }) + nY = nY + 30 + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Return to game login'], buttonStyle = 'FLAT', + onClick = function() Logoff(true) end, + }):Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Return to game login while not fight'], buttonStyle = 'FLAT', + onClick = function() Logoff(true,true) end, + }):Width() + 5 + nY = nY + 30 + + nX = nPaddingX + nY = nY + 20 + ui:Append('Text', { x = nX, y = nY, w = nW - nX * 2, text = _L['Tips'], font = 27, multiline = true, alignVertical = 0 }) + nY = nY + 30 + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, w = nW - nX * 2, text = _L['MY_Logoff TIPS'], font = 27, multiline = true, alignVertical = 0 }) +end +X.Panel.Register(_L['System'], 'Logoff', _L['Express logoff'], 'UI/Image/UICommon/LoginSchool.UITex|24', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_MiddleMapMark/data/doodad/zhcn.jx3dat b/MY_MiddleMapMark/data/doodad/zhcn.jx3dat new file mode 100644 index 000000000..ddcd354a9 --- /dev/null +++ b/MY_MiddleMapMark/data/doodad/zhcn.jx3dat @@ -0,0 +1,108 @@ +return { + [82 ] = true, -- 切磋用旗帜 + [1029 ] = true, -- 节源宴 + [1030 ] = true, -- 结缘宴 + [1031 ] = true, -- 清食小点 + [1032 ] = true, -- 贵人早点 + [1033 ] = true, -- 贵人晚膳 + [1034 ] = true, -- 任侠小炒 + [1035 ] = true, -- 兄弟宴 + [1036 ] = true, -- 鸿门宴 + [1037 ] = true, -- 百味宴 + [1038 ] = true, -- 三头宴 + [1039 ] = true, -- 蜀味“红”宴 + [1040 ] = true, -- 洗尘宴 + [1041 ] = true, -- 迎客宴 + [1042 ] = true, -- 昆仑禁食 + [1043 ] = true, -- 家乡小炒 + [1044 ] = true, -- 贵妃宴 + [1045 ] = true, -- 万寿宴 + [1046 ] = true, -- 没有酒的任侠餐 + [1047 ] = true, -- 不够兄弟的兄弟宴 + [1048 ] = true, -- 真正的鸿门宴 + [1049 ] = true, -- 杂味宴 + [1050 ] = true, -- 不地道的三头宴 + [1051 ] = true, -- 正宗蜀味“红”宴 + [1052 ] = true, -- 寒水宴 + [1053 ] = true, -- 接风宴 + [1054 ] = true, -- 美味的昆仑禁食 + [1055 ] = true, -- 地道的家乡小炒 + [1056 ] = true, -- 御制贵妃小炒 + [1057 ] = true, -- 延年宴 + [1673 ] = true, -- 烟火_02 + [1674 ] = true, -- 烟火_03 + [1700 ] = true, -- 团圆宴 + [1721 ] = true, -- 团圆宴 + [1722 ] = true, -- 欢庆宴 + [1728 ] = true, -- 书桌 + [1762 ] = true, -- 年兽陶罐 + [1764 ] = true, -- 烟花座 + [1773 ] = true, -- 文会宴 + [1774 ] = true, -- 迎宾宴 + [1912 ] = true, -- 交易 + [2125 ] = true, -- 御厨盛宴 + [2144 ] = true, -- 冬至宴席 + [2163 ] = true, -- 冬至宴席 + [2164 ] = true, -- 冬至宴席 + [2165 ] = true, -- 冬至宴席 + [2166 ] = true, -- 冬至宴席 + [2167 ] = true, -- 冬至宴席 + + [2187 ] = true, -- 帮会旗帜-扬威江湖 + [2190 ] = true, -- 帮会旗帜-一统江湖 + [2191 ] = true, -- 帮会旗帜-千秋万代 + [2192 ] = true, -- 帮会旗帜-雄霸江湖 + [2193 ] = true, -- 帮会旗帜-义薄云天 + [2194 ] = true, -- 帮会旗帜-泰山北斗 + [2196 ] = true, -- 帮会旗帜-独步江湖 + [2197 ] = true, -- 帮会旗帜-天下无敌 + [2198 ] = true, -- 帮会旗帜-惟我独尊 + [2199 ] = true, -- 帮会旗帜-武林至尊 + + [2418 ] = true, -- 仙王古鼎 + [2475 ] = true, -- 碧蝶/天珠/玉蟾 + [2478 ] = true, -- 春节宴席 + + [2865 ] = true, -- 山河宴 + [2866 ] = true, -- 南山宴 + [2867 ] = true, -- 东海宴 + [2868 ] = true, -- 汉宫宴 + [2869 ] = true, -- 玉笛谁家听落梅 + [2870 ] = true, -- 二十四桥明月夜 + [2871 ] = true, -- 鸳鸯烩珍宴 + [2872 ] = true, -- 蜀味烘焙宴 + [2873 ] = true, -- 汇珍宴 + + [3148 ] = true, -- 帮会饺子宴席 + [3157 ] = true, -- 冬至宴席 + [3158 ] = true, -- 冬至宴席 + [3171 ] = true, -- 春节恩荣宴 + [3571 ] = true, -- 婚庆宴席 + [3702 ] = true, -- 冬至宴席 + [3756 ] = true, -- 年夜饭 + [3983 ] = true, -- 宴会大锅 + [3984 ] = true, -- 宴会小桌 + + [4719 ] = true, -- 新埋的土堆 + [4721 ] = true, -- 不起眼的小坑 + [4315 ] = true, -- 芙蓉出水宴 + [4589 ] = true, -- 冬至宴席 + [4623 ] = true, -- 恩荣宴 + [4836 ] = true, -- 万寿菊 + + [5084 ] = true, -- 冬至盛宴 + [5100 ] = true, -- 假红包 + + [5832 ] = true, -- 花树 + [5199 ] = true, -- 群英宴·饭桌 + [5203 ] = true, -- 群英宴·饭桌 + [5622 ] = true, -- 烧尾宴 + [5681 ] = true, -- 佳·烧尾宴 + [5944 ] = true, -- 冬至宴席 + [5995 ] = true, -- 宴席 + [6003 ] = true, -- 鸿福齐天 + [6004 ] = true, -- 情人心 + [6013 ] = true, -- 功夫面 + [6834 ] = true, -- 桃花灯 + [6086 ] = true, -- 艺人花篮 +} diff --git a/MY_MiddleMapMark/data/doodad/zhtw.jx3dat b/MY_MiddleMapMark/data/doodad/zhtw.jx3dat new file mode 100644 index 000000000..5500ce4b9 --- /dev/null +++ b/MY_MiddleMapMark/data/doodad/zhtw.jx3dat @@ -0,0 +1,108 @@ +return { + [82 ] = true, -- 鍒囩鐢ㄦ棗骞 + [1029 ] = true, -- 绡婧愬 + [1030 ] = true, -- 绲愮罚瀹 + [1031 ] = true, -- 娓呴灏忛粸 + [1032 ] = true, -- 璨翠汉鏃╅粸 + [1033 ] = true, -- 璨翠汉鏅氳喅 + [1034 ] = true, -- 浠讳繝灏忕倰 + [1035 ] = true, -- 鍏勫紵瀹 + [1036 ] = true, -- 榇婚杸瀹 + [1037 ] = true, -- 鐧惧懗瀹 + [1038 ] = true, -- 涓夐牠瀹 + [1039 ] = true, -- 铚鍛斥滅磪鈥濆 + [1040 ] = true, -- 娲楀〉瀹 + [1041 ] = true, -- 杩庡瀹 + [1042 ] = true, -- 鏄嗕緰绂侀 + [1043 ] = true, -- 瀹堕剦灏忕倰 + [1044 ] = true, -- 璨村瀹 + [1045 ] = true, -- 钀=瀹 + [1046 ] = true, -- 娌掓湁閰掔殑浠讳繝椁 + [1047 ] = true, -- 涓嶅鍏勫紵鐨勫厔寮熷 + [1048 ] = true, -- 鐪熸鐨勯椿闁瀹 + [1049 ] = true, -- 闆滃懗瀹 + [1050 ] = true, -- 涓嶅湴閬撶殑涓夐牠瀹 + [1051 ] = true, -- 姝e畻铚鍛斥滅磪鈥濆 + [1052 ] = true, -- 瀵掓按瀹 + [1053 ] = true, -- 鎺ラⅷ瀹 + [1054 ] = true, -- 缇庡懗鐨勬槅渚栫椋 + [1055 ] = true, -- 鍦伴亾鐨勫閯夊皬鐐 + [1056 ] = true, -- 寰″埗璨村灏忕倰 + [1057 ] = true, -- 寤跺勾瀹 + [1673 ] = true, -- 鐓欑伀_02 + [1674 ] = true, -- 鐓欑伀_03 + [1700 ] = true, -- 鍦樺湏瀹 + [1721 ] = true, -- 鍦樺湏瀹 + [1722 ] = true, -- 姝℃叾瀹 + [1728 ] = true, -- 鏇告 + [1762 ] = true, -- 骞寸嵏闄剁綈 + [1764 ] = true, -- 鐓欒姳搴 + [1773 ] = true, -- 鏂囨渻瀹 + [1774 ] = true, -- 杩庤硴瀹 + [1912 ] = true, -- 浜ゆ槗 + [2125 ] = true, -- 寰″粴鐩涘 + [2144 ] = true, -- 鍐嚦瀹村腑 + [2163 ] = true, -- 鍐嚦瀹村腑 + [2164 ] = true, -- 鍐嚦瀹村腑 + [2165 ] = true, -- 鍐嚦瀹村腑 + [2166 ] = true, -- 鍐嚦瀹村腑 + [2167 ] = true, -- 鍐嚦瀹村腑 + + [2187 ] = true, -- 骞渻鏃楀篃-鎻氬▉姹熸箹 + [2190 ] = true, -- 骞渻鏃楀篃-涓绲辨睙婀 + [2191 ] = true, -- 骞渻鏃楀篃-鍗冪钀唬 + [2192 ] = true, -- 骞渻鏃楀篃-闆勯湼姹熸箹 + [2193 ] = true, -- 骞渻鏃楀篃-缇╄杽闆插ぉ + [2194 ] = true, -- 骞渻鏃楀篃-娉板北鍖楁枟 + [2196 ] = true, -- 骞渻鏃楀篃-鐛ㄦ姹熸箹 + [2197 ] = true, -- 骞渻鏃楀篃-澶╀笅鐒℃暤 + [2198 ] = true, -- 骞渻鏃楀篃-鎯熸垜鐛ㄥ皧 + [2199 ] = true, -- 骞渻鏃楀篃-姝︽灄鑷冲皧 + + [2418 ] = true, -- 浠欑帇鍙ら紟 + [2475 ] = true, -- 纰ц澏/澶╃彔/鐜夎熅 + [2478 ] = true, -- 鏄ョ瘈瀹村腑 + + [2865 ] = true, -- 灞辨渤瀹 + [2866 ] = true, -- 鍗楀北瀹 + [2867 ] = true, -- 鏉辨捣瀹 + [2868 ] = true, -- 婕㈠瀹 + [2869 ] = true, -- 鐜夌瑳瑾板鑱借惤姊 + [2870 ] = true, -- 浜屽崄鍥涙⿱鏄庢湀澶 + [2871 ] = true, -- 榇涢处鐕寸弽瀹 + [2872 ] = true, -- 铚鍛崇儤鐒欏 + [2873 ] = true, -- 鍖弽瀹 + + [3148 ] = true, -- 骞渻椁冨瓙瀹村腑 + [3157 ] = true, -- 鍐嚦瀹村腑 + [3158 ] = true, -- 鍐嚦瀹村腑 + [3171 ] = true, -- 鏄ョ瘈鎭╂Ξ瀹 + [3571 ] = true, -- 濠氭叾瀹村腑 + [3702 ] = true, -- 鍐嚦瀹村腑 + [3756 ] = true, -- 骞村椋 + [3983 ] = true, -- 瀹存渻澶ч崑 + [3984 ] = true, -- 瀹存渻灏忔 + + [4719 ] = true, -- 鏂板煁鐨勫湡鍫 + [4721 ] = true, -- 涓嶈捣鐪肩殑灏忓潙 + [4315 ] = true, -- 鑺欒搲鍑烘按瀹 + [4589 ] = true, -- 鍐嚦瀹村腑 + [4623 ] = true, -- 鎭╂Ξ瀹 + [4836 ] = true, -- 钀=鑿 + + [5084 ] = true, -- 鍐嚦鐩涘 + [5100 ] = true, -- 鍋囩磪鍖 + + [5832 ] = true, -- 鑺辨ü + [5199 ] = true, -- 缇よ嫳瀹绰烽/妗 + [5203 ] = true, -- 缇よ嫳瀹绰烽/妗 + [5622 ] = true, -- 鐕掑熬瀹 + [5681 ] = true, -- 浣陈风噿灏惧 + [5944 ] = true, -- 鍐嚦瀹村腑 + [5995 ] = true, -- 瀹村腑 + [6003 ] = true, -- 榇荤榻婂ぉ + [6004 ] = true, -- 鎯呬汉蹇 + [6013 ] = true, -- 鍔熷か闈 + [6834 ] = true, -- 妗冭姳鐕 + [6086 ] = true, -- 钘濅汉鑺辩眱 +} diff --git a/MY_MiddleMapMark/data/npc/zhcn.jx3dat b/MY_MiddleMapMark/data/npc/zhcn.jx3dat new file mode 100644 index 000000000..80bb3eba5 --- /dev/null +++ b/MY_MiddleMapMark/data/npc/zhcn.jx3dat @@ -0,0 +1,474 @@ +return { + [5071 ] = true, -- 气场镇山河的屏幕扰动 + + [6832 ] = true, -- 燃放的烟花 + [6833 ] = true, -- 元宝灯 + [6834 ] = true, -- 桃花灯 + [6838 ] = true, -- 烟花座 + [6846 ] = true, -- 撞运成功 + [6847 ] = true, -- 年年有鱼灯 + [6888 ] = true, -- 火树银花 + [6889 ] = true, -- 龙凤呈祥 + [6890 ] = true, -- 鞭炮 + [6893 ] = true, -- 窜天猴 + [6899 ] = true, -- 撞运失败 + + [10609] = true, -- 帮会旗帜-扬威江湖 + [10615] = true, -- 帮会旗帜-一统江湖 + [10631] = true, -- 帮会旗帜-千秋万代 + [10632] = true, -- 帮会旗帜-雄霸江湖 + [10633] = true, -- 帮会旗帜-义薄云天 + [10634] = true, -- 帮会旗帜-泰山北斗 + [10635] = true, -- 帮会旗帜-独步江湖 + [10636] = true, -- 帮会旗帜-天下无敌 + [10637] = true, -- 帮会旗帜-惟我独尊 + [10638] = true, -- 帮会旗帜-武林至尊 + [12003] = true, -- 帮会旗帜-悬壶济世 + + [15398] = true, -- 海誓山盟 + [15608] = true, -- 星月烟花 + [15609] = true, -- 萤火点点 + [15610] = true, -- 幽月凝光 + [15611] = true, -- 追风星辰 + [15618] = true, -- 玉清玄明 + [15619] = true, -- 吞吴 + [15620] = true, -- 轻离 + [15621] = true, -- 幽月乱花 + [15622] = true, -- 流光溢彩 + [15623] = true, -- 鱼跃魅影 + [15624] = true, -- 金宝暮夕 + [15625] = true, -- 初蕾吐蕊 + [15626] = true, -- 蓦然书香 + [15627] = true, -- 蓝色妖姬 + [15628] = true, -- 江枫渔火 + [15629] = true, -- 姹紫嫣红 + [15630] = true, -- 月半黄昏 + [16538] = true, -- 龙门金蛋 + + [16594] = true, -- 青龙阵眼 + [16595] = true, -- 白虎阵眼 + [16596] = true, -- 朱雀阵眼 + [16597] = true, -- 玄武阵眼 + [16598] = true, -- 重御 + [16599] = true, -- 升景 + [16600] = true, -- 封门 + [16601] = true, -- 连华 + + [24023] = true, -- 盗墓贼 + [27447] = true, -- 木武童 + [36921] = true, -- 藏宝洞口 + [36058] = true, -- 遗失的货物 + [39458] = true, -- 无间长情 + [41707] = true, -- 龙门金蛋 + + [20107] = true, -- 标记点_白 + [20108] = true, -- 标记点_黄 + [20109] = true, -- 标记点_蓝 + [20110] = true, -- 标记点_绿 + [20111] = true, -- 标记点_红 + [36781] = true, -- 标记点_6 + [36782] = true, -- 标记点_7 + [36783] = true, -- 标记点_8 + [36784] = true, -- 标记点_9 + [36785] = true, -- 标记点_10 + + -- 各种花盆老纸也是醉了 = = + [14467] = true, -- 翠云草(花盆内用) + [14468] = true, -- 风信子(花盆内用) + [14469] = true, -- 葫芦(花盆内用) + [14470] = true, -- 马蹄金(花盆内用) + [14471] = true, -- 牡丹(花盆内用) + [14472] = true, -- 蔷薇 (花盆内用) + [14473] = true, -- 黍米(花盆内用) + [14474] = true, -- 乌蕨(花盆内用) + [14475] = true, -- 仙客来(花盆内用) + [14476] = true, -- 香蕉(花盆内用) + [14477] = true, -- 香雪兰(花盆内用) + [14478] = true, -- 萱草(花盆内用) + [14479] = true, -- 雁来红(花盆内用) + [14480] = true, -- 月季(花盆内用) + [14481] = true, -- 紫绒蒿(花盆内用) + [14482] = true, -- 绣球花(花盆内用) + [14483] = true, -- 万寿菊(花盆内用) + [14484] = true, -- 木芙蓉(花盆内用) + [14485] = true, -- 幼苗一(花盆内用) + [14486] = true, -- 幼苗二(花盆内用) + [14487] = true, -- 幼苗三(花盆内用) + [14488] = true, -- 幼苗四(花盆内用) + [14489] = true, -- 幼苗五(花盆内用) + [14490] = true, -- 幼苗六(花盆内用) + [14491] = true, -- 幼苗七(花盆内用) + [14492] = true, -- 翠云草幼芽-雨洛玉盆 + [14493] = true, -- 风信子幼芽-雨洛玉盆 + [14494] = true, -- 葫芦幼芽-雨洛玉盆 + [14495] = true, -- 马蹄金幼芽-雨洛玉盆 + [14496] = true, -- 牡丹幼芽-雨洛玉盆 + [14497] = true, -- 蔷薇幼芽-雨洛玉盆 + [14498] = true, -- 黍米幼芽-雨洛玉盆 + [14499] = true, -- 乌蕨幼芽-雨洛玉盆 + [14500] = true, -- 仙客来幼芽-雨洛玉盆 + [14501] = true, -- 香蕉幼芽-雨洛玉盆 + [14502] = true, -- 香雪兰幼芽-雨洛玉盆 + [14503] = true, -- 萱草幼芽-雨洛玉盆 + [14504] = true, -- 雁来红幼芽-雨洛玉盆 + [14505] = true, -- 月季幼芽-雨洛玉盆 + [14506] = true, -- 紫绒蒿幼芽-雨洛玉盆 + [14507] = true, -- 绣球花幼芽-雨洛玉盆 + [14508] = true, -- 万寿菊幼芽-雨洛玉盆 + [14509] = true, -- 木芙蓉幼芽-雨洛玉盆 + [14510] = true, -- 翠云草幼苗-雨洛玉盆 + [14511] = true, -- 风信子幼苗-雨洛玉盆 + [14512] = true, -- 葫芦幼苗-雨洛玉盆 + [14513] = true, -- 马蹄金幼苗-雨洛玉盆 + + [18632] = true, -- 机关箭台 + [18684] = true, -- 机关箭台 + [67133] = true, -- 机关箭台 + + [18805] = true, -- 车前草(花盆内用) + [18806] = true, -- 虫草(花盆内用) + [18807] = true, -- 川贝(花盆内用) + [18808] = true, -- 大黄(花盆内用) + [18809] = true, -- 防风(花盆内用) + [18810] = true, -- 甘草(花盆内用) + [18811] = true, -- 枸杞(花盆内用) + [18812] = true, -- 金创小草(花盆内用) + [18813] = true, -- 金银花(花盆内用) + [18814] = true, -- 兰草(花盆内用) + [18815] = true, -- 麦冬(花盆内用) + [18816] = true, -- 千里香(花盆内用) + [18817] = true, -- 芍药(花盆内用) + [18818] = true, -- 天麻(花盆内用) + [18819] = true, -- 天名精(花盆内用) + [18820] = true, -- 田七(花盆内用) + [18821] = true, -- 五味子(花盆内用) + [18822] = true, -- 仙茅(花盆内用) + [18823] = true, -- 相思子(花盆内用) + [18824] = true, -- 远志(花盆内用) + [18825] = true, -- 陈一测试 + [18826] = true, -- 水箭 + [18828] = true, -- 车前草幼芽-雨洛玉盆 + [18829] = true, -- 虫草幼芽-雨洛玉盆 + [18830] = true, -- 川贝幼芽-雨洛玉盆 + [18831] = true, -- 大黄幼芽-雨洛玉盆 + [18832] = true, -- 防风幼芽-雨洛玉盆 + [18833] = true, -- 甘草幼芽-雨洛玉盆 + [18834] = true, -- 枸杞幼芽-雨洛玉盆 + [18835] = true, -- 金创小草幼芽-雨洛玉盆 + [18836] = true, -- 金银花幼芽-雨洛玉盆 + [18837] = true, -- 兰草幼芽-雨洛玉盆 + [18838] = true, -- 麦冬幼芽-雨洛玉盆 + [18839] = true, -- 千里香幼芽-雨洛玉盆 + [18840] = true, -- 芍药幼芽-雨洛玉盆 + [18841] = true, -- 天麻幼芽-雨洛玉盆 + [18842] = true, -- 天名精幼芽-雨洛玉盆 + [18843] = true, -- 田七幼芽-雨洛玉盆 + [18844] = true, -- 五味子幼芽-雨洛玉盆 + [18845] = true, -- 仙茅幼芽-雨洛玉盆 + [18846] = true, -- 相思子幼芽-雨洛玉盆 + [18847] = true, -- 远志幼芽-雨洛玉盆 + [18848] = true, -- 车前草幼苗-雨洛玉盆 + [18849] = true, -- 虫草幼苗-雨洛玉盆 + [18850] = true, -- 川贝幼苗-雨洛玉盆 + [18851] = true, -- 大黄幼苗-雨洛玉盆 + [18852] = true, -- 防风幼苗-雨洛玉盆 + [18853] = true, -- 甘草幼苗-雨洛玉盆 + [18854] = true, -- 枸杞幼苗-雨洛玉盆 + [18855] = true, -- 金创小草幼苗-雨洛玉盆 + [18856] = true, -- 金银花幼苗-雨洛玉盆 + [18857] = true, -- 兰草幼苗-雨洛玉盆 + [18858] = true, -- 麦冬幼苗-雨洛玉盆 + [18859] = true, -- 千里香幼苗-雨洛玉盆 + [18860] = true, -- 芍药幼苗-雨洛玉盆 + [18861] = true, -- 天麻幼苗-雨洛玉盆 + [18862] = true, -- 天名精幼苗-雨洛玉盆 + [18863] = true, -- 田七幼苗-雨洛玉盆 + [18864] = true, -- 五味子幼苗-雨洛玉盆 + [18865] = true, -- 仙茅幼苗-雨洛玉盆 + [18866] = true, -- 相思子幼苗-雨洛玉盆 + [18867] = true, -- 远志幼苗-雨洛玉盆 + [18868] = true, -- 车前草-雨洛玉盆 + [18869] = true, -- 虫草-雨洛玉盆 + [18870] = true, -- 川贝-雨洛玉盆 + [18871] = true, -- 大黄-雨洛玉盆 + [18872] = true, -- 防风-雨洛玉盆 + [18873] = true, -- 甘草-雨洛玉盆 + [18874] = true, -- 枸杞-雨洛玉盆 + [18875] = true, -- 金创小草-雨洛玉盆 + [18876] = true, -- 金银花-雨洛玉盆 + [18877] = true, -- 兰草-雨洛玉盆 + [18878] = true, -- 麦冬-雨洛玉盆 + [18879] = true, -- 千里香-雨洛玉盆 + [18880] = true, -- 芍药-雨洛玉盆 + [18881] = true, -- 天麻-雨洛玉盆 + [18882] = true, -- 天名精-雨洛玉盆 + [18883] = true, -- 田七-雨洛玉盆 + [18884] = true, -- 五味子-雨洛玉盆 + [18885] = true, -- 仙茅-雨洛玉盆 + [18886] = true, -- 相思子-雨洛玉盆 + [18887] = true, -- 远志-雨洛玉盆 + + [18931] = true, -- 车前草幼芽-风清玉盆 + [18932] = true, -- 虫草幼芽-风清玉盆 + [18933] = true, -- 川贝幼芽-风清玉盆 + [18934] = true, -- 大黄幼芽-风清玉盆 + [18935] = true, -- 防风幼芽-风清玉盆 + [18936] = true, -- 甘草幼芽-风清玉盆 + [18937] = true, -- 枸杞幼芽-风清玉盆 + [18938] = true, -- 金创小草幼芽-风清玉盆 + [18939] = true, -- 金银花幼芽-风清玉盆 + [18940] = true, -- 兰草幼芽-风清玉盆 + [18941] = true, -- 麦冬幼芽-风清玉盆 + [18942] = true, -- 千里香幼芽-风清玉盆 + [18943] = true, -- 芍药幼芽-风清玉盆 + [18944] = true, -- 天麻幼芽-风清玉盆 + [18945] = true, -- 天名精幼芽-风清玉盆 + [18946] = true, -- 田七幼芽-风清玉盆 + [18947] = true, -- 五味子幼芽-风清玉盆 + [18948] = true, -- 仙茅幼芽-风清玉盆 + [18949] = true, -- 相思子幼芽-风清玉盆 + [18950] = true, -- 远志幼芽-风清玉盆 + [18951] = true, -- 车前草幼苗-风清玉盆 + [18952] = true, -- 虫草幼苗-风清玉盆 + [18953] = true, -- 川贝幼苗-风清玉盆 + [18954] = true, -- 大黄幼苗-风清玉盆 + [18955] = true, -- 防风幼苗-风清玉盆 + [18956] = true, -- 甘草幼苗-风清玉盆 + [18957] = true, -- 枸杞幼苗-风清玉盆 + [18958] = true, -- 金创小草幼苗-风清玉盆 + [18959] = true, -- 金银花幼苗-风清玉盆 + [18960] = true, -- 兰草幼苗-风清玉盆 + [18961] = true, -- 麦冬幼苗-风清玉盆 + [18962] = true, -- 千里香幼苗-风清玉盆 + [18963] = true, -- 芍药幼苗-风清玉盆 + [18964] = true, -- 天麻幼苗-风清玉盆 + [18965] = true, -- 天名精幼苗-风清玉盆 + [18966] = true, -- 田七幼苗-风清玉盆 + [18967] = true, -- 五味子幼苗-风清玉盆 + [18968] = true, -- 仙茅幼苗-风清玉盆 + [18969] = true, -- 相思子幼苗-风清玉盆 + [18970] = true, -- 远志幼苗-风清玉盆 + [18971] = true, -- 车前草-风清玉盆 + [18972] = true, -- 虫草-风清玉盆 + [18973] = true, -- 川贝-风清玉盆 + [18974] = true, -- 大黄-风清玉盆 + [18975] = true, -- 防风-风清玉盆 + [18976] = true, -- 甘草-风清玉盆 + [18977] = true, -- 枸杞-风清玉盆 + [18978] = true, -- 金创小草-风清玉盆 + [18979] = true, -- 金银花-风清玉盆 + [18980] = true, -- 兰草-风清玉盆 + [18981] = true, -- 麦冬-风清玉盆 + [18982] = true, -- 千里香-风清玉盆 + [18983] = true, -- 芍药-风清玉盆 + [18984] = true, -- 天麻-风清玉盆 + [18985] = true, -- 天名精-风清玉盆 + [18986] = true, -- 田七-风清玉盆 + [18987] = true, -- 五味子-风清玉盆 + [18988] = true, -- 仙茅-风清玉盆 + [18989] = true, -- 相思子-风清玉盆 + [18990] = true, -- 远志-风清玉盆 + [18991] = true, -- 车前草幼芽-云荔玉盆 + [18992] = true, -- 虫草幼芽-云荔玉盆 + [18993] = true, -- 川贝幼芽-云荔玉盆 + [18994] = true, -- 大黄幼芽-云荔玉盆 + [18995] = true, -- 防风幼芽-云荔玉盆 + [18996] = true, -- 甘草幼芽-云荔玉盆 + [18997] = true, -- 枸杞幼芽-云荔玉盆 + [18998] = true, -- 金创小草幼芽-云荔玉盆 + [18999] = true, -- 金银花幼芽-云荔玉盆 + [19000] = true, -- 兰草幼芽-云荔玉盆 + [19001] = true, -- 麦冬幼芽-云荔玉盆 + [19002] = true, -- 千里香幼芽-云荔玉盆 + [19003] = true, -- 芍药幼芽-云荔玉盆 + [19004] = true, -- 天麻幼芽-云荔玉盆 + [19005] = true, -- 天名精幼芽-云荔玉盆 + [19006] = true, -- 田七幼芽-云荔玉盆 + [19007] = true, -- 五味子幼芽-云荔玉盆 + [19008] = true, -- 仙茅幼芽-云荔玉盆 + [19009] = true, -- 相思子幼芽-云荔玉盆 + [19010] = true, -- 远志幼芽-云荔玉盆 + [19011] = true, -- 车前草幼苗-云荔玉盆 + [19012] = true, -- 虫草幼苗-云荔玉盆 + [19013] = true, -- 川贝幼苗-云荔玉盆 + [19014] = true, -- 大黄幼苗-云荔玉盆 + [19015] = true, -- 防风幼苗-云荔玉盆 + [19016] = true, -- 甘草幼苗-云荔玉盆 + [19017] = true, -- 枸杞幼苗-云荔玉盆 + [19018] = true, -- 金创小草幼苗-云荔玉盆 + [19019] = true, -- 金银花幼苗-云荔玉盆 + [19020] = true, -- 兰草幼苗-云荔玉盆 + [19021] = true, -- 麦冬幼苗-云荔玉盆 + [19022] = true, -- 千里香幼苗-云荔玉盆 + [19023] = true, -- 芍药幼苗-云荔玉盆 + [19024] = true, -- 天麻幼苗-云荔玉盆 + [19025] = true, -- 天名精幼苗-云荔玉盆 + [19026] = true, -- 田七幼苗-云荔玉盆 + [19027] = true, -- 五味子幼苗-云荔玉盆 + [19028] = true, -- 仙茅幼苗-云荔玉盆 + [19029] = true, -- 相思子幼苗-云荔玉盆 + [19030] = true, -- 远志幼苗-云荔玉盆 + [19031] = true, -- 车前草-云荔玉盆 + [19032] = true, -- 虫草-云荔玉盆 + [19033] = true, -- 川贝-云荔玉盆 + [19034] = true, -- 大黄-云荔玉盆 + [19035] = true, -- 防风-云荔玉盆 + [19036] = true, -- 甘草-云荔玉盆 + [19037] = true, -- 枸杞-云荔玉盆 + [19038] = true, -- 金创小草-云荔玉盆 + [19039] = true, -- 金银花-云荔玉盆 + [19040] = true, -- 兰草-云荔玉盆 + [19041] = true, -- 麦冬-云荔玉盆 + [19042] = true, -- 千里香-云荔玉盆 + [19043] = true, -- 芍药-云荔玉盆 + [19044] = true, -- 天麻-云荔玉盆 + [19045] = true, -- 天名精-云荔玉盆 + [19046] = true, -- 田七-云荔玉盆 + [19047] = true, -- 五味子-云荔玉盆 + [19048] = true, -- 仙茅-云荔玉盆 + [19049] = true, -- 相思子-云荔玉盆 + [19050] = true, -- 远志-云荔玉盆 + + [20050] = true, -- 百脉根(花盆内用) + [20051] = true, -- 紫花苜蓿(花盆内用) + [20052] = true, -- 甜象草(花盆内用) + [20053] = true, -- 皇竹草(花盆内用) + [20054] = true, -- 百脉根-雨洛玉盆 + [20055] = true, -- 紫花苜蓿-雨洛玉盆 + [20056] = true, -- 甜象草-雨洛玉盆 + [20057] = true, -- 皇竹草-雨洛玉盆 + [20058] = true, -- 百脉根-风清玉盆 + [20059] = true, -- 紫花苜蓿-风清玉盆 + [20060] = true, -- 甜象草-风清玉盆 + [20061] = true, -- 皇竹草-风清玉盆 + [20062] = true, -- 百脉根-云荔玉盆 + [20063] = true, -- 紫花苜蓿-云荔玉盆 + [20064] = true, -- 甜象草-云荔玉盆 + [20065] = true, -- 皇竹草-云荔玉盆 + + [20120] = true, -- 百脉幼芽-雨洛玉盆 + [20121] = true, -- 紫花幼芽-雨洛玉盆 + [20122] = true, -- 甜象草幼芽-雨洛玉盆 + [20123] = true, -- 皇竹草幼芽-雨洛玉盆 + [20124] = true, -- 百脉幼苗-雨洛玉盆 + [20125] = true, -- 紫花苜蓿幼苗-雨洛玉盆 + [20126] = true, -- 甜象草幼苗-雨洛玉盆 + [20127] = true, -- 皇竹草幼苗-雨洛玉盆 + [20128] = true, -- 百脉根幼芽-风清玉盆 + [20129] = true, -- 紫花苜蓿幼芽-风清玉盆 + [20130] = true, -- 甜象草幼芽-风清玉盆 + [20131] = true, -- 皇竹草幼芽-风清玉盆 + [20132] = true, -- 百脉根幼苗-风清玉盆 + [20133] = true, -- 紫花苜蓿幼苗-风清玉盆 + [20134] = true, -- 甜象草幼苗-风清玉盆 + [20135] = true, -- 皇竹草幼苗-风清玉盆 + [20136] = true, -- 百脉根幼芽-云荔玉盆 + [20137] = true, -- 紫花苜蓿幼芽-云荔玉盆 + [20138] = true, -- 甜象草幼芽-云荔玉盆 + [20139] = true, -- 皇竹草幼芽-云荔玉盆 + [20140] = true, -- 百脉根幼苗-云荔玉盆 + [20141] = true, -- 紫花苜蓿幼苗-云荔玉盆 + [20142] = true, -- 甜象草幼苗-云荔玉盆 + [20143] = true, -- 皇竹草幼苗-云荔玉盆 + + [20596] = true, -- 海棠(花盆内用) + [20597] = true, -- 菖蒲(花盆内用) + [20598] = true, -- 海棠幼芽-雨洛玉盆 + [20599] = true, -- 菖蒲幼芽-雨洛玉盆 + [20600] = true, -- 海棠幼苗-雨洛玉盆 + [20601] = true, -- 菖蒲幼苗-雨洛玉盆 + [20602] = true, -- 海棠-雨洛玉盆 + [20603] = true, -- 菖蒲-雨洛玉盆 + [20604] = true, -- 海棠幼芽-风清玉盆 + [20605] = true, -- 菖蒲幼芽-风清玉盆 + [20606] = true, -- 海棠幼苗-风清玉盆 + [20607] = true, -- 菖蒲幼苗-风清玉盆 + [20608] = true, -- 海棠-风清玉盆 + [20609] = true, -- 菖蒲-风清玉盆 + [20610] = true, -- 海棠幼芽-云荔玉盆 + [20611] = true, -- 菖蒲幼芽-云荔玉盆 + [20612] = true, -- 海棠幼苗-云荔玉盆 + [20613] = true, -- 菖蒲幼苗-云荔玉盆 + [20614] = true, -- 海棠-云荔玉盆 + [20615] = true, -- 菖蒲-云荔玉盆 + + + [20688] = true, -- 茯苓(花盆内用) + [20689] = true, -- 茯苓幼芽-雨洛玉盆 + [20690] = true, -- 茯苓幼苗-雨洛玉盆 + [20691] = true, -- 茯苓-雨洛玉盆 + [20692] = true, -- 茯苓幼芽-风清玉盆 + [20693] = true, -- 茯苓幼苗-风清玉盆 + [20694] = true, -- 茯苓-风清玉盆 + [20695] = true, -- 茯苓幼芽-云荔玉盆 + [20696] = true, -- 茯苓幼苗-云荔玉盆 + [20697] = true, -- 茯苓-云荔玉盆 + + [22889] = true, -- 月季幼芽-雨洛玉盆 + [22890] = true, -- 月季幼苗-雨洛玉盆 + [22891] = true, -- 月季-雨洛玉盆 + [22892] = true, -- 月季幼芽-风清玉盆 + [22893] = true, -- 月季幼苗-风清玉盆 + [22894] = true, -- 月季-风清玉盆 + [22895] = true, -- 月季幼芽-云荔玉盆 + [22896] = true, -- 月季幼苗-云荔玉盆 + [22897] = true, -- 月季-云荔玉盆 + + [25477] = true, -- 石莲花(花盆内用) + [25478] = true, -- 彼岸花(花盆内用) + [25479] = true, -- 石莲花幼芽-雨洛玉盆 + [25480] = true, -- 彼岸花幼芽-雨洛玉盆 + [25481] = true, -- 石莲花幼苗-雨洛玉盆 + [25482] = true, -- 彼岸花幼苗-雨洛玉盆 + [25483] = true, -- 石莲花-雨洛玉盆 + [25484] = true, -- 彼岸花-雨洛玉盆 + [25485] = true, -- 石莲花幼芽-风清玉盆 + [25486] = true, -- 彼岸花幼芽-风清玉盆 + [25487] = true, -- 石莲花幼苗-风清玉盆 + [25488] = true, -- 彼岸花幼苗-风清玉盆 + [25489] = true, -- 石莲花-风清玉盆 + [25490] = true, -- 彼岸花-风清玉盆 + [25491] = true, -- 石莲花幼芽-云荔玉盆 + [25492] = true, -- 彼岸花幼芽-云荔玉盆 + [25493] = true, -- 石莲花幼苗-云荔玉盆 + [25494] = true, -- 彼岸花幼苗-云荔玉盆 + [25495] = true, -- 石莲花-云荔玉盆 + [25496] = true, -- 彼岸花-云荔玉盆 + + [41825] = true, -- 千衷不渝 + [45221] = true, -- 心不释手 + + [46412] = true, -- 玩家气场-江逐月天 + [46413] = true, -- 玩家气场-云生结海 + [46414] = true, -- 玩家气场-笑傲光阴 + + [48026] = true, -- 白术(花盆内用) + [48027] = true, -- 紫苏(花盆内用) + [48028] = true, -- 白术幼芽-雨洛玉盆 + [48029] = true, -- 紫苏幼芽-雨洛玉盆 + [48030] = true, -- 白术幼苗-雨洛玉盆 + [48031] = true, -- 紫苏幼苗-雨洛玉盆 + [48032] = true, -- 白术-雨洛玉盆 + [48033] = true, -- 紫苏-雨洛玉盆 + [48034] = true, -- 白术幼芽-风清玉盆 + [48035] = true, -- 紫苏幼芽-风清玉盆 + [48036] = true, -- 白术幼苗-风清玉盆 + [48037] = true, -- 紫苏幼苗-风清玉盆 + [48038] = true, -- 白术-风清玉盆 + [48039] = true, -- 紫苏-风清玉盆 + [48040] = true, -- 白术幼芽-云荔玉盆 + [48041] = true, -- 紫苏幼芽-云荔玉盆 + [48042] = true, -- 白术幼苗-云荔玉盆 + [48043] = true, -- 紫苏幼苗-云荔玉盆 + [48044] = true, -- 白术-云荔玉盆 + [48045] = true, -- 紫苏-云荔玉盆 + + [51383] = true, -- 秋千 + + [51584] = true, -- 个人总控 + [51585] = true, -- 艺人伴奏NPC1 + [51586] = true, -- 艺人伴奏NPC2 + [51587] = true, -- 艺人伴奏NPC3 + [51588] = true, -- 艺人伴奏NPC4 + [51647] = true, -- 源源 +} diff --git a/MY_MiddleMapMark/data/npc/zhtw.jx3dat b/MY_MiddleMapMark/data/npc/zhtw.jx3dat new file mode 100644 index 000000000..e8dc14330 --- /dev/null +++ b/MY_MiddleMapMark/data/npc/zhtw.jx3dat @@ -0,0 +1,474 @@ +return { + [5071 ] = true, -- 姘e牬閹北娌崇殑灞忓箷鎿惧嫊 + + [6832 ] = true, -- 鐕冩斁鐨勭厵鑺 + [6833 ] = true, -- 鍏冨鐕 + [6834 ] = true, -- 妗冭姳鐕 + [6838 ] = true, -- 鐓欒姳搴 + [6846 ] = true, -- 鎾為亱鎴愬姛 + [6847 ] = true, -- 骞村勾鏈夐瓪鐕 + [6888 ] = true, -- 鐏ü閵鑺 + [6889 ] = true, -- 榫嶉吵鍛堢ゥ + [6890 ] = true, -- 闉偖 + [6893 ] = true, -- 绔勫ぉ鐚 + [6899 ] = true, -- 鎾為亱澶辨晽 + + [10609] = true, -- 骞渻鏃楀篃-鎻氬▉姹熸箹 + [10615] = true, -- 骞渻鏃楀篃-涓绲辨睙婀 + [10631] = true, -- 骞渻鏃楀篃-鍗冪钀唬 + [10632] = true, -- 骞渻鏃楀篃-闆勯湼姹熸箹 + [10633] = true, -- 骞渻鏃楀篃-缇╄杽闆插ぉ + [10634] = true, -- 骞渻鏃楀篃-娉板北鍖楁枟 + [10635] = true, -- 骞渻鏃楀篃-鐛ㄦ姹熸箹 + [10636] = true, -- 骞渻鏃楀篃-澶╀笅鐒℃暤 + [10637] = true, -- 骞渻鏃楀篃-鎯熸垜鐛ㄥ皧 + [10638] = true, -- 骞渻鏃楀篃-姝︽灄鑷冲皧 + [12003] = true, -- 骞渻鏃楀篃-鎳稿:婵熶笘 + + [15398] = true, -- 娴疯獡灞辩洘 + [15608] = true, -- 鏄熸湀鐓欒姳 + [15609] = true, -- 铻㈢伀榛為粸 + [15610] = true, -- 骞芥湀鍑濆厜 + [15611] = true, -- 杩介ⅷ鏄熻景 + [15618] = true, -- 鐜夋竻鐜勬槑 + [15619] = true, -- 鍚炲惓 + [15620] = true, -- 杓曢洟 + [15621] = true, -- 骞芥湀浜傝姳 + [15622] = true, -- 娴佸厜婧㈠僵 + [15623] = true, -- 榄氳簫榄呭奖 + [15624] = true, -- 閲戝鏆 + [15625] = true, -- 鍒濊暰鍚愯晩 + [15626] = true, -- 椹鐒舵浉棣 + [15627] = true, -- 钘嶈壊濡栧К + [15628] = true, -- 姹熸婕佺伀 + [15629] = true, -- 濂肩传瀚g磪 + [15630] = true, -- 鏈堝崐榛冩槒 + [16538] = true, -- 榫嶉杸閲戣泲 + + [16594] = true, -- 闈掗緧闄g溂 + [16595] = true, -- 鐧借檸闄g溂 + [16596] = true, -- 鏈遍泙闄g溂 + [16597] = true, -- 鐜勬闄g溂 + [16598] = true, -- 閲嶅尽 + [16599] = true, -- 鍗囨櫙 + [16600] = true, -- 灏侀杸 + [16601] = true, -- 閫h彲 + + [24023] = true, -- 鐩滃璩 + [27447] = true, -- 鏈ㄦ绔 + [36921] = true, -- 钘忓娲炲彛 + [36058] = true, -- 閬哄け鐨勮波鐗 + [39458] = true, -- 鐒¢枔闀锋儏 + [41707] = true, -- 榫嶉杸閲戣泲 + + [20107] = true, -- 妯欒榛瀇鐧 + [20108] = true, -- 妯欒榛瀇榛 + [20109] = true, -- 妯欒榛瀇钘 + [20110] = true, -- 妯欒榛瀇缍 + [20111] = true, -- 妯欒榛瀇绱 + [36781] = true, -- 妯欒榛瀇6 + [36782] = true, -- 妯欒榛瀇7 + [36783] = true, -- 妯欒榛瀇8 + [36784] = true, -- 妯欒榛瀇9 + [36785] = true, -- 妯欒榛瀇10 + + -- 鍚勭ó鑺辩泦鑰佺礄涔熸槸閱変簡 = = + [14467] = true, -- 缈犻洸鑽夛紙鑺辩泦鍏х敤锛 + [14468] = true, -- 棰ㄤ俊瀛愶紙鑺辩泦鍏х敤锛 + [14469] = true, -- 钁槅锛堣姳鐩嗗収鐢級 + [14470] = true, -- 棣箘閲戯紙鑺辩泦鍏х敤锛 + [14471] = true, -- 鐗′腹锛堣姳鐩嗗収鐢級 + [14472] = true, -- 钖旇枃 锛堣姳鐩嗗収鐢級 + [14473] = true, -- 榛嶇背锛堣姳鐩嗗収鐢級 + [14474] = true, -- 鐑忚暔锛堣姳鐩嗗収鐢級 + [14475] = true, -- 浠欏渚嗭紙鑺辩泦鍏х敤锛 + [14476] = true, -- 棣欒晧锛堣姳鐩嗗収鐢級 + [14477] = true, -- 棣欓洩铇紙鑺辩泦鍏х敤锛 + [14478] = true, -- 钀辫崏锛堣姳鐩嗗収鐢級 + [14479] = true, -- 闆佷締绱咃紙鑺辩泦鍏х敤锛 + [14480] = true, -- 鏈堝锛堣姳鐩嗗収鐢級 + [14481] = true, -- 绱胆钂匡紙鑺辩泦鍏х敤锛 + [14482] = true, -- 绻$悆鑺憋紙鑺辩泦鍏х敤锛 + [14483] = true, -- 钀=鑿婏紙鑺辩泦鍏х敤锛 + [14484] = true, -- 鏈ㄨ姍钃夛紙鑺辩泦鍏х敤锛 + [14485] = true, -- 骞艰嫍涓锛堣姳鐩嗗収鐢級 + [14486] = true, -- 骞艰嫍浜岋紙鑺辩泦鍏х敤锛 + [14487] = true, -- 骞艰嫍涓夛紙鑺辩泦鍏х敤锛 + [14488] = true, -- 骞艰嫍鍥涳紙鑺辩泦鍏х敤锛 + [14489] = true, -- 骞艰嫍浜旓紙鑺辩泦鍏х敤锛 + [14490] = true, -- 骞艰嫍鍏紙鑺辩泦鍏х敤锛 + [14491] = true, -- 骞艰嫍涓冿紙鑺辩泦鍏х敤锛 + [14492] = true, -- 缈犻洸鑽夊辜鑺-闆ㄦ礇鐜夌泦 + [14493] = true, -- 棰ㄤ俊瀛愬辜鑺-闆ㄦ礇鐜夌泦 + [14494] = true, -- 钁槅骞艰娊-闆ㄦ礇鐜夌泦 + [14495] = true, -- 棣箘閲戝辜鑺-闆ㄦ礇鐜夌泦 + [14496] = true, -- 鐗′腹骞艰娊-闆ㄦ礇鐜夌泦 + [14497] = true, -- 钖旇枃骞艰娊-闆ㄦ礇鐜夌泦 + [14498] = true, -- 榛嶇背骞艰娊-闆ㄦ礇鐜夌泦 + [14499] = true, -- 鐑忚暔骞艰娊-闆ㄦ礇鐜夌泦 + [14500] = true, -- 浠欏渚嗗辜鑺-闆ㄦ礇鐜夌泦 + [14501] = true, -- 棣欒晧骞艰娊-闆ㄦ礇鐜夌泦 + [14502] = true, -- 棣欓洩铇辜鑺-闆ㄦ礇鐜夌泦 + [14503] = true, -- 钀辫崏骞艰娊-闆ㄦ礇鐜夌泦 + [14504] = true, -- 闆佷締绱呭辜鑺-闆ㄦ礇鐜夌泦 + [14505] = true, -- 鏈堝骞艰娊-闆ㄦ礇鐜夌泦 + [14506] = true, -- 绱胆钂垮辜鑺-闆ㄦ礇鐜夌泦 + [14507] = true, -- 绻$悆鑺卞辜鑺-闆ㄦ礇鐜夌泦 + [14508] = true, -- 钀=鑿婂辜鑺-闆ㄦ礇鐜夌泦 + [14509] = true, -- 鏈ㄨ姍钃夊辜鑺-闆ㄦ礇鐜夌泦 + [14510] = true, -- 缈犻洸鑽夊辜鑻-闆ㄦ礇鐜夌泦 + [14511] = true, -- 棰ㄤ俊瀛愬辜鑻-闆ㄦ礇鐜夌泦 + [14512] = true, -- 钁槅骞艰嫍-闆ㄦ礇鐜夌泦 + [14513] = true, -- 棣箘閲戝辜鑻-闆ㄦ礇鐜夌泦 + + [18632] = true, -- 姗熼棞绠彴 + [18684] = true, -- 姗熼棞绠彴 + [67133] = true, -- 姗熼棞绠彴 + + [18805] = true, -- 杌婂墠鑽夛紙鑺辩泦鍏х敤锛 + [18806] = true, -- 锜茶崏锛堣姳鐩嗗収鐢級 + [18807] = true, -- 宸濊矟锛堣姳鐩嗗収鐢級 + [18808] = true, -- 澶ч粌锛堣姳鐩嗗収鐢級 + [18809] = true, -- 闃查ⅷ锛堣姳鐩嗗収鐢級 + [18810] = true, -- 鐢樿崏锛堣姳鐩嗗収鐢級 + [18811] = true, -- 鏋告潪锛堣姳鐩嗗収鐢級 + [18812] = true, -- 閲戝壍灏忚崏锛堣姳鐩嗗収鐢級 + [18813] = true, -- 閲戦妧鑺憋紙鑺辩泦鍏х敤锛 + [18814] = true, -- 铇崏锛堣姳鐩嗗収鐢級 + [18815] = true, -- 楹ュ啲锛堣姳鐩嗗収鐢級 + [18816] = true, -- 鍗冮噷棣欙紙鑺辩泦鍏х敤锛 + [18817] = true, -- 鑺嶈棩锛堣姳鐩嗗収鐢級 + [18818] = true, -- 澶╅夯锛堣姳鐩嗗収鐢級 + [18819] = true, -- 澶╁悕绮撅紙鑺辩泦鍏х敤锛 + [18820] = true, -- 鐢颁竷锛堣姳鐩嗗収鐢級 + [18821] = true, -- 浜斿懗瀛愶紙鑺辩泦鍏х敤锛 + [18822] = true, -- 浠欒寘锛堣姳鐩嗗収鐢級 + [18823] = true, -- 鐩告濆瓙锛堣姳鐩嗗収鐢級 + [18824] = true, -- 閬犲織锛堣姳鐩嗗収鐢級 + [18825] = true, -- 闄充竴娓│ + [18826] = true, -- 姘寸 + [18828] = true, -- 杌婂墠鑽夊辜鑺-闆ㄦ礇鐜夌泦 + [18829] = true, -- 锜茶崏骞艰娊-闆ㄦ礇鐜夌泦 + [18830] = true, -- 宸濊矟骞艰娊-闆ㄦ礇鐜夌泦 + [18831] = true, -- 澶ч粌骞艰娊-闆ㄦ礇鐜夌泦 + [18832] = true, -- 闃查ⅷ骞艰娊-闆ㄦ礇鐜夌泦 + [18833] = true, -- 鐢樿崏骞艰娊-闆ㄦ礇鐜夌泦 + [18834] = true, -- 鏋告潪骞艰娊-闆ㄦ礇鐜夌泦 + [18835] = true, -- 閲戝壍灏忚崏骞艰娊-闆ㄦ礇鐜夌泦 + [18836] = true, -- 閲戦妧鑺卞辜鑺-闆ㄦ礇鐜夌泦 + [18837] = true, -- 铇崏骞艰娊-闆ㄦ礇鐜夌泦 + [18838] = true, -- 楹ュ啲骞艰娊-闆ㄦ礇鐜夌泦 + [18839] = true, -- 鍗冮噷棣欏辜鑺-闆ㄦ礇鐜夌泦 + [18840] = true, -- 鑺嶈棩骞艰娊-闆ㄦ礇鐜夌泦 + [18841] = true, -- 澶╅夯骞艰娊-闆ㄦ礇鐜夌泦 + [18842] = true, -- 澶╁悕绮惧辜鑺-闆ㄦ礇鐜夌泦 + [18843] = true, -- 鐢颁竷骞艰娊-闆ㄦ礇鐜夌泦 + [18844] = true, -- 浜斿懗瀛愬辜鑺-闆ㄦ礇鐜夌泦 + [18845] = true, -- 浠欒寘骞艰娊-闆ㄦ礇鐜夌泦 + [18846] = true, -- 鐩告濆瓙骞艰娊-闆ㄦ礇鐜夌泦 + [18847] = true, -- 閬犲織骞艰娊-闆ㄦ礇鐜夌泦 + [18848] = true, -- 杌婂墠鑽夊辜鑻-闆ㄦ礇鐜夌泦 + [18849] = true, -- 锜茶崏骞艰嫍-闆ㄦ礇鐜夌泦 + [18850] = true, -- 宸濊矟骞艰嫍-闆ㄦ礇鐜夌泦 + [18851] = true, -- 澶ч粌骞艰嫍-闆ㄦ礇鐜夌泦 + [18852] = true, -- 闃查ⅷ骞艰嫍-闆ㄦ礇鐜夌泦 + [18853] = true, -- 鐢樿崏骞艰嫍-闆ㄦ礇鐜夌泦 + [18854] = true, -- 鏋告潪骞艰嫍-闆ㄦ礇鐜夌泦 + [18855] = true, -- 閲戝壍灏忚崏骞艰嫍-闆ㄦ礇鐜夌泦 + [18856] = true, -- 閲戦妧鑺卞辜鑻-闆ㄦ礇鐜夌泦 + [18857] = true, -- 铇崏骞艰嫍-闆ㄦ礇鐜夌泦 + [18858] = true, -- 楹ュ啲骞艰嫍-闆ㄦ礇鐜夌泦 + [18859] = true, -- 鍗冮噷棣欏辜鑻-闆ㄦ礇鐜夌泦 + [18860] = true, -- 鑺嶈棩骞艰嫍-闆ㄦ礇鐜夌泦 + [18861] = true, -- 澶╅夯骞艰嫍-闆ㄦ礇鐜夌泦 + [18862] = true, -- 澶╁悕绮惧辜鑻-闆ㄦ礇鐜夌泦 + [18863] = true, -- 鐢颁竷骞艰嫍-闆ㄦ礇鐜夌泦 + [18864] = true, -- 浜斿懗瀛愬辜鑻-闆ㄦ礇鐜夌泦 + [18865] = true, -- 浠欒寘骞艰嫍-闆ㄦ礇鐜夌泦 + [18866] = true, -- 鐩告濆瓙骞艰嫍-闆ㄦ礇鐜夌泦 + [18867] = true, -- 閬犲織骞艰嫍-闆ㄦ礇鐜夌泦 + [18868] = true, -- 杌婂墠鑽-闆ㄦ礇鐜夌泦 + [18869] = true, -- 锜茶崏-闆ㄦ礇鐜夌泦 + [18870] = true, -- 宸濊矟-闆ㄦ礇鐜夌泦 + [18871] = true, -- 澶ч粌-闆ㄦ礇鐜夌泦 + [18872] = true, -- 闃查ⅷ-闆ㄦ礇鐜夌泦 + [18873] = true, -- 鐢樿崏-闆ㄦ礇鐜夌泦 + [18874] = true, -- 鏋告潪-闆ㄦ礇鐜夌泦 + [18875] = true, -- 閲戝壍灏忚崏-闆ㄦ礇鐜夌泦 + [18876] = true, -- 閲戦妧鑺-闆ㄦ礇鐜夌泦 + [18877] = true, -- 铇崏-闆ㄦ礇鐜夌泦 + [18878] = true, -- 楹ュ啲-闆ㄦ礇鐜夌泦 + [18879] = true, -- 鍗冮噷棣-闆ㄦ礇鐜夌泦 + [18880] = true, -- 鑺嶈棩-闆ㄦ礇鐜夌泦 + [18881] = true, -- 澶╅夯-闆ㄦ礇鐜夌泦 + [18882] = true, -- 澶╁悕绮-闆ㄦ礇鐜夌泦 + [18883] = true, -- 鐢颁竷-闆ㄦ礇鐜夌泦 + [18884] = true, -- 浜斿懗瀛-闆ㄦ礇鐜夌泦 + [18885] = true, -- 浠欒寘-闆ㄦ礇鐜夌泦 + [18886] = true, -- 鐩告濆瓙-闆ㄦ礇鐜夌泦 + [18887] = true, -- 閬犲織-闆ㄦ礇鐜夌泦 + + [18931] = true, -- 杌婂墠鑽夊辜鑺-棰ㄦ竻鐜夌泦 + [18932] = true, -- 锜茶崏骞艰娊-棰ㄦ竻鐜夌泦 + [18933] = true, -- 宸濊矟骞艰娊-棰ㄦ竻鐜夌泦 + [18934] = true, -- 澶ч粌骞艰娊-棰ㄦ竻鐜夌泦 + [18935] = true, -- 闃查ⅷ骞艰娊-棰ㄦ竻鐜夌泦 + [18936] = true, -- 鐢樿崏骞艰娊-棰ㄦ竻鐜夌泦 + [18937] = true, -- 鏋告潪骞艰娊-棰ㄦ竻鐜夌泦 + [18938] = true, -- 閲戝壍灏忚崏骞艰娊-棰ㄦ竻鐜夌泦 + [18939] = true, -- 閲戦妧鑺卞辜鑺-棰ㄦ竻鐜夌泦 + [18940] = true, -- 铇崏骞艰娊-棰ㄦ竻鐜夌泦 + [18941] = true, -- 楹ュ啲骞艰娊-棰ㄦ竻鐜夌泦 + [18942] = true, -- 鍗冮噷棣欏辜鑺-棰ㄦ竻鐜夌泦 + [18943] = true, -- 鑺嶈棩骞艰娊-棰ㄦ竻鐜夌泦 + [18944] = true, -- 澶╅夯骞艰娊-棰ㄦ竻鐜夌泦 + [18945] = true, -- 澶╁悕绮惧辜鑺-棰ㄦ竻鐜夌泦 + [18946] = true, -- 鐢颁竷骞艰娊-棰ㄦ竻鐜夌泦 + [18947] = true, -- 浜斿懗瀛愬辜鑺-棰ㄦ竻鐜夌泦 + [18948] = true, -- 浠欒寘骞艰娊-棰ㄦ竻鐜夌泦 + [18949] = true, -- 鐩告濆瓙骞艰娊-棰ㄦ竻鐜夌泦 + [18950] = true, -- 閬犲織骞艰娊-棰ㄦ竻鐜夌泦 + [18951] = true, -- 杌婂墠鑽夊辜鑻-棰ㄦ竻鐜夌泦 + [18952] = true, -- 锜茶崏骞艰嫍-棰ㄦ竻鐜夌泦 + [18953] = true, -- 宸濊矟骞艰嫍-棰ㄦ竻鐜夌泦 + [18954] = true, -- 澶ч粌骞艰嫍-棰ㄦ竻鐜夌泦 + [18955] = true, -- 闃查ⅷ骞艰嫍-棰ㄦ竻鐜夌泦 + [18956] = true, -- 鐢樿崏骞艰嫍-棰ㄦ竻鐜夌泦 + [18957] = true, -- 鏋告潪骞艰嫍-棰ㄦ竻鐜夌泦 + [18958] = true, -- 閲戝壍灏忚崏骞艰嫍-棰ㄦ竻鐜夌泦 + [18959] = true, -- 閲戦妧鑺卞辜鑻-棰ㄦ竻鐜夌泦 + [18960] = true, -- 铇崏骞艰嫍-棰ㄦ竻鐜夌泦 + [18961] = true, -- 楹ュ啲骞艰嫍-棰ㄦ竻鐜夌泦 + [18962] = true, -- 鍗冮噷棣欏辜鑻-棰ㄦ竻鐜夌泦 + [18963] = true, -- 鑺嶈棩骞艰嫍-棰ㄦ竻鐜夌泦 + [18964] = true, -- 澶╅夯骞艰嫍-棰ㄦ竻鐜夌泦 + [18965] = true, -- 澶╁悕绮惧辜鑻-棰ㄦ竻鐜夌泦 + [18966] = true, -- 鐢颁竷骞艰嫍-棰ㄦ竻鐜夌泦 + [18967] = true, -- 浜斿懗瀛愬辜鑻-棰ㄦ竻鐜夌泦 + [18968] = true, -- 浠欒寘骞艰嫍-棰ㄦ竻鐜夌泦 + [18969] = true, -- 鐩告濆瓙骞艰嫍-棰ㄦ竻鐜夌泦 + [18970] = true, -- 閬犲織骞艰嫍-棰ㄦ竻鐜夌泦 + [18971] = true, -- 杌婂墠鑽-棰ㄦ竻鐜夌泦 + [18972] = true, -- 锜茶崏-棰ㄦ竻鐜夌泦 + [18973] = true, -- 宸濊矟-棰ㄦ竻鐜夌泦 + [18974] = true, -- 澶ч粌-棰ㄦ竻鐜夌泦 + [18975] = true, -- 闃查ⅷ-棰ㄦ竻鐜夌泦 + [18976] = true, -- 鐢樿崏-棰ㄦ竻鐜夌泦 + [18977] = true, -- 鏋告潪-棰ㄦ竻鐜夌泦 + [18978] = true, -- 閲戝壍灏忚崏-棰ㄦ竻鐜夌泦 + [18979] = true, -- 閲戦妧鑺-棰ㄦ竻鐜夌泦 + [18980] = true, -- 铇崏-棰ㄦ竻鐜夌泦 + [18981] = true, -- 楹ュ啲-棰ㄦ竻鐜夌泦 + [18982] = true, -- 鍗冮噷棣-棰ㄦ竻鐜夌泦 + [18983] = true, -- 鑺嶈棩-棰ㄦ竻鐜夌泦 + [18984] = true, -- 澶╅夯-棰ㄦ竻鐜夌泦 + [18985] = true, -- 澶╁悕绮-棰ㄦ竻鐜夌泦 + [18986] = true, -- 鐢颁竷-棰ㄦ竻鐜夌泦 + [18987] = true, -- 浜斿懗瀛-棰ㄦ竻鐜夌泦 + [18988] = true, -- 浠欒寘-棰ㄦ竻鐜夌泦 + [18989] = true, -- 鐩告濆瓙-棰ㄦ竻鐜夌泦 + [18990] = true, -- 閬犲織-棰ㄦ竻鐜夌泦 + [18991] = true, -- 杌婂墠鑽夊辜鑺-闆茶崝鐜夌泦 + [18992] = true, -- 锜茶崏骞艰娊-闆茶崝鐜夌泦 + [18993] = true, -- 宸濊矟骞艰娊-闆茶崝鐜夌泦 + [18994] = true, -- 澶ч粌骞艰娊-闆茶崝鐜夌泦 + [18995] = true, -- 闃查ⅷ骞艰娊-闆茶崝鐜夌泦 + [18996] = true, -- 鐢樿崏骞艰娊-闆茶崝鐜夌泦 + [18997] = true, -- 鏋告潪骞艰娊-闆茶崝鐜夌泦 + [18998] = true, -- 閲戝壍灏忚崏骞艰娊-闆茶崝鐜夌泦 + [18999] = true, -- 閲戦妧鑺卞辜鑺-闆茶崝鐜夌泦 + [19000] = true, -- 铇崏骞艰娊-闆茶崝鐜夌泦 + [19001] = true, -- 楹ュ啲骞艰娊-闆茶崝鐜夌泦 + [19002] = true, -- 鍗冮噷棣欏辜鑺-闆茶崝鐜夌泦 + [19003] = true, -- 鑺嶈棩骞艰娊-闆茶崝鐜夌泦 + [19004] = true, -- 澶╅夯骞艰娊-闆茶崝鐜夌泦 + [19005] = true, -- 澶╁悕绮惧辜鑺-闆茶崝鐜夌泦 + [19006] = true, -- 鐢颁竷骞艰娊-闆茶崝鐜夌泦 + [19007] = true, -- 浜斿懗瀛愬辜鑺-闆茶崝鐜夌泦 + [19008] = true, -- 浠欒寘骞艰娊-闆茶崝鐜夌泦 + [19009] = true, -- 鐩告濆瓙骞艰娊-闆茶崝鐜夌泦 + [19010] = true, -- 閬犲織骞艰娊-闆茶崝鐜夌泦 + [19011] = true, -- 杌婂墠鑽夊辜鑻-闆茶崝鐜夌泦 + [19012] = true, -- 锜茶崏骞艰嫍-闆茶崝鐜夌泦 + [19013] = true, -- 宸濊矟骞艰嫍-闆茶崝鐜夌泦 + [19014] = true, -- 澶ч粌骞艰嫍-闆茶崝鐜夌泦 + [19015] = true, -- 闃查ⅷ骞艰嫍-闆茶崝鐜夌泦 + [19016] = true, -- 鐢樿崏骞艰嫍-闆茶崝鐜夌泦 + [19017] = true, -- 鏋告潪骞艰嫍-闆茶崝鐜夌泦 + [19018] = true, -- 閲戝壍灏忚崏骞艰嫍-闆茶崝鐜夌泦 + [19019] = true, -- 閲戦妧鑺卞辜鑻-闆茶崝鐜夌泦 + [19020] = true, -- 铇崏骞艰嫍-闆茶崝鐜夌泦 + [19021] = true, -- 楹ュ啲骞艰嫍-闆茶崝鐜夌泦 + [19022] = true, -- 鍗冮噷棣欏辜鑻-闆茶崝鐜夌泦 + [19023] = true, -- 鑺嶈棩骞艰嫍-闆茶崝鐜夌泦 + [19024] = true, -- 澶╅夯骞艰嫍-闆茶崝鐜夌泦 + [19025] = true, -- 澶╁悕绮惧辜鑻-闆茶崝鐜夌泦 + [19026] = true, -- 鐢颁竷骞艰嫍-闆茶崝鐜夌泦 + [19027] = true, -- 浜斿懗瀛愬辜鑻-闆茶崝鐜夌泦 + [19028] = true, -- 浠欒寘骞艰嫍-闆茶崝鐜夌泦 + [19029] = true, -- 鐩告濆瓙骞艰嫍-闆茶崝鐜夌泦 + [19030] = true, -- 閬犲織骞艰嫍-闆茶崝鐜夌泦 + [19031] = true, -- 杌婂墠鑽-闆茶崝鐜夌泦 + [19032] = true, -- 锜茶崏-闆茶崝鐜夌泦 + [19033] = true, -- 宸濊矟-闆茶崝鐜夌泦 + [19034] = true, -- 澶ч粌-闆茶崝鐜夌泦 + [19035] = true, -- 闃查ⅷ-闆茶崝鐜夌泦 + [19036] = true, -- 鐢樿崏-闆茶崝鐜夌泦 + [19037] = true, -- 鏋告潪-闆茶崝鐜夌泦 + [19038] = true, -- 閲戝壍灏忚崏-闆茶崝鐜夌泦 + [19039] = true, -- 閲戦妧鑺-闆茶崝鐜夌泦 + [19040] = true, -- 铇崏-闆茶崝鐜夌泦 + [19041] = true, -- 楹ュ啲-闆茶崝鐜夌泦 + [19042] = true, -- 鍗冮噷棣-闆茶崝鐜夌泦 + [19043] = true, -- 鑺嶈棩-闆茶崝鐜夌泦 + [19044] = true, -- 澶╅夯-闆茶崝鐜夌泦 + [19045] = true, -- 澶╁悕绮-闆茶崝鐜夌泦 + [19046] = true, -- 鐢颁竷-闆茶崝鐜夌泦 + [19047] = true, -- 浜斿懗瀛-闆茶崝鐜夌泦 + [19048] = true, -- 浠欒寘-闆茶崝鐜夌泦 + [19049] = true, -- 鐩告濆瓙-闆茶崝鐜夌泦 + [19050] = true, -- 閬犲織-闆茶崝鐜夌泦 + + [20050] = true, -- 鐧捐剤鏍(鑺辩泦鍏х敤) + [20051] = true, -- 绱姳鑻滆摽锛堣姳鐩嗗収鐢級 + [20052] = true, -- 鐢滆薄鑽夛紙鑺辩泦鍏х敤锛 + [20053] = true, -- 鐨囩鑽夛紙鑺辩泦鍏х敤锛 + [20054] = true, -- 鐧捐剤鏍-闆ㄦ礇鐜夌泦 + [20055] = true, -- 绱姳鑻滆摽-闆ㄦ礇鐜夌泦 + [20056] = true, -- 鐢滆薄鑽-闆ㄦ礇鐜夌泦 + [20057] = true, -- 鐨囩鑽-闆ㄦ礇鐜夌泦 + [20058] = true, -- 鐧捐剤鏍-棰ㄦ竻鐜夌泦 + [20059] = true, -- 绱姳鑻滆摽-棰ㄦ竻鐜夌泦 + [20060] = true, -- 鐢滆薄鑽-棰ㄦ竻鐜夌泦 + [20061] = true, -- 鐨囩鑽-棰ㄦ竻鐜夌泦 + [20062] = true, -- 鐧捐剤鏍-闆茶崝鐜夌泦 + [20063] = true, -- 绱姳鑻滆摽-闆茶崝鐜夌泦 + [20064] = true, -- 鐢滆薄鑽-闆茶崝鐜夌泦 + [20065] = true, -- 鐨囩鑽-闆茶崝鐜夌泦 + + [20120] = true, -- 鐧捐剤骞艰娊-闆ㄦ礇鐜夌泦 + [20121] = true, -- 绱姳骞艰娊-闆ㄦ礇鐜夌泦 + [20122] = true, -- 鐢滆薄鑽夊辜鑺-闆ㄦ礇鐜夌泦 + [20123] = true, -- 鐨囩鑽夊辜鑺-闆ㄦ礇鐜夌泦 + [20124] = true, -- 鐧捐剤骞艰嫍-闆ㄦ礇鐜夌泦 + [20125] = true, -- 绱姳鑻滆摽骞艰嫍-闆ㄦ礇鐜夌泦 + [20126] = true, -- 鐢滆薄鑽夊辜鑻-闆ㄦ礇鐜夌泦 + [20127] = true, -- 鐨囩鑽夊辜鑻-闆ㄦ礇鐜夌泦 + [20128] = true, -- 鐧捐剤鏍瑰辜鑺-棰ㄦ竻鐜夌泦 + [20129] = true, -- 绱姳鑻滆摽骞艰娊-棰ㄦ竻鐜夌泦 + [20130] = true, -- 鐢滆薄鑽夊辜鑺-棰ㄦ竻鐜夌泦 + [20131] = true, -- 鐨囩鑽夊辜鑺-棰ㄦ竻鐜夌泦 + [20132] = true, -- 鐧捐剤鏍瑰辜鑻-棰ㄦ竻鐜夌泦 + [20133] = true, -- 绱姳鑻滆摽骞艰嫍-棰ㄦ竻鐜夌泦 + [20134] = true, -- 鐢滆薄鑽夊辜鑻-棰ㄦ竻鐜夌泦 + [20135] = true, -- 鐨囩鑽夊辜鑻-棰ㄦ竻鐜夌泦 + [20136] = true, -- 鐧捐剤鏍瑰辜鑺-闆茶崝鐜夌泦 + [20137] = true, -- 绱姳鑻滆摽骞艰娊-闆茶崝鐜夌泦 + [20138] = true, -- 鐢滆薄鑽夊辜鑺-闆茶崝鐜夌泦 + [20139] = true, -- 鐨囩鑽夊辜鑺-闆茶崝鐜夌泦 + [20140] = true, -- 鐧捐剤鏍瑰辜鑻-闆茶崝鐜夌泦 + [20141] = true, -- 绱姳鑻滆摽骞艰嫍-闆茶崝鐜夌泦 + [20142] = true, -- 鐢滆薄鑽夊辜鑻-闆茶崝鐜夌泦 + [20143] = true, -- 鐨囩鑽夊辜鑻-闆茶崝鐜夌泦 + + [20596] = true, -- 娴锋锛堣姳鐩嗗収鐢級 + [20597] = true, -- 鑿栬挷锛堣姳鐩嗗収鐢級 + [20598] = true, -- 娴锋骞艰娊-闆ㄦ礇鐜夌泦 + [20599] = true, -- 鑿栬挷骞艰娊-闆ㄦ礇鐜夌泦 + [20600] = true, -- 娴锋骞艰嫍-闆ㄦ礇鐜夌泦 + [20601] = true, -- 鑿栬挷骞艰嫍-闆ㄦ礇鐜夌泦 + [20602] = true, -- 娴锋-闆ㄦ礇鐜夌泦 + [20603] = true, -- 鑿栬挷-闆ㄦ礇鐜夌泦 + [20604] = true, -- 娴锋骞艰娊-棰ㄦ竻鐜夌泦 + [20605] = true, -- 鑿栬挷骞艰娊-棰ㄦ竻鐜夌泦 + [20606] = true, -- 娴锋骞艰嫍-棰ㄦ竻鐜夌泦 + [20607] = true, -- 鑿栬挷骞艰嫍-棰ㄦ竻鐜夌泦 + [20608] = true, -- 娴锋-棰ㄦ竻鐜夌泦 + [20609] = true, -- 鑿栬挷-棰ㄦ竻鐜夌泦 + [20610] = true, -- 娴锋骞艰娊-闆茶崝鐜夌泦 + [20611] = true, -- 鑿栬挷骞艰娊-闆茶崝鐜夌泦 + [20612] = true, -- 娴锋骞艰嫍-闆茶崝鐜夌泦 + [20613] = true, -- 鑿栬挷骞艰嫍-闆茶崝鐜夌泦 + [20614] = true, -- 娴锋-闆茶崝鐜夌泦 + [20615] = true, -- 鑿栬挷-闆茶崝鐜夌泦 + + + [20688] = true, -- 鑼嫇锛堣姳鐩嗗収鐢級 + [20689] = true, -- 鑼嫇骞艰娊-闆ㄦ礇鐜夌泦 + [20690] = true, -- 鑼嫇骞艰嫍-闆ㄦ礇鐜夌泦 + [20691] = true, -- 鑼嫇-闆ㄦ礇鐜夌泦 + [20692] = true, -- 鑼嫇骞艰娊-棰ㄦ竻鐜夌泦 + [20693] = true, -- 鑼嫇骞艰嫍-棰ㄦ竻鐜夌泦 + [20694] = true, -- 鑼嫇-棰ㄦ竻鐜夌泦 + [20695] = true, -- 鑼嫇骞艰娊-闆茶崝鐜夌泦 + [20696] = true, -- 鑼嫇骞艰嫍-闆茶崝鐜夌泦 + [20697] = true, -- 鑼嫇-闆茶崝鐜夌泦 + + [22889] = true, -- 鏈堝骞艰娊-闆ㄦ礇鐜夌泦 + [22890] = true, -- 鏈堝骞艰嫍-闆ㄦ礇鐜夌泦 + [22891] = true, -- 鏈堝-闆ㄦ礇鐜夌泦 + [22892] = true, -- 鏈堝骞艰娊-棰ㄦ竻鐜夌泦 + [22893] = true, -- 鏈堝骞艰嫍-棰ㄦ竻鐜夌泦 + [22894] = true, -- 鏈堝-棰ㄦ竻鐜夌泦 + [22895] = true, -- 鏈堝骞艰娊-闆茶崝鐜夌泦 + [22896] = true, -- 鏈堝骞艰嫍-闆茶崝鐜夌泦 + [22897] = true, -- 鏈堝-闆茶崝鐜夌泦 + + [25477] = true, -- 鐭宠摦鑺憋紙鑺辩泦鍏х敤锛 + [25478] = true, -- 褰煎哺鑺憋紙鑺辩泦鍏х敤锛 + [25479] = true, -- 鐭宠摦鑺卞辜鑺-闆ㄦ礇鐜夌泦 + [25480] = true, -- 褰煎哺鑺卞辜鑺-闆ㄦ礇鐜夌泦 + [25481] = true, -- 鐭宠摦鑺卞辜鑻-闆ㄦ礇鐜夌泦 + [25482] = true, -- 褰煎哺鑺卞辜鑻-闆ㄦ礇鐜夌泦 + [25483] = true, -- 鐭宠摦鑺-闆ㄦ礇鐜夌泦 + [25484] = true, -- 褰煎哺鑺-闆ㄦ礇鐜夌泦 + [25485] = true, -- 鐭宠摦鑺卞辜鑺-棰ㄦ竻鐜夌泦 + [25486] = true, -- 褰煎哺鑺卞辜鑺-棰ㄦ竻鐜夌泦 + [25487] = true, -- 鐭宠摦鑺卞辜鑻-棰ㄦ竻鐜夌泦 + [25488] = true, -- 褰煎哺鑺卞辜鑻-棰ㄦ竻鐜夌泦 + [25489] = true, -- 鐭宠摦鑺-棰ㄦ竻鐜夌泦 + [25490] = true, -- 褰煎哺鑺-棰ㄦ竻鐜夌泦 + [25491] = true, -- 鐭宠摦鑺卞辜鑺-闆茶崝鐜夌泦 + [25492] = true, -- 褰煎哺鑺卞辜鑺-闆茶崝鐜夌泦 + [25493] = true, -- 鐭宠摦鑺卞辜鑻-闆茶崝鐜夌泦 + [25494] = true, -- 褰煎哺鑺卞辜鑻-闆茶崝鐜夌泦 + [25495] = true, -- 鐭宠摦鑺-闆茶崝鐜夌泦 + [25496] = true, -- 褰煎哺鑺-闆茶崝鐜夌泦 + + [41825] = true, -- 鍗冭》涓嶆笣 + [45221] = true, -- 蹇冧笉閲嬫墜 + + [46412] = true, -- 鐜╁姘e牬-姹熼愭湀澶 + [46413] = true, -- 鐜╁姘e牬-闆茬敓绲愭捣 + [46414] = true, -- 鐜╁姘e牬-绗戝偛鍏夐櫚 + + [48026] = true, -- 鐧借锛堣姳鐩嗗収鐢級 + [48027] = true, -- 绱槆锛堣姳鐩嗗収鐢級 + [48028] = true, -- 鐧借骞艰娊-闆ㄦ礇鐜夌泦 + [48029] = true, -- 绱槆骞艰娊-闆ㄦ礇鐜夌泦 + [48030] = true, -- 鐧借骞艰嫍-闆ㄦ礇鐜夌泦 + [48031] = true, -- 绱槆骞艰嫍-闆ㄦ礇鐜夌泦 + [48032] = true, -- 鐧借-闆ㄦ礇鐜夌泦 + [48033] = true, -- 绱槆-闆ㄦ礇鐜夌泦 + [48034] = true, -- 鐧借骞艰娊-棰ㄦ竻鐜夌泦 + [48035] = true, -- 绱槆骞艰娊-棰ㄦ竻鐜夌泦 + [48036] = true, -- 鐧借骞艰嫍-棰ㄦ竻鐜夌泦 + [48037] = true, -- 绱槆骞艰嫍-棰ㄦ竻鐜夌泦 + [48038] = true, -- 鐧借-棰ㄦ竻鐜夌泦 + [48039] = true, -- 绱槆-棰ㄦ竻鐜夌泦 + [48040] = true, -- 鐧借骞艰娊-闆茶崝鐜夌泦 + [48041] = true, -- 绱槆骞艰娊-闆茶崝鐜夌泦 + [48042] = true, -- 鐧借骞艰嫍-闆茶崝鐜夌泦 + [48043] = true, -- 绱槆骞艰嫍-闆茶崝鐜夌泦 + [48044] = true, -- 鐧借-闆茶崝鐜夌泦 + [48045] = true, -- 绱槆-闆茶崝鐜夌泦 + + [51383] = true, -- 闉﹂焼 + + [51584] = true, -- 鍊嬩汉绺芥帶 + [51585] = true, -- 钘濅汉浼村NPC1 + [51586] = true, -- 钘濅汉浼村NPC2 + [51587] = true, -- 钘濅汉浼村NPC3 + [51588] = true, -- 钘濅汉浼村NPC4 + [51647] = true, -- 婧愭簮 +} diff --git a/MY_MiddleMapMark/info.ini b/MY_MiddleMapMark/info.ini new file mode 100644 index 000000000..71e865565 --- /dev/null +++ b/MY_MiddleMapMark/info.ini @@ -0,0 +1,8 @@ +[MY_MiddleMapMark] +name=地图搜索 +desc=记录场景角色和交互物件供日后搜索 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_MiddleMapMark.lua +package=MY diff --git a/MY_MiddleMapMark/info.ini.zh_TW b/MY_MiddleMapMark/info.ini.zh_TW new file mode 100644 index 000000000..1c4230b5e --- /dev/null +++ b/MY_MiddleMapMark/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_MiddleMapMark] +name=鍦板湒鎼滅储 +desc=瑷橀寗鍫存櫙瑙掕壊鍜屼氦浜掔墿浠朵緵鏃ュ緦鎼滅储 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_MiddleMapMark.lua +package=MY diff --git a/MY_MiddleMapMark/lang/zhcn.jx3dat b/MY_MiddleMapMark/lang/zhcn.jx3dat new file mode 100644 index 000000000..219c43f7f --- /dev/null +++ b/MY_MiddleMapMark/lang/zhcn.jx3dat @@ -0,0 +1,20 @@ +return { + ['MY_MiddleMapMark'] = '地图搜索', + ['MY middle map mark'] = '茗伊插件·地图搜索', + ['Show search in middle map panel'] = '启用地图界面输入框搜索功能', + ['Clear current map data'] = '清除当前地图数据缓存', + ['Current map (%s) npc and doodad record will be deleted, are you sure?'] = '当前地图(%s)的系统角色坐标、交互物品坐标信息都将被删除,确认删除吗?', + ['Type to search, use comma to split.'] = '输入文字进行搜索,半角逗号分隔多个搜索项。\n如:皇竹草,甜象草', + ['[Read]'] = '[已阅读]', + ['[Not read]'] = '[未阅读]', + ['MY_MiddleMapMark TIPS'] = { + '说明:', + '  1、在上方输入框输入您想要查询的物品名称,即可进行地图物品查询。', + '  2、该功能会在您角色遇见场景中的物品、NPC时,记录他们的位置并保存在本地。', + '  3、新装客户端由于没有足够的记录,可能出现搜索结果不完全的问题。', + '  4、所有物品坐标信息仅会保存在本地,不涉及任何数据内容上传或下载。', + '  5、物品坐标位置每次更新都可能被官方修改,查询结果只代表物品被记录时刻的瞬时信息。', + }, + ['Ancient database detected, do you want to migrate data from it?'] = '发现旧版地图数据,是否立即转换数据?', + ['Migrate succeed!'] = '地图数据迁移成功!', +} diff --git a/MY_MiddleMapMark/lang/zhtw.jx3dat b/MY_MiddleMapMark/lang/zhtw.jx3dat new file mode 100644 index 000000000..29e244872 --- /dev/null +++ b/MY_MiddleMapMark/lang/zhtw.jx3dat @@ -0,0 +1,20 @@ +return { + ['MY_MiddleMapMark'] = '鍦板湒鎼滅储', + ['MY middle map mark'] = '鑼椾紛鎻掍欢路鍦板湒鎼滅储', + ['Show search in middle map panel'] = '鍟熺敤鍦板湒鐣岄潰杓稿叆妗嗘悳绱㈠姛鑳', + ['Clear current map data'] = '娓呴櫎鐣跺墠鍦板湒鏁告摎绶╁瓨', + ['Current map (%s) npc and doodad record will be deleted, are you sure?'] = '鐣跺墠鍦板湒(%s)鐨勭郴绲辫鑹插潗妯欍佷氦浜掔墿鍝佸潗妯欎俊鎭兘灏囪鍒櫎锛岀⒑瑾嶅埅闄ゅ棊锛', + ['Type to search, use comma to split.'] = '杓稿叆鏂囧瓧閫茶鎼滅储锛屽崐褰㈤楄櫉鍒嗛殧澶氬嬫悳绱㈤爡銆俓n濡傦細鐨囩鑽,鐢滆薄鑽', + ['[Read]'] = '[宸查柋璁]', + ['[Not read]'] = '[鏈柋璁]', + ['MY_MiddleMapMark TIPS'] = { + '瑾槑锛', + '銆銆1銆佸湪涓婃柟杓稿叆妗嗚几鍏ユ偍鎯宠鏌ヨ鐨勭墿鍝佸悕绋憋紝鍗冲彲閫茶鍦板湒鐗╁搧鏌ヨ銆', + '銆銆2銆佽┎鍔熻兘鏈冨湪鎮ㄨ鑹查亣瑕嬪牬鏅腑鐨勭墿鍝併丯PC鏅傦紝瑷橀寗浠栧戠殑浣嶇疆涓︿繚瀛樺湪鏈湴銆', + '銆銆3銆佹柊瑁濆鎴剁鐢辨柤娌掓湁瓒冲鐨勮閷勶紝鍙兘鍑虹従鎼滅储绲愭灉涓嶅畬鍏ㄧ殑鍟忛銆', + '銆銆4銆佹墍鏈夌墿鍝佸潗妯欎俊鎭儏鏈冧繚瀛樺湪鏈湴锛屼笉娑夊強浠讳綍鏁告摎鍏у涓婂偝鎴栦笅杓夈', + '銆銆5銆佺墿鍝佸潗妯欎綅缃瘡娆℃洿鏂伴兘鍙兘琚畼鏂逛慨鏀癸紝鏌ヨ绲愭灉鍙唬琛ㄧ墿鍝佽瑷橀寗鏅傚埢鐨勭灛鏅備俊鎭', + }, + ['Ancient database detected, do you want to migrate data from it?'] = '鐧肩従鑸婄増鍦板湒鏁告摎锛屾槸鍚︾珛鍗宠綁鎻涙暩鎿氾紵', + ['Migrate succeed!'] = '鍦板湒鏁告摎閬风Щ鎴愬姛锛', +} diff --git a/MY_MiddleMapMark/src/MY_MiddleMapMark.lua b/MY_MiddleMapMark/src/MY_MiddleMapMark.lua new file mode 100644 index 000000000..9ea427431 --- /dev/null +++ b/MY_MiddleMapMark/src/MY_MiddleMapMark.lua @@ -0,0 +1,960 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 中地图标记 记录所有NPC和Doodad位置 提供搜索 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_MiddleMapMark/MY_MiddleMapMark' +local PLUGIN_NAME = 'MY_MiddleMapMark' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_MiddleMapMark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_MiddleMapMark', { ['*'] = false, exp = true }) +X.RegisterRestriction('MY_MiddleMapMark.MapRestriction', { ['*'] = true }) +-------------------------------------------------------------------------------- +X.CreateDataRoot(X.PATH_TYPE.GLOBAL) +local l_szKeyword, l_dwMapID, l_nMapIndex, l_renderTime = '', nil, nil, 0 +local DB = X.SQLiteConnect(_L['MY_MiddleMapMark'], {'cache/npc_doodad_rec.v5.db', X.PATH_TYPE.GLOBAL}) +if not DB then + return X.OutputSystemMessage(_L['MY_MiddleMapMark'], _L['Cannot connect to database!!!'], X.CONSTANT.MSG_THEME.ERROR) +end +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS NpcInfo ( + templateid INTEGER NOT NULL, + poskey INTEGER NOT NULL, + mapid INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + z INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + title NVARCHAR(20) NOT NULL, + level INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(templateid, poskey) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS mmm_name_idx ON NpcInfo(name, mapid)') +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS mmm_title_idx ON NpcInfo(title, mapid)') +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS mmm_template_idx ON NpcInfo(templateid, mapid)') +local DBN_W = X.SQLitePrepare(DB, 'REPLACE INTO NpcInfo (templateid, poskey, mapid, x, y, z, name, title, level, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)') +local DBN_DM = X.SQLitePrepare(DB, 'DELETE FROM NpcInfo WHERE mapid = ?') +local DBN_RI = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name, title, level FROM NpcInfo WHERE templateid = ?') +local DBN_RN = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name, title, level FROM NpcInfo WHERE name LIKE ? OR title LIKE ?') +local DBN_RNM = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name, title, level FROM NpcInfo WHERE (name LIKE ? AND mapid = ?) OR (title LIKE ? AND mapid = ?)') +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS DoodadInfo ( + templateid INTEGER NOT NULL, + poskey INTEGER NOT NULL, + mapid INTEGER NOT NULL, + x INTEGER NOT NULL, + y INTEGER NOT NULL, + z INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY (templateid, poskey) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS mmm_name_idx ON DoodadInfo(name, mapid)') +local DBD_W = X.SQLitePrepare(DB, 'REPLACE INTO DoodadInfo (templateid, poskey, mapid, x, y, z, name, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?)') +local DBD_DM = X.SQLitePrepare(DB, 'DELETE FROM DoodadInfo WHERE mapid = ?') +local DBD_RI = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name FROM DoodadInfo WHERE templateid = ?') +local DBD_RN = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name FROM DoodadInfo WHERE name LIKE ?') +local DBD_RNM = X.SQLitePrepare(DB, 'SELECT templateid, poskey, mapid, x, y, z, name FROM DoodadInfo WHERE name LIKE ? AND mapid = ?') + +local O = X.CreateUserSettingsModule('MY_MiddleMapMark', _L['General'], { + bMiddleMapSearch = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_MiddleMapMark'], + szDescription = X.MakeCaption({ + _L['Show search in middle map panel'], + }), + szRestriction = 'MY_MiddleMapMark', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +--------------------------------------------------------------- +-- 数据存储 +--------------------------------------------------------------- +local L16 = 0x10000 +local L32 = 0x100000000 +-- NPC 最大独立距离8尺(低于该距离的两个实体视为同一个) +-- DOODAD 最大独立距离2尺(低于该距离的两个实体视为同一个) +-- 不可随意更改,更改需要清空数据库重新建立key索引 +local NPC_MAX_DISTINCT_DISTANCE = 8 * 64 +local DOODAD_MAX_DISTINCT_DISTANCE = 2 * 64 +-- 47 - 32 位 mapid +-- 31 - 16 位 x +-- 15 - 0 位 y +local function GeneNpcInfoPosKey(mapid, x, y) + return mapid * L32 + math.floor(x / NPC_MAX_DISTINCT_DISTANCE) * L16 + math.floor(y / NPC_MAX_DISTINCT_DISTANCE) +end +local function GeneDoodadInfoPosKey(mapid, x, y) + return mapid * L32 + math.floor(x / DOODAD_MAX_DISTINCT_DISTANCE) * L16 + math.floor(y / DOODAD_MAX_DISTINCT_DISTANCE) +end + +function D.Migration() + local DB_V1_ROOT = 'cache/NPC_DOODAD_REC/' + local DB_V1_PATH = X.FormatPath({DB_V1_ROOT, X.PATH_TYPE.DATA}) + local DB_V2_PATH = X.FormatPath({'cache/npc_doodad_rec.v2.db', X.PATH_TYPE.GLOBAL}) + local DB_V3_PATH = X.FormatPath({'cache/npc_doodad_rec.v3.db', X.PATH_TYPE.GLOBAL}) + local DB_V4_PATH = X.FormatPath({'cache/npc_doodad_rec.v4.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V1_PATH) and not IsLocalFileExist(DB_V2_PATH) and not IsLocalFileExist(DB_V3_PATH) and not IsLocalFileExist(DB_V4_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + -- 转移V1旧版数据 + if IsLocalFileExist(DB_V1_PATH) then + X.SQLiteBeginTransaction(DB) + for _, dwMapID in ipairs(GetMapList()) do + local data = X.LoadLUAData({DB_V1_ROOT .. dwMapID .. '.{$lang}.jx3dat', X.PATH_TYPE.DATA}) + if type(data) == 'string' then + data = X.DecodeJSON(data) + end + if data then + for _, p in ipairs(data.Npc) do + X.SQLitePrepareExecute( + DBN_W, + p.dwTemplateID, + GeneNpcInfoPosKey(dwMapID, p.nX, p.nY), + dwMapID, + p.nX, + p.nY, + -1, + AnsiToUTF8(p.szName), + AnsiToUTF8(p.szTitle), + p.nLevel, + '' + ) + end + for _, p in ipairs(data.Doodad) do + X.SQLitePrepareExecute( + DBD_W, + p.dwTemplateID, + GeneDoodadInfoPosKey(dwMapID, p.nX, p.nY), + dwMapID, + p.nX, + p.nY, + -1, + AnsiToUTF8(p.szName), + '' + ) + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_MiddleMapMark', 'MiddleMapMark cache trans from file to sqlite finished!', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + end + X.SQLiteEndTransaction(DB) + CPath.DelDir(X.FormatPath({DB_V1_ROOT, X.PATH_TYPE.DATA})) + end + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + X.SQLiteBeginTransaction(DB) + local aNpcInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM NpcInfo WHERE templateid IS NOT NULL') + if aNpcInfo then + for _, rec in ipairs(aNpcInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBN_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + rec.title or '', + rec.level or -1, + '' + ) + end + end + end + local aDoodadInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM DoodadInfo WHERE templateid IS NOT NULL') + if aDoodadInfo then + for _, rec in ipairs(aDoodadInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBD_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + '' + ) + end + end + end + X.SQLiteEndTransaction(DB) + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V3旧版数据 + if IsLocalFileExist(DB_V3_PATH) then + local DB_V3 = SQLite3_Open(DB_V3_PATH) + if DB_V3 then + X.SQLiteBeginTransaction(DB) + local aNpcInfo = X.SQLiteGetAll(DB_V3, 'SELECT * FROM NpcInfo WHERE templateid IS NOT NULL') + if aNpcInfo then + for _, rec in ipairs(aNpcInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBN_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + rec.title or '', + rec.level or -1, + '' + ) + end + end + end + local aDoodadInfo = X.SQLiteGetAll(DB_V3, 'SELECT * FROM DoodadInfo WHERE templateid IS NOT NULL') + if aDoodadInfo then + for _, rec in ipairs(aDoodadInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBD_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + '' + ) + end + end + end + X.SQLiteEndTransaction(DB) + DB_V3:Release() + end + CPath.Move(DB_V3_PATH, DB_V3_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V4旧版数据 + if IsLocalFileExist(DB_V4_PATH) then + local DB_V4 = SQLite3_Open(DB_V4_PATH) + if DB_V4 then + X.SQLiteBeginTransaction(DB) + local aNpcInfo = X.SQLiteGetAll(DB_V4, 'SELECT * FROM NpcInfo WHERE templateid IS NOT NULL') + if aNpcInfo then + for _, rec in ipairs(aNpcInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBN_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + rec.title or '', + rec.level or -1, + '' + ) + end + end + end + local aDoodadInfo = X.SQLiteGetAll(DB_V4, 'SELECT * FROM DoodadInfo WHERE templateid IS NOT NULL') + if aDoodadInfo then + for _, rec in ipairs(aDoodadInfo) do + if rec.templateid and rec.poskey then + X.SQLitePrepareExecute( + DBD_W, + rec.templateid, + rec.poskey, + rec.mapid or -1, + rec.x or -1, + rec.y or -1, + -1, + rec.name or '', + '' + ) + end + end + end + X.SQLiteEndTransaction(DB) + DB_V4:Release() + end + CPath.Move(DB_V4_PATH, DB_V4_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + X.Alert(_L['Migrate succeed!']) + end) +end +--------------------------------------------------------------- +-- 数据采集 +--------------------------------------------------------------- +local l_npc = {} +local l_doodad = {} +local l_tempMap = false +local MAX_RENDER_INTERVAL = X.ENVIRONMENT.GAME_FPS * 5 +local function FlushDB() + if X.IsEmpty(l_npc) and X.IsEmpty(l_doodad) then + return + end + X.SQLiteBeginTransaction(DB) + + for i, p in pairs(l_npc) do + if not p.temp then + X.SQLitePrepareExecute( + DBN_W, + p.templateid, + p.poskey, + p.mapid, + p.x, + p.y, + p.z, + AnsiToUTF8(p.name), + AnsiToUTF8(p.title), + p.level, + '' + ) + end + end + l_npc = {} + + for i, p in pairs(l_doodad) do + if not p.temp then + X.SQLitePrepareExecute( + DBD_W, + p.templateid, + p.poskey, + p.mapid, + p.x, + p.y, + p.z, + AnsiToUTF8(p.name), + '' + ) + end + end + l_doodad = {} + + X.SQLiteEndTransaction(DB) +end +local function onLoadingEnding() + l_tempMap = X.IsInCompetitionMap() or false + if l_tempMap then + local dwMapID = X.GetClientPlayer().GetMapID() + X.SQLitePrepareExecute(DBN_DM, dwMapID) + X.SQLitePrepareExecute(DBD_DM, dwMapID) + end + FlushDB() +end +X.RegisterEvent('LOADING_ENDING', 'MY_MiddleMapMark', onLoadingEnding) + +local function Flush() + FlushDB() +end +X.RegisterFlush('MY_MiddleMapMark_Save', Flush) + +local function OnExit() + DB:Release() +end +X.RegisterExit('MY_MiddleMapMark_Save', OnExit) + +local function Rerender() + D.Search(true) +end + +local function AutomaticRerender() + if X.IsRestricted('MY_MiddleMapMark') or not O.bMiddleMapSearch then + return + end + if GetTime() - l_renderTime > MAX_RENDER_INTERVAL then + Rerender() + elseif not X.DelayCall('MY_MiddleMapMark_Refresh') then + X.DelayCall('MY_MiddleMapMark_Refresh', MAX_RENDER_INTERVAL, Rerender) + end +end + +local NpcTpl = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_MiddleMapMark/data/npc/{$lang}.jx3dat') +local DoodadTpl = X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_MiddleMapMark/data/doodad/{$lang}.jx3dat') +local function OnNpcEnterScene() + if l_tempMap and X.IsRestricted('MY_MiddleMapMark.MapRestriction') then + return + end + local npc = X.GetNpc(arg0) + local player = X.GetClientPlayer() + if not (npc and player) then + return + end + -- avoid special npc + if NpcTpl[npc.dwTemplateID] then + return + end + -- avoid player's pets + if npc.dwEmployer and npc.dwEmployer ~= 0 then + return + end + -- avoid full number named npc + local szName = X.GetNpcName(npc.dwID, { eShowID = 'never' }) + if not szName or X.TrimString(szName) == '' then + return + end + -- switch map + local dwMapID = player.GetMapID() + local dwPosKey = GeneNpcInfoPosKey(dwMapID, npc.nX, npc.nY) + + -- add rec + l_npc[npc.dwTemplateID .. ',' .. dwPosKey] = { + decoded = true, + temp = l_tempMap, + x = npc.nX, + y = npc.nY, + z = npc.nZ, + mapid = dwMapID, + level = npc.nLevel, + name = szName, + title = npc.szTitle, + poskey = dwPosKey, + templateid = npc.dwTemplateID, + } + -- redraw ui + AutomaticRerender() +end +X.RegisterEvent('NPC_ENTER_SCENE', 'MY_MIDDLEMAPMARK', OnNpcEnterScene) + +local REC_DOODAD_TYPES = { + [X.CONSTANT.DOODAD_KIND.INVALID ] = false, + [X.CONSTANT.DOODAD_KIND.NORMAL ] = true , -- 普通的Doodad,有Tip,不能操作 + [X.CONSTANT.DOODAD_KIND.CORPSE ] = false, -- 尸体 + [X.CONSTANT.DOODAD_KIND.QUEST ] = true , -- 任务相关的Doodad + [X.CONSTANT.DOODAD_KIND.READ ] = true , -- 可以看的Doodad + [X.CONSTANT.DOODAD_KIND.DIALOG ] = true , -- 可以对话的Doodad + [X.CONSTANT.DOODAD_KIND.ACCEPT_QUEST] = true , -- 可以接任务的Doodad,本质上上面3个类型是一样的,只是图标不同而已 + [X.CONSTANT.DOODAD_KIND.TREASURE ] = false, -- 宝箱 + [X.CONSTANT.DOODAD_KIND.ORNAMENT ] = false, -- 装饰物,不能操作 + [X.CONSTANT.DOODAD_KIND.CRAFT_TARGET] = true , -- 生活技能的采集物 + [X.CONSTANT.DOODAD_KIND.CLIENT_ONLY ] = false, -- 客户端用 + [X.CONSTANT.DOODAD_KIND.CHAIR ] = true , -- 可以坐的Doodad + [X.CONSTANT.DOODAD_KIND.GUIDE ] = false, -- 路标 + [X.CONSTANT.DOODAD_KIND.DOOR ] = false, -- 门之类有动态障碍的Doodad + [X.CONSTANT.DOODAD_KIND.NPCDROP ] = false, -- 使用NPC掉落模式的doodad + [X.CONSTANT.DOODAD_KIND.SPRINT ] = false, -- 轻功落脚点 +} +local function OnDoodadEnterScene() + if l_tempMap and X.IsRestricted('MY_MiddleMapMark.MapRestriction') then + return + end + local doodad = X.GetDoodad(arg0) + local player = X.GetClientPlayer() + if not (doodad and player) then + return + end + if not REC_DOODAD_TYPES[doodad.nKind] then + return + end + -- avoid special doodad + if DoodadTpl[doodad.dwTemplateID] then + return + end + -- avoid full number named doodad + local szName = X.GetDoodadName(doodad.dwID, { eShowID = 'never' }) + if not szName or X.TrimString(szName) == '' then + return + end + -- switch map + local dwMapID = player.GetMapID() + local dwPosKey = GeneDoodadInfoPosKey(dwMapID, doodad.nX, doodad.nY) + + -- add rec + l_doodad[doodad.dwTemplateID .. ',' .. dwPosKey] = { + decoded = true, + temp = l_tempMap, + x = doodad.nX, + y = doodad.nY, + z = doodad.nZ, + name = szName, + mapid = dwMapID, + poskey = dwPosKey, + templateid = doodad.dwTemplateID, + } + -- redraw ui + AutomaticRerender() +end +X.RegisterEvent('DOODAD_ENTER_SCENE', 'MY_MIDDLEMAPMARK', OnDoodadEnterScene) + +function D.SearchNpc(szText, dwMapID) + local aInfos + local szSearch = AnsiToUTF8('%' .. szText .. '%') + if dwMapID then + aInfos = X.SQLitePrepareGetAll( + DBN_RNM, + szSearch, + dwMapID, + szSearch, + dwMapID + ) + else + aInfos = X.SQLitePrepareGetAll( + DBN_RN, + szSearch, + szSearch + ) + end + for i = #aInfos, 1, -1 do + local p = aInfos[i] + if (not dwMapID or p.mapid == dwMapID) + and l_npc[p.templateid .. ',' .. p.poskey] then + table.remove(aInfos, i) + end + end + for _, info in pairs(l_npc) do + if (not dwMapID or info.mapid == dwMapID) + and (szText == '' or X.StringFindW(info.name, szText) or X.StringFindW(info.title, szText)) then + table.insert(aInfos, 1, info) + end + end + return aInfos +end + +function D.SearchDoodad(szText, dwMapID) + local aInfos + local szSearch = AnsiToUTF8('%' .. szText .. '%') + if dwMapID then + aInfos = X.SQLitePrepareGetAll(DBD_RNM, szSearch, dwMapID) + else + aInfos = X.SQLitePrepareGetAll(DBD_RN, szSearch) + end + for i = #aInfos, 1, -1 do + local p = aInfos[i] + if (not dwMapID or p.mapid == dwMapID) + and l_doodad[p.templateid .. ',' .. p.poskey] then + table.remove(aInfos, i) + end + end + for _, info in pairs(l_doodad) do + if (not dwMapID or info.mapid == dwMapID) + and (szText == '' or X.StringFindW(info.name, szText)) then + table.insert(aInfos, 1, info) + end + end + return aInfos +end + +--------------------------------------------------------------- +-- 中地图HOOK +--------------------------------------------------------------- +-- HOOK MAP SWITCH +function D.ShowMap() + D.Search(true) +end + +function D.UpdateCurrentMap() + D.Search(true) +end + +-- HOOK OnEditChanged +function D.OnEditChanged() + if this:GetName() == 'Edit_Search' then + X.DelayCall('MY_MiddleMapMark__EditChanged', 500, D.Search) + end +end + +-- HOOK OnMouseEnter +function D.OnMouseEnter() + if this:GetName() == 'Edit_Search' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip( + GetFormatText(_L['MY middle map mark'], nil, 255, 255, 0) + .. X.CONSTANT.XML_LINE_BREAKER + .. GetFormatText(_L['Type to search, use comma to split.'], nil, 255, 255, 192), + w, + {x - 10, y, w, h}, + X.UI.TIP_POSITION.TOP_BOTTOM + ) + end +end + +-- HOOK OnMouseLeave +function D.OnMouseLeave() + if this:GetName() == 'Edit_Search' then + HideTip() + end +end + +function D.HookEdit() + local edit = Station.Lookup('Topmost1/MiddleMap/Wnd_Tool/Edit_Search') + if edit then + HookTableFunc(edit, 'OnEditChanged', D.OnEditChanged, { bAfterOrigin = true }) + end + D.Search(true) +end +X.RegisterFrameCreate('MiddleMap', 'MY_MiddleMapMark', D.HookEdit) + +function D.Hook() + if X.IsRestricted('MY_MiddleMapMark') or not O.bMiddleMapSearch then + return + end + D.HookEdit() + HookTableFunc(MiddleMap, 'ShowMap', D.ShowMap, { bAfterOrigin = true }) + HookTableFunc(MiddleMap, 'UpdateCurrentMap', D.UpdateCurrentMap, { bAfterOrigin = true }) + HookTableFunc(MiddleMap, 'OnEditChanged', D.OnEditChanged, { bAfterOrigin = true }) + HookTableFunc(MiddleMap, 'OnMouseEnter', D.OnMouseEnter, { bAfterOrigin = true }) + HookTableFunc(MiddleMap, 'OnMouseLeave', D.OnMouseLeave, { bAfterOrigin = true }) +end +X.RegisterInit('MY_MiddleMapMark', D.Hook) + +function D.Unhook() + local h = Station.Lookup('Topmost1/MiddleMap', 'Handle_Inner/Handle_MY_MMM') + if h then + h:GetParent():RemoveItem(h) + end + UnhookTableFunc(MiddleMap, 'ShowMap', D.ShowMap) + UnhookTableFunc(MiddleMap, 'UpdateCurrentMap', D.UpdateCurrentMap) + UnhookTableFunc(MiddleMap, 'OnEditChanged', D.OnEditChanged) + UnhookTableFunc(MiddleMap, 'OnMouseEnter', D.OnMouseEnter) + UnhookTableFunc(MiddleMap, 'OnMouseLeave', D.OnMouseLeave) +end +X.RegisterReload('MY_MiddleMapMark', D.Unhook) + +X.RegisterEvent('MY_RESTRICTION', function() + if arg0 and arg0 ~= 'MY_MiddleMapMark' then + return + end + D.Unhook() + D.Hook() +end) + +function D.GetEditSearch() + return Station.Lookup('Topmost1/MiddleMap/Wnd_NormalMap/Wnd_Tool/Edit_Search') + or Station.Lookup('Topmost1/MiddleMap/Wnd_Tool/Edit_Search') +end + +-- start search +local MAX_DISPLAY_COUNT = 1000 +local function OnMMMItemMouseEnter() + local me = X.GetClientPlayer() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = (this.decoded and this.name or UTF8ToAnsi(this.name)) + .. (this.level and this.level > 0 and (' lv.' .. this.level) or '') + .. (this.title and this.title ~= '' and ('\n<' .. (this.decoded and this.title or UTF8ToAnsi(this.title)) .. '>') or '') + if this.type == 'Doodad' then + local dwRecipeID = me and X.GetDoodadBookRecipeID(this.templateid) + if dwRecipeID then + local dwBookID, dwSegmentID = X.RecipeToSegmentID(dwRecipeID) + if dwBookID and dwSegmentID then + if me.IsBookMemorized(dwBookID, dwSegmentID) then + szTip = szTip .. '\n' .. _L['[Read]'] + else + szTip = szTip .. '\n' .. _L['[Not read]'] + end + end + end + end + if IsCtrlKeyDown() then + if this.templateid then + szTip = szTip .. '\n' .. this.type .. ' Template ID: ' .. this.templateid + end + if this.x and this.y then + szTip = szTip .. '\n' .. 'Pos: ' .. this.x .. ', ' .. this.y + if this.z then + szTip = szTip .. ', ' .. this.z + end + end + end + OutputTip(GetFormatText(szTip, 136), 450, {x, y, w, h}, ALW.TOP_BOTTOM) +end +local function OnMMMItemMouseLeave() + HideTip() +end +function D.Search(bForce) + local frame = Station.Lookup('Topmost1/MiddleMap') + local player = X.GetClientPlayer() + if not player or not frame or not frame:IsVisible() then + return + end + local edit = D.GetEditSearch() + if not edit then + return + end + local szKeyword = edit:GetText() + local dwMapID = MiddleMap.dwMapID or player.GetMapID() + local nMapIndex = MiddleMap.nIndex + if not bForce and l_dwMapID == dwMapID and l_nMapIndex == nMapIndex and l_szKeyword == szKeyword then + return + end + l_renderTime = GetTime() + l_dwMapID, l_nMapIndex, l_szKeyword = dwMapID, nMapIndex, szKeyword + + local hInner = frame:Lookup('', 'Handle_Inner') + or frame:Lookup('', 'Handle_Border/Handle_Map/Handle_Inner') + local nW, nH = hInner:GetSize() + local hMMM = hInner:Lookup('Handle_MY_MMM') + if not hMMM then + hInner:AppendItemFromString('firstpostype=0 name="Handle_MY_MMM" w=' .. nW .. ' h=' .. nH .. '') + hMMM = hInner:Lookup('Handle_MY_MMM') + hInner:FormatAllItemPos() + end + local nCount = 0 + local nItemCount = hMMM:GetItemCount() + + local infos + local aKeywords = {} + do + local i = 1 + for _, szSearch in ipairs(X.SplitString(szKeyword, ',')) do + szSearch = X.TrimString(szSearch) + if szSearch ~= '' then + aKeywords[i] = szSearch + i = i + 1 + end + end + end + local nX, nY, item + + for i, szSearch in ipairs(aKeywords) do + infos = D.SearchNpc(szSearch, dwMapID) + for _, info in ipairs(infos) do + if nCount < MAX_DISPLAY_COUNT then + nX, nY = MiddleMap.LPosToHPos(info.x, info.y, 13, 13) + if nX > 0 and nY > 0 and nX < nW and nY < nH then + nCount = nCount + 1 + if nCount > nItemCount then + hMMM:AppendItemFromString('w=13 h=13 path="ui/Image/Minimap/MapMark.UITex" frame=95 eventid=784') + nItemCount = nItemCount + 1 + end + item = hMMM:Lookup(nCount - 1) + item:Show() + item:SetRelPos(nX, nY) + item.decoded = info.decoded + item.type = 'Npc' + item.name = info.name + item.x = info.x + item.y = info.y + item.z = info.z + item.title = info.title + item.level = info.level + item.templateid = info.templateid + item.OnItemMouseEnter = OnMMMItemMouseEnter + item.OnItemMouseLeave = OnMMMItemMouseLeave + end + end + end + end + + for i, szSearch in ipairs(aKeywords) do + infos = D.SearchDoodad(szSearch, dwMapID) + for _, info in ipairs(infos) do + if nCount < MAX_DISPLAY_COUNT then + nX, nY = MiddleMap.LPosToHPos(info.x, info.y, 13, 13) + if nX > 0 and nY > 0 and nX < nW and nY < nH then + nCount = nCount + 1 + if nCount > nItemCount then + hMMM:AppendItemFromString('w=13 h=13 path="ui/Image/Minimap/MapMark.UITex" frame=95 eventid=784') + nItemCount = nItemCount + 1 + end + item = hMMM:Lookup(nCount - 1) + item:Show() + item:SetRelPos(nX, nY) + item.decoded = info.decoded + item.type = 'Doodad' + item.name = info.name + item.x = info.x + item.y = info.y + item.z = info.z + item.title = info.title + item.level = info.level + item.templateid = info.templateid + item.OnItemMouseEnter = OnMMMItemMouseEnter + item.OnItemMouseLeave = OnMMMItemMouseLeave + end + end + end + end + + for i = nCount, nItemCount - 1 do + hMMM:Lookup(i):Hide() + end + hMMM:FormatAllItemPos() +end + +--------------------------------------------------------------- +-- 主面板搜索 +--------------------------------------------------------------- +local PS = { nPriority = 4.1, szRestriction = 'MY_MiddleMapMark' } +function PS.OnPanelActive(wnd) + D.Migration() + + local ui = X.UI(wnd) + local nX, nY = 0, 0 + local nW, nH = ui:Size() + + local list, muProgress + local function UpdateList(szText) + if X.IsEmpty(szText) then + list:ListBox('clear') + for i, s in ipairs(_L['MY_MiddleMapMark TIPS']) do + list:ListBox('insert', { id = 'TIP' .. i, text = s, r = 255, g = 255, b = 0 }) + end + else + local nMaxDisp = 500 + local nDisp = 0 + local nCount = 0 + local tNames = {} + local infos, szName, szTitle + list:ListBox('clear') + + infos = D.SearchNpc(szText) + nCount = nCount + #infos + for _, info in ipairs(infos) do + szName = info.decoded and info.name or UTF8ToAnsi(info.name) + szTitle = info.decoded and info.title or UTF8ToAnsi(info.title) + if not tNames[info.mapid .. szName] then + list:ListBox('insert', { + text = '[' .. Table_GetMapName(info.mapid) .. '] ' .. szName + .. ((szTitle and #szTitle > 0 and '<' .. szTitle .. '>') or ''), + data = { szName = szName, dwMapID = info.mapid }, + }) + nDisp = nDisp + 1 + if nDisp >= nMaxDisp then + return + end + tNames[info.mapid .. szName] = true + end + end + + infos = D.SearchDoodad(szText) + nCount = nCount + #infos + for _, info in ipairs(infos) do + szName = info.decoded and info.name or UTF8ToAnsi(info.name) + if not tNames[info.mapid .. szName] then + list:ListBox('insert', { + text = '[' .. Table_GetMapName(info.mapid) .. '] ' .. szName, + data = { szName = szName, dwMapID = info.mapid }, + }) + nDisp = nDisp + 1 + if nDisp >= nMaxDisp then + return + end + tNames[info.mapid .. szName] = true + end + end + end + end + + ui:Append('WndEditBox', { + name = 'WndEdit_Search', + x = nX, y = nY, + w = nW - 25, h = 25, + onChange = function(szText) + UpdateList(szText) + end, + }) + ui:Append('WndButton', { + name = 'WndButton_Settings', + x = nX + nW - 25, y = nY, w = 25, h = 25, + buttonStyle = 'OPTION', + menu = function() + return { + { + szOption = _L['Show search in middle map panel'], + bCheck = true, bChecked = O.bMiddleMapSearch, + fnAction = function() + O.bMiddleMapSearch = not O.bMiddleMapSearch + D.Unhook() + D.Hook() + end, + }, + { + szOption = _L['Clear current map data'], + fnAction = function() + local dwMapID = X.GetClientPlayer().GetMapID() + X.Confirm(_L('Current map (%s) npc and doodad record will be deleted, are you sure?', X.GetMapName(dwMapID) or dwMapID), function() + X.SQLitePrepareExecute(DBN_DM, dwMapID) + X.SQLitePrepareExecute(DBD_DM, dwMapID) + Rerender() + end) + end, + }, + } + end, + }) + nY = nY + 25 + + muProgress = ui:Append('Image', { + name = 'Image_Progress', + x = nX, y = nY, + w = nW, h = 4, + image = 'ui/Image/UICommon/RaidTotal.UITex|45', + }) + nY = nY + 4 + + list = ui:Append('WndListBox', { + name = 'WndListBox_1', + x = nX, y = nY, + w = nW, h = nH - nY, + listBox = { + { + 'onhover', + function(id, text, data) + if X.IsString(id) and id:sub(1, 3) == 'TIP' then + return false + end + end, + }, + { + 'onlclick', + function(id, text, data, selected) + if X.IsString(id) and id:sub(1, 3) == 'TIP' then + return false + end + OpenMiddleMap(data.dwMapID, 0) + X.UI(D.GetEditSearch()):Text(X.EscapeString(data.szName)) + Station.SetFocusWindow('Topmost1/MiddleMap') + if not selected then -- avoid unselect + return false + end + end, + }, + }, + }) + + UpdateList('') +end + +function PS.OnPanelResize(wnd) + local ui = X.UI(wnd) + local nX, nY = ui:Pos() + local nW, nH = ui:Size() + + ui:Children('#WndEdit_Search'):Width(nW - 25) + ui:Children('#WndButton_Settings'):Left(nX + nW - 25) + ui:Children('#Image_Progress'):Width(nW) + ui:Children('#WndListBox_1'):Size(nW, nH - ui:Children('#Image_Progress'):Top() - 4) +end + +X.Panel.Register(_L['General'], 'MY_MiddleMapMark', _L['MY_MiddleMapMark'], 'ui/Image/MiddleMap/MapWindow2.UITex|4', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Recount/info.ini b/MY_Recount/info.ini new file mode 100644 index 000000000..ab7adfbd8 --- /dev/null +++ b/MY_Recount/info.ini @@ -0,0 +1,11 @@ +[MY_Recount] +name=伤害统计 +desc=记录战斗信息方便日后分析总结 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Recount_DS.lua +lua_1=src\MY_Recount.lua +lua_2=src\MY_Recount_UI.lua +lua_3=src\MY_Recount_DT.lua +package=MY diff --git a/MY_Recount/info.ini.zh_TW b/MY_Recount/info.ini.zh_TW new file mode 100644 index 000000000..2475f960b --- /dev/null +++ b/MY_Recount/info.ini.zh_TW @@ -0,0 +1,11 @@ +[MY_Recount] +name=鍌峰绲辫▓ +desc=瑷橀寗鎴伴淇℃伅鏂逛究鏃ュ緦鍒嗘瀽绺界祼 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_Recount_DS.lua +lua_1=src\MY_Recount.lua +lua_2=src\MY_Recount_UI.lua +lua_3=src\MY_Recount_DT.lua +package=MY diff --git a/MY_Recount/lang/zhcn.jx3dat b/MY_Recount/lang/zhcn.jx3dat new file mode 100644 index 000000000..69c40fd1f --- /dev/null +++ b/MY_Recount/lang/zhcn.jx3dat @@ -0,0 +1,61 @@ +return { + ['MY_Recount'] = '战斗统计', + + ['Enable recording'] = '记录战斗统计数据', + ['Enable UI'] = '显示战斗统计界面', + ['Current fight'] = '当前统计', + ['Fight recount'] = '战斗统计', + + ['Absorb statistics'] = '化解统计', + + ['Current recount display channel'] = '当前战斗统计显示类型', + ['Switch recount mode'] = '切换统计类型', + ['Filter short fight'] = '过滤短时战斗', + ['No time limit'] = '无时间限制', + ['Less than %d second'] = '不足%d秒', + ['Less than %d minute'] = '不足%d分钟', + ['Less than %d minute and a half'] = '不足%d分半', + + ['Redraw interval'] = '数值刷新周期', + ['Realtime refresh'] = '实时刷新', + ['Every %.1f second'] = '每隔%.1f秒', + + ['Display only npc record'] = '只显示NPC记录', + ['Display only player record'] = '只显示玩家记录', + ['Display all record'] = '显示所有记录', + + ['Load history file'] = '加载自定义历史文件', + ['Please select recount history file.'] = '请选择您要加载的历史战斗统计文件。', + + ['Save history on exit'] = '退出游戏时保存数据', + ['Save history immediately'] = '脱离战斗时保存数据', + + ['Display as per second' ] = '显示每秒平均数值', + ['Display effective value' ] = '显示战斗有效数值', + ['Uncount awaytime' ] = '除去玩家暂离时间', + ['Show nodata teammate' ] = '显示无数据的队友', + ['Use system time count' ] = '使用官方时间算法', + ['Group npc with same name' ] = '合并同名NPC数据', + ['Group effect with same name' ] = '合并同名技能效果', + ['Hide anonymous effect' ] = '隐藏没名字的记录', + ['Show zero value effect' ] = '显示零数值的记录', + ['Simplify value' ] = '精简显示数值记录', + ['Theme' ] = '自定界面风格选择', + ['Max history' ] = '最大历史记录设置', + + ['Publish limit'] = '发布数量', + ['Top %d'] = '前%d名', + ['Publish mode'] = '发布模式', + ['Only effect value'] = '仅发布有效值', + ['Only total value'] = '仅发布总数值', + ['Effect and total value'] = '发布有效和总数值', + + ['%7d%s(Effect) %7d%s(Total)'] = '%7d%s(有效) %7d%s(总)', + ['%7d%s(Effect)'] = '%7d%s(有效)', + ['%7d%s(Total)'] = '%7d%s(总)', + + ['Total: '] = '总:', + ['effect: '] = '有效:', + + ['Away count: %d, away time: %ds'] = '暂离次数:%d次 暂离时间:%d秒', +} diff --git a/MY_Recount/lang/zhtw.jx3dat b/MY_Recount/lang/zhtw.jx3dat new file mode 100644 index 000000000..e28531dd9 --- /dev/null +++ b/MY_Recount/lang/zhtw.jx3dat @@ -0,0 +1,61 @@ +return { + ['MY_Recount'] = '鎴伴绲辫▓', + + ['Enable recording'] = '瑷橀寗鎴伴绲辫▓鏁告摎', + ['Enable UI'] = '椤ず鎴伴绲辫▓鐣岄潰', + ['Current fight'] = '鐣跺墠绲辫▓', + ['Fight recount'] = '鎴伴绲辫▓', + + ['Absorb statistics'] = '鍖栬В绲辫▓', + + ['Current recount display channel'] = '鐣跺墠鎴伴绲辫▓椤ず椤炲瀷', + ['Switch recount mode'] = '鍒囨彌绲辫▓椤炲瀷', + ['Filter short fight'] = '閬庢烤鐭檪鎴伴', + ['No time limit'] = '鐒℃檪闁撻檺鍒', + ['Less than %d second'] = '涓嶈冻%d绉', + ['Less than %d minute'] = '涓嶈冻%d鍒嗛悩', + ['Less than %d minute and a half'] = '涓嶈冻%d鍒嗗崐', + + ['Redraw interval'] = '鏁稿煎埛鏂板懆鏈', + ['Realtime refresh'] = '瀵︽檪鍒锋柊', + ['Every %.1f second'] = '姣忛殧%.1f绉', + + ['Display only npc record'] = '鍙’绀篘PC瑷橀寗', + ['Display only player record'] = '鍙’绀虹帺瀹惰閷', + ['Display all record'] = '椤ず鎵鏈夎閷', + + ['Load history file'] = '杓夊叆鑷畾缇╂鍙叉枃浠', + ['Please select recount history file.'] = '璜嬮伕鎿囨偍瑕佽級鍏ョ殑姝峰彶鎴伴绲辫▓鏂囦欢銆', + + ['Save history on exit'] = '閫鍑烘父鎴叉檪淇濆瓨鏁告摎', + ['Save history immediately'] = '鑴洟鎴伴鏅備繚瀛樻暩鎿', + + ['Display as per second' ] = '椤ず姣忕骞冲潎鏁稿', + ['Display effective value' ] = '椤ず鎴伴鏈夋晥鏁稿', + ['Uncount awaytime' ] = '闄ゅ幓鐜╁鏆洟鏅傞枔', + ['Show nodata teammate' ] = '椤ず鐒℃暩鎿氱殑闅婂弸', + ['Use system time count' ] = '浣跨敤瀹樻柟鏅傞枔婕旂畻娉', + ['Group npc with same name' ] = '鍚堜降鍚屽悕NPC鏁告摎', + ['Group effect with same name' ] = '鍚堜降鍚屽悕鎶鑳芥晥鏋', + ['Hide anonymous effect' ] = '闅辫棌娌掑悕瀛楃殑瑷橀寗', + ['Show zero value effect' ] = '椤ず闆舵暩鍊肩殑瑷橀寗', + ['Simplify value' ] = '绮剧啊椤ず鏁稿艰閷', + ['Theme' ] = '鑷畾鐣岄潰棰ㄦ牸閬告搰', + ['Max history' ] = '鏈澶ф鍙茶閷勮ō缃', + + ['Publish limit'] = '鐧间綀鏁搁噺', + ['Top %d'] = '鍓%d鍚', + ['Publish mode'] = '鐧间綀妯″紡', + ['Only effect value'] = '鍍呯櫦浣堟湁鏁堝', + ['Only total value'] = '鍍呯櫦浣堢附鏁稿', + ['Effect and total value'] = '鐧间綀鏈夋晥鍜岀附鏁稿', + + ['%7d%s(Effect) %7d%s(Total)'] = '%7d%s(鏈夋晥) %7d%s(绺)', + ['%7d%s(Effect)'] = '%7d%s(鏈夋晥)', + ['%7d%s(Total)'] = '%7d%s(绺)', + + ['Total: '] = '绺斤細', + ['effect: '] = '鏈夋晥锛', + + ['Away count: %d, away time: %ds'] = '鏆洟娆℃暩锛%d娆°鏆洟鏅傞枔锛%d绉', +} diff --git a/MY_Recount/src/MY_Recount.lua b/MY_Recount/src/MY_Recount.lua new file mode 100644 index 000000000..eb64fa3a9 --- /dev/null +++ b/MY_Recount/src/MY_Recount.lua @@ -0,0 +1,666 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Recount/MY_Recount' +local PLUGIN_NAME = 'MY_Recount' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Recount' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local DK = MY_Recount_DS.DK +local DK_REC_STAT = MY_Recount_DS.DK_REC_STAT +local DK_REC_STAT_SKILL = MY_Recount_DS.DK_REC_STAT_SKILL +local DK_REC_STAT_TARGET = MY_Recount_DS.DK_REC_STAT_TARGET +local SKILL_RESULT = MY_Recount_DS.SKILL_RESULT +local SKILL_RESULT_NAME = MY_Recount_DS.SKILL_RESULT_NAME + +local MAX_HISTORY_DISP = 200 + +local STAT_TYPE = { -- 统计类型 + DPS = 1, -- 输出统计 + HPS = 2, -- 治疗统计 + BDPS = 3, -- 承伤统计 + BHPS = 4, -- 承疗统计 + APS = 5, -- 化解统计 +} +local STAT_TYPE_LIST = { + 'DPS' , -- 输出统计 + 'HPS' , -- 治疗统计 + 'BDPS', -- 承伤统计 + 'BHPS', -- 承疗统计 + 'APS' , -- 化解统计 +} +local STAT_TYPE_KEY = { -- 统计类型数组名 + [STAT_TYPE.DPS ] = DK.DAMAGE, + [STAT_TYPE.HPS ] = DK.HEAL, + [STAT_TYPE.BDPS] = DK.BE_DAMAGE, + [STAT_TYPE.BHPS] = DK.BE_HEAL, + [STAT_TYPE.APS ] = DK.ABSORB, +} +local STAT_TYPE_NAME = { + [STAT_TYPE.DPS ] = g_tStrings.STR_DAMAGE_STATISTIC , -- 伤害统计 + [STAT_TYPE.HPS ] = g_tStrings.STR_THERAPY_STATISTIC , -- 治疗统计 + [STAT_TYPE.BDPS] = g_tStrings.STR_BE_DAMAGE_STATISTIC , -- 承伤统计 + [STAT_TYPE.BHPS] = g_tStrings.STR_BE_THERAPY_STATISTIC, -- 承疗统计 + [STAT_TYPE.APS ] = _L['Absorb statistics'] , -- 化解统计 +} +local STAT_TYPE_UNIT = { + [STAT_TYPE.DPS ] = 'DPS', + [STAT_TYPE.HPS ] = 'HPS', + [STAT_TYPE.BDPS] = 'DPS', + [STAT_TYPE.BHPS] = 'HPS', + [STAT_TYPE.APS ] = 'APS', +} +local IMPORTANT_EFFECT = { + [SKILL_EFFECT_TYPE.SKILL .. ',371,1'] = true, -- 镇山河 + [SKILL_EFFECT_TYPE.SKILL .. ',15054,1'] = true, -- 梅花三弄 +} +local PUBLISH_MODE = { + EFFECT = 1, -- 只显示有效值 + TOTAL = 2, -- 只显示总数值 + BOTH = 3, -- 同时显示有效和总数 +} + +local O = X.CreateUserSettingsModule('MY_Recount', _L['Raid'], { + nPublishMode = { -- 发布模式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Publish mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = PUBLISH_MODE.EFFECT, + }, +}) +local D = {} + +local DataDisplay + +function D.GetTargetShowName(szName, bPlayer) + if bPlayer and MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + szName = MY_ChatMosaics.MosaicsString(szName) + end + return szName +end + +function D.GetTargetShowValue(nValue) + if MY_Recount_UI.bSimplifyValue then + return X.FormatNumberDot(nValue, 1, false, 100000) + end + return nValue +end + +function D.IsImportantEffect(v) + if not v then + return false + end + if X.IsTable(v) then + for k, v in pairs(v) do + if IMPORTANT_EFFECT[k] or IMPORTANT_EFFECT[v] then + return true + end + end + return false + end + if IMPORTANT_EFFECT[v] then + return true + end +end + +function D.StatContainsImportantEffect(rec) + for szEffectID, p in ipairs(rec[DK_REC_STAT.SKILL]) do + if IMPORTANT_EFFECT[szEffectID] and p[DK_REC_STAT_SKILL.NZ_COUNT] > 0 then + return true + end + end + return false +end + +function D.StatSkillContainsImportantEffect(szEffectID, p) + return D.IsImportantEffect(szEffectID) + or D.IsImportantEffect(p.tEffectID) +end + +function D.StatTargetContainsImportantEffect(rec) + for szEffectID, p in pairs(rec[DK_REC_STAT_TARGET.SKILL]) do + if MY_Recount.IsImportantEffect(szEffectID) + or MY_Recount.IsImportantEffect(p.tEffectID) then + return true + end + end + return false +end + +-- 设置当前显示记录 +-- D.SetDisplayData(string szFilePath): 显示指定文件的历史记录 传'CURRENT'时显示当前记录 +-- D.SetDisplayData(table data): 显示数据为data的历史记录 +function D.SetDisplayData(szFilePath) + local data = X.IsTable(szFilePath) + and szFilePath + or MY_Recount_DS.Get(szFilePath) + if not X.IsTable(data) then + return + end + D.bHistoryMode = szFilePath ~= 'CURRENT' + DataDisplay = data + FireUIEvent('MY_RECOUNT_DISP_DATA_UPDATE') +end + +-- 获取当前显示记录 +function D.GetDisplayData() + return DataDisplay, D.bHistoryMode +end + +-- 获取设置菜单 +function D.GetMenu() + local function IsUIDisabled() + return not MY_Recount_DS.bEnable or not MY_Recount_UI.bEnable + end + local t = { + szOption = _L['Fight recount'], + { + szOption = _L['Enable recording'], + bCheck = true, + bChecked = MY_Recount_DS.bEnable, + fnAction = function() + MY_Recount_DS.bEnable = not MY_Recount_DS.bEnable + end, + }, + { + szOption = _L['Enable UI'], + bCheck = true, + bChecked = MY_Recount_UI.bEnable, + fnAction = function() + MY_Recount_UI.bEnable = not MY_Recount_UI.bEnable + end, + fnDisable = function() return not MY_Recount_DS.bEnable end, + }, + { + szOption = _L['Display as per second'], + bCheck = true, + bChecked = MY_Recount_UI.bShowPerSec, + fnAction = function() + MY_Recount_UI.bShowPerSec = not MY_Recount_UI.bShowPerSec + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Display effective value'], + bCheck = true, + bChecked = MY_Recount_UI.bShowEffect, + fnAction = function() + MY_Recount_UI.bShowEffect = not MY_Recount_UI.bShowEffect + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Uncount awaytime'], + bCheck = true, + bChecked = MY_Recount_UI.bAwayMode, + fnAction = function() + MY_Recount_UI.bAwayMode = not MY_Recount_UI.bAwayMode + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Show nodata teammate'], + bCheck = true, + bChecked = MY_Recount_UI.bShowNodataTeammate, + fnAction = function() + MY_Recount_UI.bShowNodataTeammate = not MY_Recount_UI.bShowNodataTeammate + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Use system time count'], + bCheck = true, + bChecked = MY_Recount_UI.bSysTimeMode, + fnAction = function() + MY_Recount_UI.bSysTimeMode = not MY_Recount_UI.bSysTimeMode + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Group npc with same name'], + bCheck = true, + bChecked = MY_Recount_UI.bGroupSameNpc, + fnAction = function() + MY_Recount_UI.bGroupSameNpc = not MY_Recount_UI.bGroupSameNpc + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Group effect with same name'], + bCheck = true, + bChecked = MY_Recount_UI.bGroupSameEffect, + fnAction = function() + MY_Recount_UI.bGroupSameEffect = not MY_Recount_UI.bGroupSameEffect + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Hide anonymous effect'], + bCheck = true, + bChecked = MY_Recount_UI.bHideAnonymous, + fnAction = function() + MY_Recount_UI.bHideAnonymous = not MY_Recount_UI.bHideAnonymous + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Show zero value effect'], + bCheck = true, + bChecked = MY_Recount_UI.bShowZeroVal, + fnAction = function() + MY_Recount_UI.bShowZeroVal = not MY_Recount_UI.bShowZeroVal + end, + fnDisable = IsUIDisabled, + }, + { + szOption = _L['Simplify value'], + bCheck = true, + bChecked = MY_Recount_UI.bSimplifyValue, + fnAction = function() + MY_Recount_UI.bSimplifyValue = not MY_Recount_UI.bSimplifyValue + end, + fnDisable = IsUIDisabled, + }, + } + + if MY_CombatLogs and MY_CombatLogs.GetOptionsMenu then + table.insert(t, MY_CombatLogs.GetOptionsMenu()) + end + + table.insert(t, { -- 切换统计类型 + szOption = _L['Switch recount mode'], + fnDisable = IsUIDisabled, + { + szOption = _L['Display only npc record'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount_UI.nDisplayMode == MY_Recount_UI.DISPLAY_MODE.NPC, + fnAction = function() + MY_Recount_UI.nDisplayMode = MY_Recount_UI.DISPLAY_MODE.NPC + end, + }, + { + szOption = _L['Display only player record'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount_UI.nDisplayMode == MY_Recount_UI.DISPLAY_MODE.PLAYER, + fnAction = function() + MY_Recount_UI.nDisplayMode = MY_Recount_UI.DISPLAY_MODE.PLAYER + end, + }, + { + szOption = _L['Display all record'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount_UI.nDisplayMode == MY_Recount_UI.DISPLAY_MODE.BOTH, + fnAction = function() + MY_Recount_UI.nDisplayMode = MY_Recount_UI.DISPLAY_MODE.BOTH + end, + } + }) + + -- 过滤短时间记录 + local t1 = { + szOption = _L['Filter short fight'], + fnDisable = function() return not MY_Recount_DS.bEnable end, + } + for _, i in pairs({ -1, 10, 15, 20, 25, 30, 45, 60, 90, 120, 180 }) do + local szOption + if i < 0 then + szOption = _L['No time limit'] + elseif i < 60 then + szOption = _L('Less than %d second', i) + elseif i == 90 then + szOption = _L('Less than %d minute and a half', i / 60) + else + szOption = _L('Less than %d minute', i / 60) + end + table.insert(t1, { + szOption = szOption, + bCheck = true, bMCheck = true, + bChecked = MY_Recount_DS.nMinFightTime == i, + fnAction = function() + MY_Recount_DS.nMinFightTime = i + end, + fnDisable = function() return not MY_Recount_DS.bEnable end, + }) + end + table.insert(t, t1) + + -- 风格选择 + local t1 = { + szOption = _L['Theme'], + fnDisable = IsUIDisabled, + } + for i, _ in ipairs(MY_Recount_UI.FORCE_BAR_CSS) do + local t2 = { + szOption = i, + bCheck = true, bMCheck = true, + bChecked = MY_Recount_UI.nCss == i, + fnAction = function() + MY_Recount_UI.nCss = i + end, + fnDisable = IsUIDisabled, + } + table.insert(t1, t2) + end + table.insert(t, t1) + + -- 数值刷新周期 + local t1 = { + szOption = _L['Redraw interval'], + fnDisable = IsUIDisabled, + } + for _, i in ipairs({1, X.ENVIRONMENT.GAME_FPS / 2, X.ENVIRONMENT.GAME_FPS, X.ENVIRONMENT.GAME_FPS * 2}) do + local szOption + if i == 1 then + szOption = _L['Realtime refresh'] + else + szOption = _L('Every %.1f second', i / X.ENVIRONMENT.GAME_FPS) + end + table.insert(t1, { + szOption = szOption, + bCheck = true, bMCheck = true, + bChecked = MY_Recount_UI.nDrawInterval == i, + fnAction = function() + MY_Recount_UI.nDrawInterval = i + end, + fnDisable = IsUIDisabled, + }) + end + table.insert(t, t1) + + -- 最大历史记录 + local t1 = { + szOption = _L['Max history'], + nMaxHeight = 500, + fnDisable = function() return not MY_Recount_DS.bEnable end, + } + for _, i in ipairs({ 5, 10, 20, 30, 50, 100, 200, 500, 1000 }) do + table.insert(t1, { + szOption = i, + bCheck = true, bMCheck = true, + bChecked = MY_Recount_DS.nMaxHistory == i, + fnAction = function() + MY_Recount_DS.nMaxHistory = i + end, + fnDisable = function() return not MY_Recount_DS.bEnable end, + }) + end + table.insert(t, t1) + + return t +end + +-- 获取历史记录菜单 +function D.GetHistoryMenu() + local t = {{ + szOption = _L['Current fight'], + rgb = (MY_Recount_DS.Get('CURRENT') == DataDisplay and {255, 255, 0}) or nil, + fnAction = function() + D.SetDisplayData('CURRENT') + X.UI.ClosePopupMenu() + end, + }} + + local tt, nCount = { bInline = true, nMaxHeight = 456 }, 0 + for _, file in ipairs(MY_Recount_DS.GetHistoryFiles()) do + if nCount >= MAX_HISTORY_DISP then + break + end + local t1 = { + szOption = file.bossname .. ' (' .. X.FormatDuration(file.during, 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) .. ')', + rgb = (file.time == DataDisplay[DK.TIME_BEGIN] and {255, 255, 0}) or nil, + fnAction = function() + local data = MY_Recount_DS.Get(file.fullpath) + D.SetDisplayData(data) + X.UI.ClosePopupMenu() + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + MY_Recount_DS.Del(file.fullpath) + X.UI.ClosePopupMenu() + end, + fnMouseEnter = function() + local aXml = {} + table.insert(aXml, GetFormatText(file.bossname .. '(' .. X.FormatDuration(file.during, 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) .. ')\n', nil, 255, 255, 255)) + table.insert(aXml, GetFormatText(X.FormatTime(file.time, '%yyyy/%MM/%dd %hh:%mm:%ss\n'), nil, 255, 255, 255)) + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(table.concat(aXml), 600, {nX, nY, nW, nH}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + } + table.insert(tt, t1) + nCount = nCount + 1 + end + table.insert(t, tt) + + table.insert(t, { + szOption = _L['Load history file'], + fnAction = function() + local szRoot = MY_Recount_DS.GetHistoryRoot() + local szFilePath = GetOpenFileName(_L['Please select recount history file.'], 'Recount File(*.fstt.jx3dat)\0*.fstt.jx3dat\0\0', szRoot) + if not X.IsEmpty(szFilePath) then + local data = MY_Recount_DS.Get(szFilePath) + D.SetDisplayData(data) + X.UI.ClosePopupMenu() + end + end, + }) + + table.insert(t, { bDevide = true }) + table.insert(t, { + szOption = _L['Save history on exit'], + bCheck = true, bChecked = MY_Recount_DS.bSaveHistoryOnExit, + fnAction = function() + MY_Recount_DS.bSaveHistoryOnExit = not MY_Recount_DS.bSaveHistoryOnExit + end, + }) + table.insert(t, { + szOption = _L['Save history immediately'], + bCheck = true, + bChecked = MY_Recount_DS.bSaveHistoryOnExFi, + fnAction = function() + MY_Recount_DS.bSaveHistoryOnExFi = not MY_Recount_DS.bSaveHistoryOnExFi + end, + }) + + return t +end + +-- 获取发布菜单 +function D.GetPublishMenu() + local t = {} + + -- 发布类型 + table.insert(t, { + szOption = _L['Publish mode'], + { + szOption = _L['Only effect value'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount.nPublishMode == PUBLISH_MODE.EFFECT, + fnAction = function() + MY_Recount.nPublishMode = PUBLISH_MODE.EFFECT + end, + }, { + szOption = _L['Only total value'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount.nPublishMode == PUBLISH_MODE.TOTAL, + fnAction = function() + MY_Recount.nPublishMode = PUBLISH_MODE.TOTAL + end, + }, { + szOption = _L['Effect and total value'], + bCheck = true, bMCheck = true, + bChecked = MY_Recount.nPublishMode == PUBLISH_MODE.BOTH, + fnAction = function() + MY_Recount.nPublishMode = PUBLISH_MODE.BOTH + end, + } + }) + + local function Publish(nChannel, nLimit) + local frame = Station.Lookup('Normal/MY_Recount_UI') + if not frame then + return + end + local DataDisplay = MY_Recount.GetDisplayData() + local eTimeChannel = MY_Recount_UI.bSysTimeMode and STAT_TYPE_KEY[MY_Recount_UI.nChannel] + X.SendChat( + nChannel, + '[' .. X.PACKET_INFO.SHORT_NAME .. ']' + .. _L['Fight recount'] .. ' - ' + .. frame:Lookup('Wnd_Title', 'Text_Title'):GetText() + .. ' ' .. ((DataDisplay[DK.BOSSNAME] and ' - ' .. DataDisplay[DK.BOSSNAME]) or '') + .. '(' .. X.FormatDuration(MY_Recount_DS.GeneFightTime(DataDisplay, eTimeChannel), 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) .. ')', + { parsers = { name = false } } + ) + X.SendChat(nChannel, '------------------------') + local hList = frame:Lookup('Wnd_Main', 'Handle_List') + local szUnit = (' ' .. hList.szUnit) or '' + local nTimeCount = hList.nTimeCount or 0 + local aResult = {} -- 收集数据 + local nMaxNameLen = 0 + for i = 0, math.min(hList:GetItemCount(), nLimit) - 1 do + local hItem = hList:Lookup(i) + table.insert(aResult, hItem.data) + nMaxNameLen = math.max(nMaxNameLen, X.StringLenW(hItem.data.szName)) + end + if not MY_Recount_UI.bShowPerSec then + nTimeCount = 1 + szUnit = '' + end + -- 发布数据 + for i, p in ipairs(aResult) do + local szText = string.format('%02d', i) .. '.[' .. p.szName .. ']' + for i = X.StringLenW(p.szName), nMaxNameLen - 1 do + szText = szText .. g_tStrings.STR_ONE_CHINESE_SPACE + end + if MY_Recount.nPublishMode == PUBLISH_MODE.BOTH then + szText = szText .. _L('%7d%s(Effect) %7d%s(Total)', + p.nEffectValue / nTimeCount, szUnit, + p.nValue / nTimeCount, szUnit + ) + elseif MY_Recount.nPublishMode == PUBLISH_MODE.EFFECT then + szText = szText .. _L('%7d%s(Effect)', + p.nEffectValue / nTimeCount, szUnit + ) + elseif MY_Recount.nPublishMode == PUBLISH_MODE.TOTAL then + szText = szText .. _L('%7d%s(Total)', + p.nValue / nTimeCount, szUnit + ) + end + + X.SendChat(nChannel, szText) + end + + X.SendChat(nChannel, '------------------------') + end + for nChannel, szChannel in pairs({ + [PLAYER_TALK_CHANNEL.RAID] = 'MSG_TEAM', + [PLAYER_TALK_CHANNEL.TEAM] = 'MSG_PARTY', + [PLAYER_TALK_CHANNEL.TONG] = 'MSG_GUILD', + }) do + local t1 = { + szOption = g_tStrings.tChannelName[szChannel], + bCheck = true, -- 不设置成可选框不能点╭∩╮(︶︿︶)╭∩╮垃圾 + fnAction = function() + Publish(nChannel, math.huge) + X.UI.ClosePopupMenu() + end, + rgb = GetMsgFontColor(szChannel, true), + } + for _, nLimit in ipairs({1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 50, 100}) do + table.insert(t1, { + szOption = _L('Top %d', nLimit), + fnAction = function() Publish(nChannel, nLimit) end, + }) + end + table.insert(t, t1) + end + + return t +end + +X.RegisterAddonMenu('MY_RECOUNT_MENU', D.GetMenu) + +-- 新的战斗数据时 +X.RegisterEvent('MY_RECOUNT_NEW_FIGHT', function() + if not D.bHistoryMode then + D.SetDisplayData('CURRENT') + end +end) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Recount', + exports = { + { + fields = { + STAT_TYPE = STAT_TYPE, + STAT_TYPE_LIST = STAT_TYPE_LIST, + STAT_TYPE_KEY = STAT_TYPE_KEY, + STAT_TYPE_NAME = STAT_TYPE_NAME, + STAT_TYPE_UNIT = STAT_TYPE_UNIT, + PUBLISH_MODE = PUBLISH_MODE, + SKILL_RESULT = SKILL_RESULT, + SKILL_RESULT_NAME = SKILL_RESULT_NAME, + 'SetDisplayData', + 'GetDisplayData', + 'GetMenu', + 'GetHistoryMenu', + 'GetPublishMenu', + 'GetTargetShowName', + 'GetTargetShowValue', + 'IsImportantEffect', + 'StatContainsImportantEffect', + 'StatSkillContainsImportantEffect', + 'StatTargetContainsImportantEffect', + }, + root = D, + }, + { + fields = { + 'nPublishMode', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'nPublishMode', + }, + root = O, + }, + }, +} +MY_Recount = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Recount/src/MY_Recount_DS.lua b/MY_Recount/src/MY_Recount_DS.lua new file mode 100644 index 000000000..f30fb7204 --- /dev/null +++ b/MY_Recount/src/MY_Recount_DS.lua @@ -0,0 +1,2147 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗统计 数据源 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Recount/MY_Recount_DS' +local PLUGIN_NAME = 'MY_Recount' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Recount' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local DEBUG = false + +local DK = { + UUID = DEBUG and 'UUID' or 1, -- 战斗唯一标识 + BOSSNAME = DEBUG and 'szBossName' or 2, -- 日志名字 + VERSION = DEBUG and 'nVersion' or 3, -- 数据版本号 + TIME_BEGIN = DEBUG and 'nTimeBegin' or 4, -- 战斗开始时间 + TICK_BEGIN = DEBUG and 'nTickBegin' or 5, -- 战斗开始毫秒时间 + TIME_DURING = DEBUG and 'nTimeDuring' or 6, -- 战斗持续时间 + TICK_DURING = DEBUG and 'nTickDuring' or 7, -- 战斗持续毫秒时间 + AWAYTIME = DEBUG and 'Awaytime' or 8, -- 死亡/掉线时间节点 + NAME_LIST = DEBUG and 'Namelist' or 9, -- 名称缓存 + FORCE_LIST = DEBUG and 'Forcelist' or 10, -- 势力缓存 + EFFECT_LIST = DEBUG and 'Effectlist' or 11, -- 效果信息缓存 + DAMAGE = DEBUG and 'Damage' or 12, -- 输出统计 + HEAL = DEBUG and 'Heal' or 13, -- 治疗统计 + BE_HEAL = DEBUG and 'BeHeal' or 14, -- 承疗统计 + BE_DAMAGE = DEBUG and 'BeDamage' or 15, -- 承伤统计 + ABSORB = DEBUG and 'Absorb' or 17, -- 化解统计 + PLAYER_LIST = DEBUG and 'Playerlist' or 18, -- 玩家信息缓存 + SERVER = DEBUG and 'Server' or 19, -- 所在服务器 + MAP = DEBUG and 'Map' or 20, -- 所在地图 + BASE_NAME_LIST = DEBUG and 'BaseNamelist' or 21, -- 短名称缓存 +} + +local DK_REC = { + TIME_DURING = DEBUG and 'nTimeDuring' or 1, + TOTAL = DEBUG and 'nTotal' or 2, + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 3, + STAT = DEBUG and 'Statistics' or 4, +} + +local DK_REC_STAT = { + TOTAL = DEBUG and 'nTotal' or 1, + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 2, + DETAIL = DEBUG and 'Detail' or 3, + SKILL = DEBUG and 'Skill' or 4, + TARGET = DEBUG and 'Target' or 5, +} + +local DK_REC_STAT_DETAIL = { + COUNT = DEBUG and 'nCount' or 1, -- 命中记录数量(假设nSkillResult是命中) + NZ_COUNT = DEBUG and 'nNzCount' or 2, -- 非零值命中记录数量 + MAX = DEBUG and 'nMax' or 3, -- 单次命中最大值 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 4, -- 单次命中最大有效值 + MIN = DEBUG and 'nMin' or 5, -- 单次命中最小值 + NZ_MIN = DEBUG and 'nNzMin' or 6, -- 单次非零值命中最小值 + MIN_EFFECT = DEBUG and 'nMinEffect' or 7, -- 单次命中最小有效值 + NZ_MIN_EFFECT = DEBUG and 'nNzMinEffect' or 8, -- 单次非零值命中最小有效值 + TOTAL = DEBUG and 'nTotal' or 9, -- 所有命中总伤害 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 10, -- 所有命中总有效伤害 + AVG = DEBUG and 'nAvg' or 11, -- 所有命中平均伤害 + NZ_AVG = DEBUG and 'nNzAvg' or 12, -- 所有非零值命中平均伤害 + AVG_EFFECT = DEBUG and 'nAvgEffect' or 13, -- 所有命中平均有效伤害 + NZ_AVG_EFFECT = DEBUG and 'nNzAvgEffect' or 14, -- 所有非零值命中平均有效伤害 +} + +local DK_REC_STAT_SKILL = { + COUNT = DEBUG and 'nCount' or 1, -- 该玩家四象轮回释放次数(假设szEffectName是四象轮回) + NZ_COUNT = DEBUG and 'nNzCount' or 2, -- 该玩家非零值四象轮回释放次数 + MAX = DEBUG and 'nMax' or 3, -- 该玩家四象轮回最大输出量 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 4, -- 该玩家四象轮回最大有效输出量 + TOTAL = DEBUG and 'nTotal' or 5, -- 该玩家四象轮回输出量总和 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 6, -- 该玩家四象轮回有效输出量总和 + AVG = DEBUG and 'nAvg' or 7, -- 该玩家所有四象轮回平均伤害 + NZ_AVG = DEBUG and 'nNzAvg' or 8, -- 该玩家所有非零值四象轮回平均伤害 + AVG_EFFECT = DEBUG and 'nAvgEffect' or 9, -- 该玩家所有四象轮回平均有效伤害 + NZ_AVG_EFFECT = DEBUG and 'nNzAvgEffect' or 10, -- 该玩家所有非零值四象轮回平均有效伤害 + DETAIL = DEBUG and 'Detail' or 11, -- 该玩家四象轮回输出结果分类统计 + TARGET = DEBUG and 'Target' or 12, -- 该玩家四象轮回承受者统计 +} + +local DK_REC_STAT_SKILL_DETAIL = { + COUNT = DEBUG and 'nCount' or 1, -- 命中记录数量 + NZ_COUNT = DEBUG and 'nNzCount' or 2, -- 非零值命中记录数量 + MAX = DEBUG and 'nMax' or 3, -- 单次命中最大值 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 4, -- 单次命中最大有效值 + MIN = DEBUG and 'nMin' or 5, -- 单次命中最小值 + NZ_MIN = DEBUG and 'nNzMin' or 6, -- 单次非零值命中最小值 + MIN_EFFECT = DEBUG and 'nMinEffect' or 7, -- 单次命中最小有效值 + NZ_MIN_EFFECT = DEBUG and 'nNzMinEffect' or 8, -- 单次非零值命中最小有效值 + TOTAL = DEBUG and 'nTotal' or 9, -- 所以命中总伤害 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 10, -- 所有命中总有效伤害 + AVG = DEBUG and 'nAvg' or 11, -- 所有命中平均伤害 + NZ_AVG = DEBUG and 'nNzAvg' or 12, -- 所有非零值命中平均伤害 + AVG_EFFECT = DEBUG and 'nAvgEffect' or 13, -- 所有命中平均有效伤害 + NZ_AVG_EFFECT = DEBUG and 'nNzAvgEffect' or 14, -- 所有非零值命中平均有效伤害 +} + +local DK_REC_STAT_SKILL_TARGET = { + MAX = DEBUG and 'nMax' or 1, -- 该玩家四象轮回击中的这个玩家最大伤害 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 2, -- 该玩家四象轮回击中的这个玩家最大有效伤害 + TOTAL = DEBUG and 'nTotal' or 3, -- 该玩家四象轮回击中的这个玩家伤害总和 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 4, -- 该玩家四象轮回击中的这个玩家有效伤害总和 + COUNT = DEBUG and 'Count' or 5, -- 该玩家四象轮回击中的这个玩家结果统计 + NZ_COUNT = DEBUG and 'NzCount' or 6, -- 该玩家非零值四象轮回击中的这个玩家结果统计 +} + +local DK_REC_STAT_TARGET = { + COUNT = DEBUG and 'nCount' or 1, -- 该玩家对idTarget的技能释放次数 + NZ_COUNT = DEBUG and 'nNzCount' or 2, -- 该玩家对idTarget的非零值技能释放次数 + MAX = DEBUG and 'nMax' or 3, -- 该玩家对idTarget的技能最大输出量 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 4, -- 该玩家对idTarget的技能最大有效输出量 + TOTAL = DEBUG and 'nTotal' or 5, -- 该玩家对idTarget的技能输出量总和 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 6, -- 该玩家对idTarget的技能有效输出量总和 + AVG = DEBUG and 'nAvg' or 7, -- 该玩家对idTarget的技能平均输出量 + NZ_AVG = DEBUG and 'nNzAvg' or 8, -- 该玩家对idTarget的非零值技能平均输出量 + AVG_EFFECT = DEBUG and 'nAvgEffect' or 9, -- 该玩家对idTarget的技能平均有效输出量 + NZ_AVG_EFFECT = DEBUG and 'nNzAvgEffect' or 10, -- 该玩家对idTarget的非零值技能平均有效输出量 + DETAIL = DEBUG and 'Detail' or 11, -- 该玩家对idTarget的技能输出结果分类统计 + SKILL = DEBUG and 'Skill' or 12, -- 该玩家对idTarget的技能具体分别统计 +} + +local DK_REC_STAT_TARGET_DETAIL = { + COUNT = DEBUG and 'nCount' or 1, -- 命中记录数量(假设nSkillResult是命中) + NZ_COUNT = DEBUG and 'nNzCount' or 2, -- 非零值命中记录数量 + MAX = DEBUG and 'nMax' or 3, -- 单次命中最大值 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 4, -- 单次命中最大有效值 + MIN = DEBUG and 'nMin' or 5, -- 单次命中最小值 + NZ_MIN = DEBUG and 'nNzMin' or 6, -- 单次非零值命中最小值 + MIN_EFFECT = DEBUG and 'nMinEffect' or 7, -- 单次命中最小有效值 + NZ_MIN_EFFECT = DEBUG and 'nNzMinEffect' or 8, -- 单次非零值命中最小有效值 + TOTAL = DEBUG and 'nTotal' or 9, -- 所以命中总伤害 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 10, -- 所有命中总有效伤害 + AVG = DEBUG and 'nAvg' or 11, -- 所有命中平均伤害 + NZ_AVG = DEBUG and 'nNzAvg' or 12, -- 所有非零值命中平均伤害 + AVG_EFFECT = DEBUG and 'nAvgEffect' or 13, -- 所有命中平均有效伤害 + NZ_AVG_EFFECT = DEBUG and 'nNzAvgEffect' or 14, -- 所有非零值命中平均有效伤害 +} + +local DK_REC_STAT_TARGET_SKILL = { + MAX = DEBUG and 'nMax' or 1, -- 该玩家击中这个玩家的四象轮回最大伤害 + MAX_EFFECT = DEBUG and 'nMaxEffect' or 2, -- 该玩家击中这个玩家的四象轮回最大有效伤害 + TOTAL = DEBUG and 'nTotal' or 3, -- 该玩家击中这个玩家的四象轮回伤害总和 + TOTAL_EFFECT = DEBUG and 'nTotalEffect' or 4, -- 该玩家击中这个玩家的四象轮回有效伤害总和 + COUNT = DEBUG and 'Count' or 5, -- 该玩家击中这个玩家的四象轮回结果统计 + NZ_COUNT = DEBUG and 'NzCount' or 6, -- 该玩家非零值击中这个玩家的四象轮回结果统计 +} +--[[ +[SKILL_RESULT_TYPE]枚举: +SKILL_RESULT_TYPE.PHYSICS_DAMAGE = 0 -- 外功伤害 +SKILL_RESULT_TYPE.SOLAR_MAGIC_DAMAGE = 1 -- 阳性内功伤害 +SKILL_RESULT_TYPE.NEUTRAL_MAGIC_DAMAGE = 2 -- 混元性内功伤害 +SKILL_RESULT_TYPE.LUNAR_MAGIC_DAMAGE = 3 -- 阴性内功伤害 +SKILL_RESULT_TYPE.POISON_DAMAGE = 4 -- 毒性伤害 +SKILL_RESULT_TYPE.REFLECTIED_DAMAGE = 5 -- 反弹伤害 +SKILL_RESULT_TYPE.THERAPY = 6 -- 治疗 +SKILL_RESULT_TYPE.STEAL_LIFE = 7 -- 生命偷取(获得了点气血。) +SKILL_RESULT_TYPE.ABSORB_THERAPY = 8 -- 化解治疗 +SKILL_RESULT_TYPE.ABSORB_DAMAGE = 9 -- 化解伤害 +SKILL_RESULT_TYPE.SHIELD_DAMAGE = 10 -- 无效伤害 +SKILL_RESULT_TYPE.PARRY_DAMAGE = 11 -- 拆招 +SKILL_RESULT_TYPE.INSIGHT_DAMAGE = 12 -- 识破 +SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE = 13 -- 有效伤害 +SKILL_RESULT_TYPE.EFFECTIVE_THERAPY = 14 -- 有效治疗 +SKILL_RESULT_TYPE.TRANSFER_LIFE = 15 -- 吸取生命 +SKILL_RESULT_TYPE.TRANSFER_MANA = 16 -- 吸取内力 + +-- Data、DataDisplay、HISTORY_CACHE[szFilePath].Data 数据结构 +Data = { + [DK.UUID] = 战斗统一标示符, + [DK.VERSION] = 数据版本号, + [DK.TIME_BEGIN] = 战斗开始UNIX时间戳, + [DK.TIME_DURING] = 战斗持续秒数, + [DK.AWAYTIME] = { + 玩家的dwID = { + { 暂离开始时间, 暂离结束时间 }, ... + }, ... + }, + [DK.DAMAGE] = { -- 输出统计 + [DK_REC.TIME_DURING] = 最后一次记录时离开始的秒数, + [DK_REC.TOTAL] = 全队的输出量, + [DK_REC.TOTAL_EFFECT] = 全队的有效输出量, + [DK_REC.STAT] = { + 玩家的dwID = { -- 该对象的输出统计 + [DK_REC_STAT.TOTAL ] = 2314214, -- 总输出 + [DK_REC_STAT.TOTAL_EFFECT] = 132144 , -- 有效输出 + [DK_REC_STAT.DETAIL ] = { -- 输出结果分类统计 + SKILL_RESULT.HIT = { + nCount = 10 , -- 命中记录数量 + nMax = 34210 , -- 单次命中最大值 + nMaxEffect = 29817 , -- 单次命中最大有效值 + nMin = 8790 , -- 单次命中最小值 + nMinEffect = 7657 , -- 单次命中最小有效值 + nAvg = 27818 , -- 单次命中平均值 + nAvgEffect = 27818 , -- 单次命中平均有效值 + nTotal = 278560, -- 所以命中总伤害 + nTotalEffect = 224750, -- 所有命中总有效伤害 + }, + SKILL_RESULT.MISS = { ... }, + SKILL_RESULT.CRITICAL = { ... }, + }, + [DK_REC_STAT.SKILL] = { -- 该玩家具体造成输出的技能统计 + 四象轮回 = { -- 该玩家四象轮回造成的输出统计 + nCount = 2 , -- 该玩家四象轮回输出次数 + nMax = 13415 , -- 该玩家四象轮回最大输出量 + nMaxEffect = 9080 , -- 该玩家四象轮回最大有效输出量 + nTotal = 23213 , -- 该玩家四象轮回输出量总和 + nTotalEffect = 321421, -- 该玩家四象轮回有效输出量总和 + Detail = { -- 该玩家四象轮回输出结果分类统计 + SKILL_RESULT.HIT = { + nCount = 10 , -- 该玩家四象轮回命中记录数量 + nMax = 34210 , -- 该玩家四象轮回单次命中最大值 + nMaxEffect = 29817 , -- 该玩家四象轮回单次命中最大有效值 + nMin = 8790 , -- 该玩家四象轮回单次命中最小值 + nMinEffect = 7657 , -- 该玩家四象轮回单次命中最小有效值 + nAvg = 27818 , -- 该玩家四象轮回单次命中平均值 + nAvgEffect = 27818 , -- 该玩家四象轮回单次命中平均有效值 + nTotal = 278560, -- 该玩家四象轮回所有命中总伤害 + nTotalEffect = 224750, -- 该玩家四象轮回所有命中总有效伤害 + }, + SKILL_RESULT.MISS = { ... }, + SKILL_RESULT.CRITICAL = { ... }, + }, + Target = { -- 该玩家四象轮回承受者统计 + 玩家dwID = { -- 该玩家四象轮回击中的这个玩家数据统计 + nMax = 13415 , -- 该玩家四象轮回击中的这个玩家最大伤害 + nMaxEffect = 9080 , -- 该玩家四象轮回击中的这个玩家最大有效伤害 + nTotal = 23213 , -- 该玩家四象轮回击中的这个玩家伤害总和 + nTotalEffect = 321421, -- 该玩家四象轮回击中的这个玩家有效伤害总和 + Count = { -- 该玩家四象轮回击中的这个玩家结果统计 + SKILL_RESULT.HIT = 5, + SKILL_RESULT.MISS = 3, + SKILL_RESULT.CRITICAL = 3, + }, + }, + Npc名字 = { ... }, + ... + }, + }, + 两仪化形 = { ... }, + ... + }, + Target = { -- 该玩家具体造成输出的对象统计 + 玩家dwID = { -- 该玩家对该dwID的玩家造成的输出统计 + nCount = 2 , -- 该玩家对该dwID的玩家输出次数 + nMax = 13415 , -- 该玩家对该dwID的玩家单次最大输出量 + nMaxEffect = 9080 , -- 该玩家对该dwID的玩家单次最大有效输出量 + nTotal = 23213 , -- 该玩家对该dwID的玩家输出量总和 + nTotalEffect = 321421, -- 该玩家对该dwID的玩家有效输出量总和 + Detail = { -- 该玩家对该dwID的玩家输出结果分类统计 + SKILL_RESULT.HIT = { + nCount = 10 , -- 该玩家对该dwID的玩家命中记录数量 + nMax = 34210 , -- 该玩家对该dwID的玩家单次命中最大值 + nMaxEffect = 29817 , -- 该玩家对该dwID的玩家单次命中最大有效值 + nMin = 8790 , -- 该玩家对该dwID的玩家单次命中最小值 + nMinEffect = 7657 , -- 该玩家对该dwID的玩家单次命中最小有效值 + nAvg = 27818 , -- 该玩家对该dwID的玩家单次命中平均值 + nAvgEffect = 27818 , -- 该玩家对该dwID的玩家单次命中平均有效值 + nTotal = 278560, -- 该玩家对该dwID的玩家所有命中总伤害 + nTotalEffect = 224750, -- 该玩家对该dwID的玩家所有命中总有效伤害 + }, + SKILL_RESULT.MISS = { ... }, + SKILL_RESULT.CRITICAL = { ... }, + }, + Skill = { -- 该玩家四象轮回承受者统计 + 四象轮回 = { -- 该玩家四象轮回击中的这个玩家数据统计 + nMax = 13415 , -- 该玩家四象轮回击中的这个玩家最大伤害 + nMaxEffect = 9080 , -- 该玩家四象轮回击中的这个玩家最大有效伤害 + nTotal = 23213 , -- 该玩家四象轮回击中的这个玩家伤害总和 + nTotalEffect = 321421, -- 该玩家四象轮回击中的这个玩家有效伤害总和 + Count = { -- 该玩家四象轮回击中的这个玩家结果统计 + SKILL_RESULT.HIT = 5, + SKILL_RESULT.MISS = 3, + SKILL_RESULT.CRITICAL = 3, + }, + }, + 两仪化形 = { ... }, + ... + }, + }, + }, + }, + NPC的名字 = { ... }, + }, + }, + [DK.HEAL] = { ... }, + [DK.BE_HEAL] = { ... }, + [DK.BE_DAMAGE] = { ... }, +} +]] +local SKILL_RESULT = { + HIT = 0, -- 命中 + BLOCK = 1, -- 格挡 + SHIELD = 2, -- 无效 + MISS = 3, -- 偏离 + DODGE = 4, -- 闪避 + CRITICAL = 5, -- 会心 + INSIGHT = 6, -- 识破 + ABSORB = 7, -- 化解 +} +local NZ_SKILL_RESULT = { + [SKILL_RESULT.BLOCK ] = true, + [SKILL_RESULT.SHIELD] = true, + [SKILL_RESULT.MISS ] = true, + [SKILL_RESULT.DODGE ] = true, +} +local SKILL_RESULT_NAME = { + [SKILL_RESULT.HIT ] = g_tStrings.STR_HIT_NAME , + [SKILL_RESULT.BLOCK ] = g_tStrings.STR_IMMUNITY_NAME, + [SKILL_RESULT.SHIELD ] = g_tStrings.STR_SHIELD_NAME , + [SKILL_RESULT.MISS ] = g_tStrings.STR_MSG_MISS , + [SKILL_RESULT.DODGE ] = g_tStrings.STR_MSG_DODGE , + [SKILL_RESULT.CRITICAL] = g_tStrings.STR_CS_NAME , + [SKILL_RESULT.INSIGHT ] = g_tStrings.STR_MSG_INSIGHT , + [SKILL_RESULT.ABSORB ] = g_tStrings.STR_MSG_ABSORB , +} +local ABSORB_BUFF = { + [134 ] = 9999, -- 坐忘无我_紫霞 + [1754 ] = 9999, -- 藏剑_西子情_泉凝月_月凝 + [4244 ] = 9999, -- 明教_渡厄力_吸收盾 + [4400 ] = 9999, -- 明教_圣明佑_生命转吸收盾 + [4719 ] = 9999, -- 明教_渡厄力_体质转伤害吸收 + [5135 ] = 9999, -- 气纯特殊武器_群体蛋壳 + [5735 ] = 9999, -- 藏剑_泉凝月 + [6223 ] = 9999, -- 五毒_奇穴_治疗吸收盾 + [6224 ] = 9999, -- 五毒_奇穴_格挡伤害 + [8253 ] = 9999, -- 盾压_雄峦伤害吸收盾 + [8279 ] = 9999, -- 盾壁 + [8291 ] = 9999, -- 盾护伤害吸收盾 + [8292 ] = 9999, -- 盾壁加强版 + [8515 ] = 9999, -- 蝶息_20%伤害吸收盾 + [9584 ] = 9999, -- 梅花三弄被动一次性5%伤害吸收盾 + [10266] = 9999, -- 长歌_梅花三弄 + [11187] = 9999, -- 苍云特殊武器_斗气加护 + [11530] = 9999, -- 峰值_变身加盾 + [15415] = 9999, -- 新附魔T衣服伤害吸收盾凌雪藏锋 + [15948] = 9999, -- 孤影伤害吸收盾 + [16441] = 9999, -- 少林特殊武器_佛化金身 + [16568] = 9999, -- 五毒新版特殊武器_无支祁护盾 + [16721] = 9999, -- 元旦活动_武器技能_护盾 + [16877] = 9999, -- 少林特殊武器_金刚护生 + [16882] = 9999, -- 少林特殊武器_心印加身中性吸收盾 + [16883] = 9999, -- 少林特殊武器_心印加身阴性吸收盾 + [16884] = 9999, -- 少林特殊武器_心印加身阳性吸收盾 + [16911] = 9999, -- 长歌特殊武器_梅花大盾 + [17015] = 9999, -- 月斜星楼护盾 + [17028] = 9999, -- 金戈秘籍护盾 + [17047] = 9999, -- 蟾蜍韧性盾 + [17094] = 9999, -- 物化天行吸收盾 + [9334 ] = 9998, -- 梅花三弄 +} +local AWAYTIME_TYPE = { + DEATH = 0, + OFFLINE = 1, + HALFWAY_JOINED = 2, + LEAVE_TEAM = 3, +} +local VERSION = 2 + +local D = {} +local O = X.CreateUserSettingsModule('MY_Recount', _L['Raid'], { + bEnable = { -- 数据记录总开关 防止官方SB技能BUFF脚本瞎几把写超高频太卡甩锅给界面逻辑 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Enable recording'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveHistoryOnExit = { -- 退出游戏时保存历史数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Save history on exit'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveHistoryOnExFi = { -- 脱离战斗时保存历史数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Save history immediately'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nMaxHistory = { -- 最大历史数据数量 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Max history'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 10, + }, + nMinFightTime = { -- 最小战斗时间 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Filter short fight'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 30, + }, +}) + +local function CreateRingBuffer(nCapacity) + local nActualCap = 2^math.ceil(math.log(nCapacity > 0 and nCapacity or 1, 2)) + + return { + data = {}, + nCapacity = nActualCap, + nStart = 1, + nCount = 0, + + push = function(self, value) + local nWriteIdx = (self.nStart + self.nCount - 1) % self.nCapacity + 1 + + self.data[nWriteIdx] = value + + if self.nCount < self.nCapacity then + self.nCount = self.nCount + 1 + else + self.nStart = (self.nStart % self.nCapacity) + 1 + end + end, + + forEach = function(self, callback) + if self.nCount <= 0 then + return + end + + local nCap = self.nCapacity + + for i = 0, self.nCount - 1 do + local nIdx = (self.nStart + i - 1) % nCap + 1 + callback(self.data[nIdx], i + 1) + end + end, + + size = function(self) + return self.nCount + end, + + clear = function(self) + self.nStart = 1 + self.nCount = 0 + end + } +end + + +local Data -- 当前战斗数据记录 +local HISTORY_CACHE = setmetatable({}, { __mode = 'v' }) -- 历史战斗记录缓存 { [szFile] = Data } +local UNSAVED_CACHE = {} -- 未保存的战斗记录缓存 { [szFile] = Data } +local DS_DATA_CONFIG = { passphrase = false } +local DS_ROOT = {'userdata/fight_stat/', X.PATH_TYPE.ROLE} +local SKILL_EFFECT_CACHE = CreateRingBuffer(25 * 1024) -- 最近的技能效果缓存 (进战时候将最近的数据压进来) +local BUFF_UPDATE_CACHE = CreateRingBuffer(25 * 1024) -- 最近的BUFF效果缓存 (进战时候将最近的数据压进来) +local ABSORB_CACHE = {} -- 目标盾来源与状态缓存表 +local LOG_REPLAY_FRAME = X.ENVIRONMENT.GAME_FPS * 1 -- 进战时候将多久的数据压进来(逻辑帧) +local SKILL_TYPE = X.CONSTANT.SKILL_TYPE + +-- 输出两个数里面小一点的那个 其中-1表示极大值 +local function Min(a, b) + if a == -1 then + return b + end + if b == -1 then + return a + end + return math.min(a, b) +end + +local AsyncSaveLuaData = _G.AsyncSaveLuaData or SaveLUAData + +-- ################################################################################################## +-- # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # +-- # # # # # # # # # # # # # # # # # +-- # # # # # # # # +-- # # # # # # # # # # # # # # # # # # +-- ################################################################################################## + +function D.GetHistoryRoot() + return X.FormatPath(DS_ROOT) +end + +-- 加载历史数据列表 +function D.GetHistoryFiles() + local aFiles = {} + local aFileName, tFileName = {}, {} + local szRoot = X.FormatPath(DS_ROOT) + for k, _ in pairs(HISTORY_CACHE) do + if X.StringFindW(k, szRoot) == 1 then + k = k:sub(#szRoot + 1) + if not tFileName[k] then + table.insert(aFileName, k) + tFileName[k] = true + end + end + end + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + for _, v in ipairs(CPath.GetFileList(szRoot)) do + if not tFileName[v] then + table.insert(aFileName, v) + tFileName[v] = true + end + end + end + for _, filename in ipairs(aFileName) do + local year, month, day, hour, minute, second, bossname, during = filename:match('^(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+)%-(%d+)%_(.-)_(%d+%.?%d*)%.fstt%.jx3dat') + if year then + year = tonumber(year) + month = tonumber(month) + day = tonumber(day) + hour = tonumber(hour) + minute = tonumber(minute) + second = tonumber(second) + during = tonumber(during) + table.insert(aFiles, { + year, month, day, hour, minute, second, + bossname = bossname, + during = during, + time = DateToTime( + year, + month, + day, + hour, + minute, + second + ), + filename = filename:sub(1, -13), + fullname = filename, + fullpath = szRoot .. filename, + }) + end + end + local function sortFile(a, b) + local n = math.max(#a, #b) + for i = 1, n do + if not a[i] then + return true + elseif not b[i] then + return false + elseif a[i] ~= b[i] then + return a[i] > b[i] + end + end + return false + end + table.sort(aFiles, sortFile) + return aFiles +end + +-- 限制历史数据数量 +function D.LimitHistoryFile() + local aFiles = D.GetHistoryFiles() + for i = O.nMaxHistory + 1, #aFiles do + CPath.DelFile(aFiles[i].fullpath) + HISTORY_CACHE[aFiles[i].fullpath] = nil + UNSAVED_CACHE[aFiles[i].fullpath] = nil + end +end + +-- 根据一个数据生成文件名 +function D.GetDataFileName(data) + return X.FormatTime(data[DK.TIME_BEGIN], '%yyyy-%MM-%dd-%hh-%mm-%ss') + .. '_' .. (data[DK.BOSSNAME] or g_tStrings.STR_NAME_UNKNOWN) + .. '_' .. math.ceil(data[DK.TIME_DURING]) + .. '.fstt.jx3dat' +end + +-- 保存缓存的历史数据 +function D.SaveHistory() + if X.ENVIRONMENT.RUNTIME_OPTIMIZE then + return + end + for szFilePath, data in pairs(UNSAVED_CACHE) do + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Recount_DS.SaveHistory: ' .. szFilePath, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + AsyncSaveLuaData(szFilePath, data) + end + D.LimitHistoryFile() + UNSAVED_CACHE = {} +end + +-- 过图清除当前战斗数据 +X.RegisterEvent({'LOADING_ENDING', 'RELOAD_UI_ADDON_END', 'BATTLE_FIELD_END', 'ARENA_END', 'MY_CLIENT_PLAYER_LEAVE_SCENE'}, function() + D.FlushData() + SKILL_EFFECT_CACHE:clear() + BUFF_UPDATE_CACHE:clear() + ABSORB_CACHE = {} + D.InitData() + FireUIEvent('MY_RECOUNT_NEW_FIGHT') +end) + +-- 退出战斗 保存数据 +X.RegisterEvent('MY_FIGHT_HINT', function() + if not Data or not D.bReady or not O.bEnable then + return + end + local bFighting, szUUID = arg0, arg1 + if bFighting and szUUID ~= Data[DK.UUID] then -- 进入新的战斗 + D.InitData() + D.ReplayRecentLog() + FireUIEvent('MY_RECOUNT_NEW_FIGHT') + else + D.Flush() + end +end) + +function D.GetPlayer(dwID) + local player, info + if dwID == X.GetClientPlayerID() then + player = X.GetClientPlayer() + info = { + dwKungfuID = UI_GetPlayerMountKungfuID(), + szName = player.szName, + } + else + player = X.GetPlayer(dwID) + info = not X.ENVIRONMENT.RUNTIME_OPTIMIZE and GetClientTeam().GetMemberInfo(dwID) + end + if info then + if player then + info.fCurrentLife64, info.fMaxLife64 = X.GetCharacterLife(player) + else + info.fCurrentLife64, info.fMaxLife64 = X.GetCharacterLife(info) + end + end + return player, info +end + +-- ################################################################################################## -- +-- # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # -- +-- ################################################################################################## -- +-- 获取统计数据 +-- (table) D.Get(szFilePath) -- 获取指定记录 +-- (string) szFilePath: 历史记录文件全路径 传'CURRENT'返回当前统计 +function D.Get(szFilePath) + if szFilePath == 'CURRENT' then + return Data + end + if not HISTORY_CACHE[szFilePath] then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Recount_DS.CacheMiss: ' .. szFilePath, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + HISTORY_CACHE[szFilePath] = X.LoadLUAData(szFilePath, DS_DATA_CONFIG) + end + return HISTORY_CACHE[szFilePath] +end + +-- 删除历史统计数据 +-- (void) D.Del(szFilePath) -- 删除指定文件的记录 +-- (string)szFilePath: 历史记录文件全路径 +-- (void) D.Del(data) -- 删除指定记录 +function D.Del(data) + if X.IsString(data) then + CPath.DelFile(data) + HISTORY_CACHE[data] = nil + UNSAVED_CACHE[data] = nil + else + for szFilePath, v in pairs(HISTORY_CACHE) do + if v.data == data then + HISTORY_CACHE[szFilePath] = nil + CPath.DelFile(szFilePath) + end + end + for szFilePath, v in pairs(UNSAVED_CACHE) do + if v.data == data then + UNSAVED_CACHE[szFilePath] = nil + end + end + end +end + +-- 计算暂离时间 +-- D.GeneAwayTime(data, dwID, szRecordType) +-- data: 数据 +-- dwID: 计算暂离的角色ID 为空则计算团队的暂离时间(目前永远为0) +-- szRecordType: 不同类型的数据在官方时间算法下计算结果可能不一样 +-- 枚举暂时有 DK.HEAL DK.DAMAGE DK.BE_DAMAGE DK.BE_HEAL DK.ABSORB 五种 +do local nFightTime, nAwayTime +function D.GeneAwayTime(data, dwID, szRecordType) + nFightTime = D.GeneFightTime(data, dwID, szRecordType) + if szRecordType and data[szRecordType] and data[szRecordType][DK_REC.TIME_DURING] then + nAwayTime = data[szRecordType][DK_REC.TIME_DURING] - nFightTime + else + nAwayTime = data[DK.TIME_DURING] - nFightTime + end + return math.max(nAwayTime, 0) +end +end + +-- 计算战斗时间 +-- D.GeneFightTime(data, dwID, szRecordType) +-- data: 数据 +-- szRecordType: 不同类型的数据在官方时间算法下计算结果可能不一样 +-- 枚举暂时有 DK.HEAL DK.DAMAGE DK.BE_DAMAGE DK.BE_HEAL DK.ABSORB 五种 +-- 为空则计算普通时间算法 +-- dwID: 计算战斗时间的角色ID 为空则计算团队的战斗时间 +do local nTimeDuring, nTimeBegin, nAwayBegin, nAwayEnd +function D.GeneFightTime(data, szRecordType, dwID) + nTimeDuring = data[DK.TIME_DURING] + nTimeBegin = data[DK.TIME_BEGIN] + if nTimeDuring < 0 then + nTimeDuring = math.floor(X.GetFightTime() / 1000) + nTimeDuring + 1 + end + if szRecordType and data[szRecordType] and data[szRecordType][DK_REC.TIME_DURING] then + nTimeDuring = data[szRecordType][DK_REC.TIME_DURING] + end + if dwID and data[DK.AWAYTIME] and data[DK.AWAYTIME][dwID] then + for _, rec in ipairs(data[DK.AWAYTIME][dwID]) do + nAwayBegin = math.max(rec[1], nTimeBegin) + nAwayEnd = rec[2] + if nAwayEnd then -- 完整的离开记录 + nTimeDuring = nTimeDuring - (nAwayEnd - nAwayBegin) + else -- 离开了至今没回来的记录 + nTimeDuring = nTimeDuring - (data[DK.TIME_BEGIN] + nTimeDuring - nAwayBegin) + break + end + end + end + return math.max(nTimeDuring, 0) +end +end + +-- ################################################################################################## -- +-- # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # -- +-- ################################################################################################## -- + +function D.GetTargetHandle(dwID) + if X.IsPlayer(dwID) then + return X.GetPlayer(dwID) + end + return X.GetNpc(dwID) +end + +-- 记录一次LOG +-- D.ProcessSkillEffect(dwCaster, dwTarget, nEffectType, dwID, dwLevel, nSkillResult, nResultCount, tResult) +-- (number) dwCaster : 释放者ID +-- (number) dwTarget : 承受者ID +-- (number) nEffectType : 造成效果的原因(SKILL_EFFECT_TYPE枚举 如SKILL,BUFF) +-- (number) dwID : 技能ID +-- (number) dwLevel : 技能等级 +-- (number) nSkillResult: 造成的效果结果(SKILL_RESULT枚举 如HIT,MISS) +-- (number) nResultCount: 造成效果的数值数量(tResult长度) +-- (table ) tResult : 所有效果数值集合 +do local KCaster, dwCasterEmployer, KTarget, dwTargetEmployer, me, szEffectID, nTherapy, nEffectTherapy, nDamage, nEffectDamage, szType +function D.ProcessSkillEffect(nLFC, nTime, nTick, dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult) + -- 获取释放对象 + KCaster, dwCasterEmployer = D.GetTargetHandle(dwCaster), nil + if KCaster and not X.IsPlayer(dwCaster) and KCaster.dwEmployer and KCaster.dwEmployer ~= 0 and not X.IsPartnerNpc(KCaster.dwTemplateID) then -- 宠物的数据算在主人统计中,侠客除外 + KCaster = D.GetTargetHandle(KCaster.dwEmployer) + end + if not KCaster then + return + end + if not X.IsPlayer(KCaster.dwID) and KCaster.dwEmployer and KCaster.dwEmployer ~= 0 then + dwCasterEmployer = KCaster.dwEmployer + end + dwCaster = KCaster.dwID + + -- 获取承受对象 + KTarget, dwTargetEmployer = D.GetTargetHandle(dwTarget), nil + if not KTarget then + return + end + if not X.IsPlayer(dwTarget) and KTarget.dwEmployer and KTarget.dwEmployer ~= 0 then + dwTargetEmployer = KTarget.dwEmployer + end + dwTarget = KTarget.dwID + + -- 过滤掉不是队友的以及不是首领的 + me = X.GetClientPlayer() + if dwCaster ~= me.dwID -- 释放者不是自己 + and dwCasterEmployer ~= me.dwID -- 释放者主人不是自己 + and dwTarget ~= me.dwID -- 承受者不是自己 + and dwTargetEmployer ~= me.dwID -- 承受者主人不是自己 + and not me.IsPlayerInMyParty(dwCaster) -- 释放者不是队友 + and not (dwCasterEmployer and me.IsPlayerInMyParty(dwCasterEmployer)) -- 释放者主人不是队友 + and not me.IsPlayerInMyParty(dwTarget) -- 承受者不是队友 + and not (dwTargetEmployer and me.IsPlayerInMyParty(dwTargetEmployer)) -- 承受者主人不是队友 + and not X.IsInArenaMap() -- 不在名剑大会 + and not X.IsInBattlefieldMap() -- 不在战场 + then -- 则忽视 + return + end + + -- 未进战则初始化统计数据(即默认当前帧所有的技能日志为进战技能) + if not X.GetFightUUID() and D.nLastAutoInitFrame ~= GetLogicFrameCount() then + D.nLastAutoInitFrame = GetLogicFrameCount() + D.InitData() + end + + -- 获取效果名称 + szEffectID = D.InitEffectData(Data, nEffectType, dwEffectID, dwEffectLevel) + nTherapy = tResult[SKILL_RESULT_TYPE.THERAPY] or 0 + nEffectTherapy = tResult[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] or 0 + nDamage = (tResult[SKILL_RESULT_TYPE.PHYSICS_DAMAGE ] or 0) + -- 外功伤害 + (tResult[SKILL_RESULT_TYPE.SOLAR_MAGIC_DAMAGE ] or 0) + -- 阳性内功伤害 + (tResult[SKILL_RESULT_TYPE.NEUTRAL_MAGIC_DAMAGE] or 0) + -- 混元性内功伤害 + (tResult[SKILL_RESULT_TYPE.LUNAR_MAGIC_DAMAGE ] or 0) + -- 阴性内功伤害 + (tResult[SKILL_RESULT_TYPE.POISON_DAMAGE ] or 0) + -- 毒性伤害 + (tResult[SKILL_RESULT_TYPE.REFLECTIED_DAMAGE ] or 0) -- 反弹伤害 + nEffectDamage = tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] or 0 + + if nSkillResult == SKILL_RESULT.HIT -- 击中 + or nSkillResult == SKILL_RESULT.CRITICAL -- 会心 + then + if nTherapy > 0 then -- 有治疗数据 + D.AddHealRecord(Data, dwCaster, dwTarget, szEffectID, nTherapy, nEffectTherapy, nSkillResult) + elseif nDamage > 0 then -- 有伤害数据 + D.AddDamageRecord(Data, dwCaster, dwTarget, szEffectID, nDamage, nEffectDamage, nSkillResult) + else -- 无伤害无治疗的效果 + szType = SKILL_TYPE[dwEffectID] and SKILL_TYPE[dwEffectID][dwEffectLevel] + if szType == 'HEAL' then -- 特判治疗技能 + D.AddHealRecord(Data, dwCaster, dwTarget, szEffectID, nTherapy, nEffectTherapy, nSkillResult) + else -- if szType == 'DAMAGE' then -- 特判输出技能 + D.AddDamageRecord(Data, dwCaster, dwTarget, szEffectID, nDamage, nEffectDamage, nSkillResult) + end + end + elseif nSkillResult == SKILL_RESULT.ABSORB then -- 盾治疗 + D.AddAbsorbRecord(Data, dwCaster, dwTarget, szEffectID, nTherapy, nSkillResult) + elseif nSkillResult == SKILL_RESULT.INSIGHT then -- 识破 + D.AddDamageRecord(Data, dwCaster, dwTarget, szEffectID, nDamage, nEffectDamage, SKILL_RESULT.INSIGHT) + elseif nSkillResult == SKILL_RESULT.BLOCK -- 格挡 + or nSkillResult == SKILL_RESULT.SHIELD -- 无效 + or nSkillResult == SKILL_RESULT.MISS -- 偏离 + or nSkillResult == SKILL_RESULT.DODGE -- 闪避 + then + D.AddDamageRecord(Data, dwCaster, dwTarget, szEffectID, 0, 0, nSkillResult) + end +end +end + +do local nLFC, nTime, nTick +function D.OnSkillEffect(dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult) + nLFC, nTime, nTick = GetLogicFrameCount(), GetCurrentTime(), GetTime() + SKILL_EFFECT_CACHE:push({nLFC, nTime, nTick, dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult}) + D.ProcessSkillEffect(nLFC, nTime, nTick, dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult) +end +end + +do local KCaster +function D.ProcessBuffUpdate(nLFC, nTime, nTick, dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel) + KCaster = D.GetTargetHandle(dwCaster) + if KCaster and not X.IsPlayer(dwCaster) and KCaster.dwEmployer and KCaster.dwEmployer ~= 0 and not X.IsPartnerNpc(KCaster.dwTemplateID) then -- 宠物的数据算在主人统计中,侠客除外 + dwCaster = KCaster.dwEmployer + end + D.InitEffectData(Data, SKILL_EFFECT_TYPE.BUFF, dwBuffID, dwBuffLevel) + D.InitObjectData(Data, dwCaster) + D.InitObjectData(Data, dwTarget) +end +end + +do local nLFC, nTime, nTick +function D.OnBuffUpdate(dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel) + if dwBuffID == 0 then + return + end + nLFC, nTime, nTick = GetLogicFrameCount(), GetCurrentTime(), GetTime() + BUFF_UPDATE_CACHE:push({nLFC, nTime, nTick, dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel}) + D.ProcessBuffUpdate(nLFC, nTime, nTick, dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel) +end +end + +do local nCurLFC, nLFC, nTime, nTick, dwCaster, dwTarget, + nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult, + dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel +function D.ReplayRecentLog() + nCurLFC = GetLogicFrameCount() + SKILL_EFFECT_CACHE:forEach(function(v) + nLFC, nTime, nTick, dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult = unpack(v) + if nCurLFC - nLFC <= LOG_REPLAY_FRAME then + D.ProcessSkillEffect(nLFC, nTime, nTick, dwCaster, dwTarget, nEffectType, dwEffectID, dwEffectLevel, nSkillResult, nResultCount, tResult) + end + end) + BUFF_UPDATE_CACHE:forEach(function(v) + nLFC, nTime, nTick, dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel = unpack(v) + if nCurLFC - nLFC <= LOG_REPLAY_FRAME then + D.ProcessBuffUpdate(nLFC, nTime, nTick, dwCaster, dwTarget, dwBuffID, dwBuffLevel, nStackNum, bDelete, nEndFrame, bCanCancel) + end + end) +end +end + +-- 通过ID计算名字 +function D.GetNameAusID(data, dwID) + if not data or not dwID then + return + end + return data[DK.NAME_LIST][dwID] or g_tStrings.STR_NAME_UNKNOWN +end + +-- 通过ID计算基础名字 +function D.GetBaseNameAusID(data, dwID) + if not data or not dwID then + return + end + return (data[DK.BASE_NAME_LIST] and data[DK.BASE_NAME_LIST][dwID]) + or data[DK.NAME_LIST][dwID] + or g_tStrings.STR_NAME_UNKNOWN +end + +-- 通过ID计算势力 +function D.GetForceAusID(data, dwID) + if not data or not dwID then + return + end + return data[DK.FORCE_LIST][dwID] or -1 +end + +-- 通过ID计算效果信息 +function D.GetEffectInfoAusID(data, szEffectID) + if not data or not szEffectID then + return + end + return unpack(data[DK.EFFECT_LIST][szEffectID] or X.CONSTANT.EMPTY_TABLE) +end + +-- 通过ID用途计算效果名 +do local info +function D.GetEffectNameAusID(data, szChannel, szEffectID) + if not data or not szChannel or not szEffectID then + return + end + info = data[DK.EFFECT_LIST][szEffectID] + if info and not X.IsEmpty(info[1]) then + if info[3] == SKILL_EFFECT_TYPE.BUFF then + if szChannel == DK.HEAL or szChannel == DK.BE_HEAL then + return info[1] .. '(HOT)' + end + if szChannel == DK.ABSORB then + return info[1] + end + return info[1] .. '(DOT)' + end + return info[1] + end +end +end + +-- 判断是否是友军 +do local dwID +function D.IsParty(id) + dwID = tonumber(id) + if dwID then + if dwID == X.GetClientPlayerID() then + return true + else + return IsParty(dwID, X.GetClientPlayerID()) + end + else + return false + end +end +end + +-- 将一条记录插入数组 +do local tInfo, tRecord, tResult, tSkillRecord, tSkillTargetData, tTargetRecord, tTargetSkillData +function D.InsertRecord(data, szRecordType, dwOwnerID, dwTargetID, szEffectID, nValue, nEffectValue, nSkillResult) + tInfo = data[szRecordType] + tRecord = tInfo[DK_REC.STAT][dwOwnerID] + if not szEffectID or szEffectID == '' then + return + end + ------------------------ + -- # 节: tInfo + ------------------------ + tInfo[DK_REC.TIME_DURING ] = GetCurrentTime() - data[DK.TIME_BEGIN] + tInfo[DK_REC.TOTAL ] = tInfo[DK_REC.TOTAL] + nValue + tInfo[DK_REC.TOTAL_EFFECT] = tInfo[DK_REC.TOTAL_EFFECT] + nEffectValue + ------------------------ + -- # 节: tRecord + ------------------------ + tRecord[DK_REC_STAT.TOTAL ] = tRecord[DK_REC_STAT.TOTAL] + nValue + tRecord[DK_REC_STAT.TOTAL_EFFECT] = tRecord[DK_REC_STAT.TOTAL_EFFECT] + nEffectValue + ------------------------ + -- # 节: tRecord.Detail + ------------------------ + -- 添加/更新结果分类统计 + if not tRecord[DK_REC_STAT.DETAIL][nSkillResult] then + tRecord[DK_REC_STAT.DETAIL][nSkillResult] = { + [DK_REC_STAT_DETAIL.COUNT ] = 0, -- 命中记录数量(假设nSkillResult是命中) + [DK_REC_STAT_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_DETAIL.TOTAL ] = 0, -- 所有命中总伤害 + [DK_REC_STAT_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + end + tResult = tRecord[DK_REC_STAT.DETAIL][nSkillResult] + tResult[DK_REC_STAT_DETAIL.COUNT ] = tResult[DK_REC_STAT_DETAIL.COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_DETAIL.MAX ] = math.max(tResult[DK_REC_STAT_DETAIL.MAX], nValue) -- 单次命中最大值 + tResult[DK_REC_STAT_DETAIL.MAX_EFFECT] = math.max(tResult[DK_REC_STAT_DETAIL.MAX_EFFECT], nEffectValue) -- 单次命中最大有效值 + tResult[DK_REC_STAT_DETAIL.MIN ] = Min(tResult[DK_REC_STAT_DETAIL.MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_DETAIL.MIN_EFFECT] = Min(tResult[DK_REC_STAT_DETAIL.MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_DETAIL.TOTAL ] = tResult[DK_REC_STAT_DETAIL.TOTAL] + nValue -- 所以命中总伤害 + tResult[DK_REC_STAT_DETAIL.TOTAL_EFFECT] = tResult[DK_REC_STAT_DETAIL.TOTAL_EFFECT] + nEffectValue -- 所有命中总有效伤害 + tResult[DK_REC_STAT_DETAIL.AVG ] = math.floor(tResult[DK_REC_STAT_DETAIL.TOTAL] / tResult[DK_REC_STAT_DETAIL.COUNT]) -- 单次命中平均值 + tResult[DK_REC_STAT_DETAIL.AVG_EFFECT ] = math.floor(tResult[DK_REC_STAT_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_DETAIL.COUNT]) -- 单次命中平均有效值 + if nValue ~= 0 or NZ_SKILL_RESULT[nSkillResult] then + tResult[DK_REC_STAT_DETAIL.NZ_COUNT] = tResult[DK_REC_STAT_DETAIL.NZ_COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_DETAIL.NZ_MIN ] = Min(tResult[DK_REC_STAT_DETAIL.NZ_MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_DETAIL.NZ_MIN_EFFECT] = Min(tResult[DK_REC_STAT_DETAIL.NZ_MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_DETAIL.NZ_AVG ] = math.floor(tResult[DK_REC_STAT_DETAIL.TOTAL] / tResult[DK_REC_STAT_DETAIL.NZ_COUNT]) -- 单次命中平均值 + tResult[DK_REC_STAT_DETAIL.NZ_AVG_EFFECT] = math.floor(tResult[DK_REC_STAT_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_DETAIL.NZ_COUNT]) -- 单次命中平均有效值 + end + + ------------------------ + -- # 节: tRecord.Skill + ------------------------ + -- 添加具体技能记录 + if not tRecord[DK_REC_STAT.SKILL][szEffectID] then + tRecord[DK_REC_STAT.SKILL][szEffectID] = { + [DK_REC_STAT_SKILL.COUNT ] = 0, -- 该玩家四象轮回释放次数(假设szEffectName是四象轮回) + [DK_REC_STAT_SKILL.NZ_COUNT ] = 0, -- 该玩家非零值四象轮回释放次数 + [DK_REC_STAT_SKILL.MAX ] = 0, -- 该玩家四象轮回最大输出量 + [DK_REC_STAT_SKILL.MAX_EFFECT ] = 0, -- 该玩家四象轮回最大有效输出量 + [DK_REC_STAT_SKILL.TOTAL ] = 0, -- 该玩家四象轮回输出量总和 + [DK_REC_STAT_SKILL.TOTAL_EFFECT ] = 0, -- 该玩家四象轮回有效输出量总和 + [DK_REC_STAT_SKILL.AVG ] = 0, -- 该玩家所有四象轮回平均伤害 + [DK_REC_STAT_SKILL.NZ_AVG ] = 0, -- 该玩家所有非零值四象轮回平均伤害 + [DK_REC_STAT_SKILL.AVG_EFFECT ] = 0, -- 该玩家所有四象轮回平均有效伤害 + [DK_REC_STAT_SKILL.NZ_AVG_EFFECT] = 0, -- 该玩家所有非零值四象轮回平均有效伤害 + [DK_REC_STAT_SKILL.DETAIL ] = {}, -- 该玩家四象轮回输出结果分类统计 + [DK_REC_STAT_SKILL.TARGET ] = {}, -- 该玩家四象轮回承受者统计 + } + end + tSkillRecord = tRecord[DK_REC_STAT.SKILL][szEffectID] + tSkillRecord[DK_REC_STAT_SKILL.COUNT ] = tSkillRecord[DK_REC_STAT_SKILL.COUNT] + 1 + tSkillRecord[DK_REC_STAT_SKILL.MAX ] = math.max(tSkillRecord[DK_REC_STAT_SKILL.MAX], nValue) + tSkillRecord[DK_REC_STAT_SKILL.MAX_EFFECT ] = math.max(tSkillRecord[DK_REC_STAT_SKILL.MAX_EFFECT], nEffectValue) + tSkillRecord[DK_REC_STAT_SKILL.TOTAL ] = tSkillRecord[DK_REC_STAT_SKILL.TOTAL] + nValue + tSkillRecord[DK_REC_STAT_SKILL.TOTAL_EFFECT] = tSkillRecord[DK_REC_STAT_SKILL.TOTAL_EFFECT] + nEffectValue + tSkillRecord[DK_REC_STAT_SKILL.AVG ] = math.floor(tSkillRecord[DK_REC_STAT_SKILL.TOTAL] / tSkillRecord[DK_REC_STAT_SKILL.COUNT]) + tSkillRecord[DK_REC_STAT_SKILL.AVG_EFFECT ] = math.floor(tSkillRecord[DK_REC_STAT_SKILL.TOTAL_EFFECT] / tSkillRecord[DK_REC_STAT_SKILL.COUNT]) + if nValue ~= 0 or NZ_SKILL_RESULT[nSkillResult] then + tSkillRecord[DK_REC_STAT_SKILL.NZ_COUNT] = tSkillRecord[DK_REC_STAT_SKILL.NZ_COUNT] + 1 + tSkillRecord[DK_REC_STAT_SKILL.NZ_AVG] = math.floor(tSkillRecord[DK_REC_STAT_SKILL.TOTAL] / tSkillRecord[DK_REC_STAT_SKILL.NZ_COUNT]) + tSkillRecord[DK_REC_STAT_SKILL.NZ_AVG_EFFECT] = math.floor(tSkillRecord[DK_REC_STAT_SKILL.TOTAL_EFFECT] / tSkillRecord[DK_REC_STAT_SKILL.NZ_COUNT]) + end + + --------------------------------- + -- # 节: tRecord.Skill[x].Detail + --------------------------------- + -- 添加/更新具体技能结果分类统计 + if not tSkillRecord[DK_REC_STAT_SKILL.DETAIL][nSkillResult] then + tSkillRecord[DK_REC_STAT_SKILL.DETAIL][nSkillResult] = { + [DK_REC_STAT_SKILL_DETAIL.COUNT ] = 0, -- 命中记录数量 + [DK_REC_STAT_SKILL_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_SKILL_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_SKILL_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_SKILL_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_SKILL_DETAIL.TOTAL ] = 0, -- 所以命中总伤害 + [DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_SKILL_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_SKILL_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_SKILL_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_SKILL_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + end + tResult = tSkillRecord[DK_REC_STAT_SKILL.DETAIL][nSkillResult] + tResult[DK_REC_STAT_SKILL_DETAIL.COUNT ] = tResult[DK_REC_STAT_SKILL_DETAIL.COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_SKILL_DETAIL.MAX ] = math.max(tResult[DK_REC_STAT_SKILL_DETAIL.MAX], nValue) -- 单次命中最大值 + tResult[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT ] = math.max(tResult[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT], nEffectValue) -- 单次命中最大有效值 + tResult[DK_REC_STAT_SKILL_DETAIL.MIN ] = Min(tResult[DK_REC_STAT_SKILL_DETAIL.MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT ] = Min(tResult[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL ] = tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL] + nValue -- 所以命中总伤害 + tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] = tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] + nEffectValue -- 所有命中总有效伤害 + tResult[DK_REC_STAT_SKILL_DETAIL.AVG ] = math.floor(tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL] / tResult[DK_REC_STAT_SKILL_DETAIL.COUNT]) + tResult[DK_REC_STAT_SKILL_DETAIL.AVG_EFFECT ] = math.floor(tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_SKILL_DETAIL.COUNT]) + if nValue ~= 0 or NZ_SKILL_RESULT[nSkillResult] then + tResult[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT ] = tResult[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_SKILL_DETAIL.NZ_MIN ] = Min(tResult[DK_REC_STAT_SKILL_DETAIL.NZ_MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT] = Min(tResult[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_SKILL_DETAIL.NZ_AVG ] = math.floor(tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL] / tResult[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT]) + tResult[DK_REC_STAT_SKILL_DETAIL.NZ_AVG_EFFECT] = math.floor(tResult[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT]) + end + + ------------------------------ + -- # 节: tRecord.Skill.Target + ------------------------------ + -- 添加具体技能承受者记录 + if not tSkillRecord[DK_REC_STAT_SKILL.TARGET][dwTargetID] then + tSkillRecord[DK_REC_STAT_SKILL.TARGET][dwTargetID] = { + [DK_REC_STAT_SKILL_TARGET.MAX ] = 0, -- 该玩家四象轮回击中的这个玩家最大伤害 + [DK_REC_STAT_SKILL_TARGET.MAX_EFFECT ] = 0, -- 该玩家四象轮回击中的这个玩家最大有效伤害 + [DK_REC_STAT_SKILL_TARGET.TOTAL ] = 0, -- 该玩家四象轮回击中的这个玩家伤害总和 + [DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] = 0, -- 该玩家四象轮回击中的这个玩家有效伤害总和 + [DK_REC_STAT_SKILL_TARGET.COUNT ] = { -- 该玩家四象轮回击中的这个玩家结果统计 + -- [SKILL_RESULT.HIT ] = 5, + -- [SKILL_RESULT.MISS ] = 3, + -- [SKILL_RESULT.CRITICAL] = 3, + }, + [DK_REC_STAT_SKILL_TARGET.NZ_COUNT ] = { -- 该玩家非零值四象轮回击中的这个玩家结果统计 + -- [SKILL_RESULT.HIT ] = 5, + -- [SKILL_RESULT.MISS ] = 3, + -- [SKILL_RESULT.CRITICAL] = 3, + }, + } + end + tSkillTargetData = tSkillRecord[DK_REC_STAT_SKILL.TARGET][dwTargetID] + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.MAX ] = math.max(tSkillTargetData[DK_REC_STAT_SKILL_TARGET.MAX], nValue) + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT ] = math.max(tSkillTargetData[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT], nEffectValue) + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.TOTAL ] = tSkillTargetData[DK_REC_STAT_SKILL_TARGET.TOTAL] + nValue + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] = tSkillTargetData[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] + nEffectValue + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.COUNT][nSkillResult] = (tSkillTargetData[DK_REC_STAT_SKILL_TARGET.COUNT][nSkillResult] or 0) + 1 + if nValue ~= 0 then + tSkillTargetData[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][nSkillResult] = (tSkillTargetData[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][nSkillResult] or 0) + 1 + end + + ------------------------ + -- # 节: tRecord.Target + ------------------------ + -- 添加具体承受/释放者记录 + if not tRecord[DK_REC_STAT.TARGET][dwTargetID] then + tRecord[DK_REC_STAT.TARGET][dwTargetID] = { + [DK_REC_STAT_TARGET.COUNT ] = 0, -- 该玩家对idTarget的技能释放次数 + [DK_REC_STAT_TARGET.NZ_COUNT ] = 0, -- 该玩家对idTarget的非零值技能释放次数 + [DK_REC_STAT_TARGET.MAX ] = 0, -- 该玩家对idTarget的技能最大输出量 + [DK_REC_STAT_TARGET.MAX_EFFECT ] = 0, -- 该玩家对idTarget的技能最大有效输出量 + [DK_REC_STAT_TARGET.TOTAL ] = 0, -- 该玩家对idTarget的技能输出量总和 + [DK_REC_STAT_TARGET.TOTAL_EFFECT ] = 0, -- 该玩家对idTarget的技能有效输出量总和 + [DK_REC_STAT_TARGET.AVG ] = 0, -- 该玩家对idTarget的技能平均输出量 + [DK_REC_STAT_TARGET.NZ_AVG ] = 0, -- 该玩家对idTarget的非零值技能平均输出量 + [DK_REC_STAT_TARGET.AVG_EFFECT ] = 0, -- 该玩家对idTarget的技能平均有效输出量 + [DK_REC_STAT_TARGET.NZ_AVG_EFFECT] = 0, -- 该玩家对idTarget的非零值技能平均有效输出量 + [DK_REC_STAT_TARGET.DETAIL ] = {}, -- 该玩家对idTarget的技能输出结果分类统计 + [DK_REC_STAT_TARGET.SKILL ] = {}, -- 该玩家对idTarget的技能具体分别统计 + } + end + tTargetRecord = tRecord[DK_REC_STAT.TARGET][dwTargetID] + tTargetRecord[DK_REC_STAT_TARGET.COUNT ] = tTargetRecord[DK_REC_STAT_TARGET.COUNT] + 1 + tTargetRecord[DK_REC_STAT_TARGET.MAX ] = math.max(tTargetRecord[DK_REC_STAT_TARGET.MAX], nValue) + tTargetRecord[DK_REC_STAT_TARGET.MAX_EFFECT ] = math.max(tTargetRecord[DK_REC_STAT_TARGET.MAX_EFFECT], nEffectValue) + tTargetRecord[DK_REC_STAT_TARGET.TOTAL ] = tTargetRecord[DK_REC_STAT_TARGET.TOTAL] + nValue + tTargetRecord[DK_REC_STAT_TARGET.TOTAL_EFFECT] = tTargetRecord[DK_REC_STAT_TARGET.TOTAL_EFFECT] + nEffectValue + tTargetRecord[DK_REC_STAT_TARGET.AVG ] = math.floor(tTargetRecord[DK_REC_STAT_TARGET.TOTAL] / tTargetRecord[DK_REC_STAT_TARGET.COUNT]) + tTargetRecord[DK_REC_STAT_TARGET.AVG_EFFECT ] = math.floor(tTargetRecord[DK_REC_STAT_TARGET.TOTAL_EFFECT] / tTargetRecord[DK_REC_STAT_TARGET.COUNT]) + if nValue ~= 0 or NZ_SKILL_RESULT[nSkillResult] then + tTargetRecord[DK_REC_STAT_TARGET.NZ_COUNT ] = tTargetRecord[DK_REC_STAT_TARGET.NZ_COUNT] + 1 + tTargetRecord[DK_REC_STAT_TARGET.NZ_AVG ] = math.floor(tTargetRecord[DK_REC_STAT_TARGET.TOTAL] / tTargetRecord[DK_REC_STAT_TARGET.NZ_COUNT]) + tTargetRecord[DK_REC_STAT_TARGET.NZ_AVG_EFFECT] = math.floor(tTargetRecord[DK_REC_STAT_TARGET.TOTAL_EFFECT] / tTargetRecord[DK_REC_STAT_TARGET.NZ_COUNT]) + end + + ---------------------------------- + -- # 节: tRecord.Target[x].Detail + ---------------------------------- + -- 添加/更新具体承受/释放者结果分类统计 + if not tTargetRecord[DK_REC_STAT_TARGET.DETAIL][nSkillResult] then + tTargetRecord[DK_REC_STAT_TARGET.DETAIL][nSkillResult] = { + [DK_REC_STAT_TARGET_DETAIL.COUNT ] = 0, -- 命中记录数量(假设nSkillResult是命中) + [DK_REC_STAT_TARGET_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_TARGET_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_TARGET_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_TARGET_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_TARGET_DETAIL.TOTAL ] = 0, -- 所以命中总伤害 + [DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_TARGET_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_TARGET_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_TARGET_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_TARGET_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + end + tResult = tTargetRecord[DK_REC_STAT_TARGET.DETAIL][nSkillResult] + tResult[DK_REC_STAT_TARGET_DETAIL.COUNT ] = tResult[DK_REC_STAT_TARGET_DETAIL.COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_TARGET_DETAIL.MAX ] = math.max(tResult[DK_REC_STAT_TARGET_DETAIL.MAX], nValue) -- 单次命中最大值 + tResult[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT ] = math.max(tResult[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT], nEffectValue) -- 单次命中最大有效值 + tResult[DK_REC_STAT_TARGET_DETAIL.MIN ] = Min(tResult[DK_REC_STAT_TARGET_DETAIL.MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT ] = Min(tResult[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL ] = tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL] + nValue -- 所以命中总伤害 + tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] = tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] + nEffectValue -- 所有命中总有效伤害 + tResult[DK_REC_STAT_TARGET_DETAIL.AVG ] = math.floor(tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL] / tResult[DK_REC_STAT_TARGET_DETAIL.COUNT]) + tResult[DK_REC_STAT_TARGET_DETAIL.AVG_EFFECT ] = math.floor(tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_TARGET_DETAIL.COUNT]) + if nValue ~= 0 or NZ_SKILL_RESULT[nSkillResult] then + tResult[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT ] = tResult[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT] + 1 -- 命中次数(假设nSkillResult是命中) + tResult[DK_REC_STAT_TARGET_DETAIL.NZ_MIN ] = Min(tResult[DK_REC_STAT_TARGET_DETAIL.NZ_MIN], nValue) -- 单次命中最小值 + tResult[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT] = Min(tResult[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT], nEffectValue) -- 单次命中最小有效值 + tResult[DK_REC_STAT_TARGET_DETAIL.NZ_AVG ] = math.floor(tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL] / tResult[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT]) + tResult[DK_REC_STAT_TARGET_DETAIL.NZ_AVG_EFFECT] = math.floor(tResult[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] / tResult[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT]) + end + + --------------------------------- + -- # 节: tRecord.Target[x].Skill + --------------------------------- + -- 添加承受者具体技能记录 + if not tTargetRecord[DK_REC_STAT_TARGET.SKILL][szEffectID] then + tTargetRecord[DK_REC_STAT_TARGET.SKILL][szEffectID] = { + [DK_REC_STAT_TARGET_SKILL.MAX ] = 0, -- 该玩家击中这个玩家的四象轮回最大伤害 + [DK_REC_STAT_TARGET_SKILL.MAX_EFFECT ] = 0, -- 该玩家击中这个玩家的四象轮回最大有效伤害 + [DK_REC_STAT_TARGET_SKILL.TOTAL ] = 0, -- 该玩家击中这个玩家的四象轮回伤害总和 + [DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] = 0, -- 该玩家击中这个玩家的四象轮回有效伤害总和 + [DK_REC_STAT_TARGET_SKILL.COUNT ] = { -- 该玩家击中这个玩家的四象轮回结果统计 + -- [SKILL_RESULT.HIT ] = 5, + -- [SKILL_RESULT.MISS ] = 3, + -- [SKILL_RESULT.CRITICAL] = 3, + }, + [DK_REC_STAT_TARGET_SKILL.NZ_COUNT ] = { -- 该玩家非零值击中这个玩家的四象轮回结果统计 + -- [SKILL_RESULT.HIT ] = 5, + -- [SKILL_RESULT.MISS ] = 3, + -- [SKILL_RESULT.CRITICAL] = 3, + }, + } + end + tTargetSkillData = tTargetRecord[DK_REC_STAT_TARGET.SKILL][szEffectID] + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.MAX ] = math.max(tTargetSkillData[DK_REC_STAT_TARGET_SKILL.MAX], nValue) + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT ] = math.max(tTargetSkillData[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT], nEffectValue) + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.TOTAL ] = tTargetSkillData[DK_REC_STAT_TARGET_SKILL.TOTAL] + nValue + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] = tTargetSkillData[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] + nEffectValue + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.COUNT][nSkillResult] = (tTargetSkillData[DK_REC_STAT_TARGET_SKILL.COUNT][nSkillResult] or 0) + 1 + if nValue ~= 0 then + tTargetSkillData[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][nSkillResult] = (tTargetSkillData[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][nSkillResult] or 0) + 1 + end + tInfo, tRecord, tResult, tSkillRecord, tSkillTargetData, tTargetRecord, tTargetSkillData = nil +end +end + +-- 插入一条伤害记录 +function D.AddDamageRecord(data, dwCaster, dwTarget, szEffectID, nDamage, nEffectDamage, nSkillResult) + -- 添加伤害记录 + D.InitObjectData(data, dwCaster, DK.DAMAGE) + D.InsertRecord(data, DK.DAMAGE, dwCaster, dwTarget, szEffectID, nDamage, nEffectDamage, nSkillResult) + -- 添加承伤记录 + D.InitObjectData(data, dwTarget, DK.BE_DAMAGE) + D.InsertRecord(data, DK.BE_DAMAGE, dwTarget, dwCaster, szEffectID, nDamage, nEffectDamage, nSkillResult) +end + +-- 插入一条治疗记录 +function D.AddHealRecord(data, dwCaster, dwTarget, szEffectID, nHeal, nEffectHeal, nSkillResult) + -- 添加伤害记录 + D.InitObjectData(data, dwCaster, DK.HEAL) + D.InsertRecord(data, DK.HEAL, dwCaster, dwTarget, szEffectID, nHeal, nEffectHeal, nSkillResult) + -- 添加承伤记录 + D.InitObjectData(data, dwTarget, DK.BE_HEAL) + D.InsertRecord(data, DK.BE_HEAL, dwTarget, dwCaster, szEffectID, nHeal, nEffectHeal, nSkillResult) +end + +-- 插入一条化解记录 +function D.AddAbsorbRecord(data, dwCaster, dwTarget, szEffectID, nAbsorb, nSkillResult) + -- 添加化解记录 + D.InitObjectData(data, dwCaster, DK.ABSORB) + D.InsertRecord(data, DK.ABSORB, dwCaster, dwTarget, szEffectID, nAbsorb, nAbsorb, nSkillResult) +end + +-- 确认对象数据已创建(未创建则创建) +function D.InitObjectData(data, dwID, szChannel) + local dwType = X.IsPlayer(dwID) and TARGET.PLAYER or TARGET.NPC + -- 名称缓存 + if not data[DK.NAME_LIST][dwID] then + data[DK.NAME_LIST][dwID] = X.GetTargetName(dwType, dwID, { eShowID = 'never' }) -- 名称缓存 + end + -- 短名称缓存 + if not data[DK.BASE_NAME_LIST][dwID] then + data[DK.BASE_NAME_LIST][dwID] = X.GetTargetName(dwType, dwID, { eShowID = 'never', eShowEmployer = 'suffix', bShowSuffix = false, bShowServerName = false }) + end + -- 势力缓存 + if not data[DK.FORCE_LIST][dwID] then + if X.IsPlayer(dwID) then + local player = X.GetPlayer(dwID) + if player then + data[DK.FORCE_LIST][dwID] = player.dwForceID or 0 + end + else + data[DK.FORCE_LIST][dwID] = 0 + end + end + -- 统计结构体 + if szChannel and not data[szChannel][DK_REC.STAT][dwID] then + data[szChannel][DK_REC.STAT][dwID] = { + [DK_REC_STAT.TOTAL ] = 0 , -- 总输出 + [DK_REC_STAT.TOTAL_EFFECT] = 0 , -- 有效输出 + [DK_REC_STAT.DETAIL ] = {}, -- 输出结果按技能结果分类统计 + [DK_REC_STAT.SKILL ] = {}, -- 该玩家具体造成输出的技能统计 + [DK_REC_STAT.TARGET ] = {}, -- 该玩家具体对谁造成输出的统计 + } + end +end + +do local szKey +function D.InitEffectData(data, nType, dwID, nLevel) + szKey = nType .. ',' .. dwID .. ',' .. nLevel + if not data[DK.EFFECT_LIST][szKey] then + local szName, bAnonymous = nil, false + if nType == SKILL_EFFECT_TYPE.SKILL then + szName = Table_GetSkillName(dwID, nLevel) + elseif nType == SKILL_EFFECT_TYPE.BUFF then + szName = Table_GetBuffName(dwID, nLevel) + end + if not szName or szName == '' then + bAnonymous = true + szName = '#' .. dwID .. ',' .. nLevel + end + data[DK.EFFECT_LIST][szKey] = {szName, bAnonymous, nType, dwID, nLevel} + end + return szKey +end +end + +-- 初始化Data +do +local function GeneTypeNS() + return { + [DK_REC.TIME_DURING ] = 0, + [DK_REC.TOTAL ] = 0, + [DK_REC.TOTAL_EFFECT] = 0, + [DK_REC.STAT ] = {}, + } +end +function D.InitData() + local bFighting = X.IsFighting() + local nFightTick = bFighting and X.GetFightTime() or 0 + Data = { + [DK.UUID ] = X.GetFightUUID(), -- 战斗唯一标识 + [DK.VERSION ] = VERSION, -- 数据版本号 + [DK.SERVER ] = X.GetServerOriginName(), -- 所在服务器 + [DK.MAP ] = X.GetMapID(), -- 所在地图 + [DK.TIME_BEGIN ] = GetCurrentTime(), -- 战斗开始时间 + [DK.TICK_BEGIN ] = GetTime(), -- 战斗开始毫秒时间 + [DK.TIME_DURING ] = - (nFightTick / 1000) - 1, -- 战斗持续时间 负数表示本次战斗尚未结束 其数值为记录开始时负的战斗秒数减一 + [DK.TICK_DURING ] = - nFightTick - 1, -- 战斗持续毫秒时间 负数表示本次战斗尚未结束 其数值为记录开始时负的战斗毫秒数减一 + [DK.AWAYTIME ] = {}, -- 死亡/掉线时间节点 + [DK.NAME_LIST ] = {}, -- 名称缓存 + [DK.BASE_NAME_LIST] = {}, -- 基础名称缓存 + [DK.FORCE_LIST ] = {}, -- 势力缓存 + [DK.PLAYER_LIST ] = {}, -- 玩家信息缓存 + [DK.EFFECT_LIST ] = {}, -- 效果信息缓存 + [DK.DAMAGE ] = GeneTypeNS(), -- 输出统计 + [DK.HEAL ] = GeneTypeNS(), -- 治疗统计 + [DK.BE_HEAL ] = GeneTypeNS(), -- 承疗统计 + [DK.BE_DAMAGE ] = GeneTypeNS(), -- 承伤统计 + [DK.ABSORB ] = GeneTypeNS(), -- 化解统计 + } +end +end + +-- Data数据压入历史记录 +function D.FlushData() + -- 过滤空记录 + if not Data or not Data[DK.UUID] then + return + end + if X.IsEmpty(Data[DK.BE_DAMAGE][DK_REC.STAT]) + and X.IsEmpty(Data[DK.DAMAGE][DK_REC.STAT]) + and X.IsEmpty(Data[DK.HEAL][DK_REC.STAT]) + and X.IsEmpty(Data[DK.BE_HEAL][DK_REC.STAT]) then + return + end + + -- 计算受伤最多的名字作为战斗名称 + local nMaxValue, szBossName = 0, nil + local nEnemyMaxValue, szEnemyBossName = 0, nil + for id, p in pairs(Data[DK.BE_DAMAGE][DK_REC.STAT]) do + if nEnemyMaxValue < p[DK_REC_STAT.TOTAL_EFFECT] and not D.IsParty(id) then + nEnemyMaxValue = p[DK_REC_STAT.TOTAL_EFFECT] + szEnemyBossName = D.GetNameAusID(Data, id) + end + if nMaxValue < p[DK_REC_STAT.TOTAL_EFFECT] and id ~= X.GetClientPlayerID() then + nMaxValue = p[DK_REC_STAT.TOTAL_EFFECT] + szBossName = D.GetNameAusID(Data, id) + end + end + -- 如果没有 则计算输出最多的NPC名字作为战斗名称 + if not szBossName or not szEnemyBossName then + for id, p in pairs(Data[DK.DAMAGE][DK_REC.STAT]) do + if nEnemyMaxValue < p[DK_REC_STAT.TOTAL_EFFECT] and not D.IsParty(id) then + nEnemyMaxValue = p[DK_REC_STAT.TOTAL_EFFECT] + szEnemyBossName = D.GetNameAusID(Data, id) + end + if nMaxValue < p[DK_REC_STAT.TOTAL_EFFECT] and not tonumber(id) then + nMaxValue = p[DK_REC_STAT.TOTAL_EFFECT] + szBossName = D.GetNameAusID(Data, id) + end + end + end + Data[DK.BOSSNAME] = szEnemyBossName or szBossName or g_tStrings.STR_NAME_UNKNOWN + + local nFightTick = X.GetFightTime() or 0 + Data[DK.TIME_DURING] = math.floor(nFightTick / 1000) + Data[DK.TIME_DURING] + 1 + Data[DK.TICK_DURING] = nFightTick + Data[DK.TICK_DURING] + 1 + + if Data[DK.TIME_DURING] > O.nMinFightTime then + local szFilePath = X.FormatPath(DS_ROOT) .. D.GetDataFileName(Data) + HISTORY_CACHE[szFilePath] = Data + UNSAVED_CACHE[szFilePath] = Data + if O.bSaveHistoryOnExFi then + D.SaveHistory() + end + end +end + +-- Data数据压入历史记录 并重新初始化Data +function D.Flush() + D.FlushData() + D.InitData() +end + +-- 系统日志监控(数据源) +do local aAbsorbInfo, nLFC +X.RegisterEvent('SYS_MSG', function() + if not Data or not D.bReady or not O.bEnable then + return + end + if arg0 == 'UI_OME_SKILL_CAST_LOG' then + -- 技能施放日志; + -- (arg1)dwCaster:技能施放者 (arg2)dwSkillID:技能ID (arg3)dwLevel:技能等级 + -- D.OnSkillCast(arg1, arg2, arg3) + elseif arg0 == 'UI_OME_SKILL_CAST_RESPOND_LOG' then + -- 技能施放结果日志; + -- (arg1)dwCaster:技能施放者 (arg2)dwSkillID:技能ID + -- (arg3)dwLevel:技能等级 (arg4)nRespond:见枚举型[[SKILL_RESULT_CODE]] + -- D.OnSkillCastRespond(arg1, arg2, arg3, arg4) + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + -- if not X.IsInArenaMap() then + -- 技能最终产生的效果(生命值的变化); + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)bReact:是否为反击 (arg4)nType:Effect类型 (arg5)dwID:Effect的ID + -- (arg6)dwLevel:Effect的等级 (arg7)bCriticalStrike:是否会心 (arg8)nCount:tResultCount数据表中元素个数 (arg9)tResultCount:数值集合 + -- D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + if arg7 and arg7 ~= 0 then -- bCriticalStrike + D.OnSkillEffect(arg1, arg2, arg4, arg5, arg6, SKILL_RESULT.CRITICAL, arg8, arg9) + elseif arg9[SKILL_RESULT_TYPE.INSIGHT_DAMAGE] then -- 识破 + D.OnSkillEffect(arg1, arg2, arg4, arg5, arg6, SKILL_RESULT.INSIGHT, arg8, arg9) + else + D.OnSkillEffect(arg1, arg2, arg4, arg5, arg6, SKILL_RESULT.HIT, arg8, arg9) + end + -- 盾化解伤害补偿至盾提供者的治疗量 + if arg9[SKILL_RESULT_TYPE.ABSORB_DAMAGE] then + aAbsorbInfo = ABSORB_CACHE[arg2] + nLFC = GetLogicFrameCount() + if aAbsorbInfo then + for _, tAbsorbInfo in ipairs(aAbsorbInfo) do + if tAbsorbInfo.nEndFrame >= nLFC then + D.OnSkillEffect( + tAbsorbInfo.dwSrcID, arg2, + tAbsorbInfo.nEffectType, tAbsorbInfo.dwEffectID, tAbsorbInfo.dwEffectLevel, + SKILL_RESULT.ABSORB, 1, { + [SKILL_RESULT_TYPE.THERAPY] = arg9[SKILL_RESULT_TYPE.ABSORB_DAMAGE], + [SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] = arg9[SKILL_RESULT_TYPE.ABSORB_DAMAGE], + }) + break + end + end + end + end + -- end + elseif arg0 == 'UI_OME_SKILL_BLOCK_LOG' then + -- 格挡日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)nType:Effect的类型 + -- (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 (arg6)nDamageType:伤害类型,见枚举型[[SKILL_RESULT_TYPE]] + D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, SKILL_RESULT.BLOCK, nil, {}) + elseif arg0 == 'UI_OME_SKILL_SHIELD_LOG' then + -- 技能被屏蔽日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, SKILL_RESULT.SHIELD, nil, {}) + elseif arg0 == 'UI_OME_SKILL_MISS_LOG' then + -- 技能未命中目标日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, SKILL_RESULT.MISS, nil, {}) + elseif arg0 == 'UI_OME_SKILL_HIT_LOG' then + -- 技能命中目标日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + -- D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, SKILL_RESULT.HIT, nil, {}) + elseif arg0 == 'UI_OME_SKILL_DODGE_LOG' then + -- 技能被闪避日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + D.OnSkillEffect(arg1, arg2, arg3, arg4, arg5, SKILL_RESULT.DODGE, nil, {}) + elseif arg0 == 'UI_OME_COMMON_HEALTH_LOG' then + -- 普通治疗日志; + -- (arg1)dwCharacterID:承疗玩家ID (arg2)nDeltaLife:增加血量值 + -- D.OnCommonHealth(arg1, arg2) + end +end) +end + +-- JJC中使用的数据源(不能记录溢出数据) +-- X.RegisterEvent('SKILL_EFFECT_TEXT', function(event) +-- if X.IsInArenaMap() then +-- local dwCasterID = arg0 +-- local dwTargetID = arg1 +-- local bCriticalStrike = arg2 +-- local nType = arg3 +-- local nValue = arg4 +-- local dwSkillID = arg5 +-- local dwSkillLevel = arg6 +-- local nEffectType = arg7 +-- local nResultCount = 1 +-- local tResult = { [nType] = nValue } + +-- if nType == SKILL_RESULT_TYPE.PHYSICS_DAMAGE -- 外功伤害 +-- or nType == SKILL_RESULT_TYPE.SOLAR_MAGIC_DAMAGE -- 阳性内功伤害 +-- or nType == SKILL_RESULT_TYPE.NEUTRAL_MAGIC_DAMAGE -- 中性内功伤害 +-- or nType == SKILL_RESULT_TYPE.LUNAR_MAGIC_DAMAGE -- 阴性内功伤害 +-- or nType == SKILL_RESULT_TYPE.POISON_DAMAGE then -- 毒性内功伤害 +-- -- if nType == SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE then -- 有效伤害值 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] = nValue +-- elseif nType == SKILL_RESULT_TYPE.REFLECTIED_DAMAGE then -- 反弹伤害 +-- dwCasterID, dwTargetID = dwTargetID, dwCasterID +-- elseif nType == SKILL_RESULT_TYPE.THERAPY then -- 治疗 +-- -- elseif nType == SKILL_RESULT_TYPE.EFFECTIVE_THERAPY then -- 有效治疗量 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] = nValue +-- elseif nType == SKILL_RESULT_TYPE.STEAL_LIFE then -- 偷取生命值 +-- dwTargetID = dwCasterID +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] = nValue +-- elseif nType == SKILL_RESULT_TYPE.ABSORB_DAMAGE then -- 吸收伤害 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] = 0 +-- elseif nType == SKILL_RESULT_TYPE.SHIELD_DAMAGE then -- 内力抵消伤害 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] = 0 +-- elseif nType == SKILL_RESULT_TYPE.PARRY_DAMAGE then -- 闪避伤害 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] = 0 +-- elseif nType == SKILL_RESULT_TYPE.INSIGHT_DAMAGE then -- 识破伤害 +-- nResultCount = nResultCount + 1 +-- tResult[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] = 0 +-- end +-- if bCriticalStrike then -- bCriticalStrike +-- D.OnSkillEffect(dwCasterID, dwTargetID, nEffectType, dwSkillID, dwSkillLevel, SKILL_RESULT.CRITICAL, nResultCount, tResult) +-- elseif tResult[SKILL_RESULT_TYPE.INSIGHT_DAMAGE] then -- 识破 +-- D.OnSkillEffect(dwCasterID, dwTargetID, nEffectType, dwSkillID, dwSkillLevel, SKILL_RESULT.INSIGHT, nResultCount, tResult) +-- else +-- D.OnSkillEffect(dwCasterID, dwTargetID, nEffectType, dwSkillID, dwSkillLevel, SKILL_RESULT.HIT, nResultCount, tResult) +-- end +-- end +-- end) + + +-- 系统BUFF监控(数据源) +do local nAbsorbPriority, nLFC, aAbsorbInfo, tAbsorbInfo +local function AbsorbSorter(p1, p2) + if p1.nPriority == p2.nPriority then + return p1.dwInitTime < p2.dwInitTime + end + return p1.nPriority > p2.nPriority +end +X.RegisterEvent('BUFF_UPDATE', function() + -- local owner, bdelete, index, cancancel, id , stacknum, endframe, binit, level, srcid, isvalid, leftframe + -- = arg0 , arg1 , arg2 , arg3 , arg4, arg5 , arg6 , arg7 , arg8 , arg9 , arg10 , arg11 + if not Data or not D.bReady or not O.bEnable then + return + end + nAbsorbPriority = ABSORB_BUFF[arg4] + if nAbsorbPriority then -- BUFF盾 + aAbsorbInfo = ABSORB_CACHE[arg0] + if not aAbsorbInfo then + aAbsorbInfo = {} + ABSORB_CACHE[arg0] = aAbsorbInfo + end + tAbsorbInfo = nil + for _, v in ipairs(aAbsorbInfo) do + if v.dwViaID == arg4 then + tAbsorbInfo = v + break + end + end + nLFC = GetLogicFrameCount() + if arg1 then + if tAbsorbInfo then + tAbsorbInfo.nEndFrame = nLFC + end + else + if not tAbsorbInfo then + tAbsorbInfo = { + nPriority = nAbsorbPriority, + dwViaID = arg4, + dwInitTime = nLFC, + } + table.insert(aAbsorbInfo, tAbsorbInfo) + table.sort(aAbsorbInfo, AbsorbSorter) + end + if arg7 then + tAbsorbInfo.dwInitTime = nLFC + table.sort(aAbsorbInfo, AbsorbSorter) + end + tAbsorbInfo.dwSrcID = arg9 + tAbsorbInfo.nEffectType = SKILL_EFFECT_TYPE.BUFF + tAbsorbInfo.dwEffectID = arg4 + tAbsorbInfo.dwEffectLevel = arg8 + tAbsorbInfo.nEndFrame = arg6 + end + end + -- buff update: + -- arg0:dwPlayerID,arg1:bDelete,arg2:nIndex,arg3:bCanCancel + -- arg4:dwBuffID,arg5:nStackNum,arg6:nEndFrame,arg7:?update all? + -- arg8:nLevel,arg9:dwSkillSrcID + D.OnBuffUpdate(arg9, arg0, arg4, arg8, arg5, arg1, arg6, arg3) +end) +end + +-- 有人死了活了做一下时间轴记录 +function D.OnTeammateStateChange(dwID, bLeave, nAwayType, bAddWhenRecEmpty) + if not (Data and Data[DK.AWAYTIME]) then + return + end + -- 获得一个人的记录 + local rec = Data[DK.AWAYTIME][dwID] + if not rec then -- 初始化一个记录 + if not bLeave and not bAddWhenRecEmpty then + return -- 不是一次暂离的开始并且不强制记录则跳过 + end + rec = {} + Data[DK.AWAYTIME][dwID] = rec + elseif #rec > 0 then -- 检查逻辑 + if bLeave then -- 有人死了 + if not rec[#rec][2] then -- 并且最后一条记录还是死的 + return + end + else -- 有人活了 + if rec[#rec][2] then -- 并且本来就是活的 + return + end + end + end + -- 插入数据到记录 + if bLeave then -- 暂离开始 + table.insert(rec, { GetCurrentTime(), nil, nAwayType }) + else -- 暂离回来 + if #rec == 0 then -- 没记录到暂离开始 创建一个从本次战斗开始的暂离(俗称还没开打你就死了。。) + table.insert(rec, { Data[DK.TIME_BEGIN], GetCurrentTime(), nAwayType }) + elseif not rec[#rec][2] then -- 如果最后一次暂离还没回来 则完成最后一次暂离的记录 + rec[#rec][2] = GetCurrentTime() + end + end +end +X.RegisterEvent('PARTY_UPDATE_MEMBER_INFO', function() + if not Data or not D.bReady or not O.bEnable then + return + end + local team = GetClientTeam() + local info = team.GetMemberInfo(arg1) + if info then + D.OnTeammateStateChange(arg1, info.bDeathFlag, AWAYTIME_TYPE.DEATH, false) + end +end) +-- 上线下线日志 +X.RegisterEvent('PARTY_SET_MEMBER_ONLINE_FLAG', function() + if not Data or not D.bReady or not O.bEnable then + return + end + if arg2 == 0 then -- 有人掉线 + D.OnTeammateStateChange(arg1, true, AWAYTIME_TYPE.OFFLINE, false) + else -- 有人上线 + D.OnTeammateStateChange(arg1, false, AWAYTIME_TYPE.OFFLINE, false) + local team = GetClientTeam() + local info = team.GetMemberInfo(arg1) + if info and info.bDeathFlag then -- 上线死着的 结束离线暂离 开始死亡暂离 + D.OnTeammateStateChange(arg1, true, AWAYTIME_TYPE.DEATH, false) + end + end +end) +-- 进出战斗暂离记录 +X.RegisterEvent('MY_RECOUNT_NEW_FIGHT', function() -- 开战扫描队友 记录开战就死掉/掉线的人 + if not Data or not D.bReady or not O.bEnable then + return + end + local team = GetClientTeam() + local me = X.GetClientPlayer() + if team and me and (me.IsInParty() or me.IsInRaid()) then + for _, dwID in ipairs(team.GetTeamMemberList()) do + local info = X.GetTeamMemberInfo(dwID) + if info then + if not info.bOnline then + D.OnTeammateStateChange(dwID, true, AWAYTIME_TYPE.OFFLINE, true) + elseif info.bDeathFlag then + D.OnTeammateStateChange(dwID, true, AWAYTIME_TYPE.DEATH, true) + end + end + end + end +end) +-- 中途有人退队 +X.RegisterEvent('PARTY_DELETE_MEMBER', function() + if not Data or not D.bReady or not O.bEnable then + return + end + D.OnTeammateStateChange(arg1, true, AWAYTIME_TYPE.LEAVE_TEAM, true) +end) +-- 中途有人进队 补上暂离记录 +X.RegisterEvent('PARTY_ADD_MEMBER', function() + if not Data or not D.bReady or not O.bEnable then + return + end + local team = GetClientTeam() + local info = team.GetMemberInfo(arg1) + if info then + D.OnTeammateStateChange(arg1, false, AWAYTIME_TYPE.HALFWAY_JOINED, true) + if info.bDeathFlag then + D.OnTeammateStateChange(arg1, true, AWAYTIME_TYPE.DEATH, true) + end + end +end) + +-- 同名目标数据合并 +do local tDstDetail, id, tDstSkill, tDstSkillDetail, tDstSkillTarget, tDstTarget, tDstTargetDetail, tDstTargetSkill +function D.MergeTargetData(tDst, tSrc, data, szChannel, bMergeNpc, bMergeEffect, bHideAnonymous) + ------------------------ + -- # 节: tRecord + ------------------------ + -- 合并总数据 + tDst[DK_REC_STAT.TOTAL] = tDst[DK_REC_STAT.TOTAL] + tSrc[DK_REC_STAT.TOTAL] + tDst[DK_REC_STAT.TOTAL_EFFECT] = tDst[DK_REC_STAT.TOTAL_EFFECT] + tSrc[DK_REC_STAT.TOTAL_EFFECT] + ------------------------ + -- # 节: tRecord.Detail + ------------------------ + -- 合并分类详情(命中、会心、偏离...) + for nType, tSrcDetail in pairs(tSrc[DK_REC_STAT.DETAIL]) do + tDstDetail = tDst[DK_REC_STAT.DETAIL][nType] + if not tDstDetail then + tDstDetail = { + [DK_REC_STAT_DETAIL.COUNT ] = 0, -- 命中记录数量(假设nSkillResult是命中) + [DK_REC_STAT_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_DETAIL.TOTAL ] = 0, -- 所有命中总伤害 + [DK_REC_STAT_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + tDst[DK_REC_STAT.DETAIL][nType] = tDstDetail + end + tDstDetail[DK_REC_STAT_DETAIL.COUNT ] = tDstDetail[DK_REC_STAT_DETAIL.COUNT] + tSrcDetail[DK_REC_STAT_DETAIL.COUNT] + tDstDetail[DK_REC_STAT_DETAIL.NZ_COUNT ] = tDstDetail[DK_REC_STAT_DETAIL.NZ_COUNT] + tSrcDetail[DK_REC_STAT_DETAIL.NZ_COUNT] + tDstDetail[DK_REC_STAT_DETAIL.MAX ] = math.max(tDstDetail[DK_REC_STAT_DETAIL.MAX], tSrcDetail[DK_REC_STAT_DETAIL.MAX]) + tDstDetail[DK_REC_STAT_DETAIL.MAX_EFFECT ] = math.max(tDstDetail[DK_REC_STAT_DETAIL.MAX_EFFECT], tSrcDetail[DK_REC_STAT_DETAIL.MAX_EFFECT]) + tDstDetail[DK_REC_STAT_DETAIL.MIN ] = Min(tDstDetail[DK_REC_STAT_DETAIL.MIN], tSrcDetail[DK_REC_STAT_DETAIL.MIN]) + tDstDetail[DK_REC_STAT_DETAIL.NZ_MIN ] = Min(tDstDetail[DK_REC_STAT_DETAIL.NZ_MIN], tSrcDetail[DK_REC_STAT_DETAIL.NZ_MIN]) + tDstDetail[DK_REC_STAT_DETAIL.MIN_EFFECT ] = Min(tDstDetail[DK_REC_STAT_DETAIL.MIN_EFFECT], tSrcDetail[DK_REC_STAT_DETAIL.MIN_EFFECT]) + tDstDetail[DK_REC_STAT_DETAIL.NZ_MIN_EFFECT] = Min(tDstDetail[DK_REC_STAT_DETAIL.NZ_MIN_EFFECT], tSrcDetail[DK_REC_STAT_DETAIL.NZ_MIN_EFFECT]) + tDstDetail[DK_REC_STAT_DETAIL.TOTAL ] = tDstDetail[DK_REC_STAT_DETAIL.TOTAL] + tSrcDetail[DK_REC_STAT_DETAIL.TOTAL] + tDstDetail[DK_REC_STAT_DETAIL.TOTAL_EFFECT ] = tDstDetail[DK_REC_STAT_DETAIL.TOTAL_EFFECT] + tSrcDetail[DK_REC_STAT_DETAIL.TOTAL_EFFECT] + tDstDetail[DK_REC_STAT_DETAIL.AVG ] = math.floor(tDstDetail[DK_REC_STAT_DETAIL.TOTAL] / tDstDetail[DK_REC_STAT_DETAIL.COUNT]) + tDstDetail[DK_REC_STAT_DETAIL.NZ_AVG ] = math.floor(tDstDetail[DK_REC_STAT_DETAIL.TOTAL] / tDstDetail[DK_REC_STAT_DETAIL.NZ_COUNT]) + tDstDetail[DK_REC_STAT_DETAIL.AVG_EFFECT ] = math.floor(tDstDetail[DK_REC_STAT_DETAIL.TOTAL_EFFECT] / tDstDetail[DK_REC_STAT_DETAIL.COUNT]) + tDstDetail[DK_REC_STAT_DETAIL.NZ_AVG_EFFECT] = math.floor(tDstDetail[DK_REC_STAT_DETAIL.TOTAL_EFFECT] / tDstDetail[DK_REC_STAT_DETAIL.NZ_COUNT]) + end + ------------------------ + -- # 节: tRecord.Skill + ------------------------ + -- 合并技能统计(四象轮回、两仪化形...) + for szEffectID, tSrcSkill in pairs(tSrc[DK_REC_STAT.SKILL]) do + if not bHideAnonymous or not select(2, D.GetEffectInfoAusID(data, szEffectID)) then + id = bMergeEffect + and D.GetEffectNameAusID(data, szChannel, szEffectID) + or szEffectID + tDstSkill = tDst[DK_REC_STAT.SKILL][id] + if not tDstSkill then + tDstSkill = { + tEffectID = {}, + [DK_REC_STAT_SKILL.COUNT ] = 0, -- 该玩家四象轮回释放次数(假设szEffectName是四象轮回) + [DK_REC_STAT_SKILL.NZ_COUNT ] = 0, -- 该玩家非零值四象轮回释放次数 + [DK_REC_STAT_SKILL.MAX ] = 0, -- 该玩家四象轮回最大输出量 + [DK_REC_STAT_SKILL.MAX_EFFECT ] = 0, -- 该玩家四象轮回最大有效输出量 + [DK_REC_STAT_SKILL.TOTAL ] = 0, -- 该玩家四象轮回输出量总和 + [DK_REC_STAT_SKILL.TOTAL_EFFECT ] = 0, -- 该玩家四象轮回有效输出量总和 + [DK_REC_STAT_SKILL.AVG ] = 0, -- 该玩家所有四象轮回平均伤害 + [DK_REC_STAT_SKILL.NZ_AVG ] = 0, -- 该玩家所有非零值四象轮回平均伤害 + [DK_REC_STAT_SKILL.AVG_EFFECT ] = 0, -- 该玩家所有四象轮回平均有效伤害 + [DK_REC_STAT_SKILL.NZ_AVG_EFFECT] = 0, -- 该玩家所有非零值四象轮回平均有效伤害 + [DK_REC_STAT_SKILL.DETAIL ] = {}, -- 该玩家四象轮回输出结果分类统计 + [DK_REC_STAT_SKILL.TARGET ] = {}, -- 该玩家四象轮回承受者统计 + } + tDst[DK_REC_STAT.SKILL][id] = tDstSkill + end + tDstSkill.tEffectID[szEffectID] = true + tDstSkill[DK_REC_STAT_SKILL.COUNT ] = tDstSkill[DK_REC_STAT_SKILL.COUNT] + tSrcSkill[DK_REC_STAT_SKILL.COUNT] + tDstSkill[DK_REC_STAT_SKILL.NZ_COUNT ] = tDstSkill[DK_REC_STAT_SKILL.NZ_COUNT] + tSrcSkill[DK_REC_STAT_SKILL.NZ_COUNT] + tDstSkill[DK_REC_STAT_SKILL.MAX ] = math.max(tDstSkill[DK_REC_STAT_SKILL.MAX], tSrcSkill[DK_REC_STAT_SKILL.MAX]) + tDstSkill[DK_REC_STAT_SKILL.MAX_EFFECT ] = math.max(tDstSkill[DK_REC_STAT_SKILL.MAX_EFFECT], tSrcSkill[DK_REC_STAT_SKILL.MAX_EFFECT]) + tDstSkill[DK_REC_STAT_SKILL.TOTAL ] = tDstSkill[DK_REC_STAT_SKILL.TOTAL] + tSrcSkill[DK_REC_STAT_SKILL.TOTAL] + tDstSkill[DK_REC_STAT_SKILL.TOTAL_EFFECT ] = tDstSkill[DK_REC_STAT_SKILL.TOTAL_EFFECT] + tSrcSkill[DK_REC_STAT_SKILL.TOTAL_EFFECT] + tDstSkill[DK_REC_STAT_SKILL.AVG ] = math.floor(tDstSkill[DK_REC_STAT_SKILL.TOTAL] / tDstSkill[DK_REC_STAT_SKILL.COUNT]) + tDstSkill[DK_REC_STAT_SKILL.AVG_EFFECT ] = math.floor(tDstSkill[DK_REC_STAT_SKILL.TOTAL_EFFECT] / tDstSkill[DK_REC_STAT_SKILL.COUNT]) + tDstSkill[DK_REC_STAT_SKILL.NZ_AVG ] = math.floor(tDstSkill[DK_REC_STAT_SKILL.TOTAL] / tDstSkill[DK_REC_STAT_SKILL.NZ_COUNT]) + tDstSkill[DK_REC_STAT_SKILL.NZ_AVG_EFFECT] = math.floor(tDstSkill[DK_REC_STAT_SKILL.TOTAL_EFFECT] / tDstSkill[DK_REC_STAT_SKILL.NZ_COUNT]) + --------------------------------- + -- # 节: tRecord.Skill[x].Detail + --------------------------------- + -- 合并技能详情统计(四象轮回的命中、会心...) + for nType, tSrcSkillDetail in pairs(tSrcSkill[DK_REC_STAT_SKILL.DETAIL]) do + tDstSkillDetail = tDstSkill[DK_REC_STAT_SKILL.DETAIL][nType] + if not tDstSkillDetail then + tDstSkillDetail = { + [DK_REC_STAT_SKILL_DETAIL.COUNT ] = 0, -- 命中记录数量 + [DK_REC_STAT_SKILL_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_SKILL_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_SKILL_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_SKILL_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_SKILL_DETAIL.TOTAL ] = 0, -- 所以命中总伤害 + [DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_SKILL_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_SKILL_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_SKILL_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_SKILL_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + tDstSkill[DK_REC_STAT_SKILL.DETAIL][nType] = tDstSkillDetail + end + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.COUNT ] = tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.COUNT] + tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.COUNT] + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT ] = tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT] + tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT] + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX ] = math.max(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT ] = math.max(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN ] = Min(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN ] = Min(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT ] = Min(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT] = Min(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT], tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL ] = tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL] + tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL] + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT ] = tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] + tSrcSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.AVG ] = math.floor(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL] / tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.COUNT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_AVG ] = math.floor(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL] / tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.AVG_EFFECT ] = math.floor(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] / tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.COUNT]) + tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_AVG_EFFECT] = math.floor(tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] / tDstSkillDetail[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT]) + end + ------------------------------ + -- # 节: tRecord.Skill.Target + ------------------------------ + -- 合并技能目标统计(四象轮回对江湖试炼木桩、江湖初级木桩...) + for dwID, tSrcSkillTarget in pairs(tSrcSkill[DK_REC_STAT_SKILL.TARGET]) do + id = bMergeNpc and D.GetNameAusID(data, dwID) or dwID + tDstSkillTarget = tDstSkill[DK_REC_STAT_SKILL.TARGET][id] + if not tDstSkillTarget then + tDstSkillTarget = { + [DK_REC_STAT_SKILL_TARGET.MAX ] = 0, -- 该玩家四象轮回击中的这个玩家最大伤害 + [DK_REC_STAT_SKILL_TARGET.MAX_EFFECT ] = 0, -- 该玩家四象轮回击中的这个玩家最大有效伤害 + [DK_REC_STAT_SKILL_TARGET.TOTAL ] = 0, -- 该玩家四象轮回击中的这个玩家伤害总和 + [DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] = 0, -- 该玩家四象轮回击中的这个玩家有效伤害总和 + [DK_REC_STAT_SKILL_TARGET.COUNT ] = {}, -- 该玩家四象轮回击中的这个玩家结果统计 + [DK_REC_STAT_SKILL_TARGET.NZ_COUNT ] = {}, -- 该玩家非零值四象轮回击中的这个玩家结果统计 + } + tDstSkill[DK_REC_STAT_SKILL.TARGET][id] = tDstSkillTarget + end + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX ] = tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX] + tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX] + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT ] = tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT] + tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT] + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL ] = tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL] + tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL] + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] = tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] + tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] + for k, v in pairs(tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.COUNT]) do + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.COUNT][k] = (tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.COUNT][k] or 0) + v + end + for k, v in pairs(tSrcSkillTarget[DK_REC_STAT_SKILL_TARGET.NZ_COUNT]) do + tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][k] = (tDstSkillTarget[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][k] or 0) + v + end + end + end + end + ------------------------ + -- # 节: tRecord.Target + ------------------------ + -- 合并目标统计(江湖试炼木桩、江湖初级木桩...) + for dwID, tSrcTarget in pairs(tSrc[DK_REC_STAT.TARGET]) do + id = bMergeNpc and D.GetNameAusID(data, dwID) or dwID + tDstTarget = tDst[DK_REC_STAT.TARGET][id] + if not tDstTarget then + tDstTarget = { + [DK_REC_STAT_TARGET.COUNT ] = 0, -- 该玩家对idTarget的技能释放次数 + [DK_REC_STAT_TARGET.NZ_COUNT ] = 0, -- 该玩家对idTarget的非零值技能释放次数 + [DK_REC_STAT_TARGET.MAX ] = 0, -- 该玩家对idTarget的技能最大输出量 + [DK_REC_STAT_TARGET.MAX_EFFECT ] = 0, -- 该玩家对idTarget的技能最大有效输出量 + [DK_REC_STAT_TARGET.TOTAL ] = 0, -- 该玩家对idTarget的技能输出量总和 + [DK_REC_STAT_TARGET.TOTAL_EFFECT ] = 0, -- 该玩家对idTarget的技能有效输出量总和 + [DK_REC_STAT_TARGET.AVG ] = 0, -- 该玩家对idTarget的技能平均输出量 + [DK_REC_STAT_TARGET.NZ_AVG ] = 0, -- 该玩家对idTarget的非零值技能平均输出量 + [DK_REC_STAT_TARGET.AVG_EFFECT ] = 0, -- 该玩家对idTarget的技能平均有效输出量 + [DK_REC_STAT_TARGET.NZ_AVG_EFFECT] = 0, -- 该玩家对idTarget的非零值技能平均有效输出量 + [DK_REC_STAT_TARGET.DETAIL ] = {}, -- 该玩家对idTarget的技能输出结果分类统计 + [DK_REC_STAT_TARGET.SKILL ] = {}, -- 该玩家对idTarget的技能具体分别统计 + } + tDst[DK_REC_STAT.TARGET][id] = tDstTarget + end + tDstTarget[DK_REC_STAT_TARGET.COUNT ] = tDstTarget[DK_REC_STAT_TARGET.COUNT] + tSrcTarget[DK_REC_STAT_TARGET.COUNT] + tDstTarget[DK_REC_STAT_TARGET.NZ_COUNT ] = tDstTarget[DK_REC_STAT_TARGET.NZ_COUNT] + tSrcTarget[DK_REC_STAT_TARGET.NZ_COUNT] + tDstTarget[DK_REC_STAT_TARGET.MAX ] = math.max(tDstTarget[DK_REC_STAT_TARGET.MAX], tSrcTarget[DK_REC_STAT_TARGET.MAX]) + tDstTarget[DK_REC_STAT_TARGET.MAX_EFFECT ] = math.max(tDstTarget[DK_REC_STAT_TARGET.MAX_EFFECT], tSrcTarget[DK_REC_STAT_TARGET.MAX_EFFECT]) + tDstTarget[DK_REC_STAT_TARGET.TOTAL ] = tDstTarget[DK_REC_STAT_TARGET.TOTAL] + tSrcTarget[DK_REC_STAT_TARGET.TOTAL] + tDstTarget[DK_REC_STAT_TARGET.TOTAL_EFFECT ] = tDstTarget[DK_REC_STAT_TARGET.TOTAL_EFFECT] + tSrcTarget[DK_REC_STAT_TARGET.TOTAL_EFFECT] + tDstTarget[DK_REC_STAT_TARGET.AVG ] = math.floor(tDstTarget[DK_REC_STAT_TARGET.TOTAL] / tDstTarget[DK_REC_STAT_TARGET.COUNT]) + tDstTarget[DK_REC_STAT_TARGET.AVG_EFFECT ] = math.floor(tDstTarget[DK_REC_STAT_TARGET.TOTAL_EFFECT] / tDstTarget[DK_REC_STAT_TARGET.COUNT]) + tDstTarget[DK_REC_STAT_TARGET.NZ_AVG ] = math.floor(tDstTarget[DK_REC_STAT_TARGET.TOTAL] / tDstTarget[DK_REC_STAT_TARGET.NZ_COUNT]) + tDstTarget[DK_REC_STAT_TARGET.NZ_AVG_EFFECT] = math.floor(tDstTarget[DK_REC_STAT_TARGET.TOTAL_EFFECT] / tDstTarget[DK_REC_STAT_TARGET.NZ_COUNT]) + ---------------------------------- + -- # 节: tRecord.Target[x].Detail + ---------------------------------- + -- 合并目标技能详情统计(四象轮回的命中、会心...) + for nType, tSrcTargetDetail in pairs(tSrcTarget[DK_REC_STAT_TARGET.DETAIL]) do + tDstTargetDetail = tDstTarget[DK_REC_STAT_TARGET.DETAIL][nType] + if not tDstTargetDetail then + tDstTargetDetail = { + [DK_REC_STAT_TARGET_DETAIL.COUNT ] = 0, -- 命中记录数量(假设nSkillResult是命中) + [DK_REC_STAT_TARGET_DETAIL.NZ_COUNT ] = 0, -- 非零值命中记录数量 + [DK_REC_STAT_TARGET_DETAIL.MAX ] = 0, -- 单次命中最大值 + [DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT ] = 0, -- 单次命中最大有效值 + [DK_REC_STAT_TARGET_DETAIL.MIN ] = -1, -- 单次命中最小值 + [DK_REC_STAT_TARGET_DETAIL.NZ_MIN ] = -1, -- 单次非零值命中最小值 + [DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT ] = -1, -- 单次命中最小有效值 + [DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT] = -1, -- 单次非零值命中最小有效值 + [DK_REC_STAT_TARGET_DETAIL.TOTAL ] = 0, -- 所以命中总伤害 + [DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT ] = 0, -- 所有命中总有效伤害 + [DK_REC_STAT_TARGET_DETAIL.AVG ] = 0, -- 所有命中平均伤害 + [DK_REC_STAT_TARGET_DETAIL.NZ_AVG ] = 0, -- 所有非零值命中平均伤害 + [DK_REC_STAT_TARGET_DETAIL.AVG_EFFECT ] = 0, -- 所有命中平均有效伤害 + [DK_REC_STAT_TARGET_DETAIL.NZ_AVG_EFFECT] = 0, -- 所有非零值命中平均有效伤害 + } + tDstTarget[DK_REC_STAT_TARGET.DETAIL][nType] = tDstTargetDetail + end + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.COUNT ] = tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.COUNT] + tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.COUNT] + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT ] = tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT] + tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT] + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX ] = math.max(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT ] = math.max(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN ] = Min(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN ] = Min(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT ] = Min(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT] = Min(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT], tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL ] = tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL] + tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL] + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT ] = tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] + tSrcTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.AVG ] = math.floor(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL] / tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.COUNT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_AVG ] = math.floor(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL] / tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.AVG_EFFECT ] = math.floor(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] / tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.COUNT]) + tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_AVG_EFFECT] = math.floor(tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] / tDstTargetDetail[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT]) + end + --------------------------------- + -- # 节: tRecord.Target[x].Skill + --------------------------------- + -- 合并目标技能统计(江湖试炼木桩被四象轮回、两仪化形...) + for szEffectID, tSrcTargetSkill in pairs(tSrcTarget[DK_REC_STAT_TARGET.SKILL]) do + if not bHideAnonymous or not select(2, D.GetEffectInfoAusID(data, szEffectID)) then + id = bMergeEffect + and D.GetEffectNameAusID(data, szChannel, szEffectID) + or szEffectID + tDstTargetSkill = tDstTarget[DK_REC_STAT_TARGET.SKILL][id] + if not tDstTargetSkill then + tDstTargetSkill = { + tEffectID = {}, + [DK_REC_STAT_TARGET_SKILL.MAX ] = 0, -- 该玩家击中这个玩家的四象轮回最大伤害 + [DK_REC_STAT_TARGET_SKILL.MAX_EFFECT ] = 0, -- 该玩家击中这个玩家的四象轮回最大有效伤害 + [DK_REC_STAT_TARGET_SKILL.TOTAL ] = 0, -- 该玩家击中这个玩家的四象轮回伤害总和 + [DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] = 0, -- 该玩家击中这个玩家的四象轮回有效伤害总和 + [DK_REC_STAT_TARGET_SKILL.COUNT ] = {}, -- 该玩家击中这个玩家的四象轮回结果统计 + [DK_REC_STAT_TARGET_SKILL.NZ_COUNT ] = {}, -- 该玩家非零值击中这个玩家的四象轮回结果统计 + } + tDstTarget[DK_REC_STAT_TARGET.SKILL][id] = tDstTargetSkill + end + tDstTargetSkill.tEffectID[szEffectID] = true + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX ] = math.max(tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX], tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX]) + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT ] = math.max(tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT], tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT]) + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL ] = tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL] + tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL] + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] = tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] + tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] + for k, v in pairs(tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.COUNT]) do + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.COUNT][k] = (tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.COUNT][k] or 0) + v + end + for k, v in pairs(tSrcTargetSkill[DK_REC_STAT_TARGET_SKILL.NZ_COUNT]) do + tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][k] = (tDstTargetSkill[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][k] or 0) + v + end + end + end + end +end +end + +do local tData +function D.GetMergeTargetData(data, szChannel, id, bMergeNpc, bMergeEffect, bHideAnonymous) + if not bMergeNpc and not bMergeEffect and not bHideAnonymous then + return data[szChannel][DK_REC.STAT][id] + end + tData = nil + for dwID, tSrcData in pairs(data[szChannel][DK_REC.STAT]) do + if dwID == id or D.GetNameAusID(data, dwID) == id then + if not tData then + tData = { + [DK_REC_STAT.TOTAL ] = 0, + [DK_REC_STAT.TOTAL_EFFECT] = 0, + [DK_REC_STAT.TARGET ] = {}, + [DK_REC_STAT.SKILL ] = {}, + [DK_REC_STAT.DETAIL ] = {}, + } + end + D.MergeTargetData(tData, tSrcData, data, szChannel, bMergeNpc, bMergeEffect, bHideAnonymous) + end + end + return tData +end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Recount_DS', + exports = { + { + fields = { + SKILL_RESULT = SKILL_RESULT, + SKILL_RESULT_NAME = SKILL_RESULT_NAME, + DK = DK, + DK_REC = DK_REC, + DK_REC_STAT = DK_REC_STAT, + DK_REC_STAT_DETAIL = DK_REC_STAT_DETAIL, + DK_REC_STAT_SKILL = DK_REC_STAT_SKILL, + DK_REC_STAT_SKILL_DETAIL = DK_REC_STAT_SKILL_DETAIL, + DK_REC_STAT_SKILL_TARGET = DK_REC_STAT_SKILL_TARGET, + DK_REC_STAT_TARGET = DK_REC_STAT_TARGET, + DK_REC_STAT_TARGET_DETAIL = DK_REC_STAT_TARGET_DETAIL, + DK_REC_STAT_TARGET_SKILL = DK_REC_STAT_TARGET_SKILL, + 'GetHistoryRoot', + 'GetHistoryFiles', + 'Get', + 'Del', + 'GeneAwayTime', + 'GeneFightTime', + 'GetNameAusID', + 'GetBaseNameAusID', + 'GetForceAusID', + 'GetEffectInfoAusID', + 'GetEffectNameAusID', + 'Flush', + 'GetMergeTargetData', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'bSaveHistoryOnExit', + 'bSaveHistoryOnExFi', + 'nMaxHistory', + 'nMinFightTime', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bSaveHistoryOnExit', + 'bSaveHistoryOnExFi', + 'nMaxHistory', + 'nMinFightTime', + }, + triggers = { + bEnable = function() + MY_Recount_UI.CheckOpen() + end, + }, + root = O, + }, + }, +} +MY_Recount_DS = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterInit('MY_Recount_DS', function() + D.InitData() +end) + +X.RegisterFlush('MY_Recount_DS', function() + if O.bSaveHistoryOnExit then + D.SaveHistory() + end +end) + +X.RegisterUserSettingsInit('MY_Recount_DS', function() + D.bReady = true +end) + +X.RegisterUserSettingsRelease('MY_Recount_DS', function() + D.bReady = false +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Recount/src/MY_Recount_DT.lua b/MY_Recount/src/MY_Recount_DT.lua new file mode 100644 index 000000000..9ecaec96d --- /dev/null +++ b/MY_Recount/src/MY_Recount_DT.lua @@ -0,0 +1,544 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗统计 详情界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Recount/MY_Recount_DT' +local PLUGIN_NAME = 'MY_Recount' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Recount' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local DK = MY_Recount_DS.DK +local DK_REC_STAT_SKILL = MY_Recount_DS.DK_REC_STAT_SKILL +local DK_REC_STAT_SKILL_DETAIL = MY_Recount_DS.DK_REC_STAT_SKILL_DETAIL +local DK_REC_STAT_SKILL_TARGET = MY_Recount_DS.DK_REC_STAT_SKILL_TARGET +local DK_REC_STAT_TARGET = MY_Recount_DS.DK_REC_STAT_TARGET +local DK_REC_STAT_TARGET_DETAIL = MY_Recount_DS.DK_REC_STAT_TARGET_DETAIL +local DK_REC_STAT_TARGET_SKILL = MY_Recount_DS.DK_REC_STAT_TARGET_SKILL + +local DK_REC_STAT = MY_Recount_DS.DK_REC_STAT +local D = {} +local SZ_INI = PLUGIN_ROOT .. '/ui/MY_Recount_DT.ini' +local STAT_TYPE = MY_Recount.STAT_TYPE +local STAT_TYPE_LIST = MY_Recount.STAT_TYPE_LIST +local STAT_TYPE_KEY = MY_Recount.STAT_TYPE_KEY +local STAT_TYPE_NAME = MY_Recount.STAT_TYPE_NAME +local SKILL_RESULT = MY_Recount.SKILL_RESULT +local SKILL_RESULT_NAME = MY_Recount.SKILL_RESULT_NAME + +function D.InsertFromText(aTabTalk, h) + local aText = {} + for i = 0, h:GetItemCount() - 1 do + local p = h:Lookup(i) + if p:GetType() == 'Text' then + table.insert(aText, p:GetText()) + end + end + table.insert(aTabTalk, aText) +end + +function D.GetDetailMenu(frame) + local t = {} + local DataDisplay = MY_Recount.GetDisplayData() + local eTimeChannel = MY_Recount_UI.bSysTimeMode and STAT_TYPE_KEY[MY_Recount_UI.nChannel] + local function Publish(nChannel, nLimit) + local bDetail = frame:Lookup('', 'Handle_Spliter'):IsVisible() + X.SendChat( + nChannel, + '[' .. X.PACKET_INFO.SHORT_NAME .. ']' + .. _L['Fight recount'] .. ' - ' + .. frame:Lookup('', 'Text_Default'):GetText() + .. ' ' .. ((DataDisplay[DK.BOSSNAME] and ' - ' .. DataDisplay[DK.BOSSNAME]) or '') + .. '(' .. X.FormatDuration(MY_Recount_DS.GeneFightTime(DataDisplay, eTimeChannel), 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) .. ')', + { parsers = { name = false } } + ) + X.SendChat(nChannel, '------------------------------') + + local aTabTalk = {} + D.InsertFromText(aTabTalk, frame:Lookup('WndScroll_Skill', 'Handle_SkillTitle')) + local hList = frame:Lookup('WndScroll_Skill', 'Handle_SkillList') + if bDetail then + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + if hItem:Lookup('Shadow_SkillEntry'):IsVisible() then + D.InsertFromText(aTabTalk, hItem) + break + end + end + else + for i = 0, math.min(hList:GetItemCount(), nLimit) - 1 do + D.InsertFromText(aTabTalk, hList:Lookup(i)) + end + end + X.SendTabChat(nChannel, aTabTalk, {'L', 'L', 'R', 'R', 'R'}) + X.SendChat(nChannel, '------------------------------') + + if bDetail then + local aTabTalk = {} + D.InsertFromText(aTabTalk, frame:Lookup('WndScroll_Detail', 'Handle_DetailTitle')) + local hList = frame:Lookup('WndScroll_Detail', 'Handle_DetailList') + for i = 0, hList:GetItemCount() - 1 do + D.InsertFromText(aTabTalk, hList:Lookup(i)) + end + X.SendTabChat(nChannel, aTabTalk, {'L', 'L', 'R', 'R', 'R', 'R', 'R'}) + X.SendChat(nChannel, '------------------------------') + + local aTabTalk = {} + D.InsertFromText(aTabTalk, frame:Lookup('WndScroll_Target', 'Handle_TargetTitle')) + local hList = frame:Lookup('WndScroll_Target', 'Handle_TargetList') + for i = 0, math.min(hList:GetItemCount(), nLimit) - 1 do + D.InsertFromText(aTabTalk, hList:Lookup(i)) + end + X.SendTabChat(nChannel, aTabTalk, {'L', 'L', 'R', 'R', 'R', 'R', 'R', 'R'}) + X.SendChat(nChannel, '------------------------------') + end + end + for nChannel, szChannel in pairs({ + [PLAYER_TALK_CHANNEL.RAID] = 'MSG_TEAM', + [PLAYER_TALK_CHANNEL.TEAM] = 'MSG_PARTY', + [PLAYER_TALK_CHANNEL.TONG] = 'MSG_GUILD', + }) do + local t1 = { + szOption = g_tStrings.tChannelName[szChannel], + bCheck = true, -- 不设置成可选框不能点╭∩╮(︶︿︶)╭∩╮垃圾 + fnAction = function() + Publish(nChannel, math.huge) + X.UI.ClosePopupMenu() + end, + rgb = GetMsgFontColor(szChannel, true), + } + for _, nLimit in ipairs({1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 50, 100}) do + table.insert(t1, { + szOption = _L('Top %d', nLimit), + fnAction = function() Publish(nChannel, nLimit) end, + }) + end + table.insert(t, t1) + end + + return t +end + +function D.OnFrameBreathe() + if this.nLastRedrawFrame + and GetLogicFrameCount() - this.nLastRedrawFrame > 0 + and GetLogicFrameCount() - this.nLastRedrawFrame < MY_Recount_UI.nDrawInterval then + return + end + this.nLastRedrawFrame = GetLogicFrameCount() + + local id = this.id + local szChannel = STAT_TYPE_KEY[this.nChannel] + local DataDisplay = MY_Recount.GetDisplayData() + if tonumber(id) then + id = tonumber(id) + end + + -- 更新标题 + local szName = X.IsString(id) and id or MY_Recount_DS.GetNameAusID(DataDisplay, id) + this:Lookup('Wnd_Bg', 'Text_Default'):SetText(szName .. ' ' .. STAT_TYPE_NAME[this.nChannel]) + + -- 获取数据 + local tData = MY_Recount_DS.GetMergeTargetData(DataDisplay, szChannel, id, MY_Recount_UI.bGroupSameNpc, MY_Recount_UI.bGroupSameEffect) + if not tData then + this:Lookup('WndScroll_Detail', 'Handle_DetailList'):Clear() + this:Lookup('WndScroll_Skill' , 'Handle_SkillList' ):Clear() + this:Lookup('WndScroll_Target', 'Handle_TargetList'):Clear() + return + end + + local szPrimarySort = this.szPrimarySort or DK_REC_STAT.SKILL + local szSecondarySort = (szPrimarySort == DK_REC_STAT.SKILL and DK_REC_STAT_SKILL.TARGET) or DK_REC_STAT_TARGET.SKILL + + --------------- 一、技能列表更新 ----------------- + -- 数据收集 + local aResult, nTotal = {}, MY_Recount_UI.bShowEffect and tData[DK_REC_STAT.TOTAL_EFFECT] or tData[DK_REC_STAT.TOTAL] + if szPrimarySort == DK_REC_STAT.SKILL then + for szEffectID, p in pairs(tData[DK_REC_STAT.SKILL]) do + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatSkillContainsImportantEffect(szEffectID, p) + local rec = { + szKey = szEffectID, + szName = MY_Recount_DS.GetEffectNameAusID(DataDisplay, szChannel, szEffectID) or szEffectID, + nCount = not bShowZeroVal and p[DK_REC_STAT_SKILL.NZ_COUNT] or p[DK_REC_STAT_SKILL.COUNT], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_SKILL.TOTAL_EFFECT] or p[DK_REC_STAT_SKILL.TOTAL], + } + if (bShowZeroVal or rec.nTotal > 0) + and (not MY_Recount_UI.bHideAnonymous or rec.szName:sub(1, 1) ~= '#') then + table.insert(aResult, rec) + end + end + else + for id, p in pairs(tData[DK_REC_STAT.TARGET]) do + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatTargetContainsImportantEffect(p) + local rec = { + szKey = id , + szName = X.IsString(id) and id or MY_Recount_DS.GetNameAusID(DataDisplay, id), + nCount = not bShowZeroVal and p[DK_REC_STAT_TARGET.NZ_COUNT] or p[DK_REC_STAT_TARGET.COUNT], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_TARGET.TOTAL_EFFECT] or p[DK_REC_STAT_TARGET.TOTAL], + } + if bShowZeroVal or rec.nTotal > 0 then + table.insert(aResult, rec) + end + end + end + table.sort(aResult, function(p1, p2) return p1.nTotal > p2.nTotal end) + -- 默认选中第一个 + if this.bFirstRendering then + if aResult[1] then + if szPrimarySort == DK_REC_STAT.SKILL then + this.szSelectedSkill = aResult[1].szKey + else + this.szSelectedTarget = aResult[1].szKey + end + end + this.bFirstRendering = nil + end + local szSelected + local szSelectedSkill = this.szSelectedSkill + local szSelectedTarget = this.szSelectedTarget + if szPrimarySort == DK_REC_STAT.SKILL then + szSelected = this.szSelectedSkill + else + szSelected = this.szSelectedTarget + end + -- 界面重绘 + local hSelectedItem + this:Lookup('WndScroll_Skill'):SetSize(480, 96) + this:Lookup('WndScroll_Skill', ''):SetSize(480, 96) + this:Lookup('WndScroll_Skill', ''):FormatAllItemPos() + local hList = this:Lookup('WndScroll_Skill', 'Handle_SkillList') + hList:SetSize(480, 80) + for i, p in ipairs(aResult) do + local hItem = hList:Lookup(i - 1) or hList:AppendItemFromIni(SZ_INI, 'Handle_SkillItem') + hItem:Lookup('Text_SkillNo'):SetText(i) + hItem:Lookup('Text_SkillName'):SetText(MY_Recount.GetTargetShowName(p.szName, szPrimarySort == DK_REC_STAT.TARGET and p.dwForceID ~= -1)) + hItem:Lookup('Text_SkillCount'):SetText(p.nCount) + hItem:Lookup('Text_SkillTotal'):SetText(p.nTotal) + hItem:Lookup('Text_SkillPercentage'):SetText(nTotal > 0 and _L('%.1f%%', (i == 1 and math.ceil or math.floor)(p.nTotal / nTotal * 1000) / 10) or ' - ') + + if szPrimarySort == DK_REC_STAT.SKILL and szSelectedSkill == p.szKey + or szPrimarySort == DK_REC_STAT.TARGET and szSelectedTarget == p.szKey then + hSelectedItem = hItem + hItem:Lookup('Shadow_SkillEntry'):Show() + else + hItem:Lookup('Shadow_SkillEntry'):Hide() + end + hItem.szKey = p.szKey + end + for i = hList:GetItemCount() - 1, #aResult, -1 do + hList:RemoveItem(i) + end + hList:FormatAllItemPos() + + if szSelected and tData[szPrimarySort][szSelected] then + this:Lookup('Wnd_Bg', 'Handle_Spliter'):Show() + --------------- 二、技能释放结果列表更新 ----------------- + -- 数据收集 + local aResult, nCountSum, bShowZeroVal = {}, 0 + if szPrimarySort == DK_REC_STAT.SKILL then + bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatSkillContainsImportantEffect(szSelected, tData[DK_REC_STAT.SKILL][szSelected]) + nCountSum = not bShowZeroVal + and tData[DK_REC_STAT.SKILL][szSelected][DK_REC_STAT_SKILL.NZ_COUNT] + or tData[DK_REC_STAT.SKILL][szSelected][DK_REC_STAT_SKILL.COUNT] + for nSkillResult, p in pairs(tData[DK_REC_STAT.SKILL][szSelected][DK_REC_STAT_SKILL.DETAIL]) do + local res = { + nCount = not bShowZeroVal and p[DK_REC_STAT_SKILL_DETAIL.NZ_COUNT] or p[DK_REC_STAT_SKILL_DETAIL.COUNT], + nMin = not MY_Recount_UI.bShowEffect + and (not bShowZeroVal and p[DK_REC_STAT_SKILL_DETAIL.NZ_MIN] or p[DK_REC_STAT_SKILL_DETAIL.MIN]) + or (not bShowZeroVal and p[DK_REC_STAT_SKILL_DETAIL.NZ_MIN_EFFECT] or p[DK_REC_STAT_SKILL_DETAIL.MIN_EFFECT]), + nAvg = not MY_Recount_UI.bShowEffect + and (not bShowZeroVal and p[DK_REC_STAT_SKILL_DETAIL.NZ_AVG] or p[DK_REC_STAT_SKILL_DETAIL.AVG]) + or (not bShowZeroVal and p[DK_REC_STAT_SKILL_DETAIL.NZ_AVG_EFFECT] or p[DK_REC_STAT_SKILL_DETAIL.AVG_EFFECT]), + nMax = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_SKILL_DETAIL.MAX_EFFECT] or p[DK_REC_STAT_SKILL_DETAIL.MAX], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_SKILL_DETAIL.TOTAL_EFFECT] or p[DK_REC_STAT_SKILL_DETAIL.TOTAL], + szSkillResult = SKILL_RESULT_NAME[nSkillResult], + } + if res.nCount > 0 then + table.insert(aResult, res) + end + end + else + bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatTargetContainsImportantEffect(tData[DK_REC_STAT.TARGET][szSelected]) + nCountSum = not bShowZeroVal + and tData[DK_REC_STAT.TARGET][szSelected][DK_REC_STAT_TARGET.NZ_COUNT] + or tData[DK_REC_STAT.TARGET][szSelected][DK_REC_STAT_TARGET.COUNT] + for nSkillResult, p in pairs(tData[DK_REC_STAT.TARGET][szSelected][DK_REC_STAT_TARGET.DETAIL]) do + local res = { + nCount = not bShowZeroVal and p[DK_REC_STAT_TARGET_DETAIL.NZ_COUNT] or p[DK_REC_STAT_TARGET_DETAIL.COUNT], + nMin = not MY_Recount_UI.bShowEffect + and (not bShowZeroVal and p[DK_REC_STAT_TARGET_DETAIL.NZ_MIN] or p[DK_REC_STAT_TARGET_DETAIL.MIN]) + or (not bShowZeroVal and p[DK_REC_STAT_TARGET_DETAIL.NZ_MIN_EFFECT] or p[DK_REC_STAT_TARGET_DETAIL.MIN_EFFECT]), + nAvg = not MY_Recount_UI.bShowEffect + and (not bShowZeroVal and p[DK_REC_STAT_TARGET_DETAIL.NZ_AVG] or p[DK_REC_STAT_TARGET_DETAIL.AVG]) + or (not bShowZeroVal and p[DK_REC_STAT_TARGET_DETAIL.NZ_AVG_EFFECT] or p[DK_REC_STAT_TARGET_DETAIL.AVG_EFFECT]), + nMax = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_TARGET_DETAIL.MAX_EFFECT] or p[DK_REC_STAT_TARGET_DETAIL.MAX], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_TARGET_DETAIL.TOTAL_EFFECT] or p[DK_REC_STAT_TARGET_DETAIL.TOTAL], + szSkillResult = SKILL_RESULT_NAME[nSkillResult], + } + if res.nCount > 0 then + table.insert(aResult, res) + end + end + end + table.sort(aResult, function(p1, p2) return p1.nAvg > p2.nAvg end) + -- 界面重绘 + this:Lookup('WndScroll_Detail'):Show() + local hList = this:Lookup('WndScroll_Detail', 'Handle_DetailList') + for i, p in ipairs(aResult) do + local hItem = hList:Lookup(i - 1) or hList:AppendItemFromIni(SZ_INI, 'Handle_DetailItem') + hItem:Lookup('Text_DetailNo'):SetText(i) + hItem:Lookup('Text_DetailType'):SetText(p.szSkillResult) + hItem:Lookup('Text_DetailMin'):SetText(p.nMin) + hItem:Lookup('Text_DetailAverage'):SetText(p.nAvg) + hItem:Lookup('Text_DetailMax'):SetText(p.nMax) + hItem:Lookup('Text_DetailCount'):SetText(p.nCount) + hItem:Lookup('Text_DetailPercent'):SetText(nCountSum > 0 + and _L('%.1f%%', (i == 1 and math.ceil or math.floor)(p.nCount / nCountSum * 1000) / 10) + or ' - ') + end + for i = hList:GetItemCount() - 1, #aResult, -1 do + hList:RemoveItem(i) + end + hList:FormatAllItemPos() + + -- 调整滚动条 增强用户体验 + if hSelectedItem and not this:Lookup('WndScroll_Target'):IsVisible() then + -- 说明是刚从未选择状态切换过来 滚动条滚动到选中项 + local hScroll = this:Lookup('WndScroll_Skill/Scroll_Skill_List') + hScroll:SetScrollPos(math.ceil(hScroll:GetStepCount() * hSelectedItem:GetIndex() / hSelectedItem:GetParent():GetItemCount())) + end + + --------------- 三、技能释放结果列表更新 ----------------- + -- 数据收集 + local aResult, nTotal = {}, 0 + if szPrimarySort == DK_REC_STAT.SKILL then + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatSkillContainsImportantEffect(szSelectedSkill, tData[DK_REC_STAT.SKILL][szSelectedSkill]) + for id, p in pairs(tData[DK_REC_STAT.SKILL][szSelectedSkill][DK_REC_STAT_SKILL.TARGET]) do + local rec = { + szKey = id, + nHitCount = bShowZeroVal + and ( + (p[DK_REC_STAT_SKILL_TARGET.COUNT][SKILL_RESULT.HIT] or 0) + + (p[DK_REC_STAT_SKILL_TARGET.COUNT][SKILL_RESULT.ABSORB] or 0) + ) + or ( + (p[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][SKILL_RESULT.HIT] or 0) + + (p[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][SKILL_RESULT.ABSORB] or 0) + ), + nMissCount = bShowZeroVal + and (p[DK_REC_STAT_SKILL_TARGET.COUNT][SKILL_RESULT.MISS] or 0) + or p[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][SKILL_RESULT.MISS] or 0, + nCriticalCount = bShowZeroVal + and (p[DK_REC_STAT_SKILL_TARGET.COUNT][SKILL_RESULT.CRITICAL] or 0) + or p[DK_REC_STAT_SKILL_TARGET.NZ_COUNT][SKILL_RESULT.CRITICAL] or 0, + nMax = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_SKILL_TARGET.MAX_EFFECT] or p[DK_REC_STAT_SKILL_TARGET.MAX], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_SKILL_TARGET.TOTAL_EFFECT] or p[DK_REC_STAT_SKILL_TARGET.TOTAL], + szName = X.IsString(id) and id or MY_Recount_DS.GetNameAusID(DataDisplay, id), + } + if bShowZeroVal or rec.nTotal > 0 or rec.nMissCount > 0 then + table.insert(aResult, rec) + end + end + nTotal = tData[DK_REC_STAT.SKILL][szSelected][MY_Recount_UI.bShowEffect and DK_REC_STAT_SKILL.TOTAL_EFFECT or DK_REC_STAT_SKILL.TOTAL] + else + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatTargetContainsImportantEffect(tData[DK_REC_STAT.TARGET][szSelectedTarget]) + for szEffectID, p in pairs(tData[DK_REC_STAT.TARGET][szSelectedTarget][DK_REC_STAT_TARGET.SKILL]) do + local rec = { + nHitCount = bShowZeroVal + and (p[DK_REC_STAT_TARGET_SKILL.COUNT][SKILL_RESULT.HIT] or 0) + or p[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][SKILL_RESULT.HIT] or 0, + nMissCount = bShowZeroVal + and (p[DK_REC_STAT_TARGET_SKILL.COUNT][SKILL_RESULT.MISS] or 0) + or p[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][SKILL_RESULT.MISS] or 0, + nCriticalCount = bShowZeroVal + and (p[DK_REC_STAT_TARGET_SKILL.COUNT][SKILL_RESULT.CRITICAL] or 0) + or p[DK_REC_STAT_TARGET_SKILL.NZ_COUNT][SKILL_RESULT.CRITICAL] or 0, + nMax = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_TARGET_SKILL.MAX_EFFECT] or p[DK_REC_STAT_TARGET_SKILL.MAX], + nTotal = MY_Recount_UI.bShowEffect and p[DK_REC_STAT_TARGET_SKILL.TOTAL_EFFECT] or p[DK_REC_STAT_TARGET_SKILL.TOTAL], + szName = MY_Recount_DS.GetEffectNameAusID(DataDisplay, szChannel, szEffectID) or szEffectID, + } + if (bShowZeroVal or rec.nTotal > 0 or rec.nMissCount > 0) + and (not MY_Recount_UI.bHideAnonymous or rec.szName:sub(1, 1) ~= '#') then + table.insert(aResult, rec) + end + end + nTotal = tData[DK_REC_STAT.TARGET][szSelected][MY_Recount_UI.bShowEffect and DK_REC_STAT_TARGET.TOTAL_EFFECT or DK_REC_STAT_TARGET.TOTAL] + end + table.sort(aResult, function(p1, p2) return p1.nTotal > p2.nTotal end) + -- 界面重绘 + this:Lookup('WndScroll_Target'):Show() + local hList = this:Lookup('WndScroll_Target', 'Handle_TargetList') + for i, p in ipairs(aResult) do + local hItem = hList:Lookup(i - 1) or hList:AppendItemFromIni(SZ_INI, 'Handle_TargetItem') + hItem:Lookup('Text_TargetNo'):SetText(i) + hItem:Lookup('Text_TargetName'):SetText(MY_Recount.GetTargetShowName(p.szName, szPrimarySort == DK_REC_STAT.SKILL and p.dwForceID ~= -1)) + hItem:Lookup('Text_TargetTotal'):SetText(p.nTotal) + hItem:Lookup('Text_TargetMax'):SetText(p.nMax) + hItem:Lookup('Text_TargetHit'):SetText(p.nHitCount) + hItem:Lookup('Text_TargetCritical'):SetText(p.nCriticalCount) + hItem:Lookup('Text_TargetMiss'):SetText(p.nMissCount) + hItem:Lookup('Text_TargetPercent'):SetText((nTotal > 0 and _L('%.1f%%', (i == 1 and math.ceil or math.floor)(p.nTotal / nTotal * 1000) / 10) or ' - ')) + hItem.szKey = p.szKey + end + for i = hList:GetItemCount() - 1, #aResult, -1 do + hList:RemoveItem(i) + end + hList:FormatAllItemPos() + else + this:Lookup('WndScroll_Skill'):SetSize(480, 348) + this:Lookup('WndScroll_Skill', ''):SetSize(480, 348) + this:Lookup('WndScroll_Skill', 'Handle_SkillList'):SetSize(480, 332) + this:Lookup('WndScroll_Skill', 'Handle_SkillList'):FormatAllItemPos() + this:Lookup('WndScroll_Skill', ''):FormatAllItemPos() + this:Lookup('WndScroll_Detail'):Hide() + this:Lookup('WndScroll_Target'):Hide() + this:Lookup('', 'Handle_Spliter'):Hide() + end + +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + this.nLastRedrawFrame = nil + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Close' then + X.RegisterEsc(this:GetRoot():GetTreePath(), false) + X.UI.CloseFrame(this:GetRoot()) + elseif name == 'Btn_Switch' then + if this:GetRoot().szPrimarySort == DK_REC_STAT.SKILL then + this:GetRoot().szPrimarySort = DK_REC_STAT.TARGET + else + this:GetRoot().szPrimarySort = DK_REC_STAT.SKILL + end + this:GetRoot().nLastRedrawFrame = 0 + elseif name == 'Btn_Unselect' then + this:GetRoot().szSelectedSkill = nil + this:GetRoot().szSelectedTarget = nil + this:GetRoot().nLastRedrawFrame = 0 + elseif name == 'Btn_Issuance' then + PopupMenu(D.GetDetailMenu(this:GetRoot())) + end +end + +function D.OnItemLButtonDown() + local name = this:GetName() + if name == 'Handle_SkillItem' then + if this:GetRoot().szPrimarySort == DK_REC_STAT.SKILL then + this:GetRoot().szSelectedSkill = this.szKey + else + this:GetRoot().szSelectedTarget = this.szKey + end + this:GetRoot().nLastRedrawFrame = 0 + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if (name == 'Handle_SkillItem' and this:GetRoot().szPrimarySort == DK_REC_STAT.TARGET) + or (name == 'Handle_TargetItem' and this:GetRoot().szPrimarySort == DK_REC_STAT.SKILL) then + local szKey = this.szKey + local menu = {} + menu.x, menu.y = Cursor.GetPos(true) + for _, k in ipairs(STAT_TYPE_LIST) do + table.insert(menu, { + szOption = STAT_TYPE_NAME[STAT_TYPE[k]], + fnAction = function() + D.Open(szKey, STAT_TYPE[k]) + end, + }) + end + PopupMenu(menu) + end +end + +function D.OnItemLButtonDBClick() + local name = this:GetName() + if (name == 'Handle_SkillItem' and this:GetRoot().szPrimarySort == DK_REC_STAT.TARGET) + or (name == 'Handle_TargetItem' and this:GetRoot().szPrimarySort == DK_REC_STAT.SKILL) then + D.Open(this.szKey, this:GetRoot().nChannel) + end +end + +function D.Open(id, nChannel) + local szFrameName = 'MY_Recount_DT#' .. id .. '_' .. nChannel + if Station.SearchFrame(szFrameName) then + return + end + local frame = X.UI.CreateFrame('MY_Recount_DT', { text = '', theme = X.UI.FRAME_THEME.SIMPLE, close = false, w = 480, h = 387 }):Raw() + X.UI.AppendFromIni(frame, SZ_INI, 'Wnd_Total', true) + frame:SetName(szFrameName) + frame.id = tonumber(id) or id + frame.nChannel = tonumber(nChannel) + frame.bFirstRendering = true + frame.szPrimarySort = ((frame.nChannel == STAT_TYPE.DPS or frame.nChannel == STAT_TYPE.HPS) and DK_REC_STAT.SKILL) or DK_REC_STAT.TARGET + frame.szSecondarySort = ((frame.nChannel == STAT_TYPE.DPS or frame.nChannel == STAT_TYPE.HPS) and DK_REC_STAT.TARGET) or DK_REC_STAT.SKILL + frame:Lookup('WndScroll_Target', 'Handle_TargetTitle/Text_TargetTitle_5'):SetText(g_tStrings.STR_HIT_NAME) + frame:Lookup('WndScroll_Target', 'Handle_TargetTitle/Text_TargetTitle_6'):SetText(g_tStrings.STR_CS_NAME) + frame:Lookup('WndScroll_Target', 'Handle_TargetTitle/Text_TargetTitle_7'):SetText(g_tStrings.STR_MSG_MISS) + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + X.UI.AdaptComponentAppearance(frame:Lookup('WndScroll_Skill/Scroll_Skill_List')) + X.UI.AdaptComponentAppearance(frame:Lookup('WndScroll_Detail/Scroll_Detail_List')) + X.UI.AdaptComponentAppearance(frame:Lookup('WndScroll_Target/Scroll_Target_List')) + + local function canEsc() + if frame and frame:IsValid() then + return true + else + X.RegisterEsc(szFrameName, false) + end + end + local function onEsc() + if frame.szSelectedSkill or frame.szSelectedTarget then + frame.szSelectedSkill = nil + frame.szSelectedTarget = nil + else + X.RegisterEsc(szFrameName, false) + X.UI.CloseFrame(frame) + end + end + X.RegisterEsc(szFrameName, canEsc, onEsc) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Recount_DT', + exports = { + { + preset = 'UIEvent', + fields = { + 'Open', + }, + root = D, + }, + }, +} +MY_Recount_DT = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Recount/src/MY_Recount_UI.lua b/MY_Recount/src/MY_Recount_UI.lua new file mode 100644 index 000000000..147c2896d --- /dev/null +++ b/MY_Recount/src/MY_Recount_UI.lua @@ -0,0 +1,832 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗统计 主界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Recount/MY_Recount_UI' +local PLUGIN_NAME = 'MY_Recount' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Recount' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local DK = MY_Recount_DS.DK +local DK_REC = MY_Recount_DS.DK_REC +local DK_REC_STAT = MY_Recount_DS.DK_REC_STAT +local DK_REC_STAT_SKILL = MY_Recount_DS.DK_REC_STAT_SKILL +local DK_REC_STAT_SKILL_DETAIL = MY_Recount_DS.DK_REC_STAT_SKILL_DETAIL + +local DISPLAY_MODE = { -- 统计显示 + NPC = 1, -- 只显示NPC + PLAYER = 2, -- 只显示玩家 + BOTH = 3, -- 混合显示 +} +local SZ_INI = PLUGIN_ROOT .. '/ui/MY_Recount_UI.ini' +local STAT_TYPE = MY_Recount.STAT_TYPE +local STAT_TYPE_LIST = MY_Recount.STAT_TYPE_LIST +local STAT_TYPE_KEY = MY_Recount.STAT_TYPE_KEY +local STAT_TYPE_UNIT = MY_Recount.STAT_TYPE_UNIT +local STAT_TYPE_NAME = MY_Recount.STAT_TYPE_NAME +local SKILL_RESULT = MY_Recount.SKILL_RESULT +local SKILL_RESULT_NAME = MY_Recount.SKILL_RESULT_NAME +local RANK_FRAME = { + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193 +} +local FORCE_BAR_CSS = setmetatable({ + [1] = setmetatable({}, { + __index = function(t, k) + local r, g, b = X.GetForceColor(k, 'background') + t[k] = { r = r, g = g, b = b } + return t[k] + end, + }), + [2] = setmetatable({}, { + __index = function(t, k) + local tUI = Table_GetForceUI(k) + if not tUI then + tUI = Table_GetForceUI(0) + end + t[k] = { image = tUI.fight_state_image, frame = tUI.fight_state_img_Frame } + return t[k] + end, + }), +}, { __index = function(t, k) return t[1] end }) + +local O = X.CreateUserSettingsModule('MY_Recount_UI', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Enable UI'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 0, y = -70, s = 'BOTTOMRIGHT', r = 'BOTTOMRIGHT' }, + }, + nCss = { -- 当前样式表 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Theme'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nChannel = { -- 当前显示的统计模式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Current recount display channel'], + }), + xSchema = X.Schema.Number, + xDefaultValue = STAT_TYPE.DPS, + }, + bAwayMode = { -- 计算DPS时是否减去暂离时间 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Uncount awaytime'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSysTimeMode = { -- 使用官方战斗统计计时方式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Use system time count'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bGroupSameNpc = { -- 是否合并同名NPC数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Group npc with same name'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bGroupSameEffect = { -- 是否合并同名效果 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Group effect with same name'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bHideAnonymous = { -- 隐藏没名字的数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Hide anonymous effect'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowPerSec = { -- 显示为每秒数据(反之显示总和) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Display as per second'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowEffect = { -- 显示有效伤害/治疗 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Display effective value'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowZeroVal = { -- 显示零值记录 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Show zero value effect'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSimplifyValue = { -- 显示简化数值 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Simplify value'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nDisplayMode = { -- 统计显示模式(显示NPC/玩家数据)(默认混合显示) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Switch recount mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = DISPLAY_MODE.BOTH, + }, + nDrawInterval = { -- UI重绘周期(帧) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Redraw interval'], + }), + xSchema = X.Schema.Number, + xDefaultValue = X.ENVIRONMENT.GAME_FPS / 2, + }, + bShowNodataTeammate = { -- 显示没有数据的队友 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Recount'], + szDescription = X.MakeCaption({ + _L['Show nodata teammate'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.Open() + X.UI.OpenFrame(SZ_INI, 'MY_Recount_UI') +end + +function D.Close() + X.UI.CloseFrame('MY_Recount_UI') +end + +function D.CheckOpen() + if MY_Recount_DS.bEnable and O.bEnable then + D.Open() + else + D.Close() + end +end + +function D.UpdateAnchor(frame) + local an = O.anchor + frame:SetPoint(an.s, 0, 0, an.r, an.x, an.y) + frame:CorrectPos() +end + +-- 重绘整个界面 +function D.DrawUI(frame) + frame:Lookup('Wnd_Title', 'Text_Title'):SetText(STAT_TYPE_NAME[MY_Recount_UI.nChannel]) + frame:Lookup('Wnd_Main', 'Handle_List'):Clear() + frame:Lookup('Wnd_Main', 'Handle_Me').bInited = nil + D.UpdateUI(frame) +end + +-- 刷新数据绘制 +function D.UpdateUI(frame) + local data = MY_Recount.GetDisplayData() + if not data then + return + end + + -- 获取统计数据 + local eDKKey = STAT_TYPE_KEY[MY_Recount_UI.nChannel] + if not eDKKey then + return + end + local tData = data[eDKKey] + if not tData then + return + end + local tRecord, szUnit = tData[DK_REC.STAT], STAT_TYPE_UNIT[MY_Recount_UI.nChannel] + + -- 计算战斗时间 + local eTimeChannel = MY_Recount_UI.bSysTimeMode and STAT_TYPE_KEY[MY_Recount_UI.nChannel] + local nTimeCount = MY_Recount_DS.GeneFightTime(data, eTimeChannel) + local szTimeCount = X.FormatDuration(nTimeCount, 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) + if X.IsInArenaMap() then + szTimeCount = X.GetFightTime('M:ss') + end + -- 自己的记录 + local tMyRec + + -- 整理数据 生成要显示的列表 + local nMaxValue, aResult, tResult = 0, {}, {} + for dwID, rec in pairs(tRecord) do + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.StatContainsImportantEffect(rec) + if (bShowZeroVal or rec[MY_Recount_UI.bShowEffect and DK_REC_STAT.TOTAL_EFFECT or DK_REC_STAT.TOTAL] > 0) + and ( + MY_Recount_UI.nDisplayMode == DISPLAY_MODE.BOTH or -- 确定显示模式(显示NPC/显示玩家/全部显示) + (MY_Recount_UI.nDisplayMode == DISPLAY_MODE.NPC and not X.IsPlayer(dwID)) or + (MY_Recount_UI.nDisplayMode == DISPLAY_MODE.PLAYER and X.IsPlayer(dwID)) + ) then + local id, tRec = dwID + if not X.IsPlayer(dwID) then + id = MY_Recount_UI.bGroupSameNpc and MY_Recount_DS.GetNameAusID(data, dwID) or dwID + tRec = tResult[id] + end + if tRec then -- 同名合并数据 + tRec.nValue = tRec.nValue + (rec[DK_REC_STAT.TOTAL] or 0) + tRec.nEffectValue = tRec.nEffectValue + (rec[DK_REC_STAT.TOTAL_EFFECT] or 0) + else -- 新数据 + tRec = { + id = id , + szName = MY_Recount_DS.GetNameAusID(data, dwID) , + szBaseName = MY_Recount_DS.GetBaseNameAusID(data, dwID), + dwForceID = MY_Recount_DS.GetForceAusID(data, dwID) , + nValue = rec[DK_REC_STAT.TOTAL] or 0 , + nEffectValue = rec[DK_REC_STAT.TOTAL_EFFECT] or 0 , + nTimeCount = math.max( -- 计算战斗时间 防止计算DPS时除以0 + MY_Recount_UI.bAwayMode + and MY_Recount_DS.GeneFightTime(data, eTimeChannel, dwID) -- 删去死亡时间 + or nTimeCount, + 1), -- 不删去暂离时间 + } + tResult[id] = tRec + table.insert(aResult, tRec) + end + end + end + -- 全程没数据的队友 + if X.IsClientPlayerInParty() and MY_Recount_UI.bShowNodataTeammate then + local list = GetClientTeam().GetTeamMemberList() + for _, dwID in ipairs(list) do + local info = GetClientTeam().GetMemberInfo(dwID) + if not tResult[dwID] then + table.insert(aResult, { + id = dwID , + szName = info.szName , + szBaseName = X.ExtractPlayerBaseName(info.szName), + dwForceID = info.dwForceID , + nValue = 0 , + nEffectValue = 0 , + nTimeCount = math.max(nTimeCount, 1), + }) + tResult[dwID] = aResult + end + end + end + + -- 计算平均值、最大值 + for _, tRec in ipairs(aResult) do + if MY_Recount_UI.bShowPerSec then -- 计算平均值 + tRec.nValuePS = tRec.nValue / tRec.nTimeCount + tRec.nEffectValuePS = tRec.nEffectValue / tRec.nTimeCount + nMaxValue = math.max(nMaxValue, tRec.nValuePS, tRec.nEffectValuePS) + else + nMaxValue = math.max(nMaxValue, tRec.nValue, tRec.nEffectValue) + end + end + + -- 列表排序 + local szSortKey = 'nValue' + if MY_Recount_UI.bShowEffect and MY_Recount_UI.bShowPerSec then + szSortKey = 'nEffectValuePS' + elseif MY_Recount_UI.bShowEffect then + szSortKey = 'nEffectValue' + elseif MY_Recount_UI.bShowPerSec then + szSortKey = 'nValuePS' + end + table.sort(aResult, function(p1, p2) + return p1[szSortKey] > p2[szSortKey] + end) + + -- 渲染列表 + local hList = frame:Lookup('Wnd_Main', 'Handle_List') + for i, p in pairs(aResult) do + -- 自己的记录 + if p.id == X.GetClientPlayerID() then + tMyRec = p + tMyRec.nRank = i + end + local hItem = hList:Lookup('Handle_LI_' .. p.id) + if not hItem then + hItem = hList:AppendItemFromIni(SZ_INI, 'Handle_Item') + hItem.OnItemRefreshTip = D.OnItemRefreshTip + hItem:SetName('Handle_LI_' .. p.id) + local css = FORCE_BAR_CSS[O.nCss][p.dwForceID] or {} + if css.image and css.frame then -- uitex, frame + hItem:Lookup('Image_PerFore'):FromUITex(css.image, css.frame) + hItem:Lookup('Image_PerBack'):FromUITex(css.image, css.frame) + hItem:Lookup('Shadow_PerFore'):Hide() + hItem:Lookup('Shadow_PerBack'):Hide() + else -- r, g, b + hItem:Lookup('Shadow_PerFore'):SetColorRGB(css.r or 0, css.g or 0, css.b or 0) + hItem:Lookup('Shadow_PerBack'):SetColorRGB(css.r or 0, css.g or 0, css.b or 0) + hItem:Lookup('Image_PerFore'):Hide() + hItem:Lookup('Image_PerBack'):Hide() + end + hItem:Lookup('Image_PerFore'):SetAlpha(css.a or 255) + hItem:Lookup('Image_PerBack'):SetAlpha((css.a or 255) / 255 * 100) + hItem:Lookup('Shadow_PerFore'):SetAlpha(css.a or 255) + hItem:Lookup('Shadow_PerBack'):SetAlpha((css.a or 255) / 255 * 100) + hItem:Lookup('Text_L'):SetText(MY_Recount.GetTargetShowName(p.szBaseName, p.dwForceID ~= -1)) + hItem.id = p.id + end + if hItem:GetIndex() ~= i - 1 then + hItem:ExchangeIndex(i - 1) + end + -- 排名 + if RANK_FRAME[i] then + hItem:Lookup('Text_Rank'):Hide() + hItem:Lookup('Image_Rank'):Show() + hItem:Lookup('Image_Rank'):SetFrame(RANK_FRAME[i]) + else + hItem:Lookup('Text_Rank'):SetText(i .. '.') + hItem:Lookup('Text_Rank'):Show() + hItem:Lookup('Image_Rank'):Hide() + end + -- 色块长度 + local fPerBack, fPerFore = 0, 0 + if nMaxValue > 0 then + if MY_Recount_UI.bShowPerSec then + fPerBack = p.nValuePS / nMaxValue + fPerFore = p.nEffectValuePS / nMaxValue + else + fPerBack = p.nValue / nMaxValue + fPerFore = p.nEffectValue / nMaxValue + end + hItem:Lookup('Image_PerBack'):SetPercentage(fPerBack) + hItem:Lookup('Image_PerFore'):SetPercentage(fPerFore) + hItem:Lookup('Shadow_PerBack'):SetW(fPerBack * hItem:GetW()) + hItem:Lookup('Shadow_PerFore'):SetW(fPerFore * hItem:GetW()) + end + -- 死亡/离线 特殊颜色 + local tAway = data[DK.AWAYTIME][p.id] + local bAway = tAway and #tAway > 0 and not tAway[#tAway][2] + if hItem.bAway ~= bAway then + if bAway then + hItem:Lookup('Text_L'):SetFontColor(192, 192, 192) + hItem:Lookup('Text_R'):SetFontColor(192, 192, 192) + else + hItem:Lookup('Text_L'):SetFontColor(255, 255, 255) + hItem:Lookup('Text_R'):SetFontColor(255, 255, 255) + end + end + -- 数值显示 + if MY_Recount_UI.bShowEffect then + if MY_Recount_UI.bShowPerSec then + hItem:Lookup('Text_R'):SetText(MY_Recount.GetTargetShowValue(math.floor(p.nEffectValue / p.nTimeCount)) .. ' ' .. szUnit) + else + hItem:Lookup('Text_R'):SetText(MY_Recount.GetTargetShowValue(p.nEffectValue)) + end + else + if MY_Recount_UI.bShowPerSec then + hItem:Lookup('Text_R'):SetText(MY_Recount.GetTargetShowValue(math.floor(p.nValue / p.nTimeCount)) .. ' ' .. szUnit) + else + hItem:Lookup('Text_R'):SetText(MY_Recount.GetTargetShowValue(p.nValue)) + end + end + hItem.data = p + end + hList.szUnit = szUnit + hList.nTimeCount = nTimeCount + hList:FormatAllItemPos() + + -- 渲染底部自己的统计 + local hItem = frame:Lookup('Wnd_Main', 'Handle_Me') + -- 初始化颜色 + if not hItem.bInited then + hItem.OnItemRefreshTip = D.OnItemRefreshTip + local dwForceID = MY_ChatMosaics.bEnabled and X.CONSTANT.FORCE_TYPE.JIANG_HU or X.GetClientPlayerInfo().dwForceID + if dwForceID then + local css = FORCE_BAR_CSS[O.nCss][dwForceID] or {} + if css.image and css.frame then -- uitex, frame + hItem:Lookup('Image_Me_PerFore'):FromUITex(css.image, css.frame) + hItem:Lookup('Image_Me_PerBack'):FromUITex(css.image, css.frame) + hItem:Lookup('Shadow_Me_PerFore'):Hide() + hItem:Lookup('Shadow_Me_PerBack'):Hide() + hItem:Lookup('Image_Me_PerFore'):Show() + hItem:Lookup('Image_Me_PerBack'):Show() + else -- r, g, b + hItem:Lookup('Shadow_Me_PerFore'):SetColorRGB(css.r or 0, css.g or 0, css.b or 0) + hItem:Lookup('Shadow_Me_PerBack'):SetColorRGB(css.r or 0, css.g or 0, css.b or 0) + hItem:Lookup('Shadow_Me_PerFore'):Show() + hItem:Lookup('Shadow_Me_PerBack'):Show() + hItem:Lookup('Image_Me_PerFore'):Hide() + hItem:Lookup('Image_Me_PerBack'):Hide() + end + hItem:Lookup('Image_Me_PerFore'):SetAlpha(css.a or 255) + hItem:Lookup('Image_Me_PerBack'):SetAlpha((css.a or 255) / 255 * 100) + hItem:Lookup('Shadow_Me_PerFore'):SetAlpha(css.a or 255) + hItem:Lookup('Shadow_Me_PerBack'):SetAlpha((css.a or 255) / 255 * 100) + hItem.bInited = true + end + end + if tMyRec and not MY_ChatMosaics.bEnabled then + local fPerBack, fPerFore = 0, 0 + if nMaxValue > 0 then + if MY_Recount_UI.bShowPerSec then + fPerBack = tMyRec.nValuePS / nMaxValue + fPerFore = tMyRec.nEffectValuePS / nMaxValue + else + fPerBack = tMyRec.nValue / nMaxValue + fPerFore = tMyRec.nEffectValue / nMaxValue + end + hItem:Lookup('Image_Me_PerBack'):SetPercentage(fPerBack) + hItem:Lookup('Image_Me_PerFore'):SetPercentage(fPerFore) + hItem:Lookup('Shadow_Me_PerBack'):SetW(fPerBack * hItem:GetW()) + hItem:Lookup('Shadow_Me_PerFore'):SetW(fPerFore * hItem:GetW()) + else + hItem:Lookup('Image_Me_PerBack'):SetPercentage(1) + hItem:Lookup('Image_Me_PerFore'):SetPercentage(1) + hItem:Lookup('Shadow_Me_PerBack'):SetW(hItem:GetW()) + hItem:Lookup('Shadow_Me_PerFore'):SetW(hItem:GetW()) + end + -- 左侧战斗计时 + hItem:Lookup('Text_Me_L'):SetText('[' .. tMyRec.nRank .. '] ' .. szTimeCount) + -- 右侧文字 + if MY_Recount_UI.bShowEffect then + if MY_Recount_UI.bShowPerSec then + hItem:Lookup('Text_Me_R'):SetText(MY_Recount.GetTargetShowValue(math.floor(tMyRec.nEffectValue / tMyRec.nTimeCount)) .. ' ' .. szUnit) + else + hItem:Lookup('Text_Me_R'):SetText(MY_Recount.GetTargetShowValue(tMyRec.nEffectValue)) + end + else + if MY_Recount_UI.bShowPerSec then + hItem:Lookup('Text_Me_R'):SetText(MY_Recount.GetTargetShowValue(math.floor(tMyRec.nValue / tMyRec.nTimeCount)) .. ' ' .. szUnit) + else + hItem:Lookup('Text_Me_R'):SetText(MY_Recount.GetTargetShowValue(tMyRec.nValue)) + end + end + else + hItem:Lookup('Text_Me_L'):SetText(szTimeCount) + hItem:Lookup('Text_Me_R'):SetText('') + hItem:Lookup('Image_Me_PerBack'):SetPercentage(1) + hItem:Lookup('Image_Me_PerFore'):SetPercentage(0) + hItem:Lookup('Shadow_Me_PerBack'):SetW(hItem:GetW()) + hItem:Lookup('Shadow_Me_PerFore'):SetW(0) + end +end + +-- ########################################################################## -- +-- # # # -- +-- # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # # -- +-- # # # # # # # # # # # # # # -- +-- # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # # # # # # -- +-- # # # # # # # -- +-- # # # # # # # # # # # # # # # # # # -- +-- # # # -- +-- # # # # -- +-- ########################################################################## -- +function D.OnFrameCreate() + D.DrawUI(this) + D.UpdateAnchor(this) + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_MY_MOSAICS_RESET') + this:RegisterEvent('MY_RECOUNT_CSS_UPDATE') + this:RegisterEvent('MY_RECOUNT_DISP_DATA_UPDATE') + this:RegisterEvent('MY_RECOUNT_UI_CONFIG_UPDATE') + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Main/Scroll_List')) +end + +function D.OnEvent(event) + if event == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif event == 'ON_MY_MOSAICS_RESET' + or event == 'MY_RECOUNT_CSS_UPDATE' + or event == 'MY_RECOUNT_DISP_DATA_UPDATE' + or event == 'MY_RECOUNT_UI_CONFIG_UPDATE' then + D.DrawUI(this) + end +end + +-- 周期重绘 +function D.OnFrameBreathe() + if this.nLastRedrawFrame + and GetLogicFrameCount() - this.nLastRedrawFrame > 0 + and GetLogicFrameCount() - this.nLastRedrawFrame < MY_Recount_UI.nDrawInterval then + return + end + this.nLastRedrawFrame = GetLogicFrameCount() + + -- 查看历史、不进战时不需要刷新UI + if select(2, MY_Recount.GetDisplayData()) or not X.GetFightUUID() then + return + end + D.UpdateUI(this) +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.anchor = GetFrameAnchor(this) +end + +function D.OnFrameDragSetPosEnd() + this:CorrectPos() +end + +function D.OnItemLButtonClick() + local id = this.id + local name = this:GetName() + if name == 'Handle_Me' then + id = X.GetClientPlayerID() + name = 'Handle_LI_' .. X.GetClientPlayerID() + end + if id and name:find('Handle_LI_') == 1 then + MY_Recount_DT.Open(id, MY_Recount_UI.nChannel) + end +end + +function D.OnItemRefreshTip() + local id = this.id + local name = this:GetName() + if name == 'Handle_Me' then + id = X.GetClientPlayerID() + name = 'Handle_LI_' .. X.GetClientPlayerID() + end + name:gsub('Handle_LI_(.+)', function() + if tonumber(id) then + id = tonumber(id) + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local DataDisplay = MY_Recount.GetDisplayData() + local szChannel = STAT_TYPE_KEY[MY_Recount_UI.nChannel] + local tRec = MY_Recount_DS.GetMergeTargetData(DataDisplay, szChannel, id, O.bGroupSameNpc, O.bGroupSameEffect) + if tRec then + local szTitle = DataDisplay[DK.NAME_LIST][id] or id + local nTitleR, nTitleG, nTitleB = 255, 45, 255 + local dwForceID = MY_Recount_DS.GetForceAusID(DataDisplay, id) + if dwForceID then + local szForceName = g_tStrings.tForceTitle[dwForceID] + if szForceName then + nTitleR, nTitleG, nTitleB = X.GetForceColor(dwForceID, 'foreground') + szTitle = szTitle .. g_tStrings.STR_PREV_PARENTHESES .. szForceName .. g_tStrings.STR_END_PARENTHESES + end + end + local szXml = GetFormatText(szTitle .. '\n', 60, nTitleR, nTitleG, nTitleB) + local szColon = g_tStrings.STR_COLON + local t = {} + for szEffectID, p in pairs(tRec[DK_REC_STAT.SKILL]) do + local szName = MY_Recount_DS.GetEffectNameAusID(DataDisplay, szChannel, szEffectID) or szEffectID + table.insert(t, { + szEffectID = szEffectID, + szName = szName, + rec = p, + bAnonymous = X.IsEmpty(szName) or szName:sub(1, 1) == '#', + }) + end + table.sort(t, function(p1, p2) + return p1.rec[DK_REC_STAT_SKILL.TOTAL] > p2.rec[DK_REC_STAT_SKILL.TOTAL] + end) + for _, p in ipairs(t) do + local bShowZeroVal = MY_Recount_UI.bShowZeroVal + or MY_Recount.IsImportantEffect(p.szEffectID) + or MY_Recount.IsImportantEffect(p.rec.tEffectID) + if (bShowZeroVal or p.rec[DK_REC_STAT_SKILL.TOTAL] > 0) + and (not MY_Recount_UI.bHideAnonymous or not p.bAnonymous) then + szXml = szXml .. GetFormatText(p.szName, nil, 255, 150, 0) + if IsCtrlKeyDown() then + szXml = szXml .. GetFormatText('\t' .. p.szEffectID, nil, 255, 255, 0) + else + szXml = szXml .. GetFormatText('\n', nil, 255, 150, 0) + end + szXml = szXml .. GetFormatText(_L['Total: '] .. p.rec[DK_REC_STAT_SKILL.TOTAL] + .. ' ' .. _L['effect: '] .. p.rec[DK_REC_STAT_SKILL.TOTAL_EFFECT] .. '\n') + for _, nSkillResult in ipairs({ + { SKILL_RESULT.ABSORB, SKILL_RESULT.HIT }, + SKILL_RESULT.INSIGHT , + SKILL_RESULT.CRITICAL, + SKILL_RESULT.MISS , + }) do + if X.IsTable(nSkillResult) then + for i, v in ipairs(nSkillResult) do + if p.rec[DK_REC_STAT_SKILL.DETAIL][v] or i == #nSkillResult then + nSkillResult = v + break + end + end + end + local nCount = 0 + if p.rec[DK_REC_STAT_SKILL.DETAIL][nSkillResult] then + nCount = not bShowZeroVal + and p.rec[DK_REC_STAT_SKILL.DETAIL][nSkillResult][DK_REC_STAT_SKILL_DETAIL.NZ_COUNT] + or p.rec[DK_REC_STAT_SKILL.DETAIL][nSkillResult][DK_REC_STAT_SKILL_DETAIL.COUNT] + end + szXml = szXml .. GetFormatText(SKILL_RESULT_NAME[nSkillResult] .. szColon, nil, 255, 202, 126) + szXml = szXml .. GetFormatText(string.format('%2d', nCount) .. ' ') + end + szXml = szXml .. GetFormatText('\n') + end + end + if DataDisplay[DK.AWAYTIME][id] then + szXml = szXml .. GetFormatText(_L( + 'Away count: %d, away time: %ds', + #DataDisplay[DK.AWAYTIME][id], + MY_Recount_DS.GeneAwayTime(DataDisplay, id, MY_Recount_UI.bSysTimeMode) + ), nil, 255, 191, 255) + end + OutputTip(szXml, 500, {x, y, w, h}) + end + end) +end + +function D.OnItemMouseLeave() + HideTip() +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Right' then + for i, v in ipairs(STAT_TYPE_LIST) do + if STAT_TYPE[v] == MY_Recount_UI.nChannel then + MY_Recount_UI.nChannel = STAT_TYPE[STAT_TYPE_LIST[((i + 1) - 1) % #STAT_TYPE_LIST + 1]] + break + end + end + D.DrawUI(this:GetRoot()) + elseif name == 'Btn_Left' then + for i, v in ipairs(STAT_TYPE_LIST) do + if STAT_TYPE[v] == MY_Recount_UI.nChannel then + MY_Recount_UI.nChannel = STAT_TYPE[STAT_TYPE_LIST[((i - 1) + #STAT_TYPE_LIST - 1) % #STAT_TYPE_LIST + 1]] + break + end + end + D.DrawUI(this:GetRoot()) + elseif name == 'Btn_Option' then + X.UI.PopupMenu(MY_Recount.GetMenu()) + elseif name == 'Btn_History' then + X.UI.PopupMenu(MY_Recount.GetHistoryMenu()) + elseif name == 'Btn_Empty' then + MY_Recount_DS.Flush() + MY_Recount.SetDisplayData('CURRENT') + D.DrawUI(this:GetRoot()) + elseif name == 'Btn_Issuance' then + X.UI.PopupMenu(MY_Recount.GetPublishMenu()) + end +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_Minimize' then + this:GetRoot():Lookup('Wnd_Main'):Hide() + this:GetRoot():SetSize(280, 30) + this:GetRoot():Lookup('Wnd_Title', 'Image_Bg'):Hide() + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + if name == 'CheckBox_Minimize' then + this:GetRoot():Lookup('Wnd_Main'):Show() + this:GetRoot():SetSize(280, 262) + this:GetRoot():Lookup('Wnd_Title', 'Image_Bg'):Show() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Recount_UI', + exports = { + { + preset = 'UIEvent', + fields = { + FORCE_BAR_CSS = FORCE_BAR_CSS, + DISPLAY_MODE = DISPLAY_MODE, + 'Open', + 'Close', + 'CheckOpen', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nCss', + 'nChannel', + 'bAwayMode', + 'bSysTimeMode', + 'bGroupSameNpc', + 'bGroupSameEffect', + 'bHideAnonymous', + 'bShowPerSec', + 'bShowEffect', + 'bShowZeroVal', + 'bSimplifyValue', + 'nDisplayMode', + 'nDrawInterval', + 'bShowNodataTeammate', + 'anchor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nCss', + 'nChannel', + 'bAwayMode', + 'bSysTimeMode', + 'bGroupSameNpc', + 'bGroupSameEffect', + 'bHideAnonymous', + 'bShowPerSec', + 'bShowEffect', + 'bShowZeroVal', + 'bSimplifyValue', + 'nDisplayMode', + 'nDrawInterval', + 'bShowNodataTeammate', + 'anchor', + }, + triggers = { + bEnable = function() D.CheckOpen() end, + nCss = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bAwayMode = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bSysTimeMode = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bGroupSameNpc = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bGroupSameEffect = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bHideAnonymous = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bShowPerSec = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bShowEffect = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bShowZeroVal = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bSimplifyValue = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + nDisplayMode = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + bShowNodataTeammate = function() FireUIEvent('MY_RECOUNT_UI_CONFIG_UPDATE') end, + }, + root = O, + }, + }, +} +MY_Recount_UI = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_Recount_UI', function() + D.CheckOpen() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Recount/ui/MY_Recount_DT.ini b/MY_Recount/ui/MY_Recount_DT.ini new file mode 100644 index 000000000..24bb76da0 --- /dev/null +++ b/MY_Recount/ui/MY_Recount_DT.ini @@ -0,0 +1,1455 @@ +[MY_Recount_DT] +._WndType=WndFrame +._Parent=Normal +Left=10 +Top=350 +Width=480 +Height=387 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=480 +DragAreaHeight=30 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +IsCustomDragable=1 +DummyWnd=0 +Moveable=1 +ClassName=MY_Recount_DT +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_Recount_DT +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Wnd_Bg] +._WndType=WndWindow +._Parent=Wnd_Total +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Bg +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=480 +Height=30 + +[Image_Bg] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Common\Money.UITex +Frame=256 +Alpha=180 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=380 +ImageType=10 +LockShowAndHide=1 + +[Text_Default] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=480 +Height=26 +HAlign=1 +VAlign=1 +$Text=STR_HURT_STAT +Left=0 +Top=4 +PosType=0 + +[Handle_Spliter] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Breaker_1] +._WndType=Image +._Parent=Handle_Spliter +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=42 +Alpha=255 +Left=0 +Top=124 +PosType=0 +Width=480 +Height=8 + +[Image_Breaker_2] +._WndType=Image +._Parent=Handle_Spliter +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=42 +Alpha=255 +Left=0 +Top=204 +PosType=0 +Width=480 +Height=8 + +[WndScroll_Skill] +._WndType=WndScroll +._Parent=Wnd_Total +Left=0 +Top=35 +Width=480 +Height=96 +ScrollHandle=Handle_SkillList +ScrollContainer= +VerScrollBar=Scroll_Skill_List +ScrollButtonUp=Btn_Skill_Up +ScrollButtonDown=Btn_Skill_Down + +[Handle_Skill] +._WndType=Handle +._Parent=WndScroll_Skill +HandleType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=96 +PixelScroll=0 +ControlShow=0 +FirstItemPosType=0 + +[Handle_SkillTitle] +._WndType=Handle +._Parent=Handle_Skill +HandleType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 +FirstItemPosType=0 + +[Text_SkillTitle_1] +._WndType=Text +._Parent=Handle_SkillTitle +FontSpacing=0 +Alpha=255 +PosType=8 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=164 +$Text=# +OrgText=1 +RowSpacing=0 + +[Text_SkillTitle_2] +._WndType=Text +._Parent=Handle_SkillTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=170 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=164 +$Text=STR_DUNGEON_NAME +OrgText=0 +Left=30 +Top=0 + +[Text_SkillTitle_3] +._WndType=Text +._Parent=Handle_SkillTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=50 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT_DEGREE +OrgText=0 + +[Text_SkillTitle_4] +._WndType=Text +._Parent=Handle_SkillTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=160 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT +OrgText=0 +Left=240 +Top=0 + +[Text_SkillTitle_5] +._WndType=Text +._Parent=Handle_SkillTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT_PROPORTION +OrgText=0 + +[Handle_SkillList] +._WndType=Handle +._Parent=Handle_Skill +HandleType=3 +Left=0 +Top=16 +PosType=0 +Width=480 +Height=80 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=2048 + +[Handle_SkillItem] +._WndType=Handle +._Parent=Handle_SkillList +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=480 +Height=16 +EventID=885 +Hover=Shadow_SkillHover +UnLoad=1 + +[Shadow_SkillHover] +._WndType=Shadow +._Parent=Handle_SkillItem +ShadowColor=blue1 +Alpha=50 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 +LockShowAndHide=1 + +[Shadow_SkillEntry] +._WndType=Shadow +._Parent=Handle_SkillItem +ShadowColor=blue1 +Alpha=100 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 +LockShowAndHide=1 + +[Text_SkillNo] +._WndType=Text +._Parent=Handle_SkillItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=0 +Top=0 +PosType=0 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_SkillName] +._WndType=Text +._Parent=Handle_SkillItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_SKILL_NAME +PosType=8 +Width=170 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=18 +AutoEtc=1 +ShowAll=0 +Left=30 +Top=0 + +[Text_SkillCount] +._WndType=Text +._Parent=Handle_SkillItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=251 +PosType=8 +Width=50 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 +AutoEtc=0 + +[Text_SkillTotal] +._WndType=Text +._Parent=Handle_SkillItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=25678(3569DPS) +PosType=8 +Width=160 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +AutoEtc=1 +ShowAll=0 +OrgText=1 + +[Text_SkillPercentage] +._WndType=Text +._Parent=Handle_SkillItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=100% +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Btn_Skill_Up] +._WndType=WndButton +._Parent=WndScroll_Skill +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Btn_Skill_Down] +._WndType=WndButton +._Parent=WndScroll_Skill +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Scroll_Skill_List] +._WndType=WndNewScrollBar +._Parent=WndScroll_Skill +StepCount=0 +PageStepCount=10 +Left=470 +Top=16 +Width=10 +Height=78 +Type=1 +SlideBtn=Btn_List +AutoHideSlideButton=1 +AutoResizeSlideButton=0 + +[Btn_Skill_List] +._WndType=WndButton +._Parent=Scroll_Skill_List +Left=0 +Top=18 +Width=10 +Height=24 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=120 + +[WndScroll_Detail] +._WndType=WndScroll +._Parent=Wnd_Total +Left=0 +Top=137 +Width=480 +Height=80 +ScrollHandle=Handle_DetailList +ScrollContainer= +VerScrollBar=Scroll_Detail_List +ScrollButtonUp=Btn_Detail_Up +ScrollButtonDown=Btn_Detail_Down + +[Handle_Detail] +._WndType=Handle +._Parent=WndScroll_Detail +HandleType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=80 +PixelScroll=0 +ControlShow=0 +FirstItemPosType=0 + +[Handle_DetailTitle] +._WndType=Handle +._Parent=Handle_Detail +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 + +[Text_DetailTitle_1] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=164 +$Text=# +OrgText=1 + +[Text_DetailTitle_2] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=80 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=164 +$Text=STR_SKILL_STYLE +OrgText=0 + +[Text_DetailTitle_3] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_START_LEAST +OrgText=0 +Left=110 +Top=0 + +[Text_DetailTitle_4] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_START_AVERAGE +OrgText=0 + +[Text_DetailTitle_5] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_START_MOST +OrgText=0 + +[Text_DetailTitle_6] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT_DEGREE +OrgText=0 + +[Text_DetailTitle_7] +._WndType=Text +._Parent=Handle_DetailTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT_PROPORTION +OrgText=0 + +[Handle_DetailList] +._WndType=Handle +._Parent=Handle_Detail +HandleType=3 +Left=0 +Top=16 +PosType=0 +Width=480 +Height=64 +RowSpacing=0 + +[Handle_DetailItem] +._WndType=Handle +._Parent=Handle_DetailList +HandleType=0 +FirstItemPosType=0 +PosType=8 +Hover=Shadow_DetailHover +EventID=768 +UnLoad=1 + +[Shadow_DetailHover] +._WndType=Shadow +._Parent=Handle_DetailItem +ShadowColor=blue1 +Alpha=50 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 +LockShowAndHide=1 + +[Text_DetailNo] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=0 +Top=0 +PosType=0 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_DetailType] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_PROPERTY_CRITICAL +PosType=8 +Width=80 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=18 +OrgText=0 + +[Text_DetailMin] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=10235 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +ShowAll=1 +AutoEtc=0 +OrgText=1 + +[Text_DetailAverage] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=25641 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 +Left=190 +Top=0 + +[Text_DetailMax] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=57869 +PosType=8 +Width=80 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 + +[Text_DetailCount] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=36 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_DetailPercent] +._WndType=Text +._Parent=Handle_DetailItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=100% +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Btn_Detail_Up] +._WndType=WndButton +._Parent=WndScroll_Detail +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Btn_Detail_Down] +._WndType=WndButton +._Parent=WndScroll_Detail +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Scroll_Detail_List] +._WndType=WndNewScrollBar +._Parent=WndScroll_Detail +StepCount=0 +PageStepCount=10 +Left=470 +Top=16 +Width=10 +Height=56 +Type=1 +SlideBtn=Btn_List +AutoHideSlideButton=1 +AutoResizeSlideButton=0 + +[Btn_Detail_List] +._WndType=WndButton +._Parent=Scroll_Detail_List +Left=0 +Top=18 +Width=10 +Height=24 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=120 + +[WndScroll_Target] +._WndType=WndScroll +._Parent=Wnd_Total +Left=0 +Top=217 +Width=480 +Height=166 +ScrollHandle=Handle_TargetList +ScrollContainer= +VerScrollBar=Scroll_Target_List +ScrollButtonUp=Btn_Target_Up +ScrollButtonDown=Btn_Target_Down + +[Handle_Target] +._WndType=Handle +._Parent=WndScroll_Target +HandleType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=166 +PixelScroll=0 +ControlShow=0 +FirstItemPosType=0 + +[Handle_TargetTitle] +._WndType=Handle +._Parent=Handle_Target +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 + +[Text_TargetTitle_1] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=164 +$Text=# +OrgText=1 + +[Text_TargetTitle_2] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=130 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=164 +$Text=STR_DUNGEON_NAME +OrgText=0 + +[Text_TargetTitle_3] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=75 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT +OrgText=0 + +[Text_TargetTitle_4] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_START_MOST +OrgText=0 + +[Text_TargetTitle_5] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_PROPERTY_HIT +OrgText=0 + +[Text_TargetTitle_6] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_PROPERTY_CRITICAL +OrgText=0 + +[Text_TargetTitle_7] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_TITLE_MISS +OrgText=0 + +[Text_TargetTitle_8] +._WndType=Text +._Parent=Handle_TargetTitle +RowSpacing=0 +FontSpacing=0 +Alpha=255 +PosType=8 +Width=55 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=164 +$Text=STR_HURT_PROPORTION +OrgText=0 + +[Handle_TargetList] +._WndType=Handle +._Parent=Handle_Target +HandleType=3 +Left=0 +Top=16 +PosType=0 +RowSpacing=0 +Width=480 +Height=150 +PixelScroll=1 +ControlShow=1 + +[Handle_TargetItem] +._WndType=Handle +._Parent=Handle_TargetList +HandleType=0 +FirstItemPosType=0 +PosType=8 +EventID=885 +Hover=Shadow_TargetHover +UnLoad=1 + +[Shadow_TargetHover] +._WndType=Shadow +._Parent=Handle_TargetItem +ShadowColor=blue1 +Alpha=50 +Left=0 +Top=0 +PosType=0 +Width=480 +Height=16 +LockShowAndHide=1 + +[Text_TargetNo] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=0 +Top=0 +PosType=0 +Width=30 +Height=16 +HAlign=1 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_TargetName] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_CHARACTER +PosType=8 +Width=130 +Height=16 +HAlign=0 +VAlign=1 +FontScheme=18 +ShowAll=0 +AutoEtc=1 + +[Text_TargetTotal] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=254684 +PosType=8 +Width=75 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +ShowAll=1 +AutoEtc=0 +OrgText=1 + +[Text_TargetMax] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=87965 +PosType=8 +Width=60 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_TargetHit] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=24 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_TargetCritical] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=12 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_TargetMiss] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=5 +PosType=8 +Width=40 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Text_TargetPercent] +._WndType=Text +._Parent=Handle_TargetItem +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=100% +PosType=8 +Width=55 +Height=16 +HAlign=2 +VAlign=1 +FontScheme=18 +OrgText=1 + +[Btn_Target_Up] +._WndType=WndButton +._Parent=WndScroll_Target +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Btn_Target_Down] +._WndType=WndButton +._Parent=WndScroll_Target +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +ButtonDisable=0 +LockShowAndHide=1 + +[Scroll_Target_List] +._WndType=WndNewScrollBar +._Parent=WndScroll_Target +StepCount=0 +PageStepCount=10 +Left=470 +Top=16 +Width=10 +Height=150 +Type=1 +SlideBtn=Btn_List +AutoHideSlideButton=1 +AutoResizeSlideButton=0 +Alpha=120 + +[Btn_Target_List] +._WndType=WndButton +._Parent=Scroll_Target_List +Left=0 +Top=18 +Width=10 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=120 + +[Btn_Switch] +._WndType=WndButton +._Parent=Wnd_Total +Left=5 +Top=8 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=7 +MouseOverGroup=8 +MouseDownGroup=9 +DisableGroup=22 +OrgTip=0 +$Tip=STR_FIGHTING_TYPE +ShowTipType=0 +Alpha=200 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Btn_Unselect] +._WndType=WndButton +._Parent=Wnd_Total +Left=28 +Top=8 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\FrendNPartyButton.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=9 +MouseOverGroup=10 +MouseDownGroup=9 +DisableGroup=12 +OrgTip=0 +$Tip=STR_DUNGEON_DISPLAYALL +ShowTipType=0 +Alpha=200 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Btn_Close] +._WndType=WndButton +._Parent=Wnd_Total +Left=458 +Top=8 +Width=25 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=32 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=43 +MouseOverGroup=44 +MouseDownGroup=45 +DisableGroup=42 +ShowTipType=0 +Alpha=200 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Btn_Issuance] +._WndType=WndButton +._Parent=Wnd_Total +Left=52 +Top=8 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=10 +MouseOverGroup=11 +MouseDownGroup=12 +DisableGroup=23 +ButtonDisable=0 +OrgTip=0 +$Tip=STR_FIGHTING_OUTPUT +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + diff --git a/MY_Recount/ui/MY_Recount_UI.ini b/MY_Recount/ui/MY_Recount_UI.ini new file mode 100644 index 000000000..7c6e5f524 --- /dev/null +++ b/MY_Recount/ui/MY_Recount_UI.ini @@ -0,0 +1,660 @@ +[MY_Recount_UI] +._WndType=WndFrame +._Parent=Normal +Left=20 +Top=400 +Width=255 +Height=262 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=240 +DragAreaHeight=30 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +IsCustomDragable=1 +DummyWnd=1 + +[Wnd_Title] +._WndType=WndWindow +._Parent=MY_Recount_UI +Left=0 +Top=0 +Width=255 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Title] +._WndType=Handle +._Parent=Wnd_Title +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=30 + +[Image_Bg] +._WndType=Image +._Parent=Handle_Title +Image=ui\Image\Minimap\MapMark.UITex +Frame=74 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=262 +ImageType=10 + +[Image_Title] +._WndType=Image +._Parent=Handle_Title +Image=ui\Image\Minimap\MapMark.UITex +Frame=77 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=255 +Height=32 +EventID=512 + +[Text_Title] +._WndType=Text +._Parent=Handle_Title +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_FIGHTINGSTATISTIC_TITLE +Left=23 +Top=0 +PosType=0 +FontScheme=18 +VAlign=1 +Width=60 +Height=30 +OrgText=0 +HAlign=1 + +[Btn_Left] +._WndType=WndButton +._Parent=Wnd_Title +Frame=46 +Left=0 +Top=4 +Width=24 +Height=24 +NormalGroup=20 +MouseOverGroup=21 +MouseDownGroup=22 +DisableGroup=23 +Image=ui\Image\button\CommonButton_1.UITex + +[Btn_Right] +._WndType=WndButton +._Parent=Wnd_Title +Frame=35 +Left=79 +Top=4 +Width=24 +Height=24 +NormalGroup=16 +MouseOverGroup=17 +MouseDownGroup=18 +DisableGroup=19 +Image=ui\Image\button\CommonButton_1.UITex +Moveable=0 +Trans=0 + +[Btn_History] +._WndType=WndButton +._Parent=Wnd_Title +Left=104 +Top=4 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=13 +MouseOverGroup=14 +MouseDownGroup=15 +DisableGroup=24 +OrgTip=0 +$Tip=STR_FIGHTING_HISTORY +ShowTipType=0 + +[Btn_Issuance] +._WndType=WndButton +._Parent=Wnd_Title +Left=165 +Top=4 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=10 +MouseOverGroup=11 +MouseDownGroup=12 +DisableGroup=23 +ButtonDisable=0 +OrgTip=0 +$Tip=STR_FIGHTING_OUTPUT +ShowTipType=0 + +[Btn_Empty] +._WndType=WndButton +._Parent=Wnd_Title +Left=188 +Top=4 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=19 +MouseOverGroup=20 +MouseDownGroup=6 +DisableGroup=0 +ButtonDisable=0 +OrgTip=0 +$Tip=STR_FIGHTING_CLEAR +ShowTipType=0 + +[Btn_Option] +._WndType=WndButton +._Parent=Wnd_Title +Left=212 +Top=4 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=22 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 + +[CheckBox_Minimize] +._WndType=WndCheckBox +._Parent=Wnd_Title +Frame=73 +Left=235 +Top=5 +Width=20 +Height=23 +UnCheckAndEnable=47 +CheckAndEnable=51 +UnCheckAndDisable=50 +CheckAndDisable=46 +UnCheckedAndEnableWhenMouseOver=48 +CheckedAndEnableWhenMouseOver=52 +CheckedAndDisableWhenMouseOver=49 +UnCheckedAndDisableWhenMouseOver=53 +Checking=49 +UnChecking=53 +Image=ui\Image\UICommon\CommonPanel.UITex +DisableCheck=0 +CheckedWhenCreate=0 + +[Wnd_Main] +._WndType=WndScroll +._Parent=MY_Recount_UI +Left=0 +Top=30 +Width=255 +Height=232 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +ScrollHandle=Handle_List +ScrollContainer= +VerScrollBar=Scroll_List +ScrollButtonUp=Btn_Up +ScrollButtonDown=Btn_Down + +[Handle_Main] +._WndType=Handle +._Parent=Wnd_Main +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=232 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Main +HandleType=3 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=208 +PixelScroll=1 +ControlShow=1 +EventID=2048 +RowSpacing=0 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_List +HandleType=0 +FirstItemPosType=0 +PosType=8 +EventID=272 +Width=255 +Height=26 + +[Shadow_PerBack] +._WndType=Shadow +._Parent=Handle_Item +ShadowColor=red3 +Alpha=100 +Left=0 +Top=2 +PosType=0 +Width=255 +Height=24 + +[Shadow_PerFore] +._WndType=Shadow +._Parent=Handle_Item +ShadowColor=red3 +Alpha=255 +Left=0 +Top=2 +PosType=0 +Width=255 +Height=24 + +[Image_PerBack] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=2 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=100 +Width=255 +Height=24 +Frame=204 +ImageType=1 + +[Image_PerFore] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=2 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=255 +Width=255 +Height=24 +Frame=204 +ImageType=1 + +[Image_Rank] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\Common\Money.UITex +Frame=190 +Alpha=255 +Left=-3 +Top=5 +PosType=0 +ImageType=1 + +[Text_Rank] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=230 +$Text=26. +PosType=0 +Width=25 +Height=24 +HAlign=0 +VAlign=1 +FontScheme=15 +AutoEtc=1 +ShowAll=0 +OrgText=1 +Left=3 +Top=2 + +[Text_L] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=230 +$Text=茗伊 +PosType=0 +Width=139 +Height=24 +HAlign=0 +VAlign=1 +FontScheme=15 +AutoEtc=1 +ShowAll=0 +OrgText=1 +Left=22 +Top=2 + +[Text_R] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=2 +Alpha=220 +$Text=8457588 DPS +PosType=0 +Width=134 +Height=24 +HAlign=2 +VAlign=1 +FontScheme=15 +ShowAll=0 +AutoEtc=1 +OrgText=1 +Left=112 +Top=2 + +[Handle_Me] +._WndType=Handle +._Parent=Handle_Main +HandleType=0 +FirstItemPosType=0 +PosType=11 +EventID=272 +Width=255 +Height=24 + +[Shadow_Me_PerBack] +._WndType=Shadow +._Parent=Handle_Me +ShadowColor=red3 +Alpha=100 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=24 + +[Shadow_Me_PerFore] +._WndType=Shadow +._Parent=Handle_Me +ShadowColor=red3 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=255 +Height=24 + +[Image_Me_PerBack] +._WndType=Image +._Parent=Handle_Me +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=100 +Width=255 +Height=24 +Frame=204 +ImageType=1 +ImagePercent=0.000 + +[Image_Me_PerFore] +._WndType=Image +._Parent=Handle_Me +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=255 +Width=255 +Height=24 +Frame=204 +ImageType=1 +ImagePercent=0.000 + +[Image_Me_Bg] +._WndType=Image +._Parent=Handle_Me +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=100 +Width=255 +Height=24 +Frame=124 +ImageType=10 + +[Text_Me_L] +._WndType=Text +._Parent=Handle_Me +RowSpacing=0 +FontSpacing=0 +Alpha=230 +$Text=7:25 +PosType=0 +Width=139 +Height=21 +HAlign=0 +VAlign=1 +FontScheme=15 +AutoEtc=1 +ShowAll=0 +OrgText=1 +Left=6 +Top=3 + +[Text_Me_R] +._WndType=Text +._Parent=Handle_Me +RowSpacing=0 +FontSpacing=2 +Alpha=220 +$Text=84575 DPS +PosType=0 +Width=150 +Height=21 +HAlign=2 +VAlign=1 +FontScheme=15 +ShowAll=0 +AutoEtc=1 +OrgText=1 +Left=105 +Top=3 + +[Btn_Up] +._WndType=WndButton +._Parent=Wnd_Main +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +ButtonDisable=0 +Alpha=0 + +[Btn_Down] +._WndType=WndButton +._Parent=Wnd_Main +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +ButtonDisable=0 +Alpha=0 + +[Scroll_List] +._WndType=WndNewScrollBar +._Parent=Wnd_Main +StepCount=0 +PageStepCount=10 +Left=240 +Top=2 +Width=15 +Height=206 +Type=1 +SlideBtn=Btn_List +AutoHideSlideButton=1 +AutoResizeSlideButton=0 + +[Btn_List] +._WndType=WndButton +._Parent=Scroll_List +Left=0 +Top=18 +Width=14 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + diff --git a/Boilerplate_Resource/data/pinyin/tone.zhcn.jx3dat b/MY_Resource/data/pinyin/tone.zhcn.jx3dat similarity index 100% rename from Boilerplate_Resource/data/pinyin/tone.zhcn.jx3dat rename to MY_Resource/data/pinyin/tone.zhcn.jx3dat diff --git a/Boilerplate_Resource/data/pinyin/tone.zhtw.jx3dat b/MY_Resource/data/pinyin/tone.zhtw.jx3dat similarity index 100% rename from Boilerplate_Resource/data/pinyin/tone.zhtw.jx3dat rename to MY_Resource/data/pinyin/tone.zhtw.jx3dat diff --git a/Boilerplate_Resource/data/pinyin/toneless.zhcn.jx3dat b/MY_Resource/data/pinyin/toneless.zhcn.jx3dat similarity index 100% rename from Boilerplate_Resource/data/pinyin/toneless.zhcn.jx3dat rename to MY_Resource/data/pinyin/toneless.zhcn.jx3dat diff --git a/Boilerplate_Resource/data/pinyin/toneless.zhtw.jx3dat b/MY_Resource/data/pinyin/toneless.zhtw.jx3dat similarity index 100% rename from Boilerplate_Resource/data/pinyin/toneless.zhtw.jx3dat rename to MY_Resource/data/pinyin/toneless.zhtw.jx3dat diff --git a/MY_Resource/img/Poster_2013.Tga b/MY_Resource/img/Poster_2013.Tga new file mode 100644 index 000000000..af0585109 Binary files /dev/null and b/MY_Resource/img/Poster_2013.Tga differ diff --git a/MY_Resource/img/Poster_2013.UITex b/MY_Resource/img/Poster_2013.UITex new file mode 100644 index 000000000..024a3aacb Binary files /dev/null and b/MY_Resource/img/Poster_2013.UITex differ diff --git a/MY_Resource/img/Poster_2013.txt b/MY_Resource/img/Poster_2013.txt new file mode 100644 index 000000000..cd9e3e145 --- /dev/null +++ b/MY_Resource/img/Poster_2013.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 1024 512 E:\Game Files\SeasunGame\Game\JX3\bin\zhcn_hd\interface\MY\!src-dist\psd\2013.tga diff --git a/MY_Resource/img/Poster_2020.Tga b/MY_Resource/img/Poster_2020.Tga new file mode 100644 index 000000000..c111c9d09 Binary files /dev/null and b/MY_Resource/img/Poster_2020.Tga differ diff --git a/MY_Resource/img/Poster_2020.UITex b/MY_Resource/img/Poster_2020.UITex new file mode 100644 index 000000000..58b19ba30 Binary files /dev/null and b/MY_Resource/img/Poster_2020.UITex differ diff --git a/MY_Resource/img/Poster_2020.txt b/MY_Resource/img/Poster_2020.txt new file mode 100644 index 000000000..e6e5ff429 --- /dev/null +++ b/MY_Resource/img/Poster_2020.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 1024 512 E:\Game Files\SeasunGame\Game\JX3\bin\zhcn_hd\interface\MY\!src-dist\psd\2020.tga diff --git a/MY_Resource/img/Poster_2024_1.Tga b/MY_Resource/img/Poster_2024_1.Tga new file mode 100644 index 000000000..fb6aa1af3 Binary files /dev/null and b/MY_Resource/img/Poster_2024_1.Tga differ diff --git a/MY_Resource/img/Poster_2024_1.UITex b/MY_Resource/img/Poster_2024_1.UITex new file mode 100644 index 000000000..78248a94a Binary files /dev/null and b/MY_Resource/img/Poster_2024_1.UITex differ diff --git a/MY_Resource/img/Poster_2024_1.txt b/MY_Resource/img/Poster_2024_1.txt new file mode 100644 index 000000000..75e7dc687 --- /dev/null +++ b/MY_Resource/img/Poster_2024_1.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 1024 512 E:\Game Files\SeasunGame\Game\JX3\bin\zhcn_hd\interface\MY\!src-dist\psd\2024_1.tga diff --git a/MY_Resource/img/Poster_2024_2.Tga b/MY_Resource/img/Poster_2024_2.Tga new file mode 100644 index 000000000..7fedbd000 Binary files /dev/null and b/MY_Resource/img/Poster_2024_2.Tga differ diff --git a/MY_Resource/img/Poster_2024_2.UITex b/MY_Resource/img/Poster_2024_2.UITex new file mode 100644 index 000000000..dcfa4edb5 Binary files /dev/null and b/MY_Resource/img/Poster_2024_2.UITex differ diff --git a/MY_Resource/img/Poster_2024_2.txt b/MY_Resource/img/Poster_2024_2.txt new file mode 100644 index 000000000..9df8ffa89 --- /dev/null +++ b/MY_Resource/img/Poster_2024_2.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 1024 512 E:\Game Files\SeasunGame\Game\JX3\bin\zhcn_hd\interface\MY\!src-dist\psd\2024_2.tga diff --git a/MY_Resource/img/Poster_2024_3.Tga b/MY_Resource/img/Poster_2024_3.Tga new file mode 100644 index 000000000..0824fabc4 Binary files /dev/null and b/MY_Resource/img/Poster_2024_3.Tga differ diff --git a/MY_Resource/img/Poster_2024_3.UITex b/MY_Resource/img/Poster_2024_3.UITex new file mode 100644 index 000000000..425e398d5 Binary files /dev/null and b/MY_Resource/img/Poster_2024_3.UITex differ diff --git a/MY_Resource/img/Poster_2024_3.txt b/MY_Resource/img/Poster_2024_3.txt new file mode 100644 index 000000000..eeba6c416 --- /dev/null +++ b/MY_Resource/img/Poster_2024_3.txt @@ -0,0 +1,2 @@ +Farme Left Top Width High File +0 0 0 1024 512 D:\Developments\SeasunGame\JX3_DATA\core\interfacesource\MY_ASSETS\PSD\2024_3.tga diff --git a/Boilerplate_Resource/img/WndButton.Tga b/MY_Resource/img/WndButton.Tga similarity index 100% rename from Boilerplate_Resource/img/WndButton.Tga rename to MY_Resource/img/WndButton.Tga diff --git a/Boilerplate_Resource/img/WndButton.UITex b/MY_Resource/img/WndButton.UITex similarity index 100% rename from Boilerplate_Resource/img/WndButton.UITex rename to MY_Resource/img/WndButton.UITex diff --git a/Boilerplate_Resource/img/WndButton.txt b/MY_Resource/img/WndButton.txt similarity index 100% rename from Boilerplate_Resource/img/WndButton.txt rename to MY_Resource/img/WndButton.txt diff --git a/MY_Resource/info.ini b/MY_Resource/info.ini new file mode 100644 index 000000000..13795ead5 --- /dev/null +++ b/MY_Resource/info.ini @@ -0,0 +1,8 @@ +[MY_Resource] +package=MY +name=资源包 +desc=附加图像、音频等资源文件 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_Resource.lua diff --git a/MY_Resource/info.ini.zh_TW b/MY_Resource/info.ini.zh_TW new file mode 100644 index 000000000..fd948fb41 --- /dev/null +++ b/MY_Resource/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_Resource] +package=MY +name=璩囨簮鍖 +desc=闄勫姞鍦栧儚銆侀煶闋荤瓑璩囨簮鏂囦欢 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_Resource.lua diff --git a/Boilerplate_Resource/lang/zhcn.jx3dat b/MY_Resource/lang/zhcn.jx3dat similarity index 100% rename from Boilerplate_Resource/lang/zhcn.jx3dat rename to MY_Resource/lang/zhcn.jx3dat diff --git a/Boilerplate_Resource/lang/zhtw.jx3dat b/MY_Resource/lang/zhtw.jx3dat similarity index 100% rename from Boilerplate_Resource/lang/zhtw.jx3dat rename to MY_Resource/lang/zhtw.jx3dat diff --git a/Boilerplate_Resource/src/Boilerplate_Resource.lua b/MY_Resource/src/MY_Resource.lua similarity index 97% rename from Boilerplate_Resource/src/Boilerplate_Resource.lua rename to MY_Resource/src/MY_Resource.lua index f585a7014..f1829ebc2 100644 --- a/Boilerplate_Resource/src/Boilerplate_Resource.lua +++ b/MY_Resource/src/MY_Resource.lua @@ -3,8 +3,8 @@ -- @desc : 二进制资源 -- @copyright: Emil Zhai -------------------------------------------------------------------------------- ----@class (partial) Boilerplate -local X = Boilerplate +---@class (partial) MY +local X = MY -------------------------------------------------------------------------------- local MODULE_PATH = X.NSFormatString('{$NS}_Resource') local MODULE_NAME = X.NSFormatString('{$NS}_Resource') @@ -12,7 +12,7 @@ local PLUGIN_NAME = X.NSFormatString('{$NS}_Resource') local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') -------------------------------------------------------------------------------- -if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^0.0.0') then +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then return end --[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/data/role/classic_yq.jx3dat b/MY_RoleStatistics/data/role/classic_yq.jx3dat new file mode 100644 index 000000000..a33d9fb88 --- /dev/null +++ b/MY_RoleStatistics/data/role/classic_yq.jx3dat @@ -0,0 +1,322 @@ +return function(env) + return { + -- 装分 + { + szKey = 'equip_score', + szTitle = '装备分数', + szTitleAbbr = '装分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '装备分数提升了%s分', + szCompareDecreaseText = '装备分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetBaseEquipScore() + env.me.GetStrengthEquipScore() + env.me.GetMountsEquipScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 宠物分 + { + szKey = 'pet_score', + szTitle = '宠物分数', + szTitleAbbr = '宠物', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '宠物分数增加了%s分', + szCompareDecreaseText = '宠物分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetAcquiredFellowPetScore() + env.me.GetAcquiredFellowPetMedalScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 金钱 + { + szKey = 'money', + szTitle = '金钱', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 200, + GetValue = function(prevVal, prevRec) + return env.me.GetMoney() + end, + GetSummaryValue = function(values, records) + local tMoney = { nGold = 0, nSilver = 0, nCopper = 0 } + for _, v in env.ipairs(values) do + tMoney = env.MoneyOptAdd(tMoney, v) + end + return tMoney + end, + GetFormatText = function(v, rec) + return env.GetMoneyText(v, 105) + end, + Compare = function(v1, v2) + if v1.nGold == v2.nGold then + if v1.nSilver == v2.nSilver then + if v1.nCopper == v2.nCopper then + return 0 + end + return v1.nCopper > v2.nCopper and 1 or -1 + end + return v1.nSilver > v2.nSilver and 1 or -1 + end + return v1.nGold > v2.nGold and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local money = env.MoneyOptSub(v2, v1) + local nCompare = env.MoneyOptCmp(money, 0) + if nCompare == 0 then + return + end + local f = env.GetMsgFont('MSG_SYS') + local r, g, b = env.GetMsgFontColor('MSG_SYS') + local szExtra = 'font=' .. f .. ' r=' .. r .. ' g=' .. g .. ' b=' .. b + local szPrefix = nCompare >= 0 and '获得金钱' or '消耗金钱' + local moneyAbs = { nGold = env.math.abs(money.nGold), nSilver = env.math.abs(money.nSilver), nCopper = env.math.abs(money.nCopper) } + return env.GetFormatSysmsgText(szPrefix) + .. env.GetMoneyText(moneyAbs, szExtra) + end, + }, + -- 侠义 + { + szKey = 'justice', + szTitle = '侠行点', + szTitleAbbr = '侠行', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得侠行点%s点', + szCompareDecreaseText = '消耗侠行点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nJustice + end, + }, + -- 侠义周余 + { + szKey = 'justice_remain', + szTitle = '侠行点周上限', + szTitleAbbr = '侠行周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetJusticeRemainSpace() + end, + }, + -- 威望 + { + szKey = 'prestige', + szTitle = '威名点', + szTitleAbbr = '威名', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得威名点%s点', + szCompareDecreaseText = '消耗威名点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nCurrentPrestige + end, + }, + -- 威望周余 + { + szKey = 'prestige_remain', + szTitle = '威名点周上限', + szTitleAbbr = '威名周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetPrestigeRemainSpace() + end, + }, + -- 战阶积分 + { + szKey = 'camp_point', + szTitle = '战阶积分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + szCompareIncreaseText = '获得战阶积分%s点', + szCompareDecreaseText = '消耗战阶积分%s点', + GetValue = function(prevVal, prevRec) + return env.me.nTitlePoint + end, + }, + -- 战阶等级 + { + szKey = 'camp_level', + szTitle = '战阶等级', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { level = env.me.nTitle, percent = env.me.GetRankPointPercentage() } + end, + GetSummaryValue = function() + return '--' + end, + Compare = function(v1, v2) + if v1.level == v2.level then + if v1.percent == v2.percent then + return 0 + end + return v1.percent > v2.percent and 1 or -1 + end + return v1.level > v2.level and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsString(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.level .. ' + ' .. v.percent .. '%', 162, 255, 255, 255) + end, + }, + -- 资历 + { + szKey = 'achievement_score', + szTitle = '江湖资历', + szTitleAbbr = '资历', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得江湖资历值%s点', + szCompareDecreaseText = '消耗江湖资历值%s点', + GetValue = function(prevVal, prevRec) + return env.me.GetAchievementRecord() + end, + }, + -- 通宝 + { + szKey = 'coin', + szTitle = '通宝', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { owner = env.GetAccount() .. '#' .. env.GetRegionOriginName(), value = env.me.nCoin } + end, + GetSummaryValue = function(values, records) + local tOwner, nCoin = {}, 0 + for _, v in env.ipairs(values) do + if not tOwner[v.owner] and env.IsNumber(v.value) then + nCoin = nCoin + v.value + tOwner[v.owner] = true + end + end + return nCoin + end, + Compare = function(v1, v2) + if v1.value == v2.value then + return 0 + end + if not v1.value then + return -1 + end + if not v2.value then + return 1 + end + return v1.value > v2.value and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.value, 162, 255, 255, 255) + end, + }, + -- 师徒分 + { + szKey = 'mentor_score', + szTitle = '师徒', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得师徒值%s点', + szCompareDecreaseText = '消耗师徒值%s点', + GetValue = function(prevVal, prevRec) + return env.me.dwTAEquipsScore + end, + }, + -- 八荒 + { + szKey = 'eight_wasters_award', + szTitle = '八荒衡鉴(普通模式奖励 + 挑战模式奖励)', + szTitleAbbr = '八荒', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return {env.GetEightWastersAwardNum()} + end, + GetSummaryValue = function(values, records) + return {} + end, + Compare = function(v1, v2) + if v1[1] == v2[1] and v1[2] == v2[2] then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1[1] == v2[1] then + return v1[2] > v2[2] and 1 or -1 + end + return v1[1] > v2[1] and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if not v[1] or not v[2] then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsTable(v) then + return env.GetFormatText(v[1] .. ' + ' .. v[2], 162, 255, 255, 255) + end + return '' + end, + }, + } +end diff --git a/MY_RoleStatistics/data/role/zhcn_exp.jx3dat b/MY_RoleStatistics/data/role/zhcn_exp.jx3dat new file mode 100644 index 000000000..b4fcc9226 --- /dev/null +++ b/MY_RoleStatistics/data/role/zhcn_exp.jx3dat @@ -0,0 +1,569 @@ +return function(env) + local swap = {} + return { + -- 装分 + { + szKey = 'equip_score', + szTitle = '装备分数', + szTitleAbbr = '装分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '装备分数提升了%s分', + szCompareDecreaseText = '装备分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetBaseEquipScore() + env.me.GetStrengthEquipScore() + env.me.GetMountsEquipScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 宠物分 + { + szKey = 'pet_score', + szTitle = '宠物分数', + szTitleAbbr = '宠物', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '宠物分数增加了%s分', + szCompareDecreaseText = '宠物分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetAcquiredFellowPetScore() + env.me.GetAcquiredFellowPetMedalScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 金钱 + { + szKey = 'money', + szTitle = '金钱', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 200, + GetValue = function(prevVal, prevRec) + return env.me.GetMoney() + end, + GetSummaryValue = function(values, records) + local tMoney = { nGold = 0, nSilver = 0, nCopper = 0 } + for _, v in env.ipairs(values) do + tMoney = env.MoneyOptAdd(tMoney, v) + end + return tMoney + end, + GetFormatText = function(v, rec) + return env.GetMoneyText(v, 105) + end, + Compare = function(v1, v2) + if v1.nGold == v2.nGold then + if v1.nSilver == v2.nSilver then + if v1.nCopper == v2.nCopper then + return 0 + end + return v1.nCopper > v2.nCopper and 1 or -1 + end + return v1.nSilver > v2.nSilver and 1 or -1 + end + return v1.nGold > v2.nGold and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local money = env.MoneyOptSub(v2, v1) + local nCompare = env.MoneyOptCmp(money, 0) + if nCompare == 0 then + return + end + local f = env.GetMsgFont('MSG_SYS') + local r, g, b = env.GetMsgFontColor('MSG_SYS') + local szExtra = 'font=' .. f .. ' r=' .. r .. ' g=' .. g .. ' b=' .. b + local szPrefix = nCompare >= 0 and '获得金钱' or '消耗金钱' + local moneyAbs = { nGold = env.math.abs(money.nGold), nSilver = env.math.abs(money.nSilver), nCopper = env.math.abs(money.nCopper) } + return env.GetFormatSysmsgText(szPrefix) + .. env.GetMoneyText(moneyAbs, szExtra) + end, + }, + -- 账号精力 + { + szKey = 'account_stamina', + szTitle = '账号精力', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nCurrentStamina, max = env.me.nMaxStamina } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 角色精力 + { + szKey = 'role_stamina', + szTitle = '角色精力', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nVigor, max = env.me.GetMaxVigor() } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 精力周余 + { + szKey = 'role_stamina_remain', + szTitle = '角色精力周上限', + szTitleAbbr = '精力周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetVigorRemainSpace() + end, + }, + -- 侠义 + { + szKey = 'justice', + szTitle = '侠行点', + szTitleAbbr = '侠行', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得侠行点%s点', + szCompareDecreaseText = '消耗侠行点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nJustice + end, + }, + -- 侠义周余 + { + szKey = 'justice_remain', + szTitle = '侠行点周上限', + szTitleAbbr = '侠行周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetJusticeRemainSpace() + end, + }, + -- 休闲点 + { + szKey = 'contribution', + szTitle = '休闲点', + szTitleAbbr = '休闲', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得休闲点%s点', + szCompareDecreaseText = '消耗休闲点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nContribution + end, + }, + -- 休闲点周余 + { + szKey = 'contribution_remain', + szTitle = '休闲点周上限', + szTitleAbbr = '休闲周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetContributionRemainSpace() + end, + }, + -- 浪客笺 + { + szKey = 'starve', + szTitle = '浪客笺', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得浪客笺%s份', + szCompareDecreaseText = '消耗浪客笺%s份', + GetValue = function(prevVal, prevRec) + return env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 34797, true) + + env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 40259, true) + end, + }, + -- 浪客笺周余 + { + szKey = 'starve_remain', + szTitle = '浪客笺周上限', + szTitleAbbr = '浪客周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterFrameCreate('regionPQreward', 'MY_RoleStatistics_RoleStat__starve', function() + local frame = env.arg0 + if not frame then + return + end + local txt = frame:Lookup('', 'Text_discrible') + txt.__SetText = txt.SetText + txt.SetText = function(txt, szText) + local szNum = szText:match('本周还可获得(%d+)份浪客笺。') + or szText:match('本周还可获得(%d+)份浪客笺及注疏值。') + if szNum then + swap['starve_remain'] = env.tonumber(szNum) + end + txt:__SetText(szText) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['starve_remain'] or prevVal + end, + }, + -- 园宅币 + { + szKey = 'architecture', + szTitle = '园宅币', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + GetValue = function(prevVal, prevRec) + return env.me.nArchitecture + end, + }, + -- 园宅币周余 + { + szKey = 'architecture_remain', + szTitle = '园宅币周上限', + szTitleAbbr = '园宅周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetArchitectureRemainSpace() + end, + }, + -- 百战 + { + szKey = 'monster', + szTitle = '百战异闻录', + szTitleAbbr = '百战', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterEvent('LOADING_END', 'MY_RoleStatistics_RoleStat__monster', function() + if env.IsInMonsterMap() then + if not env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster') then + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', function() + -- buff update: + -- arg0:dwPlayerID,arg1:bDelete,arg2:nIndex,arg3:bCanCancel + -- arg4:dwBuffID,arg5:nStackNum,arg6:nEndFrame,arg7:?update all? + -- arg8:nLevel,arg9:dwSkillSrcID + if env.arg0 ~= env.me.dwID then + return + end + if env.arg4 == 24917 then + swap['monster'][1] = env.arg5 + end + if env.arg4 == 24918 then + swap['monster'][2] = env.arg5 + end + end) + end + local bf1 = env.me.GetBuff(24917, 0) + local bf2 = env.me.GetBuff(24918, 0) + swap['monster'] = { bf1 and bf1.nStackNum or 0, bf2 and bf2.nStackNum or 0 } + else + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', false) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['monster'] or prevVal or {12, 6} + end, + GetSummaryValue = function() + return nil + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + return env.GetFormatText(v[1] .. '+' .. v[2], 162, 255, 255, 255) + end, + Compare = function(v1, v2) + if not v1 and not v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + local n1 = v1[1] + v1[2] + local n2 = v2[1] + v2[2] + if n1 == n2 then + return 0 + end + return n1 > n2 and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local n1 = v1 and (v1[1] + v1[2]) or 0 + local n2 = v2 and (v2[1] + v2[2]) or 0 + local nCompare = n2 - n1 + if nCompare == 0 then + return + end + local szPrefix = nCompare >= 0 and '百战异闻录次数增加%s次' or '百战异闻录次数消耗%s次' + return env.GetFormatSysmsgText(szPrefix:format(nCompare)) + end, + }, + -- 威望 + { + szKey = 'prestige', + szTitle = '威名点', + szTitleAbbr = '威名', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得威名点%s点', + szCompareDecreaseText = '消耗威名点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nCurrentPrestige + end, + }, + -- 威望周余 + { + szKey = 'prestige_remain', + szTitle = '威名点周上限', + szTitleAbbr = '威名周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetPrestigeRemainSpace() + end, + }, + -- 战阶积分 + { + szKey = 'camp_point', + szTitle = '战阶积分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + szCompareIncreaseText = '获得战阶积分%s点', + szCompareDecreaseText = '消耗战阶积分%s点', + GetValue = function(prevVal, prevRec) + return env.me.nTitlePoint + end, + }, + -- 战阶等级 + { + szKey = 'camp_level', + szTitle = '战阶等级', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { level = env.me.nTitle, percent = env.me.GetRankPointPercentage() } + end, + GetSummaryValue = function() + return '--' + end, + Compare = function(v1, v2) + if v1.level == v2.level then + if v1.percent == v2.percent then + return 0 + end + return v1.percent > v2.percent and 1 or -1 + end + return v1.level > v2.level and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsString(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.level .. ' + ' .. v.percent .. '%', 162, 255, 255, 255) + end, + }, + -- 资历 + { + szKey = 'achievement_score', + szTitle = '江湖资历', + szTitleAbbr = '资历', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得江湖资历值%s点', + szCompareDecreaseText = '消耗江湖资历值%s点', + GetValue = function(prevVal, prevRec) + return env.me.GetAchievementRecord() + end, + }, + -- 通宝 + { + szKey = 'coin', + szTitle = '通宝', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { owner = env.GetAccount() .. '#' .. env.GetRegionOriginName(), value = env.me.nCoin } + end, + GetSummaryValue = function(values, records) + local tOwner, nCoin = {}, 0 + for _, v in env.ipairs(values) do + if not tOwner[v.owner] and env.IsNumber(v.value) then + nCoin = nCoin + v.value + tOwner[v.owner] = true + end + end + return nCoin + end, + Compare = function(v1, v2) + if v1.value == v2.value then + return 0 + end + if not v1.value then + return -1 + end + if not v2.value then + return 1 + end + return v1.value > v2.value and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.value, 162, 255, 255, 255) + end, + }, + -- 师徒分 + { + szKey = 'mentor_score', + szTitle = '师徒', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得师徒值%s点', + szCompareDecreaseText = '消耗师徒值%s点', + GetValue = function(prevVal, prevRec) + return env.me.dwTAEquipsScore + end, + }, + } +end diff --git a/MY_RoleStatistics/data/role/zhcn_hd.jx3dat b/MY_RoleStatistics/data/role/zhcn_hd.jx3dat new file mode 100644 index 000000000..b4fcc9226 --- /dev/null +++ b/MY_RoleStatistics/data/role/zhcn_hd.jx3dat @@ -0,0 +1,569 @@ +return function(env) + local swap = {} + return { + -- 装分 + { + szKey = 'equip_score', + szTitle = '装备分数', + szTitleAbbr = '装分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '装备分数提升了%s分', + szCompareDecreaseText = '装备分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetBaseEquipScore() + env.me.GetStrengthEquipScore() + env.me.GetMountsEquipScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 宠物分 + { + szKey = 'pet_score', + szTitle = '宠物分数', + szTitleAbbr = '宠物', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '宠物分数增加了%s分', + szCompareDecreaseText = '宠物分数降低了%s分', + GetValue = function(prevVal, prevRec) + return env.me.GetAcquiredFellowPetScore() + env.me.GetAcquiredFellowPetMedalScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 金钱 + { + szKey = 'money', + szTitle = '金钱', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 200, + GetValue = function(prevVal, prevRec) + return env.me.GetMoney() + end, + GetSummaryValue = function(values, records) + local tMoney = { nGold = 0, nSilver = 0, nCopper = 0 } + for _, v in env.ipairs(values) do + tMoney = env.MoneyOptAdd(tMoney, v) + end + return tMoney + end, + GetFormatText = function(v, rec) + return env.GetMoneyText(v, 105) + end, + Compare = function(v1, v2) + if v1.nGold == v2.nGold then + if v1.nSilver == v2.nSilver then + if v1.nCopper == v2.nCopper then + return 0 + end + return v1.nCopper > v2.nCopper and 1 or -1 + end + return v1.nSilver > v2.nSilver and 1 or -1 + end + return v1.nGold > v2.nGold and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local money = env.MoneyOptSub(v2, v1) + local nCompare = env.MoneyOptCmp(money, 0) + if nCompare == 0 then + return + end + local f = env.GetMsgFont('MSG_SYS') + local r, g, b = env.GetMsgFontColor('MSG_SYS') + local szExtra = 'font=' .. f .. ' r=' .. r .. ' g=' .. g .. ' b=' .. b + local szPrefix = nCompare >= 0 and '获得金钱' or '消耗金钱' + local moneyAbs = { nGold = env.math.abs(money.nGold), nSilver = env.math.abs(money.nSilver), nCopper = env.math.abs(money.nCopper) } + return env.GetFormatSysmsgText(szPrefix) + .. env.GetMoneyText(moneyAbs, szExtra) + end, + }, + -- 账号精力 + { + szKey = 'account_stamina', + szTitle = '账号精力', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nCurrentStamina, max = env.me.nMaxStamina } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 角色精力 + { + szKey = 'role_stamina', + szTitle = '角色精力', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nVigor, max = env.me.GetMaxVigor() } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 精力周余 + { + szKey = 'role_stamina_remain', + szTitle = '角色精力周上限', + szTitleAbbr = '精力周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetVigorRemainSpace() + end, + }, + -- 侠义 + { + szKey = 'justice', + szTitle = '侠行点', + szTitleAbbr = '侠行', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得侠行点%s点', + szCompareDecreaseText = '消耗侠行点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nJustice + end, + }, + -- 侠义周余 + { + szKey = 'justice_remain', + szTitle = '侠行点周上限', + szTitleAbbr = '侠行周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetJusticeRemainSpace() + end, + }, + -- 休闲点 + { + szKey = 'contribution', + szTitle = '休闲点', + szTitleAbbr = '休闲', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得休闲点%s点', + szCompareDecreaseText = '消耗休闲点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nContribution + end, + }, + -- 休闲点周余 + { + szKey = 'contribution_remain', + szTitle = '休闲点周上限', + szTitleAbbr = '休闲周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetContributionRemainSpace() + end, + }, + -- 浪客笺 + { + szKey = 'starve', + szTitle = '浪客笺', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '获得浪客笺%s份', + szCompareDecreaseText = '消耗浪客笺%s份', + GetValue = function(prevVal, prevRec) + return env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 34797, true) + + env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 40259, true) + end, + }, + -- 浪客笺周余 + { + szKey = 'starve_remain', + szTitle = '浪客笺周上限', + szTitleAbbr = '浪客周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterFrameCreate('regionPQreward', 'MY_RoleStatistics_RoleStat__starve', function() + local frame = env.arg0 + if not frame then + return + end + local txt = frame:Lookup('', 'Text_discrible') + txt.__SetText = txt.SetText + txt.SetText = function(txt, szText) + local szNum = szText:match('本周还可获得(%d+)份浪客笺。') + or szText:match('本周还可获得(%d+)份浪客笺及注疏值。') + if szNum then + swap['starve_remain'] = env.tonumber(szNum) + end + txt:__SetText(szText) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['starve_remain'] or prevVal + end, + }, + -- 园宅币 + { + szKey = 'architecture', + szTitle = '园宅币', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + GetValue = function(prevVal, prevRec) + return env.me.nArchitecture + end, + }, + -- 园宅币周余 + { + szKey = 'architecture_remain', + szTitle = '园宅币周上限', + szTitleAbbr = '园宅周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetArchitectureRemainSpace() + end, + }, + -- 百战 + { + szKey = 'monster', + szTitle = '百战异闻录', + szTitleAbbr = '百战', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterEvent('LOADING_END', 'MY_RoleStatistics_RoleStat__monster', function() + if env.IsInMonsterMap() then + if not env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster') then + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', function() + -- buff update: + -- arg0:dwPlayerID,arg1:bDelete,arg2:nIndex,arg3:bCanCancel + -- arg4:dwBuffID,arg5:nStackNum,arg6:nEndFrame,arg7:?update all? + -- arg8:nLevel,arg9:dwSkillSrcID + if env.arg0 ~= env.me.dwID then + return + end + if env.arg4 == 24917 then + swap['monster'][1] = env.arg5 + end + if env.arg4 == 24918 then + swap['monster'][2] = env.arg5 + end + end) + end + local bf1 = env.me.GetBuff(24917, 0) + local bf2 = env.me.GetBuff(24918, 0) + swap['monster'] = { bf1 and bf1.nStackNum or 0, bf2 and bf2.nStackNum or 0 } + else + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', false) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['monster'] or prevVal or {12, 6} + end, + GetSummaryValue = function() + return nil + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + return env.GetFormatText(v[1] .. '+' .. v[2], 162, 255, 255, 255) + end, + Compare = function(v1, v2) + if not v1 and not v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + local n1 = v1[1] + v1[2] + local n2 = v2[1] + v2[2] + if n1 == n2 then + return 0 + end + return n1 > n2 and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local n1 = v1 and (v1[1] + v1[2]) or 0 + local n2 = v2 and (v2[1] + v2[2]) or 0 + local nCompare = n2 - n1 + if nCompare == 0 then + return + end + local szPrefix = nCompare >= 0 and '百战异闻录次数增加%s次' or '百战异闻录次数消耗%s次' + return env.GetFormatSysmsgText(szPrefix:format(nCompare)) + end, + }, + -- 威望 + { + szKey = 'prestige', + szTitle = '威名点', + szTitleAbbr = '威名', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得威名点%s点', + szCompareDecreaseText = '消耗威名点%s点', + GetValue = function(prevVal, prevRec) + return env.me.nCurrentPrestige + end, + }, + -- 威望周余 + { + szKey = 'prestige_remain', + szTitle = '威名点周上限', + szTitleAbbr = '威名周', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetPrestigeRemainSpace() + end, + }, + -- 战阶积分 + { + szKey = 'camp_point', + szTitle = '战阶积分', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + szCompareIncreaseText = '获得战阶积分%s点', + szCompareDecreaseText = '消耗战阶积分%s点', + GetValue = function(prevVal, prevRec) + return env.me.nTitlePoint + end, + }, + -- 战阶等级 + { + szKey = 'camp_level', + szTitle = '战阶等级', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { level = env.me.nTitle, percent = env.me.GetRankPointPercentage() } + end, + GetSummaryValue = function() + return '--' + end, + Compare = function(v1, v2) + if v1.level == v2.level then + if v1.percent == v2.percent then + return 0 + end + return v1.percent > v2.percent and 1 or -1 + end + return v1.level > v2.level and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsString(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.level .. ' + ' .. v.percent .. '%', 162, 255, 255, 255) + end, + }, + -- 资历 + { + szKey = 'achievement_score', + szTitle = '江湖资历', + szTitleAbbr = '资历', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得江湖资历值%s点', + szCompareDecreaseText = '消耗江湖资历值%s点', + GetValue = function(prevVal, prevRec) + return env.me.GetAchievementRecord() + end, + }, + -- 通宝 + { + szKey = 'coin', + szTitle = '通宝', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { owner = env.GetAccount() .. '#' .. env.GetRegionOriginName(), value = env.me.nCoin } + end, + GetSummaryValue = function(values, records) + local tOwner, nCoin = {}, 0 + for _, v in env.ipairs(values) do + if not tOwner[v.owner] and env.IsNumber(v.value) then + nCoin = nCoin + v.value + tOwner[v.owner] = true + end + end + return nCoin + end, + Compare = function(v1, v2) + if v1.value == v2.value then + return 0 + end + if not v1.value then + return -1 + end + if not v2.value then + return 1 + end + return v1.value > v2.value and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.value, 162, 255, 255, 255) + end, + }, + -- 师徒分 + { + szKey = 'mentor_score', + szTitle = '师徒', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '获得师徒值%s点', + szCompareDecreaseText = '消耗师徒值%s点', + GetValue = function(prevVal, prevRec) + return env.me.dwTAEquipsScore + end, + }, + } +end diff --git a/MY_RoleStatistics/data/role/zhtw_hd.jx3dat b/MY_RoleStatistics/data/role/zhtw_hd.jx3dat new file mode 100644 index 000000000..69ae2d3b4 --- /dev/null +++ b/MY_RoleStatistics/data/role/zhtw_hd.jx3dat @@ -0,0 +1,569 @@ +return function(env) + local swap = {} + return { + -- 瑁濆垎 + { + szKey = 'equip_score', + szTitle = '瑁濆倷鍒嗘暩', + szTitleAbbr = '瑁濆垎', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '瑁濆倷鍒嗘暩鎻愬崌浜%s鍒', + szCompareDecreaseText = '瑁濆倷鍒嗘暩闄嶄綆浜%s鍒', + GetValue = function(prevVal, prevRec) + return env.me.GetBaseEquipScore() + env.me.GetStrengthEquipScore() + env.me.GetMountsEquipScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 瀵电墿鍒 + { + szKey = 'pet_score', + szTitle = '瀵电墿鍒嗘暩', + szTitleAbbr = '瀵电墿', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 55, + szCompareIncreaseText = '瀵电墿鍒嗘暩澧炲姞浜%s鍒', + szCompareDecreaseText = '瀵电墿鍒嗘暩闄嶄綆浜%s鍒', + GetValue = function(prevVal, prevRec) + return env.me.GetAcquiredFellowPetScore() + env.me.GetAcquiredFellowPetMedalScore() + end, + GetSummaryValue = function() + return '--' + end, + }, + -- 閲戦將 + { + szKey = 'money', + szTitle = '閲戦將', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 200, + GetValue = function(prevVal, prevRec) + return env.me.GetMoney() + end, + GetSummaryValue = function(values, records) + local tMoney = { nGold = 0, nSilver = 0, nCopper = 0 } + for _, v in env.ipairs(values) do + tMoney = env.MoneyOptAdd(tMoney, v) + end + return tMoney + end, + GetFormatText = function(v, rec) + return env.GetMoneyText(v, 105) + end, + Compare = function(v1, v2) + if v1.nGold == v2.nGold then + if v1.nSilver == v2.nSilver then + if v1.nCopper == v2.nCopper then + return 0 + end + return v1.nCopper > v2.nCopper and 1 or -1 + end + return v1.nSilver > v2.nSilver and 1 or -1 + end + return v1.nGold > v2.nGold and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local money = env.MoneyOptSub(v2, v1) + local nCompare = env.MoneyOptCmp(money, 0) + if nCompare == 0 then + return + end + local f = env.GetMsgFont('MSG_SYS') + local r, g, b = env.GetMsgFontColor('MSG_SYS') + local szExtra = 'font=' .. f .. ' r=' .. r .. ' g=' .. g .. ' b=' .. b + local szPrefix = nCompare >= 0 and '鐛插緱閲戦將' or '娑堣楅噾閷' + local moneyAbs = { nGold = env.math.abs(money.nGold), nSilver = env.math.abs(money.nSilver), nCopper = env.math.abs(money.nCopper) } + return env.GetFormatSysmsgText(szPrefix) + .. env.GetMoneyText(moneyAbs, szExtra) + end, + }, + -- 璩櫉绮惧姏 + { + szKey = 'account_stamina', + szTitle = '璩櫉绮惧姏', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nCurrentStamina, max = env.me.nMaxStamina } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 瑙掕壊绮惧姏 + { + szKey = 'role_stamina', + szTitle = '瑙掕壊绮惧姏', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 100, + GetValue = function(prevVal, prevRec) + return { current = env.me.nVigor, max = env.me.GetMaxVigor() } + end, + GetSummaryValue = function(values, records) + local current = 0 + for _, v in env.ipairs(values) do + current = current + v.current + end + return current + end, + Compare = function(v1, v2, r1, r2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + if v1.current == v2.current then + return 0 + end + return v1.current > v2.current and 1 or -1 + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.current .. '/' .. v.max, 162, 255, 255, 255) + end, + }, + -- 绮惧姏鍛ㄩ + { + szKey = 'role_stamina_remain', + szTitle = '瑙掕壊绮惧姏鍛ㄤ笂闄', + szTitleAbbr = '绮惧姏鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetVigorRemainSpace() + end, + }, + -- 淇犵京 + { + szKey = 'justice', + szTitle = '淇犺榛', + szTitleAbbr = '淇犺', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '鐛插緱淇犺榛%s榛', + szCompareDecreaseText = '娑堣椾繝琛岄粸%s榛', + GetValue = function(prevVal, prevRec) + return env.me.nJustice + end, + }, + -- 淇犵京鍛ㄩ + { + szKey = 'justice_remain', + szTitle = '淇犺榛炲懆涓婇檺', + szTitleAbbr = '淇犺鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetJusticeRemainSpace() + end, + }, + -- 浼戦枒榛 + { + szKey = 'contribution', + szTitle = '浼戦枒榛', + szTitleAbbr = '浼戦枒', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '鐛插緱浼戦枒榛%s榛', + szCompareDecreaseText = '娑堣椾紤闁戦粸%s榛', + GetValue = function(prevVal, prevRec) + return env.me.nContribution + end, + }, + -- 浼戦枒榛炲懆椁 + { + szKey = 'contribution_remain', + szTitle = '浼戦枒榛炲懆涓婇檺', + szTitleAbbr = '浼戦枒鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetContributionRemainSpace() + end, + }, + -- 娴绠 + { + szKey = 'starve', + szTitle = '娴绠', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szCompareIncreaseText = '鐛插緱娴绠%s浠', + szCompareDecreaseText = '娑堣楁氮瀹㈢畫%s浠', + GetValue = function(prevVal, prevRec) + return env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 34797, true) + + env.GetItemAmountInAllPackages(env.ITEM_TABLE_TYPE.OTHER, 40259, true) + end, + }, + -- 娴绠嬪懆椁 + { + szKey = 'starve_remain', + szTitle = '娴绠嬪懆涓婇檺', + szTitleAbbr = '娴鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterFrameCreate('regionPQreward', 'MY_RoleStatistics_RoleStat__starve', function() + local frame = env.arg0 + if not frame then + return + end + local txt = frame:Lookup('', 'Text_discrible') + txt.__SetText = txt.SetText + txt.SetText = function(txt, szText) + local szNum = szText:match('鏈懆閭勫彲鐛插緱(%d+)浠芥氮瀹㈢畫銆') + or szText:match('鏈懆閭勫彲鐛插緱(%d+)浠芥氮瀹㈢畫鍙婃敞鐤忓笺') + if szNum then + swap['starve_remain'] = env.tonumber(szNum) + end + txt:__SetText(szText) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['starve_remain'] or prevVal + end, + }, + -- 鍦掑畢骞 + { + szKey = 'architecture', + szTitle = '鍦掑畢骞', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + GetValue = function(prevVal, prevRec) + return env.me.nArchitecture + end, + }, + -- 鍦掑畢骞e懆椁 + { + szKey = 'architecture_remain', + szTitle = '鍦掑畢骞e懆涓婇檺', + szTitleAbbr = '鍦掑畢鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetArchitectureRemainSpace() + end, + }, + -- 鐧炬埌 + { + szKey = 'monster', + szTitle = '鐧炬埌鐣拌仦閷', + szTitleAbbr = '鐧炬埌', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 60, + szRefreshCircle = 'weekly', + Collector = function() + env.RegisterEvent('LOADING_END', 'MY_RoleStatistics_RoleStat__monster', function() + if env.IsInMonsterMap() then + if not env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster') then + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', function() + -- buff update锛 + -- arg0锛歞wPlayerID锛宎rg1锛歜Delete锛宎rg2锛歯Index锛宎rg3锛歜CanCancel + -- arg4锛歞wBuffID锛宎rg5锛歯StackNum锛宎rg6锛歯EndFrame锛宎rg7锛氾紵update all? + -- arg8锛歯Level锛宎rg9锛歞wSkillSrcID + if env.arg0 ~= env.me.dwID then + return + end + if env.arg4 == 24917 then + swap['monster'][1] = env.arg5 + end + if env.arg4 == 24918 then + swap['monster'][2] = env.arg5 + end + end) + end + local bf1 = env.me.GetBuff(24917, 0) + local bf2 = env.me.GetBuff(24918, 0) + swap['monster'] = { bf1 and bf1.nStackNum or 0, bf2 and bf2.nStackNum or 0 } + else + env.RegisterEvent('BUFF_UPDATE', 'MY_RoleStatistics_RoleStat__monster', false) + end + end) + end, + GetValue = function(prevVal, prevRec) + return swap['monster'] or prevVal or {12, 6} + end, + GetSummaryValue = function() + return nil + end, + GetFormatText = function(v, rec) + if not v then + return env.GetFormatText('--', 162, 255, 255, 255) + end + return env.GetFormatText(v[1] .. '+' .. v[2], 162, 255, 255, 255) + end, + Compare = function(v1, v2) + if not v1 and not v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + local n1 = v1[1] + v1[2] + local n2 = v2[1] + v2[2] + if n1 == n2 then + return 0 + end + return n1 > n2 and 1 or -1 + end, + GetCompareText = function(v1, v2, r1, r2) + local n1 = v1 and (v1[1] + v1[2]) or 0 + local n2 = v2 and (v2[1] + v2[2]) or 0 + local nCompare = n2 - n1 + if nCompare == 0 then + return + end + local szPrefix = nCompare >= 0 and '鐧炬埌鐣拌仦閷勬鏁稿鍔%s娆' or '鐧炬埌鐣拌仦閷勬鏁告秷鑰%s娆' + return env.GetFormatSysmsgText(szPrefix:format(nCompare)) + end, + }, + -- 濞佹湜 + { + szKey = 'prestige', + szTitle = '濞佸悕榛', + szTitleAbbr = '濞佸悕', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '鐛插緱濞佸悕榛%s榛', + szCompareDecreaseText = '娑堣楀▉鍚嶉粸%s榛', + GetValue = function(prevVal, prevRec) + return env.me.nCurrentPrestige + end, + }, + -- 濞佹湜鍛ㄩ + { + szKey = 'prestige_remain', + szTitle = '濞佸悕榛炲懆涓婇檺', + szTitleAbbr = '濞佸悕鍛', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + GetValue = function(prevVal, prevRec) + return env.me.GetPrestigeRemainSpace() + end, + }, + -- 鎴伴殠绌嶅垎 + { + szKey = 'camp_point', + szTitle = '鎴伴殠绌嶅垎', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szRefreshCircle = 'weekly', + szCompareIncreaseText = '鐛插緱鎴伴殠绌嶅垎%s榛', + szCompareDecreaseText = '娑堣楁埌闅庣⿳鍒%s榛', + GetValue = function(prevVal, prevRec) + return env.me.nTitlePoint + end, + }, + -- 鎴伴殠绛夌礆 + { + szKey = 'camp_level', + szTitle = '鎴伴殠绛夌礆', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { level = env.me.nTitle, percent = env.me.GetRankPointPercentage() } + end, + GetSummaryValue = function() + return '--' + end, + Compare = function(v1, v2) + if v1.level == v2.level then + if v1.percent == v2.percent then + return 0 + end + return v1.percent > v2.percent and 1 or -1 + end + return v1.level > v2.level and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsString(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.level .. ' + ' .. v.percent .. '%', 162, 255, 255, 255) + end, + }, + -- 璩囨 + { + szKey = 'achievement_score', + szTitle = '姹熸箹璩囨', + szTitleAbbr = '璩囨', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '鐛插緱姹熸箹璩囨鍊%s榛', + szCompareDecreaseText = '娑堣楁睙婀栬硣姝峰%s榛', + GetValue = function(prevVal, prevRec) + return env.me.GetAchievementRecord() + end, + }, + -- 閫氬 + { + szKey = 'coin', + szTitle = '閫氬', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + GetValue = function(prevVal, prevRec) + return { owner = env.GetAccount() .. '#' .. env.GetRegionOriginName(), value = env.me.nCoin } + end, + GetSummaryValue = function(values, records) + local tOwner, nCoin = {}, 0 + for _, v in env.ipairs(values) do + if not tOwner[v.owner] and env.IsNumber(v.value) then + nCoin = nCoin + v.value + tOwner[v.owner] = true + end + end + return nCoin + end, + Compare = function(v1, v2) + if v1.value == v2.value then + return 0 + end + if not v1.value then + return -1 + end + if not v2.value then + return 1 + end + return v1.value > v2.value and 1 or -1 + end, + GetFormatText = function(v, r) + if not v then + return '' + end + if env.IsNumber(v) then + return env.GetFormatText(v, 162, 255, 255, 255) + end + return env.GetFormatText(v.value, 162, 255, 255, 255) + end, + }, + -- 甯緬鍒 + { + szKey = 'mentor_score', + szTitle = '甯緬', + bTable = true, + bRowTip = true, + bFloatTip = true, + bAlertChange = true, + nMinWidth = 70, + szCompareIncreaseText = '鐛插緱甯緬鍊%s榛', + szCompareDecreaseText = '娑堣楀斧寰掑%s榛', + GetValue = function(prevVal, prevRec) + return env.me.dwTAEquipsScore + end, + }, + } +end diff --git a/MY_RoleStatistics/data/task/classic_yq.jx3dat b/MY_RoleStatistics/data/task/classic_yq.jx3dat new file mode 100644 index 000000000..9bccaf5db --- /dev/null +++ b/MY_RoleStatistics/data/task/classic_yq.jx3dat @@ -0,0 +1,146 @@ +return function(env) + local swap = {} + return { + { -- 大战 + szKey = 'big_war', + szTitle = '大战', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + -- 95级 + {14765, 869}, -- 大战!英雄微山书院! + {14766, 869}, -- 大战!英雄天泣林! + {14767, 869}, -- 大战!英雄梵空禅院! + {14768, 869}, -- 大战!英雄阴山圣泉! + {14769, 869}, -- 大战!英雄引仙水榭! + -- 95级后 + -- {17816, 869}, -- 大战!英雄稻香秘事! + -- {17817, 869}, -- 大战!英雄银雾湖! + -- {17818, 869}, -- 大战!英雄刀轮海厅! + -- {17819, 869}, -- 大战!英雄夕颜阁! + -- {17820, 869}, -- 大战!英雄白帝水宫! + -- 100级 + -- {19191, 869}, -- 大战!英雄九辩馆! + -- {19192, 869}, -- 大战!英雄泥兰洞天! + -- {19195, 869}, -- 大战!英雄镜泊糊! + -- {19196, 869}, -- 大战!英雄大衍盘丝洞! + -- {19197, 869}, -- 大战!英雄迷渊岛! + -- {21570, 869}, -- 大战!英雄玄鹤别院! + -- {21572, 869}, -- 大战!英雄周天屿! + -- 110级 + -- {22939, 869}, -- 大战!英雄剑冢惊变! + -- {22941, 869}, -- 大战!英雄梧桐山庄! + -- {22942, 869}, -- 大战!英雄月落三星! + -- {22950, 869}, -- 大战!英雄罗汉门! + -- {22951, 869}, -- 大战!英雄梦入集真岛! + + }, + }, + { -- 茶馆 + szKey = 'teahouse', + szTitle = '茶馆', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + -- 90级 + -- {11115, 23669}, -- 乱世烽烟江湖行 + -- 95级 + {14246, 45009}, -- 快马江湖杯中茶 + -- 100级 + -- {19514, 63734}, -- 沧海云帆闻茶香 + -- 110级 + -- {22700, 101195}, -- 江湖烟雨任平生 + -- 120级 + -- {25220, 111762}, -- 一盏香茗话春秋 + -- 130级 + -- {27616, 129862}, -- 驼铃沙语伴茶香 + }, + }, + { -- 勤修不辍 + szKey = 'force_routine', + szTitle = '勤修不辍', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tForceQuestInfo = { + [env.FORCE_TYPE.TIAN_CE ] = {{8206, 16747}, {11254, 16747}, {11255, 16747}}, -- 天策 + [env.FORCE_TYPE.CHUN_YANG] = {{8347, 16747}, {8398, 16747}}, -- 纯阳 + [env.FORCE_TYPE.WAN_HUA ] = {{8348, 16747}, {8399, 16747}, {22842, 16747}, {22929, 16747}}, -- 万花 + [env.FORCE_TYPE.SHAO_LIN ] = {{8349, 16747}, {8400, 16747}, {22851, 16747}, {22930, 16747}}, -- 少林 + [env.FORCE_TYPE.QI_XIU ] = {{8350, 16747}, {8401, 16747}, {22757, 16747}, {22758, 16747}}, -- 七秀 + [env.FORCE_TYPE.CANG_JIAN] = {{8351, 16747}, {8402, 16747}, {22766, 16747}, {22767, 16747}}, -- 藏剑 + [env.FORCE_TYPE.WU_DU ] = {{8352, 16747}, {8403, 16747}}, -- 五毒 + [env.FORCE_TYPE.TANG_MEN ] = {{8353, 16747}, {8404, 16747}}, -- 唐门 + [env.FORCE_TYPE.MING_JIAO] = {{9796, 16747}, {9797, 16747}}, -- 明教 + [env.FORCE_TYPE.GAI_BANG ] = {{11245, 16747}, {11246, 16747}}, -- 丐帮 + [env.FORCE_TYPE.CANG_YUN ] = {{12701, 16747}, {12702, 16747}}, -- 苍云 + [env.FORCE_TYPE.CHANG_GE ] = {{14731, 16747}, {14732, 16747}}, -- 长歌 + --[env.FORCE_TYPE.BA_DAO ] = {{16205, 16747}, {16206, 16747}}, -- 霸刀 + --[env.FORCE_TYPE.PENG_LAI ] = {{19225, 16747}, {19226, 16747}}, -- 蓬莱 + --[env.FORCE_TYPE.LING_XUE ] = {{21067, 16747}, {21068, 16747}}, -- 凌雪 + --[env.FORCE_TYPE.YAN_TIAN ] = {{22775, 16747}, {22776, 16747}}, -- 衍天 + }, + }, + { -- 公共日常 + szKey = 'public_routine', + szTitle = '公共日常', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {14831, 869}, -- 江湖道远侠义天下 + }, + }, + { -- 采仙草 + szKey = 'picking_fairy_grass', + szTitle = '采仙草', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8332, 16747}}, + }, + { -- 美人图 + szKey = 'illustration_routine', + szTitle = '美人图', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8440, 15675}}, + }, + { -- 美人图潜行 + szKey = 'sneak_routine', + szTitle = '美人图潜行', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{7669, 16747}}, + }, + { -- 省试 + szKey = 'exam_sheng', + szTitle = '省试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{10936, 0}}, + }, + { -- 会试 + szKey = 'exam_hui', + szTitle = '会试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{4125, 0}}, + }, + } +end diff --git a/MY_RoleStatistics/data/task/zhcn_exp.jx3dat b/MY_RoleStatistics/data/task/zhcn_exp.jx3dat new file mode 100644 index 000000000..d8c75a2d1 --- /dev/null +++ b/MY_RoleStatistics/data/task/zhcn_exp.jx3dat @@ -0,0 +1,262 @@ +return function(env) + local swap = {} + return { + { -- 大战 + szKey = 'big_war', + szTitle = '大战', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() + return env.GetActivityQuest('DAILY_BIG_WAR') + end, + }, + { -- 茶馆 + szKey = 'teahouse', + szTitle = '茶馆', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + -- 90级 + -- {11115, 23669}, -- 乱世烽烟江湖行 + -- 95级 + -- {14246, 45009}, -- 快马江湖杯中茶 + -- 100级 + -- {19514, 63734}, -- 沧海云帆闻茶香 + -- 110级 + -- {22700, 101195}, -- 江湖烟雨任平生 + -- 120级 + {25220, 111762}, -- 一盏香茗话春秋 + }, + }, + { -- 勤修不辍 + szKey = 'force_routine', + szTitle = '勤修不辍', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tForceQuestInfo = { + [env.FORCE_TYPE.TIAN_CE ] = {{8206, 16747}, {11254, 16747}, {11255, 16747}}, -- 天策 + [env.FORCE_TYPE.CHUN_YANG] = {{8347, 16747}, {8398, 16747}}, -- 纯阳 + [env.FORCE_TYPE.WAN_HUA ] = {{8348, 16747}, {8399, 16747}, {22842, 16747}, {22929, 16747}}, -- 万花 + [env.FORCE_TYPE.SHAO_LIN ] = {{8349, 16747}, {8400, 16747}, {22851, 16747}, {22930, 16747}}, -- 少林 + [env.FORCE_TYPE.QI_XIU ] = {{8350, 16747}, {8401, 16747}, {22757, 16747}, {22758, 16747}}, -- 七秀 + [env.FORCE_TYPE.CANG_JIAN] = {{8351, 16747}, {8402, 16747}, {22766, 16747}, {22767, 16747}}, -- 藏剑 + [env.FORCE_TYPE.WU_DU ] = {{8352, 16747}, {8403, 16747}}, -- 五毒 + [env.FORCE_TYPE.TANG_MEN ] = {{8353, 16747}, {8404, 16747}}, -- 唐门 + [env.FORCE_TYPE.MING_JIAO] = {{9796, 16747}, {9797, 16747}}, -- 明教 + [env.FORCE_TYPE.GAI_BANG ] = {{11245, 16747}, {11246, 16747}}, -- 丐帮 + [env.FORCE_TYPE.CANG_YUN ] = {{12701, 16747}, {12702, 16747}}, -- 苍云 + [env.FORCE_TYPE.CHANG_GE ] = {{14731, 16747}, {14732, 16747}}, -- 长歌 + [env.FORCE_TYPE.BA_DAO ] = {{16205, 16747}, {16206, 16747}}, -- 霸刀 + [env.FORCE_TYPE.PENG_LAI ] = {{19225, 16747}, {19226, 16747}}, -- 蓬莱 + [env.FORCE_TYPE.LING_XUE ] = {{21067, 16747}, {21068, 16747}}, -- 凌雪 + [env.FORCE_TYPE.YAN_TIAN ] = {{22775, 16747}, {22776, 16747}}, -- 衍天 + }, + }, + { -- 浪客行 + szKey = 'rookie_routine', + szTitle = '浪客行', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {21433, 67083}, + }, + }, + { -- 烂柯山 + szKey = 'crystal_scramble', + szTitle = '烂柯山', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + -- {14727, 46968}, -- 戈壁晶矿引烽烟 + -- {14729, 46968}, -- 戈壁晶矿引烽烟 + -- {14893, 62002}, -- 浩气盟!木兰洲上烽烟起 + -- {18904, 62002}, -- 道源蓝晶起波涛 + -- {19200, 62002}, -- 道源蓝晶起波涛 + -- {19310, 62002}, -- 道源蓝晶起波涛 + -- {19719, 62002}, -- 经首道源寻物资 + -- 100级后 + -- {20306, 67195}, -- 木兰洲上烽烟起 + -- {20307, 67195}, -- 木兰洲上烽烟起 + -- {20308, 67195}, -- 木兰洲上烽烟起 + -- 110级 + -- {22195, 100967}, -- 西子湖畔危机潜 + -- {22196, 100967}, -- 西子湖畔危机潜 + -- {22197, 100967}, -- 西子湖畔危机潜 + -- {22680, 67195}, -- 观澜泽畔夺神兵 + {25148, 104325}, -- 战!烂柯山 + }, + [env.CAMP.EVIL] = { + -- {14728, 46969}, -- 戈壁晶矿引烽烟 + -- {14730, 46969}, -- 戈壁晶矿引烽烟 + -- {14894, 62039}, -- 恶人谷!木兰洲上烽烟起 + -- {18936, 62039}, -- 道源蓝晶起波涛 + -- {19201, 62039}, -- 道源蓝晶起波涛 + -- {19311, 62039}, -- 道源蓝晶起波涛 + -- {19720, 62039}, -- 经首道源寻物资 + -- 100级后 + -- {20309, 67196}, -- 木兰洲上烽烟起 + -- {20310, 67196}, -- 木兰洲上烽烟起 + -- {20311, 67196}, -- 木兰洲上烽烟起 + -- 110级 + -- {22198, 100961}, -- 西子湖畔危机潜 + -- {22199, 100961}, -- 西子湖畔危机潜 + -- {22200, 100961}, -- 西子湖畔危机潜 + -- {22679, 67196}, -- 观澜泽畔夺神兵 + {25148, 104325}, -- 战!烂柯山 + }, + }, + }, + { -- 据点贸易 + szKey = 'stronghold_trade', + szTitle = '据点贸易', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + {11864, 36388}, -- 据点贸易!浩气盟 + }, + [env.CAMP.EVIL] = { + {11991, 36387}, -- 据点贸易!恶人谷 + }, + }, + }, + { -- 龙门绝境 + szKey = 'dragon_gate_despair', + szTitle = '龙门绝境', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {17895, 59149}, + }, + }, + { -- 列星虚境 + szKey = 'lexus_reality', + szTitle = '列星虚境', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {20220, 64489}, + }, + }, + { -- 李渡鬼域 + szKey = 'lidu_ghost_town', + szTitle = '李渡鬼域', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {18317, 64489}, + }, + }, + { -- 公共日常 + szKey = 'public_routine', + szTitle = '公共日常', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {14831, 869}, -- 江湖道远侠义天下 + }, + }, + { -- 采仙草 + szKey = 'picking_fairy_grass', + szTitle = '采仙草', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8332, 16747}}, + }, + { -- 寻龙脉 + szKey = 'find_dragon_veins', + szTitle = '寻龙脉', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{13600, 16747}}, + }, + { -- 美人图 + szKey = 'illustration_routine', + szTitle = '美人图', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8440, 15675}}, + }, + { -- 美人图潜行 + szKey = 'sneak_routine', + szTitle = '美人图潜行', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{7669, 16747}}, + }, + { -- 省试 + szKey = 'exam_sheng', + szTitle = '省试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{10936, 0}}, + }, + { -- 会试 + szKey = 'exam_hui', + szTitle = '会试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{4125, 0}}, + }, + { -- 武林通鉴·秘境 + szKey = 'week_team_dungeon', + szTitle = '武林通鉴·秘境', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_TEAM_DUNGEON') end, + }, + { -- 武林通鉴·团队秘境 + szKey = 'week_raid_dungeon', + szTitle = '武林通鉴·团队秘境', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_RAID_DUNGEON') end, + }, + { -- 武林通鉴·公共任务 + szKey = 'week_public_quest', + szTitle = '武林通鉴·公共任务', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_PUBLIC_QUEST') end, + }, + } +end diff --git a/MY_RoleStatistics/data/task/zhcn_hd.jx3dat b/MY_RoleStatistics/data/task/zhcn_hd.jx3dat new file mode 100644 index 000000000..b41e494aa --- /dev/null +++ b/MY_RoleStatistics/data/task/zhcn_hd.jx3dat @@ -0,0 +1,284 @@ +return function(env) + local swap = {} + return { + { -- 大战 + szKey = 'big_war', + szTitle = '大战', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() + return env.GetActivityQuest('DAILY_BIG_WAR') + end, + }, + { -- 茶馆 + szKey = 'teahouse', + szTitle = '茶馆', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + -- 90级 + -- {11115, 23669}, -- 乱世烽烟江湖行 + -- 95级 + -- {14246, 45009}, -- 快马江湖杯中茶 + -- 100级 + -- {19514, 63734}, -- 沧海云帆闻茶香 + -- 110级 + -- {22700, 101195}, -- 江湖烟雨任平生 + -- 120级 + -- {25220, 111762}, -- 一盏香茗话春秋 + -- 130级 + {27616, 129862}, -- 驼铃沙语伴茶香 + }, + }, + { -- 勤修不辍 + szKey = 'force_routine', + szTitle = '勤修不辍', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tForceQuestInfo = { + [env.FORCE_TYPE.TIAN_CE ] = {{8206, 16747}, {11254, 16747}, {11255, 16747}}, -- 天策 + [env.FORCE_TYPE.CHUN_YANG] = {{8347, 16747}, {8398, 16747}}, -- 纯阳 + [env.FORCE_TYPE.WAN_HUA ] = {{8348, 16747}, {8399, 16747}, {22842, 16747}, {22929, 16747}}, -- 万花 + [env.FORCE_TYPE.SHAO_LIN ] = {{8349, 16747}, {8400, 16747}, {22851, 16747}, {22930, 16747}}, -- 少林 + [env.FORCE_TYPE.QI_XIU ] = {{8350, 16747}, {8401, 16747}, {22757, 16747}, {22758, 16747}}, -- 七秀 + [env.FORCE_TYPE.CANG_JIAN] = {{8351, 16747}, {8402, 16747}, {22766, 16747}, {22767, 16747}}, -- 藏剑 + [env.FORCE_TYPE.WU_DU ] = {{8352, 16747}, {8403, 16747}}, -- 五毒 + [env.FORCE_TYPE.TANG_MEN ] = {{8353, 16747}, {8404, 16747}}, -- 唐门 + [env.FORCE_TYPE.MING_JIAO] = {{9796, 16747}, {9797, 16747}}, -- 明教 + [env.FORCE_TYPE.GAI_BANG ] = {{11245, 16747}, {11246, 16747}}, -- 丐帮 + [env.FORCE_TYPE.CANG_YUN ] = {{12701, 16747}, {12702, 16747}}, -- 苍云 + [env.FORCE_TYPE.CHANG_GE ] = {{14731, 16747}, {14732, 16747}}, -- 长歌 + [env.FORCE_TYPE.BA_DAO ] = {{16205, 16747}, {16206, 16747}}, -- 霸刀 + [env.FORCE_TYPE.PENG_LAI ] = {{19225, 16747}, {19226, 16747}}, -- 蓬莱 + [env.FORCE_TYPE.LING_XUE ] = {{21067, 16747}, {21068, 16747}}, -- 凌雪 + [env.FORCE_TYPE.YAN_TIAN ] = {{22775, 16747}, {22776, 16747}}, -- 衍天 + }, + }, + { -- 浪客行 + szKey = 'rookie_routine', + szTitle = '浪客行', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {21433, 67083}, + }, + }, + { -- 阵营日常 + szKey = 'crystal_scramble', + szTitle = '阵营日常', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + -- {14727, 46968}, -- 戈壁晶矿引烽烟 + -- {14729, 46968}, -- 戈壁晶矿引烽烟 + -- {14893, 62002}, -- 浩气盟!木兰洲上烽烟起 + -- {18904, 62002}, -- 道源蓝晶起波涛 + -- {19200, 62002}, -- 道源蓝晶起波涛 + -- {19310, 62002}, -- 道源蓝晶起波涛 + -- {19719, 62002}, -- 经首道源寻物资 + -- 100级后 + -- {20306, 67195}, -- 木兰洲上烽烟起 + -- {20307, 67195}, -- 木兰洲上烽烟起 + -- {20308, 67195}, -- 木兰洲上烽烟起 + -- 110级 + -- {22195, 100967}, -- 西子湖畔危机潜 + -- {22196, 100967}, -- 西子湖畔危机潜 + -- {22197, 100967}, -- 西子湖畔危机潜 + -- {22680, 67195}, -- 观澜泽畔夺神兵 + -- {25148, 104325}, -- 战!烂柯山 + -- 130级 + {27601, 104325}, -- 绝漠疾尘争险道 + }, + [env.CAMP.EVIL] = { + -- {14728, 46969}, -- 戈壁晶矿引烽烟 + -- {14730, 46969}, -- 戈壁晶矿引烽烟 + -- {14894, 62039}, -- 恶人谷!木兰洲上烽烟起 + -- {18936, 62039}, -- 道源蓝晶起波涛 + -- {19201, 62039}, -- 道源蓝晶起波涛 + -- {19311, 62039}, -- 道源蓝晶起波涛 + -- {19720, 62039}, -- 经首道源寻物资 + -- 100级后 + -- {20309, 67196}, -- 木兰洲上烽烟起 + -- {20310, 67196}, -- 木兰洲上烽烟起 + -- {20311, 67196}, -- 木兰洲上烽烟起 + -- 110级 + -- {22198, 100961}, -- 西子湖畔危机潜 + -- {22199, 100961}, -- 西子湖畔危机潜 + -- {22200, 100961}, -- 西子湖畔危机潜 + -- {22679, 67196}, -- 观澜泽畔夺神兵 + -- {25148, 104325}, -- 战!烂柯山 + -- 130级 + {27600, 104325}, -- 绝漠疾尘争险道 + }, + }, + }, + { -- 千里伐逐:橙戒周常 + szKey = 'sauron_weekly', + szTitle = '千里伐逐', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + {25384, 112779}, -- 坠焰熔晶淬刃锋 + }, + [env.CAMP.EVIL] = { + {25346, 112577}, -- 坠焰熔晶淬刃锋 + }, + }, + }, + { -- 据点贸易 + szKey = 'stronghold_trade', + szTitle = '据点贸易', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + {11864, 36388}, -- 据点贸易!浩气盟 + }, + [env.CAMP.EVIL] = { + {11991, 36387}, -- 据点贸易!恶人谷 + }, + }, + }, + { -- 龙门绝境 + szKey = 'dragon_gate_despair', + szTitle = '龙门绝境', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {17895, 59149}, + }, + }, + { -- 列星虚境 + szKey = 'lexus_reality', + szTitle = '列星虚境', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {20220, 64489}, + }, + }, + { -- 李渡鬼域 + szKey = 'lidu_ghost_town', + szTitle = '李渡鬼域', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {18317, 64489}, + }, + }, + { -- 公共日常 + szKey = 'public_routine', + szTitle = '公共日常', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {14831, 869}, -- 江湖道远侠义天下 + }, + }, + { -- 采仙草 + szKey = 'picking_fairy_grass', + szTitle = '采仙草', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8332, 16747}}, + }, + { -- 寻龙脉 + szKey = 'find_dragon_veins', + szTitle = '寻龙脉', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{13600, 16747}}, + }, + { -- 美人图 + szKey = 'illustration_routine', + szTitle = '美人图', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8440, 15675}}, + }, + { -- 美人图潜行 + szKey = 'sneak_routine', + szTitle = '美人图潜行', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{7669, 16747}}, + }, + { -- 省试 + szKey = 'exam_sheng', + szTitle = '省试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{10936, 0}}, + }, + { -- 会试 + szKey = 'exam_hui', + szTitle = '会试', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{4125, 0}}, + }, + { -- 武林通鉴·秘境 + szKey = 'week_team_dungeon', + szTitle = '武林通鉴·秘境', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_TEAM_DUNGEON') end, + }, + { -- 武林通鉴·团队秘境 + szKey = 'week_raid_dungeon', + szTitle = '武林通鉴·团队秘境', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_RAID_DUNGEON') end, + }, + { -- 武林通鉴·公共任务 + szKey = 'week_public_quest', + szTitle = '武林通鉴·公共任务', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_PUBLIC_QUEST') end, + }, + } +end diff --git a/MY_RoleStatistics/data/task/zhtw_hd.jx3dat b/MY_RoleStatistics/data/task/zhtw_hd.jx3dat new file mode 100644 index 000000000..f94f9c6bb --- /dev/null +++ b/MY_RoleStatistics/data/task/zhtw_hd.jx3dat @@ -0,0 +1,262 @@ +return function(env) + local swap = {} + return { + { -- 澶ф埌 + szKey = 'big_war', + szTitle = '澶ф埌', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() + return env.GetActivityQuest('DAILY_BIG_WAR') + end, + }, + { -- 鑼堕え + szKey = 'teahouse', + szTitle = '鑼堕え', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + -- 90绱 + -- {11115, 23669}, -- 浜備笘鐑界厵姹熸箹琛 + -- 95绱 + -- {14246, 45009}, -- 蹇Μ姹熸箹鏉腑鑼 + -- 100绱 + -- {19514, 63734}, -- 婊勬捣闆插竼鑱炶尪棣 + -- 110绱 + -- {22700, 101195}, -- 姹熸箹鐓欓洦浠诲钩鐢 + -- 120绱 + {25220, 111762}, -- 涓鐩為鑼楄┍鏄ョ + }, + }, + { -- 鍕や慨涓嶈紵 + szKey = 'force_routine', + szTitle = '鍕や慨涓嶈紵', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tForceQuestInfo = { + [env.FORCE_TYPE.TIAN_CE ] = {{8206, 16747}, {11254, 16747}, {11255, 16747}}, -- 澶╃瓥 + [env.FORCE_TYPE.CHUN_YANG] = {{8347, 16747}, {8398, 16747}}, -- 绱旈櫧 + [env.FORCE_TYPE.WAN_HUA ] = {{8348, 16747}, {8399, 16747}, {22842, 16747}, {22929, 16747}}, -- 钀姳 + [env.FORCE_TYPE.SHAO_LIN ] = {{8349, 16747}, {8400, 16747}, {22851, 16747}, {22930, 16747}}, -- 灏戞灄 + [env.FORCE_TYPE.QI_XIU ] = {{8350, 16747}, {8401, 16747}, {22757, 16747}, {22758, 16747}}, -- 涓冪 + [env.FORCE_TYPE.CANG_JIAN] = {{8351, 16747}, {8402, 16747}, {22766, 16747}, {22767, 16747}}, -- 钘忓妽 + [env.FORCE_TYPE.WU_DU ] = {{8352, 16747}, {8403, 16747}}, -- 浜旀瘨 + [env.FORCE_TYPE.TANG_MEN ] = {{8353, 16747}, {8404, 16747}}, -- 鍞愰杸 + [env.FORCE_TYPE.MING_JIAO] = {{9796, 16747}, {9797, 16747}}, -- 鏄庢暀 + [env.FORCE_TYPE.GAI_BANG ] = {{11245, 16747}, {11246, 16747}}, -- 涓愬公 + [env.FORCE_TYPE.CANG_YUN ] = {{12701, 16747}, {12702, 16747}}, -- 钂奸洸 + [env.FORCE_TYPE.CHANG_GE ] = {{14731, 16747}, {14732, 16747}}, -- 闀锋瓕 + [env.FORCE_TYPE.BA_DAO ] = {{16205, 16747}, {16206, 16747}}, -- 闇稿垁 + [env.FORCE_TYPE.PENG_LAI ] = {{19225, 16747}, {19226, 16747}}, -- 钃悐 + [env.FORCE_TYPE.LING_XUE ] = {{21067, 16747}, {21068, 16747}}, -- 鍑岄洩 + [env.FORCE_TYPE.YAN_TIAN ] = {{22775, 16747}, {22776, 16747}}, -- 琛嶅ぉ + }, + }, + { -- 娴琛 + szKey = 'rookie_routine', + szTitle = '娴琛', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {21433, 67083}, + }, + }, + { -- 鐖涙煰灞 + szKey = 'crystal_scramble', + szTitle = '鐖涙煰灞', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + -- {14727, 46968}, -- 鎴堝鏅剁う寮曠兘鐓 + -- {14729, 46968}, -- 鎴堝鏅剁う寮曠兘鐓 + -- {14893, 62002}, -- 娴╂埃鐩燂紒鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {18904, 62002}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19200, 62002}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19310, 62002}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19719, 62002}, -- 缍撻閬撴簮灏嬬墿璩 + -- 100绱氬緦 + -- {20306, 67195}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {20307, 67195}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {20308, 67195}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- 110绱 + -- {22195, 100967}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22196, 100967}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22197, 100967}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22680, 67195}, -- 瑙鐎炬兢鐣斿オ绁炲叺 + {25148, 104325}, -- 鎴帮紒鐖涙煰灞 + }, + [env.CAMP.EVIL] = { + -- {14728, 46969}, -- 鎴堝鏅剁う寮曠兘鐓 + -- {14730, 46969}, -- 鎴堝鏅剁う寮曠兘鐓 + -- {14894, 62039}, -- 鎯′汉璋凤紒鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {18936, 62039}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19201, 62039}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19311, 62039}, -- 閬撴簮钘嶆櫠璧锋尝婵 + -- {19720, 62039}, -- 缍撻閬撴簮灏嬬墿璩 + -- 100绱氬緦 + -- {20309, 67196}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {20310, 67196}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- {20311, 67196}, -- 鏈ㄨ槶娲蹭笂鐑界厵璧 + -- 110绱 + -- {22198, 100961}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22199, 100961}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22200, 100961}, -- 瑗垮瓙婀栫晹鍗辨娼 + -- {22679, 67196}, -- 瑙鐎炬兢鐣斿オ绁炲叺 + {25148, 104325}, -- 鎴帮紒鐖涙煰灞 + }, + }, + }, + { -- 鎿氶粸璨挎槗 + szKey = 'stronghold_trade', + szTitle = '鎿氶粸璨挎槗', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + tCampQuestInfo = { + [env.CAMP.GOOD] = { + {11864, 36388}, -- 鎿氶粸璨挎槗锛佹旦姘g洘 + }, + [env.CAMP.EVIL] = { + {11991, 36387}, -- 鎿氶粸璨挎槗锛佹儭浜鸿胺 + }, + }, + }, + { -- 榫嶉杸绲曞 + szKey = 'dragon_gate_despair', + szTitle = '榫嶉杸绲曞', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {17895, 59149}, + }, + }, + { -- 鍒楁槦铏涘 + szKey = 'lexus_reality', + szTitle = '鍒楁槦铏涘', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {20220, 64489}, + }, + }, + { -- 鏉庢浮楝煎煙 + szKey = 'lidu_ghost_town', + szTitle = '鏉庢浮楝煎煙', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {18317, 64489}, + }, + }, + { -- 鍏叡鏃ュ父 + szKey = 'public_routine', + szTitle = '鍏叡鏃ュ父', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = { + {14831, 869}, -- 姹熸箹閬撻仩淇犵京澶╀笅 + }, + }, + { -- 鎺′粰鑽 + szKey = 'picking_fairy_grass', + szTitle = '鎺′粰鑽', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8332, 16747}}, + }, + { -- 灏嬮緧鑴 + szKey = 'find_dragon_veins', + szTitle = '灏嬮緧鑴', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{13600, 16747}}, + }, + { -- 缇庝汉鍦 + szKey = 'illustration_routine', + szTitle = '缇庝汉鍦', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{8440, 15675}}, + }, + { -- 缇庝汉鍦栨經琛 + szKey = 'sneak_routine', + szTitle = '缇庝汉鍦栨經琛', + eType = env.TASK_TYPE.DAILY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aQuestInfo = {{7669, 16747}}, + }, + { -- 鐪佽│ + szKey = 'exam_sheng', + szTitle = '鐪佽│', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{10936, 0}}, + }, + { -- 鏈冭│ + szKey = 'exam_hui', + szTitle = '鏈冭│', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + aBuffInfo = {{4125, 0}}, + }, + { -- 姝︽灄閫氶憭路绉樺 + szKey = 'week_team_dungeon', + szTitle = '姝︽灄閫氶憭路绉樺', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_TEAM_DUNGEON') end, + }, + { -- 姝︽灄閫氶憭路鍦橀殜绉樺 + szKey = 'week_raid_dungeon', + szTitle = '姝︽灄閫氶憭路鍦橀殜绉樺', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_RAID_DUNGEON') end, + }, + { -- 姝︽灄閫氶憭路鍏叡浠诲嫏 + szKey = 'week_public_quest', + szTitle = '姝︽灄閫氶憭路鍏叡浠诲嫏', + eType = env.TASK_TYPE.WEEKLY, + bTable = true, + bRowTip = true, + bFloatTip = true, + GetQuestInfo = function() return env.GetActivityQuest('WEEK_PUBLIC_QUEST') end, + }, + } +end diff --git a/MY_RoleStatistics/img/MY_RoleStatistics.Tga b/MY_RoleStatistics/img/MY_RoleStatistics.Tga new file mode 100644 index 000000000..4ca2f61f2 Binary files /dev/null and b/MY_RoleStatistics/img/MY_RoleStatistics.Tga differ diff --git a/MY_RoleStatistics/img/MY_RoleStatistics.UITex b/MY_RoleStatistics/img/MY_RoleStatistics.UITex new file mode 100644 index 000000000..85260e6dc Binary files /dev/null and b/MY_RoleStatistics/img/MY_RoleStatistics.UITex differ diff --git a/MY_RoleStatistics/img/MY_RoleStatistics.txt b/MY_RoleStatistics/img/MY_RoleStatistics.txt new file mode 100644 index 000000000..88a83c74e --- /dev/null +++ b/MY_RoleStatistics/img/MY_RoleStatistics.txt @@ -0,0 +1,3 @@ +Farme Left Top Width High File +0 0 0 12 12 C:\Users\root\Desktop\ON.tga +1 14 0 12 12 C:\Users\root\Desktop\OFF.tga diff --git a/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.Tga b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.Tga new file mode 100644 index 000000000..fbe987537 Binary files /dev/null and b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.Tga differ diff --git a/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.UITex b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.UITex new file mode 100644 index 000000000..b9d8eb922 Binary files /dev/null and b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.UITex differ diff --git a/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.txt b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.txt new file mode 100644 index 000000000..07a462c19 --- /dev/null +++ b/MY_RoleStatistics/img/MY_RoleStatistics_BagStat.txt @@ -0,0 +1,5 @@ +Farme Left Top Width High File +0 0 0 26 26 D:\插件图标切图\背包插件1_0.tga +1 28 0 26 26 D:\插件图标切图\背包插件2_0.tga +2 56 0 26 26 D:\插件图标切图\背包插件3_0.tga +3 84 0 26 26 D:\插件图标切图\背包插件4_0.tga diff --git a/MY_RoleStatistics/info.ini b/MY_RoleStatistics/info.ini new file mode 100644 index 000000000..bf2bd0eb3 --- /dev/null +++ b/MY_RoleStatistics/info.ini @@ -0,0 +1,13 @@ +[MY_RoleStatistics] +name=角色统计 +desc=提供角色信息背包统计等功能 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_RoleStatistics.lua +lua_1=src\MY_RoleStatistics_RoleStat.lua +lua_2=src\MY_RoleStatistics_BagStat.lua +lua_3=src\MY_RoleStatistics_EquipStat.lua +lua_4=src\MY_RoleStatistics_DungeonStat.lua +lua_5=src\MY_RoleStatistics_TaskStat.lua +package=MY diff --git a/MY_RoleStatistics/info.ini.zh_TW b/MY_RoleStatistics/info.ini.zh_TW new file mode 100644 index 000000000..de68e20fc --- /dev/null +++ b/MY_RoleStatistics/info.ini.zh_TW @@ -0,0 +1,13 @@ +[MY_RoleStatistics] +name=瑙掕壊绲辫▓ +desc=鎻愪緵瑙掕壊淇℃伅鑳屽寘绲辫▓绛夊姛鑳 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_RoleStatistics.lua +lua_1=src\MY_RoleStatistics_RoleStat.lua +lua_2=src\MY_RoleStatistics_BagStat.lua +lua_3=src\MY_RoleStatistics_EquipStat.lua +lua_4=src\MY_RoleStatistics_DungeonStat.lua +lua_5=src\MY_RoleStatistics_TaskStat.lua +package=MY diff --git a/MY_RoleStatistics/lang/default.jx3dat b/MY_RoleStatistics/lang/default.jx3dat new file mode 100644 index 000000000..c5f4dbc73 --- /dev/null +++ b/MY_RoleStatistics/lang/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['MOSAICS_CHAR'] = '*', +} diff --git a/MY_RoleStatistics/lang/role/default.jx3dat b/MY_RoleStatistics/lang/role/default.jx3dat new file mode 100644 index 000000000..c5f4dbc73 --- /dev/null +++ b/MY_RoleStatistics/lang/role/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['MOSAICS_CHAR'] = '*', +} diff --git a/MY_RoleStatistics/lang/role/zhcn.jx3dat b/MY_RoleStatistics/lang/role/zhcn.jx3dat new file mode 100644 index 000000000..fb878bbec --- /dev/null +++ b/MY_RoleStatistics/lang/role/zhcn.jx3dat @@ -0,0 +1,47 @@ +return { + ['MY_RoleStatistics'] = '角色统计', + ['MY_RoleStatistics_RoleStat'] = '角色统计', + ['%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.'] = '%s尚未启用,该角色数据不会被统计并显示到列表中,是否要现在开启该角色的统计功能?\n选择后该提示不会再次出现,日后您可以在该界面右上角点击齿轮,随时再次修改此项配置。', + ['%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.'] = '%s头像浮动入口尚未启用,无法快速查看该角色的统计信息,是否要现在开启浮动入口功能?\n选择后该提示不会再次出现,日后您可以在该界面右上角点击齿轮,随时再次修改此项配置。', + + ['Ancient database detected, do you want to migrate data from it?'] = '发现旧版数据文件,是否立即迁移数据?', + ['Migrate succeed!'] = '旧版数据迁移成功!', + + ['Region' ] = '大区', + ['Server' ] = '服务器', + ['Name' ] = '名字', + ['Force' ] = '门派', + ['Level' ] = '等级', + ['Cache time' ] = '快照时间', + ['Cache time days' ] = '快照计时', + + ['%d years %d days before'] = '%d年零%d天前', + ['%d days %d hours before'] = '%d天%d小时前', + ['%d hours %d mins before'] = '%d小时%d分钟前', + ['%d mins %d secs before'] = '%d分%d秒前', + ['%d secs before'] = '%d秒前', + ['Just now'] = '刚刚', + + ['Summary'] = '总计', + + ['Press ENTER to search...'] = '输入回车键搜索...', + ['Columns'] = '显示列', + ['Columns alert when esc'] = '打开ESC界面提醒数值变化的列', + ['Move up'] = '上移', + ['Move down'] = '下移', + ['Delete'] = '删除', + ['Click to move up.'] = '鼠标点击可上移当前选项。', + ['Click to move up, Hold SHIFT to move down.'] = '鼠标点击可上移当前选项,按住 SHIFT 点击可下移当前选项。', + ['Hold SHIFT click to move down.'] = '按住 SHIFT 鼠标点击可下移当前选项。', + + ['Today online '] = '今日在线', + ['Current online '] = '本次登录', + [','] = ',', + ['.'] = '。', + + ['Save DB'] = '统计当前角色', + ['Sort'] = '排序列', + ['Sort Order'] = '排序方式', + ['Float panel'] = '界面浮动图标', + ['Summary Ignore ID'] = '统计忽略角色设置', +} diff --git a/MY_RoleStatistics/lang/role/zhtw.jx3dat b/MY_RoleStatistics/lang/role/zhtw.jx3dat new file mode 100644 index 000000000..8c085883f --- /dev/null +++ b/MY_RoleStatistics/lang/role/zhtw.jx3dat @@ -0,0 +1,47 @@ +return { + ['MY_RoleStatistics'] = '瑙掕壊绲辫▓', + ['MY_RoleStatistics_RoleStat'] = '瑙掕壊绲辫▓', + ['%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.'] = '%s灏氭湭鍟熺敤锛岃┎瑙掕壊鏁告摎涓嶆渻琚当瑷堜甫椤ず鍒板垪琛ㄤ腑锛屾槸鍚﹁鐝惧湪闁嬪暉瑭茶鑹茬殑绲辫▓鍔熻兘锛焅n閬告搰寰岃┎鎻愮ず涓嶆渻鍐嶆鍑虹従锛屾棩寰屾偍鍙互鍦ㄨ┎鐣岄潰鍙充笂瑙掗粸鎿婇綊杓紝闅ㄦ檪鍐嶆淇敼姝ら爡閰嶇疆銆', + ['%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.'] = '%s闋儚娴嫊鍏ュ彛灏氭湭鍟熺敤锛岀劇娉曞揩閫熸煡鐪嬭┎瑙掕壊鐨勭当瑷堜俊鎭紝鏄惁瑕佺従鍦ㄩ枊鍟熸诞鍕曞叆鍙e姛鑳斤紵\n閬告搰寰岃┎鎻愮ず涓嶆渻鍐嶆鍑虹従锛屾棩寰屾偍鍙互鍦ㄨ┎鐣岄潰鍙充笂瑙掗粸鎿婇綊杓紝闅ㄦ檪鍐嶆淇敼姝ら爡閰嶇疆銆', + + ['Ancient database detected, do you want to migrate data from it?'] = '鐧肩従鑸婄増鏁告摎鏂囦欢锛屾槸鍚︾珛鍗抽伔绉绘暩鎿氾紵', + ['Migrate succeed!'] = '鑸婄増鏁告摎閬风Щ鎴愬姛锛', + + ['Region' ] = '澶у崁', + ['Server' ] = '浼烘湇鍣', + ['Name' ] = '鍚嶅瓧', + ['Force' ] = '闁娲', + ['Level' ] = '绛夌礆', + ['Cache time' ] = '蹇収鏅傞枔', + ['Cache time days' ] = '蹇収瑷堟檪', + + ['%d years %d days before'] = '%d骞撮浂%d澶╁墠', + ['%d days %d hours before'] = '%d澶%d灏忔檪鍓', + ['%d hours %d mins before'] = '%d灏忔檪%d鍒嗛悩鍓', + ['%d mins %d secs before'] = '%d鍒%d绉掑墠', + ['%d secs before'] = '%d绉掑墠', + ['Just now'] = '鍓涘墰', + + ['Summary'] = '绺借▓', + + ['Press ENTER to search...'] = '杓稿叆鍥炶粖閸垫悳绱...', + ['Columns'] = '椤ず鍒', + ['Columns alert when esc'] = '鎵撻枊ESC鐣岄潰鎻愰啋鏁稿艰畩鍖栫殑鍒', + ['Move up'] = '涓婄Щ', + ['Move down'] = '涓嬬Щ', + ['Delete'] = '鍒櫎', + ['Click to move up.'] = '婊戦紶榛炴搳鍙笂绉荤暥鍓嶉伕闋呫', + ['Click to move up, Hold SHIFT to move down.'] = '婊戦紶榛炴搳鍙笂绉荤暥鍓嶉伕闋咃紝鎸変綇 SHIFT 榛炴搳鍙笅绉荤暥鍓嶉伕闋呫', + ['Hold SHIFT click to move down.'] = '鎸変綇 SHIFT 婊戦紶榛炴搳鍙笅绉荤暥鍓嶉伕闋呫', + + ['Today online '] = '浠婃棩鍦ㄧ窔', + ['Current online '] = '鏈鐧婚寗', + [','] = '锛', + ['.'] = '銆', + + ['Save DB'] = '绲辫▓鐣跺墠瑙掕壊', + ['Sort'] = '鎺掑簭鍒', + ['Sort Order'] = '鎺掑簭鏂瑰紡', + ['Float panel'] = '鐣岄潰娴嫊鍦栨', + ['Summary Ignore ID'] = '绲辫▓蹇界暐瑙掕壊瑷疆', +} diff --git a/MY_RoleStatistics/lang/zhcn.jx3dat b/MY_RoleStatistics/lang/zhcn.jx3dat new file mode 100644 index 000000000..f8ba02675 --- /dev/null +++ b/MY_RoleStatistics/lang/zhcn.jx3dat @@ -0,0 +1,135 @@ +return { + ['MY_RoleStatistics'] = '角色统计', + ['Open/Close MY_RoleStatistics'] = '打开/关闭角色统计', + ['%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.'] = '%s尚未启用,该角色数据不会被统计并显示到列表中,是否要现在开启该角色的统计功能?\n选择后该提示不会再次出现,日后您可以在该界面右上角点击齿轮,随时再次修改此项配置。', + ['%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.'] = '%s头像浮动入口尚未启用,无法快速查看该角色的统计信息,是否要现在开启浮动入口功能?\n选择后该提示不会再次出现,日后您可以在该界面右上角点击齿轮,随时再次修改此项配置。', + + ['Ancient database detected, do you want to migrate data from it?'] = '发现旧版数据文件,是否立即迁移数据?', + ['Migrate succeed!'] = '旧版数据迁移成功!', + + ['Encrypt and compressing: '] = '更新加密压缩:', + + ['MY_RoleStatistics_BagStat'] = '背包统计', + + BAG_FILTER_TYPE = { + ['All' ] = '全部', + ['Task' ] = '任务', + ['Equipment'] = '装备', + ['Drug' ] = '药品', + ['Material' ] = '材料', + ['Book' ] = '书籍', + ['Furniture'] = '家具', + ['Grey' ] = '灰色', + ['TimeLtd' ] = '限时', + }, + ['Switch compact mode'] = '切换紧凑模式', + ['Hide equipped item'] = '隐藏身上装备', + ['Unchecked Names'] = '界面角色打钩状态', + + ['%d pages'] = '共%d页', + ['%d results'] = '共%d个结果', + ['Character: %s\nServer: %s\nSnapshot Time: %s'] = '角色名:%s\n服务器:%s\n快照时间:%s', + ['Tong: %s\nServer: %s\nSnapshot Time: %s'] = '帮会名:%s\n服务器:%s\n快照时间:%s', + + ['Bankx%d Bagx%d Totalx%d'] = '仓库x%d 背包x%d 总x%d', + ['%s (%s)\tBankx%d Bagx%d Totalx%d\n'] = '%s (%s)\t仓库x%d 背包x%d 总x%d\n', + ['Are you sure to delete item record of %s?'] = '确定要清空[%s]的背包物品记录吗?', + + ['Region' ] = '大区', + ['Server' ] = '服务器', + ['Name' ] = '名字', + ['Camp' ] = '阵营', + ['Force' ] = '门派', + ['Level' ] = '等级', + ['EquSC' ] = '装分', + ['Cache time' ] = '快照时间', + ['Cache time days' ] = '快照计时', + + ['%d years %d days before'] = '%d年零%d天前', + ['%d days %d hours before'] = '%d天%d小时前', + ['%d hours %d mins before'] = '%d小时%d分钟前', + ['%d mins %d secs before'] = '%d分%d秒前', + ['%d secs before'] = '%d秒前', + ['Just now'] = '刚刚', + + ['Press ENTER to search...'] = '输入回车键搜索...', + ['Columns'] = '显示列', + ['Sort'] = '排序列', + ['Sort Order'] = '排序方式', + ['Click to move up.'] = '鼠标点击可上移当前选项。', + ['Click to move up, Hold SHIFT to move down.'] = '鼠标点击可上移当前选项,按住 SHIFT 点击可下移当前选项。', + ['Hold SHIFT click to move down.'] = '按住 SHIFT 鼠标点击可下移当前选项。', + + [','] = ',', + ['.'] = '。', + + ['Manage added'] = '已添加', + ['Show all'] = '全部选项', + ['Move up'] = '上移', + ['Move down'] = '下移', + ['Delete'] = '删除', + + ['Map mark'] = '地图显示位置', + ['Tip hide finished'] = '浮动框隐藏已完成', + ['Map mark hide acquired'] = '隐藏已有跟宠', + ['Float panel'] = '界面浮动图标', + ['Enable float panel on sprint/bag/character panel.'] = '启用统计界面在头像、背包、角色面板等界面的快速入口。', + ['Save DB'] = '统计当前角色', + ['%s before'] = '%s前', + ['Refresh: %s'] = '刷新:%s', + + ['MY_RoleStatistics_DungeonStat'] = '秘境统计', + ['None'] = '无', + ['Unknown'] = '未知', + ['Dungeon copy'] = '秘境进度', + ['r'] = '√', + ['x'] = '×', + ['Week routine: '] = '周常:', + ['Recommend: team dungeon'] = '推荐:小队秘境', + ['Recommend: raid dungeon'] = '推荐:团队秘境', + ['---- %d players dungeon ----'] = '———— %d人秘境 ————', + + ['MY_RoleStatistics_TaskStat'] = '任务统计', + ['None'] = '无', + ['Accepted'] = '已接', + ['Finishable'] = '可交', + ['Finished'] = '完成', + ['Unknown'] = '未知', + ['Acceptable'] = '可接', + ['Unacceptable'] = '不可', + + ['Big war'] = '大战', + ['Teahouse'] = '茶馆', + ['Force routine'] = '勤修不辍', + ['Rookie routine'] = '浪客行', + ['Public routine'] = '公共日常', + ['Stronghold trade'] = '据点贸易', + ['Crystal scramble'] = '阵营日常', + ['Dragon gate despair'] = '龙门绝境', + ['Lexus reality'] = '列星虚境', + ['Lidu ghost town'] = '李渡鬼域', + ['Picking fairy grass'] = '采仙草', + ['Find dragon veins'] = '寻龙脉', + ['Illustration routine'] = '美人图', + ['Sneak routine'] = '潜行美人图', + ['Exam sheng'] = '省试', + ['Exam hui'] = '会试', + + ['Refresh type:'] = '刷新:', + ['Daily'] = '日常', + ['Weekly'] = '周常', + ['Half-weekly'] = '半周常', + ['Once'] = '一次性', + + ['Open panel'] = '打开界面', + ['Tips'] = '说明', + ['MY_RoleStatistics TIPS'] = '1、该功能用于统计角色数据到本地,不涉及任何数据上传。\n2、统计默认全部关闭,需要手动开启各个统计项。\n3、请勿在公共设备上勾选该统计功能,否则您的信息可以被他人看到。\n4、只有登录过的角色信息才有可能被存储,未登录过的角色不会有记录。\n5、您看到的其他角色信息并非实时状态,是该角色在该客户端最后一次登录时候的快照。\n6、由于玩法和官方接口随时可能更改,该统计不保证随时有效可用。', + + ['MY_RoleStatistics_EquipStat'] = '装备统计', + ['None'] = '无', + ['Equip score: %s'] = '装备分数:%s', + ['Unknown'] = '未知', + ['%s (Lv%d)'] = '%s(%d)', + ['%s * %s'] = '%s·%s', + ['Export'] = '导出', +} diff --git a/MY_RoleStatistics/lang/zhtw.jx3dat b/MY_RoleStatistics/lang/zhtw.jx3dat new file mode 100644 index 000000000..4b01ea78b --- /dev/null +++ b/MY_RoleStatistics/lang/zhtw.jx3dat @@ -0,0 +1,135 @@ +return { + ['MY_RoleStatistics'] = '瑙掕壊绲辫▓', + ['Open/Close MY_RoleStatistics'] = '鎵撻枊/闂滈枆瑙掕壊绲辫▓', + ['%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.'] = '%s灏氭湭鍟熺敤锛岃┎瑙掕壊鏁告摎涓嶆渻琚当瑷堜甫椤ず鍒板垪琛ㄤ腑锛屾槸鍚﹁鐝惧湪闁嬪暉瑭茶鑹茬殑绲辫▓鍔熻兘锛焅n閬告搰寰岃┎鎻愮ず涓嶆渻鍐嶆鍑虹従锛屾棩寰屾偍鍙互鍦ㄨ┎鐣岄潰鍙充笂瑙掗粸鎿婇綊杓紝闅ㄦ檪鍐嶆淇敼姝ら爡閰嶇疆銆', + ['%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.'] = '%s闋儚娴嫊鍏ュ彛灏氭湭鍟熺敤锛岀劇娉曞揩閫熸煡鐪嬭┎瑙掕壊鐨勭当瑷堜俊鎭紝鏄惁瑕佺従鍦ㄩ枊鍟熸诞鍕曞叆鍙e姛鑳斤紵\n閬告搰寰岃┎鎻愮ず涓嶆渻鍐嶆鍑虹従锛屾棩寰屾偍鍙互鍦ㄨ┎鐣岄潰鍙充笂瑙掗粸鎿婇綊杓紝闅ㄦ檪鍐嶆淇敼姝ら爡閰嶇疆銆', + + ['Ancient database detected, do you want to migrate data from it?'] = '鐧肩従鑸婄増鏁告摎鏂囦欢锛屾槸鍚︾珛鍗抽伔绉绘暩鎿氾紵', + ['Migrate succeed!'] = '鑸婄増鏁告摎閬风Щ鎴愬姛锛', + + ['Encrypt and compressing: '] = '鏇存柊鍔犲瘑澹撶府锛', + + ['MY_RoleStatistics_BagStat'] = '鑳屽寘绲辫▓', + + BAG_FILTER_TYPE = { + ['All' ] = '鍏ㄩ儴', + ['Task' ] = '浠诲嫏', + ['Equipment'] = '瑁濆倷', + ['Drug' ] = '钘ュ搧', + ['Material' ] = '鏉愭枡', + ['Book' ] = '鏇哥睄', + ['Furniture'] = '鍌㈠叿', + ['Grey' ] = '鐏拌壊', + ['TimeLtd' ] = '闄愭檪', + }, + ['Switch compact mode'] = '鍒囨彌绶婃箠妯″紡', + ['Hide equipped item'] = '闅辫棌韬笂瑁濆倷', + ['Unchecked Names'] = '鐣岄潰瑙掕壊鎵撻墹鐙鎱', + + ['%d pages'] = '鍏%d闋', + ['%d results'] = '鍏%d鍊嬬祼鏋', + ['Character: %s\nServer: %s\nSnapshot Time: %s'] = '瑙掕壊鍚嶏細%s\n浼烘湇鍣細%s\n蹇収鏅傞枔锛%s', + ['Tong: %s\nServer: %s\nSnapshot Time: %s'] = '骞渻鍚嶏細%s\n浼烘湇鍣細%s\n蹇収鏅傞枔锛%s', + + ['Bankx%d Bagx%d Totalx%d'] = '鍊夊韩x%d 鑳屽寘x%d 绺絰%d', + ['%s (%s)\tBankx%d Bagx%d Totalx%d\n'] = '%s (%s)\t鍊夊韩x%d 鑳屽寘x%d 绺絰%d\n', + ['Are you sure to delete item record of %s?'] = '纰哄畾瑕佹竻绌篬%s]鐨勮儗鍖呯墿鍝佽閷勫棊锛', + + ['Region' ] = '澶у崁', + ['Server' ] = '浼烘湇鍣', + ['Name' ] = '鍚嶅瓧', + ['Camp' ] = '闄g嚐', + ['Force' ] = '闁娲', + ['Level' ] = '绛夌礆', + ['EquSC' ] = '瑁濆垎', + ['Cache time' ] = '蹇収鏅傞枔', + ['Cache time days' ] = '蹇収瑷堟檪', + + ['%d years %d days before'] = '%d骞撮浂%d澶╁墠', + ['%d days %d hours before'] = '%d澶%d灏忔檪鍓', + ['%d hours %d mins before'] = '%d灏忔檪%d鍒嗛悩鍓', + ['%d mins %d secs before'] = '%d鍒%d绉掑墠', + ['%d secs before'] = '%d绉掑墠', + ['Just now'] = '鍓涘墰', + + ['Press ENTER to search...'] = '杓稿叆鍥炶粖閸垫悳绱...', + ['Columns'] = '椤ず鍒', + ['Sort'] = '鎺掑簭鍒', + ['Sort Order'] = '鎺掑簭鏂瑰紡', + ['Click to move up.'] = '婊戦紶榛炴搳鍙笂绉荤暥鍓嶉伕闋呫', + ['Click to move up, Hold SHIFT to move down.'] = '婊戦紶榛炴搳鍙笂绉荤暥鍓嶉伕闋咃紝鎸変綇 SHIFT 榛炴搳鍙笅绉荤暥鍓嶉伕闋呫', + ['Hold SHIFT click to move down.'] = '鎸変綇 SHIFT 婊戦紶榛炴搳鍙笅绉荤暥鍓嶉伕闋呫', + + [','] = '锛', + ['.'] = '銆', + + ['Manage added'] = '宸叉坊鍔', + ['Show all'] = '鍏ㄩ儴閬搁爡', + ['Move up'] = '涓婄Щ', + ['Move down'] = '涓嬬Щ', + ['Delete'] = '鍒櫎', + + ['Map mark'] = '鍦板湒椤ず浣嶇疆', + ['Tip hide finished'] = '娴嫊妗嗛毐钘忓凡瀹屾垚', + ['Map mark hide acquired'] = '闅辫棌宸叉湁璺熷', + ['Float panel'] = '鐣岄潰娴嫊鍦栨', + ['Enable float panel on sprint/bag/character panel.'] = '鍟熺敤绲辫▓鐣岄潰鍦ㄩ牠鍍忋佽儗鍖呫佽鑹查潰鏉跨瓑鐣岄潰鐨勫揩閫熷叆鍙c', + ['Save DB'] = '绲辫▓鐣跺墠瑙掕壊', + ['%s before'] = '%s鍓', + ['Refresh: %s'] = '鍒锋柊锛%s', + + ['MY_RoleStatistics_DungeonStat'] = '绉樺绲辫▓', + ['None'] = '鐒', + ['Unknown'] = '鏈煡', + ['Dungeon copy'] = '绉樺閫插害', + ['r'] = '鈭', + ['x'] = '脳', + ['Week routine: '] = '鍛ㄥ父锛', + ['Recommend: team dungeon'] = '鎺ㄨ枽锛氬皬闅婄澧', + ['Recommend: raid dungeon'] = '鎺ㄨ枽锛氬湗闅婄澧', + ['---- %d players dungeon ----'] = '鈥斺斺斺 %d浜虹澧 鈥斺斺斺', + + ['MY_RoleStatistics_TaskStat'] = '浠诲嫏绲辫▓', + ['None'] = '鐒', + ['Accepted'] = '宸叉帴', + ['Finishable'] = '鍙氦', + ['Finished'] = '瀹屾垚', + ['Unknown'] = '鏈煡', + ['Acceptable'] = '鍙帴', + ['Unacceptable'] = '涓嶅彲', + + ['Big war'] = '澶ф埌', + ['Teahouse'] = '鑼堕え', + ['Force routine'] = '鍕や慨涓嶈紵', + ['Rookie routine'] = '娴琛', + ['Public routine'] = '鍏叡鏃ュ父', + ['Stronghold trade'] = '鎿氶粸璨挎槗', + ['Crystal scramble'] = '闄g嚐鏃ュ父', + ['Dragon gate despair'] = '榫嶉杸绲曞', + ['Lexus reality'] = '鍒楁槦铏涘', + ['Lidu ghost town'] = '鏉庢浮楝煎煙', + ['Picking fairy grass'] = '鎺′粰鑽', + ['Find dragon veins'] = '灏嬮緧鑴', + ['Illustration routine'] = '缇庝汉鍦', + ['Sneak routine'] = '娼涜缇庝汉鍦', + ['Exam sheng'] = '鐪佽│', + ['Exam hui'] = '鏈冭│', + + ['Refresh type:'] = '鍒锋柊锛', + ['Daily'] = '鏃ュ父', + ['Weekly'] = '鍛ㄥ父', + ['Half-weekly'] = '鍗婂懆甯', + ['Once'] = '涓娆℃', + + ['Open panel'] = '鎵撻枊鐣岄潰', + ['Tips'] = '瑾槑', + ['MY_RoleStatistics TIPS'] = '1銆佽┎鍔熻兘鐢ㄦ柤绲辫▓瑙掕壊鏁告摎鍒版湰鍦帮紝涓嶆秹鍙婁换浣曟暩鎿氫笂鍌炽俓n2銆佺当瑷堥粯瑾嶅叏閮ㄩ棞闁夛紝闇瑕佹墜鍕曢枊鍟熷悇鍊嬬当瑷堥爡銆俓n3銆佽珛鍕垮湪鍏叡瑷倷涓婂嬀閬歌┎绲辫▓鍔熻兘锛屽惁鍓囨偍鐨勪俊鎭彲浠ヨ浠栦汉鐪嬪埌銆俓n4銆佸彧鏈夌櫥閷勯亷鐨勮鑹蹭俊鎭墠鏈夊彲鑳借瀛樺劜锛屾湭鐧婚寗閬庣殑瑙掕壊涓嶆渻鏈夎閷勩俓n5銆佹偍鐪嬪埌鐨勫叾浠栬鑹蹭俊鎭甫闈炲鏅傜媭鎱嬶紝鏄┎瑙掕壊鍦ㄨ┎瀹㈡埗绔渶寰屼竴娆$櫥閷勬檪鍊欑殑蹇収銆俓n6銆佺敱鏂肩帺娉曞拰瀹樻柟浠嬮潰闅ㄦ檪鍙兘鏇存敼锛岃┎绲辫▓涓嶄繚璀夐毃鏅傛湁鏁堝彲鐢ㄣ', + + ['MY_RoleStatistics_EquipStat'] = '瑁濆倷绲辫▓', + ['None'] = '鐒', + ['Equip score: %s'] = '瑁濆倷鍒嗘暩锛%s', + ['Unknown'] = '鏈煡', + ['%s (Lv%d)'] = '%s(%d)', + ['%s * %s'] = '%s路%s', + ['Export'] = '灏庡嚭', +} diff --git a/MY_RoleStatistics/src/MY_RoleStatistics.lua b/MY_RoleStatistics/src/MY_RoleStatistics.lua new file mode 100644 index 000000000..f052d9eb8 --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics.lua @@ -0,0 +1,260 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 角色统计框架 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + aFloatEntry = {}, + aSaveDB = {}, +} + +function D.Open(szModule) + local function onSizeChange() + local ui = X.UI(this) + local nW, nH = ui:Size() + ui:Children('#Btn_Option'):Left(nW - 40) + ui:Children('#PageSet_All'):Size(nW, nH - 48) + D.PageSetModule.BroadcastPageEvent(this, 'OnResizePage') + end + local ui = X.UI.CreateFrame('MY_RoleStatistics', { + w = 1104, h = 700, + close = true, + maximize = true, + resize = true, + minWidth = 1000, + minHeight = 700, + text = X.PACKET_INFO.NAME .. _L.SPLIT_DOT .. _L['MY_RoleStatistics'], + anchor = 'CENTER', + onSizeChange = onSizeChange, + }) + ui:Append('WndPageSet', { + name = 'PageSet_All', + x = 0, y = 48, w = 1000, h = 700 - 48, + }) + ui:Append('WndButton', { + name = 'Btn_Option', + x = 960, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + }) + local frame = ui:Raw() + frame:BringToTop() + X.ExecuteWithThis(frame, onSizeChange) + D.PageSetModule.DrawUI(frame) + D.PageSetModule.ActivePage(frame, szModule or 1, true) +end + +function D.Close() + X.UI.CloseFrame('MY_RoleStatistics') +end + +function D.IsOpened() + return Station.Lookup('Normal/MY_RoleStatistics') +end + +function D.Toggle() + if D.IsOpened() then + D.Close() + else + D.Open() + end +end + +-- 注册子模块 +function D.RegisterModule(szKey, szName, tModule) + if not D.PageSetModule or not szName or not tModule then + return + end + if tModule.szFloatEntry then + table.insert(D.aFloatEntry, { szName = szName, szKey = tModule.szFloatEntry }) + end + if tModule.szSaveDB then + table.insert(D.aSaveDB, { szName = szName, szKey = tModule.szSaveDB }) + end + D.PageSetModule.RegisterModule(szKey, szName, tModule) + if D.IsOpened() then + D.Close() + D.Open() + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Close' then + D.Close() + elseif name == 'Btn_Option' then + local menu = {} + local tFloatEntryMenu = { + szOption = _L['Float panel'], + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['Enable float panel on sprint/bag/character panel.'], nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.TOP_BOTTOM) + end, + fnMouseLeave = function() + HideTip() + end, + } + for _, m in ipairs(D.aFloatEntry) do + table.insert(tFloatEntryMenu, { + szOption = m.szName, + bCheck = true, bChecked = X.Get(_G, m.szKey), + fnAction = function() + X.Set(_G, m.szKey, not X.Get(_G, m.szKey)) + end, + }) + end + if #tFloatEntryMenu > 0 then + table.insert(menu, tFloatEntryMenu) + end + local tSaveDBMenu = { szOption = _L['Save DB'] } + for _, m in ipairs(D.aSaveDB) do + table.insert(tSaveDBMenu, { + szOption = m.szName, + bCheck = true, bChecked = X.Get(_G, m.szKey), + fnAction = function() + X.Set(_G, m.szKey, not X.Get(_G, m.szKey)) + end, + }) + end + if #tSaveDBMenu > 0 then + table.insert(menu, tSaveDBMenu) + end + if #menu > 0 then + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.nMiniWidth = nW + menu.x = nX + menu.y = nY + nH + X.UI.PopupMenu(menu) + end + end +end + +function D.OnFrameCreate() + this:BringToTop() + PlaySound(SOUND.UI_SOUND,g_sound.OpenFrame) +end + +function D.OnFrameDestroy() + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) +end + +D.PageSetModule = X.UI.CreatePageSetModule(D, 'Wnd_Total/PageSet_All') + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics', + exports = { + { + root = D, + fields = { + Open = D.Open, + Close = D.Close, + IsOpened = D.IsOpened, + Toggle = D.Toggle, + RegisterModule = D.RegisterModule, + }, + interceptors = { + ['*'] = function(k) + if D.PageSetModule and D.PageSetModule.tModuleAPI[k] then + return D.PageSetModule.tModuleAPI[k] + end + end, + }, + preset = 'UIEvent' + }, + }, +} +MY_RoleStatistics = X.CreateModule(settings) +end + +do +local menu = { + szOption = _L['MY_RoleStatistics'], + fnAction = function() D.Toggle() end, +} +X.RegisterAddonMenu('MY_RoleStatistics', menu) +end +X.RegisterHotKey('MY_RoleStatistics', _L['Open/Close MY_RoleStatistics'], D.Toggle, nil) + +-------------------------------------------------------------------------- +-- 设置界面 +-------------------------------------------------------------------------- +local PS = { nPriority = 5 } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 25, 25 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + + ui:Append('WndButton', { + x = nW - 165, y = nY, w = 150, h = 38, + text = _L['Open panel'], + buttonStyle = 'SKEUOMORPHISM_LACE_BORDER', + onClick = D.Open, + }) + + if #D.aFloatEntry > 0 then + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Float panel'], font = 27 }) + nX = nX + 10 + nY = nY + 35 + + for _, p in ipairs(D.aFloatEntry) do + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = p.szName, checked = X.Get(_G, p.szKey), + onCheck = function(bChecked) + X.Set(_G, p.szKey, bChecked) + end, + }):AutoWidth():Width() + 5 + end + nY = nY + 40 + end + if #D.aSaveDB > 0 then + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Save DB'], font = 27 }) + nX = nX + 10 + nY = nY + 35 + + for _, p in ipairs(D.aSaveDB) do + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = p.szName, checked = X.Get(_G, p.szKey), + onCheck = function(bChecked) + X.Set(_G, p.szKey, bChecked) + end, + }):AutoWidth():Width() + 5 + end + nY = nY + 40 + end + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, w = nW, text = _L['Tips'], font = 27, multiline = true, alignVertical = 0 }) + nY = nY + 30 + nX = nPaddingX + 10 + ui:Append('Text', { x = nX, y = nY, w = nW, text = _L['MY_RoleStatistics TIPS'], font = 27, multiline = true, alignVertical = 0 }) +end +X.Panel.Register(_L['General'], 'MY_RoleStatistics', _L['MY_RoleStatistics'], 13491, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/src/MY_RoleStatistics_BagStat.lua b/MY_RoleStatistics/src/MY_RoleStatistics_BagStat.lua new file mode 100644 index 000000000..a84406cba --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics_BagStat.lua @@ -0,0 +1,1214 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 背包统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics_BagStat' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics_BagStat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +CPath.MakeDir(X.FormatPath({'userdata/role_statistics', X.PATH_TYPE.GLOBAL})) + +local DB = X.SQLiteConnect(_L['MY_RoleStatistics_BagStat'], {'userdata/role_statistics/bag_stat.v4.db', X.PATH_TYPE.GLOBAL}) +if not DB then + return X.OutputSystemMessage(_L['MY_RoleStatistics_BagStat'], _L['Cannot connect to database!!!'], X.CONSTANT.MSG_THEME.ERROR) +end +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_RoleStatistics/ui/MY_RoleStatistics_BagStat.ini' +local PAGE_DISPLAY = 15 +local NORMAL_MODE_PAGE_SIZE = 50 +local COMPACT_MODE_PAGE_SIZE = 150 +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS BagItems ( + ownerkey NVARCHAR(20) NOT NULL, + boxtype INTEGER NOT NULL, + boxindex INTEGER NOT NULL, + tabtype INTEGER NOT NULL, + tabindex INTEGER NOT NULL, + tabsubindex INTEGER NOT NULL, + bagcount INTEGER NOT NULL, + bankcount INTEGER NOT NULL, + itemid INTEGER NOT NULL, + uiid INTEGER NOT NULL, + exist_time INTEGER NOT NULL, + strength INTEGER NOT NULL, + durability INTEGER NOT NULL, + diamond_enchant NVARCHAR(100) NOT NULL, + fea_enchant INTEGER NOT NULL, + permanent_enchant INTEGER NOT NULL, + desc NVARCHAR(4000) NOT NULL, + time INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(ownerkey, boxtype, boxindex) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS BagItems_tab_idx ON BagItems(tabtype, tabindex, tabsubindex)') +local DB_ItemsW = X.SQLitePrepare(DB, [[ + REPLACE INTO BagItems ( + ownerkey, boxtype, boxindex, tabtype, tabindex, tabsubindex, bagcount, bankcount, + itemid, uiid, exist_time, strength, durability, diamond_enchant, fea_enchant, permanent_enchant, desc, + time, extra + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +]]) +local DB_ItemsDL = X.SQLitePrepare(DB, 'DELETE FROM BagItems WHERE ownerkey = ? AND boxtype = ? AND boxindex >= ?') +local DB_ItemsDA = X.SQLitePrepare(DB, 'DELETE FROM BagItems WHERE ownerkey = ?') +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS OwnerInfo ( + ownerkey NVARCHAR(20) NOT NULL, + ownername NVARCHAR(20) NOT NULL, + servername NVARCHAR(20) NOT NULL, + time INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(ownerkey) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS OwnerInfo_ownername_idx ON OwnerInfo(ownername)') +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS OwnerInfo_servername_idx ON OwnerInfo(servername)') +local DB_OwnerInfoW = X.SQLitePrepare(DB, 'REPLACE INTO OwnerInfo (ownerkey, ownername, servername, time, extra) VALUES (?, ?, ?, ?, ?)') +local DB_OwnerInfoR = X.SQLitePrepare(DB, 'SELECT * FROM OwnerInfo WHERE ownername LIKE ? OR servername LIKE ? ORDER BY time DESC') +local DB_OwnerInfoD = X.SQLitePrepare(DB, 'DELETE FROM OwnerInfo WHERE ownerkey = ?') +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS ItemInfo ( + tabtype INTEGER NOT NULL, + tabindex INTEGER NOT NULL, + tabsubindex INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + genre INTEGER NOT NULL, + quality INTEGER NOT NULL, + exist_type INTEGER NOT NULL, + desc NVARCHAR(4000) NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(tabtype, tabindex, tabsubindex) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS ItemInfo_name_idx ON ItemInfo(name)') +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS ItemInfo_desc_idx ON ItemInfo(desc)') +local DB_ItemInfoW = X.SQLitePrepare(DB, 'REPLACE INTO ItemInfo (tabtype, tabindex, tabsubindex, name, genre, quality, exist_type, desc, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)') + +local BOX_TYPE = X.KvpToObject({ + -- 100 - 199: Equip + {X.CONSTANT.INVENTORY_INDEX.EQUIP, 100}, + {X.CONSTANT.INVENTORY_INDEX.EQUIP_BACKUP1, 101}, + {X.CONSTANT.INVENTORY_INDEX.EQUIP_BACKUP2, 102}, + {X.CONSTANT.INVENTORY_INDEX.EQUIP_BACKUP3, 103}, + -- 200 - 299: Bag + {X.CONSTANT.INVENTORY_INDEX.PACKAGE, 200}, + {X.CONSTANT.INVENTORY_INDEX.PACKAGE1, 201}, + {X.CONSTANT.INVENTORY_INDEX.PACKAGE2, 202}, + {X.CONSTANT.INVENTORY_INDEX.PACKAGE3, 203}, + {X.CONSTANT.INVENTORY_INDEX.PACKAGE4, 204}, + {X.CONSTANT.INVENTORY_INDEX.PACKAGE_MIBAO, 205}, + -- 300 - 399: Bank + {X.CONSTANT.INVENTORY_INDEX.BANK, 300}, + {X.CONSTANT.INVENTORY_INDEX.BANK_PACKAGE1, 301}, + {X.CONSTANT.INVENTORY_INDEX.BANK_PACKAGE2, 302}, + {X.CONSTANT.INVENTORY_INDEX.BANK_PACKAGE3, 303}, + {X.CONSTANT.INVENTORY_INDEX.BANK_PACKAGE4, 304}, + {X.CONSTANT.INVENTORY_INDEX.BANK_PACKAGE5, 305}, + -- 400 Deprecated Guild Bank + -- 401 - 499: Guild Bank + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK, 401}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE1, 402}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE2, 403}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE3, 404}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE4, 405}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE5, 406}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE6, 407}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE7, 408}, + {X.CONSTANT.INVENTORY_INDEX.GUILD_BANK_PACKAGE8, 409}, +}) + +local O = X.CreateUserSettingsModule('MY_RoleStatistics_BagStat', _L['General'], { + bCompactMode = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_BagStat'], + _L['Switch compact mode'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bHideEquipped = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_BagStat'], + _L['Hide equipped item'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tUncheckedNames = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_BagStat'], + _L['Unchecked Names'], + }), + bNoExport = true, + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, + bFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_BagStat'], + _L['Float panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_BagStat'], + _L['Save DB'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + szFilterType = 'All', + tCheckedNames = {}, +} + +local FILTER_LIST = { + { name = 'All' , where = '' }, + { name = 'Task' , where = 'I.genre = 2' }, + { name = 'Equipment', where = 'I.genre = 0' }, + { name = 'Drug' , where = 'I.genre = 1 OR genre = 14' }, + { name = 'Material' , where = 'I.genre = 3' }, + { name = 'Book' , where = 'I.genre = 4' }, + { name = 'Furniture', where = 'I.genre = 20', visible = X.IS_REMAKE }, + { name = 'Grey' , where = 'I.quality = 0' }, + { name = 'TimeLtd' , where = 'I.exist_type <> -1 AND I.exist_type <> ' .. ITEM_EXIST_TYPE.PERMANENT }, +} + +do +local GetItemText +do +local l_tItemText = {} +function GetItemText(KItem) + if KItem then + if GetItemTip then + local nBookID = KItem.nGenre == ITEM_GENRE.BOOK and KItem.nBookID or -1 + local szKey = KItem.dwTabType .. ',' .. KItem.dwIndex .. ',' .. nBookID + if not l_tItemText[szKey] then + l_tItemText[szKey] = X.GetPureText(X.GetItemTip(KItem), 'LUA') or '' + end + return l_tItemText[szKey] + else + return KItem.szName + end + else + return '' + end +end +end + +local l_guildcache = {} +local function UpdateTongRepertoryPage() + local nPage = arg0 + local dwBox = X.CONSTANT.INVENTORY_GUILD_BANK_LIST[nPage + 1] + local me = X.GetClientPlayer() + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local kItem = X.GetInventoryItem(me, dwBox, dwX) + local boxtype, boxindex = dwBox, dwX + local aItemData, aItemInfoData = D.ItemToData(kItem, 'BANK') + l_guildcache[boxtype .. ',' .. boxindex] = { + boxtype = boxtype, + boxindex = boxindex, + aItemData = aItemData, + aItemInfoData = aItemInfoData, + } + end +end +X.RegisterEvent('UPDATE_TONG_REPERTORY_PAGE', 'MY_RoleStatistics_BagStat', UpdateTongRepertoryPage) + +function D.Migration() + local DB_V2_PATH = X.FormatPath({'userdata/role_statistics/bag_stat.v2.db', X.PATH_TYPE.GLOBAL}) + local DB_V3_PATH = X.FormatPath({'userdata/role_statistics/bag_stat.v3.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V2_PATH) and not IsLocalFileExist(DB_V3_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + X.SQLiteBeginTransaction(DB) + local aBagItems = X.SQLiteGetAll(DB_V2, 'SELECT * FROM BagItems WHERE ownerkey IS NOT NULL AND boxtype IS NOT NULL AND tabtype IS NOT NULL') + if aBagItems then + for _, rec in ipairs(aBagItems) do + local sboxtype = BOX_TYPE[rec.boxtype] + if sboxtype then + X.SQLitePrepareExecute( + DB_ItemsW, + rec.ownerkey, + sboxtype, + rec.boxindex, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.bagcount, + rec.bankcount, + -1, + -1, + -1, + -1, + -1, + '', + -1, + -1, + '', + rec.time, + '' + ) + end + end + end + local aOwnerInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM OwnerInfo WHERE ownerkey IS NOT NULL') + if aOwnerInfo then + for _, rec in ipairs(aOwnerInfo) do + X.SQLitePrepareExecute( + DB_OwnerInfoW, + rec.ownerkey, + rec.ownername, + rec.servername, + rec.time, + '' + ) + end + end + local aItemInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM ItemInfo WHERE tabtype IS NOT NULL') + if aItemInfo then + for _, rec in ipairs(aItemInfo) do + X.SQLitePrepareExecute( + DB_ItemInfoW, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.name, + -1, + -1, + -1, + rec.desc, + '' + ) + end + end + X.SQLiteEndTransaction(DB) + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V3旧版数据 + if IsLocalFileExist(DB_V3_PATH) then + local DB_V3 = SQLite3_Open(DB_V3_PATH) + if DB_V3 then + X.SQLiteBeginTransaction(DB) + local aBagItems = X.SQLiteGetAll(DB_V3, 'SELECT * FROM BagItems WHERE ownerkey IS NOT NULL AND boxtype IS NOT NULL AND tabtype IS NOT NULL') + if aBagItems then + for _, rec in ipairs(aBagItems) do + local sboxtype = BOX_TYPE[rec.boxtype] + if sboxtype then + X.SQLitePrepareExecute( + DB_ItemsW, + rec.ownerkey, + sboxtype, + rec.boxindex, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.bagcount, + rec.bankcount, + rec.itemid, + rec.uiid, + rec.exist_time, + rec.strength, + rec.durability, + rec.diamond_enchant, + rec.fea_enchant, + rec.permanent_enchant, + rec.desc, + rec.time, + rec.extra + ) + end + end + end + local aOwnerInfo = X.SQLiteGetAll(DB_V3, 'SELECT * FROM OwnerInfo WHERE ownerkey IS NOT NULL') + if aOwnerInfo then + for _, rec in ipairs(aOwnerInfo) do + X.SQLitePrepareExecute( + DB_OwnerInfoW, + rec.ownerkey, + rec.ownername, + rec.servername, + rec.time, + rec.extra + ) + end + end + local aItemInfo = X.SQLiteGetAll(DB_V3, 'SELECT * FROM ItemInfo WHERE tabtype IS NOT NULL') + if aItemInfo then + for _, rec in ipairs(aItemInfo) do + X.SQLitePrepareExecute( + DB_ItemInfoW, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.name, + rec.genre, + rec.quality, + rec.exist_type, + rec.desc, + rec.extra + ) + end + end + X.SQLiteEndTransaction(DB) + DB_V3:Release() + end + CPath.Move(DB_V3_PATH, DB_V3_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + FireUIEvent('MY_ROLE_STAT_BAG_UPDATE') + X.Alert(_L['Migrate succeed!']) + end) +end + +function D.ItemToData(KItem, szBagType) + local KItemInfo = KItem and GetItemInfo(KItem.dwTabType, KItem.dwIndex) + local tabtype, tabindex, tabsubindex, bagcount, bankcount = -1, -1, -1, 0, 0 + local itemid, uiid, exist_time, strength, durability, diamond_enchant, fea_enchant, permanent_enchant, desc = -1, -1, -1, -1, -1, '', -1, -1, '' + local time, extra = GetCurrentTime(), '' + local aItemInfoData + if KItem and KItemInfo then + tabtype = KItem.dwTabType + tabindex = KItem.dwIndex + tabsubindex = KItem.nGenre == ITEM_GENRE.BOOK and KItem.nBookID or -1 + aItemInfoData = { + tabtype, + tabindex, + tabsubindex, + AnsiToUTF8(KItem.szName), + KItem.nGenre, + KItem.nQuality, + KItemInfo.nExistType, + AnsiToUTF8(GetItemText(KItem)), + '' + } + + local aDiamondEnchant = {} + if KItem.nGenre == ITEM_GENRE.EQUIPMENT then + for i = 1, KItem.GetSlotCount() do + aDiamondEnchant[i] = X.GetItemMountDiamondEnchantID(KItem, i - 1) + end + end + if szBagType == 'BANK' then + bagcount = 0 + bankcount = KItem.bCanStack and KItem.nStackNum or 1 + else + bagcount = KItem.bCanStack and KItem.nStackNum or 1 + bankcount = 0 + end + itemid = KItem.dwID + uiid = KItem.nUiId + strength = X.GetItemStrengthLevel(KItem) + durability = KItem.nCurrentDurability + diamond_enchant = AnsiToUTF8(X.EncodeJSON(aDiamondEnchant)) -- 五行石 + fea_enchant = KItem.nSub == EQUIPMENT_SUB.MELEE_WEAPON and KItem.GetMountFEAEnchantID() or 0 -- 五彩石 + permanent_enchant = KItem.dwPermanentEnchantID -- 附魔 + desc = AnsiToUTF8(X.GetItemTip(KItem) or '') + end + local aItemData = { + tabtype, tabindex, tabsubindex, bagcount, bankcount, + itemid, uiid, exist_time, strength, durability, diamond_enchant, fea_enchant, permanent_enchant, desc, + time, extra + } + return aItemData, aItemInfoData +end + +function D.FlushDB() + if not O.bSaveDB then + return + end + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local me = X.GetClientPlayer() + local time = GetCurrentTime() + local ownerkey = AnsiToUTF8(X.GetClientPlayerGlobalID()) + local ownername = AnsiToUTF8(me.szName) + local servername = AnsiToUTF8(X.GetServerOriginName()) + X.SQLiteBeginTransaction(DB) + + -- 背包 + local aPackageBoxType = {} + for _, v in ipairs(X.CONSTANT.INVENTORY_EQUIP_LIST) do + table.insert(aPackageBoxType, v) + end + for _, v in ipairs(X.CONSTANT.INVENTORY_PACKAGE_LIST) do + table.insert(aPackageBoxType, v) + end + for _, boxtype in ipairs(aPackageBoxType) do + local sboxtype = BOX_TYPE[boxtype] + if sboxtype then + local count = X.GetInventoryBoxSize(boxtype) + for boxindex = 0, count - 1 do + local aItemData, aItemInfoData = D.ItemToData(X.GetInventoryItem(me, boxtype, boxindex)) + if aItemInfoData then + X.SQLitePrepareExecute(DB_ItemInfoW, unpack(aItemInfoData)) + end + X.SQLitePrepareExecute(DB_ItemsW, ownerkey, sboxtype, boxindex, unpack(aItemData)) + end + X.SQLitePrepareExecute(DB_ItemsDL, ownerkey, sboxtype, count) + --[[#DEBUG BEGIN]] + else + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'bag boxtype not in static map: ' .. boxtype, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + end + + X.SQLitePrepareExecute(DB_OwnerInfoW, ownerkey, ownername, servername, time, '') + + -- 仓库 + for _, boxtype in ipairs(X.CONSTANT.INVENTORY_BANK_LIST) do + local sboxtype = BOX_TYPE[boxtype] + if sboxtype then + local count = X.GetInventoryBoxSize(boxtype) + for boxindex = 0, count - 1 do + local aItemData, aItemInfoData = D.ItemToData(X.GetInventoryItem(me, boxtype, boxindex), 'BANK') + if aItemInfoData then + X.SQLitePrepareExecute(DB_ItemInfoW, unpack(aItemInfoData)) + end + X.SQLitePrepareExecute(DB_ItemsW, ownerkey, sboxtype, boxindex, unpack(aItemData)) + end + X.SQLitePrepareExecute(DB_ItemsDL, ownerkey, sboxtype, count) + --[[#DEBUG BEGIN]] + else + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'bank boxtype not in static map: ' .. boxtype, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + end + + -- 帮会仓库 + if not X.IsEmpty(l_guildcache) then + local ownerkey = 'tong' .. me.dwTongID + local ownername = AnsiToUTF8('[' .. X.GetTongName(me.dwTongID) .. ']') + for _, info in pairs(l_guildcache) do + local sboxtype = BOX_TYPE[info.boxtype] + if sboxtype then + if info.aItemInfoData then + X.SQLitePrepareExecute(DB_ItemInfoW, unpack(info.aItemInfoData)) + end + X.SQLitePrepareExecute(DB_ItemsW, ownerkey, sboxtype, info.boxindex, unpack(info.aItemData)) + --[[#DEBUG BEGIN]] + else + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'guild bank boxtype not in static map: ' .. info.boxtype, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + end + + X.SQLitePrepareExecute(DB_OwnerInfoW, ownerkey, ownername, servername, time, '') + end + + X.SQLiteEndTransaction(DB) + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage('MY_RoleStatistics_BagStat', _L('Flushing to database costs %dms...', nTickCount), X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end +X.RegisterFlush('MY_RoleStatistics_BagStat', D.FlushDB) +end + +do local INIT = false +function D.UpdateSaveDB() + if not INIT then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if not O.bSaveDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'Remove from database...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + for _, guid in ipairs({ + AnsiToUTF8(X.GetClientPlayerGlobalID()), + 'tong' .. me.dwTongID, + }) do + X.SQLitePrepareExecute(DB_ItemsDA, guid) + X.SQLitePrepareExecute(DB_OwnerInfoD, guid) + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'Remove from database finished...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + FireUIEvent('MY_ROLE_STAT_BAG_UPDATE') +end +X.RegisterInit('MY_RoleStatistics_BagUpdateSaveDB', function() + D.tCheckedNames[X.GetClientPlayerGlobalID()] = true + INIT = true +end) +end + +function D.UpdateNames(page) + local searchname = page:Lookup('Wnd_Total/Wnd_SearchName/Edit_SearchName'):GetText() + local result = X.SQLitePrepareGetAll( + DB_OwnerInfoR, + AnsiToUTF8('%' .. searchname .. '%'), + AnsiToUTF8('%' .. searchname .. '%') + ) + + local container = page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name') + container:Clear() + for _, rec in ipairs(result) do + local wnd = container:AppendContentFromIni(SZ_INI, 'Wnd_Name') + wnd.time = rec.time + wnd.ownerkey = UTF8ToAnsi(rec.ownerkey) + wnd.ownername = UTF8ToAnsi(rec.ownername) + wnd.servername = UTF8ToAnsi(rec.servername) + local ownername = wnd.ownername + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + ownername = MY_ChatMosaics.MosaicsString(ownername) + end + wnd:Lookup('CheckBox_Name', 'Text_Name'):SetText(ownername .. ' (' .. wnd.servername .. ')') + wnd:Lookup('CheckBox_Name'):Check(D.tCheckedNames[wnd.ownerkey], WNDEVENT_FIRETYPE.PREVENT) + end + container:FormatAllContentPos() + page.nCurrentPage = 1 + D.UpdateItems(page) +end + +function D.SaveNameChecks(container) + -- local tUncheckedNames = {} + -- for i = 0, container:GetAllContentCount() - 1 do + -- local wnd = container:LookupContent(i) + -- if not wnd:Lookup('CheckBox_Name'):IsCheckBoxChecked() then + -- tUncheckedNames[wnd.ownerkey] = true + -- end + -- end + -- O.tUncheckedNames = tUncheckedNames +end + +function D.UpdateItems(page) + D.FlushDB() + + local searchitem = AnsiToUTF8('%' .. page:Lookup('Wnd_Total/Wnd_SearchItem/Edit_SearchItem'):GetText():gsub('%s+', '%%') .. '%') + local sqlfilter = '' + for _, p in ipairs(FILTER_LIST) do + if p.name == D.szFilterType and not X.IsEmpty(p.where) then + sqlfilter = sqlfilter .. ' AND (' .. p.where .. ') ' + end + end + if O.bHideEquipped then + sqlfilter = sqlfilter .. ' AND B.boxtype >= 200 ' + end + local sqlfrom = [[ + ( + SELECT B.ownerkey, B.boxtype, B.boxindex, B.tabtype, B.tabindex, B.tabsubindex, B.strength, B.uiid, B.desc as itemtip, B.bagcount, B.bankcount, B.time + FROM BagItems + AS B + LEFT JOIN ItemInfo + AS I + ON + B.tabtype = I.tabtype AND B.tabindex = I.tabindex + WHERE + B.tabtype != -1 AND B.tabindex != -1 AND B.boxtype != 400 AND (I.name LIKE ? OR I.desc LIKE ?) ]] .. sqlfilter .. [[ + ) + AS C + LEFT JOIN OwnerInfo + AS O + ON C.ownerkey = O.ownerkey + WHERE + ]] + local sql = [[ + SELECT + C.ownerkey AS ownerkey, + C.boxtype AS boxtype, + C.boxindex AS boxindex, + C.tabtype AS tabtype, + C.tabindex AS tabindex, + C.tabsubindex AS tabsubindex, + C.strength AS strength, + C.uiid AS uiid, + C.itemtip AS itemtip, + SUM(C.bagcount) AS bagcount, + SUM(C.bankcount) AS bankcount, + C.time AS time, + O.ownername AS ownername, + O.servername AS servername + FROM + ]] .. sqlfrom + local sqlc = 'SELECT COUNT(*) AS count FROM' .. sqlfrom + local nPageSize = O.bCompactMode and COMPACT_MODE_PAGE_SIZE or NORMAL_MODE_PAGE_SIZE + local wheres = {} + local ownerkeys = {} + local container = page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name') + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + if wnd:Lookup('CheckBox_Name'):IsCheckBoxChecked() then + table.insert(wheres, 'O.ownerkey = ?') + table.insert(ownerkeys, AnsiToUTF8(wnd.ownerkey)) + end + end + local sqlwhere = ((#wheres == 0 and ' 1 = 0 ') or ('(' .. table.concat(wheres, ' OR ') .. ')')) + local sqlgroup = ' GROUP BY C.tabtype, C.tabindex' + sql = sql .. sqlwhere .. sqlgroup .. ' ORDER BY C.tabtype ASC, C.tabindex ASC ' .. ' LIMIT ' .. nPageSize .. ' OFFSET ' .. ((page.nCurrentPage - 1) * nPageSize) + sqlc = sqlc .. sqlwhere .. sqlgroup + + -- 绘制页码 + local DB_CountR = X.SQLitePrepare(DB, sqlc) + local nCount = #X.SQLitePrepareGetAll( + DB_CountR, + searchitem, + searchitem, + unpack(ownerkeys) + ) + local nPageCount = math.floor(nCount / nPageSize) + 1 + page:Lookup('Wnd_Total/Wnd_Index/Wnd_IndexEdit/WndEdit_Index'):SetText(page.nCurrentPage) + page:Lookup('Wnd_Total/Wnd_Index', 'Handle_IndexCount/Text_IndexCount'):SprintfText(_L['%d pages'], nPageCount) + page:Lookup('Wnd_Total/WndScroll_Name/Wnd_SearchInfo', 'Text_SearchInfo'):SprintfText(_L['%d results'], nCount) + + local hOuter = page:Lookup('Wnd_Total/Wnd_Index', 'Handle_IndexesOuter') + local handle = hOuter:Lookup('Handle_Indexes') + handle:Clear() + if nPageCount <= PAGE_DISPLAY then + for i = 0, nPageCount - 1 do + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_Index') + hItem.nPage = i + 1 + hItem:Lookup('Text_Index'):SetText(i + 1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(i + 1 == page.nCurrentPage) + end + else + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_Index') + hItem.nPage = 1 + hItem:Lookup('Text_Index'):SetText(1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(1 == page.nCurrentPage) + + local nStartPage + if page.nCurrentPage + math.ceil((PAGE_DISPLAY - 2) / 2) > nPageCount then + nStartPage = nPageCount - (PAGE_DISPLAY - 2) + elseif page.nCurrentPage - math.ceil((PAGE_DISPLAY - 2) / 2) < 2 then + nStartPage = 2 + else + nStartPage = page.nCurrentPage - math.ceil((PAGE_DISPLAY - 2) / 2) + end + for i = 1, PAGE_DISPLAY - 2 do + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_Index') + hItem.nPage = nStartPage + i - 1 + hItem:Lookup('Text_Index'):SetText(nStartPage + i - 1) + hItem:Lookup('Text_IndexUnderline'):SetVisible(nStartPage + i - 1 == page.nCurrentPage) + end + + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_Index') + hItem.nPage = nPageCount + hItem:Lookup('Text_Index'):SetText(nPageCount) + hItem:Lookup('Text_IndexUnderline'):SetVisible(nPageCount == page.nCurrentPage) + end + handle:SetSize(hOuter:GetSize()) + handle:FormatAllItemPos() + handle:SetSizeByAllItemSize() + hOuter:FormatAllItemPos() + + -- 绘制列表 + local result = X.SQLiteGetAll( + DB, + sql, + searchitem, + searchitem, + unpack(ownerkeys) + ) + + local sqlbelongs = 'SELECT * FROM (SELECT ownerkey, SUM(bagcount) AS bagcount, SUM(bankcount) AS bankcount FROM BagItems WHERE tabtype = ? AND tabindex = ? AND tabsubindex = ? GROUP BY ownerkey) AS B LEFT JOIN OwnerInfo AS O ON B.ownerkey = O.ownerkey WHERE ' + sqlbelongs = sqlbelongs .. ((#wheres == 0 and ' 1 = 0 ') or ('(' .. table.concat(wheres, ' OR ') .. ')')) + local DB_BelongsR = X.SQLitePrepare(DB, sqlbelongs) + + local handle = page:Lookup('Wnd_Total/WndScroll_Item', 'Handle_Items') + local scroll = page:Lookup('Wnd_Total/WndScroll_Item/Scroll_Item') + handle:Clear() + for _, rec in ipairs(result) do + local KItemInfo = GetItemInfo(rec.tabtype, rec.tabindex) + if KItemInfo then + local bMaxStrength = KItemInfo.nMaxStrengthLevel > 0 and rec.strength == KItemInfo.nMaxStrengthLevel + if O.bCompactMode then + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_ItemCompact') + local box = hItem:Lookup('Box_ItemCompact') + local result = X.SQLitePrepareGetAll(DB_BelongsR, rec.tabtype, rec.tabindex, rec.tabsubindex, unpack(ownerkeys)) + local count = 0 + for _, rec in ipairs(result) do + count = count + rec.bankcount + rec.bagcount + end + X.UI.UpdateItemInfoBoxObject(box, nil, rec.tabtype, rec.tabindex, count, rec.tabsubindex) + UpdateItemBoxExtend(box, KItemInfo.nGenre, KItemInfo.nQuality, bMaxStrength) + box.itemdata = rec + box.belongsdata = result + else + local hItem = handle:AppendItemFromIni(SZ_INI, 'Handle_Item') + X.UI.UpdateItemInfoBoxObject(hItem:Lookup('Box_Item'), nil, rec.tabtype, rec.tabindex, 1, rec.tabsubindex) + X.UI.UpdateItemInfoBoxObject(hItem:Lookup('Handle_ItemInfo/Text_ItemName'), nil, rec.tabtype, rec.tabindex, 1, rec.tabsubindex) + UpdateItemBoxExtend(hItem:Lookup('Box_Item'), KItemInfo.nGenre, KItemInfo.nQuality, bMaxStrength) + hItem:Lookup('Text_ItemStatistics'):SprintfText(_L['Bankx%d Bagx%d Totalx%d'], rec.bankcount, rec.bagcount, rec.bankcount + rec.bagcount) + if KItemInfo.nGenre == ITEM_GENRE.TASK_ITEM then + hItem:Lookup('Handle_ItemInfo/Text_ItemDesc'):SetText(g_tStrings.STR_ITEM_H_QUEST_ITEM) + elseif KItemInfo.nBindType == ITEM_BIND.BIND_ON_PICKED then + hItem:Lookup('Handle_ItemInfo/Text_ItemDesc'):SetText(g_tStrings.STR_ITEM_H_BIND_AFTER_PICK) + elseif KItemInfo.nBindType == ITEM_BIND.BIND_ON_TIME_LIMITATION then + hItem:Lookup('Handle_ItemInfo/Text_ItemDesc'):SetText(g_tStrings.STR_ITEM_H_BIND_TIME_LIMITATION1) + else + hItem:Lookup('Handle_ItemInfo/Text_ItemDesc'):SetText('') + end + hItem:Lookup('Handle_ItemInfo'):FormatAllItemPos() + + local result = X.SQLitePrepareGetAll(DB_BelongsR, rec.tabtype, rec.tabindex, rec.tabsubindex, unpack(ownerkeys)) + local hBelongsList = hItem:Lookup('Handle_ItemBelongs') + hBelongsList:Clear() + for _, rec in ipairs(result) do + hBelongsList:AppendItemFromIni(SZ_INI, 'Text_ItemBelongs'):SprintfText(_L['%s (%s)\tBankx%d Bagx%d Totalx%d\n'], UTF8ToAnsi(rec.ownername), UTF8ToAnsi(rec.servername), rec.bankcount, rec.bagcount, rec.bankcount + rec.bagcount) + end + hBelongsList:FormatAllItemPos() + hBelongsList:SetSizeByAllItemSize() + hItem:Lookup('Shadow_ItemHover'):SetH(0) + hItem:SetSizeByAllItemSize() + hItem:SetH(hItem:GetH() + 7) + hItem:Lookup('Shadow_ItemHover'):SetH(hItem:GetH()) + end + --[[#DEBUG BEGIN]] + else + X.OutputDebugMessage('MY_RoleStatistics_BagStat', 'KItemInfo not found: ' .. rec.tabtype .. ', ' .. rec.tabindex, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + end + handle:FormatAllItemPos() + scroll:SetScrollPos(0) +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_RoleStatistics_BagStat') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Name/Scroll_Name')) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Item/Scroll_Item')) + + local page = this + local ui = X.UI(page) + local nX, nY = 440, 20 + for _, p in ipairs(FILTER_LIST) do + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, w = 'auto', h = 25, + group = 'FilterType', + text = _L.BAG_FILTER_TYPE[p.name], + checked = D.szFilterType == p.name, + onCheck = function(bChecked) + if not bChecked then + return + end + D.szFilterType = p.name + D.UpdateItems(page) + end, + }):AutoWidth():Width() + end + + local frame = this:GetRoot() + frame:RegisterEvent('MY_BAGSTATISTICS_MODE_CHANGE') + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('MY_ROLE_STAT_BAG_UPDATE') + + D.OnResizePage() +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + + page:Lookup('Wnd_Total'):SetSize(nW, nH) + page:Lookup('Wnd_Total/WndScroll_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/WndScroll_Name', 'Image_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name'):SetH(nH - 108) + page:Lookup('Wnd_Total/WndScroll_Name/Scroll_Name'):SetH(nH - 108) + page:Lookup('Wnd_Total/WndScroll_Name/Btn_NameAll'):SetRelY(nH - 90) + page:Lookup('Wnd_Total/WndScroll_Name/Wnd_SearchInfo'):SetRelY(nH - 103) + page:Lookup('Wnd_Total/WndScroll_Item'):SetSize(nW - 220, nH - 109) + page:Lookup('Wnd_Total/WndScroll_Item', ''):SetSize(nW - 220, nH - 109) + page:Lookup('Wnd_Total/WndScroll_Item', 'Image_Item'):SetSize(nW - 235, nH - 109) + page:Lookup('Wnd_Total/WndScroll_Item', 'Handle_Items'):SetSize(nW - 235, nH - 121) + page:Lookup('Wnd_Total/WndScroll_Item', 'Handle_Items'):FormatAllItemPos() + page:Lookup('Wnd_Total/WndScroll_Item', ''):FormatAllItemPos() + page:Lookup('Wnd_Total/WndScroll_Item/Scroll_Item'):SetRelX(nW - 235) + page:Lookup('Wnd_Total/WndScroll_Item/Scroll_Item'):SetH(nH - 83) + page:Lookup('Wnd_Total/Wnd_Index'):SetRelY(nH - 58) + page:Lookup('Wnd_Total/Wnd_Index'):SetW(nW - 235) + page:Lookup('Wnd_Total/Wnd_Index', ''):SetW(nW - 235) + page:Lookup('Wnd_Total/Wnd_Index', 'Image_Index'):SetW(nW - 235) + page:Lookup('Wnd_Total/Wnd_Index', 'Handle_IndexesOuter'):SetW(nW - 341) + page:Lookup('Wnd_Total/Wnd_Index', 'Handle_IndexesOuter'):FormatAllItemPos() + page:Lookup('Wnd_Total/Wnd_Index/Wnd_IndexEdit'):SetRelX(nW - 275) + + PAGE_DISPLAY = math.max(15, math.floor((nW - 341) / 35)) + NORMAL_MODE_PAGE_SIZE = math.max(50, math.ceil(nH / 150)) + COMPACT_MODE_PAGE_SIZE = math.max(150, math.floor((nW - 235) / 51) * math.ceil((nH - 121) / 51)) + D.UpdateNames(this) +end + +function D.OnActivePage() + D.Migration() + + if not O.bAdviceSaveDB and not O.bSaveDB then + X.Confirm(_L('%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), function() + MY_RoleStatistics_BagStat.bSaveDB = true + MY_RoleStatistics_BagStat.bAdviceSaveDB = true + end, function() + MY_RoleStatistics_BagStat.bAdviceSaveDB = true + end) + end + + D.UpdateNames(this) +end + +function D.OnEvent(event) + if event == 'MY_BAGSTATISTICS_MODE_CHANGE' then + D.UpdateItems(this) + elseif event == 'ON_MY_MOSAICS_RESET' then + D.UpdateNames(this) + elseif event == 'MY_ROLE_STAT_BAG_UPDATE' then + D.FlushDB() + D.UpdateNames(this) + end +end + +function D.OnEditSpecialKeyDown() + local name = this:GetName() + local szKey = GetKeyName(Station.GetMessageKey()) + if szKey == 'Enter' then + if name == 'Edit_SearchName' then + local page = this:GetParent():GetParent():GetParent() + D.UpdateNames(page) + elseif name == 'WndEdit_Index' then + local page = this:GetParent():GetParent():GetParent():GetParent() + page.nCurrentPage = tonumber(this:GetText()) or page.nCurrentPage + D.UpdateItems(page) + elseif name == 'Edit_SearchItem' then + local page = this:GetParent():GetParent():GetParent() + D.UpdateItems(page) + end + return 1 + end +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_Name' then + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + D.UpdateItems(page) + D.SaveNameChecks(this:GetParent():GetParent()) + end +end + +function D.OnCheckBoxUncheck() + local name = this:GetName() + if name == 'CheckBox_Name' then + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + D.UpdateItems(page) + D.SaveNameChecks(this:GetParent():GetParent()) + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Only' then + local wnd = this:GetParent() + local parent = wnd:GetParent() + for i = 0, parent:GetAllContentCount() - 1 do + local wnd = parent:LookupContent(i) + wnd:Lookup('CheckBox_Name'):Check(false, WNDEVENT_FIRETYPE.PREVENT) + end + wnd:Lookup('CheckBox_Name'):Check(true) + elseif name == 'Btn_Delete' then + local wnd = this:GetParent() + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + X.Confirm(_L('Are you sure to delete item record of %s?', wnd.ownername), function() + X.SQLitePrepareExecute(DB_ItemsDA, wnd.ownerkey) + X.SQLitePrepareExecute(DB_OwnerInfoD, wnd.ownerkey) + D.UpdateNames(page) + end) + elseif name == 'Btn_SwitchMode' then + X.UI.PopupMenu({ + { + szOption = _L['Switch compact mode'], + bCheck = true, bChecked = MY_RoleStatistics_BagStat.bCompactMode, + fnAction = function () + MY_RoleStatistics_BagStat.bCompactMode = not MY_RoleStatistics_BagStat.bCompactMode + X.UI.ClosePopupMenu() + end, + }, + { + szOption = _L['Hide equipped item'], + bCheck = true, bChecked = MY_RoleStatistics_BagStat.bHideEquipped, + fnAction = function () + MY_RoleStatistics_BagStat.bHideEquipped = not MY_RoleStatistics_BagStat.bHideEquipped + X.UI.ClosePopupMenu() + end, + }, + }) + elseif name == 'Btn_NameAll' then + local parent = this:GetParent():Lookup('WndContainer_Name') + local page = this:GetParent():GetParent():GetParent() + for i = 0, parent:GetAllContentCount() - 1 do + local wnd = parent:LookupContent(i) + wnd:Lookup('CheckBox_Name'):Check(true, WNDEVENT_FIRETYPE.PREVENT) + end + D.UpdateItems(page) + D.SaveNameChecks(parent) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Index' then + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent():GetParent() + page.nCurrentPage = this.nPage + D.UpdateItems(page) + end +end + +function D.OnItemMouseEnter() + if this.itemdata and this.belongsdata then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + + local rec = this.itemdata + local aXml = {} + + if X.IsEmpty(rec.itemtip) then + table.insert(aXml, GetItemInfoTip(nil, rec.tabtype, rec.tabindex, nil, nil, rec.tabsubindex) or '') + else + table.insert(aXml, UTF8ToAnsi(rec.itemtip) or '') + end + + if IsCtrlKeyDown() then + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText('ItemInfo: ' .. rec.tabtype .. ', ' .. rec.tabindex, 102)) + if rec.tabsubindex ~= -1 then + table.insert(aXml, GetFormatText('ItemInfo: ' .. rec.tabsubindex, 102)) + end + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText('Box: ' .. rec.boxtype .. ', ' .. rec.boxindex, 102)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText('IconID: ' .. (Table_GetItemIconID(rec.uiid) or ''), 102)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText('Strength: ' .. rec.strength, 102)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + end + + local aBelongsTip = {} + for _, rec in ipairs(this.belongsdata) do + table.insert(aBelongsTip, _L('%s (%s)\tBankx%d Bagx%d Totalx%d\n', UTF8ToAnsi(rec.ownername), UTF8ToAnsi(rec.servername), rec.bankcount, rec.bagcount, rec.bankcount + rec.bagcount)) + end + table.insert(aXml, GetFormatText(table.concat(aBelongsTip))) + + OutputTip(table.concat(aXml), 400, {x, y, w, h, false}, nil, false) + end +end +D.OnItemRefreshTip = D.OnItemMouseEnter + +function D.OnItemMouseLeave() + HideTip() +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'Wnd_Name' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(_L( + this.ownername:sub(1, 1) == '[' + and 'Tong: %s\nServer: %s\nSnapshot Time: %s' + or 'Character: %s\nServer: %s\nSnapshot Time: %s', + this.ownername, + this.servername, + X.FormatTime(this.time, '%yyyy-%MM-%dd %hh:%mm:%ss')), nil, 255, 255, 0), 400, {x, y, w, h, false}, nil, false) + elseif name == 'CheckBox_Name' then + X.ExecuteWithThis(this:GetParent(), D.OnMouseEnter) + end +end + +-- 浮动框 +function D.ApplyFloatEntry(bFloatEntry) + local frame = Station.Lookup('Normal/BigBagPanel') + if not frame then + return + end + local btn = frame:Lookup('Btn_MY_RoleStatistics_BagEntry') + if bFloatEntry then + if btn then + return + end + local nX, nY = 90, 7 + if X.UI.IS_GLASSMORPHISM then + nX, nY = 14, 3 + end + local frameTemp = X.UI.OpenFrame(PLUGIN_ROOT .. '/ui/MY_RoleStatistics_BagEntry.ini', 'MY_RoleStatistics_BagEntry') + btn = frameTemp:Lookup('Btn_MY_RoleStatistics_BagEntry') + btn:ChangeRelation(frame, true, true) + btn:SetRelPos(nX, nY) + if X.UI.IS_GLASSMORPHISM then + X.UI.SetButtonUITex( + btn, + 'ui\\image\\UItimate\\UICommon\\Button11.UITex', + 0, + 1, + 2, + 3 + ) + end + X.UI.CloseFrame(frameTemp) + btn.OnLButtonClick = function() + MY_RoleStatistics.Open('BagStat') + end + else + if not btn then + return + end + btn:Destroy() + end +end + +function D.UpdateFloatEntry() + if not D.bReady then + return + end + D.ApplyFloatEntry(O.bFloatEntry) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_BagStat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + szSaveDB = 'MY_RoleStatistics_BagStat.bSaveDB', + szFloatEntry = 'MY_RoleStatistics_BagStat.bFloatEntry', + }, + root = D, + }, + }, +} +MY_RoleStatistics.RegisterModule('BagStat', _L['MY_RoleStatistics_BagStat'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_BagStat', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'bCompactMode', + 'bHideEquipped', + 'tUncheckedNames', + 'bSaveDB', + 'bAdviceSaveDB', + 'bFloatEntry', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bCompactMode', + 'bHideEquipped', + 'tUncheckedNames', + 'bSaveDB', + 'bAdviceSaveDB', + 'bFloatEntry', + }, + triggers = { + bCompactMode = function() + FireUIEvent('MY_BAGSTATISTICS_MODE_CHANGE') + end, + bHideEquipped = function() + FireUIEvent('MY_BAGSTATISTICS_MODE_CHANGE') + end, + bSaveDB = D.UpdateSaveDB, + bFloatEntry = D.UpdateFloatEntry, + }, + root = O, + }, + }, +} +MY_RoleStatistics_BagStat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_RoleStatistics_BagStat', function() + D.bReady = true + D.UpdateFloatEntry() +end) + +X.RegisterExit('MY_RoleStatistics_BagStat', function() + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + D.UpdateSaveDB() + D.FlushDB() + end +end) + +X.RegisterReload('MY_RoleStatistics_BagStat', function() + D.ApplyFloatEntry(false) +end) + +X.RegisterFrameCreate('BigBagPanel', 'MY_RoleStatistics_BagStat', function() + D.UpdateFloatEntry() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/src/MY_RoleStatistics_DungeonStat.lua b/MY_RoleStatistics/src/MY_RoleStatistics_DungeonStat.lua new file mode 100644 index 000000000..52dad9cf9 --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics_DungeonStat.lua @@ -0,0 +1,1392 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 秘境CD统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics_DungeonStat' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics_DungeonStat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +-------------------------------------------------------------------------- + +CPath.MakeDir(X.FormatPath({'userdata/role_statistics', X.PATH_TYPE.GLOBAL})) + +local DB = X.SQLiteConnect(_L['MY_RoleStatistics_DungeonStat'], {'userdata/role_statistics/dungeon_stat.v3.db', X.PATH_TYPE.GLOBAL}) +if not DB then + return X.OutputSystemMessage(_L['MY_RoleStatistics_DungeonStat'], _L['Cannot connect to database!!!'], X.CONSTANT.MSG_THEME.ERROR) +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] + +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS DungeonInfo ( + guid NVARCHAR(20) NOT NULL, + account NVARCHAR(255) NOT NULL, + region NVARCHAR(20) NOT NULL, + server NVARCHAR(20) NOT NULL, + name NVARCHAR(20) NOT NULL, + force INTEGER NOT NULL, + level INTEGER NOT NULL, + equip_score INTEGER NOT NULL, + copy_info NVARCHAR(65535) NOT NULL, + progress_info NVARCHAR(65535) NOT NULL, + time INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(guid) + ) +]]) +local DB_DungeonInfoW = X.SQLitePrepare(DB, 'REPLACE INTO DungeonInfo (guid, account, region, server, name, force, level, equip_score, copy_info, progress_info, time, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)') +local DB_DungeonInfoG = X.SQLitePrepare(DB, 'SELECT * FROM DungeonInfo WHERE guid = ?') +local DB_DungeonInfoR = X.SQLitePrepare(DB, 'SELECT * FROM DungeonInfo WHERE account LIKE ? OR name LIKE ? OR region LIKE ? OR server LIKE ? ORDER BY time DESC') +local DB_DungeonInfoD = X.SQLitePrepare(DB, 'DELETE FROM DungeonInfo WHERE guid = ?') + +local O = X.CreateUserSettingsModule('MY_RoleStatistics_DungeonStat', _L['General'], { + aColumn = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_DungeonStat'], + _L['Columns'], + }), + xSchema = X.Schema.Collection(X.Schema.String), + xDefaultValue = { + 'name', + 'force', + 'recommend_raid_dungeon', + 'week_raid_dungeon', + 'week_team_dungeon', + 'time_days', + }, + }, + szSort = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_DungeonStat'], + _L['Sort'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'time_days', + }, + szSortOrder = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_DungeonStat'], + _L['Sort Order'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'desc', + }, + bFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_DungeonStat'], + _L['Float panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_DungeonStat'], + _L['Save DB'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + tMapSaveCopy = {}, -- 单秘境 CD + bMapSaveCopyValid = false, -- 客户端缓存的单秘境 CD 数据有效 + dwMapSaveCopyRequestTime = 0, -- 最后一次请求单秘境 CD 时间 + tMapProgress = {}, -- 单首领 CD 进度 + tMapProgressValid = {}, -- 客户端缓存的单首领 CD 进度数据有效 + tMapProgressRequestTime = setmetatable({}, { __index = function() return 0 end }), -- 客户端缓存的单首领 CD 进度数据有效 + aMapProgressRequestQueue = {}, -- 单首领 CD 获取队列 (一次获取太多可能会被踢) +} + +local DUNGEON_MIN_WIDTH = 100 +local function GeneCommonFormatText(id) + return function(r) + return GetFormatText(r[id], 162, 255, 255, 255) + end +end +local function GeneCommonCompare(id) + return function(r1, r2) + if r1[id] == r2[id] then + return 0 + end + return r1[id] > r2[id] and 1 or -1 + end +end +local function GetDungeonMapColumnID(dwMapID, szVia) + local szColumnID = 'dungeon_' .. dwMapID + if szVia then + szColumnID = szColumnID .. '@' .. szVia + end + return szColumnID +end +local function GetColumnDungeonMapID(szColumnID) + if not X.StringFindW(szColumnID, 'dungeon_') then + return + end + local dwMapID, szVia = X.StringReplaceW(szColumnID, 'dungeon_', ''), '' + if X.StringFindW(dwMapID, '@') then + local ids = X.SplitString(dwMapID, '@') + dwMapID, szVia = tonumber(ids[1]), ids[2] + else + dwMapID = tonumber(dwMapID) + end + if not dwMapID then + return + end + return dwMapID, szVia +end +local COLUMN_LIST = { + -- guid, + -- account, + { -- 大区 + id = 'region', + bHideInFloat = true, + szTitle = _L['Region'], + nMinWidth = 100, nMaxWidth = 100, + GetFormatText = GeneCommonFormatText('region'), + Compare = GeneCommonCompare('region'), + }, + { -- 服务器 + id = 'server', + bHideInFloat = true, + szTitle = _L['Server'], + nMinWidth = 100, nMaxWidth = 100, + GetFormatText = GeneCommonFormatText('server'), + Compare = GeneCommonCompare('server'), + }, + { -- 名字 + id = 'name', + bHideInFloat = true, + szTitle = _L['Name'], + nMinWidth = 110, nMaxWidth = 200, + GetFormatText = function(rec) + local name = rec.name + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + name = MY_ChatMosaics.MosaicsString(name) + end + return GetFormatText(name, 162, X.GetForceColor(rec.force, 'foreground')) + end, + Compare = GeneCommonCompare('name'), + }, + { -- 门派 + id = 'force', + bHideInFloat = true, + szTitle = _L['Force'], + nMinWidth = 50, nMaxWidth = 70, + GetFormatText = function(rec) + return GetFormatText(g_tStrings.tForceTitle[rec.force], 162, 255, 255, 255) + end, + Compare = GeneCommonCompare('force'), + }, + { -- 等级 + id = 'level', + szTitle = _L['Level'], + nMinWidth = 50, nMaxWidth = 50, + GetFormatText = GeneCommonFormatText('level'), + Compare = GeneCommonCompare('level'), + }, + { -- 装分 + id = 'equip_score', + bHideInFloat = true, + szTitle = _L['EquSC'], + nMinWidth = 100, nMaxWidth = 100, + GetFormatText = GeneCommonFormatText('equip_score'), + Compare = GeneCommonCompare('equip_score'), + }, + { -- 时间 + id = 'time', + bHideInFloat = true, + szTitle = _L['Cache time'], + nMinWidth = 165, nMaxWidth = 200, + GetFormatText = function(rec) + return GetFormatText(X.FormatTime(rec.time, '%yyyy/%MM/%dd %hh:%mm:%ss'), 162, 255, 255, 255) + end, + Compare = GeneCommonCompare('time'), + }, + { -- 时间计时 + id = 'time_days', + bHideInFloat = true, + szTitle = _L['Cache time days'], + nMinWidth = 120, nMaxWidth = 120, + GetFormatText = function(rec) + local nTime = GetCurrentTime() - rec.time + local nSeconds = math.floor(nTime) + local nMinutes = math.floor(nSeconds / 60) + local nHours = math.floor(nMinutes / 60) + local nDays = math.floor(nHours / 24) + local nYears = math.floor(nDays / 365) + local nDay = nDays % 365 + local nHour = nHours % 24 + local nMinute = nMinutes % 60 + local nSecond = nSeconds % 60 + if nYears > 0 then + return GetFormatText(_L('%d years %d days before', nYears, nDay), 162, 255, 255, 255) + end + if nDays > 0 then + return GetFormatText(_L('%d days %d hours before', nDays, nHour), 162, 255, 255, 255) + end + if nHours > 0 then + return GetFormatText(_L('%d hours %d mins before', nHours, nMinute), 162, 255, 255, 255) + end + if nMinutes > 0 then + return GetFormatText(_L('%d mins %d secs before', nMinutes, nSecond), 162, 255, 255, 255) + end + if nSecond > 10 then + return GetFormatText(_L('%d secs before', nSecond), 162, 255, 255, 255) + end + return GetFormatText(_L['Just now'], 162, 255, 255, 255) + end, + Compare = GeneCommonCompare('time'), + }, +} +local COLUMN_DICT = setmetatable({}, { __index = function(t, id) + if id == 'week_team_dungeon' then + if X.IS_REMAKE then + return { + id = id, + szTitle = _L['Week routine: '] .. _L.ACTIVITY_WEEK_TEAM_DUNGEON, + nMinWidth = DUNGEON_MIN_WIDTH * #X.GetActivityMap('WEEK_TEAM_DUNGEON'), + } + end + elseif id == 'week_raid_dungeon' then + if X.IS_REMAKE then + return { + id = id, + szTitle = _L['Week routine: '] .. _L.ACTIVITY_WEEK_RAID_DUNGEON, + nMinWidth = DUNGEON_MIN_WIDTH * #X.GetActivityMap('WEEK_RAID_DUNGEON'), + } + end + elseif id == 'recommend_team_dungeon' then + if X.IS_REMAKE then + return { + id = id, + szTitle = _L['Recommend: team dungeon'], + nMinWidth = DUNGEON_MIN_WIDTH * #X.GetRecommendDungeonMapList(false), + } + end + elseif id == 'recommend_raid_dungeon' then + if X.IS_REMAKE then + return { + id = id, + szTitle = _L['Recommend: raid dungeon'], + nMinWidth = DUNGEON_MIN_WIDTH * #X.GetRecommendDungeonMapList(true), + } + end + else + local mapid, via = GetColumnDungeonMapID(id) + local map = mapid and X.GetMapInfo(mapid) + if map then + local col = { -- 秘境CD + id = id, + szTitle = map.szName, + nMinWidth = DUNGEON_MIN_WIDTH, + } + if via then + local colVia = t[via] + if colVia then + col.szTitleTip = col.szTitle .. ' (' .. colVia.szTitle .. ')' + end + end + if X.IsCDProgressMap(map.dwID) then + col.GetFormatText = function(rec) + local aCopyID = rec.copy_info[map.dwID] + local aBossKill = rec.progress_info[map.dwID] + local nNextTime, nCircle = X.GetDungeonRefreshTime(map.dwID) + if not aBossKill or nNextTime - nCircle > rec.time then + return GetFormatText(_L['--'], 162, 255, 255, 255) + end + local aXml = {} + if IsCtrlKeyDown() and aCopyID then + table.insert(aXml, GetFormatText(table.concat(aCopyID, ',') .. ' ')) + end + local szBossKill = '' + for _, bKill in ipairs(aBossKill) do + if szBossKill ~= '' then + szBossKill = szBossKill .. ',' + end + szBossKill = szBossKill .. (bKill and '1' or '0') + end + for _, bKill in ipairs(aBossKill) do + table.insert(aXml, 'path="' .. PLUGIN_ROOT .. '/img/MY_RoleStatistics.UITex" name="Image_ProgressBoss" eventid=786 frame=' + .. (bKill and 1 or 0) .. ' w=12 h=12 script="this.mapid=' .. map.dwID .. ';this.progress_info=\'' .. szBossKill .. '\'"') + end + return table.concat(aXml) + end + col.Compare = function(r1, r2) + local k1 = r1.progress_info and r1.progress_info[map.dwID] + local k2 = r2.progress_info and r2.progress_info[map.dwID] + if k1 and not k2 then + return 1 + end + if k2 and not k1 then + return -1 + end + if not k1 and not k2 then + return 0 + end + local s1, s2 = 0, 0 + for _, p in ipairs(k1) do + if p then + s1 = s1 + 1 + end + end + for _, p in ipairs(k2) do + if p then + s2 = s2 + 1 + end + end + if s1 == s2 then + return 0 + end + return s1 > s2 and 1 or -1 + end + else + col.GetFormatText = function(rec) + local aCopyID = rec.copy_info[map.dwID] + local nNextTime, nCircle = X.GetDungeonRefreshTime(map.dwID) + local szText = nNextTime - nCircle < rec.time + and (aCopyID and aCopyID[1] or _L['None']) + or (_L['--']) + return GetFormatText(szText, 162, 255, 255, 255, 786, 'this.mapid=' .. map.dwID, 'Text_CD') + end + col.Compare = function(r1, r2) + local k1 = r1.copy_info and r1.copy_info[map.dwID] and r1.copy_info[map.dwID][1] + local k2 = r2.copy_info and r2.copy_info[map.dwID] and r2.copy_info[map.dwID][1] + if k1 and not k2 then + return 1 + end + if k2 and not k1 then + return -1 + end + if not k1 and not k2 then + return 0 + end + if k1 == k2 then + return 0 + end + return k1 > k2 and 1 or -1 + end + end + return col + end + end +end }) +for _, p in ipairs(COLUMN_LIST) do + if not p.Compare then + p.Compare = function(r1, r2) + local k1 = r1[p.szKey] + local k2 = r2[p.szKey] + if k1 and not k2 then + return 1 + end + if k2 and not k1 then + return -1 + end + if not k1 and not k2 then + return 0 + end + if k1 == k2 then + return 0 + end + return k1 > k2 and 1 or -1 + end + end + COLUMN_DICT[p.id] = p +end +local TIP_COLUMN = { + 'region', + 'server', + 'name', + 'force', + 'level', + 'equip_score', + 'DUNGEON', + 'time', + 'time_days', +} + +do +local REC_CACHE +function D.GetClientPlayerRec(bForceUpdate) + local me = X.GetClientPlayer() + if not me then + return + end + local rec = REC_CACHE + local guid = X.GetClientPlayerGlobalID() + if not rec then + rec = {} + REC_CACHE = rec + end + D.UpdateMapProgress(bForceUpdate) + + -- 基础信息 + rec.guid = guid + rec.account = X.GetAccount() or '' + rec.region = X.GetRegionOriginName() + rec.server = X.GetServerOriginName() + rec.name = me.szName + rec.force = me.dwForceID + rec.level = me.nLevel + rec.equip_score = me.GetBaseEquipScore() + me.GetStrengthEquipScore() + me.GetMountsEquipScore() + rec.time = GetCurrentTime() + rec.copy_info = D.tMapSaveCopy + rec.progress_info = D.tMapProgress + return rec +end +end + +function D.ProcessProgressRequestQueue() + local szKey = 'MY_RoleStatistics_DungeonStat__ProcessProgressRequestQueue' + if #D.aMapProgressRequestQueue > 0 then + X.BreatheCall(szKey, function() + local dwID = table.remove(D.aMapProgressRequestQueue) + if dwID then + D.tMapProgressRequestTime[dwID] = GetTime() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + _L['PMTool'], + _L('[MY_RoleStatistics_DungeonStat] ApplyDungeonRoleProgress: %d.', dwID), + X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] + ApplyDungeonRoleProgress(dwID, X.GetClientPlayerID()) + else + X.BreatheCall(szKey, false) + end + end) + else + X.BreatheCall(szKey, false) + end +end + +function D.Migration() + local DB_V2_PATH = X.FormatPath({'userdata/role_statistics/dungeon_stat.v2.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V2_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + X.SQLiteBeginTransaction(DB) + local aDungeonInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM DungeonInfo WHERE guid IS NOT NULL AND name IS NOT NULL') + if aDungeonInfo then + for _, rec in ipairs(aDungeonInfo) do + X.SQLitePrepareExecute( + DB_DungeonInfoW, + rec.guid, + rec.account, + rec.region, + rec.server, + rec.name, + rec.force, + rec.level, + rec.equip_score, + rec.copy_info, + rec.progress_info, + rec.time, + '' + ) + end + end + X.SQLiteEndTransaction(DB) + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + FireUIEvent('MY_ROLE_STAT_DUNGEON_UPDATE') + X.Alert(_L['Migrate succeed!']) + end) +end + +function D.FlushDB(bForceUpdate) + if not D.bReady or not O.bSaveDB then + return + end + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + + local rec = X.Clone(D.GetClientPlayerRec(bForceUpdate)) + D.EncodeRow(rec) + + X.SQLiteBeginTransaction(DB) + X.SQLitePrepareExecute( + DB_DungeonInfoW, + rec.guid, rec.account, rec.region, rec.server, + rec.name, rec.force, rec.level, rec.equip_score, + rec.copy_info, rec.progress_info, rec.time, '' + ) + X.SQLiteEndTransaction(DB) + + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage('MY_RoleStatistics_DungeonStat', _L('Flushing to database costs %dms...', nTickCount), X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end +X.RegisterFlush('MY_RoleStatistics_DungeonStat', function() D.FlushDB() end) + +function D.InitDB() + local me = X.GetClientPlayer() + if me then + local result = X.SQLitePrepareGetAll(DB_DungeonInfoG, AnsiToUTF8(X.GetClientPlayerGlobalID())) + local rec = result[1] + if rec then + D.DecodeRow(rec) + D.tMapSaveCopy = X.DecodeLUAData(rec.copy_info) or {} + D.tMapProgress = X.DecodeLUAData(rec.progress_info) or {} + end + end +end + +function D.UpdateSaveDB() + if not D.bReady then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if not O.bSaveDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_DungeonStat', 'Remove from database...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.SQLitePrepareExecute(DB_DungeonInfoD, AnsiToUTF8(X.GetClientPlayerGlobalID())) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_DungeonStat', 'Remove from database finished...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + FireUIEvent('MY_ROLE_STAT_DUNGEON_UPDATE') +end + +function D.GetColumns() + local aCol = {} + for _, id in ipairs(O.aColumn) do + if id == 'week_team_dungeon' then + for _, map in ipairs(X.GetActivityMap('WEEK_TEAM_DUNGEON')) do + local col = COLUMN_DICT[GetDungeonMapColumnID(map.dwID, id)] + if col then + table.insert(aCol, col) + end + end + elseif id == 'week_raid_dungeon' then + for _, map in ipairs(X.GetActivityMap('WEEK_RAID_DUNGEON')) do + local col = COLUMN_DICT[GetDungeonMapColumnID(map.dwID, id)] + if col then + table.insert(aCol, col) + end + end + elseif id == 'recommend_team_dungeon' then + for _, map in ipairs(X.GetRecommendDungeonMapList(false)) do + local col = COLUMN_DICT[GetDungeonMapColumnID(map.dwID, id)] + if col then + table.insert(aCol, col) + end + end + elseif id == 'recommend_raid_dungeon' then + for _, map in ipairs(X.GetRecommendDungeonMapList(true)) do + local col = COLUMN_DICT[GetDungeonMapColumnID(map.dwID, id)] + if col then + table.insert(aCol, col) + end + end + else + local col = COLUMN_DICT[id] + if col then + table.insert(aCol, col) + end + end + end + return aCol +end + +function D.GetTableColumns() + local aColumn = D.GetColumns() + local nLFixIndex, nLFixWidth = -1, 0 + for nIndex, col in ipairs(aColumn) do + nLFixWidth = nLFixWidth + (col.nMinWidth or 100) + if nLFixWidth > 450 then + break + end + if col.id == 'name' then + nLFixIndex = nIndex + break + end + end + local nRFixIndex, nRFixWidth = math.huge, 0 + for nIndex, col in X.ipairs_r(aColumn) do + if nIndex <= nLFixIndex then + break + end + nRFixWidth = nRFixWidth + (col.nMinWidth or 100) + if nRFixWidth > 300 then + break + end + if col.id == 'time' or col.id == 'time_days' then + nRFixIndex = nIndex + end + end + local aTableColumn = {} + for nIndex, col in ipairs(aColumn) do + local szFixed = nIndex <= nLFixIndex + and 'left' + or (nIndex >= nRFixIndex and 'right' or nil) + local c = { + key = col.id, + title = col.szTitle, + titleTip = col.szTitleTip or col.szTitle, + alignHorizontal = 'center', + render = col.GetFormatText + and function(value, record, index) + return col.GetFormatText(record) + end + or nil, + sorter = col.Compare + and function(v1, v2, r1, r2) + return col.Compare(r1, r2) + end + or nil, + draggable = not col.id:find('@') or not aColumn[nIndex - 1] or aColumn[nIndex - 1].id:gsub('.+@', '') ~= col.id:gsub('.+@', ''), + } + if szFixed then + c.fixed = szFixed + c.width = col.nMinWidth or 100 + else + c.minWidth = col.nMinWidth + c.maxWidth = col.nMaxWidth + end + table.insert(aTableColumn, c) + end + return aTableColumn +end + +function D.UpdateUI(page) + local ui = X.UI(page) + + local szSearch = ui:Fetch('WndEditBox_Search'):Text() + local szUSearch = AnsiToUTF8('%' .. szSearch .. '%') + local result = X.SQLitePrepareGetAll(DB_DungeonInfoR, szUSearch, szUSearch, szUSearch, szUSearch) + + for _, rec in ipairs(result) do + D.DecodeRow(rec) + end + + ui:Fetch('WndTable_Stat') + :Columns(D.GetTableColumns()) + :DataSource(result) +end + +function D.UpdateMapProgress(bForceUpdate) + local me = X.GetClientPlayer() + if not me then -- 确保不可能在切换GS时请求 + return + end + local tProgressBossMapID = {} + -- 监控数据里的地图 ID + for _, col in ipairs(D.GetColumns()) do + local dwID = GetColumnDungeonMapID(col.id) + if dwID then + tProgressBossMapID[dwID] = true + end + end + -- 已经有 CD 的地图 ID + for k, v in pairs(D.tMapSaveCopy) do + if v then + tProgressBossMapID[k] = true + end + end + -- 获取这些地图的进度 + for dwID, _ in pairs(tProgressBossMapID) do + local aProgressBoss = dwID and X.IsCDProgressMap(dwID) and X.GetMapCDProgressInfo(dwID) + if aProgressBoss then + -- 强制刷新秘境进度,或者进度数据已过期并且5秒内未请求过,则发起请求 + if bForceUpdate or (not D.tMapProgressValid[dwID] and GetTime() - D.tMapProgressRequestTime[dwID] > 5000) then + if not X.Contains(D.aMapProgressRequestQueue, dwID) then + table.insert(D.aMapProgressRequestQueue, dwID) + end + end + -- 检测是否有进度数据(修正脏数据标记位) + local bMapProgressValid = D.tMapProgressValid[dwID] + if not bMapProgressValid then + for i, boss in ipairs(aProgressBoss) do + if GetDungeonRoleProgress(dwID, X.GetClientPlayerID(), boss.dwProgressID) then + bMapProgressValid = true + break + end + end + end + -- 已经获取到进度的秘境,或者没有 CD 数据的秘境 + if bMapProgressValid or (D.bMapSaveCopyValid and not D.tMapSaveCopy[dwID]) then + local aProgress = {} + for i, boss in ipairs(aProgressBoss) do + aProgress[i] = GetDungeonRoleProgress(dwID, X.GetClientPlayerID(), boss.dwProgressID) + end + D.tMapProgress[dwID] = aProgress + end + end + D.ProcessProgressRequestQueue() + end + -- 强制刷新秘境进度,或者进度数据已过期并且5秒内未请求过,则发起请求 + if bForceUpdate or (not D.bMapSaveCopyValid and GetTime() - D.dwMapSaveCopyRequestTime > 5000) then + D.dwMapSaveCopyRequestTime = GetTime() + ApplyMapSaveCopy() + end +end + +function D.EncodeRow(rec) + rec.guid = AnsiToUTF8(rec.guid) + rec.name = AnsiToUTF8(rec.name) + rec.region = AnsiToUTF8(rec.region) + rec.server = AnsiToUTF8(rec.server) + rec.copy_info = X.EncodeLUAData(rec.copy_info) + rec.progress_info = X.EncodeLUAData(rec.progress_info) +end + +function D.DecodeRow(rec) + rec.guid = UTF8ToAnsi(rec.guid) + rec.name = UTF8ToAnsi(rec.name) + rec.region = UTF8ToAnsi(rec.region) + rec.server = UTF8ToAnsi(rec.server) + rec.copy_info = X.DecodeLUAData(rec.copy_info or '') or {} + rec.progress_info = X.DecodeLUAData(rec.progress_info or '') or {} +end + +function D.GetDungeonRecTipInfo(rec, dwMapID) + local col = COLUMN_DICT[GetDungeonMapColumnID(dwMapID)] + if col then + local a = {} + local nMaxPlayerCount = select(3, GetMapParams(dwMapID)) + table.insert(a, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(a, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(a, col.GetFormatText(rec)) + table.insert(a, GetFormatText('\n', 162, 255, 255, 255)) + return { dwMapID = dwMapID, nMaxPlayerCount = nMaxPlayerCount, szXml = table.concat(a) } + else + local map = X.GetMapInfo(dwMapID) + local aCopyID = rec.copy_info[dwMapID] + if map and aCopyID then + local a = {} + local nMaxPlayerCount = select(3, GetMapParams(dwMapID)) + table.insert(a, GetFormatText(map.szName, 162, 255, 255, 0)) + table.insert(a, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(a, GetFormatText(table.concat(aCopyID, ','))) + table.insert(a, GetFormatText('\n', 162, 255, 255, 255)) + return { dwMapID = dwMapID, nMaxPlayerCount = nMaxPlayerCount, szXml = table.concat(a) } + end + end +end + +function D.GetRowTip(rec, bFloat) + local aXml = {} + for _, id in ipairs(TIP_COLUMN) do + if id == 'DUNGEON' then + local aMapID = {} + for _, col in ipairs(D.GetColumns()) do + local dwMapID = GetColumnDungeonMapID(col.id) + if dwMapID then + table.insert(aMapID, dwMapID) + end + end + for dwMapID, _ in pairs(rec.copy_info) do + table.insert(aMapID, dwMapID) + end + local tDungeon, aDungeon = {}, {} + for _, dwMapID in ipairs(aMapID) do + local info = dwMapID and not tDungeon[dwMapID] and D.GetDungeonRecTipInfo(rec, dwMapID) + if info then + table.insert(aDungeon, info) + tDungeon[dwMapID] = true + end + end + table.sort(aDungeon, function(p1, p2) + if p1.nMaxPlayerCount == p2.nMaxPlayerCount then + return p1.dwMapID < p2.dwMapID + end + return p1.nMaxPlayerCount < p2.nMaxPlayerCount + end) + local nMaxPlayerCount = 0 + for _, p in ipairs(aDungeon) do + if nMaxPlayerCount ~= p.nMaxPlayerCount then + nMaxPlayerCount = p.nMaxPlayerCount + table.insert(aXml, GetFormatText(_L('---- %d players dungeon ----', nMaxPlayerCount) .. '\n', 162, 255, 255, 0)) + end + table.insert(aXml, p.szXml) + end + else + local col = COLUMN_DICT[id] + if col and (not bFloat or not col.bHideInFloat) then + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec)) + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + end + return table.concat(aXml) +end + +function D.OutputRowTip(this, rec) + local bFloat = this:GetRoot():GetName() ~= 'MY_RoleStatistics' + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local nPosType = bFloat and X.UI.TIP_POSITION.TOP_BOTTOM or X.UI.TIP_POSITION.RIGHT_LEFT + OutputTip(D.GetRowTip(rec, bFloat), 450, {x, y, w, h}, nPosType) +end + +function D.CloseRowTip() + HideTip() +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = 20, y = 20, w = 388, h = 25, + appearance = 'SEARCH_RIGHT', + placeholder = _L['Press ENTER to search...'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.UpdateUI(page) + return 1 + end + end, + }) + + ui:Append('WndComboBox', { + name = 'WndComboBox_DisplayColumns', + x = 800, y = 20, w = 180, + text = _L['Columns'], + menu = function() + local t = {} + local function UpdateMenu() + local aColumn, tChecked, nMinW = O.aColumn, {}, 0 + for i = 1, #t do + t[i] = nil + end + -- 已添加的 + for nIndex, id in ipairs(aColumn) do + local col = COLUMN_DICT[id] + if col then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local nOffset = IsShiftKeyDown() and 1 or -1 + if nIndex + nOffset < 1 or nIndex + nOffset > #O.aColumn then + return + end + local aColumn = O.aColumn + aColumn[nIndex], aColumn[nIndex + nOffset] = aColumn[nIndex + nOffset], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + fnMouseEnter = function() + if #O.aColumn == 1 then + return + end + local szText = _L['Click to move up, Hold SHIFT to move down.'] + if nIndex == 1 then + szText = _L['Hold SHIFT click to move down.'] + elseif nIndex == #O.aColumn then + szText = _L['Click to move up.'] + end + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(szText, nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.LEFT_RIGHT) + end, + fnMouseLeave = function() + HideTip() + end, + { + szOption = _L['Move up'], + fnAction = function() + if nIndex > 1 then + aColumn[nIndex], aColumn[nIndex - 1] = aColumn[nIndex - 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + { + szOption = _L['Move down'], + fnAction = function() + if nIndex < #aColumn then + aColumn[nIndex], aColumn[nIndex + 1] = aColumn[nIndex + 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Delete'], + fnAction = function() + table.remove(aColumn, nIndex) + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + }) + nMinW = nMinW + col.nMinWidth + end + tChecked[id] = true + end + -- 未添加的 + local function fnAction(id, nWidth) + local bExist = false + for i, v in ipairs(aColumn) do + if v == id then + table.remove(aColumn, i) + O.aColumn = aColumn + bExist = true + break + end + end + if not bExist then + table.insert(aColumn, id) + O.aColumn = aColumn + end + UpdateMenu() + D.FlushDB(true) + D.UpdateUI(page) + end + -- 普通选项 + for _, col in ipairs(COLUMN_LIST) do + if not tChecked[col.id] then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + fnAction(col.id, col.nMinWidth) + end, + }) + end + end + -- 秘境选项 + local tDungeonChecked = {} + for _, id in ipairs(aColumn) do + local dwID = GetColumnDungeonMapID(id) + if dwID then + tDungeonChecked[dwID] = true + end + end + local tDungeonMenu = X.GetDungeonMenu({ + fnAction = function(info) + fnAction(GetDungeonMapColumnID(info.dwID), DUNGEON_MIN_WIDTH) + end, + tChecked = tDungeonChecked, + bStarveMap = false, + bMonsterMap = false, + }) + -- 动态活动秘境选项 + for _, szType in ipairs({ + 'week_team_dungeon', + 'week_raid_dungeon', + 'recommend_team_dungeon', + 'recommend_raid_dungeon', + }) do + local col = COLUMN_DICT[szType] + if col then + table.insert(tDungeonMenu, { + szOption = col.szTitle, + bCheck = true, bChecked = tChecked[col.id], + fnAction = function() + fnAction(col.id, col.nMinWidth) + end, + }) + end + end + -- 子菜单标题 + tDungeonMenu.szOption = _L['Dungeon copy'] + table.insert(t, tDungeonMenu) + end + UpdateMenu() + return t + end, + }) + + ui:Append('WndTable', { + name = 'WndTable_Stat', + x = 20, y = 60, w = 960, h = 530, + sort = O.szSort, + sortOrder = O.szSortOrder, + onSortChange = function(szSort, szSortOrder) + O.szSort, O.szSortOrder = szSort, szSortOrder + end, + rowTip = { + render = function(rec) + return D.GetRowTip(rec, false), true + end, + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + rowMenuRClick = function(rec, index) + local menu = { + { + szOption = _L['Delete'], + fnAction = function() + X.SQLitePrepareExecute(DB_DungeonInfoD, AnsiToUTF8(rec.guid)) + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + } + PopupMenu(menu) + end, + onColumnsChange = function(aColumns) + local tAccKeys, tAccKeySuffix = {}, {} + for _, col in ipairs(D.GetTableColumns()) do + if col.key:find('@') then + local szSuffix = col.key:gsub('.+@', '') + if not tAccKeySuffix[szSuffix] then + tAccKeys[col.key] = true + tAccKeySuffix[szSuffix] = true + end + else + tAccKeys[col.key] = true + end + end + local aKeys, tKeys = {}, {} + for _, col in ipairs(aColumns) do + if tAccKeys[col.key] then + local szKey = col.key:gsub('.+@', '') + if not tKeys[szKey] then + table.insert(aKeys, szKey) + tKeys[szKey] = true + end + end + end + O.aColumn = aKeys + D.UpdateUI(page) + end, + }) + + local frame = page:GetRoot() + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('UPDATE_DUNGEON_ROLE_PROGRESS') + frame:RegisterEvent('ON_APPLY_PLAYER_SAVED_COPY_RESPOND') + frame:RegisterEvent('MY_ROLE_STAT_DUNGEON_UPDATE') + + D.OnResizePage() +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + + ui:Fetch('WndComboBox_DisplayColumns'):Left(nW - 200) + ui:Fetch('WndTable_Stat'):Size(nW - 40, nH - 100) +end + +function D.CheckAdvice() + for _, p in ipairs({ + { + szMsg = _L('%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + szAdviceKey = 'bAdviceSaveDB', + szSetKey = 'bSaveDB', + }, + -- { + -- szMsg = _L('%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + -- szAdviceKey = 'bAdviceFloatEntry', + -- szSetKey = 'bFloatEntry', + -- }, + }) do + if not O[p.szAdviceKey] and not O[p.szSetKey] then + X.Confirm(p.szMsg, function() + MY_RoleStatistics_DungeonStat[p.szSetKey] = true + MY_RoleStatistics_DungeonStat[p.szAdviceKey] = true + D.CheckAdvice() + end, function() + MY_RoleStatistics_DungeonStat[p.szAdviceKey] = true + D.CheckAdvice() + end) + return + end + end +end + +function D.OnActivePage() + D.Migration() + D.CheckAdvice() + D.FlushDB(true) + D.UpdateUI(this) +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + D.UpdateUI(this) + elseif event == 'UPDATE_DUNGEON_ROLE_PROGRESS' or event == 'ON_APPLY_PLAYER_SAVED_COPY_RESPOND' then + D.FlushDB() + D.UpdateUI(this) + elseif event == 'MY_ROLE_STAT_DUNGEON_UPDATE' then + D.FlushDB() + D.UpdateUI(this) + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Delete' then + local wnd = this:GetParent() + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + X.Confirm(_L('Are you sure to delete item record of %s?', wnd.name), function() + X.SQLitePrepareExecute(DB_DungeonInfoD, AnsiToUTF8(wnd.guid)) + D.UpdateUI(page) + end) + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Image_ProgressBoss' or name == 'Text_CD' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local aText = {} + local map = X.GetMapInfo(this.mapid) + if map then + local szName = map.szName + local aCD = D.tMapSaveCopy[map.dwID] + if not X.IsEmpty(aCD) then + szName = szName .. ' (' .. table.concat(aCD, ', ') .. ')' + end + table.insert(aText, szName) + end + if name == 'Image_ProgressBoss' then + table.insert(aText, '') + local aBossKill = X.SplitString(this.progress_info, ',') + for i, boss in ipairs(X.GetMapCDProgressInfo(this.mapid)) do + table.insert(aText, boss.szName .. '\t' .. _L[aBossKill[i] == '1' and 'x' or 'r']) + end + end + table.insert(aText, '') + local nTime = X.GetDungeonRefreshTime(this.mapid) - GetCurrentTime() + table.insert(aText, _L('Refresh: %s', X.FormatDuration(nTime, 'CHINESE'))) + OutputTip(GetFormatText(table.concat(aText, '\n'), 162, 255, 255, 255), 400, { x, y, w, h }) + elseif this.tip then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(this.tip, 400, {x, y, w, h, false}, nil, false) + end +end +D.OnItemRefreshTip = D.OnItemMouseEnter + +function D.OnItemMouseLeave() + HideTip() +end + +-- 浮动框 +function D.ApplyFloatEntry(bFloatEntry) + if bFloatEntry then + if D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_DungeonEntry', { + nPriority = 100.2, + tAnchor = { s = 'TOPLEFT', r = 'TOPLEFT', x = 370 - 5 + 72, y = 30 - 5 + 13 }, + fnCreate = function(wnd) + wnd:SetSize(24, 24) + local frameTemp = X.UI.OpenFrame(PLUGIN_ROOT .. '/ui/MY_RoleStatistics_DungeonEntry.ini', 'MY_RoleStatistics_DungeonEntry') + local btn = frameTemp:Lookup('Btn_MY_RoleStatistics_DungeonEntry') + btn:ChangeRelation(wnd, true, true) + btn:SetRelPos(2, 2) + X.UI.CloseFrame(frameTemp) + btn.OnMouseEnter = function() + local rec = D.GetClientPlayerRec(true) + if not rec then + return + end + D.OutputRowTip(this, rec) + end + btn.OnMouseLeave = function() + D.CloseRowTip() + end + btn.OnLButtonClick = function() + MY_RoleStatistics.Open('DungeonStat') + end + end, + }) + else + if not D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_DungeonEntry', false) + end + D.bFloatEntry = bFloatEntry +end + +function D.UpdateFloatEntry() + if not D.bReady then + return + end + D.ApplyFloatEntry(O.bFloatEntry) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_DungeonStat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + szSaveDB = 'MY_RoleStatistics_DungeonStat.bSaveDB', + szFloatEntry = 'MY_RoleStatistics_DungeonStat.bFloatEntry', + }, + root = D, + }, + }, +} +MY_RoleStatistics.RegisterModule('DungeonStat', _L['MY_RoleStatistics_DungeonStat'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_DungeonStat', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + triggers = { + bFloatEntry = D.UpdateFloatEntry, + bSaveDB = D.UpdateSaveDB, + }, + root = O, + }, + }, +} +MY_RoleStatistics_DungeonStat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_RoleStatistics_DungeonStat', function() + D.bReady = true + D.UpdateFloatEntry() +end) + +X.RegisterInit('MY_RoleStatistics_DungeonStat', function() + X.DelayCall('MY_RoleStatistics_DungeonStat__InitMapProgress', 60000, function() + D.UpdateMapProgress() + end) + D.InitDB() +end) + +X.RegisterExit('MY_RoleStatistics_DungeonStat', function() + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + D.UpdateSaveDB() + D.FlushDB() + D.UpdateMapProgress() + end +end) + +X.RegisterReload('MY_RoleStatistics_DungeonStat', function() + D.ApplyFloatEntry(false) +end) + +-- 首领死亡刷新秘境进度(秘境内同步拾取则视为进度更新) +X.RegisterEvent('SYNC_LOOT_LIST', 'MY_RoleStatistics_DungeonStat__UpdateMapCopy', function() + if not D.bReady or not X.IsInDungeonMap() then + return + end + local me = X.GetClientPlayer() + if me then + D.bMapSaveCopyValid = false + D.tMapProgressValid[me.GetMapID()] = false + end + X.DelayCall('MY_RoleStatistics_DungeonStat__UpdateMapCopy', 300, function() D.UpdateMapProgress() end) +end) + +X.RegisterEvent('UPDATE_DUNGEON_ROLE_PROGRESS', function() + local dwMapID, dwPlayerID = arg0, arg1 + if dwPlayerID ~= X.GetClientPlayerID() then + return + end + D.tMapProgressValid[dwMapID] = true + D.FlushDB() +end) + +X.RegisterEvent('ON_APPLY_PLAYER_SAVED_COPY_RESPOND', function() + local tMapCopy = arg0 + D.tMapSaveCopy = tMapCopy + D.bMapSaveCopyValid = true + D.FlushDB() +end) + +X.RegisterFrameCreate('Player', 'MY_RoleStatistics_DungeonStat', function() + D.UpdateFloatEntry() +end) + + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/src/MY_RoleStatistics_EquipStat.lua b/MY_RoleStatistics/src/MY_RoleStatistics_EquipStat.lua new file mode 100644 index 000000000..9bfe04ca4 --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics_EquipStat.lua @@ -0,0 +1,1118 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 装备统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics_EquipStat' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics_EquipStat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +CPath.MakeDir(X.FormatPath({'userdata/role_statistics', X.PATH_TYPE.GLOBAL})) + +local DB = X.SQLiteConnect(_L['MY_RoleStatistics_EquipStat'], {'userdata/role_statistics/equip_stat.v4.db', X.PATH_TYPE.GLOBAL}) +if not DB then + return X.OutputSystemMessage(_L['MY_RoleStatistics_EquipStat'], _L['Cannot connect to database!!!'], X.CONSTANT.MSG_THEME.ERROR) +end +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_RoleStatistics/ui/MY_RoleStatistics_EquipStat.ini' + +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS EquipItems ( + ownerkey NVARCHAR(20) NOT NULL, + suitindex INTEGER NOT NULL, + boxtype INTEGER NOT NULL, + boxindex INTEGER NOT NULL, + itemid INTEGER NOT NULL, + tabtype INTEGER NOT NULL, + tabindex INTEGER NOT NULL, + tabsubindex INTEGER NOT NULL, + stacknum INTEGER NOT NULL, + uiid INTEGER NOT NULL, + strength INTEGER NOT NULL, + durability INTEGER NOT NULL, + diamond_enchant NVARCHAR(100) NOT NULL, + fea_enchant INTEGER NOT NULL, + permanent_enchant INTEGER NOT NULL, + temporary_enchant INTEGER NOT NULL, + desc NVARCHAR(4000) NOT NULL, + time INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(ownerkey, boxtype, boxindex) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS EquipItems_tab_idx ON EquipItems(tabtype, tabindex, tabsubindex)') +local DB_ItemsW = X.SQLitePrepare(DB, [[ + REPLACE INTO + EquipItems (ownerkey, suitindex, boxtype, boxindex, itemid, tabtype, tabindex, tabsubindex, stacknum, uiid, strength, durability, diamond_enchant, fea_enchant, permanent_enchant, temporary_enchant, desc, time, extra) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +]]) +local DB_ItemsR = X.SQLitePrepare(DB, 'SELECT * FROM EquipItems WHERE ownerkey = ? and suitindex = ?') +local DB_ItemsDL = X.SQLitePrepare(DB, 'DELETE FROM EquipItems WHERE ownerkey = ? AND boxtype = ? AND boxindex >= ?') +local DB_ItemsDA = X.SQLitePrepare(DB, 'DELETE FROM EquipItems WHERE ownerkey = ?') + +X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS OwnerInfo ( + ownerkey NVARCHAR(20) NOT NULL, + ownername NVARCHAR(20) NOT NULL, + servername NVARCHAR(20) NOT NULL, + ownerforce INTEGER NOT NULL, + ownerrole INTEGER NOT NULL, + ownerlevel INTEGER NOT NULL, + ownerscore NVARCHAR(100) NOT NULL, + ownersuitindex INTEGER NOT NULL, + time INTEGER NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY(ownerkey) + ) +]]) +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS OwnerInfo_ownername_idx ON OwnerInfo(ownername)') +X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS OwnerInfo_servername_idx ON OwnerInfo(servername)') +local DB_OwnerInfoW = X.SQLitePrepare(DB, 'REPLACE INTO OwnerInfo (ownerkey, ownername, servername, ownerforce, ownerrole, ownerlevel, ownerscore, ownersuitindex, time, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)') +local DB_OwnerInfoR = X.SQLitePrepare(DB, 'SELECT * FROM OwnerInfo WHERE ownername LIKE ? OR servername LIKE ? ORDER BY time DESC') +local DB_OwnerInfoG = X.SQLitePrepare(DB, 'SELECT * FROM OwnerInfo WHERE ownerkey = ?') +local DB_OwnerInfoD = X.SQLitePrepare(DB, 'DELETE FROM OwnerInfo WHERE ownerkey = ?') + +local EQUIPMENT_ITEM_LIST = { + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.HELM or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.HELM, + box = 'Handle_Equip/Box_Helm', + durability = 'Handle_Equip/Text_Helm', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.CHEST or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.CHEST, + box = 'Handle_Equip/Box_Chest', + durability = 'Handle_Equip/Text_Chest', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.BANGLE or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.BANGLE, + box = 'Handle_Equip/Box_Bangle', + durability = 'Handle_Equip/Text_Bangle', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.WAIST or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.WAIST, + box = 'Handle_Equip/Box_Waist', + durability = 'Handle_Equip/Text_Waist', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.PANTS or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.PANTS, + box = 'Handle_Equip/Box_Pants', + durability = 'Handle_Equip/Text_Pants', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.BOOTS or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.BOOTS, + box = 'Handle_Equip/Box_Boots', + durability = 'Handle_Equip/Text_Boots', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.AMULET or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.AMULET, + box = 'Handle_Equip/Box_Amulet' + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.PENDANT or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.PENDANT, + box = 'Handle_Equip/Box_Pendant' + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.RING or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.LEFT_RING, + box = 'Handle_Equip/Box_LeftRing' + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.RING or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.RIGHT_RING, + box = 'Handle_Equip/Box_RightRing' + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.MELEE_WEAPON or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.MELEE_WEAPON, + box = 'Handle_Weapon/Box_LightSword', + durability = 'Handle_Weapon/Text_LightSword', + }, + { + label = g_tStrings.WeapenDetail[WEAPON_DETAIL.BIG_SWORD or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.BIG_SWORD, + box = 'Handle_Weapon/Box_HeavySword', + durability = 'Handle_Weapon/Text_HeavySword', + background = 'Handle_Weapon/Image_HeavySword', + force = X.CONSTANT.FORCE_TYPE.CANG_JIAN or -1, + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.RANGE_WEAPON or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.RANGE_WEAPON, + box = 'Handle_Weapon/Box_RangeWeapon', + durability = 'Handle_Weapon/Text_RangeWeapon', + }, + { + label = g_tStrings.tEquipTypeNameTable[X.CONSTANT.EQUIPMENT_SUB.ARROW or 'NULL'], + pos = X.CONSTANT.EQUIPMENT_INVENTORY.ARROW, + box = 'Handle_Weapon/Box_AmmoPouch' + }, +} +local EQUIPMENT_EXTRA_ITEM_LIST = { + { key = 'waist' , box = 'Handle_Equip/Box_Waist_Extend' }, -- EQUIPMENT_SUB.WAIST_EXTEND + { key = 'back' , box = 'Handle_Equip/Box_Back_Extend' }, -- EQUIPMENT_SUB.BACK_EXTEND + { key = 'face' , box = 'Handle_Equip/Box_Helm_Extend' }, -- EQUIPMENT_SUB.FACE_EXTEND + { key = 'lshoulder', box = 'Handle_Equip/Box_LShoulder_Extend' }, -- EQUIPMENT_SUB.L_SHOULDER_EXTEND + { key = 'rshoulder', box = 'Handle_Equip/Box_RShoulder_Extend' }, -- EQUIPMENT_SUB.R_SHOULDER_EXTEND + { key = 'backcloak', box = 'Handle_Equip/Box_BackCloak_Extend' }, -- EQUIPMENT_SUB.BACK_CLOAK_EXTEND + { key = 'bag' , box = 'Handle_Equip/Box_Bag' }, -- EQUIPMENT_SUB.BAG_EXTEND + { key = 'glasses' , box = 'Handle_Equip/Box_Glasses' }, -- EQUIPMENT_SUB.GLASSES_EXTEND + { key = 'lglove' , box = 'Handle_Equip/Box_LHand_Extend' }, -- EQUIPMENT_SUB.L_GLOVE_EXTEND + { key = 'rglove' , box = 'Handle_Equip/Box_RHand_Extend' }, -- EQUIPMENT_SUB.R_GLOVE_EXTEND + { key = 'penpet' , box = 'Handle_Equip/Box_PendantPet' }, -- +} + +local O = X.CreateUserSettingsModule('MY_RoleStatistics_EquipStat', _L['General'], { + bCompactMode = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_EquipStat'], + _L['Switch compact mode'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_EquipStat'], + _L['Float panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_EquipStat'], + _L['Save DB'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + szCurrentOwnerKey = nil, + dwCurrentSuitIndex = 1, +} + +local function GetEquipRecipeDesc(Value1, Value2) + local szText = '' + local EquipmentRecipe = X.GetGameTable('EquipmentRecipe', true) + if EquipmentRecipe then + local tRecipeSkillAtrri = EquipmentRecipe:Search(Value1, Value2) + if tRecipeSkillAtrri then + szText = tRecipeSkillAtrri.szDesc + end + end + return szText +end + +function D.FormatEnchantAttribText(v) + if v.nID == ATTRIBUTE_TYPE.SKILL_EVENT_HANDLER then + local SkillEvent = X.GetGameTable('SkillEvent', true) + if SkillEvent then + local skillEvent = SkillEvent:Search(v.nValue1) + if skillEvent then + return FormatString(skillEvent.szDesc, v.nValue1, v.nValue2) + end + end + return 'text="unknown skill event id:' .. v.nValue1 .. '"' + elseif v.nID == ATTRIBUTE_TYPE.SET_EQUIPMENT_RECIPE then + return GetEquipRecipeDesc(v.nValue1, v.nValue2) + else + FormatAttributeValue(v) + return FormatString(Table_GetMagicAttributeInfo(v.nID, true), v.nValue1, v.nValue2, MAGIC_ATTRI_DEF, MAGIC_ATTRI_DEF) + end +end + +function D.Migration() + local DB_V2_PATH = X.FormatPath({'userdata/role_statistics/equip_stat.v2.db', X.PATH_TYPE.GLOBAL}) + local DB_V3_PATH = X.FormatPath({'userdata/role_statistics/equip_stat.v3.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V2_PATH) and not IsLocalFileExist(DB_V3_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + X.SQLiteBeginTransaction(DB) + local aEquipItems = X.SQLiteGetAll(DB_V2, 'SELECT * FROM EquipItems WHERE ownerkey IS NOT NULL AND suitindex IS NOT NULL AND boxtype IS NOT NULL') + if aEquipItems then + for _, rec in ipairs(aEquipItems) do + X.SQLitePrepareExecute( + DB_ItemsW, + rec.ownerkey, + rec.suitindex, + rec.boxtype, + rec.boxindex, + rec.itemid, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.stacknum, + rec.uiid, + rec.strength, + rec.durability, + rec.diamond_enchant, + rec.fea_enchant, + rec.permanent_enchant, + 0, + rec.desc, + rec.time, + rec.extra + ) + end + end + local aOwnerInfo = X.SQLiteGetAll(DB_V2, 'SELECT * FROM OwnerInfo WHERE ownerkey IS NOT NULL AND ownername IS NOT NULL AND servername IS NOT NULL') + if aOwnerInfo then + for _, rec in ipairs(aOwnerInfo) do + X.SQLitePrepareExecute( + DB_OwnerInfoW, + rec.ownerkey, + rec.ownername, + rec.servername, + rec.ownerforce, + rec.ownerrole, + rec.ownerlevel, + '', + rec.ownersuitindex, + rec.time, + '' + ) + end + end + X.SQLiteEndTransaction(DB) + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V3旧版数据 + if IsLocalFileExist(DB_V3_PATH) then + local DB_V3 = SQLite3_Open(DB_V3_PATH) + if DB_V3 then + X.SQLiteBeginTransaction(DB) + local aEquipItems = X.SQLiteGetAll(DB_V3, 'SELECT * FROM EquipItems WHERE ownerkey IS NOT NULL AND suitindex IS NOT NULL AND boxtype IS NOT NULL') + if aEquipItems then + for _, rec in ipairs(aEquipItems) do + X.SQLitePrepareExecute( + DB_ItemsW, + rec.ownerkey, + rec.suitindex, + rec.boxtype, + rec.boxindex, + rec.itemid, + rec.tabtype, + rec.tabindex, + rec.tabsubindex, + rec.stacknum, + rec.uiid, + rec.strength, + rec.durability, + rec.diamond_enchant, + rec.fea_enchant, + rec.permanent_enchant, + 0, + rec.desc, + rec.time, + rec.extra + ) + end + end + local aOwnerInfo = X.SQLiteGetAll(DB_V3, 'SELECT * FROM OwnerInfo WHERE ownerkey IS NOT NULL AND ownername IS NOT NULL AND servername IS NOT NULL') + if aOwnerInfo then + for _, rec in ipairs(aOwnerInfo) do + X.SQLitePrepareExecute( + DB_OwnerInfoW, + rec.ownerkey, + rec.ownername, + rec.servername, + rec.ownerforce, + rec.ownerrole, + rec.ownerlevel, + rec.ownerscore, + rec.ownersuitindex, + rec.time, + rec.extra + ) + end + end + X.SQLiteEndTransaction(DB) + DB_V3:Release() + end + CPath.Move(DB_V3_PATH, DB_V3_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + FireUIEvent('MY_ROLE_STAT_EQUIP_UPDATE') + X.Alert(_L['Migrate succeed!']) + end) +end + +local REC_CACHE +X.RegisterEvent({'EQUIP_CHANGE', 'EQUIP_ITEM_UPDATE'}, 'MY_RoleStatistics_EquipStat', function() + X.DelayCall('MY_RoleStatistics_EquipStat_GetScore', 100, function() + if not REC_CACHE then + return + end + local me = X.GetClientPlayer() + local ownersuitindex = me.GetEquipIDArray(0) + 1 + REC_CACHE.ownerscore[ownersuitindex] = me.GetTotalEquipScore() or 0 + end) +end) + +function D.FlushDB() + if not O.bSaveDB then + return + end + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local me = X.GetClientPlayer() + local time = GetCurrentTime() + local ownerkey = AnsiToUTF8(X.GetClientPlayerGlobalID()) + local ownername = AnsiToUTF8(me.szName) + local servername = AnsiToUTF8(X.GetServerOriginName()) + local rec = REC_CACHE + if not rec then + rec = { + ownerscore = {}, + } + local result = X.SQLitePrepareGetAll(DB_OwnerInfoG, ownerkey) + if result and result[1] and result[1].ownerscore then + local d = X.DecodeLUAData(result[1].ownerscore) + if X.IsTable(d) then + rec.ownerscore = d + end + end + REC_CACHE = rec + end + local ownerforce = 0 + local ownerrole = 0 + local ownerlevel = 0 + local ownerscore = rec.ownerscore + local ownersuitindex = 0 + local ownerextra = '' + X.SQLiteBeginTransaction(DB) + + -- 背包 + local tSuitIndexToBoxType = {} + for suitindex, boxtype in ipairs(X.CONSTANT.INVENTORY_EQUIP_LIST) do + tSuitIndexToBoxType[me.GetEquipIDArray(suitindex - 1) + 1] = boxtype + end + for suitindex, _ in ipairs(X.CONSTANT.INVENTORY_EQUIP_LIST) do + local boxtype = tSuitIndexToBoxType[suitindex] + if boxtype then + local count = X.GetInventoryBoxSize(boxtype) + for boxindex = 0, count - 1 do + local KItem = X.GetInventoryItem(me, boxtype, boxindex) + local itemid, tabtype, tabindex, tabsubindex = -1, -1, -1, -1 + local stacknum, uiid, strength, durability = 0, 0, 0, 0 + local diamond_enchant, fea_enchant, permanent_enchant, temporary_enchant, desc, extra = 0, 0, 0, 0, '', '' + if KItem then + local aDiamondEnchant = {} + for i = 1, KItem.GetSlotCount() do + aDiamondEnchant[i] = X.GetItemMountDiamondEnchantID(KItem, i - 1, me) + end + itemid = KItem.dwID + tabtype = KItem.dwTabType + tabindex = KItem.dwIndex + tabsubindex = KItem.nGenre == ITEM_GENRE.BOOK and KItem.nBookID or -1 + stacknum = KItem.bCanStack and KItem.nStackNum or 1 + uiid = KItem.nUiId + strength = X.GetItemStrengthLevel(KItem, me) + durability = KItem.nCurrentDurability + diamond_enchant = AnsiToUTF8(X.EncodeJSON(aDiamondEnchant)) -- 五行石 + fea_enchant = KItem.nSub == EQUIPMENT_SUB.MELEE_WEAPON and X.GetItemMountFEAEnchantID(KItem) or 0 -- 五彩石 + permanent_enchant = KItem.dwPermanentEnchantID -- 附魔 + temporary_enchant = KItem.dwTemporaryEnchantID -- 大附魔 + desc = AnsiToUTF8(X.GetItemTip(KItem) or '') + end + X.SQLitePrepareExecute( + DB_ItemsW, + ownerkey, suitindex, boxtype, boxindex, itemid, + tabtype, tabindex, tabsubindex, stacknum, uiid, + strength, durability, diamond_enchant, fea_enchant, permanent_enchant, temporary_enchant, + desc, time, extra + ) + end + X.SQLitePrepareExecute(DB_ItemsDL, ownerkey, boxtype, count) + end + end + + -- 挂饰、其它 + ownerforce = me.dwForceID + ownerrole = me.nRoleType + ownerlevel = me.nLevel + ownersuitindex = me.GetEquipIDArray(0) + 1 + ownerscore[ownersuitindex] = me.GetTotalEquipScore() or 0 + ownerextra = AnsiToUTF8(X.EncodeJSON({ + waist = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwWaistItemIndex) }, + back = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwBackItemIndex) }, + face = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwFaceItemIndex) }, + lshoulder = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwLShoulderItemIndex) }, + rshoulder = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwRShoulderItemIndex) }, + backcloak = { ITEM_TABLE_TYPE.CUST_TRINKET, (me.dwBackCloakItemIndex) }, + bag = { ITEM_TABLE_TYPE.CUST_TRINKET, X.IS_REMAKE and me.dwBagItemIndex or 0 }, + glasses = { ITEM_TABLE_TYPE.CUST_TRINKET, X.IS_REMAKE and me.dwGlassesItemIndex or 0 }, + lglove = { ITEM_TABLE_TYPE.CUST_TRINKET, X.IS_REMAKE and me.GetSelectPendent(KPENDENT_TYPE.LGLOVE) or 0 }, + rglove = { ITEM_TABLE_TYPE.CUST_TRINKET, X.IS_REMAKE and me.GetSelectPendent(KPENDENT_TYPE.RGLOVE) or 0 }, + penpet = { ITEM_TABLE_TYPE.CUST_TRINKET, X.IS_REMAKE and me.GetEquippedPendentPet() or 0 }, + })) + + X.SQLitePrepareExecute( + DB_OwnerInfoW, + ownerkey, + ownername, + servername, + ownerforce, + ownerrole, + ownerlevel, + X.EncodeLUAData(ownerscore), + ownersuitindex, + time, + ownerextra + ) + + X.SQLiteExecute(DB, 'END TRANSACTION') + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage('MY_RoleStatistics_EquipStat', _L('Flushing to database costs %dms...', nTickCount), X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end + +function D.UpdateSaveDB() + if not D.bReady then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if not O.bSaveDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_EquipStat', 'Remove from database...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local guid = AnsiToUTF8(X.GetClientPlayerGlobalID()) + X.SQLitePrepareExecute(DB_ItemsDA, guid) + X.SQLitePrepareExecute(DB_OwnerInfoD, guid) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_EquipStat', 'Remove from database finished...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + FireUIEvent('MY_ROLE_STAT_EQUIP_UPDATE') +end + +function D.UpdateNames(page) + local searchname = page:Lookup('Wnd_Total/Wnd_SearchName/Edit_SearchName'):GetText() + local result = X.SQLitePrepareGetAll(DB_OwnerInfoR, AnsiToUTF8('%' .. searchname .. '%'), AnsiToUTF8('%' .. searchname .. '%')) + + local container = page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name') + container:Clear() + for _, rec in ipairs(result) do + for k, v in pairs(rec) do + if X.IsString(v) then + rec[k] = UTF8ToAnsi(v) + end + end + rec.ownerextra = X.DecodeJSON(rec.extra or '') or {} + end + if result[1] and not X.Find(result, function(r) return r.ownerkey == D.szCurrentOwnerKey end) then + D.szCurrentOwnerKey = result[1].ownerkey + end + for _, rec in ipairs(result) do + local wnd = container:AppendContentFromIni(SZ_INI, 'Wnd_Name') + local ownername = rec.ownername + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + ownername = MY_ChatMosaics.MosaicsString(ownername) + end + wnd:Lookup('', 'Text_Name'):SetText(ownername .. ' (' .. rec.servername .. ')') + wnd:Lookup('', 'Image_NameBg_Selected'):SetVisible(rec.ownerkey == D.szCurrentOwnerKey) + wnd.ownerinfo = rec + end + container:FormatAllContentPos() + D.UpdateItems(page) +end + +function D.UpdateItems(page) + D.FlushDB() + + -- 刷新装备套数选择 + local container = page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_PageNum/WndContainer_PageNum') + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('CheckBox_PageNum'):Check(wnd.nSuitIndex == D.dwCurrentSuitIndex, WNDEVENT_FIRETYPE.PREVENT) + end + + -- 获取角色数据 + local ownername = '' + local ownerforce = -1 + local ownerrole = 0 + local ownerlevel = 0 + local ownerscore = {} + local ownersuitindex = 0 + local ownerextra = {} + local container = page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name') + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + if wnd.ownerinfo.ownerkey == D.szCurrentOwnerKey then + ownername = wnd.ownerinfo.ownername + ownerforce = wnd.ownerinfo.ownerforce + ownerrole = wnd.ownerinfo.ownerrole + ownerlevel = wnd.ownerinfo.ownerlevel + ownerscore = X.DecodeLUAData(wnd.ownerinfo.ownerscore) + if not X.IsTable(ownerscore) then + ownerscore = {} + end + ownersuitindex = wnd.ownerinfo.ownersuitindex + ownerextra = wnd.ownerinfo.ownerextra + end + end + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + ownername = MY_ChatMosaics.MosaicsString(ownername) + end + + -- 绘制右侧详情 + local aXml = {} + -- 导出数据 + local aExport = {} + + -- 绘制装备 + local tResult = {} + local aRes = X.SQLitePrepareGetAll(DB_ItemsR, AnsiToUTF8(D.szCurrentOwnerKey), D.dwCurrentSuitIndex) + for _, rec in ipairs(aRes) do + for k, v in pairs(rec) do + if X.IsString(v) then + rec[k] = UTF8ToAnsi(v) + end + end + rec.diamond_enchant = X.DecodeJSON(rec.diamond_enchant) or {} + tResult[rec.boxindex] = rec + end + local handle = page:Lookup('Wnd_Total/Wnd_ItemPage', '') + -- local nTitleLen = 0 + -- for _, info in ipairs(EQUIPMENT_ITEM_LIST) do + -- nTitleLen = math.max(X.StringLenW(info.label or '') + 1, nTitleLen) + -- end + for _, info in ipairs(EQUIPMENT_ITEM_LIST) do + local visible = info.label and (not info.force or info.force == ownerforce) and true or false + local rec = visible and info.pos and tResult[info.pos] + local exp = { nPos = info.pos } + local box = info.box and handle:Lookup(info.box) + local txtDurability = info.durability and handle:Lookup(info.durability) + local imgBackground = info.background and handle:Lookup(info.background) + if visible then + local szPos = info.label or '' + szPos = szPos .. g_tStrings.STR_COLON + -- szPos = szPos .. string.rep(g_tStrings.STR_ONE_CHINESE_SPACE, nTitleLen - X.StringLenW(szPos)) + table.insert(aXml, GetFormatText(szPos, 162)) + end + if box then + box:SetVisible(visible) + end + if txtDurability then + txtDurability:SetVisible(visible) + end + if imgBackground then + imgBackground:SetVisible(visible) + end + if rec and rec.tabtype >= 0 then + local KItemInfo = GetItemInfo(rec.tabtype, rec.tabindex) + if KItemInfo then + local bMaxStrength = KItemInfo.nMaxStrengthLevel > 0 and rec.strength == KItemInfo.nMaxStrengthLevel + if box then + X.UI.UpdateItemInfoBoxObject(box, nil, rec.tabtype, rec.tabindex, rec.stacknum, rec.tabsubindex) + UpdateItemBoxExtend(box, KItemInfo.nGenre, KItemInfo.nQuality, bMaxStrength) + box.OnItemMouseEnter = nil + box.OnItemRefreshTip = nil + box.tip = rec.desc + end + if txtDurability then + local nDurability = math.floor(rec.durability / KItemInfo.nMaxDurability * 100) + local nFont = 167 + if nDurability < 30 then + nFont = 159 + elseif nDurability <= 70 then + nFont = 16 + end + txtDurability:SetFontScheme(nFont) + txtDurability:SetText(nDurability .. '%') + end + table.insert(aXml, GetFormatText('[' .. KItemInfo.szName .. ']', 162, GetItemFontColorByQuality(KItemInfo.nQuality))) + -- 强化等级 + for _ = 1, rec.strength do + table.insert(aXml, 'w=16 h=16 path="ui/Image/UICommon/FEPanel.UITex" frame=39 ') + end + -- 五行石 + for _, nEnchantID in ipairs(rec.diamond_enchant) do + local nType, nTabIndex = GetDiamondInfoFromEnchantID(nEnchantID) + local diamon = nType and nTabIndex and GetItemInfo(nType, nTabIndex) + if diamon then + table.insert(aXml, 'w=20 h=20 path="fromiconid" frame=' .. Table_GetItemIconID(diamon.nUiId) .. '') + else + table.insert(aXml, 'w=20 h=20 path="ui/Image/UICommon/FEPanel.UITex" frame=5 ') + end + end + -- 附魔 + if rec.permanent_enchant ~= 0 then + local szImagePath = 'ui/Image/UICommon/FEPanel.UITex' + local nFrame = 41 + local szText = X.Table.GetCommonEnchantDesc(rec.permanent_enchant) + if szText then + szText = string.gsub(szText, 'font=%d+', 'font=113') + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(g_tStrings.STR_ONE_CHINESE_SPACE, 113)) + table.insert(aXml, GetFormatImage(szImagePath, nFrame, 20, 20)) + table.insert(aXml, GetFormatText(' ', 113)) + table.insert(aXml, szText) + else + local enchantAttrib = GetItemEnchantAttrib(rec.permanent_enchant); + if enchantAttrib then + for k, v in pairs(enchantAttrib) do + szText = D.FormatEnchantAttribText(v) + if szText ~= '' then + szText = string.gsub(szText, 'font=%d+', 'font=113') + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(g_tStrings.STR_ONE_CHINESE_SPACE, 113)) + table.insert(aXml, GetFormatImage(szImagePath, nFrame, 20, 20)) + table.insert(aXml, GetFormatText(' ', 113)) + table.insert(aXml, szText) + end + end + end + end + end + -- 大附魔 + if rec.temporary_enchant ~= 0 then + local szImagePath = 'ui/Image/UICommon/FEPanel.UITex' + local nFrame = 41 + local szText = X.Table.GetCommonEnchantDesc(rec.temporary_enchant) + if szText then + szText = string.gsub(szText, 'font=%d+', 'font=113') + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(g_tStrings.STR_ONE_CHINESE_SPACE, 113)) + table.insert(aXml, GetFormatImage(szImagePath, nFrame, 20, 20)) + table.insert(aXml, GetFormatText(' ', 113)) + table.insert(aXml, szText) + else + local enchantAttrib = GetItemEnchantAttrib(rec.temporary_enchant); + if enchantAttrib then + for k, v in pairs(enchantAttrib) do + szText = D.FormatEnchantAttribText(v) + if szText ~= '' then + szText = string.gsub(szText, 'font=%d+', 'font=113') + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(g_tStrings.STR_ONE_CHINESE_SPACE, 113)) + table.insert(aXml, GetFormatImage(szImagePath, nFrame, 20, 20)) + table.insert(aXml, GetFormatText(' ', 113)) + table.insert(aXml, szText) + end + end + end + end + end + -- 五彩石 + if KItemInfo.nSub == EQUIPMENT_SUB.MELEE_WEAPON then + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + -- table.insert(aXml, GetFormatText(string.rep(g_tStrings.STR_ONE_CHINESE_SPACE, nTitleLen) .. ' ', 162)) + -- table.insert(aXml, GetFormatText(g_tStrings.STR_ONE_CHINESE_SPACE, 162)) + table.insert(aXml, GetFormatText(g_tStrings.STR_COLOR_DIAMOND .. g_tStrings.STR_COLON, 162)) + if rec.fea_enchant == 0 then + table.insert(aXml, 'w=20 h=20 path="ui/Image/UICommon/FEPanel.UITex" frame=5 ') + table.insert(aXml, 'text=' .. EncodeComponentsString(' ' .. g_tStrings.STR_ITEM_H_COLOR_DIAMOND) .. ' font=161 valign=1 h=24 richtext=0 ') + else + local dwTabType, dwIndex = GetColorDiamondInfoFromEnchantID(rec.fea_enchant) + local diamon = GetItemInfo(dwTabType, dwIndex) + table.insert(aXml, 'w=20 h=20 path="fromiconid" frame=' .. Table_GetItemIconID(diamon.nUiId) .. '') + table.insert(aXml, GetFormatText(' [' .. diamon.szName .. ']', 162, GetItemFontColorByQuality(diamon.nQuality))) + end + end + exp.nMaxStrengthLevel = KItemInfo.nMaxStrengthLevel + exp.nMaxDurability = KItemInfo.nMaxDurability + exp.nQuality = KItemInfo.nQuality + --[[#DEBUG BEGIN]] + else + X.OutputDebugMessage('MY_RoleStatistics_EquipStat', 'KItemInfo not found: ' .. rec.tabtype .. ', ' .. rec.tabindex, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end + exp.dwTabType = rec.tabtype + exp.dwTabIndex = rec.tabindex + exp.dwTabSubIndex = rec.tabsubindex + exp.nStackNum = rec.stacknum + exp.nStrengthLevel = rec.strength + exp.nDurability = rec.durability + exp.aDiamondEnchant = rec.diamond_enchant + exp.dwPermanentEnchantID = rec.permanent_enchant + exp.dwTemporaryEnchantID = rec.temporary_enchant + exp.dwItemFEAEnchantID = rec.fea_enchant + else + if box then + box:ClearObject() + end + if txtDurability then + txtDurability:SetText('') + end + if visible then + table.insert(aXml, GetFormatText(_L['None'], 162)) + end + end + if visible then + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + end + table.insert(aExport, exp) + end + + -- 绘制挂饰、其它 + for _, info in ipairs(EQUIPMENT_EXTRA_ITEM_LIST) do + local aItemData = ownerextra[info.key] or {} + local dwTabType, dwTabIndex = aItemData[1], aItemData[2] + local KItemInfo = not X.IsEmpty(dwTabIndex) and GetItemInfo(ITEM_TABLE_TYPE.CUST_TRINKET, dwTabIndex) + local box = info.box and handle:Lookup(info.box) + local exp = { nPos = -1, szKey = info.key, dwTabType = dwTabType, dwTabIndex = dwTabIndex } + if KItemInfo then + if box then + box:SetObjectIcon(Table_GetItemIconID(KItemInfo.nUiId)) + box.bItemInfo = true + box.dwTabType = dwTabType + box.dwTabIndex = dwTabIndex + UpdateItemBoxExtend(box, KItemInfo.nGenre, KItemInfo.nQuality) + end + exp.nGenre = KItemInfo.nGenre + exp.nQuality = KItemInfo.nQuality + else + if box then + box:ClearObject() + end + end + end + + -- 绘制详情 + local txtName = page:Lookup('Wnd_Total/Wnd_ItemPage', 'Text_RoleName') + txtName:SetText(_L('%s (Lv%d)', ownername, ownerlevel)) + txtName:SetFontColor(X.GetForceColor(ownerforce, 'foreground')) + local txtRoleInfo = page:Lookup('Wnd_Total/Wnd_ItemPage', 'Text_RoleInfo') + txtRoleInfo:SetText(_L('%s * %s', X.CONSTANT.FORCE_TYPE_LABEL[ownerforce] or '', X.CONSTANT.ROLE_TYPE_LABEL[ownerrole] or '')) + local txtEquipScore = page:Lookup('Wnd_Total/Wnd_ItemPage', 'Text_EquipScore') + -- txtEquipScore:SetVisible(ownersuitindex == D.dwCurrentSuitIndex) + txtEquipScore:SetText(_L('Equip score: %s', ownerscore[D.dwCurrentSuitIndex] or _L['Unknown'])) + local hBoard = page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Handle_EquipInfo') + hBoard:Clear() + hBoard:AppendItemFromString(table.concat(aXml)) + hBoard:FormatAllItemPos() + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Text_EquipInfoExport').aExport = aExport +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_RoleStatistics_EquipStat') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Name/Scroll_Name')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Wnd_ItemPage/WndScroll_EquipInfo/Scroll_EquipInfo')) + + local container = wnd:Lookup('Wnd_ItemPage/WndScroll_PageNum/WndContainer_PageNum') + container:Clear() + for nIndex, _ in ipairs(X.CONSTANT.INVENTORY_EQUIP_LIST) do + local wndPage = container:AppendContentFromIni(SZ_INI, 'Wnd_PageNum') + wndPage:Lookup('CheckBox_PageNum', 'Text_PageNum'):SetText(nIndex) + wndPage.nSuitIndex = nIndex + end + container:FormatAllContentPos() + + wnd:Lookup('Wnd_ItemPage/WndScroll_EquipInfo', 'Text_EquipInfoExport'):SetText(_L['Export']) + + local frame = this:GetRoot() + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('MY_ROLE_STAT_EQUIP_UPDATE') + frame:RegisterEvent('WEAPON_BIND_COLOR_DIAMOND') + + D.OnResizePage() +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + + page:Lookup('Wnd_Total'):SetSize(nW, nH) + page:Lookup('Wnd_Total/WndScroll_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/WndScroll_Name', 'Image_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/WndScroll_Name/WndContainer_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/WndScroll_Name/Scroll_Name'):SetH(nH - 78) + page:Lookup('Wnd_Total/Wnd_ItemPage'):SetSize(nW - 235, nH - 54) + page:Lookup('Wnd_Total/Wnd_ItemPage', ''):SetSize(nW - 235, nH - 54) + page:Lookup('Wnd_Total/Wnd_ItemPage', 'Image_ItemPageBg'):SetSize(nW - 235, nH - 54) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo'):SetSize(nW - 563, nH - 78) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', ''):SetSize(nW - 579, nH - 78) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Image_EquipInfo'):SetSize(nW - 579, nH - 78) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Handle_EquipInfo'):SetSize(nW - 602, nH - 90) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Handle_EquipInfo'):FormatAllItemPos() + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', 'Text_EquipInfoExport'):SetRelX(nW - 563 - 120) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo', ''):FormatAllItemPos() + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo/Scroll_EquipInfo'):SetH(nH - 78) + page:Lookup('Wnd_Total/Wnd_ItemPage/WndScroll_EquipInfo/Scroll_EquipInfo'):SetRelX(nW - 563 - 20) +end + +function D.OnActivePage() + D.Migration() + if not O.bAdviceSaveDB and not O.bSaveDB then + X.Confirm(_L('%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), function() + MY_RoleStatistics_EquipStat.bSaveDB = true + MY_RoleStatistics_EquipStat.bAdviceSaveDB = true + end, function() + MY_RoleStatistics_EquipStat.bAdviceSaveDB = true + end) + end + D.UpdateNames(this) +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + D.UpdateNames(this) + elseif event == 'MY_ROLE_STAT_EQUIP_UPDATE' + or event == 'WEAPON_BIND_COLOR_DIAMOND' then + D.FlushDB() + D.UpdateNames(this) + end +end + +function D.OnEditSpecialKeyDown() + local name = this:GetName() + local szKey = GetKeyName(Station.GetMessageKey()) + if szKey == 'Enter' then + if name == 'Edit_SearchName' then + local page = this:GetParent():GetParent():GetParent() + D.UpdateNames(page) + end + return 1 + end +end + +function D.OnCheckBoxCheck() + local name = this:GetName() + if name == 'CheckBox_PageNum' then + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent():GetParent() + D.dwCurrentSuitIndex = this:GetParent().nSuitIndex + D.UpdateNames(page) + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Wnd_Name' then + local wnd = this + local page = this:GetParent():GetParent():GetParent():GetParent() + D.szCurrentOwnerKey = wnd.ownerinfo.ownerkey + D.UpdateNames(page) + elseif name == 'Btn_Delete' then + local wnd = this:GetParent() + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + X.Confirm(_L('Are you sure to delete item record of %s?', wnd.ownerinfo.ownername), function() + X.SQLitePrepareExecute(DB_ItemsDA, wnd.ownerinfo.ownerkey) + X.SQLitePrepareExecute(DB_OwnerInfoD, wnd.ownerinfo.ownerkey) + D.UpdateNames(page) + end) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Text_EquipInfoExport' then + X.UI.OpenTextEditor(X.CompressLUAData(this.aExport)) + end +end + +function D.OnItemMouseEnter() + if this:GetType() == 'Box' then + this:SetObjectMouseOver(true) + end + if this.tip then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(this.tip, 400, {x, y, w, h, false}, nil, false) + elseif this.bItemInfo then + X.OutputItemInfoTip(this, this.dwTabType, this.dwTabIndex) + end +end +D.OnItemRefreshTip = D.OnItemMouseEnter + +function D.OnItemMouseLeave() + if this:GetType() == 'Box' then + this:SetObjectMouseOver(false) + end + HideTip() +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'Wnd_Name' then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(_L( + this.ownerinfo.ownername:sub(1, 1) == '[' + and 'Tong: %s\nServer: %s\nSnapshot Time: %s' + or 'Character: %s\nServer: %s\nSnapshot Time: %s', + this.ownerinfo.ownername, + this.ownerinfo.servername, + X.FormatTime(this.ownerinfo.time, '%yyyy-%MM-%dd %hh:%mm:%ss')), nil, 255, 255, 0), 400, {x, y, w, h, false}, ALW.RIGHT_LEFT_AND_BOTTOM_TOP, false) + end +end + +-- 浮动框 +function D.ApplyFloatEntry(bFloatEntry) + local frame = Station.Lookup('Normal/CharacterPanel') + if not frame then + return + end + local btn = frame:Lookup('Btn_MY_RoleStatistics_EquipEntry') + if bFloatEntry then + if btn then + return + end + local frameTemp = X.UI.OpenFrame(PLUGIN_ROOT .. '/ui/MY_RoleStatistics_EquipEntry.ini', 'MY_RoleStatistics_EquipEntry') + btn = frameTemp:Lookup('Btn_MY_RoleStatistics_EquipEntry') + btn:ChangeRelation(frame, true, true) + btn:SetRelPos(40, 8) + X.UI.CloseFrame(frameTemp) + btn.OnLButtonClick = function() + MY_RoleStatistics.Open('EquipStat') + end + else + if not btn then + return + end + btn:Destroy() + end +end + +function D.UpdateFloatEntry() + if not D.bReady then + return + end + D.ApplyFloatEntry(O.bFloatEntry) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_EquipStat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + szSaveDB = 'MY_RoleStatistics_EquipStat.bSaveDB', + szFloatEntry = 'MY_RoleStatistics_EquipStat.bFloatEntry', + }, + root = D, + }, + }, +} +MY_RoleStatistics.RegisterModule('EquipStat', _L['MY_RoleStatistics_EquipStat'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_EquipStat', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'bSaveDB', + 'bAdviceSaveDB', + 'bFloatEntry', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bSaveDB', + 'bAdviceSaveDB', + 'bFloatEntry', + }, + triggers = { + bSaveDB = D.UpdateSaveDB, + bFloatEntry = D.UpdateFloatEntry, + }, + root = O, + }, + }, +} +MY_RoleStatistics_EquipStat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_RoleStatistics_EquipStat', function() + D.bReady = true + D.UpdateFloatEntry() +end) + +X.RegisterFlush('MY_RoleStatistics_EquipStat', function() + D.FlushDB() +end) + +X.RegisterExit('MY_RoleStatistics_EquipStat', function() + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + D.UpdateSaveDB() + D.FlushDB() + end +end) + +X.RegisterReload('MY_RoleStatistics_EquipStat', function() + D.ApplyFloatEntry(false) +end) + +X.RegisterFrameCreate('CharacterPanel', 'MY_RoleStatistics_EquipStat', function() + D.UpdateFloatEntry() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/src/MY_RoleStatistics_RoleStat.lua b/MY_RoleStatistics/src/MY_RoleStatistics_RoleStat.lua new file mode 100644 index 000000000..e4286a5bb --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics_RoleStat.lua @@ -0,0 +1,1451 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 角色统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics_RoleStat' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics_RoleStat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/role/') +------------------------------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +------------------------------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_RoleStatistics_RoleStat', _L['General'], { + aColumn = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Columns'], + }), + xSchema = X.Schema.Collection(X.Schema.String), + xDefaultValue = { + 'name', + 'force', + 'level', + 'achievement_score', + 'pet_score', + 'justice', + 'justice_remain', + 'exam_print', + 'coin', + 'money', + 'time_days', + }, + }, + szSort = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Sort'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'time_days', + }, + szSortOrder = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Sort Order'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'desc', + }, + aAlertColumn = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Columns alert when esc'], + }), + xSchema = X.Schema.Collection(X.Schema.String), + xDefaultValue = { + 'money', + 'achievement_score', + 'pet_score', + 'contribution', + 'justice', + 'starve', + 'prestige', + 'camp_point', + 'arena_award', + 'exam_print', + }, + }, + tAlertTodayVal = { + ePathType = X.PATH_TYPE.ROLE, + bUserData = true, + xSchema = X.Schema.Any, + xDefaultValue = nil, + }, + tSummaryIgnoreGUID = { + ePathType = X.PATH_TYPE.ROLE, + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Summary Ignore ID'], + }), + xSchema = X.Schema.Any, + xDefaultValue = {}, + }, + bFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Float panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_RoleStat'], + _L['Save DB'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + dwLastAlertTime = 0, +} + +local STAT_DATA_FILE = {'userdata/role_statistics/role_stat.jx3dat', X.PATH_TYPE.GLOBAL} +local PLAYER_REC_FILE = {'userdata/role_statistics/role_stat.jx3dat', X.PATH_TYPE.ROLE} +local PLAYER_REC_INITIAL, PLAYER_REC = nil, nil + +------------------------------------------------------------------------------------------------------- + +local function GetFormatSysmsgText(szText) + return GetFormatText(szText, GetMsgFont('MSG_SYS'), GetMsgFontColor('MSG_SYS')) +end + +local DATA_ENV = setmetatable( + { + _L = _L , + math = math , + pairs = pairs , + ipairs = ipairs , + tonumber = tonumber , + wstring = X.wstring , + count_c = X.count_c , + pairs_c = X.pairs_c , + ipairs_c = X.ipairs_c , + ipairs_r = X.ipairs_r , + spairs = X.spairs , + spairs_r = X.spairs_r , + sipairs = X.sipairs , + sipairs_r = X.sipairs_r , + IsArray = X.IsArray , + IsDictionary = X.IsDictionary , + IsEquals = X.IsEquals , + IsNil = X.IsNil , + IsBoolean = X.IsBoolean , + IsNumber = X.IsNumber , + IsUserdata = X.IsUserdata , + IsHugeNumber = X.IsHugeNumber , + IsElement = X.IsElement , + IsEmpty = X.IsEmpty , + IsString = X.IsString , + IsTable = X.IsTable , + IsFunction = X.IsFunction , + IsInMonsterMap = X.IsInMonsterMap , + GetBuff = X.GetBuff , + GetAccount = X.GetAccount , + GetRegionOriginName = X.GetRegionOriginName , + GetServerOriginName = X.GetServerOriginName , + GetItemAmountInAllPackages = function(...) + return X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, ...) + + X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.BANK, ...) + end, + RegisterEvent = X.RegisterEvent , + RegisterFrameCreate = X.RegisterFrameCreate , + ITEM_TABLE_TYPE = ITEM_TABLE_TYPE , + GetFormatSysmsgText = GetFormatSysmsgText , + GetFormatText = GetFormatText , + GetMoneyText = GetMoneyText , + GetMsgFont = GetMsgFont , + GetMsgFontColor = GetMsgFontColor , + MoneyOptAdd = MoneyOptAdd , + MoneyOptCmp = MoneyOptCmp , + MoneyOptSub = MoneyOptSub , + Output = Output , + GetEightWastersAwardNum = X.IsTable(KGlobalScripts) and KGlobalScripts.EightWastersInterfaceGetAwardNum, + }, + { + __index = function(t, k) + if k == 'me' then + return X.GetClientPlayer() + end + if k:find('^arg%d+$') then + return _G[k] + end + end, + }) + +------------------------------------------------------------------------------------------------------- + +local COLUMN_LIST = { + -- guid + { + szKey = 'guid', + GetValue = function(prevVal, prevRec) + return X.GetClientPlayerGlobalID() + end, + }, + -- account + { + szKey = 'account', + GetValue = function(prevVal, prevRec) + return X.GetAccount() or '' + end, + }, + -- 大区 + { + szKey = 'region', + szTitle = _L['Region'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 100, + nMaxWidth = 100, + GetValue = function(prevVal, prevRec) + return X.GetRegionOriginName() + end, + }, + -- 服务器 + { + szKey = 'server', + szTitle = _L['Server'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 100, + nMaxWidth = 100, + GetValue = function(prevVal, prevRec) + return X.GetServerOriginName() + end, + }, + -- 名字 + { + szKey = 'name', + szTitle = _L['Name'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 110, + nMaxWidth = 200, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().szName + end, + GetSummaryValue = function() + return 'SUMMARY' + end, + GetFormatText = function(name, rec) + if name == 'SUMMARY' then + return GetFormatText(_L['Summary'], 162) + end + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + name = MY_ChatMosaics.MosaicsString(name) + end + return GetFormatText(name, 162, X.GetForceColor(rec.force, 'foreground')) + end, + }, + -- 门派 + { + szKey = 'force', + szTitle = _L['Force'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 50, + nMaxWidth = 70, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().dwForceID + end, + GetSummaryValue = function() + return 'SUMMARY' + end, + GetFormatText = function(force) + if force == 'SUMMARY' then + return GetFormatText('--', 162) + end + return GetFormatText(g_tStrings.tForceTitle[force], 162, 255, 255, 255) + end, + }, + -- 等级 + { + szKey = 'level', + szTitle = _L['Level'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 50, + nMaxWidth = 50, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().nLevel + end, + GetSummaryValue = function() + return 'SUMMARY' + end, + GetFormatText = function(level) + if level == 'SUMMARY' then + return GetFormatText('--', 162) + end + return GetFormatText(level, 162, 255, 255, 255) + end, + }, +} +-- 分版本列配置 +do + local f = X.LoadLUAData(PLUGIN_ROOT .. '/data/role/{$edition}.jx3dat') + if X.IsFunction(f) then + local t = f(DATA_ENV) + if X.IsTable(t) then + for _, v in ipairs(t) do + table.insert(COLUMN_LIST, v) + end + end + end +end +-- 时间 +table.insert(COLUMN_LIST, { + szKey = 'time', + szTitle = _L['Cache time'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 165, + nMaxWidth = 200, + GetValue = function(prevVal, prevRec) + return GetCurrentTime() + end, + GetSummaryValue = function() + return 'SUMMARY' + end, + GetFormatText = function(time) + if time == 'SUMMARY' then + return GetFormatText('--', 162) + end + return GetFormatText(X.FormatTime(time, '%yyyy/%MM/%dd %hh:%mm:%ss'), 162, 255, 255, 255) + end, +}) +-- 时间计时 +table.insert(COLUMN_LIST, { + szKey = 'time_days', + szTitle = _L['Cache time days'], + bTable = true, + bRowTip = true, + bFloatTip = false, + nMinWidth = 120, + nMaxWidth = 120, + GetSummaryValue = function() + return 'SUMMARY' + end, + Compare = function(v1, v2, r1, r2) + v1, v2 = r1.time, r2.time + if v1 == v2 then + return 0 + end + return v1 > v2 and 1 or -1 + end, + GetFormatText = function(v, rec) + if v == 'SUMMARY' then + return GetFormatText('--', 162) + end + local nTime = GetCurrentTime() - rec.time + local nSeconds = math.floor(nTime) + local nMinutes = math.floor(nSeconds / 60) + local nHours = math.floor(nMinutes / 60) + local nDays = math.floor(nHours / 24) + local nYears = math.floor(nDays / 365) + local nDay = nDays % 365 + local nHour = nHours % 24 + local nMinute = nMinutes % 60 + local nSecond = nSeconds % 60 + if nYears > 0 then + return GetFormatText(_L('%d years %d days before', nYears, nDay), 162, 255, 255, 255) + end + if nDays > 0 then + return GetFormatText(_L('%d days %d hours before', nDays, nHour), 162, 255, 255, 255) + end + if nHours > 0 then + return GetFormatText(_L('%d hours %d mins before', nHours, nMinute), 162, 255, 255, 255) + end + if nMinutes > 0 then + return GetFormatText(_L('%d mins %d secs before', nMinutes, nSecond), 162, 255, 255, 255) + end + if nSecond > 10 then + return GetFormatText(_L('%d secs before', nSecond), 162, 255, 255, 255) + end + return GetFormatText(_L['Just now'], 162, 255, 255, 255) + end, +}) + +local COLUMN_DICT = {} +for _, col in ipairs(COLUMN_LIST) do + if not col.GetFormatText then + col.GetFormatText = function(v, rec) + if not v then + return GetFormatText('--', 162, 255, 255, 255) + end + return GetFormatText(v, 162, 255, 255, 255) + end + end + if not col.Compare then + col.Compare = function(v1, v2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + return v1 > v2 and 1 or -1 + end + end + if col.bAlertChange and not col.GetCompareText then + col.GetCompareText = function(v1, v2, r1, r2) + if v1 == v2 or not X.IsNumber(v1) or not X.IsNumber(v2) then + return + end + local f = v1 <= v2 + and col.szCompareIncreaseText + or col.szCompareDecreaseText + if not f then + return + end + return GetFormatSysmsgText(f:format(math.abs(v2 - v1))) + end + end + if not col.GetSummaryValue then + col.GetSummaryValue = function(values, records) + local summary + for _, v in ipairs(values) do + if X.IsNumber(v) then + summary = (summary or 0) + v + end + end + if not summary then + return '' + end + return summary + end + end + COLUMN_DICT[col.szKey] = col +end + +for _, col in ipairs(COLUMN_LIST) do + X.SafeCall(col.Collector) +end + +-- 移除不在同一个刷新周期内的数据字段 +function D.FilterColumnCircle(rec) + if X.IsNumber(rec.time) then + for _, col in ipairs(COLUMN_LIST) do + if col.szRefreshCircle then + local dwTime, dwCircle = X.GetRefreshTime(col.szRefreshCircle) + if dwTime - dwCircle >= rec.time then + rec[col.szKey] = nil + end + end + end + end +end + +function D.GetPlayerRecords() + local result = X.LoadLUAData(STAT_DATA_FILE) or {} + for _, rec in pairs(result) do + D.FilterColumnCircle(rec) + end + return result +end + +function D.GetClientPlayerRec() + local me = X.GetClientPlayer() + if not me then + return + end + -- 缓存数据 + if not PLAYER_REC_INITIAL then + PLAYER_REC_INITIAL = X.LoadLUAData(PLAYER_REC_FILE) or {} + D.FilterColumnCircle(PLAYER_REC_INITIAL) + PLAYER_REC = X.Clone(PLAYER_REC_INITIAL) + D.FilterColumnCircle(PLAYER_REC) + end + -- 获取各列数据 + for _, col in ipairs(COLUMN_LIST) do + if col.GetValue then + PLAYER_REC[col.szKey] = col.GetValue(PLAYER_REC_INITIAL[col.szKey], PLAYER_REC_INITIAL) + end + end + return X.Clone(PLAYER_REC) +end + +function D.Migration() + local DB_V2_PATH = X.FormatPath({'userdata/role_statistics/role_stat.v2.db', X.PATH_TYPE.GLOBAL}) + local DB_V3_PATH = X.FormatPath({'userdata/role_statistics/role_stat.v3.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V2_PATH) and not IsLocalFileExist(DB_V3_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + local aRoleInfo = X.SQLiteExecuteANSI(DB_V2, 'SELECT * FROM RoleInfo WHERE guid IS NOT NULL AND name IS NOT NULL') + if aRoleInfo then + for _, rec in ipairs(aRoleInfo) do + if not data[rec.guid] or data[rec.guid].time <= rec.time then + data[rec.guid] = { + guid = rec.guid, + account = rec.account, + region = rec.region, + server = rec.server, + name = rec.name, + force = rec.force, + level = rec.level, + equip_score = rec.equip_score, + pet_score = rec.pet_score, + money = { + nGold = rec.gold, + nSilver = rec.silver, + nCopper = rec.copper, + }, + account_stamina = rec.stamina and rec.stamina >= 0 and rec.stamina_max and rec.stamina_max >= 0 + and { + current = rec.stamina, + max = rec.stamina_max, + } + or nil, + role_stamina = rec.vigor and rec.vigor >= 0 and rec.vigor_max and rec.vigor_max >= 0 + and { + current = rec.vigor, + max = rec.vigor_max, + } + or nil, + role_stamina_remain = rec.stamina_remain and rec.stamina_remain >= 0 + and rec.stamina_remain + or nil, + contribution = rec.contribution, + contribution_remain = rec.contribution_remain, + justice = rec.justice, + justice_remain = rec.justice_remain, + prestige = rec.prestige, + prestige_remain = rec.prestige_remain, + camp_point = rec.camp_point, + camp_level = { level = rec.camp_level, percent = rec.camp_point_percentage }, + arena_award = rec.arena_award, + arena_award_remain = rec.arena_award_remain, + exam_print = rec.exam_print, + exam_print_remain = rec.exam_print_remain, + achievement_score = rec.achievement_score, + coin = { owner = rec.account .. '#' .. rec.region, value = rec.coin }, + mentor_score = rec.mentor_score, + starve = rec.starve, + starve_remain = rec.starve_remain >= 0 and rec.starve_remain or nil, + architecture = rec.architecture, + architecture_remain = rec.architecture_remain, + time = rec.time, + } + end + end + end + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V3旧版数据 + if IsLocalFileExist(DB_V3_PATH) then + local DB_V3 = SQLite3_Open(DB_V3_PATH) + if DB_V3 then + local aRoleInfo = X.SQLiteExecuteANSI(DB_V3, 'SELECT * FROM RoleInfo WHERE guid IS NOT NULL AND name IS NOT NULL') + if aRoleInfo then + for _, rec in ipairs(aRoleInfo) do + if not data[rec.guid] or data[rec.guid].time <= rec.time then + data[rec.guid] = { + guid = rec.guid, + account = rec.account, + region = rec.region, + server = rec.server, + name = rec.name, + force = rec.force, + level = rec.level, + equip_score = rec.equip_score, + pet_score = rec.pet_score, + money = { + nGold = rec.gold, + nSilver = rec.silver, + nCopper = rec.copper, + }, + account_stamina = rec.stamina and rec.stamina >= 0 and rec.stamina_max and rec.stamina_max >= 0 + and { + current = rec.stamina, + max = rec.stamina_max, + } + or nil, + role_stamina = rec.vigor and rec.vigor >= 0 and rec.vigor_max and rec.vigor_max >= 0 + and { + current = rec.vigor, + max = rec.vigor_max, + } + or nil, + role_stamina_remain = rec.stamina_remain and rec.stamina_remain >= 0 + and rec.stamina_remain + or nil, + contribution = rec.contribution, + contribution_remain = rec.contribution_remain, + justice = rec.justice, + justice_remain = rec.justice_remain, + prestige = rec.prestige, + prestige_remain = rec.prestige_remain, + camp_point = rec.camp_point, + camp_level = { level = rec.camp_level, percent = rec.camp_point_percentage }, + arena_award = rec.arena_award, + arena_award_remain = rec.arena_award_remain, + exam_print = rec.exam_print, + exam_print_remain = rec.exam_print_remain, + achievement_score = rec.achievement_score, + coin = { owner = rec.account .. '#' .. rec.region, value = rec.coin }, + mentor_score = rec.mentor_score, + starve = rec.starve, + starve_remain = rec.starve_remain >= 0 and rec.starve_remain or nil, + architecture = rec.architecture, + architecture_remain = rec.architecture_remain, + time = rec.time, + } + end + end + end + DB_V3:Release() + end + CPath.Move(DB_V3_PATH, DB_V3_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + X.SaveLUAData(STAT_DATA_FILE, data) + FireUIEvent('MY_ROLE_STAT_ROLE_UPDATE') + X.Alert(_L['Migrate succeed!']) + end) +end + +function D.FlushDB() + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local rec = D.GetClientPlayerRec() + if O.bSaveDB then + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[X.GetClientPlayerGlobalID()] = D.GetClientPlayerRec() + X.SaveLUAData(STAT_DATA_FILE, data) + end + X.SaveLUAData(PLAYER_REC_FILE, rec) + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage('MY_RoleStatistics_RoleStat', _L('Flushing to database costs %dms...', nTickCount), X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end + +function D.UpdateSaveDB() + if not D.bReady then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if not O.bSaveDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_RoleStat', 'Remove from database...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[X.GetClientPlayerGlobalID()] = nil + X.SaveLUAData(STAT_DATA_FILE, data) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_RoleStat', 'Remove from database finished...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + FireUIEvent('MY_ROLE_STAT_ROLE_UPDATE') +end + +function D.GetTableColumns() + local aColumn = {} + for nIndex, szKey in ipairs(O.aColumn) do + local col = COLUMN_DICT[szKey] + if col then + table.insert(aColumn, col) + end + end + local nLFixIndex, nLFixWidth = -1, 0 + for nIndex, col in ipairs(aColumn) do + nLFixWidth = nLFixWidth + (col.nMinWidth or 100) + if nLFixWidth > 450 then + break + end + if col.szKey == 'name' then + nLFixIndex = nIndex + break + end + end + local nRFixIndex, nRFixWidth = math.huge, 0 + for nIndex, col in X.ipairs_r(aColumn) do + if nIndex <= nLFixIndex then + break + end + nRFixWidth = nRFixWidth + (col.nMinWidth or 100) + if nRFixWidth > 300 then + break + end + if col.szKey == 'time' or col.szKey == 'time_days' then + nRFixIndex = nIndex + end + end + local aTableColumn = {} + for nIndex, col in ipairs(aColumn) do + local szFixed = nIndex <= nLFixIndex + and 'left' + or (nIndex >= nRFixIndex and 'right' or nil) + local c = { + key = col.szKey, + title = col.szTitleAbbr or col.szTitle, + titleTip = col.szTitleTip + or (col.GetTitleFormatTip and function() + return col.GetTitleFormatTip(), true + end) + or col.szTitle, + alignHorizontal = col.szAlignHorizontal or 'center', + render = col.GetFormatText + and function(value, record, index) + return col.GetFormatText(value, record) + end + or nil, + sorter = col.Compare + and function(v1, v2, r1, r2) + return col.Compare(v1, v2, r1, r2) + end + or nil, + tip = col.GetFormatTip + and function(value, record, index) + return col.GetFormatTip(value, record), true + end + or nil, + draggable = true, + } + if szFixed then + c.fixed = szFixed + c.width = col.nMinWidth or 100 + else + c.minWidth = col.nMinWidth + c.maxWidth = col.nMaxWidth + end + table.insert(aTableColumn, c) + end + return aTableColumn +end + +function D.GetResult(szSearch) + -- 搜索 + local data = D.GetPlayerRecords() + local result = {} + for _, rec in pairs(data) do + if not X.IsString(szSearch) + or szSearch == '' + or X.StringFindW(tostring(rec.account or ''), szSearch) + or X.StringFindW(tostring(rec.name or ''), szSearch) + or X.StringFindW(tostring(rec.region or ''), szSearch) + or X.StringFindW(tostring(rec.server or ''), szSearch) then + table.insert(result, rec) + end + end + + -- 汇总 + local aSumRec, tSumVal = {}, {} + for _, col in ipairs(COLUMN_LIST) do + if col.bTable then + tSumVal[col.szKey] = {} + end + end + for _, rec in ipairs(result) do + if X.IsEmpty(O.tSummaryIgnoreGUID) or not O.tSummaryIgnoreGUID[rec.guid] then + for _, col in ipairs(COLUMN_LIST) do + if col.bTable then + table.insert(tSumVal[col.szKey], rec[col.szKey]) + end + end + table.insert(aSumRec, rec) + end + end + local summary = {} + for _, col in ipairs(COLUMN_LIST) do + if col.bTable then + summary[col.szKey] = col.GetSummaryValue(tSumVal[col.szKey], aSumRec) + end + end + return result, summary +end + +function D.GetRoleStat() + local result, summary = D.GetResult() + local res = { + aDetail = X.Clone(result), + tSummary = X.Clone(summary), + } + for _, v in ipairs(res.aDetail) do + v.account = nil + v.coin = v.coin.value + end + return res +end + +function D.UpdateUI(page) + local ui = X.UI(page) + + local szSearch = ui:Fetch('WndEditBox_Search'):Text() + local result, summary = D.GetResult(szSearch) + + ui:Fetch('WndTable_Stat') + :Columns(D.GetTableColumns()) + :DataSource(result) + :Summary(summary) +end + +function D.GetRowTip(rec) + local aXml = {} + for _, col in ipairs(COLUMN_LIST) do + if col.bRowTip then + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec[col.szKey], rec)) + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + return table.concat(aXml) +end + +function D.OutputFloatEntryTip(this) + local rec = D.GetClientPlayerRec() + if not rec then + return + end + local aXml = {} + for _, col in ipairs(COLUMN_LIST) do + if col.bFloatTip then + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec[col.szKey], rec)) + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(table.concat(aXml), 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) +end + +function D.CloseFloatEntryTip() + HideTip() +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = 20, y = 20, w = 388, h = 25, + appearance = 'SEARCH_RIGHT', + placeholder = _L['Press ENTER to search...'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.UpdateUI(page) + return 1 + end + end, + }) + + -- 显示列 + ui:Append('WndComboBox', { + name = 'WndComboBox_DisplayColumns', + x = 800, y = 20, w = 180, + text = _L['Columns'], + menu = function() + local t = {} + local function UpdateMenu() + local tChecked = {} + for i = 1, #t do + t[i] = nil + end + -- 已添加的 + for nIndex, szKey in ipairs(O.aColumn) do + local col = COLUMN_DICT[szKey] + if col then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local nOffset = IsShiftKeyDown() and 1 or -1 + if nIndex + nOffset < 1 or nIndex + nOffset > #O.aColumn then + return + end + local aColumn = O.aColumn + aColumn[nIndex], aColumn[nIndex + nOffset] = aColumn[nIndex + nOffset], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + fnMouseEnter = function() + if #O.aColumn == 1 then + return + end + local szText = _L['Click to move up, Hold SHIFT to move down.'] + if nIndex == 1 then + szText = _L['Hold SHIFT click to move down.'] + elseif nIndex == #O.aColumn then + szText = _L['Click to move up.'] + end + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(szText, nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.LEFT_RIGHT) + end, + fnMouseLeave = function() + HideTip() + end, + { + szOption = _L['Move up'], + fnAction = function() + if nIndex > 1 then + local aColumn = O.aColumn + aColumn[nIndex], aColumn[nIndex - 1] = aColumn[nIndex - 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + { + szOption = _L['Move down'], + fnAction = function() + if nIndex < #O.aColumn then + local aColumn = O.aColumn + aColumn[nIndex], aColumn[nIndex + 1] = aColumn[nIndex + 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Delete'], + fnAction = function() + local aColumn = O.aColumn + table.remove(aColumn, nIndex) + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + }) + end + tChecked[szKey] = true + end + -- 未添加的 + for _, col in ipairs(COLUMN_LIST) do + if col.bTable and not tChecked[col.szKey] then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local aColumn = O.aColumn + table.insert(aColumn, col.szKey) + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + }) + end + end + end + UpdateMenu() + return t + end, + }) + + -- ESC提示列 + ui:Append('WndComboBox', { + name = 'WndComboBox_EscAlertColumns', + x = 600, y = 20, w = 180, + text = _L['Columns alert when esc'], + menu = function() + local t = {} + local function UpdateMenu() + local c = {} + for i = 1, #t do + t[i] = nil + end + for nIndex, szKey in ipairs(O.aAlertColumn) do + local col = COLUMN_DICT[szKey] + if col then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local nOffset = IsShiftKeyDown() and 1 or -1 + if nIndex + nOffset < 1 or nIndex + nOffset > #O.aAlertColumn then + return + end + local aAlertColumn = O.aAlertColumn + aAlertColumn[nIndex], aAlertColumn[nIndex + nOffset] = aAlertColumn[nIndex + nOffset], aAlertColumn[nIndex] + O.aAlertColumn = aAlertColumn + UpdateMenu() + end, + fnMouseEnter = function() + if #O.aAlertColumn == 1 then + return + end + local szText = _L['Click to move up, Hold SHIFT to move down.'] + if nIndex == 1 then + szText = _L['Hold SHIFT click to move down.'] + elseif nIndex == #O.aAlertColumn then + szText = _L['Click to move up.'] + end + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(szText, nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.LEFT_RIGHT) + end, + fnMouseLeave = function() + HideTip() + end, + { + szOption = _L['Move up'], + fnAction = function() + if nIndex > 1 then + local aAlertColumn = O.aAlertColumn + aAlertColumn[nIndex], aAlertColumn[nIndex - 1] = aAlertColumn[nIndex - 1], aAlertColumn[nIndex] + O.aAlertColumn = aAlertColumn + UpdateMenu() + end + end, + }, + { + szOption = _L['Move down'], + fnAction = function() + if nIndex < #O.aAlertColumn then + local aAlertColumn = O.aAlertColumn + aAlertColumn[nIndex], aAlertColumn[nIndex + 1] = aAlertColumn[nIndex + 1], aAlertColumn[nIndex] + O.aAlertColumn = aAlertColumn + UpdateMenu() + end + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Delete'], + fnAction = function() + local aAlertColumn = O.aAlertColumn + table.remove(aAlertColumn, nIndex) + O.aAlertColumn = aAlertColumn + UpdateMenu() + end, + rgb = { 255, 128, 128 }, + }, + }) + c[szKey] = true + end + end + for _, col in ipairs(COLUMN_LIST) do + if not c[col.szKey] and col.bAlertChange then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local aAlertColumn = O.aAlertColumn + table.insert(aAlertColumn, col.szKey) + O.aAlertColumn = aAlertColumn + UpdateMenu() + end, + }) + end + end + end + UpdateMenu() + return t + end, + }) + + ui:Append('WndTable', { + name = 'WndTable_Stat', + x = 20, y = 60, w = 960, h = 530, + sort = O.szSort, + sortOrder = O.szSortOrder, + onSortChange = function(szSort, szSortOrder) + O.szSort, O.szSortOrder = szSort, szSortOrder + end, + rowTip = { + render = function(rec) + return D.GetRowTip(rec), true + end, + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + rowMenuRClick = function(rec, index) + local menu = { + { + szOption = _L['Delete'], + fnAction = function() + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[rec.guid] = nil + X.SaveLUAData(STAT_DATA_FILE, data) + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + } + PopupMenu(menu) + end, + onColumnsChange = function(aColumns) + local aKeys = {} + for _, col in ipairs(aColumns) do + table.insert(aKeys, col.key) + end + O.aColumn = aKeys + D.UpdateUI(page) + end, + }) + + ui:Append('WndButton', { + name = 'WndButton_IgnoreManage', + x = 25, y = 562, w = 25, h = 25, + buttonStyle = 'OPTION', + onClick = function() + local menu = {} + local data = {} + for _, v in pairs(D.GetPlayerRecords()) do + table.insert(data, v) + end + table.sort(data, function(d1, d2) + if d1 == d2 then + return false + end + if not d1 then + return true + end + if not d2 then + return false + end + return d1.force < d2.force + end) + for _, rec in ipairs(data) do + table.insert(menu, { + szOption = rec.name, + rgb = {X.GetForceColor(rec.force, 'foreground')}, + bCheck = true, + bChecked = not O.tSummaryIgnoreGUID[rec.guid], + fnAction = function(_, bChecked) + local tSummaryIgnoreGUID = O.tSummaryIgnoreGUID + if bChecked then + tSummaryIgnoreGUID[rec.guid] = nil + else + tSummaryIgnoreGUID[rec.guid] = true + end + O.tSummaryIgnoreGUID = tSummaryIgnoreGUID + D.UpdateUI(page) + end, + }) + end + X.UI.PopupMenu(menu) + end, + }) + D.OnResizePage() + + local frame = page:GetRoot() + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('MY_ROLE_STAT_ROLE_UPDATE') +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + + ui:Fetch('WndComboBox_DisplayColumns'):Left(nW - 200) + ui:Fetch('WndComboBox_EscAlertColumns'):Left(nW - 400) + ui:Fetch('WndTable_Stat'):Size(nW - 40, nH - 100) + ui:Fetch('WndButton_IgnoreManage'):Top(nH - 70) +end + +function D.CheckAdvice() + for _, p in ipairs({ + { + szMsg = _L('%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + szAdviceKey = 'bAdviceSaveDB', + szSetKey = 'bSaveDB', + }, + -- { + -- szMsg = _L('%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + -- szAdviceKey = 'bAdviceFloatEntry', + -- szSetKey = 'bFloatEntry', + -- }, + }) do + if not O[p.szAdviceKey] and not O[p.szSetKey] then + X.Confirm(p.szMsg, function() + MY_RoleStatistics_RoleStat[p.szSetKey] = true + MY_RoleStatistics_RoleStat[p.szAdviceKey] = true + D.CheckAdvice() + end, function() + MY_RoleStatistics_RoleStat[p.szAdviceKey] = true + D.CheckAdvice() + end) + return + end + end +end + +function D.OnActivePage() + D.Migration() + D.CheckAdvice() + D.FlushDB() + D.UpdateUI(this) +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + D.UpdateUI(this) + elseif event == 'MY_ROLE_STAT_ROLE_UPDATE' then + D.FlushDB() + D.UpdateUI(this) + end +end + +function D.OnLButtonClick() + local name = this:GetName() +end + +function D.InitAlert() + if not X.IsTable(O.tAlertTodayVal) or not X.IsNumber(O.tAlertTodayVal.nTime) + or not X.IsInSameRefreshTime('daily', O.tAlertTodayVal.nTime) then + local rec = D.GetClientPlayerRec() + rec.nTime = GetCurrentTime() + O.tAlertTodayVal = rec + end + D.tAlertSessionVal = D.GetClientPlayerRec() +end + +function D.OutputAlert() + local rec = D.GetClientPlayerRec() + + local aText, aDailyText = {}, {} + for _, szKey in ipairs(O.aAlertColumn) do + local col = COLUMN_DICT[szKey] + if col and col.bAlertChange then + local szCompare = col.GetCompareText( + D.tAlertSessionVal[szKey], + rec[szKey], + D.tAlertSessionVal, + rec + ) + table.insert(aText, szCompare) + local szDailyCompare = col.GetCompareText( + O.tAlertTodayVal[szKey], + rec[szKey], + O.tAlertTodayVal, + rec + ) + table.insert(aDailyText, szDailyCompare) + end + end + local szText, szDailyText = table.concat(aText, GetFormatSysmsgText(_L[','])), table.concat(aDailyText, GetFormatSysmsgText(_L[','])) + if GetTime() - D.dwLastAlertTime > 10000 or D.szLastAlert ~= szText or D.szLastDailyAlert ~= szDailyText then + if not X.IsEmpty(szText) and szText ~= szDailyText then + X.OutputSystemMessage({ GetFormatSysmsgText(_L['Current online ']) .. szText .. GetFormatSysmsgText(_L['.']), rich = true }) + end + if not X.IsEmpty(szDailyText) then + X.OutputSystemMessage({ GetFormatSysmsgText(_L['Today online ']) .. szDailyText .. GetFormatSysmsgText(_L['.']), rich = true }) + end + D.dwLastAlertTime = GetTime() + D.szLastAlert = szText + D.szLastDailyAlert = szDailyText + end +end + +-- 浮动框 +function D.ApplyFloatEntry(bFloatEntry) + if bFloatEntry then + if D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_RoleEntry', { + nPriority = 100.1, + tAnchor = { s = 'TOPLEFT', r = 'TOPLEFT', x = 370 - 5 + 55, y = 30 - 5 - 8 }, + fnCreate = function(wnd) + wnd:SetSize(24, 24) + local frameTemp = X.UI.OpenFrame(PLUGIN_ROOT .. '/ui/MY_RoleStatistics_RoleEntry.ini', 'MY_RoleStatistics_RoleEntry') + local btn = frameTemp:Lookup('Btn_MY_RoleStatistics_RoleEntry') + btn:ChangeRelation(wnd, true, true) + btn:SetRelPos(2, 1) + X.UI.CloseFrame(frameTemp) + btn.OnMouseEnter = function() + D.OutputFloatEntryTip(this) + end + btn.OnMouseLeave = function() + D.CloseFloatEntryTip() + end + btn.OnLButtonClick = function() + MY_RoleStatistics.Open('RoleStat') + end + end, + }) + else + if not D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_RoleEntry', false) + end + D.bFloatEntry = bFloatEntry +end + +function D.UpdateFloatEntry() + if not D.bReady then + return + end + D.ApplyFloatEntry(O.bFloatEntry) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_RoleStat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + szSaveDB = 'MY_RoleStatistics_RoleStat.bSaveDB', + szFloatEntry = 'MY_RoleStatistics_RoleStat.bFloatEntry', + tAPI = { + GetRoleStat = D.GetRoleStat, + }, + }, + root = D, + }, + }, +} +MY_RoleStatistics.RegisterModule('RoleStat', _L['MY_RoleStatistics_RoleStat'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_RoleStat', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'aAlertColumn', + 'tAlertTodayVal', + 'tSummaryIgnoreGUID', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'aAlertColumn', + 'tSummaryIgnoreGUID', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + triggers = { + bFloatEntry = D.UpdateFloatEntry, + bSaveDB = D.UpdateSaveDB, + }, + root = O, + }, + }, +} +MY_RoleStatistics_RoleStat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_RoleStatistics_RoleStat', function() + D.bReady = true + D.UpdateFloatEntry() +end) + +X.RegisterInit('MY_RoleStatistics_RoleStat', function() + D.InitAlert() +end) + +X.RegisterFlush('MY_RoleStatistics_RoleStat', function() + D.FlushDB() +end) + +X.RegisterExit('MY_RoleStatistics_RoleStat', function() + if PLAYER_REC then + X.SaveLUAData(PLAYER_REC_FILE, PLAYER_REC) + end + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + D.UpdateSaveDB() + D.FlushDB() + end +end) + +X.RegisterReload('MY_RoleStatistics_RoleStat', function() + D.ApplyFloatEntry(false) +end) + +X.RegisterFrameCreate('Player', 'MY_RoleStatistics_RoleStat', function() + D.UpdateFloatEntry() +end) + +X.RegisterFrameCreate('OptionPanel', 'MY_RoleStatistics_RoleStat', function() + D.OutputAlert() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/src/MY_RoleStatistics_TaskStat.lua b/MY_RoleStatistics/src/MY_RoleStatistics_TaskStat.lua new file mode 100644 index 000000000..93f7fdd84 --- /dev/null +++ b/MY_RoleStatistics/src/MY_RoleStatistics_TaskStat.lua @@ -0,0 +1,1359 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 任务统计(日常统计) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RoleStatistics/MY_RoleStatistics_TaskStat' +local PLUGIN_NAME = 'MY_RoleStatistics' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RoleStatistics_TaskStat' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_RoleStatistics_TaskStat', _L['General'], { + aColumn = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_TaskStat'], + _L['Columns'], + }), + xSchema = X.Schema.Collection(X.Schema.String), + xDefaultValue = { + 'name', + 'force', + 'big_war', -- 大战 + 'teahouse', -- 茶馆 + 'crystal_scramble', -- 晶矿争夺 + 'stronghold_trade', -- 据点贸易 + 'dragon_gate_despair', -- 龙门绝境 + 'lexus_reality', -- 列星虚境 + 'lidu_ghost_town', -- 李渡鬼域 + 'public_routine', -- 公共日常 + 'force_routine', -- 勤修不辍 + 'rookie_routine', -- 浪客行 + 'picking_fairy_grass', -- 采仙草 + 'find_dragon_veins', -- 寻龙脉 + 'illustration_routine', -- 美人图 + 'sneak_routine', -- 美人图潜行 + 'exam_sheng', -- 省试 + 'exam_hui', -- 会试 + 'time_days', + }, + }, + szSort = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_TaskStat'], + _L['Sort'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'time_days', + }, + szSortOrder = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_TaskStat'], + _L['Sort Order'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'desc', + }, + bFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_TaskStat'], + _L['Float panel'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceFloatEntry = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RoleStatistics'], + szDescription = X.MakeCaption({ + _L['MY_RoleStatistics_TaskStat'], + _L['Save DB'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAdviceSaveDB = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +local STAT_DATA_FILE = {'userdata/role_statistics/task_stat.jx3dat', X.PATH_TYPE.GLOBAL} +local PLAYER_REC_FILE = {'userdata/role_statistics/task_stat.jx3dat', X.PATH_TYPE.ROLE} +local PLAYER_REC_INITIAL, PLAYER_REC = nil, nil + +local TASK_TYPE = { + DAILY = 1, + WEEKLY = 2, + HALF_WEEKLY = 3, + ONCE = 4, +} +local TASK_TYPE_STRING = { + [TASK_TYPE.DAILY] = _L['Daily'], + [TASK_TYPE.WEEKLY] = _L['Weekly'], + [TASK_TYPE.HALF_WEEKLY] = _L['Half-weekly'], + [TASK_TYPE.ONCE] = _L['Once'], +} +local function IsInSamePeriod(dwTime, eType) + if eType == TASK_TYPE.ONCE then + return true + end + local nNextTime, nCircle + if eType == TASK_TYPE.DAILY then + nNextTime, nCircle = X.GetRefreshTime('daily') + elseif eType == TASK_TYPE.WEEKLY then + nNextTime, nCircle = X.GetRefreshTime('weekly') + elseif eType == TASK_TYPE.HALF_WEEKLY then + nNextTime, nCircle = X.GetRefreshTime('half-weekly') + end + return dwTime >= nNextTime - nCircle +end + +local TASK_STATE = { + ACCEPTABLE = 1, + ACCEPTED = 2, + FINISHABLE = 3, + FINISHED = 4, + UNACCEPTABLE = 5, + UNKNOWN = 6, +} +local function GetTaskState(me, dwQuestID, dwNpcTemplateID) + -- 获取身上任务状态 -1: 任务id非法 0: 任务不存在 1: 任务正在进行中 2: 任务完成但还没有交 3: 任务已完成 + local nState = me.GetQuestPhase(dwQuestID) + if nState == 1 then + return TASK_STATE.ACCEPTED + end + if nState == 2 then + return TASK_STATE.FINISHABLE + end + if nState == 3 then + return TASK_STATE.FINISHED + end + -- 获取任务状态 + if me.GetQuestState(dwQuestID) == QUEST_STATE.FINISHED then + return TASK_STATE.FINISHED + end + -- 获取是否可接 + local eCanAccept = me.CanAcceptQuest(dwQuestID, dwNpcTemplateID) + if eCanAccept == QUEST_RESULT.SUCCESS then + return TASK_STATE.ACCEPTABLE + end + if eCanAccept == QUEST_RESULT.ALREADY_ACCEPTED then + return TASK_STATE.ACCEPTED + end + if eCanAccept == QUEST_RESULT.FINISHED_MAX_COUNT then + return TASK_STATE.FINISHED + end + -- local KQuestInfo = GetQuestInfo(dwQuestID) + -- if KQuestInfo.bRepeat then -- 可重复任务没到达上限一定可接(有时候地图不对会误判不可接受) + -- return TASK_STATE.ACCEPTABLE + -- end + -- if eCanAccept == QUEST_RESULT.FAILED then + -- return TASK_STATE.UNACCEPTABLE + -- end + return TASK_STATE.UNKNOWN +end + +local TASK_MIN_WIDTH = 50 +local TASK_MAX_WIDTH = 150 + +------------------------------------------------------------------------------------------------------- + +local function GetFormatSysmsgText(szText) + return GetFormatText(szText, GetMsgFont('MSG_SYS'), GetMsgFontColor('MSG_SYS')) +end + +local DATA_ENV = setmetatable( + { + _L = _L , + math = math , + pairs = pairs , + ipairs = ipairs , + tonumber = tonumber , + wstring = X.wstring , + count_c = X.count_c , + pairs_c = X.pairs_c , + ipairs_c = X.ipairs_c , + ipairs_r = X.ipairs_r , + spairs = X.spairs , + spairs_r = X.spairs_r , + sipairs = X.sipairs , + sipairs_r = X.sipairs_r , + IsArray = X.IsArray , + IsDictionary = X.IsDictionary , + IsEquals = X.IsEquals , + IsNil = X.IsNil , + IsBoolean = X.IsBoolean , + IsNumber = X.IsNumber , + IsUserdata = X.IsUserdata , + IsHugeNumber = X.IsHugeNumber , + IsElement = X.IsElement , + IsEmpty = X.IsEmpty , + IsString = X.IsString , + IsTable = X.IsTable , + IsFunction = X.IsFunction , + IsInMonsterMap = X.IsInMonsterMap , + GetBuff = X.GetBuff , + GetAccount = X.GetAccount , + GetServerOriginName = X.GetServerOriginName , + GetItemAmountInAllPackages = function(...) + return X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, ...) + + X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.BANK, ...) + end, + RegisterEvent = X.RegisterEvent , + RegisterFrameCreate = X.RegisterFrameCreate , + ITEM_TABLE_TYPE = ITEM_TABLE_TYPE , + FORCE_TYPE = X.CONSTANT.FORCE_TYPE , + CAMP = CAMP , + TASK_TYPE = TASK_TYPE , + GetActivityQuest = X.GetActivityQuest , + GetFormatSysmsgText = GetFormatSysmsgText , + GetFormatText = GetFormatText , + GetMoneyText = GetMoneyText , + GetMsgFont = GetMsgFont , + GetMsgFontColor = GetMsgFontColor , + MoneyOptAdd = MoneyOptAdd , + MoneyOptCmp = MoneyOptCmp , + MoneyOptSub = MoneyOptSub , + Output = Output , + }, + { + __index = function(t, k) + if k == 'me' then + return X.GetClientPlayer() + end + if k:find('^arg%d+$') then + return _G[k] + end + end, + }) + +------------------------------------------------------------------------------------------------------- + +local COLUMN_LIST = { + -- guid + { + szKey = 'guid', + GetValue = function(prevVal, prevRec) + return X.GetClientPlayerGlobalID() + end, + }, + -- account + { + szKey = 'account', + GetValue = function(prevVal, prevRec) + return X.GetAccount() or '' + end, + }, + -- 大区 + { + szKey = 'region', + szTitle = _L['Region'], + bTable = true, + bRowTip = true, + nMinWidth = 100, + nMaxWidth = 100, + GetValue = function(prevVal, prevRec) + return X.GetRegionOriginName() + end, + }, + -- 服务器 + { + szKey = 'server', + szTitle = _L['Server'], + bTable = true, + bRowTip = true, + nMinWidth = 100, + nMaxWidth = 100, + GetValue = function(prevVal, prevRec) + return X.GetServerOriginName() + end, + }, + -- 名字 + { + szKey = 'name', + szTitle = _L['Name'], + bTable = true, + bRowTip = true, + nMinWidth = 110, + nMaxWidth = 200, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().szName + end, + GetFormatText = function(name, rec) + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + name = MY_ChatMosaics.MosaicsString(name) + end + return GetFormatText(name, 162, X.GetForceColor(rec.force, 'foreground')) + end, + }, + -- 门派 + { + szKey = 'force', + szTitle = _L['Force'], + bTable = true, + bRowTip = true, + nMinWidth = 50, + nMaxWidth = 70, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().dwForceID + end, + GetFormatText = function(force, rec) + return GetFormatText(g_tStrings.tForceTitle[force], 162, 255, 255, 255) + end, + }, + -- 阵营 + { + szKey = 'camp', + szTitle = _L['Camp'], + bTable = true, + bRowTip = true, + nMinWidth = 50, + nMaxWidth = 50, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().nCamp + end, + GetFormatText = function(camp, rec) + return GetFormatText(g_tStrings.STR_CAMP_TITLE[camp], 162, 255, 255, 255) + end, + }, + -- 等级 + { + szKey = 'level', + szTitle = _L['Level'], + bTable = true, + bRowTip = true, + nMinWidth = 50, + nMaxWidth = 50, + GetValue = function(prevVal, prevRec) + return X.GetClientPlayer().nLevel + end, + }, +} +-- 分版本列配置 +do + local f = X.LoadLUAData(PLUGIN_ROOT .. '/data/task/{$edition}.jx3dat') + if X.IsFunction(f) then + local t = f(DATA_ENV) + if X.IsTable(t) then + for _, col in ipairs(t) do + if not col.nMinWidth then + col.nMinWidth = TASK_MIN_WIDTH + end + if not col.nMaxWidth then + col.nMaxWidth = TASK_MAX_WIDTH + end + if not col.GetTitleFormatTip then + col.GetTitleFormatTip = function() + local aTitleTipXml = { + GetFormatText(col.szTitle .. '\n', 162, 255, 255, 255), + GetFormatText(_L['Refresh type:'] .. TASK_TYPE_STRING[col.eType] .. '\n', 162, 255, 128, 0) + } + local function InsertTitleTipXml(aInfo) + local info = Table_GetQuestStringInfo(aInfo[1]) + if info then + if IsCtrlKeyDown() then + table.insert(aTitleTipXml, GetFormatText('(' .. aInfo[1] .. ')', 162, 255, 128, 0)) + end + table.insert(aTitleTipXml, GetFormatText('[' .. info.szName .. ']\n', 162, 255, 255, 0)) + end + end + local aQuestInfo = col.aQuestInfo or (col.GetQuestInfo and col.GetQuestInfo()) + if aQuestInfo then + for _, aInfo in ipairs(aQuestInfo) do + InsertTitleTipXml(aInfo) + end + end + local tCampQuestInfo = col.tCampQuestInfo or (col.GetCampQuestInfo and col.GetCampQuestInfo()) + if tCampQuestInfo then + for _, aCampQuestInfo in pairs(tCampQuestInfo) do + for _, aInfo in ipairs(aCampQuestInfo) do + InsertTitleTipXml(aInfo) + end + end + end + local tForceQuestInfo = col.tForceQuestInfo or (col.GetForceQuestInfo and col.GetForceQuestInfo()) + if tForceQuestInfo then + for _, aForceQuestInfo in pairs(tForceQuestInfo) do + for _, aInfo in ipairs(aForceQuestInfo) do + InsertTitleTipXml(aInfo) + end + end + end + return table.concat(aTitleTipXml) + end + end + if not col.GetFormatText then + col.GetFormatText = function(val, rec) + local tTaskState = {} + local function CountTaskState(aQuestInfo) + for _, aInfo in ipairs(aQuestInfo) do + if rec.tTaskInfo[aInfo[1]] then + tTaskState[rec.tTaskInfo[aInfo[1]]] = (tTaskState[rec.tTaskInfo[aInfo[1]]] or 0) + 1 + end + end + end + local aQuestInfo = col.aQuestInfo or (col.GetQuestInfo and col.GetQuestInfo()) + if aQuestInfo then + CountTaskState(aQuestInfo) + end + local tCampQuestInfo = col.tCampQuestInfo or (col.GetCampQuestInfo and col.GetCampQuestInfo()) + if tCampQuestInfo and tCampQuestInfo[rec.camp] then + CountTaskState(tCampQuestInfo[rec.camp]) + end + local tForceQuestInfo = col.tForceQuestInfo or (col.GetForceQuestInfo and col.GetForceQuestInfo()) + if tForceQuestInfo and tForceQuestInfo[rec.force] then + CountTaskState(tForceQuestInfo[rec.force]) + end + local aBuffInfo = col.aBuffInfo or (col.GetBuffInfo and col.GetBuffInfo()) + if aBuffInfo then + for _, aInfo in ipairs(aBuffInfo) do + local szKey = aInfo[1] .. '_' .. (aInfo[2] or 0) + if rec.tBuffInfo[szKey] then + tTaskState[rec.tBuffInfo[szKey]] = (tTaskState[rec.tBuffInfo[szKey]] or 0) + 1 + end + end + end + -- local tCampBuffInfo = col.aCampBuffInfo or (col.GetCampBuffInfo and col.GetCampBuffInfo()) + -- local tForceBuffInfo = col.aForceBuffInfo or (col.GetForceBuffInfo and col.GetForceBuffInfo()) + local szState, r, g, b + if not IsInSamePeriod(rec.time, col.eType) then + szState = _L['--'] + elseif tTaskState[TASK_STATE.FINISHABLE] then + szState = _L['Finishable'] + elseif tTaskState[TASK_STATE.ACCEPTED] then + szState = _L['Accepted'] + elseif tTaskState[TASK_STATE.ACCEPTABLE] then + szState = _L['Acceptable'] + elseif tTaskState[TASK_STATE.FINISHED] then + szState, r, g, b = _L['Finished'], 128, 255, 128 + elseif tTaskState[TASK_STATE.UNACCEPTABLE] then + szState = _L['Unacceptable'] + elseif tTaskState[TASK_STATE.UNKNOWN] then + szState = _L['--'] + else + szState = _L['None'] + end + return GetFormatText(szState, 162, r, g, b) + end + end + if not col.GetFormatTip then + col.GetFormatTip = function(val, rec) + local aXml = {} + local function InsertTaskState(aInfo) + if IsCtrlKeyDown() then + table.insert(aXml, GetFormatText('(' .. aInfo[1] .. ')', 162, 255, 128, 0)) + end + table.insert(aXml, GetFormatText('[' .. X.Get(Table_GetQuestStringInfo(aInfo[1]), 'szName', '') .. ']: ', 162, 255, 255, 0)) + if rec.tTaskInfo[aInfo[1]] == TASK_STATE.ACCEPTABLE then + table.insert(aXml, GetFormatText(_L['Acceptable'] .. '\n', 162, 255, 255, 255)) + elseif rec.tTaskInfo[aInfo[1]] == TASK_STATE.UNACCEPTABLE then + table.insert(aXml, GetFormatText(_L['Unacceptable'] .. '\n', 162, 255, 255, 255)) + elseif rec.tTaskInfo[aInfo[1]] == TASK_STATE.ACCEPTED then + table.insert(aXml, GetFormatText(_L['Accepted'] .. '\n', 162, 255, 255, 255)) + elseif rec.tTaskInfo[aInfo[1]] == TASK_STATE.FINISHED then + table.insert(aXml, GetFormatText(_L['Finished'] .. '\n', 162, 255, 255, 255)) + elseif rec.tTaskInfo[aInfo[1]] == TASK_STATE.FINISHABLE then + table.insert(aXml, GetFormatText(_L['Finishable'] .. '\n', 162, 255, 255, 255)) + else + table.insert(aXml, GetFormatText(_L['Unknown'] .. '\n', 162, 255, 255, 255)) + end + end + local aQuestInfo = col.aQuestInfo or (col.GetQuestInfo and col.GetQuestInfo()) + if aQuestInfo then + for _, aInfo in ipairs(aQuestInfo) do + InsertTaskState(aInfo) + end + end + local tCampQuestInfo = col.tCampQuestInfo or (col.GetCampQuestInfo and col.GetCampQuestInfo()) + if tCampQuestInfo and tCampQuestInfo[rec.camp] then + for _, aInfo in ipairs(tCampQuestInfo[rec.camp]) do + InsertTaskState(aInfo) + end + end + local tForceQuestInfo = col.tForceQuestInfo or (col.GetForceQuestInfo and col.GetForceQuestInfo()) + if tForceQuestInfo and tForceQuestInfo[rec.force] then + for _, aInfo in ipairs(tForceQuestInfo[rec.force]) do + InsertTaskState(aInfo) + end + end + return table.concat(aXml) + end + end + if not col.Compare then + col.Compare = function(v1, v2, r1, r2) + local k1, k2 = 0, 0 + local tWeight = { + [TASK_STATE.FINISHABLE] = 10000, + [TASK_STATE.ACCEPTED] = 1000, + [TASK_STATE.ACCEPTABLE] = 100, + [TASK_STATE.UNACCEPTABLE] = 10, + [TASK_STATE.FINISHED] = 1, + } + local aQuestInfo = col.aQuestInfo or (col.GetQuestInfo and col.GetQuestInfo()) + if aQuestInfo then + for _, aInfo in ipairs(aQuestInfo) do + k1 = k1 + (r1.tTaskInfo[aInfo[1]] and tWeight[r1.tTaskInfo[aInfo[1]]] or 0) + k2 = k2 + (r2.tTaskInfo[aInfo[1]] and tWeight[r2.tTaskInfo[aInfo[1]]] or 0) + end + end + local tCampQuestInfo = col.tCampQuestInfo or (col.GetCampQuestInfo and col.GetCampQuestInfo()) + if tCampQuestInfo and tCampQuestInfo[r1.camp] then + for _, aInfo in ipairs(tCampQuestInfo[r1.camp]) do + k1 = k1 + (r1.tTaskInfo[aInfo[1]] and tWeight[r1.tTaskInfo[aInfo[1]]] or 0) + end + end + if tCampQuestInfo and tCampQuestInfo[r2.camp] then + for _, aInfo in ipairs(tCampQuestInfo[r2.camp]) do + k2 = k2 + (r2.tTaskInfo[aInfo[1]] and tWeight[r2.tTaskInfo[aInfo[1]]] or 0) + end + end + local tForceQuestInfo = col.tForceQuestInfo or (col.GetForceQuestInfo and col.GetForceQuestInfo()) + if tForceQuestInfo and tForceQuestInfo[r1.force] then + for _, aInfo in ipairs(tForceQuestInfo[r1.force]) do + k1 = k1 + (r1.tTaskInfo[aInfo[1]] and tWeight[r1.tTaskInfo[aInfo[1]]] or 0) + end + end + if tForceQuestInfo and tForceQuestInfo[r2.force] then + for _, aInfo in ipairs(tForceQuestInfo[r2.force]) do + k2 = k2 + (r2.tTaskInfo[aInfo[1]] and tWeight[r2.tTaskInfo[aInfo[1]]] or 0) + end + end + if not IsInSamePeriod(r1.time, col.eType) then + k1 = 0 + end + if not IsInSamePeriod(r2.time, col.eType) then + k2 = 0 + end + if k1 == k2 then + return 0 + end + return k1 > k2 and 1 or -1 + end + end + table.insert(COLUMN_LIST, col) + end + end + end +end +-- 时间 +table.insert(COLUMN_LIST, { + szKey = 'time', + szTitle = _L['Cache time'], + bTable = true, + bRowTip = true, + nMinWidth = 165, + nMaxWidth = 200, + GetValue = function(prevVal, prevRec) + return GetCurrentTime() + end, + GetFormatText = function(time, rec) + return GetFormatText(X.FormatTime(time, '%yyyy/%MM/%dd %hh:%mm:%ss'), 162, 255, 255, 255) + end, +}) +-- 时间计时 +table.insert(COLUMN_LIST, { + szKey = 'time_days', + szTitle = _L['Cache time days'], + bTable = true, + bRowTip = true, + nMinWidth = 120, + nMaxWidth = 120, + Compare = function(v1, v2, r1, r2) + v1, v2 = r1.time, r2.time + if v1 == v2 then + return 0 + end + return v1 > v2 and 1 or -1 + end, + GetFormatText = function(v, rec) + local nTime = GetCurrentTime() - rec.time + local nSeconds = math.floor(nTime) + local nMinutes = math.floor(nSeconds / 60) + local nHours = math.floor(nMinutes / 60) + local nDays = math.floor(nHours / 24) + local nYears = math.floor(nDays / 365) + local nDay = nDays % 365 + local nHour = nHours % 24 + local nMinute = nMinutes % 60 + local nSecond = nSeconds % 60 + if nYears > 0 then + return GetFormatText(_L('%d years %d days before', nYears, nDay), 162, 255, 255, 255) + end + if nDays > 0 then + return GetFormatText(_L('%d days %d hours before', nDays, nHour), 162, 255, 255, 255) + end + if nHours > 0 then + return GetFormatText(_L('%d hours %d mins before', nHours, nMinute), 162, 255, 255, 255) + end + if nMinutes > 0 then + return GetFormatText(_L('%d mins %d secs before', nMinutes, nSecond), 162, 255, 255, 255) + end + if nSecond > 10 then + return GetFormatText(_L('%d secs before', nSecond), 162, 255, 255, 255) + end + return GetFormatText(_L['Just now'], 162, 255, 255, 255) + end, +}) + +local COLUMN_DICT = {} +for _, col in ipairs(COLUMN_LIST) do + if not col.GetFormatText then + col.GetFormatText = function(v, rec) + if not v then + return GetFormatText('--', 162, 255, 255, 255) + end + return GetFormatText(v, 162, 255, 255, 255) + end + end + if not col.Compare then + col.Compare = function(v1, v2) + if v1 == v2 then + return 0 + end + if not v1 then + return -1 + end + if not v2 then + return 1 + end + return v1 > v2 and 1 or -1 + end + end + COLUMN_DICT[col.szKey] = col +end + +for _, col in ipairs(COLUMN_LIST) do + X.SafeCall(col.Collector) +end + +-- 移除不在同一个刷新周期内的数据字段 +function D.FilterColumnCircle(rec) + if X.IsNumber(rec.time) then + for _, col in ipairs(COLUMN_LIST) do + if col.szRefreshCircle then + local dwTime, dwCircle = X.GetRefreshTime(col.szRefreshCircle) + if dwTime - dwCircle >= rec.time then + rec[col.szKey] = nil + end + end + end + end +end + +function D.GetPlayerRecords() + local result = X.LoadLUAData(STAT_DATA_FILE) or {} + for _, rec in pairs(result) do + D.FilterColumnCircle(rec) + end + return result +end + +function D.GetClientPlayerRec() + local me = X.GetClientPlayer() + if not me then + return + end + -- 缓存数据 + if not PLAYER_REC_INITIAL then + PLAYER_REC_INITIAL = X.LoadLUAData(PLAYER_REC_FILE) or {} + D.FilterColumnCircle(PLAYER_REC_INITIAL) + PLAYER_REC = X.Clone(PLAYER_REC_INITIAL) + D.FilterColumnCircle(PLAYER_REC) + end + -- 获取各列数据 + for _, col in ipairs(COLUMN_LIST) do + if col.GetValue then + PLAYER_REC[col.szKey] = col.GetValue(PLAYER_REC_INITIAL[col.szKey], PLAYER_REC_INITIAL) + end + end + -- 获取任务、BUFF状态 + local tTaskInfo = {} + local tBuffInfo = {} + for _, col in ipairs(COLUMN_LIST) do + local aQuestInfo = col.aQuestInfo or (col.GetQuestInfo and col.GetQuestInfo()) + if aQuestInfo then + for _, aInfo in ipairs(aQuestInfo) do + tTaskInfo[aInfo[1]] = GetTaskState(me, aInfo[1], aInfo[2]) + end + end + local tCampQuestInfo = col.tCampQuestInfo or (col.GetCampQuestInfo and col.GetCampQuestInfo()) + if tCampQuestInfo and tCampQuestInfo[me.nCamp] then + for _, aInfo in ipairs(tCampQuestInfo[me.nCamp]) do + tTaskInfo[aInfo[1]] = GetTaskState(me, aInfo[1], aInfo[2]) + end + end + local tForceQuestInfo = col.tForceQuestInfo or (col.GetForceQuestInfo and col.GetForceQuestInfo()) + if tForceQuestInfo and tForceQuestInfo[me.dwForceID] then + for _, aInfo in ipairs(tForceQuestInfo[me.dwForceID]) do + tTaskInfo[aInfo[1]] = GetTaskState(me, aInfo[1], aInfo[2]) + end + end + local aBuffInfo = col.aBuffInfo or (col.GetBuffInfo and col.GetBuffInfo()) + if aBuffInfo then + for _, aInfo in ipairs(aBuffInfo) do + local nState = me.GetBuff(aInfo[1], aInfo[2] or 0) + and TASK_STATE.FINISHED + or TASK_STATE.UNKNOWN + if nState == TASK_STATE.FINISHED then + tBuffInfo[aInfo[1] .. '_0'] = TASK_STATE.FINISHED + end + tBuffInfo[aInfo[1] .. '_' .. (aInfo[2] or 0)] = nState + end + end + end + PLAYER_REC.tTaskInfo = tTaskInfo + PLAYER_REC.tBuffInfo = tBuffInfo + + return X.Clone(PLAYER_REC) +end + +function D.Migration() + local DB_V2_PATH = X.FormatPath({'userdata/role_statistics/task_stat.v2.db', X.PATH_TYPE.GLOBAL}) + local DB_V3_PATH = X.FormatPath({'userdata/role_statistics/task_stat.v3.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(DB_V2_PATH) and not IsLocalFileExist(DB_V3_PATH) then + return + end + X.Confirm( + _L['Ancient database detected, do you want to migrate data from it?'], + function() + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + -- 转移V2旧版数据 + if IsLocalFileExist(DB_V2_PATH) then + local DB_V2 = SQLite3_Open(DB_V2_PATH) + if DB_V2 then + local aTaskInfo = X.SQLiteExecuteANSI(DB_V2, 'SELECT * FROM TaskInfo WHERE guid IS NOT NULL AND name IS NOT NULL') + if aTaskInfo then + for _, rec in ipairs(aTaskInfo) do + if not data[rec.guid] or data[rec.guid].time <= rec.time then + data[rec.guid] = { + guid = rec.guid, + account = rec.account, + region = rec.region, + server = rec.server, + name = rec.name, + force = rec.force, + camp = rec.camp, + level = rec.level, + tTaskInfo = X.DecodeLUAData(rec.task_info or '') or {}, + tBuffInfo = X.DecodeLUAData(rec.buff_info or '') or {}, + time = rec.time, + } + end + end + end + DB_V2:Release() + end + CPath.Move(DB_V2_PATH, DB_V2_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + -- 转移V3旧版数据 + if IsLocalFileExist(DB_V3_PATH) then + local DB_V3 = SQLite3_Open(DB_V3_PATH) + if DB_V3 then + local aTaskInfo = X.SQLiteExecuteANSI(DB_V3, 'SELECT * FROM TaskInfo WHERE guid IS NOT NULL AND name IS NOT NULL') + if aTaskInfo then + for _, rec in ipairs(aTaskInfo) do + if not data[rec.guid] or data[rec.guid].time <= rec.time then + data[rec.guid] = { + guid = rec.guid, + account = rec.account, + region = rec.region, + server = rec.server, + name = rec.name, + force = rec.force, + camp = rec.camp, + level = rec.level, + tTaskInfo = X.DecodeLUAData(rec.task_info or '') or {}, + tBuffInfo = X.DecodeLUAData(rec.buff_info or '') or {}, + time = rec.time, + } + end + end + end + DB_V3:Release() + end + CPath.Move(DB_V3_PATH, DB_V3_PATH .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + X.SaveLUAData(STAT_DATA_FILE, data) + FireUIEvent('MY_ROLE_STAT_TASK_UPDATE') + X.Alert(_L['Migrate succeed!']) + end) +end + +function D.FlushDB() + --[[#DEBUG BEGIN]] + local nTickCount = GetTickCount() + --[[#DEBUG END]] + local rec = D.GetClientPlayerRec() + if O.bSaveDB then + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[X.GetClientPlayerGlobalID()] = D.GetClientPlayerRec() + X.SaveLUAData(STAT_DATA_FILE, data) + end + X.SaveLUAData(PLAYER_REC_FILE, rec) + --[[#DEBUG BEGIN]] + nTickCount = GetTickCount() - nTickCount + X.OutputDebugMessage('MY_RoleStatistics_TaskStat', _L('Flushing to database costs %dms...', nTickCount), X.DEBUG_LEVEL.PM_LOG) + --[[#DEBUG END]] +end + +function D.UpdateSaveDB() + if not D.bReady then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + if not O.bSaveDB then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_TaskStat', 'Remove from database...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[X.GetClientPlayerGlobalID()] = nil + X.SaveLUAData(STAT_DATA_FILE, data) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_RoleStatistics_TaskStat', 'Remove from database finished...', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + end + FireUIEvent('MY_ROLE_STAT_TASK_UPDATE') +end + +function D.GetTableColumns() + local aColumn = {} + for nIndex, szKey in ipairs(O.aColumn) do + local col = COLUMN_DICT[szKey] + if col then + table.insert(aColumn, col) + end + end + local nLFixIndex, nLFixWidth = -1, 0 + for nIndex, col in ipairs(aColumn) do + nLFixWidth = nLFixWidth + (col.nMinWidth or 100) + if nLFixWidth > 450 then + break + end + if col.szKey == 'name' then + nLFixIndex = nIndex + break + end + end + local nRFixIndex, nRFixWidth = math.huge, 0 + for nIndex, col in X.ipairs_r(aColumn) do + if nIndex <= nLFixIndex then + break + end + nRFixWidth = nRFixWidth + (col.nMinWidth or 100) + if nRFixWidth > 300 then + break + end + if col.szKey == 'time' or col.szKey == 'time_days' then + nRFixIndex = nIndex + end + end + local aTableColumn = {} + for nIndex, col in ipairs(aColumn) do + local szFixed = nIndex <= nLFixIndex + and 'left' + or (nIndex >= nRFixIndex and 'right' or nil) + local c = { + key = col.szKey, + title = col.szTitleAbbr or col.szTitle, + titleTip = col.szTitleTip + or (col.GetTitleFormatTip and function() + return col.GetTitleFormatTip(), true + end) + or col.szTitle, + alignHorizontal = col.szAlignHorizontal or 'center', + render = col.GetFormatText + and function(value, record, index) + return col.GetFormatText(value, record) + end + or nil, + sorter = col.Compare + and function(v1, v2, r1, r2) + return col.Compare(v1, v2, r1, r2) + end + or nil, + tip = col.GetFormatTip + and function(value, record, index) + return col.GetFormatTip(value, record), true + end + or nil, + draggable = true, + } + if szFixed then + c.fixed = szFixed + c.width = col.nMinWidth or 100 + else + c.minWidth = col.nMinWidth + c.maxWidth = col.nMaxWidth + end + table.insert(aTableColumn, c) + end + return aTableColumn +end + +function D.GetResult(szSearch) + -- 搜索 + local data = D.GetPlayerRecords() + local result = {} + for _, rec in pairs(data) do + if not X.IsString(szSearch) + or szSearch == '' + or X.StringFindW(tostring(rec.account or ''), szSearch) + or X.StringFindW(tostring(rec.name or ''), szSearch) + or X.StringFindW(tostring(rec.region or ''), szSearch) + or X.StringFindW(tostring(rec.server or ''), szSearch) then + table.insert(result, rec) + end + end + return result +end + +function D.UpdateUI(page) + local ui = X.UI(page) + + local szSearch = ui:Fetch('WndEditBox_Search'):Text() + local result = D.GetResult(szSearch) + + ui:Fetch('WndTable_Stat') + :Columns(D.GetTableColumns()) + :DataSource(result) +end + +function D.GetRowTip(rec) + local aXml = {} + for _, col in ipairs(COLUMN_LIST) do + if col.bRowTip then + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec[col.szKey], rec)) + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + return table.concat(aXml) +end + +function D.OutputFloatEntryTip(this) + local rec = D.GetClientPlayerRec() + if not rec then + return + end + local aXml = {} + for _, col in ipairs(COLUMN_LIST) do + if col.bFloatTip then + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec[col.szKey], rec)) + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(table.concat(aXml), 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) +end + +function D.CloseFloatEntryTip() + HideTip() +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = 20, y = 20, w = 388, h = 25, + appearance = 'SEARCH_RIGHT', + placeholder = _L['Press ENTER to search...'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.UpdateUI(page) + return 1 + end + end, + }) + + -- 显示列 + ui:Append('WndComboBox', { + name = 'WndComboBox_DisplayColumns', + x = 800, y = 20, w = 180, + text = _L['Columns'], + menu = function() + local t = {} + local function UpdateMenu() + local aColumn, tChecked, nMinW = O.aColumn, {}, 0 + for i = 1, #t do + t[i] = nil + end + -- 已添加的 + for nIndex, szKey in ipairs(aColumn) do + local col = COLUMN_DICT[szKey] + if col then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local nOffset = IsShiftKeyDown() and 1 or -1 + if nIndex + nOffset < 1 or nIndex + nOffset > #O.aColumn then + return + end + local aColumn = O.aColumn + aColumn[nIndex], aColumn[nIndex + nOffset] = aColumn[nIndex + nOffset], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + fnMouseEnter = function() + if #O.aColumn == 1 then + return + end + local szText = _L['Click to move up, Hold SHIFT to move down.'] + if nIndex == 1 then + szText = _L['Hold SHIFT click to move down.'] + elseif nIndex == #O.aColumn then + szText = _L['Click to move up.'] + end + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(szText, nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.LEFT_RIGHT) + end, + fnMouseLeave = function() + HideTip() + end, + { + szOption = _L['Move up'], + fnAction = function() + if nIndex > 1 then + aColumn[nIndex], aColumn[nIndex - 1] = aColumn[nIndex - 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + { + szOption = _L['Move down'], + fnAction = function() + if nIndex < #aColumn then + aColumn[nIndex], aColumn[nIndex + 1] = aColumn[nIndex + 1], aColumn[nIndex] + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Delete'], + fnAction = function() + table.remove(aColumn, nIndex) + O.aColumn = aColumn + UpdateMenu() + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + }) + nMinW = nMinW + col.nMinWidth + end + tChecked[szKey] = true + end + -- 未添加的 + for _, col in ipairs(COLUMN_LIST) do + if col.bTable and not tChecked[col.szKey] then + table.insert(t, { + szOption = col.szTitle, + fnAction = function() + local aColumn = O.aColumn + table.insert(aColumn, col.szKey) + O.aColumn = aColumn + UpdateMenu() + D.FlushDB() + D.UpdateUI(page) + end, + }) + end + end + end + UpdateMenu() + return t + end, + }) + + ui:Append('WndTable', { + name = 'WndTable_Stat', + x = 20, y = 60, w = 960, h = 530, + sort = O.szSort, + sortOrder = O.szSortOrder, + onSortChange = function(szSort, szSortOrder) + O.szSort, O.szSortOrder = szSort, szSortOrder + end, + rowTip = { + render = function(rec) + return D.GetRowTip(rec), true + end, + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + rowMenuRClick = function(rec, index) + local menu = { + { + szOption = _L['Delete'], + fnAction = function() + local data = X.LoadLUAData(STAT_DATA_FILE) or {} + data[rec.guid] = nil + X.SaveLUAData(STAT_DATA_FILE, data) + D.UpdateUI(page) + end, + rgb = { 255, 128, 128 }, + }, + } + PopupMenu(menu) + end, + onColumnsChange = function(aColumns) + local aKeys = {} + for _, col in ipairs(aColumns) do + table.insert(aKeys, col.key) + end + O.aColumn = aKeys + D.UpdateUI(page) + end, + }) + + local frame = page:GetRoot() + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('QUEST_ACCEPTED') + frame:RegisterEvent('QUEST_CANCELED') + frame:RegisterEvent('QUEST_FINISHED') + frame:RegisterEvent('DAILY_QUEST_UPDATE') + frame:RegisterEvent('MY_ROLE_STAT_TASK_UPDATE') + + D.OnResizePage() +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + + ui:Fetch('WndComboBox_DisplayColumns'):Left(nW - 200) + ui:Fetch('WndTable_Stat'):Size(nW - 40, nH - 100) +end + +function D.CheckAdvice() + for _, p in ipairs({ + { + szMsg = _L('%s stat has not been enabled, this character\'s data will not be saved, are you willing to save this character?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + szAdviceKey = 'bAdviceSaveDB', + szSetKey = 'bSaveDB', + }, + -- { + -- szMsg = _L('%s stat float entry has not been enabled, are you willing to enable it?\nYou can change this config by click option button on the top-right conner.', _L[MODULE_NAME]), + -- szAdviceKey = 'bAdviceFloatEntry', + -- szSetKey = 'bFloatEntry', + -- }, + }) do + if not O[p.szAdviceKey] and not O[p.szSetKey] then + X.Confirm(p.szMsg, function() + MY_RoleStatistics_TaskStat[p.szSetKey] = true + MY_RoleStatistics_TaskStat[p.szAdviceKey] = true + D.CheckAdvice() + end, function() + MY_RoleStatistics_TaskStat[p.szAdviceKey] = true + D.CheckAdvice() + end) + return + end + end +end + +function D.OnActivePage() + D.Migration() + D.CheckAdvice() + D.FlushDB() + D.UpdateUI(this) +end + +function D.OnEvent(event) + if event == 'ON_MY_MOSAICS_RESET' then + D.UpdateUI(this) + elseif event == 'QUEST_ACCEPTED' or event == 'QUEST_CANCELED' + or event == 'QUEST_FINISHED' or event == 'DAILY_QUEST_UPDATE' then + D.FlushDB() + D.UpdateUI(this) + elseif event == 'MY_ROLE_STAT_TASK_UPDATE' then + D.FlushDB() + D.UpdateUI(this) + end +end + +function D.OnLButtonClick() + local name = this:GetName() +end + +-- 浮动框 +function D.ApplyFloatEntry(bFloatEntry) + if bFloatEntry then + if D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_TaskEntry', { + nPriority = 100.3, + tAnchor = { s = 'TOPLEFT', r = 'TOPLEFT', x = 370 - 5 + 72, y = 30 - 5 + 37 }, + fnCreate = function(wnd) + wnd:SetSize(24, 24) + local frameTemp = X.UI.OpenFrame(PLUGIN_ROOT .. '/ui/MY_RoleStatistics_TaskEntry.ini', 'MY_RoleStatistics_TaskEntry') + local btn = frameTemp:Lookup('Btn_MY_RoleStatistics_TaskEntry') + btn:ChangeRelation(wnd, true, true) + btn:SetRelPos(2, 2) + X.UI.CloseFrame(frameTemp) + btn.OnMouseEnter = function() + D.OutputFloatEntryTip(this) + end + btn.OnMouseLeave = function() + D.CloseFloatEntryTip() + end + btn.OnLButtonClick = function() + MY_RoleStatistics.Open('TaskStat') + end + end, + }) + else + if not D.bFloatEntry then + return + end + X.UI.RegisterFloatBar('MY_RoleStatistics_TaskEntry', false) + end + D.bFloatEntry = bFloatEntry +end + +function D.UpdateFloatEntry() + if not D.bReady then + return + end + D.ApplyFloatEntry(O.bFloatEntry) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_TaskStat', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + szSaveDB = 'MY_RoleStatistics_TaskStat.bSaveDB', + szFloatEntry = 'MY_RoleStatistics_TaskStat.bFloatEntry', + }, + root = D, + }, + }, +} +MY_RoleStatistics.RegisterModule('TaskStat', _L['MY_RoleStatistics_TaskStat'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoleStatistics_TaskStat', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'aColumn', + 'szSort', + 'szSortOrder', + 'bFloatEntry', + 'bSaveDB', + 'bAdviceSaveDB', + }, + triggers = { + bFloatEntry = D.UpdateFloatEntry, + bSaveDB = D.UpdateSaveDB, + }, + root = O, + }, + }, +} +MY_RoleStatistics_TaskStat = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_RoleStatistics_TaskStat', function() + D.bReady = true + D.UpdateFloatEntry() +end) + +X.RegisterFlush('MY_RoleStatistics_TaskStat', function() + D.FlushDB() +end) + +X.RegisterExit('MY_RoleStatistics_TaskStat', function() + if not X.ENVIRONMENT.RUNTIME_OPTIMIZE then + D.UpdateSaveDB() + D.FlushDB() + end +end) + +X.RegisterReload('MY_RoleStatistics_TaskStat', function() + D.ApplyFloatEntry(false) +end) + +X.RegisterFrameCreate('Player', 'MY_RoleStatistics_TaskStat', function() + D.UpdateFloatEntry() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_BagEntry.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_BagEntry.ini new file mode 100644 index 000000000..88ea778cd --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_BagEntry.ini @@ -0,0 +1,50 @@ +[MY_RoleStatistics_BagEntry] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=20 +Height=20 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 +ShowModeSet=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +ShowWhenHideUI=1 + +[Btn_MY_RoleStatistics_BagEntry] +._WndType=WndButton +._Parent=MY_RoleStatistics_BagEntry +Left=0 +Top=0 +Width=28 +Height=28 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=interface\MY\MY_RoleStatistics\img\MY_RoleStatistics_BagStat.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=0 +MouseOverGroup=1 +MouseDownGroup=2 +DisableGroup=3 +Alpha=255 +ShowTipType=0 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_BagStat.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_BagStat.ini new file mode 100644 index 000000000..fd85daae1 --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_BagStat.ini @@ -0,0 +1,1117 @@ +[MY_RoleStatistics_BagStat] +._WndType=WndFrame +._Parent=Normal +Left=20 +Top=20 +Width=1000 +Height=633 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_RoleStatistics_BagStat +Left=0 +Top=0 +Width=1000 +Height=633 +DummyWnd=0 +Frame=0 + +[Wnd_SearchName] +._WndType=WndWindow +._Parent=Wnd_Total +Left=15 +Top=20 +Width=195 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchName] +._WndType=Handle +._Parent=Wnd_SearchName +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=195 +Height=25 + +[Image_SearchNameBg] +._WndType=Image +._Parent=Handle_SearchName +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=192 +Height=25 +ImageType=10 + +[Image_SearchName] +._WndType=Image +._Parent=Handle_SearchName +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=162 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_SearchName] +._WndType=WndEdit +._Parent=Wnd_SearchName +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=159 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=输入回车键搜索... +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[Wnd_SearchItem] +._WndType=WndWindow +._Parent=Wnd_Total +Left=215 +Top=20 +Width=220 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchItem] +._WndType=Handle +._Parent=Wnd_SearchItem +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=220 +Height=25 + +[Image_SearchItemBg] +._WndType=Image +._Parent=Handle_SearchItem +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=220 +Height=25 +ImageType=10 + +[Image_SearchItem] +._WndType=Image +._Parent=Handle_SearchItem +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=191 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_SearchItem] +._WndType=WndEdit +._Parent=Wnd_SearchItem +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=7 +Top=3 +Width=188 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=输入回车键搜索... +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[WndScroll_Name] +._WndType=WndScroll +._Parent=Wnd_Total +Left=16 +Top=46 +Width=195 +Height=555 +ScrollHandle= +ScrollContainer=WndContainer_Name +VerScrollBar=Scroll_Name +ScrollButtonUp=WndButton_NameUp +ScrollButtonDown=WndButton_NameDown + +[Handle_ScrollName] +._WndType=Handle +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=195 +Height=555 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Name] +._WndType=Image +._Parent=Handle_ScrollName +Left=0 +Top=0 +Width=190 +Height=555 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[WndContainer_Name] +._WndType=WndContainer +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=195 +Height=525 +ContainerType=1 +DrawStyle=1 + +[Wnd_Name] +._WndType=WndWindow +._Parent=WndContainer_Name +Left=0 +Top=0 +Width=195 +Height=35 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Hover=Image_NameBg_Hover|Btn_Only|Btn_Delete +MBStatus=Image_NameBg_Down + +[CheckBox_Name] +._WndType=WndCheckBox +._Parent=Wnd_Name +Frame=56 +Left=15 +Top=3 +Width=25 +Height=25 +UnCheckAndEnable=5 +CheckAndEnable=6 +UnCheckAndDisable=85 +CheckAndDisable=86 +UnCheckedAndEnableWhenMouseOver=3 +CheckedAndEnableWhenMouseOver=7 +CheckedAndDisableWhenMouseOver=86 +UnCheckedAndDisableWhenMouseOver=85 +Checking=7 +UnChecking=3 +Image=ui\Image\button\CommonButton_1.UITex +$Tip= +ShowTipType=0 +DummyWnd=1 +CheckedWhenCreate=1 + +[Handle_CheckName] +._WndType=Handle +._Parent=CheckBox_Name +HandleType=0 +FirstItemPosType=0 +Left=-13 +Top=-2 +PosType=0 +Width=190 +Height=35 +EventID=512 + +[Text_Name] +._WndType=Text +._Parent=Handle_CheckName +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=48 +Top=4 +PosType=0 +Width=127 +Height=25 +FontScheme=18 +ShowAll=0 +AutoEtc=1 +VAlign=1 +OrgText=1 +$Text=茗伊有六个字@白帝城 (引仙水榭) + +[Handle_Name] +._WndType=Handle +._Parent=Wnd_Name +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_NamelBg] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=0 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +ImageType=10 + +[Image_NameBg_Hover] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=1 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +LockShowAndHide=1 +ImageType=10 + +[Image_NameBg_Down] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=2 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +LockShowAndHide=1 +ImageType=10 + +[Btn_Only] +._WndType=WndButton +._Parent=Wnd_Name +Frame=0 +Left=144 +Top=6 +Width=20 +Height=20 +NormalGroup=35 +MouseOverGroup=36 +MouseDownGroup=37 +DisableGroup=35 +Image=ui\Image\Common\Money.UITex +DummyWnd=0 +Alpha=200 +LockShowAndHide=1 + +[Btn_Delete] +._WndType=WndButton +._Parent=Wnd_Name +Frame=0 +Left=165 +Top=8 +Width=20 +Height=18 +NormalGroup=19 +MouseOverGroup=21 +MouseDownGroup=22 +DisableGroup=23 +Image=ui\Image\UICommon\CommonPanel2.UITex +DummyWnd=0 +Alpha=200 +LockShowAndHide=1 + +[WndButton_NameUp] +._WndType=WndButton +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[WndButton_NameDown] +._WndType=WndButton +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Scroll_Name] +._WndType=WndNewScrollBar +._Parent=WndScroll_Name +StepCount=0 +PageStepCount=7 +Left=180 +Top=0 +Width=15 +Height=525 +Type=1 +SlideBtn=WndButton_Scroll_Name +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[WndButton_Scroll_Name] +._WndType=WndButton +._Parent=Scroll_Name +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + +[Btn_NameAll] +._WndType=WndButton +._Parent=WndScroll_Name +Left=4 +Top=543 +Width=37 +Height=10 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Trans=0 +Image=ui\Image\UICommon\LoginCommon.UITex +Frame=3 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=39 +MouseOverGroup=40 +MouseDownGroup=41 +DisableGroup=38 +ShowTipType=0 +NormalFont=162 +MouseOverFont=0 +MouseDownFont=162 +ButtonDisable=0 +DisableFont=161 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Handle_NameAll] +._WndType=Handle +._Parent=Btn_NameAll +HandleType=0 +FirstItemPosType=0 +Left=-11 +Top=-14 +PosType=0 +Width=50 +Height=25 +EventID=512 + +[Text_NameAll] +._WndType=Text +._Parent=Handle_NameAll +FontSpacing=0 +Alpha=255 +$Text=STR_MAILPANEL_SELECTALL +Left=0 +Top=0 +PosType=0 +Width=60 +Height=26 +HAlign=1 +VAlign=1 +MultiLine=0 +RowSpacing=0 +FontScheme=162 + +[Wnd_SearchInfo] +._WndType=WndWindow +._Parent=WndScroll_Name +Left=55 +Top=530 +Width=135 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchInfo] +._WndType=Handle +._Parent=Wnd_SearchInfo +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_SearchInfo] +._WndType=Text +._Parent=Handle_SearchInfo +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1234个结果 +OrgText=1 +Width=135 +Height=25 +VAlign=1 +HAlign=2 + +[WndScroll_Item] +._WndType=WndScroll +._Parent=Wnd_Total +Left=215 +Top=46 +Width=780 +Height=524 +ScrollHandle=Handle_Items +ScrollContainer= +VerScrollBar=Scroll_Item +ScrollButtonUp=WndButton_ItemUp +ScrollButtonDown=WndButton_ItemDown + +[Handle_ScrollItem] +._WndType=Handle +._Parent=WndScroll_Item +Left=0 +Top=0 +Width=765 +Height=524 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Item] +._WndType=Image +._Parent=Handle_ScrollItem +Left=0 +Top=0 +Width=765 +Height=524 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_Items] +._WndType=Handle +._Parent=Handle_ScrollItem +Left=0 +Top=5 +Width=765 +Height=512 +PosType=0 +HandleType=3 +PixelScroll=1 +EventId=515 +RowSpacing=0 +ControlShow=0 +IgnoreInvisibleChild=1 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_Items +PosType=8 +HandleType=0 +ControlShow=0 +Width=765 +Height=166 +Hover=Shadow_ItemHover +FirstItemPosType=0 +EventID=816 + +[Shadow_ItemHover] +._WndType=Shadow +._Parent=Handle_Item +PosType=0 +ShadowColor=gray1 +Alpha=150 +Width=765 +Height=166 +Left=0 +Top=0 +LockShowAndHide=1 + +[Box_Item] +._WndType=Box +._Parent=Handle_Item +Left=7 +Top=3 +PosType=0 +IconID=7528 +Width=44 +Height=44 +EventID=768 + +[Handle_ItemInfo] +._WndType=Handle +._Parent=Handle_Item +Left=55 +Top=6 +PosType=0 +HandleType=3 +RowSpacing=0 + +[Text_ItemName] +._WndType=Text +._Parent=Handle_ItemInfo +PosType=8 +FontSpacing=0 +Alpha=255 +$Text=五行石·六级 +OrgText=1 +RowSpacing=0 + +[Text_ItemSpliter] +._WndType=Text +._Parent=Handle_ItemInfo +PosType=8 +FontSpacing=0 +Alpha=140 +OrgText=1 +Width=10 +Height=1 +RichText=0 +RowSpacing=0 + +[Text_ItemDesc] +._WndType=Text +._Parent=Handle_ItemInfo +PosType=8 +FontSpacing=0 +Alpha=140 +$Text=未绑定 +OrgText=1 +RowSpacing=0 + +[Text_ItemStatistics] +._WndType=Text +._Parent=Handle_Item +Left=55 +Top=27 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=140 +$Text=仓库x317 背包x395 总x735 +OrgText=1 + +[Handle_ItemBelongs] +._WndType=Handle +._Parent=Handle_Item +Left=55 +Top=51 +PosType=0 +HandleType=6 +RowSpacing=4 +Width=694 +Height=13 + +[Text_ItemBelongs] +._WndType=Text +._Parent=Handle_ItemBelongs +PosType=8 +FontSpacing=0 +Alpha=255 +$Text=茗伊 (梦江南) \t仓库x10 背包x5\n湿漉漉的肾 (梦江南) \t背包x1\n +OrgText=1 +RowSpacing=0 + +[Handle_ItemCompact] +._WndType=Handle +._Parent=Handle_Items +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=51 +Height=51 + +[Box_ItemCompact] +._WndType=Box +._Parent=Handle_ItemCompact +Left=4 +Top=2 +PosType=0 +IconID=0 +Width=46 +Height=46 + +[WndButton_ItemUp] +._WndType=WndButton +._Parent=WndScroll_Item +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[WndButton_ItemDown] +._WndType=WndButton +._Parent=WndScroll_Item +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Scroll_Item] +._WndType=WndNewScrollBar +._Parent=WndScroll_Item +StepCount=0 +PageStepCount=7 +Left=765 +Top=0 +Width=15 +Height=550 +Type=1 +SlideBtn=WndButton_Scroll_Item +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[WndButton_Scroll_Item] +._WndType=WndButton +._Parent=Scroll_Item +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + +[Wnd_Index] +._WndType=WndWindow +._Parent=Wnd_Total +Left=215 +Top=575 +Width=765 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_IndexTotal] +._WndType=Handle +._Parent=Wnd_Index +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=765 +Height=25 + +[Image_Index] +._WndType=Image +._Parent=Handle_IndexTotal +Left=0 +Top=0 +Width=765 +Height=25 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_IndexesOuter] +._WndType=Handle +._Parent=Handle_IndexTotal +Left=65 +Top=0 +PosType=0 +HandleType=2 +Width=659 +Height=25 +RowSpacing=0 +HAlign=1 +VAlign=1 +IgnoreInvisibleChild=0 +MinRowHeight=0 +MaxRowHeight=1 + +[Handle_Indexes] +._WndType=Handle +._Parent=Handle_IndexesOuter +PosType=8 +HandleType=3 +HAlign=0 +RowSpacing=0 +Width=35 +Height=25 +IgnoreInvisibleChild=1 + +[Handle_Index] +._WndType=Handle +._Parent=Handle_Indexes +PosType=8 +HandleType=0 +Width=35 +Height=25 +HAlign=0 +VAlign=0 +FirstItemPosType=0 +Hover=Shadow_Index +EventID=784 + +[Shadow_Index] +._WndType=Shadow +._Parent=Handle_Index +Left=1 +Top=0 +PosType=0 +ShadowColor=orange1 +Alpha=225 +Width=33 +Height=25 +LockShowAndHide=1 + +[Text_Index] +._WndType=Text +._Parent=Handle_Index +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=999 +Width=35 +Height=25 +HAlign=1 +VAlign=1 +Left=0 +Top=0 + +[Text_IndexUnderline] +._WndType=Text +._Parent=Handle_Index +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=_ +OrgText=1 +Width=35 +Height=25 +HAlign=1 +VAlign=2 + +[Handle_IndexCount] +._WndType=Handle +._Parent=Handle_IndexTotal +PosType=0 +HandleType=0 +Width=65 +Height=25 +HAlign=0 +VAlign=0 +FirstItemPosType=0 +Hover= +EventID=784 +Left=0 +Top=0 + +[Shadow_IndexCount] +._WndType=Shadow +._Parent=Handle_IndexCount +Left=0 +Top=0 +PosType=0 +ShadowColor=gray4 +Alpha=100 +Width=65 +Height=25 + +[Text_IndexCount] +._WndType=Text +._Parent=Handle_IndexCount +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=共101页 +Width=65 +Height=25 +HAlign=1 +VAlign=1 +Left=0 +Top=0 + +[Text_IndexCountUnderline] +._WndType=Text +._Parent=Handle_IndexCount +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=_ +OrgText=1 +Width=65 +Height=25 +HAlign=1 +VAlign=2 + +[Wnd_IndexEdit] +._WndType=WndWindow +._Parent=Wnd_Index +Left=725 +Top=0 +Width=40 +Height=25 + +[Handle_IndexEdit] +._WndType=Handle +._Parent=Wnd_IndexEdit +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=40 +Height=25 +EventID=2048 + +[Image_IndexEdit] +._WndType=Image +._Parent=Handle_IndexEdit +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=128 +Left=0 +Top=0 +PosType=0 +Width=40 +Height=25 +ImageType=10 + +[WndEdit_Index] +._WndType=WndEdit +._Parent=Wnd_IndexEdit +Left=4 +Top=2 +Width=32 +Height=21 +RowSpacing=0 +FontSpacing=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +MultiLine=0 +Password=0 +Type=2 +TextLength=99999 +MaxLen=-1 +FontScheme=18 +FocusBgColor=black +FocusBgColorAlpha=50 +SelectBgColorAlpha=255 +SelFontScheme=18 +CaretFontScheme=18 +SelectBgColor=black + +[Btn_SwitchMode] +._WndType=WndButton +._Parent=Wnd_Total +Left=958 +Top=20 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\Common\Money.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=19 +MouseOverGroup=20 +MouseDownGroup=6 +DisableGroup=0 +ButtonDisable=0 +OrgTip=0 +$Tip=STR_BAG_OPTION +ShowTipType=0 +TipRichText=1 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_DungeonEntry.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_DungeonEntry.ini new file mode 100644 index 000000000..16f5c89ab --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_DungeonEntry.ini @@ -0,0 +1,48 @@ +[MY_RoleStatistics_DungeonEntry] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=20 +Height=20 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 + +[Btn_MY_RoleStatistics_DungeonEntry] +._WndType=WndButton +._Parent=MY_RoleStatistics_DungeonEntry +Left=0 +Top=0 +Width=20 +Height=20 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\SystemButton.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=20 +MouseOverGroup=21 +MouseDownGroup=22 +DisableGroup=23 +Alpha=255 +ShowTipType=0 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_EquipEntry.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_EquipEntry.ini new file mode 100644 index 000000000..7da004761 --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_EquipEntry.ini @@ -0,0 +1,50 @@ +[MY_RoleStatistics_EquipEntry] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=20 +Height=20 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 +ShowModeSet=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 +ShowWhenHideUI=1 + +[Btn_MY_RoleStatistics_EquipEntry] +._WndType=WndButton +._Parent=MY_RoleStatistics_EquipEntry +Left=0 +Top=0 +Width=30 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\SystemButton.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=8 +MouseOverGroup=9 +MouseDownGroup=10 +DisableGroup=11 +Alpha=255 +ShowTipType=0 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_EquipStat.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_EquipStat.ini new file mode 100644 index 000000000..4749455f0 --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_EquipStat.ini @@ -0,0 +1,1860 @@ +[MY_RoleStatistics_EquipStat] +._WndType=WndFrame +._Parent=Normal +Left=20 +Top=20 +Width=1000 +Height=633 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_RoleStatistics_EquipStat +Left=0 +Top=0 +Width=1000 +Height=633 +DummyWnd=0 +Frame=0 + +[Wnd_SearchName] +._WndType=WndWindow +._Parent=Wnd_Total +Left=15 +Top=20 +Width=195 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchName] +._WndType=Handle +._Parent=Wnd_SearchName +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=195 +Height=25 + +[Image_SearchNameBg] +._WndType=Image +._Parent=Handle_SearchName +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=192 +Height=25 +ImageType=10 + +[Image_SearchName] +._WndType=Image +._Parent=Handle_SearchName +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=162 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_SearchName] +._WndType=WndEdit +._Parent=Wnd_SearchName +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=159 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=输入回车键搜索... +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[WndScroll_Name] +._WndType=WndScroll +._Parent=Wnd_Total +Left=16 +Top=46 +Width=195 +Height=555 +ScrollHandle= +ScrollContainer=WndContainer_Name +VerScrollBar=Scroll_Name +ScrollButtonUp=WndButton_NameUp +ScrollButtonDown=WndButton_NameDown + +[Handle_ScrollName] +._WndType=Handle +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=195 +Height=555 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Name] +._WndType=Image +._Parent=Handle_ScrollName +Left=0 +Top=0 +Width=190 +Height=555 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[WndContainer_Name] +._WndType=WndContainer +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=195 +Height=555 +ContainerType=1 +DrawStyle=1 + +[Wnd_Name] +._WndType=WndWindow +._Parent=WndContainer_Name +Left=0 +Top=0 +Width=195 +Height=35 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Hover=Image_NameBg_Hover|Btn_Delete +MBStatus=Image_NameBg_Down + +[Handle_Name] +._WndType=Handle +._Parent=Wnd_Name +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_NamelBg] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=0 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +ImageType=10 + +[Image_NameBg_Hover] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=1 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +LockShowAndHide=1 +ImageType=10 + +[Image_NameBg_Down] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=2 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +LockShowAndHide=1 +ImageType=10 + +[Image_NameBg_Selected] +._WndType=Image +._Parent=Handle_Name +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=1 +Alpha=140 +Left=0 +Top=0 +PosType=0 +Width=190 +Height=35 +LockShowAndHide=1 +ImageType=10 + +[Text_Name] +._WndType=Text +._Parent=Handle_Name +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=10 +Top=5 +PosType=0 +Width=159 +Height=25 +FontScheme=18 +ShowAll=0 +AutoEtc=1 +VAlign=1 +OrgText=1 +$Text=茗伊有六个字@白帝城 (引仙水榭) + +[Btn_Delete] +._WndType=WndButton +._Parent=Wnd_Name +Frame=0 +Left=165 +Top=8 +Width=20 +Height=18 +NormalGroup=19 +MouseOverGroup=21 +MouseDownGroup=22 +DisableGroup=23 +Image=ui\Image\UICommon\CommonPanel2.UITex +DummyWnd=0 +Alpha=200 +LockShowAndHide=1 + +[WndButton_NameUp] +._WndType=WndButton +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[WndButton_NameDown] +._WndType=WndButton +._Parent=WndScroll_Name +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Scroll_Name] +._WndType=WndNewScrollBar +._Parent=WndScroll_Name +StepCount=0 +PageStepCount=7 +Left=180 +Top=0 +Width=15 +Height=555 +Type=1 +SlideBtn=WndButton_Scroll_Name +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[WndButton_Scroll_Name] +._WndType=WndButton +._Parent=Scroll_Name +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + +[Wnd_ItemPage] +._WndType=WndWindow +._Parent=Wnd_Total +Left=215 +Top=22 +Width=780 +Height=555 +ScrollHandle=Handle_Items +ScrollContainer= +VerScrollBar=Scroll_Item +ScrollButtonUp=WndButton_ItemUp +ScrollButtonDown=WndButton_ItemDown + +[Handle_ItemPage] +._WndType=Handle +._Parent=Wnd_ItemPage +Left=0 +Top=0 +Width=765 +Height=579 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_ItemPageBg] +._WndType=Image +._Parent=Handle_ItemPage +Left=0 +Top=0 +Width=765 +Height=579 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_Equip] +._WndType=Handle +._Parent=Handle_ItemPage +HandleType=0 +FirstItemPosType=0 +Left=10 +Top=26 +PosType=0 +Width=378 +Height=480 + +[Image_Glasses] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=16 +Alpha=255 +PosType=0 +Width=46 +Height=46 +Left=191 +Top=145 + +[Image_Helm] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=63 +Alpha=255 +Left=10 +Top=44 +PosType=0 +Width=50 +Height=50 + +[Image_Helm_Extend] +._WndType=Image +._Parent=Handle_Equip +PosType=12 +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=4 +Alpha=255 +Width=46 +Height=46 + +[Image_Chest] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=62 +Alpha=255 +PosType=0 +Left=10 +Top=157 +Width=50 +Height=50 + +[Image_Amice] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=5 +Alpha=255 +PosType=12 +Width=46 +Height=46 + +[Image_Waist] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=69 +Alpha=255 +PosType=0 +Left=10 +Top=314 +Width=50 +Height=50 + +[Image_Extend] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=68 +Alpha=255 +PosType=12 +Width=46 +Height=46 + +[Image_Bangle] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=60 +Alpha=255 +PosType=0 +Left=242 +Top=41 +Width=50 +Height=50 + +[Image_Pants] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=65 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=93 + +[Image_Boots] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=67 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=145 + +[Image_Amulet] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=66 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=197 + +[Image_Pendant] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=57 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=249 + +[Image_LeftRing] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=61 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=301 + +[Image_RightRing] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=61 +Alpha=255 +PosType=0 +Width=50 +Height=50 +Left=242 +Top=353 + +[Box_Helm] +._WndType=Box +._Parent=Handle_Equip +Index=0 +Left=12 +Top=45 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=帽子 +$Tip=STR_EQUIP_HELM +TipRichText=0 +ShowTipType=0 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Helm_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +Left=12 +Top=93 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=帽子 +$Tip=STR_EQUIP_PNEDENT_HELM +TipRichText=0 +ShowTipType=0 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Chest] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=上衣 +$Tip=STR_EQUIP_CHEST +TipRichText=0 +ShowTipType=0 +Left=12 +Top=158 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Back_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +$Tip=STR_EQUIP_AMICE +EventID=525119 +TipRichText=0 +Width=44 +Height=44 +ShowTipType=0 +._Comment=背部挂件 +Left=12 +Top=205 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Waist] +._WndType=Box +._Parent=Handle_Equip +Index=0 +Left=12 +Top=315 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=腰带 +$Tip=STR_EQUIP_WAIST +TipRichText=0 +ShowTipType=0 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Waist_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=扩展类 +$Tip=STR_EQUIP_ENTEND +TipRichText=0 +ShowTipType=0 +Left=12 +Top=364 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Bangle] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=护腕 +$Tip=STR_EQUIP_BANGLE +TipRichText=0 +ShowTipType=0 +Left=244 +Top=42 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Pants] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=裤子 +$Tip=STR_EQUIP_PANTS +TipRichText=0 +ShowTipType=0 +Left=244 +Top=94 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Boots] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=鞋子 +$Tip=STR_EQUIP_BOOTS +TipRichText=0 +ShowTipType=0 +Left=244 +Top=146 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Amulet] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=项链 +$Tip=STR_EQUIP_AMULET +TipRichText=0 +ShowTipType=0 +Left=244 +Top=198 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_Pendant] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=饰品 +$Tip=STR_EQUIP_PENDANT +TipRichText=0 +ShowTipType=0 +Left=244 +Top=250 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_LeftRing] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=左戒指 +$Tip=STR_EQUIP_RING +TipRichText=0 +ShowTipType=0 +Left=244 +Top=302 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_RightRing] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_EQUIP_RING +TipRichText=0 +ShowTipType=0 +Left=244 +Top=354 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_Next1] +._WndType=Image +._Parent=Handle_Equip +Left=22 +Top=80 +PosType=0 +Image=ui\Image\UICommon\CommonPanel7.UITex +Frame=16 +Alpha=255 + +[Image_Next2] +._WndType=Image +._Parent=Handle_Equip +Left=22 +Top=193 +PosType=0 +Image=ui\Image\UICommon\CommonPanel7.UITex +Frame=16 +Alpha=255 + +[Image_Next3] +._WndType=Image +._Parent=Handle_Equip +Left=24 +Top=351 +PosType=0 +Image=ui\Image\UICommon\CommonPanel7.UITex +Frame=16 +Alpha=255 + +[Image_PF] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=3 +Alpha=255 +Left=11 +Top=252 +PosType=0 +Width=46 +Height=46 + +[Box_BackCloak_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_EQUIP_BACKCLOAK +TipRichText=0 +ShowTipType=0 +Left=12 +Top=253 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_JianR] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=7 +Alpha=255 +PosType=0 +Left=191 +Top=41 +Width=46 +Height=46 + +[Image_JianL] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=8 +Alpha=255 +PosType=0 +Left=61 +Top=44 +Width=46 +Height=46 + +[Box_LShoulder_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_EQUIP_ZUOJIAN +TipRichText=0 +ShowTipType=0 +Left=62 +Top=45 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_RShoulder_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_EQUIP_YOUJIAN +TipRichText=0 +ShowTipType=0 +Left=191 +Top=42 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_SpaicalPet] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=13 +Alpha=255 +PosType=0 +Left=191 +Top=197 +Width=46 +Height=46 + +[Box_PendantPet] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_EQUIP_PET +TipRichText=0 +ShowTipType=0 +Left=191 +Top=198 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_Bag] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=12 +Alpha=255 +PosType=0 +Left=61 +Top=157 +Width=46 +Height=46 + +[Box_Bag] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_BAOSHI +TipRichText=0 +ShowTipType=0 +Left=62 +Top=158 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Text_Helm] +._WndType=Text +._Parent=Handle_Equip +Left=11 +Top=70 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=100% +FontScheme=167 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_Chest] +._WndType=Text +._Parent=Handle_Equip +Left=11 +Top=182 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=70% +FontScheme=16 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_Waist] +._WndType=Text +._Parent=Handle_Equip +Left=11 +Top=339 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=30% +FontScheme=159 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_Bangle] +._WndType=Text +._Parent=Handle_Equip +Left=243 +Top=66 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=25% +FontScheme=8 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_Pants] +._WndType=Text +._Parent=Handle_Equip +Left=243 +Top=118 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=25% +FontScheme=8 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_Boots] +._WndType=Text +._Parent=Handle_Equip +Left=243 +Top=170 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=25% +FontScheme=8 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Box_Glasses] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +$Tip=STR_GLASSES +EventID=525119 +TipRichText=0 +Width=44 +Height=44 +ShowTipType=0 +._Comment=背部挂件 +Left=191 +Top=146 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Image_HandL] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=18 +Alpha=255 +PosType=0 +Left=61 +Top=93 +Width=46 +Height=46 + +[Image_HandR] +._WndType=Image +._Parent=Handle_Equip +Image=ui\Image\LootPanel\PlayerView.UITex +Frame=17 +Alpha=255 +PosType=0 +Left=191 +Top=93 +Width=46 +Height=46 + +[Box_LHand_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_LEFTHAND +TipRichText=0 +ShowTipType=0 +Left=62 +Top=94 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_RHand_Extend] +._WndType=Box +._Parent=Handle_Equip +Index=0 +PosType=0 +Width=44 +Height=44 +EventID=525119 +._Comment=右工时指 +$Tip=STR_RIGHTHAND +TipRichText=0 +ShowTipType=0 +Left=191 +Top=94 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Handle_Weapon] +._WndType=Handle +._Parent=Handle_ItemPage +HandleType=0 +FirstItemPosType=0 +Left=68 +Top=494 +PosType=0 +Width=196 +Height=52 + +[Image_LightSword] +._WndType=Image +._Parent=Handle_Weapon +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=64 +Alpha=255 +Left=0 +Top=0 +PosType=0 + +[Image_HeavySword] +._WndType=Image +._Parent=Handle_Weapon +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=77 +Alpha=255 +PosType=8 + +[Image_RangeWeapon] +._WndType=Image +._Parent=Handle_Weapon +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=58 +Alpha=255 +PosType=8 + +[Image_AmmoPouch] +._WndType=Image +._Parent=Handle_Weapon +Image=ui\Image\LootPanel\LootPanel.UITex +Frame=59 +Alpha=255 +PosType=0 +Left=155 +Top=12 + +[Box_LightSword] +._WndType=Box +._Parent=Handle_Weapon +Index=0 +Left=1 +Top=1 +PosType=0 +Width=48 +Height=48 +EventID=524607 +._Comment=近战武器 +$Tip=STR_EQUIP_MELEEWEAPON +TipRichText=0 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +IconID=0 + +[Box_HeavySword] +._WndType=Box +._Parent=Handle_Weapon +Index=0 +Left=53 +Top=1 +PosType=0 +Width=48 +Height=48 +EventID=524607 +._Comment=近战武器 +$Tip=STR_EQUIP_MELEEWEAPON +TipRichText=0 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +IconID=0 + +[Box_RangeWeapon] +._WndType=Box +._Parent=Handle_Weapon +Index=0 +Left=105 +Top=1 +PosType=0 +Width=48 +Height=48 +EventID=524607 +._Comment=远程武器 +$Tip=STR_EQUIP_RANGEWEAPON +TipRichText=0 +ShowTipType=0 +IconID=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 + +[Box_AmmoPouch] +._WndType=Box +._Parent=Handle_Weapon +Index=-1 +Left=157 +Top=13 +PosType=0 +Width=35 +Height=35 +EventID=524607 +._Comment=弹药 +$Tip=STR_EQUIP_AMMOPOUCH +TipRichText=0 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +IconID=0 + +[Text_LightSword] +._WndType=Text +._Parent=Handle_Weapon +Left=3 +Top=28 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=30% +FontScheme=159 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_HeavySword] +._WndType=Text +._Parent=Handle_Weapon +Left=56 +Top=28 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=30% +FontScheme=159 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_RangeWeapon] +._WndType=Text +._Parent=Handle_Weapon +Left=107 +Top=28 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=30% +FontScheme=159 +FontColor= +Width=42 +Height=20 +HAlign=2 +VAlign=1 + +[Text_RoleName] +._WndType=Text +._Parent=Handle_ItemPage +Left=86 +Top=382 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=147 +Height=23 +HAlign=1 +VAlign=1 +OrgText=1 +$Text=茗伊@白帝城(110) +FontScheme=162 +FontColor= + +[Text_RoleInfo] +._WndType=Text +._Parent=Handle_ItemPage +Left=86 +Top=408 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=纯阳·成男 +Width=147 +Height=23 +HAlign=1 +VAlign=1 + +[Text_EquipScore] +._WndType=Text +._Parent=Handle_ItemPage +Left=86 +Top=434 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=147 +Height=23 +OrgText=1 +$Text=装备分数:12345 +VAlign=1 +HAlign=1 +FontScheme=162 +FontColor= + +[WndScroll_PageNum] +._WndType=WndScroll +._Parent=Wnd_ItemPage +Left=0 +Top=20 +Width=335 +Height=30 + +[WndContainer_PageNum] +._WndType=WndContainer +._Parent=WndScroll_PageNum +Left=0 +Top=0 +Width=335 +Height=30 +ContainerType=1 +HAlign=1 +VAlign=1 + +[Wnd_PageNum] +._WndType=WndWindow +._Parent=WndContainer_PageNum +Left=0 +Top=0 +Width=35 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[CheckBox_PageNum] +._WndType=WndCheckBox +._Parent=Wnd_PageNum +Frame=0 +Left=0 +Top=0 +Width=20 +Height=30 +UnCheckAndEnable=16 +CheckAndEnable=19 +UnCheckAndDisable=18 +CheckAndDisable=19 +UnCheckedAndEnableWhenMouseOver=17 +CheckedAndEnableWhenMouseOver=19 +CheckedAndDisableWhenMouseOver=17 +UnCheckedAndDisableWhenMouseOver=18 +Checking=16 +UnChecking=19 +Image=ui\Image\UICommon\CommonPanel7.UITex +UncheckFont=162 +CheckFont=162 +MouseOverFont=162 +MouseDownFont=162 +DisableFont=161 +RadioButton=1 + +[Handle_PageNum] +._WndType=Handle +._Parent=CheckBox_PageNum +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-1 +PosType=0 +Width=30 +Height=30 +EventID=256 + +[Text_PageNum] +._WndType=Text +._Parent=Handle_PageNum +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=14 +Top=14 +PosType=0 +Width=15 +Height=15 +HAlign=1 +VAlign=1 +FontScheme=7 +OrgText=1 + +[Wnd_PageNum_0] +._WndType=WndWindow +._Parent=WndContainer_PageNum +Left=0 +Top=0 +Width=35 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[CheckBox_PageNum_0] +._WndType=WndCheckBox +._Parent=Wnd_PageNum_0 +Frame=0 +Left=0 +Top=0 +Width=20 +Height=30 +UnCheckAndEnable=16 +CheckAndEnable=19 +UnCheckAndDisable=18 +CheckAndDisable=19 +UnCheckedAndEnableWhenMouseOver=17 +CheckedAndEnableWhenMouseOver=19 +CheckedAndDisableWhenMouseOver=17 +UnCheckedAndDisableWhenMouseOver=18 +Checking=16 +UnChecking=19 +Image=ui\Image\UICommon\CommonPanel7.UITex +UncheckFont=162 +CheckFont=162 +MouseOverFont=162 +MouseDownFont=162 +DisableFont=161 +RadioButton=1 + +[Handle_PageNum_0] +._WndType=Handle +._Parent=CheckBox_PageNum_0 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-1 +PosType=0 +Width=30 +Height=30 +EventID=256 + +[Text_PageNum_0] +._WndType=Text +._Parent=Handle_PageNum_0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=14 +Top=14 +PosType=0 +Width=15 +Height=15 +HAlign=1 +VAlign=1 +FontScheme=7 +OrgText=1 + +[Wnd_PageNum_1] +._WndType=WndWindow +._Parent=WndContainer_PageNum +Left=0 +Top=0 +Width=35 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[CheckBox_PageNum_0_0] +._WndType=WndCheckBox +._Parent=Wnd_PageNum_1 +Frame=0 +Left=0 +Top=0 +Width=20 +Height=30 +UnCheckAndEnable=16 +CheckAndEnable=19 +UnCheckAndDisable=18 +CheckAndDisable=19 +UnCheckedAndEnableWhenMouseOver=17 +CheckedAndEnableWhenMouseOver=19 +CheckedAndDisableWhenMouseOver=17 +UnCheckedAndDisableWhenMouseOver=18 +Checking=16 +UnChecking=19 +Image=ui\Image\UICommon\CommonPanel7.UITex +UncheckFont=162 +CheckFont=162 +MouseOverFont=162 +MouseDownFont=162 +DisableFont=161 +RadioButton=1 + +[Handle_PageNum_0_0] +._WndType=Handle +._Parent=CheckBox_PageNum_0_0 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-1 +PosType=0 +Width=30 +Height=30 +EventID=256 + +[Text_PageNum_0_0] +._WndType=Text +._Parent=Handle_PageNum_0_0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=14 +Top=14 +PosType=0 +Width=15 +Height=15 +HAlign=1 +VAlign=1 +FontScheme=7 +OrgText=1 + +[Wnd_PageNum_2] +._WndType=WndWindow +._Parent=WndContainer_PageNum +Left=0 +Top=0 +Width=35 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[CheckBox_PageNum_0_1] +._WndType=WndCheckBox +._Parent=Wnd_PageNum_2 +Frame=0 +Left=0 +Top=0 +Width=20 +Height=30 +UnCheckAndEnable=16 +CheckAndEnable=19 +UnCheckAndDisable=18 +CheckAndDisable=19 +UnCheckedAndEnableWhenMouseOver=17 +CheckedAndEnableWhenMouseOver=19 +CheckedAndDisableWhenMouseOver=17 +UnCheckedAndDisableWhenMouseOver=18 +Checking=16 +UnChecking=19 +Image=ui\Image\UICommon\CommonPanel7.UITex +UncheckFont=162 +CheckFont=162 +MouseOverFont=162 +MouseDownFont=162 +DisableFont=161 +RadioButton=1 + +[Handle_PageNum_0_1] +._WndType=Handle +._Parent=CheckBox_PageNum_0_1 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=-1 +PosType=0 +Width=30 +Height=30 +EventID=256 + +[Text_PageNum_0_1] +._WndType=Text +._Parent=Handle_PageNum_0_1 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=1 +Left=14 +Top=14 +PosType=0 +Width=15 +Height=15 +HAlign=1 +VAlign=1 +FontScheme=7 +OrgText=1 + +[WndScroll_EquipInfo] +._WndType=WndScroll +._Parent=Wnd_ItemPage +Left=325 +Top=12 +Width=437 +Height=555 +ScrollHandle=Handle_EquipInfo +ScrollContainer= +VerScrollBar=Scroll_EquipInfo +ScrollButtonUp=WndButton_EquipInfoUp +ScrollButtonDown=WndButton_EquipInfoDown + +[Handle_ScrollEquipInfo] +._WndType=Handle +._Parent=WndScroll_EquipInfo +Left=0 +Top=0 +Width=422 +Height=555 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_EquipInfo] +._WndType=Image +._Parent=Handle_ScrollEquipInfo +Left=0 +Top=0 +Width=422 +Height=555 +Image=UI/Image/Minimap/Minimap2.UITex +Frame=8 +Alpha=255 +PosType=0 + +[Handle_EquipInfo] +._WndType=Handle +._Parent=Handle_ScrollEquipInfo +Left=12 +Top=6 +PosType=0 +HandleType=3 +Width=398 +Height=543 +RowSpacing=0 +VAlign=1 +PixelScroll=1 + +[Text_EquipInfoExport] +._WndType=Text +._Parent=Handle_ScrollEquipInfo +Left=316 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=150 +OrgText=1 +$Text=EXPORT +HAlign=2 +EventID=789 +Width=100 +Height=30 + +[WndButton_EquipInfoUp] +._WndType=WndButton +._Parent=WndScroll_EquipInfo +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=50 +DisableGroup=49 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[WndButton_EquipInfoDown] +._WndType=WndButton +._Parent=WndScroll_EquipInfo +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=69 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=46 +DisableGroup=53 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Scroll_EquipInfo] +._WndType=WndNewScrollBar +._Parent=WndScroll_EquipInfo +StepCount=0 +PageStepCount=7 +Left=422 +Top=0 +Width=15 +Height=555 +Type=1 +SlideBtn=WndButton_Scroll_Name_0 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[WndButton_Scroll_EquipInfo] +._WndType=WndButton +._Parent=Scroll_EquipInfo +Left=0 +Top=0 +Width=15 +Height=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Alpha=150 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_RoleEntry.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_RoleEntry.ini new file mode 100644 index 000000000..e2275bf7c --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_RoleEntry.ini @@ -0,0 +1,48 @@ +[MY_RoleStatistics_RoleEntry] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=20 +Height=20 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 + +[Btn_MY_RoleStatistics_RoleEntry] +._WndType=WndButton +._Parent=MY_RoleStatistics_RoleEntry +Left=0 +Top=0 +Width=20 +Height=20 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\SystemButton.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=12 +MouseOverGroup=13 +MouseDownGroup=14 +DisableGroup=15 +Alpha=255 +ShowTipType=0 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_TaskEntry.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_TaskEntry.ini new file mode 100644 index 000000000..a4ee2b226 --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_TaskEntry.ini @@ -0,0 +1,48 @@ +[MY_RoleStatistics_TaskEntry] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=20 +Height=20 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 + +[Btn_MY_RoleStatistics_TaskEntry] +._WndType=WndButton +._Parent=MY_RoleStatistics_TaskEntry +Left=0 +Top=0 +Width=20 +Height=20 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\SystemButton.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=16 +MouseOverGroup=17 +MouseDownGroup=18 +DisableGroup=19 +Alpha=255 +ShowTipType=0 + diff --git a/MY_RoleStatistics/ui/MY_RoleStatistics_TaskStat.ini b/MY_RoleStatistics/ui/MY_RoleStatistics_TaskStat.ini new file mode 100644 index 000000000..3cf662782 --- /dev/null +++ b/MY_RoleStatistics/ui/MY_RoleStatistics_TaskStat.ini @@ -0,0 +1,97 @@ +[MY_RoleStatistics_TaskStat] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=20 +Top=20 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_RoleStatistics_TaskStat +Left=0 +Top=0 +Width=1000 +Height=633 +DummyWnd=0 +Frame=0 + +[Wnd_Search] +._WndType=WndWindow +._Parent=Wnd_Total +Left=20 +Top=20 +Width=420 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Search] +._WndType=Handle +._Parent=Wnd_Search +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=195 +Height=25 + +[Image_SearchBg] +._WndType=Image +._Parent=Handle_Search +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=420 +Height=25 +ImageType=10 + +[Image_Search] +._WndType=Image +._Parent=Handle_Search +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=391 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_Search] +._WndType=WndEdit +._Parent=Wnd_Search +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=7 +Top=3 +Width=388 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=输入回车键搜索... +OrgPlaceholder=1 +PlaceholderAlpha=150 + diff --git a/MY_RollMonitor/info.ini b/MY_RollMonitor/info.ini new file mode 100644 index 000000000..9784041dd --- /dev/null +++ b/MY_RollMonitor/info.ini @@ -0,0 +1,8 @@ +[MY_RollMonitor] +name=摇点监控 +desc=监控队友摇点记录,支持多种记录方式 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_RollMonitor.lua +package=MY diff --git a/MY_RollMonitor/info.ini.zh_TW b/MY_RollMonitor/info.ini.zh_TW new file mode 100644 index 000000000..68a9f1c7b --- /dev/null +++ b/MY_RollMonitor/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_RollMonitor] +name=鎼栭粸鐩f帶 +desc=鐩f帶闅婂弸鎼栭粸瑷橀寗锛屾敮鎸佸绋閷勬柟寮 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_RollMonitor.lua +package=MY diff --git a/MY_RollMonitor/lang/zhcn.jx3dat b/MY_RollMonitor/lang/zhcn.jx3dat new file mode 100644 index 000000000..fba32dfe6 --- /dev/null +++ b/MY_RollMonitor/lang/zhcn.jx3dat @@ -0,0 +1,31 @@ +return { + -- MY_RollMon.lua + ['MY_RollMonitor'] = '点数监控', + ['roll monitor'] = '点数监控', + ['restart'] = '重新开始', + ['publish'] = '发布', + ['publish setting'] = '发布设置', + ['publish channel'] = '发布频道', + ['publish while restart'] = '重新开始时喊话', + ['publish top %d'] = '发布前%d名', + ['publish all'] = '发布所有', + ['----------- roll restart -----------'] = '———— 记录已清空 掷骰重新开始 ————', + ['-------------------------------'] = '————————————————————', + ['left click to publish, right click to open setting.'] = '左键发布,右键设置。', + ['left click to restart, right click to open setting.'] = '左键重新开始,右键设置。', + ['ROLL_MONITOR_EXP'] = '"([^"]*)掷出(%d+)点。%(1 %- 100%)"', + ['record mode'] = '记录模式', + ['valid time'] = '有效时间', + ['only first score'] = '只记录第一次', + ['only last score'] = '只记录最后一次', + ['highest score'] = '多次摇点取最高点', + ['lowest score'] = '多次摇点取最低点', + ['average score'] = '多次摇点取平均值', + ['average score with out pole'] = '去掉最高最低取平均值', + ['haven\'t roll yet.'] = '尚未掷骰子。', + ['[%s] rolls for %d times, valid score is %s.'] = '[%s]掷了%d次骰子,有效点数为%s。', + [' rolls for %d times, valid score is %s.'] = '掷了%d次骰子,有效点数为%s。', + ['publish unroll'] = '发布未掷骰名单', + ['last %d minute(s)'] = '最近%d分钟', + ['unlimited time'] = '不限时间', +} diff --git a/MY_RollMonitor/lang/zhtw.jx3dat b/MY_RollMonitor/lang/zhtw.jx3dat new file mode 100644 index 000000000..b26665d90 --- /dev/null +++ b/MY_RollMonitor/lang/zhtw.jx3dat @@ -0,0 +1,31 @@ +return { + -- MY_RollMon.lua + ['MY_RollMonitor'] = '榛炴暩鐩f帶', + ['roll monitor'] = '榛炴暩鐩f帶', + ['restart'] = '閲嶆柊闁嬪', + ['publish'] = '鐧间綀', + ['publish setting'] = '鐧间綀瑷疆', + ['publish channel'] = '鐧间綀闋婚亾', + ['publish while restart'] = '閲嶆柊闁嬪鏅傚枈瑭', + ['publish top %d'] = '鐧间綀鍓%d鍚', + ['publish all'] = '鐧间綀鎵鏈', + ['----------- roll restart -----------'] = '鈥斺斺斺 瑷橀寗宸叉竻绌 鎿查閲嶆柊闁嬪 鈥斺斺斺', + ['-------------------------------'] = '鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺', + ['left click to publish, right click to open setting.'] = '宸﹂嵉鐧间綀锛屽彸閸佃ō缃', + ['left click to restart, right click to open setting.'] = '宸﹂嵉閲嶆柊闁嬪锛屽彸閸佃ō缃', + ['ROLL_MONITOR_EXP'] = '"([^"]*)鎿插嚭(%d+)榛炪%(1 %- 100%)"', + ['record mode'] = '瑷橀寗妯″紡', + ['valid time'] = '鏈夋晥鏅傞枔', + ['only first score'] = '鍙閷勭涓娆', + ['only last score'] = '鍙閷勬渶寰屼竴娆', + ['highest score'] = '澶氭鎼栭粸鍙栨渶楂橀粸', + ['lowest score'] = '澶氭鎼栭粸鍙栨渶浣庨粸', + ['average score'] = '澶氭鎼栭粸鍙栧钩鍧囧', + ['average score with out pole'] = '鍘绘帀鏈楂樻渶浣庡彇骞冲潎鍊', + ['haven\'t roll yet.'] = '灏氭湭鎿查瀛愩', + ['[%s] rolls for %d times, valid score is %s.'] = '[%s]鎿蹭簡%d娆¢瀛愶紝鏈夋晥榛炴暩鐐%s銆', + [' rolls for %d times, valid score is %s.'] = '鎿蹭簡%d娆¢瀛愶紝鏈夋晥榛炴暩鐐%s銆', + ['publish unroll'] = '鐧间綀鏈摬楠板悕鍠', + ['last %d minute(s)'] = '鏈杩%d鍒嗛悩', + ['unlimited time'] = '涓嶉檺鏅傞枔', +} diff --git a/MY_RollMonitor/src/MY_RollMonitor.lua b/MY_RollMonitor/src/MY_RollMonitor.lua new file mode 100644 index 000000000..b5f14876d --- /dev/null +++ b/MY_RollMonitor/src/MY_RollMonitor.lua @@ -0,0 +1,552 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : ROLL点监控 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_RollMonitor/MY_RollMonitor' +local PLUGIN_NAME = 'MY_RollMonitor' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_RollMonitor' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local SORT_TYPE = { + FIRST = 1, -- 只记录第一次 + LAST = 2, -- 只记录最后一次 + MAX = 3, -- 多次摇点取最高点 + MIN = 4, -- 多次摇点取最低点 + AVG = 5, -- 多次摇点取平均值 + AVG2 = 6, -- 去掉最高最低取平均值 +} +local SORT_TYPE_LIST = { + SORT_TYPE.FIRST, SORT_TYPE.LAST, SORT_TYPE.MAX, + SORT_TYPE.MIN , SORT_TYPE.AVG , SORT_TYPE.AVG2, +} +local SORT_TYPE_INFO = { + [SORT_TYPE.FIRST] = { -- 只记录第一次 + szName = _L['only first score'], + fnCalc = function(aRecord, nIndex1, nIndex2) + return aRecord[nIndex1].nRoll + end + }, + [SORT_TYPE.LAST] = { -- 只记录最后一次 + szName = _L['only last score'], + fnCalc = function(aRecord, nIndex1, nIndex2) + return aRecord[nIndex2].nRoll + end + }, + [SORT_TYPE.MAX] = { -- 多次摇点取最高点 + szName = _L['highest score'], + fnCalc = function(aRecord, nIndex1, nIndex2) + local nRoll = 0 + for i = nIndex1, nIndex2 do + nRoll = math.max(nRoll, aRecord[i].nRoll) + end + return nRoll + end + }, + [SORT_TYPE.MIN] = { -- 多次摇点取最低点 + szName = _L['lowest score'], + fnCalc = function(aRecord, nIndex1, nIndex2) + local nRoll = 0 + for i = nIndex1, nIndex2 do + nRoll = math.min(nRoll, aRecord[i].nRoll) + end + return nRoll + end + }, + [SORT_TYPE.AVG] = { -- 多次摇点取平均值 + szName = _L['average score'], + fnCalc = function(aRecord, nIndex1, nIndex2) + local nRoll = 0 + for i = nIndex1, nIndex2 do + nRoll = nRoll + aRecord[i].nRoll + end + return nRoll / (nIndex2 - nIndex1 + 1) + end + }, + [SORT_TYPE.AVG2] = { -- 去掉最高最低取平均值 + szName = _L['average score with out pole'], + fnCalc = function(aRecord, nIndex1, nIndex2) + local nTotal, nMax, nMin = 0, 0, 0 + local nCount = nIndex2 - nIndex1 + 1 + for i = nIndex1, nIndex2 do + local nRoll = aRecord[i].nRoll + nMin = math.min(nMin, nRoll) + nMax = math.max(nMax, nRoll) + nTotal = nTotal + nRoll + end + if nCount > 2 then + nCount = nCount - 2 + nTotal = nTotal - nMax - nMin + end + return nTotal / nCount + end + }, +} +local PUBLISH_CHANNELS = { + { nChannel = PLAYER_TALK_CHANNEL.TEAM, szName = _L['PTC_TEAM_CHANNEL'], rgb = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.RAID, szName = _L['PTC_RAID_CHANNEL'], rgb = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.TONG, szName = _L['PTC_TONG_CHANNEL'], rgb = GetMsgFontColor('MSG_GUILD' , true) }, +} +local TIME_LIMIT = {-1, 60, 120, 180, 300, 600, 1200, 1800, 3600} +local TIME_LIMIT_TITLE = { + [-1 ] = _L['unlimited time'], + [60 ] = _L('last %d minute(s)', 1), + [120 ] = _L('last %d minute(s)', 2), + [180 ] = _L('last %d minute(s)', 3), + [300 ] = _L('last %d minute(s)', 5), + [600 ] = _L('last %d minute(s)', 10), + [1200] = _L('last %d minute(s)', 20), + [1800] = _L('last %d minute(s)', 30), + [3600] = _L('last %d minute(s)', 60), +} +local PS = { nPriority = 3 } +local m_uiBoard -- 面板ui控件 +local m_tRecords = {} -- 历史ROLL点详细记录 +local m_aRecTime = {} -- 新纪录的时间戳(用来重绘面板) +--[[ +m_tRecords = { + ['茗伊'] = { + szName = '茗伊', + {nTime = 1446516554, nRoll = 100}, + {nTime = 1446516577, nRoll = 50 }, + }, ... +} +]] +local O = X.CreateUserSettingsModule('MY_RollMonitor', _L['General'], { + nSortType = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['record mode'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + nTimeLimit = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['valid time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = -1, + }, + nPublish = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['publish setting'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + nPublishChannel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['publish channel'], + }), + xSchema = X.Schema.Number, + xDefaultValue = PLAYER_TALK_CHANNEL.RAID, + }, + bPublishUnroll = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['publish unroll'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPublishRestart = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_RollMonitor'], + szDescription = X.MakeCaption({ + _L['publish while restart'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +-- 事件响应处理 +-- 打开面板 +-- (void) D.OpenPanel() +function D.OpenPanel() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('RollMonitor') +end + +-- 清空ROLL点 +-- (void) D.Clear(nChannel, bEcho) +-- (boolean) bEcho : 是否发送重新开始聊天消息 +-- (number) nChannel: 发送频道 +function D.Clear(bEcho, nChannel) + if bEcho == nil then + bEcho = O.bPublishRestart + end + if bEcho then + nChannel = nChannel or O.nPublishChannel + X.SendChat(nChannel, _L['----------- roll restart -----------'] .. '\n') + end + m_tRecords = {} + D.DrawBoard() +end + +-- 获得个人ROLL点结果 +-- D.GetPersonResult(szName, nSortType, nTimeLimit) +-- D.GetPersonResult(aRecord, nSortType, nTimeLimit) +-- (string) szName : 要获取的玩家名字 +-- (table) aRecord : 要获取的原始数据 +-- (SORT_TYPE) nSortType : 排序方式 值参见枚举 +-- (number) nTimeLimit : 监测时间限制 如最近5分钟则传300 +function D.GetPersonResult(szName, nSortType, nTimeLimit) + -- 格式化参数 + nSortType = nSortType or O.nSortType + nTimeLimit = nTimeLimit or O.nTimeLimit + local nStartTime = 0 + if nTimeLimit > 0 then + nStartTime = GetCurrentTime() - nTimeLimit + end + local aRecord + if type(szName) == 'table' then + aRecord = szName + else + aRecord = m_tRecords[szName] or X.CONSTANT.EMPTY_TABLE + end + -- 计算有效Roll点数组下标 + local aTime = {} + local nIndex1, nIndex2 = 0, #aRecord + for i, rec in ipairs(aRecord) do + if rec.nTime < nStartTime then + nIndex1 = i + else + table.insert(aTime, rec.nTime) + end + end + nIndex1 = nIndex1 + 1 + if nIndex1 > nIndex2 then + return + end + local t = { + szName = aRecord.szName, + nRoll = SORT_TYPE_INFO[nSortType].fnCalc(aRecord, nIndex1, nIndex2), + nCount = nIndex2 - nIndex1 + 1, + aTime = aTime, + } + return t +end + +-- 获得全部排序结果 +-- (void) D.GetResult(nSortType, nTimeLimit) +-- (SORT_TYPE) nSortType : 排序方式 值参见枚举 +-- (number) nTimeLimit : 监测时间限制 如最近5分钟则传300(-1表示不限时) +function D.GetResult(nSortType, nTimeLimit) + -- 格式化参数 + nSortType = nSortType or O.nSortType + nTimeLimit = nTimeLimit or O.nTimeLimit + -- 获取结果并排序 + local t = {} + for _, aRecord in pairs(m_tRecords) do + aRecord = D.GetPersonResult(aRecord, nSortType, nTimeLimit) + if aRecord then + table.insert(t, aRecord) + end + end + table.sort(t, function(v1, v2) return v1.nRoll > v2.nRoll end) + return t +end + +-- 发布ROLL点 +-- (void) D.Echo(nSortType, nLimit, nChannel, bShowUnroll) +-- (enum) nSortType : 排序方式 枚举[SORT_TYPE] +-- (number) nLimit : 最大显示条数限制 +-- (number) nChannel : 发送频道 +-- (boolean) bShowUnroll: 是否显示未ROLL点 +function D.Echo(nSortType, nLimit, nChannel, bShowUnroll) + if bShowUnroll == nil then + bShowUnroll = O.bPublishUnroll + end + nSortType = nSortType or O.nSortType + nLimit = nLimit or O.nPublish + nChannel = nChannel or O.nPublishChannel + + X.SendChat(nChannel, ('[%s][%s][%s]%s\n'):format( + X.PACKET_INFO.SHORT_NAME, _L['roll monitor'], + TIME_LIMIT_TITLE[O.nTimeLimit], + SORT_TYPE_INFO[nSortType].szName + ), { parsers = { name = false } }) + X.SendChat(nChannel, _L['-------------------------------'] .. '\n') + local tNames = {} + for i, aRecord in ipairs(D.GetResult(nSortType)) do + if nLimit <= 0 or i <= nLimit then + X.SendChat(nChannel, _L('[%s] rolls for %d times, valid score is %s.', aRecord.szName, aRecord.nCount, string.gsub(aRecord.nRoll, '(%d+%.%d%d)%d+','%1')) .. '\n') + end + tNames[aRecord.szName] = true + end + local team = GetClientTeam() + if team and bShowUnroll then + local szUnrolledNames = '' + for _, dwID in ipairs(team.GetTeamMemberList()) do + local szName = team.GetClientTeamMemberName(dwID) + if not tNames[szName] then + szUnrolledNames = szUnrolledNames .. '[' .. szName .. ']' + end + end + if szUnrolledNames~='' then + X.SendChat(nChannel, szUnrolledNames .. _L['haven\'t roll yet.']..'\n') + end + end + X.SendChat(nChannel, _L['-------------------------------'] .. '\n') +end + +-- 重新绘制结果显示区域 +-- (void) D.DrawBoard(ui uiBoard) +function D.DrawBoard(ui) + if not ui then + ui = m_uiBoard + end + m_aRecTime = {} + if ui then + local szMsg = '' + local tNames = {} + for _, aRecord in ipairs(D.GetResult()) do + szMsg = szMsg .. + X.GetChatCopyXML() .. + GetFormatText('['..aRecord.szName..']', nil, nil, nil, nil, 515, nil, 'namelink_0') .. + GetFormatText(_L( ' rolls for %d times, valid score is %s.', aRecord.nCount, (string.gsub(aRecord.nRoll,'(%d+%.%d%d)%d+','%1')) ) .. '\n') + for _, nTime in ipairs(aRecord.aTime) do + table.insert(m_aRecTime, nTime) + end + tNames[aRecord.szName] = true + end + table.sort(m_aRecTime) + local team = GetClientTeam() + if team then + local szUnrolledNames = '' + for _, dwID in ipairs(team.GetTeamMemberList()) do + local szName = team.GetClientTeamMemberName(dwID) + if not tNames[szName] then + szUnrolledNames = szUnrolledNames .. GetFormatText('['..szName..']', nil, nil, nil, nil, 515, nil, 'namelink_0') + end + end + if szUnrolledNames ~= '' then + szMsg = szMsg .. + X.GetChatCopyXML() .. + szUnrolledNames .. GetFormatText(_L['haven\'t roll yet.']) + end + end + szMsg = X.RenderChatLink(szMsg) + if MY_ChatEmotion and MY_ChatEmotion.Render then + szMsg = MY_ChatEmotion.Render(szMsg) + end + if MY_Farbnamen and MY_Farbnamen.Render then + szMsg = MY_Farbnamen.Render(szMsg) + end + ui:Clear():Append(szMsg) + end +end + +-- 检查是否需要重绘 如需重绘则重新绘制 +local function CheckBoardRedraw() + if m_aRecTime[1] + and m_aRecTime[1] < GetCurrentTime() then + D.DrawBoard() + end +end + +-- 系统频道监控处理函数 +local function OnMsgArrive(szMsg, nFont, bRich, r, g, b) + local isRoll = false + for szName, nRoll in string.gmatch(szMsg, _L['ROLL_MONITOR_EXP'] ) do + -- 格式化数值 + nRoll = tonumber(nRoll) + if not nRoll then + return + end + isRoll = true + -- 判断缓存中该玩家是否已存在记录 + if not m_tRecords[szName] then + m_tRecords[szName] = { szName = szName } + end + local aRecord = m_tRecords[szName] + -- 格式化数组 更新各数值 + table.insert(m_aRecTime, GetCurrentTime()) + table.insert(aRecord, {nTime = GetCurrentTime(), nRoll = nRoll}) + end + if not isRoll then + return + end + D.DrawBoard() +end +RegisterMsgMonitor(OnMsgArrive, {'MSG_SYS'}) + + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RollMonitor', + exports = { + { + fields = { + OpenPanel = D.OpenPanel, + Clear = D.Clear, + }, + }, + }, +} +MY_RollMonitor = X.CreateModule(settings) +end + + +-- 标签激活响应函数 +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + -- 记录模式 + ui:Append('WndComboBox', { + x = 20, y = 10, w = 180, + text = SORT_TYPE_INFO[O.nSortType].szName, + menu = function() + local t = {} + local el = this + for _, nSortType in ipairs(SORT_TYPE_LIST) do + table.insert(t, { + szOption = SORT_TYPE_INFO[nSortType].szName, + fnAction = function() + O.nSortType = nSortType + D.DrawBoard() + X.UI(el):Text(SORT_TYPE_INFO[nSortType].szName) + return 0 + end, + }) + end + return t + end + }) + -- 有效时间 + ui:Append('WndComboBox', { + x = 210, y = 10, w = 120, + text = TIME_LIMIT_TITLE[O.nTimeLimit], + menu = function() + local t = {} + local el = this + for _, nSec in ipairs(TIME_LIMIT) do + table.insert(t, { + szOption = TIME_LIMIT_TITLE[nSec], + fnAction = function() + X.UI(el):Text(TIME_LIMIT_TITLE[nSec]) + O.nTimeLimit = nSec + D.DrawBoard() + return 0 + end, + }) + end + return t + end + }) + -- 清空 + ui:Append('WndButton', { + x = nW - 176, y = 10, w = 90, text = _L['restart'], + onLClick = function(nButton) D.Clear() end, + menuRClick = function() + local t = {{ + szOption = _L['publish while restart'], + bCheck = true, bMCheck = false, bChecked = O.bPublishRestart, + fnAction = function() O.bPublishRestart = not O.bPublishRestart end, + }, { bDevide = true }} + for _, tChannel in ipairs(PUBLISH_CHANNELS) do + table.insert(t, { + szOption = tChannel.szName, + rgb = tChannel.rgb, + bCheck = true, bMCheck = true, bChecked = O.nPublishChannel == tChannel.nChannel, + fnAction = function() + O.nPublishChannel = tChannel.nChannel + end + }) + end + return t + end, + tip = { + render = _L['left click to restart, right click to open setting.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }) + -- 发布 + ui:Append('WndButton', { + x = nW - 86, y = 10, w = 80, text = _L['publish'], + onLClick = function() D.Echo() end, + menuRClick = function() + local t = { { + szOption = _L['publish setting'], { + bCheck = true, bMCheck = true, bChecked = O.nPublish == 3, + fnAction = function() O.nPublish = 3 end, + szOption = _L('publish top %d', 3) + }, { + bCheck = true, bMCheck = true, bChecked = O.nPublish == 5, + fnAction = function() O.nPublish = 5 end, + szOption = _L('publish top %d', 5) + }, { + bCheck = true, bMCheck = true, bChecked = O.nPublish == 10, + fnAction = function() O.nPublish = 10 end, + szOption = _L('publish top %d', 10) + }, { + bCheck = true, bMCheck = true, bChecked = O.nPublish == 0, + fnAction = function() O.nPublish = 0 end, + szOption = _L['publish all'] + }, { bDevide = true }, { + bCheck = true, bChecked = O.bPublishUnroll, + fnAction = function() O.bPublishUnroll = not O.bPublishUnroll end, + szOption = _L['publish unroll'] + } + }, { bDevide = true } } + for _, tChannel in ipairs(PUBLISH_CHANNELS) do + table.insert( t, { + szOption = tChannel.szName, + rgb = tChannel.rgb, + bCheck = true, bMCheck = true, bChecked = O.nPublishChannel == tChannel.nChannel, + fnAction = function() + O.nPublishChannel = tChannel.nChannel + end + } ) + end + return t + end, + tip = { + render = _L['left click to publish, right click to open setting.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + offset = { x = -80 }, + }, + }) + -- 输出板 + m_uiBoard = ui:Append('WndScrollHandleBox',{ + x = 20, y = 40, w = nW - 26, h = nH - 60, + handleStyle = 3, text = _L['average score with out pole'] + }) + D.DrawBoard() + X.BreatheCall('MY_RollMonitorRedraw', 1000, CheckBoardRedraw) +end + +function PS.OnPanelDeactive() + m_uiBoard = nil + X.BreatheCall('MY_RollMonitorRedraw', false) +end + +X.Panel.Register(_L['General'], 'RollMonitor', _L['roll monitor'], 287, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ScreenShot/info.ini b/MY_ScreenShot/info.ini new file mode 100644 index 000000000..8c79b3565 --- /dev/null +++ b/MY_ScreenShot/info.ini @@ -0,0 +1,8 @@ +[MY_ScreenShot] +name=截图助手 +desc=提供品质调节和截图文件夹设置 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_ScreenShot.lua +package=MY diff --git a/MY_ScreenShot/info.ini.zh_TW b/MY_ScreenShot/info.ini.zh_TW new file mode 100644 index 000000000..df57f391f --- /dev/null +++ b/MY_ScreenShot/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_ScreenShot] +name=鎴湒鍔╂墜 +desc=鎻愪緵鍝佽唱瑾跨瘈鍜屾埅鍦栨枃浠跺ぞ瑷疆 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_ScreenShot.lua +package=MY diff --git a/MY_ScreenShot/lang/zhcn.jx3dat b/MY_ScreenShot/lang/zhcn.jx3dat new file mode 100644 index 000000000..15101977f --- /dev/null +++ b/MY_ScreenShot/lang/zhcn.jx3dat @@ -0,0 +1,23 @@ +return { + ['MY_ScreenShot'] = '截图助手', + ['screenshot helper'] = '截图助手', + + ['auto hide ui while shot screen'] = '截图自动隐藏游戏界面', + ['Check it if you want to hide ui automatic.'] = '勾选该项则截图时自动隐藏游戏界面。', + ['file format'] = '截图格式', + ['set quality (0-100)'] = '设置截图精度(0-100)', + ['Set screenshot quality(0-100): the larger number, the image will use more hdd space.'] = '设置截图精度(0-100):越大越清晰,图片也会越占空间。', + ['set folder'] = '截图文件夹', + ['Set destination folder which screenshot file will be saved. Absolute path required.\nEx: D:/JX3_ScreenShot/\nAttention: let it blank will save screenshot to default folder.'] = '设置截图文件夹,截图文件将保存到设置的目录中,仅支持绝对路径。\n如:D:/剑网三截图文件夹/\n注:为空则保存到默认文件夹', + + ['shotscreen'] = '截图', + ['shotscreen without ui'] = '隐藏游戏界面截图', + ['shotscreen with ui'] = '显示游戏界面截图', + + ['Shot screen succeed, file saved as %s .'] = '截图成功,文件已保存:%s', + ['Shotscreen destination folder error: %s not exist. File has been save to default folder.'] = '截图文件夹设置错误:%s目录不存在。截图将保存到默认文件夹。', + + ['>> Set hotkey <<'] = '>> 设置快捷键 <<', + ['set default screenshot tool'] = '设置为默认截图工具', + ['as default already'] = '已设为默认截图工具', +} diff --git a/MY_ScreenShot/lang/zhtw.jx3dat b/MY_ScreenShot/lang/zhtw.jx3dat new file mode 100644 index 000000000..543de9c1d --- /dev/null +++ b/MY_ScreenShot/lang/zhtw.jx3dat @@ -0,0 +1,23 @@ +return { + ['MY_ScreenShot'] = '鎴湒鍔╂墜', + ['screenshot helper'] = '鎴湒鍔╂墜', + + ['auto hide ui while shot screen'] = '鎴湒鑷嫊闅辫棌娓告埐鐣岄潰', + ['Check it if you want to hide ui automatic.'] = '鍕鹃伕瑭查爡鍓囨埅鍦栨檪鑷嫊闅辫棌娓告埐鐣岄潰銆', + ['file format'] = '鎴湒鏍煎紡', + ['set quality (0-100)'] = '瑷疆鎴湒绮惧害(0-100)', + ['Set screenshot quality(0-100): the larger number, the image will use more hdd space.'] = '瑷疆鎴湒绮惧害(0-100)锛氳秺澶ц秺娓呮櫚锛屽湒鐗囦篃鏈冭秺鍗犵┖闁撱', + ['set folder'] = '鎴湒鏂囦欢澶', + ['Set destination folder which screenshot file will be saved. Absolute path required.\nEx: D:/JX3_ScreenShot/\nAttention: let it blank will save screenshot to default folder.'] = '瑷疆鎴湒鏂囦欢澶撅紝鎴湒鏂囦欢灏囦繚瀛樺埌瑷疆鐨勭洰閷勪腑锛屽儏鏀寔绲曞皪璺緫銆俓n濡傦細D:/鍔嶇恫涓夋埅鍦栨枃浠跺ぞ/\n瑷伙細鐐虹┖鍓囦繚瀛樺埌榛樿獚鏂囦欢澶', + + ['shotscreen'] = '鎴湒', + ['shotscreen without ui'] = '闅辫棌娓告埐鐣岄潰鎴湒', + ['shotscreen with ui'] = '椤ず娓告埐鐣岄潰鎴湒', + + ['Shot screen succeed, file saved as %s .'] = '鎴湒鎴愬姛锛屾枃浠跺凡淇濆瓨锛%s', + ['Shotscreen destination folder error: %s not exist. File has been save to default folder.'] = '鎴湒鏂囦欢澶捐ō缃尟瑾わ細%s鐩寗涓嶅瓨鍦ㄣ傛埅鍦栧皣淇濆瓨鍒伴粯瑾嶆枃浠跺ぞ銆', + + ['>> Set hotkey <<'] = '>> 瑷疆蹇嵎閸 <<', + ['set default screenshot tool'] = '瑷疆鐐洪粯瑾嶆埅鍦栧伐鍏', + ['as default already'] = '宸茶ō鐐洪粯瑾嶆埅鍦栧伐鍏', +} diff --git a/MY_ScreenShot/src/MY_ScreenShot.lua b/MY_ScreenShot/src/MY_ScreenShot.lua new file mode 100644 index 000000000..c4618192f --- /dev/null +++ b/MY_ScreenShot/src/MY_ScreenShot.lua @@ -0,0 +1,231 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 截图助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ScreenShot/MY_ScreenShot' +local PLUGIN_NAME = 'MY_ScreenShot' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ScreenShot' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local SCREENSHOT_MODE = { + SHOW_UI = 1, + HIDE_UI = 2, +} +local O = X.CreateUserSettingsModule('MY_ScreenShot', _L['System'], { + szFileExName = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ScreenShot'], + szDescription = X.MakeCaption({ + _L['file format'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'jpg', + }, + nQuality = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ScreenShot'], + szDescription = X.MakeCaption({ + _L['set quality (0-100)'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 100, + }, + bAutoHideUI = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ScreenShot'], + szDescription = X.MakeCaption({ + _L['auto hide ui while shot screen'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + szFilePath = { + ePathType = X.PATH_TYPE.GLOBAL, + szLabel = _L['MY_ScreenShot'], + szDescription = X.MakeCaption({ + _L['set folder'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, +}) +local D = {} + +function D.ShotScreen(szFilePath, nQuality) + local szFullPath = ScreenShot(szFilePath, nQuality) + X.OutputSystemMessage(_L('Shot screen succeed, file saved as %s .', szFullPath)) +end + +function D.ShotScreenEx(nShowUI) + -- 生成可使用的完整截图目录 + local szFolderPath = O.szFilePath + if szFolderPath~='' and not (string.sub(szFolderPath,2,2)==':' and IsFileExist(szFolderPath)) then + X.OutputSystemMessage(_L('Shotscreen destination folder error: %s not exist. File has been save to default folder.', szFolderPath)) + szFolderPath = '' + end + local szFilePath + if szFolderPath~='' then + -- 生成文件完整路径名称 + local tDateTime = TimeToDate(GetCurrentTime()) + local i = 0 + repeat + szFilePath = szFolderPath .. (string.format('%04d-%02d-%02d_%02d-%02d-%02d-%03d', tDateTime.year, tDateTime.month, tDateTime.day, tDateTime.hour, tDateTime.minute, tDateTime.second, i)) ..'.' .. O.szFileExName + i=i+1 + until not IsFileExist(szFilePath) + else + szFilePath = O.szFileExName + end + -- 根据nShowUI不同方式实现截图 + local bStationVisible = Station.IsVisible() + if nShowUI == SCREENSHOT_MODE.HIDE_UI and bStationVisible then + Station.Hide() + X.UI.SetShadowHandleVisible('*', false) + X.DelayCall(100, function() + D.ShotScreen(szFilePath, O.nQuality) + X.DelayCall(300, function() + Station.Show() + X.UI.SetShadowHandleVisible('*', true) + end) + end) + elseif nShowUI == SCREENSHOT_MODE.SHOW_UI and not bStationVisible then + Station.Show() + X.UI.SetShadowHandleVisible('*', true) + X.DelayCall(100, function() + D.ShotScreen(szFilePath, O.nQuality) + X.DelayCall(300, function() + Station.Hide() + X.UI.SetShadowHandleVisible('*', true) + end) + end) + else + D.ShotScreen(szFilePath, O.nQuality) + end +end + +-- 快捷键绑定 +X.RegisterHotKey('MY_ScreenShot_Hotkey', _L['shotscreen'], function() D.ShotScreenEx((O.bAutoHideUI and SCREENSHOT_MODE.HIDE_UI) or nil) end, nil) +X.RegisterHotKey('MY_ScreenShot_Hotkey_HideUI', _L['shotscreen without ui'], function() D.ShotScreenEx(SCREENSHOT_MODE.HIDE_UI) end, nil) +X.RegisterHotKey('MY_ScreenShot_Hotkey_ShowUI', _L['shotscreen with ui'], function() D.ShotScreenEx(SCREENSHOT_MODE.SHOW_UI) end, nil) + +-- 面板注册 +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local fnRefreshPanel = function(ui) + ui:Children('#WndCheckBox_HideUI'):Check(O.bAutoHideUI) + ui:Children('#WndCombo_FileExName'):Text(O.szFileExName) + ui:Children('#WndSlider_Quality'):Value(O.nQuality) + ui:Children('#WndEditBox_SsRoot'):Text(O.szFilePath) + end + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_HideUI', + x = 30, y = 70, + text = _L['auto hide ui while shot screen'], + tip = { + render = _L['Check it if you want to hide ui automatic.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + checked = O.bAutoHideUI, + onCheck = function(bChecked) O.bAutoHideUI = bChecked end, + }) + + ui:Append('Text', { name = 'Text_FileExName', x = 30, y = 110, text = _L['file format'] }) + + ui:Append('WndComboBox', { + name = 'WndCombo_FileExName', + x = 110, y = 110, w = 80, + text = O.szFileExName, + menu = function() + return { + {szOption = 'jpg', bChecked = O.szFileExName=='jpg', rgb = GetMsgFontColor('MSG_SYS', true), fnAction = function() O.szFileExName = 'jpg' ui:Children('#WndCombo_FileExName'):Text(O.szFileExName) end, fnAutoClose = function() return true end}, + {szOption = 'png', bChecked = O.szFileExName=='png', rgb = GetMsgFontColor('MSG_SYS', true), fnAction = function() O.szFileExName = 'png' ui:Children('#WndCombo_FileExName'):Text(O.szFileExName) end, fnAutoClose = function() return true end}, + {szOption = 'bmp', bChecked = O.szFileExName=='bmp', rgb = GetMsgFontColor('MSG_SYS', true), fnAction = function() O.szFileExName = 'bmp' ui:Children('#WndCombo_FileExName'):Text(O.szFileExName) end, fnAutoClose = function() return true end}, + {szOption = 'tga', bChecked = O.szFileExName=='tga', rgb = GetMsgFontColor('MSG_SYS', true), fnAction = function() O.szFileExName = 'tga' ui:Children('#WndCombo_FileExName'):Text(O.szFileExName) end, fnAutoClose = function() return true end}, + } + end, + }) + + ui:Append('Text', { name = 'Text_Quality', x = 30, y = 150, text = _L['set quality (0-100)'] }) + ui:Append('WndSlider', { + name = 'WndSlider_Quality', + x = 180, y = 150, + sliderStyle = false, + range = {0, 100}, + tip = { + render = _L['Set screenshot quality(0-100): the larger number, the image will use more hdd space.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + onChange = function(nValue) O.nQuality = nValue end, + }) + + ui:Append('Text', { name = 'Text_SsRoot', x = 30, y = 190, text = _L['set folder'] }) + ui:Append('WndEditBox', { + name = 'WndEditBox_SsRoot', + x = 30, y = 220, w = 620, h = 100, + text = O.szFilePath, + tip = { + render = _L['Set destination folder which screenshot file will be saved. Absolute path required.\nEx: D:/JX3_ScreenShot/\nAttention: let it blank will save screenshot to default folder.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + onChange = function(szValue) + szValue = string.gsub(szValue, '^%s*(.-)%s*$', '%1') + szValue = string.gsub(szValue, '\\', '/') + szValue = string.gsub(szValue, '^(.-)/*$', '%1') + szValue = szValue..((#szValue>0 and '/') or '') + O.szFilePath = szValue + end, + }) + + ui:Append('WndButton', { + name = 'WndButton_HotkeyCheck', + x = nW - 180, y = 30, + buttonStyle = 'FLAT', + text = _L['set default screenshot tool'], + onClick = function() + X.SetHotKey('MY_ScreenShot_Hotkey',1,44,false,false,false) + end, + }) + + ui:Append('Text', { + name = 'Text_SetHotkey', + x = nW - 140, y = 60, + text = _L['>> Set hotkey <<'], + r = 255, g = 255, b = 0, + onClick = function() X.SetHotKey() end, + }) + + fnRefreshPanel(ui) + + -- 注册默认工具检查 + X.BreatheCall('MY_ScreenShot_Hotkey_Check', 1000, function() + local nKey, nShift, nCtrl, nAlt = X.GetHotKey('MY_ScreenShot_Hotkey') + if type(nKey)=='nil' or nKey==0 then + ui:Children('#WndButton_HotkeyCheck'):Text(_L['set default screenshot tool']):Enable(true) + else + ui:Children('#WndButton_HotkeyCheck'):Text(_L['as default already']):Enable(false) + end + end) +end + +function PS.OnPanelDeactive() + X.BreatheCall('MY_ScreenShot_Hotkey_Check', false) +end + +X.Panel.Register(_L['System'], 'ScreenShot', _L['screenshot helper'], 'UI/Image/UICommon/Commonpanel.UITex|9', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/img/MY_TargetDirection.Tga b/MY_Target/img/MY_TargetDirection.Tga new file mode 100644 index 000000000..79abd0672 Binary files /dev/null and b/MY_Target/img/MY_TargetDirection.Tga differ diff --git a/MY_Target/img/MY_TargetDirection.UITex b/MY_Target/img/MY_TargetDirection.UITex new file mode 100644 index 000000000..05fdf7be2 Binary files /dev/null and b/MY_Target/img/MY_TargetDirection.UITex differ diff --git a/MY_Target/img/MY_TargetDirection.txt b/MY_Target/img/MY_TargetDirection.txt new file mode 100644 index 000000000..fdc7c8a77 --- /dev/null +++ b/MY_Target/img/MY_TargetDirection.txt @@ -0,0 +1,6 @@ +Farme Left Top Width High File +0 0 0 160 160 C:\Users\root\Desktop\箭头紫.tga +1 162 0 160 160 C:\Users\root\Desktop\箭头红.tga +2 324 0 160 160 C:\Users\root\Desktop\箭头绿.tga +3 0 162 160 160 C:\Users\root\Desktop\箭头蓝.tga +4 162 162 160 160 C:\Users\root\Desktop\箭头黄.tga diff --git a/MY_Target/info.ini b/MY_Target/info.ini new file mode 100644 index 000000000..0090ee6fa --- /dev/null +++ b/MY_Target/info.ini @@ -0,0 +1,12 @@ +[MY_Target] +name=目标辅助 +desc=显示自身和目标的方位、连接线等信息 +package=MY +dependence=MY_!Base +version=1.0 +default=1 +lua_0=src/MY_TargetDirection.lua +lua_1=src/MY_TargetFace.lua +lua_2=src/MY_TargetLine.lua +lua_3=src/MY_TargetSelect.lua +lua_4=src/MY_Target.PS.lua diff --git a/MY_Target/info.ini.zh_TW b/MY_Target/info.ini.zh_TW new file mode 100644 index 000000000..5f21b6ee2 --- /dev/null +++ b/MY_Target/info.ini.zh_TW @@ -0,0 +1,12 @@ +[MY_Target] +name=鐩杓斿姪 +desc=椤ず鑷韩鍜岀洰妯欑殑鏂逛綅銆侀f帴绶氱瓑淇℃伅 +package=MY +dependence=MY_!Base +version=1.0 +default=1 +lua_0=src/MY_TargetDirection.lua +lua_1=src/MY_TargetFace.lua +lua_2=src/MY_TargetLine.lua +lua_3=src/MY_TargetSelect.lua +lua_4=src/MY_Target.PS.lua diff --git a/MY_Target/lang/zhcn.jx3dat b/MY_Target/lang/zhcn.jx3dat new file mode 100644 index 000000000..1ee2b46f3 --- /dev/null +++ b/MY_Target/lang/zhcn.jx3dat @@ -0,0 +1,48 @@ +return { + ['MY_Target'] = '目标辅助', + ['MY_TargetDirection'] = '目标指示', + ['%.1f feet'] = '%.1f 尺', + ['Show target direction'] = '显示目标方位指示', + ['Distance type'] = '默认距离计算方式', + ['Long-distance reminder'] = '远距离提醒', + ['No reminder'] = '不提醒', + ['Remind when distance is %d feet'] = '距离超过 %d 尺时提醒', + + ['MY_TargetFace'] = '目标面向', + ['Options'] = '功能选项', + ['Display the sector of target facing, change color'] = '显示目标的扇形面向,设置颜色', + ['Display the sector of target facing'] = '显示目标的扇形面向', + ['The sector angle'] = '扇形的角度', + ['%d degree'] = '%d度', + ['The sector radius'] = '扇形的半径', + ['%d feet'] = '%d尺', + ['The sector transparency'] = '扇形透明度', + ['Target face'] = '目标扇形面向', + ['Display the sector of target target facing, change color'] = '显示目标的目标的扇形面向,设置颜色', + ['Display the sector of target target facing'] = '显示目标的目标的扇形面向', + ['Display the foot shape of target, change color'] = '显示目标底部的圈圈,设置颜色', + ['Display the foot shape of target'] = '显示目标底部的圈圈', + ['Display the foot shape of target target, change color'] = '显示目标的目标底部的圈圈,设置颜色', + ['Display the foot shape of target target'] = '显示目标的目标底部的圈圈', + ['The foot shape radius'] = '圈圈半径', + ['The foot shape transparency'] = '圈圈透明度', + ['Color'] = '颜色', + + ['MY_TargetLine'] = '目标连线', + ['Display the line from self to target'] = '显示自己到目标的连线', + ['Display the line target self to target target'] = '显示目标的目标的连线', + ['From head to head'] = '头部到头部', + ['From foot to foot'] = '脚下到脚下', + ['New style'] = '新版样式', + ['Change color'] = '设置颜色', + ['%d px'] = '%d像素', + ['Line width'] = '连线的宽度', + ['Line alpha'] = '连线透明度', + ['Move'] = '位移', + ['Entrap'] = '锁足', + ['Slower'] = '减速', + ["Halt"] = "眩晕", + ["Freeze"] = "定身", + + ['Smart select target'] = '目标选择增强', +} diff --git a/MY_Target/lang/zhtw.jx3dat b/MY_Target/lang/zhtw.jx3dat new file mode 100644 index 000000000..4850c3848 --- /dev/null +++ b/MY_Target/lang/zhtw.jx3dat @@ -0,0 +1,48 @@ +return { + ['MY_Target'] = '鐩杓斿姪', + ['MY_TargetDirection'] = '鐩鎸囩ず', + ['%.1f feet'] = '%.1f 灏', + ['Show target direction'] = '椤ず鐩鏂逛綅鎸囩ず', + ['Distance type'] = '榛樿獚璺濋洟瑷堢畻鏂瑰紡', + ['Long-distance reminder'] = '閬犺窛闆㈡彁閱', + ['No reminder'] = '涓嶆彁閱', + ['Remind when distance is %d feet'] = '璺濋洟瓒呴亷 %d 灏烘檪鎻愰啋', + + ['MY_TargetFace'] = '鐩闈㈠悜', + ['Options'] = '鍔熻兘閬搁爡', + ['Display the sector of target facing, change color'] = '椤ず鐩鐨勬墖褰㈤潰鍚戯紝瑷疆椤忚壊', + ['Display the sector of target facing'] = '椤ず鐩鐨勬墖褰㈤潰鍚', + ['The sector angle'] = '鎵囧舰鐨勮搴', + ['%d degree'] = '%d搴', + ['The sector radius'] = '鎵囧舰鐨勫崐寰', + ['%d feet'] = '%d灏', + ['The sector transparency'] = '鎵囧舰閫忔槑搴', + ['Target face'] = '鐩鎵囧舰闈㈠悜', + ['Display the sector of target target facing, change color'] = '椤ず鐩鐨勭洰妯欑殑鎵囧舰闈㈠悜锛岃ō缃鑹', + ['Display the sector of target target facing'] = '椤ず鐩鐨勭洰妯欑殑鎵囧舰闈㈠悜', + ['Display the foot shape of target, change color'] = '椤ず鐩搴曢儴鐨勫湀鍦堬紝瑷疆椤忚壊', + ['Display the foot shape of target'] = '椤ず鐩搴曢儴鐨勫湀鍦', + ['Display the foot shape of target target, change color'] = '椤ず鐩鐨勭洰妯欏簳閮ㄧ殑鍦堝湀锛岃ō缃鑹', + ['Display the foot shape of target target'] = '椤ず鐩鐨勭洰妯欏簳閮ㄧ殑鍦堝湀', + ['The foot shape radius'] = '鍦堝湀鍗婂緫', + ['The foot shape transparency'] = '鍦堝湀閫忔槑搴', + ['Color'] = '椤忚壊', + + ['MY_TargetLine'] = '鐩閫g窔', + ['Display the line from self to target'] = '椤ず鑷繁鍒扮洰妯欑殑閫g窔', + ['Display the line target self to target target'] = '椤ず鐩鐨勭洰妯欑殑閫g窔', + ['From head to head'] = '闋儴鍒伴牠閮', + ['From foot to foot'] = '鑵充笅鍒拌叧涓', + ['New style'] = '鏂扮増妯e紡', + ['Change color'] = '瑷疆椤忚壊', + ['%d px'] = '%d鍍忕礌', + ['Line width'] = '閫g窔鐨勫搴', + ['Line alpha'] = '閫g窔閫忔槑搴', + ['Move'] = '浣嶇Щ', + ['Entrap'] = '閹栬冻', + ['Slower'] = '娓涢', + ["Halt"] = "鐪╂殘", + ["Freeze"] = "瀹氳韩", + + ['Smart select target'] = '鐩閬告搰澧炲挤', +} diff --git a/MY_Target/src/MY_Target.PS.lua b/MY_Target/src/MY_Target.PS.lua new file mode 100644 index 000000000..80d9a8ab9 --- /dev/null +++ b/MY_Target/src/MY_Target.PS.lua @@ -0,0 +1,357 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标面向显示等功能设置面板 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Target/MY_Target.PS' +local PLUGIN_NAME = 'MY_Target' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Target' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_Target', { ['*'] = false }) +-------------------------------------------------------------------------- + +local PS = { szRestriction = 'MY_Target' } + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + local nLH = 26 + ui:Append('Text', { x = nX, y = nY, text = _L['Options'], font = 27 }) + + -- target direction + nX, nY = nPaddingX + 10, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Show target direction'], + checked = MY_TargetDirection.bEnable, + onCheck = function(bChecked) + MY_TargetDirection.bEnable = bChecked + end, + }):AutoWidth():Width() + + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 200, text = _L['Distance type'], h = 24, + menu = function() + return X.GetDistanceTypeMenu(true, MY_TargetDirection.eDistanceType, function(p) + MY_TargetDirection.eDistanceType = p.szType + end) + end, + }):AutoWidth():Width() + + ui:Append('WndComboBox', { + x = nX, y = nY, w = 200, text = _L['Long-distance reminder'], h = 24, + menu = function() + -- for 0 - 30 + local tMenu = {} + for i = 0, 30 do + table.insert(tMenu, { + szOption = i == 0 and _L['No reminder'] or _L('Remind when distance is %d feet', i), + bCheck = true, bMCheck = true, bChecked = MY_TargetDirection.nDistanceFar == i, + fnAction = function() + MY_TargetDirection.nDistanceFar = i + end, + }) + end + return tMenu + end, + }):AutoWidth() + + if not X.IsRestricted('MY_TargetLine') then + -- target line + nX, nY = nPaddingX + 10, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the line from self to target'], + checked = MY_TargetLine.bTarget, + onCheck = function(bChecked) + MY_TargetLine.bTarget = bChecked + end, + }):AutoWidth():Width() + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['New style'], + checked = MY_TargetLine.bTargetRL, + onCheck = function(bChecked) + MY_TargetLine.bTargetRL = bChecked + end, + }):AutoWidth():Width() + 10 + + nX = nX + ui:Append('Shadow', { + x = nX + 2, y = nY + 4, w = 18, h = 18, + color = MY_TargetLine.tTargetColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetLine.tTargetColor = { r, g, b } + end) + end, + autoEnable = function() return not MY_TargetLine.bTargetRL end, + }):Width() + 5 + + nX = nX + ui:Append('Text', { + x = nX, y = nY - 2, + text = _L['Change color'], + autoEnable = function() return not MY_TargetLine.bTargetRL end, + }):AutoWidth():Width() + + nX, nY = nPaddingX + 10, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the line target self to target target'], + checked = MY_TargetLine.bTTarget, + onCheck = function(bChecked) + MY_TargetLine.bTTarget = bChecked + end, + }):AutoWidth():Width() + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['New style'], + checked = MY_TargetLine.bTTargetRL, + onCheck = function(bChecked) + MY_TargetLine.bTTargetRL = bChecked + end, + }):AutoWidth():Width() + 10 + + nX = nX + ui:Append('Shadow', { + x = nX + 2, y = nY + 4, w = 18, h = 18, + color = MY_TargetLine.tTTargetColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetLine.tTTargetColor = { r, g, b } + end) + end, + autoEnable = function() return not MY_TargetLine.bTTargetRL end, + }):Width() + 5 + + nX = nX + ui:Append('Text', { + x = nX, y = nY - 2, + text = _L['Change color'], + autoEnable = function() return not MY_TargetLine.bTTargetRL end, + }):AutoWidth():Width() + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { + text = _L['Line width'], x = nX, y = nY, + autoEnable = function() return not MY_TargetLine.bTargetRL or not MY_TargetLine.bTTargetRL end, + }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = MY_TargetLine.nLineWidth, + range = {1, 5}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%d px', val) end, + onChange = function(val) MY_TargetLine.nLineWidth = val end, + autoEnable = function() return not MY_TargetLine.bTargetRL or not MY_TargetLine.bTTargetRL end, + }) + nX = nX + 180 + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, w = 100, h = 25, group = 'line postype', + text = _L['From head to head'], + checked = MY_TargetLine.bAtHead, + onCheck = function(bChecked) + if not bChecked then + return + end + MY_TargetLine.bAtHead = true + end, + }):AutoWidth():Width() + 10 + + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { + text = _L['Line alpha'], x = nX, y = nY, + autoEnable = function() return not MY_TargetLine.bTargetRL or not MY_TargetLine.bTTargetRL end, + }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = MY_TargetLine.nLineAlpha, + range = {1, 255}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) MY_TargetLine.nLineAlpha = val end, + autoEnable = function() return not MY_TargetLine.bTargetRL or not MY_TargetLine.bTTargetRL end, + }) + nX = nX + 180 + nX = nX + ui:Append('WndRadioBox', { + x = nX, y = nY, w = 100, h = 25, group = 'line postype', + text = _L['From foot to foot'], + checked = not MY_TargetLine.bAtHead, + onCheck = function(bChecked) + if not bChecked then + return + end + MY_TargetLine.bAtHead = false + end, + }):AutoWidth():Width() + 10 + end + + if not X.IsRestricted('MY_TargetFace') then + -- target face + nX, nY = nPaddingX + 10, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the sector of target facing, change color'], + checked = MY_TargetFace.bTargetFace, + onCheck = function(bChecked) + MY_TargetFace.bTargetFace = bChecked + end, + }):AutoWidth():Width() + + ui:Append('Shadow', { + x = nX + 2, y = nY + 2, w = 18, h = 18, + color = MY_TargetFace.tTargetFaceColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetFace.tTargetFaceColor = { r, g, b } + end) + end, + }) + + -- target target face + nX, nY = nPaddingX + 10, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the sector of target target facing, change color'], + checked = MY_TargetFace.bTTargetFace, + onCheck = function(bChecked) + MY_TargetFace.bTTargetFace = bChecked + end, + }):AutoWidth():Width() + + ui:Append('Shadow', { + x = nX + 2, y = nY + 2, w = 18, h = 18, + color = MY_TargetFace.tTTargetFaceColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetFace.tTTargetFaceColor = { r, g, b } + end) + end, + }) + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { text = _L['The sector angle'], x = nX, y = nY }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = MY_TargetFace.nSectorDegree, + range = {30, 180}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%d degree', val) end, + onChange = function(val) MY_TargetFace.nSectorDegree = val end, + }) + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { text = _L['The sector radius'], x = nX, y = nY }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = MY_TargetFace.nSectorRadius, + range = {1, 26}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%d feet', val) end, + onChange = function(val) MY_TargetFace.nSectorRadius = val end, + }) + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { text = _L['The sector transparency'], x = nX, y = nY }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = math.ceil((200 - MY_TargetFace.nSectorAlpha) / 2), + range = {0, 100}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%d %%', val) end, + onChange = function(val) MY_TargetFace.nSectorAlpha = (100 - val) * 2 end, + }) + + -- foot shape + nX, nY = nPaddingX, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the foot shape of target, change color'], + checked = MY_TargetFace.bTargetShape, + onCheck = function(bChecked) MY_TargetFace.bTargetShape = bChecked end, + }):AutoWidth():Width() + + ui:Append('Shadow', { + x = nX + 2, y = nY + 2, w = 18, h = 18, + color = MY_TargetFace.tTargetShapeColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetFace.tTargetShapeColor = { r, g, b } + end) + end, + }) + + nX, nY = nPaddingX, nY + nLH + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Display the foot shape of target target, change color'], + checked = MY_TargetFace.bTTargetShape, + onCheck = function(bChecked) MY_TargetFace.bTTargetShape = bChecked end, + }):AutoWidth():Width() + + ui:Append('Shadow', { + x = nX + 2, y = nY + 2, w = 18, h = 18, + color = MY_TargetFace.tTTargetShapeColor, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + MY_TargetFace.tTTargetShapeColor = { r, g, b } + end) + end, + }) + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { text = _L['The foot shape radius'], x = nX, y = nY }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = MY_TargetFace.nShapeRadius, + range = {1, 26}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%.1f feet', val / 2) end, + onChange = function(val) MY_TargetFace.nShapeRadius = val end, + }) + + nX, nY = nPaddingX + 37, nY + nLH + nX = nX + ui:Append('Text', { text = _L['The foot shape transparency'], x = nX, y = nY }):AutoWidth():Width() + + ui:Append('WndSlider', { + x = nX + 2, y = nY + 2, + value = math.ceil((200 - MY_TargetFace.nShapeAlpha) / 2), + range = {0, 100}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) return _L('%d %%', val) end, + onChange = function(val) MY_TargetFace.nShapeAlpha = (100 - val) * 2 end, + }) + end +end +X.Panel.Register(_L['Target'], 'MY_Target', _L['MY_Target'], 2136, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/src/MY_TargetDirection.lua b/MY_Target/src/MY_TargetDirection.lua new file mode 100644 index 000000000..786c18e68 --- /dev/null +++ b/MY_Target/src/MY_TargetDirection.lua @@ -0,0 +1,285 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标方位显示 +-- @author : Webster +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Target/MY_TargetDirection' +local PLUGIN_NAME = 'MY_Target' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetDirection' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Target/ui/MY_TargetDirection.ini' +local IMG_PATH = X.PACKET_INFO.ROOT .. 'MY_Target/img/MY_TargetDirection.uitex' + +local O = X.CreateUserSettingsModule('MY_TargetDirection', _L['Target'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetDirection'], + _L['Show target direction'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetDirection'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'CENTER', r = 'CENTER', x = 250, y = 100 }, + }, + eDistanceType = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetDirection'], + _L['Distance type'], + }), + xSchema = X.Schema.String, + xDefaultValue = 'global', + }, + -- 超远距离 + nDistanceFar = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetDirection'], + _L['Long-distance reminder'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, +}) +local D = {} + +function D.GetFrame() + return Station.Lookup('Normal/MY_TargetDirection') +end + +function D.OpenPanel() + local frame = D.GetFrame() + if not frame then + frame = X.UI.OpenFrame(INI_PATH, 'MY_TargetDirection') + end + return frame +end + +function D.ClosePanel() + X.UI.CloseFrame('MY_TargetDirection') +end + +function D.UpdateAnchor() + local frame = D.GetFrame() + if not frame then + return + end + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + frame:CorrectPos() +end + +function D.CheckEnable() + if D.bReady and O.bEnable and not X.IsRestricted('MY_Target') then + D.OpenPanel() + else + D.ClosePanel() + end +end + +function D.GetState(tar) + if tar.nMoveState == MOVE_STATE.ON_SIT then + return 533, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_DEATH then + return 2215, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_KNOCKED_DOWN then + return 2027, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_DASH then + return 2030, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_SKILL_MOVE_DST then + return 1487, _L["Move"] + else + -- check other movestate + if tar.nMoveState == MOVE_STATE.ON_HALT then + return 2019, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_FREEZE then + return 2038, g_tStrings.tPlayerMoveState[tar.nMoveState] + elseif tar.nMoveState == MOVE_STATE.ON_ENTRAP then + return 2020, _L["Entrap"] + end + -- check speed + if X.IsPlayer(tar.dwID) and tar.nRunSpeed and tar.nRunSpeed < 20 then + return 348, _L["Slower"] + end + end +end + +function D.OnFrameCreate() + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + D.UpdateAnchor() +end + +do +local function SetObjectAvatar(img, tar, info) + if X.IsPlayer(tar.dwID) then + if info and info.dwActualKungfuID then + img:FromIconID(Table_GetSkillIconID(info.dwActualKungfuID, 1)) + else + local kungfu = tar.GetKungfuMount and tar.GetKungfuMount() + if kungfu and kungfu.dwSkillID ~= 0 then + img:FromIconID(Table_GetSkillIconID(kungfu.dwSkillID, 1)) + else + img:FromUITex(GetForceImage(tar.dwForceID)) + end + end + else + local szPath = NPC_GetProtrait(tar.dwModelID) + if not szPath or not IsFileExist(szPath) then + szPath = NPC_GetHeadImageFile(tar.dwModelID) + end + if not szPath or not IsFileExist(szPath) then + img:FromUITex(GetNpcHeadImage(tar.dwID)) + else + img:FromTextureFile(szPath) + end + end +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then + return + end + local dwType, dwID = X.GetCharacterTarget(me) + local tar = X.GetTargetHandle(dwType, dwID) + local info = X.GetTeamMemberInfo(dwID) + if tar and tar.dwID ~= me.dwID then + -- 头像 + SetObjectAvatar(this:Lookup('', 'Handle_Main/Image_Force'), tar, info) + -- 方位 + local dwRad1 = math.atan2(tar.nY - me.nY, tar.nX - me.nX) + local dwRad2 = me.nFaceDirection / 128 * math.pi + this:Lookup('', 'Handle_Main/Image_Arrow'):SetRotate(1.5 * math.pi + dwRad2 - dwRad1) + -- 颜色 + local nFrame = 4 + if me.IsInParty() and X.IsTeammate(tar.dwID) then + nFrame = 3 + elseif X.IsCharacterRelationEnemy(me.dwID, tar.dwID) then + nFrame = 1 + elseif IsAlly(me.dwID, tar.dwID) then + nFrame = 2 + end + -- 状态 + local dwIcon, szState = D.GetState(tar) + local boxState = this:Lookup('', 'Handle_Main/Box_State') + local txtState = this:Lookup('', 'Handle_Main/Text_State') + if dwIcon then + boxState:Show() + boxState:SetObjectIcon(dwIcon) + else + boxState:Hide() + end + txtState:SetText(szState or '') + -- 距离 + local distanceText = this:Lookup('', 'Handle_Main/Text_Distance') + local nDistance = X.GetCharacterDistance(me, tar, O.eDistanceType) + distanceText:SetText(_L('%.1f feet', nDistance)) + if O.nDistanceFar > 0 and nDistance > O.nDistanceFar then + distanceText:SetFontColor(255, 0, 0) + else + distanceText:SetFontColor(255, 255, 0) + end + this:Show() + else + this:Hide() + end +end +end + +function D.OnEvent(event) + if event == 'ON_ENTER_CUSTOM_UI_MODE' or event == 'ON_LEAVE_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['MY_TargetDirection']) + elseif event == 'UI_SCALED' then + D.UpdateAnchor() + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetDirection', + exports = { + { + fields = { + 'bEnable', + 'tAnchor', + 'eDistanceType', + 'nDistanceFar', + }, + root = O, + }, + { + preset = 'UIEvent', + root = D, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'tAnchor', + 'eDistanceType', + 'nDistanceFar', + }, + triggers = { + bEnable = D.CheckEnable, + tAnchor = D.UpdateAnchor, + }, + root = O, + }, + }, +} +MY_TargetDirection = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_Target', function() + if arg0 and arg0 ~= 'MY_Target' then + return + end + D.CheckEnable() +end) +X.RegisterUserSettingsInit('MY_TargetDirection', function() + D.bReady = true + D.CheckEnable() + D.UpdateAnchor() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/src/MY_TargetFace.lua b/MY_Target/src/MY_TargetFace.lua new file mode 100644 index 000000000..ff6ba5ae3 --- /dev/null +++ b/MY_Target/src/MY_TargetFace.lua @@ -0,0 +1,353 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标面向显示 (台服用) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Target/MY_TargetFace' +local PLUGIN_NAME = 'MY_Target' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetFace' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_TargetFace', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_TargetFace', _L['Target'], { + bTargetFace = { -- 是否画出目标面向 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the sector of target facing'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTTargetFace = { -- 是否画出目标的目标的面向 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the sector of target target facing'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nSectorDegree = { -- 扇形角度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['The sector angle'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Number, + xDefaultValue = 110, + }, + nSectorRadius = { -- 扇形半径(尺) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['The sector radius'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Number, + xDefaultValue = 6, + }, + nSectorAlpha = { -- 扇形透明度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['The sector transparency'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + tTargetFaceColor = { -- 目标面向颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the sector of target facing'], + _L['Color'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 0, 128 }, + }, + tTTargetFaceColor = { -- 目标的目标面向颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the sector of target target facing'], + _L['Color'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 0, 128, 255 }, + }, + bTargetShape = { -- 目标脚底圈圈 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the foot shape of target'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTTargetShape = { -- 目标的目标脚底圈圈 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the foot shape of target target'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nShapeRadius = { -- 脚底圈圈半径 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['The foot shape radius'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, + nShapeAlpha = { -- 脚底圈圈透明度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['The foot shape transparency'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Number, + xDefaultValue = 100, + }, + tTargetShapeColor = { -- 目标脚底圈圈颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the foot shape of target'], + _L['Color'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 0, 0 }, + }, + tTTargetShapeColor = { -- 目标的目标脚底圈圈颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetFace'], + _L['Display the foot shape of target target'], + _L['Color'], + }), + szRestriction = 'MY_TargetFace', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 0, 0, 255 }, + }, +}) +local C, D = {}, {} + +function D.RequireRerender() + C.bReRender = true +end + +do +local function DrawShape(tar, sha, nDegree, nRadius, nAlpha, col) + nRadius = nRadius * 64 + local nFace = math.ceil(128 * nDegree / 360) + local dwRad1 = math.pi * (tar.nFaceDirection - nFace) / 128 + if tar.nFaceDirection > (256 - nFace) then + dwRad1 = dwRad1 - math.pi - math.pi + end + local dwRad2 = dwRad1 + (nDegree / 180 * math.pi) + local nAlpha2 = 0 + if nDegree == 360 then + nAlpha, nAlpha2 = nAlpha2, nAlpha + dwRad2 = dwRad2 + math.pi / 16 + end + -- orgina point + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + sha:AppendCharacterID(tar.dwID, false, col[1], col[2], col[3], nAlpha) + sha:Show() + -- relative points + local sX, sZ = Scene_PlaneGameWorldPosToScene(tar.nX, tar.nY) + repeat + local sX_, sZ_ = Scene_PlaneGameWorldPosToScene(tar.nX + math.cos(dwRad1) * nRadius, tar.nY + math.sin(dwRad1) * nRadius) + sha:AppendCharacterID(tar.dwID, false, col[1], col[2], col[3], nAlpha2, { sX_ - sX, 0, sZ_ - sZ }) + dwRad1 = dwRad1 + math.pi / 16 + until dwRad1 >= dwRad2 +end + +local function onBreathe() + local me = X.GetClientPlayer() + -- target face + local dwTarType, dwTarID = X.GetCharacterTarget(me) + local tar = X.GetTargetHandle(dwTarType, dwTarID) + if O.bTargetFace and tar then + DrawShape(tar, C.shaTargetFace, O.nSectorDegree, O.nSectorRadius, O.nSectorAlpha, O.tTargetFaceColor) + elseif C.shaTargetFace and C.shaTargetFace:IsValid() then + C.shaTargetFace:Hide() + end + -- foot shape + if C.bReRender then + if O.bTargetShape and tar then + DrawShape(tar, C.shaTargetShape, 360, O.nShapeRadius / 2, O.nShapeAlpha, O.tTargetShapeColor) + elseif C.shaTargetShape and C.shaTargetShape:IsValid() then + C.shaTargetShape:Hide() + end + end + -- target target face + local dwTTarType, dwTTarID = X.GetCharacterTarget(tar) + local ttar = X.GetTargetHandle(dwTTarType, dwTTarID) + local bIsTarget = tar and dwTarID == dwTTarID + if O.bTTargetFace and ttar and (not O.bTargetFace or not bIsTarget) then + DrawShape(ttar, C.shaTTargetFace, O.nSectorDegree, O.nSectorRadius, O.nSectorAlpha, O.tTTargetFaceColor) + elseif C.shaTTargetFace and C.shaTTargetFace:IsValid() then + C.shaTTargetFace:Hide() + end + -- target target shape + if C.bReRender then + if O.bTTargetShape and ttar and (not O.bTargetShape or not bIsTarget) then + DrawShape(ttar, C.shaTTargetShape, 360, O.nShapeRadius / 2, O.nShapeAlpha, O.tTTargetShapeColor) + elseif C.shaTTargetShape and C.shaTTargetShape:IsValid() then + C.shaTTargetShape:Hide() + end + end + C.bReRender = false +end + +function D.CheckEnable() + if D.bReady and not X.IsRestricted('MY_TargetFace') and (O.bTargetFace or O.bTTargetFace or O.bTargetShape or O.bTTargetShape) then + local hShaList = X.UI.GetShadowHandle('MY_TargetFace') + for _, v in ipairs({'TargetFace', 'TargetShape', 'TTargetFace', 'TTargetShape'}) do + local sha = hShaList:Lookup(v) + if not sha then + hShaList:AppendItemFromString('name="' .. v .. '"') + sha = hShaList:Lookup(v) + end + C['sha' .. v] = sha + end + X.BreatheCall('MY_TargetFace', onBreathe) + else + for _, v in ipairs({'TargetFace', 'TargetShape', 'TTargetFace', 'TTargetShape'}) do + local sha = C['sha' .. v] + if sha and sha:IsValid() then + sha:Hide() + end + C['sha' .. v] = nil + end + X.BreatheCall('MY_TargetFace', false) + end + D.RequireRerender() +end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetFace', + exports = { + { + fields = { + 'bTargetFace', + 'bTTargetFace', + 'nSectorDegree', + 'nSectorRadius', + 'nSectorAlpha', + 'tTargetFaceColor', + 'tTTargetFaceColor', + 'bTargetShape', + 'bTTargetShape', + 'nShapeRadius', + 'nShapeAlpha', + 'tTargetShapeColor', + 'tTTargetShapeColor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bTargetFace', + 'bTTargetFace', + 'nSectorDegree', + 'nSectorRadius', + 'nSectorAlpha', + 'tTargetFaceColor', + 'tTTargetFaceColor', + 'bTargetShape', + 'bTTargetShape', + 'nShapeRadius', + 'nShapeAlpha', + 'tTargetShapeColor', + 'tTTargetShapeColor', + }, + triggers = { + bTargetFace = D.CheckEnable, + bTTargetFace = D.CheckEnable, + nSectorDegree = D.RequireRerender, + nSectorRadius = D.RequireRerender, + nSectorAlpha = D.RequireRerender, + tTargetFaceColor = D.RequireRerender, + tTTargetFaceColor = D.RequireRerender, + bTargetShape = D.CheckEnable, + bTTargetShape = D.CheckEnable, + nShapeRadius = D.RequireRerender, + nShapeAlpha = D.RequireRerender, + tTargetShapeColor = D.RequireRerender, + tTTargetShapeColor = D.RequireRerender, + }, + root = O, + }, + }, +} +MY_TargetFace = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_TargetFace', function() + if arg0 and arg0 ~= 'MY_TargetFace' then + return + end + D.CheckEnable() +end) + +X.RegisterUserSettingsInit('MY_TargetFace', function() + D.bReady = true + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/src/MY_TargetLine.lua b/MY_Target/src/MY_TargetLine.lua new file mode 100644 index 000000000..78570e4bb --- /dev/null +++ b/MY_Target/src/MY_TargetLine.lua @@ -0,0 +1,355 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标方位显示 +-- @author : Webster +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Target/MY_TargetLine' +local PLUGIN_NAME = 'MY_Target' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetLine' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_TargetLine', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Target/ui/MY_TargetLine.ini' +local IMG_PATH = X.PACKET_INFO.ROOT .. 'MY_Target/img/MY_TargetLine.uitex' + +local O = X.CreateUserSettingsModule('MY_TargetLine', _L['Target'], { + bTarget = { -- 启用目标追踪线 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line from self to target'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTargetRL = { -- 启用新版连线 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line from self to target'], + _L['New style'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTTarget = { -- 显示目标与目标的目标连接线 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line target self to target target'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTTargetRL = { -- 启用新版连线 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line target self to target target'], + _L['New style'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAtHead = { -- 连接线从头部开始 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['From head to head'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nLineWidth = { -- 连接线宽度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Line width'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Number, + xDefaultValue = 3, + }, + nLineAlpha = { -- 连接线不透明度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Line alpha'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Number, + xDefaultValue = 150, + }, + tTargetColor = { -- 颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line from self to target'], + _L['Change color'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 0, 255, 0 }, + }, + tTTargetColor = { -- 颜色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Target'], + szDescription = X.MakeCaption({ + _L['MY_TargetLine'], + _L['Display the line target self to target target'], + _L['Change color'], + }), + szRestriction = 'MY_TargetLine', + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 0, 0 }, + }, +}) +local C, D = {}, {} + +function D.RequireRerender() + C.bReRender = true +end + +do +local function DrawShadowLine(sha, dwSrcType, dwSrcID, dwDstType, dwDstID, aCol, nAlpha, nWidth) + local r, g, b = unpack(aCol) + sha:SetTriangleFan(GEOMETRY_TYPE.LINE, nWidth) + sha:ClearTriangleFanPoint() + if dwSrcType == TARGET.DOODAD then + sha:AppendDoodadID(dwSrcID, r, g, b, nAlpha) + else + sha:AppendCharacterID(dwSrcID, MY_TargetLine.bAtHead, r, g, b, nAlpha) + end + if dwDstType == TARGET.DOODAD then + sha:AppendDoodadID(dwDstID, r, g, b, nAlpha) + else + sha:AppendCharacterID(dwDstID, MY_TargetLine.bAtHead, r, g, b, nAlpha) + end + sha:Show() +end +local function GetShadow(szName) + local hShaList = X.UI.GetShadowHandle('MY_TargetLine') + local sha = hShaList:Lookup(szName) + if not sha then + hShaList:AppendItemFromString('name="' .. szName .. '"') + sha = hShaList:Lookup(szName) + end + return sha +end +local bCurTargetRL, dwCurTarLineSrcID, dwCurTarLineDstID, shaTLine +local bCurTTargetRL, dwCurTTarLineSrcID, dwCurTTarLineDstID, shaTTLine +function D.UpdateLine() + if not D.bReady then + return + end + local me = X.GetClientPlayer() + local dwTarType, dwTarID = X.GetCharacterTarget(me) + local tar = X.GetTargetHandle(dwTarType, dwTarID) + local dwTTarType, dwTTarID = X.GetCharacterTarget(tar) + local ttar = X.GetTargetHandle(dwTTarType, dwTTarID) + local dwTarLineSrcType, dwTarLineSrcID, dwTarLineDstType, dwTarLineDstID + local dwTTarLineSrcType, dwTTarLineSrcID, dwTTarLineDstType, dwTTarLineDstID + if not C.bRestricted then + if me and tar and (not ttar or ttar.dwID ~= me.dwID) then + dwTarLineSrcType = TARGET.PLAYER + dwTarLineSrcID = me.dwID + dwTarLineDstType = dwTarType + dwTarLineDstID = dwTarID + end + if me and tar and ttar then + dwTTarLineSrcType = dwTarType + dwTTarLineSrcID = dwTarID + dwTTarLineDstType = dwTTarType + dwTTarLineDstID = dwTTarID + end + end + + -- show connect + if dwCurTarLineSrcID ~= dwTarLineSrcID or dwCurTarLineDstID ~= dwTarLineDstID or bCurTargetRL ~= O.bTargetRL or C.bReRender then + if bCurTargetRL ~= O.bTargetRL then + if dwCurTarLineSrcID and dwCurTarLineDstID then + if bCurTargetRL then + if dwCurTarLineSrcID then + rlcmd(('set target sfx connection %s %s %s'):format(dwCurTarLineSrcID, 0, 1)) + end + else + if shaTLine then + shaTLine:Hide() + end + end + end + bCurTargetRL = O.bTargetRL + end + if O.bTarget and dwTarLineSrcID and dwTarLineDstID then + if O.bTargetRL then + rlcmd(('set target sfx connection %s %s %s'):format(dwTarLineSrcID, dwTarLineDstID, 1)) + else + if not shaTLine then + shaTLine = GetShadow('TLine') + end + DrawShadowLine( + shaTLine, + dwTarLineSrcType, dwTarLineSrcID, + dwTarLineDstType, dwTarLineDstID, + O.tTargetColor, O.nLineAlpha, O.nLineWidth) + end + else + if dwCurTarLineSrcID then + rlcmd(('set target sfx connection %s %s %s'):format(dwCurTarLineSrcID, 0, 1)) + end + if shaTLine then + shaTLine:Hide() + end + end + bCurTargetRL, dwCurTarLineSrcID, dwCurTarLineDstID = O.bTargetRL, dwTarLineSrcID, dwTarLineDstID + end + + if dwCurTTarLineSrcID ~= dwTTarLineSrcID or dwCurTTarLineDstID ~= dwTTarLineDstID or bCurTTargetRL ~= O.bTTargetRL or C.bReRender then + if bCurTTargetRL ~= O.bTTargetRL then + if dwCurTTarLineSrcID and dwCurTTarLineDstID then + if bCurTTargetRL then + if dwCurTTarLineSrcID then + rlcmd(('set target sfx connection %s %s %s'):format(dwCurTTarLineSrcID, 0, 1)) + end + else + if shaTTLine then + shaTTLine:Hide() + end + end + end + bCurTTargetRL = O.bTTargetRL + end + if O.bTTarget and dwTTarLineSrcID and dwTTarLineDstID then + if O.bTTargetRL then + rlcmd(('set target sfx connection %s %s %s'):format(dwTTarLineSrcID, dwTTarLineDstID, 2)) + else + if not shaTTLine then + shaTTLine = GetShadow('TTLine') + end + DrawShadowLine( + shaTTLine, + dwTTarLineSrcType, dwTTarLineSrcID, + dwTTarLineDstType, dwTTarLineDstID, + O.tTTargetColor, O.nLineAlpha, O.nLineWidth) + end + else + if dwCurTTarLineSrcID then + rlcmd(('set target sfx connection %s %s %s'):format(dwCurTTarLineSrcID, 0, 2)) + end + if shaTTLine then + shaTTLine:Hide() + end + end + bCurTTargetRL, dwCurTTarLineSrcID, dwCurTTarLineDstID = O.bTTargetRL, dwTTarLineSrcID, dwTTarLineDstID + end + + C.bReRender = false +end +end + +function D.CheckEnable() + C.bRestricted = X.IsRestricted('MY_TargetLine') + if D.bReady and (O.bTarget or O.bTTarget) and not C.bRestricted then + X.BreatheCall('MY_TargetLine', D.UpdateLine) + else + X.BreatheCall('MY_TargetLine', false) + end + D.RequireRerender() + D.UpdateLine() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetLine', + exports = { + { + fields = { + 'bTarget', + 'bTargetRL', + 'bTTarget', + 'bTTargetRL', + 'bAtHead', + 'nLineWidth', + 'nLineAlpha', + 'tTargetColor', + 'tTTargetColor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bTarget', + 'bTargetRL', + 'bTTarget', + 'bTTargetRL', + 'bAtHead', + 'nLineWidth', + 'nLineAlpha', + 'tTargetColor', + 'tTTargetColor', + }, + triggers = { + bTarget = D.CheckEnable, + bTargetRL = D.RequireRerender, + bTTarget = D.CheckEnable, + bTTargetRL = D.RequireRerender, + bAtHead = D.RequireRerender, + nLineWidth = D.RequireRerender, + nLineAlpha = D.RequireRerender, + tTargetColor = D.RequireRerender, + tTTargetColor = D.RequireRerender, + }, + root = O, + }, + }, +} +MY_TargetLine = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_TargetLine', function() + if arg0 and arg0 ~= 'MY_TargetLine' then + return + end + D.CheckEnable() +end) + +X.RegisterUserSettingsInit('MY_TargetLine', function() + D.bReady = true + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/src/MY_TargetSelect.lua b/MY_Target/src/MY_TargetSelect.lua new file mode 100644 index 000000000..79f049426 --- /dev/null +++ b/MY_Target/src/MY_TargetSelect.lua @@ -0,0 +1,260 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标选择增强替代官方TAB +-- @author : Webster +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Target/MY_TargetSelect' +local PLUGIN_NAME = 'MY_Target' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetSelect' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_TargetSelect__PUBG', { ['*'] = true }) +-------------------------------------------------------------------------- + +local D = {} + +function D.CalcFace(me, tar, nDis) + local nX = tar.nX - me.nX + local nY = tar.nY - me.nY + local nFace = me.nFaceDirection / 256 * 360 + local nDeg = 0 + if nY == 0 then + if nX < 0 then + nDeg = 180 + end + elseif nX == 0 then + if nY > 0 then + nDeg = 90 + else + nDeg = 270 + end + else + nDeg = math.deg(math.atan(nY / nX)) + if nX < 0 then + nDeg = 180 + nDeg + elseif nY < 0 then + nDeg = 360 + nDeg + end + end + local nAngle = nFace - nDeg + if nAngle < -180 then + nAngle = nAngle + 360 + elseif nAngle > 180 then + nAngle = nAngle - 360 + end + nAngle = math.abs(nAngle) + if nAngle > 100 then + return math.huge + elseif nAngle < 5 then + return -999 + else + return nAngle + end +end + +local tJustList = {} +local nJustFrame = 0 +local LOWER_DIS = 35 +local tLowerNpc = { + [12944] = true, -- 碧蝶 + [9998] = true, -- 灵蛇 + [9999] = true, -- 玉蟾 + [9997] = true, -- 天蛛 + [9956] = true, -- 圣蝎 + -- [46140] = true, -- 长歌影子 清绝影歌 + [46297] = true, -- 长歌影子 疏影横斜 + [48049] = true, --五毒苗疆生物 +} + +-- 获取两者之间的关系 +-- 敌对返回 0 中立返回 1 友好返回 2 +function D.GetRelation(dwID) + local me = GetClientPlayer() + if IsEnemy(me.dwID, dwID) then + return 0 + -- elseif IsAlly(me.dwID, dwID)then + -- return 2 + else + return 1 + end +end + +function D.UpdateRestrict() + D.bRestrict = X.IsRestricted('MY_TargetSelect__PUBG') and X.IsInPubgMap() +end + +function D.SearchTarget() + if D.bRestrict then + return + end + local nFrame = GetLogicFrameCount() + if (nFrame - nJustFrame) > 12 then + tJustList = {} + end + nJustFrame = nFrame + local me = GetClientPlayer() + local _, dwTarget = me.GetTarget() + -- load player + local tList, tList2 = {}, {} + for _, v in ipairs(X.GetNearPlayer()) do + if v.dwID == dwTarget or v.nMoveState == MOVE_STATE.ON_DEATH then + -- skip current target + -- IsAlly IsEnemy + elseif IsEnemy(me.dwID, v.dwID) and not me.IsPlayerInMyParty(v.dwID) then + local nDis = X.GetCharacterDistance(me, v) + if nDis > LOWER_DIS and not X.IsEmpty(tList) then + -- need not far target + else + local item = { dwID = v.dwID, nType = TARGET.PLAYER } + item.nSel = tJustList[v.dwID] or 0 + item.nForce = 1 + item.nDis = math.floor(nDis / 4) + item.nHP = math.floor(10 * v.nCurrentLife / math.max(1, v.nMaxLife)) + item.nFace = D.CalcFace(me, v, nDis) + item.nRelation = D.GetRelation(v.dwID) + if (item.nDis == 0 or (item.nHP and item.nHP < 4)) and item.nFace == 0 then + item.nForce = 0 + end + if nDis > LOWER_DIS then + table.insert(tList2, item) + else + table.insert(tList, item) + end + end + end + end + local bEmptyPlayer = X.IsEmpty(tList) + local bEmptyPlayer2 = X.IsEmpty(tList2) + -- load npc + if bEmptyPlayer then + for _, v in ipairs(X.GetNearNpc()) do + if v.dwID == dwTarget or v.nMoveState == MOVE_STATE.ON_DEATH or not v.IsSelectable() then + -- skip current target + elseif IsEnemy(me.dwID, v.dwID) or IsAlly(me.dwID, v.dwID) or IsNeutrality(me.dwID, v.dwID) then + local nDis = X.GetCharacterDistance(me, v) + if nDis > LOWER_DIS and not X.IsEmpty(tList) then + -- need not far target + else + local item = { dwID = v.dwID, nType = TARGET.NPC } + item.nSel = tJustList[v.dwID] or 0 + item.nForce = 0 + item.nNpc = 0 + if GetNpcIntensity(v) ~= 4 then + item.nNpc = item.nNpc + 1 + end + -- 清歌绝影的影子=46140 + if v.dwTemplateID == 46140 then + item.nRealType = TARGET.NPC + item.nType = TARGET.PLAYER + item.nForce = 0 + item.nNpc = 0 + end + if tLowerNpc[v.dwTemplateID] then -- 降到最低的NPC 五毒宠物长歌影子之类的 + item.nForce = 2 + end + ------ + if IsNeutrality(me.dwID, v.dwID) then + item.nNpc = item.nNpc + 1 + end + item.nDis = math.floor(nDis / 4) + item.nHP = math.floor(5 * v.nCurrentLife / math.max(1, v.nMaxLife)) + item.nFace = D.CalcFace(me, v, nDis) + -- 如果是NPC并且面向在背后了 还大于10尺 就众生平等 不考虑是否敌对 + if item.nFace ~= math.huge and item.nDis > 10 then + item.nRelation = math.huge + else + -- NPC 优先级 红 > 黄 = 绿 + item.nRelation = D.GetRelation(v.dwID) + end + if nDis > LOWER_DIS then + table.insert(tList2, item) + else + table.insert(tList, item) + end + end + end + end + end + -- sort list + if X.IsEmpty(tList) then + tList = tList2 + end + -- for _, v in ipairs(tList) do + -- if v.dwID == 1073747661 or v.dwID == 1073747659 then + -- Output(v) + -- end + -- end + table.sort(tList, function(a, b) + -- just list + if a.nSel ~= b.nSel then + return a.nSel < b.nSel + end + if a.nRelation ~= b.nRelation then + return a.nRelation < b.nRelation + end + -- npc lower + -- if a.nType ~= b.nType then + -- return a.nType > b.nType + -- end + -- force lower + if a.nForce ~= b.nForce then + return a.nForce < b.nForce + end + -- if (a.dwID == 1073747661 and b.dwID ==1073747659) then + -- Output(123) + -- end + -- face + if a.nFace and a.nFace ~= b.nFace and math.abs(a.nFace - b.nFace) > 5 then + return a.nFace < b.nFace + end + -- npc + if a.nNpc and b.nNpc and a.nNpc ~= b.nNpc then + return a.nNpc < b.nNpc + end + -- near(<16, hp dis >= 40%) + if a.nDis and a.nHp and a.nDis < 4 and b.nDis < 4 and math.abs(a.nDis - b.nDis) < 2 and math.abs(a.nHp - b.nHp) >= 3 then + return a.nHp < b.nHp + end + -- dist + if a.nDis and a.nDis ~= b.nDis then + return a.nDis < b.nDis + end + -- nHp + if a.nHp and a.nHp ~= b.nHp then + return a.nHp < b.nHp + end + -- party + -- if a.nParty then + -- return a.nParty < b.nParty + -- end + return false + end) + if not X.IsEmpty(tList) then + -- select first target + local dwTarget = tList[1].dwID + tJustList[dwTarget] = 1 + SetTarget(tList[1].nRealType or tList[1].nType, dwTarget) + end +end + +X.RegisterHotKey('MY_TargetSelect', _L['Smart select target'], function() D.SearchTarget() end, nil) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TargetSelect__PUBG', function() + if arg0 and arg0 ~= 'MY_TargetSelect__PUBG' then + return + end + D.UpdateRestrict() +end) +X.RegisterEvent('LOADING_END', D.UpdateRestrict) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Target/ui/MY_TargetDirection.ini b/MY_Target/ui/MY_TargetDirection.ini new file mode 100644 index 000000000..50d37393c --- /dev/null +++ b/MY_Target/ui/MY_TargetDirection.ini @@ -0,0 +1,178 @@ +[MY_TargetDirection] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=160 +Height=160 +DragAreaWidth=80 +DragAreaHeight=80 +IsCustomDragable=0 +DisableBringToTop=1 +DisableBreath=0 +DummyWnd=1 +BreatheWhenHide=1 +DragAreaLeft=0 +DragAreaTop=0 +MousePenetrable=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TargetDirection +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=160 +Height=160 + +[Handle_Main] +._WndType=Handle +._Parent=Handle_Total +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=160 +Height=160 + +[Image_Bg1] +._WndType=Image +._Parent=Handle_Main +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=1 +Alpha=0 +Left=0 +Top=0 +PosType=0 +Width=80 +Height=80 + +[Image_Force] +._WndType=Image +._Parent=Handle_Main +Alpha=255 +Left=60 +Top=60 +Width=40 +Height=40 +ImageType=0 +PosType=0 +Image= + +[Image_Arrow] +._WndType=Image +._Parent=Handle_Main +Alpha=255 +left=0 +top=0 +Image=interface\MY\MY_Target\img\MY_TargetDirection.UITex +Left=0 +Top=0 +PosType=0 +Frame=2 +Width=160 +Height=160 +ImageType=6 + +[Text_Distance] +._WndType=Text +._Parent=Handle_Main +Alpha=255 +Left=0 +Top=105 +PosType=0 +Width=160 +Height=20 +HAlign=1 +VAlign=1 +FontScheme=188 +RowSpacing=0 +FontSpacing=0 + +[Box_State] +._WndType=Box +._Parent=Handle_Main +Left=60 +Top=60 +PosType=0 +IconID=0 +Width=40 +Height=40 + +[Text_State] +._WndType=Text +._Parent=Handle_Main +Alpha=255 +Left=0 +Top=40 +PosType=0 +Width=160 +Height=30 +HAlign=1 +VAlign=1 +FontScheme=199 +RowSpacing=0 +FontSpacing=0 +$Text= + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TargetDirection +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 + diff --git a/MY_TargetMon/data/template/zhcn.jx3dat b/MY_TargetMon/data/template/zhcn.jx3dat new file mode 100644 index 000000000..eae267bc8 --- /dev/null +++ b/MY_TargetMon/data/template/zhcn.jx3dat @@ -0,0 +1,106 @@ +local __META__ = "__META__" +return { + uuid = {__META__, {"nil", "string"}, nil}, + embedded = false, + group = "", + sort = 10000, + caption = "新建目标监控", + type = "BUFF", + target = "CLIENT_PLAYER", + scale = 0.7 , -- 界面缩放比 + iconFontScale = 1 , -- 图标文字缩放比 + otherFontScale = 1.4 , -- 其他文字缩放比 + ignoreSystemUIScale = false , -- 禁止系统缩放 + enable = false , -- 启用标记 + penetrable = true , -- 是否穿透 + draggable = false , -- 是否可拖拽 + alignment = "LEFT", -- 对齐方式 + hideVoid = false , -- 隐藏消失的BUFF + hideOthers = false , -- 只显示自己的BUFF + maxLineCount = 1 , -- 单行最大数量 + showName = true , -- 显示名字 + showTime = true , -- 显示时间 + cdCircle = false , -- 倒计时圈 + cdFlash = false , -- 倒计时分段特效 + cdReadySpark = false , -- 消失特效 + decimalTime = 1 , -- 倒计时出现小数点时间 + cdBar = true , -- 显示倒计时条 + cdBarWidth = 240 , -- 倒计时条宽度 + playSound = true , -- 是否播放声音 + cdBarUITex = "Interface/MY/MY_TargetMon/img/ST.UITex|5", -- 倒计时条图素 + boxBgUITex = "", -- Box背景图素 + anchor = { y = 152, x = -343, s = "TOPLEFT", r = "CENTER" }, + monitors = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = { -- mon + __META__, + __VALUE__ = { + enable = true, + iconid = {__META__, {"nil", "number"}, nil}, + name = "", + uuid = {__META__, {"nil", "string"}, nil}, + capture = true, + nameAlias = true, + longAlias = {__META__, {"nil", "string"}, nil}, + rgbLongAlias = {255, 255, 0}, + shortAlias = {__META__, {"nil", "string"}, nil}, + rgbShortAlias = {255, 255, 0}, + rHideVoid = false, -- 翻转主配置hideVoid字段 + rHideOthers = false, -- 翻转当和主配置hideOthers字段 + extentAnimate = {__META__, {"nil", "string"}, nil}, -- BOX特效 + soundAppear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + soundDisappear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + ids = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = { -- monid + enable = true, + iconid = {__META__, {"nil", "number"}, nil}, + soundAppear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + soundDisappear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + levels = { + __META__, + __VALUE__ = {}, + __KEY_TEMPLATE__ = {__META__, {"number"}, nil}, + __CHILD_TEMPLATE__ = { enable = true, iconid = {__META__, {"nil", "number"}, nil} }, + }, + ignoreLevel = true, + }, + }, + kungfus = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + tarkungfus = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + maps = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + ignoreId = true, + }, + }, + }, +} diff --git a/MY_TargetMon/data/template/zhtw.jx3dat b/MY_TargetMon/data/template/zhtw.jx3dat new file mode 100644 index 000000000..c0c1571b6 --- /dev/null +++ b/MY_TargetMon/data/template/zhtw.jx3dat @@ -0,0 +1,106 @@ +local __META__ = "__META__" +return { + uuid = {__META__, {"nil", "string"}, nil}, + embedded = false, + group = "", + sort = 10000, + caption = "鏂板缓鐩鐩f帶", + type = "BUFF", + target = "CLIENT_PLAYER", + scale = 0.7 , -- 鐣岄潰绺斁姣 + iconFontScale = 1 , -- 鍦栨鏂囧瓧绺斁姣 + otherFontScale = 1.4 , -- 鍏朵粬鏂囧瓧绺斁姣 + ignoreSystemUIScale = false , -- 绂佹绯荤当绺斁 + enable = false , -- 鍟熺敤妯欒 + penetrable = true , -- 鏄惁绌块 + draggable = false , -- 鏄惁鍙嫋鎷 + alignment = "LEFT", -- 灏嶉綂鏂瑰紡 + hideVoid = false , -- 闅辫棌娑堝け鐨凚UFF + hideOthers = false , -- 鍙’绀鸿嚜宸辩殑BUFF + maxLineCount = 1 , -- 鍠鏈澶ф暩閲 + showName = true , -- 椤ず鍚嶅瓧 + showTime = true , -- 椤ず鏅傞枔 + cdCircle = false , -- 鍊掕▓鏅傚湀 + cdFlash = false , -- 鍊掕▓鏅傚垎娈电壒鏁 + cdReadySpark = false , -- 娑堝け鐗规晥 + decimalTime = 1 , -- 鍊掕▓鏅傚嚭鐝惧皬鏁搁粸鏅傞枔 + cdBar = true , -- 椤ず鍊掕▓鏅傛 + cdBarWidth = 240 , -- 鍊掕▓鏅傛瀵害 + playSound = true , -- 鏄惁鎾斁鑱查煶 + cdBarUITex = "Interface/MY/MY_TargetMon/img/ST.UITex|5", -- 鍊掕▓鏅傛鍦栫礌 + boxBgUITex = "", -- Box鑳屾櫙鍦栫礌 + anchor = { y = 152, x = -343, s = "TOPLEFT", r = "CENTER" }, + monitors = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = { -- mon + __META__, + __VALUE__ = { + enable = true, + iconid = {__META__, {"nil", "number"}, nil}, + name = "", + uuid = {__META__, {"nil", "string"}, nil}, + capture = true, + nameAlias = true, + longAlias = {__META__, {"nil", "string"}, nil}, + rgbLongAlias = {255, 255, 0}, + shortAlias = {__META__, {"nil", "string"}, nil}, + rgbShortAlias = {255, 255, 0}, + rHideVoid = false, -- 缈昏綁涓婚厤缃甴ideVoid娆勪綅 + rHideOthers = false, -- 缈昏綁鐣跺拰涓婚厤缃甴ideOthers娆勪綅 + extentAnimate = {__META__, {"nil", "string"}, nil}, -- BOX鐗规晥 + soundAppear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + soundDisappear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + ids = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = { -- monid + enable = true, + iconid = {__META__, {"nil", "number"}, nil}, + soundAppear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + soundDisappear = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = 1, + }, + levels = { + __META__, + __VALUE__ = {}, + __KEY_TEMPLATE__ = {__META__, {"number"}, nil}, + __CHILD_TEMPLATE__ = { enable = true, iconid = {__META__, {"nil", "number"}, nil} }, + }, + ignoreLevel = true, + }, + }, + kungfus = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + tarkungfus = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + maps = { + __META__, + __VALUE__ = {}, + __CHILD_TEMPLATE__ = true, + }, + ignoreId = true, + }, + }, + }, +} diff --git a/MY_TargetMon/img/ST.Tga b/MY_TargetMon/img/ST.Tga new file mode 100644 index 000000000..916609ebc Binary files /dev/null and b/MY_TargetMon/img/ST.Tga differ diff --git a/MY_TargetMon/img/ST.UITex b/MY_TargetMon/img/ST.UITex new file mode 100644 index 000000000..0b462d1ee Binary files /dev/null and b/MY_TargetMon/img/ST.UITex differ diff --git a/MY_TargetMon/img/ST.txt b/MY_TargetMon/img/ST.txt new file mode 100644 index 000000000..447474695 --- /dev/null +++ b/MY_TargetMon/img/ST.txt @@ -0,0 +1,10 @@ +Farme Left Top Width High File +0 0 0 256 34 C:\Users\root\Desktop\橙色.tga +1 0 36 256 34 C:\Users\root\Desktop\粉色.tga +2 0 72 256 34 C:\Users\root\Desktop\红色.tga +3 0 108 256 34 C:\Users\root\Desktop\黄色.tga +4 0 144 256 34 C:\Users\root\Desktop\灰色.tga +5 0 180 256 34 C:\Users\root\Desktop\蓝色.tga +6 0 216 256 34 C:\Users\root\Desktop\绿色.tga +7 0 252 256 34 C:\Users\root\Desktop\青色.tga +8 0 288 256 34 C:\Users\root\Desktop\紫色.tga diff --git a/MY_TargetMon/info.ini b/MY_TargetMon/info.ini new file mode 100644 index 000000000..404e6c80f --- /dev/null +++ b/MY_TargetMon/info.ini @@ -0,0 +1,17 @@ +[MY_TargetMon] +name=目标监控 +desc=监控指定目标的状态信息 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_TargetMonConfig.lua +lua_1=src\MY_TargetMonData.lua +lua_2=src\MY_TargetMonView.lua +lua_3=src\MY_TargetMon_PS.lua +lua_4=src\MY_TargetMon_ConfigPanel.lua +lua_5=src\MY_TargetMon_MonitorPanel.lua +lua_6=src\MY_TargetMon_Subscribe.lua +lua_7=src\MY_TargetMon_Subscribe_Data.lua +lua_8=src\MY_TargetMon_Subscribe_FavoriteData.lua +lua_9=src\MY_TargetMon.PS.lua +package=MY diff --git a/MY_TargetMon/info.ini.zh_TW b/MY_TargetMon/info.ini.zh_TW new file mode 100644 index 000000000..659cedcbc --- /dev/null +++ b/MY_TargetMon/info.ini.zh_TW @@ -0,0 +1,17 @@ +[MY_TargetMon] +name=鐩鐩f帶 +desc=鐩f帶鎸囧畾鐩鐨勭媭鎱嬩俊鎭 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src\MY_TargetMonConfig.lua +lua_1=src\MY_TargetMonData.lua +lua_2=src\MY_TargetMonView.lua +lua_3=src\MY_TargetMon_PS.lua +lua_4=src\MY_TargetMon_ConfigPanel.lua +lua_5=src\MY_TargetMon_MonitorPanel.lua +lua_6=src\MY_TargetMon_Subscribe.lua +lua_7=src\MY_TargetMon_Subscribe_Data.lua +lua_8=src\MY_TargetMon_Subscribe_FavoriteData.lua +lua_9=src\MY_TargetMon.PS.lua +package=MY diff --git a/MY_TargetMon/lang/zhcn.jx3dat b/MY_TargetMon/lang/zhcn.jx3dat new file mode 100644 index 000000000..c94ceea07 --- /dev/null +++ b/MY_TargetMon/lang/zhcn.jx3dat @@ -0,0 +1,322 @@ +return { + ['MY_TargetMon'] = '目标监控', + ['*'] = '●', + ['Target monitor'] = '目标监控', + ['[MY TargetMon] '] = '[茗伊监控] ', + ['Mingyi self buff monitor'] = '茗伊自身气劲监控', + ['Mingyi target buff monitor'] = '茗伊目标气劲监控', + + ['Encrypt and compressing: '] = '更新加密压缩:', + ['Manage my online data'] = '管理我的在线数据', + + ['Enable'] = '启用', + ['Hide others buff'] = '只看我的', + ['Hide others buff TIP'] = '只显示来源属于自己的气劲', + ['Hide if others'] = '只显示自己的', + ['Show even others'] = '他人的也显示', + ['Hide void'] = '隐藏消失的', + ['Hide if void'] = '消失则不显示', + ['Show even void'] = '消失仍然显示', + ['Penetrable'] = '界面穿透', + ['Undragable'] = '禁止拖动', + ['Ignore system ui scale'] = '禁系统缩放', + ['Show cd circle'] = '倒计时圈', + ['Show cd flash'] = '分段特效', + ['Show cd ready spark'] = '结束特效', + ['Show cd bar'] = '倒计时条', + ['Show name'] = '显示名称', + ['Show time'] = '显示时间', + + ['Please input name/id:'] = '请输入名称/ID:', + ['Display %d eachline.'] = '每行%d个', + ['UI scale %d%%.'] = '界面缩放%d%%', + ['Other font scale %d%%.'] = '其它文字缩放%d%%', + ['Icon font scale %d%%.'] = '图标文字缩放%d%%', + ['CD width %dpx.'] = '倒计时宽%dpx', + ['Select style'] = '选择风格', + ['Countdown style'] = '计时风格', + ['Play sound'] = '播放声音', + ['Icon style'] = '图标风格', + ['Set target'] = '设置目标', + ['Only enable in those maps'] = '仅在指定地图启用', + ['Set monitor'] = '设置监控', + ['Ids'] = 'ID列表', + ['All ids'] = '监控全部', + ['Levels'] = '等级列表', + ['All levels'] = '监控全部', + ['TARGET'] = { + ['CLIENT_PLAYER' ] = '自己的角色', + ['CONTROL_PLAYER' ] = '控制的角色', + ['TARGET' ] = '当前目标', + ['TTARGET' ] = '目标的目标', + ['TEAM_MARK_CLOUD'] = '团队标记 - 白云', + ['TEAM_MARK_SWORD'] = '团队标记 - 小剑', + ['TEAM_MARK_AX' ] = '团队标记 - 斧头', + ['TEAM_MARK_HOOK' ] = '团队标记 - 钩子', + ['TEAM_MARK_DRUM' ] = '团队标记 - 红鼓', + ['TEAM_MARK_SHEAR'] = '团队标记 - 剪刀', + ['TEAM_MARK_STICK'] = '团队标记 - 棒槌', + ['TEAM_MARK_JADE' ] = '团队标记 - 如意', + ['TEAM_MARK_DART' ] = '团队标记 - 飞镖', + ['TEAM_MARK_FAN' ] = '团队标记 - 扇子', + }, + ['TYPE'] = { + ['BUFF' ] = '气劲监控', + ['SKILL'] = '招式监控', + }, + ['ALIGNMENT'] = { + ['LEFT'] = '左对齐', + ['RIGHT'] = '右对齐', + ['CENTER'] = '居中对齐', + }, + ['Export'] = '导出', + ['Ensure export'] = '确认导出', + ['Streaming client does not support export!'] = '云端客户端不支持导出功能!', + ['Press ALT to export as default data.\n Press CTRL to export as plain.'] = '按住ALT导出为内置数据。\n按住CTRL导出为非压缩明文文件。', + ['Ensure export (with indent)'] = '确认导出(格式化输出)', + ['Ensure export (as embedded)'] = '确认导出(保存为内置数据)', + ['Data exported, file saved at %s.'] = '数据导出成功,文件存放在目录:%s。', + ['Import succeed, %d imported and %d replaced.'] = '成功导入数据%d条,其中覆盖同名数据%d条。', + ['Import failed, cannot decode file.'] = '导入失败,文件无法解析。', + ['Insert'] = '插入', + ['Delete'] = '删除', + ['Move up'] = '上移', + ['Move down'] = '下移', + ['Create'] = '创建', + ['Import'] = '导入', + ['Save As Default'] = '设为默认', + ['Reset Default'] = '恢复默认', + ['Common monitor'] = '通用监控', + ['Current kungfu monitor'] = '当前心法监控', + ['Add'] = '添加', + ['Rename'] = '重命名', + ['Close'] = '关闭', + ['Please input import data:'] = '请输入导入数据', + ['Sure to save as default?'] = '确认保存为默认设置?', + ['Sure to reset default?'] = '请选择你要恢复的数据?', + ['Default config'] = '默认设置', + ['Origin config'] = '初始设置', + ['MY Buff Monitor'] = '茗伊气劲监控', + ['Cancel buff %d - %d'] = '卸除气劲 %d - %d', + ['Move Up'] = '上移', + ['Move Down'] = '下移', + ['Cancel buff is disabled in arena and battlefield.'] = '快捷键卸除气劲在名剑大会与战场内不可用', + ['Hotkey cancel is only allowed for buff.'] = '快捷键只能取消气劲不能施展招式', + ['Cannot find target to cancel buff.'] = '找不到需要卸除气劲的目标', + ['Cannot find buff to cancel.'] = '需要卸除的气劲不存在', + ['MY_TargetMon is blocked in current kungfu, temporary disabled.'] = '当前心法禁止使用目标监控,相关功能已暂时关闭。', + ['Please input id:'] = '请输入ID:', + ['Manual add id'] = '手动添加ID', + ['Please input level:'] = '请输入等级:', + ['Manual add level'] = '手动添加等级', + + ['Always show decimal time.'] = '总是显示小数点', + ['Never show decimal time.'] = '不显示小数点', + ['Show decimal time left in %ds.'] = '最后%d秒显示小数点', + ['Not set'] = '未设置', + ['Long alias: %s'] = '长别名:%s', + ['Please input long alias:'] = '请输入长别名:', + ['Short alias: %s'] = '短别名:%s', + ['Please input short alias:'] = '请输入短别名:', + ['Display origin name when no alias'] = '无别名时显示原始名称', + ['Active extent animate'] = '设置激活特效框', + ['Play sound when appear'] = '设置出现提示音', + ['Play sound when disappear'] = '设置消失提示音', + ['Default alert sound'] = '默认提示音', + ['Self kungfu'] = '自身心法要求', + ['Target kungfu'] = '目标心法要求', + ['Map filter'] = '所在地图要求', + ['All maps'] = '全部地图', + ['All kungfus'] = '全部心法', + ['Auto capture by name'] = '自动捕获ID', + ['Search'] = '搜索', + ['None'] = '无', + ['(Embedded caption cannot be changed)'] = '(内置数据标题不可更改)', + ['Press ctrl to delete embedded data permanently.'] = '按住CTRL点击可彻底删除该内置数据。', + + -- MY_TargetMonConfig.lua + ['Common map'] = '通用地图', + ['City map'] = '主城地图', + ['Dungeon map'] = '秘境地图', + ['Team dungeon map'] = '小队秘境地图', + ['Raid dungeon map'] = '团队秘境地图', + ['Starve map'] = '浪客行地图', + ['Village map'] = '野外地图', + ['Arena map'] = '名剑大会地图', + ['Battlefield map'] = '战场地图', + ['Pubg map'] = '绝境战场地图', + ['Zombie map'] = '李渡鬼域地图', + ['Monster map'] = '百战地图', + ['Moba map'] = '列星虚境地图', + ['Homeland map'] = '家园地图', + ['Roguelike map'] = '八荒衡鉴地图', + ['Competition map'] = '竞技地图', + ['Camp map'] = '阵营地图', + ['Stronghold map'] = '据点地图', + ['School map'] = '门派地图', + ['Guild territory map'] = '帮会领地地图', + + -- MY_TargetMon_PS.lua + ['MY_TargetMon_PS'] = '目标监控设置面板', + ['Create Config'] = '新建监控', + ['Import Export'] = '导入导出', + ['Import local data'] = '导入本地数据', + ['Export local data'] = '导出本地数据', + ['Subscribe remote data'] = '订阅在线数据', + ['Import ancient data'] = '导入旧版数据', + ['Delete all datasets'] = '清空全部数据', + ['Sure to delete all datasets? This operation can not be undone.'] = '确定要清空全部数据吗?数据清空操作确认后无法撤销。', + ['Sure to import ancient dataset? Current data with same uuid will be overwritten.'] = '确定要导入旧版数据吗?当前数据如有UUID与旧版数据相同的监控,将会被旧版监控数据覆盖。', + ['Ancient datasets import success:'] = '旧版数据导入成功:', + ['Are you sure to import datasets below?'] = '确定要加载以下数据吗?', + ['Confirm Import'] = '确认导入', + ['Load dataset success: %s'] = '数据加载成功:%s', + ['Load dataset failed: %s'] = '数据加载失败:%s', + ['Ensure export'] = '确认导出', + ['Ensure export (with indent)'] = '确认导出(格式化输出)', + ['Export dataset success: %s'] = '导出数据成功:%s', + ['Please select at least one dataset to export'] = '至少选中一条数据后方可导出', + ['Open data folder'] = '打开数据文件夹', + ['Search Monitor'] = '搜索数据', + ['Create Monitor'] = '新建条目', + ['Please Input Monitor Buff Id'] = '请输入要监控的气劲ID', + ['Please Input Monitor Skill Id'] = '请输入要监控的招式ID', + ['Invalid Input Number'] = '无法解析输入的数字内容', + ['Please Input Monitor Buff Level'] = '请输入要监控的气劲等级,输入0表示不限制等级', + ['Please Input Monitor Skill Level'] = '请输入要监控的招式等级,输入0表示不限制等级', + ['Open/close MY_TargetMon'] = '打开/关闭目标监控', + + -- MY_TargetMon_ConfigPanel.lua + ['MY_TargetMon_ConfigPanel'] = '目标监控项全局设置面板', + ['Title:'] = '标题:', + ['Author:'] = '作者:', + ['Version:'] = '版本:', + ['New target mon dataset'] = '新建目标监控', + ['Sure to delete monitor? This operation can not be undone.'] = '您确定要删除该数据吗?数据删除操作确认后无法撤销。', + ['Move to top'] = '移动到顶部', + ['Move to bottom'] = '移动到底部', + ['Current dataset total monitor count is %d, active monitors count is %d, visible monitors count is %d.'] = '数据集包含总数据%d条,当前角色激活数据%d条,当前显示数据%d条。', + ['Current dataset is not active.'] = '数据集在当前角色状态下未激活。', + ['Total monitors reaches max limit: %d/%d.'] = '所有监控数据集总条目数量已超出最大限制:%d/%d,部分监控条目将不会显示。', + + -- MY_TargetMon_MonitorPanel.lua + ['MY_TargetMon_MonitorPanel'] = '目标监控条目设置面板', + MONITOR_CONTENT_LIST = { + '伪装', + '无敌', + '减速', + '免控', + '定身', + '锁足', + '眩晕', + '封内', + '封轻功', + '隐身', + '减疗', + '减伤', + }, + ['Monitor Enable'] = '启用', + ['Monitor Note'] = '备注名称', + ['Monitor Content'] = '提示内容', + ['Monitor Group'] = '监控组名', + ['Monitor same group will only show one at the same time'] = '相同组的监控项同时只会显示一个,设置该项后同组仅最后一个监控项可在隐藏后显示图标。', + ['Monitor Change Icon'] = '修改图标', + ['Monitor Common Config'] = '通用设置', + ['Monitor Condition Config'] = '条件设置', + ['Monitor ID'] = 'ID', + ['Monitor Level'] = '等级', + ['Monitor StackNum'] = '层数', + ['Monitor op value set to 0, means no limit, operator will be ignored.'] = '比较数值设置为0表示任何条件均满足要求。', + ['Monitor Self Kungfu Requirement'] = '自身心法要求', + ['Monitor Target Kungfu Requirement'] = '目标心法要求', + ['Monitor All Kungfu'] = '全部心法', + ['Monitor Map Requirement'] = '所在地图要求', + ['Monitor Map Requirement By Type'] = '按地图类型', + ['Monitor All Maps'] = '全部地图', + ['Monitor Show Even Void'] = '消失仍然显示', + ['Monitor Hide If Void'] = '消失则不显示', + ['Monitor Show Even Others'] = '他人的也显示', + ['Monitor Hide If Others'] = '只显示自己的', + ['Monitor Effect Config'] = '效果设置', + ['Monitor Play Sound When Appear'] = '设置出现提示音', + ['Monitor Play Sound When Disappear'] = '设置消失提示音', + ['Monitor Active Extent Animate'] = '设置激活特效框', + + -- MY_TargetMon_Subscribe.lua + ['MY_TargetMon_Subscribe'] = '目标监控订阅数据', + + -- MY_TargetMon_Subscribe_Data.lua + ['MY_TargetMon_Subscribe_Data'] = '目标监控订阅数据', + ['Fetch repo meta list failed.'] = '获取推荐数据失败。', + ['ERR: Decode info content as json failed!'] = '错误:描述文件解析失败!', + ['ERR: Info content is illegal!'] = '错误:描述文件数据结构不符合约束!', + ['ERR404: MetaInfo address not found!'] = '错误404:订阅地址不存在!', + ['ERR: Get MetaInfo failed!'] = '错误:获取描述文件失败!', + ['Downloading in progress, please wait...'] = '数据下载正在进行中,请稍后...', + ['Decode %s failed!'] = '解码[%s]失败!', + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['You are not in the team.'] = '你不在队伍中。', + ['You are not team leader.'] = '你不是队长,无法执行这个操作。', + ['Please select one dataset first!'] = '请先选择一个数据项!', + ['Confirm?'] = '确定执行这个操作?', + ['See details'] = '查看详情', + ['Unsubscribe'] = '取消订阅', + ['Downloading...'] = '下载中...', + ['Subscribed'] = '已订阅', + ['Can update'] = '有更新', + ['Subscribe'] = '订阅', + ['Author'] = '作者', + ['Title'] = '标题', + ['Sync team'] = '同步团队', + ['Refresh list'] = '刷新列表', + ['Prev page'] = '上一页', + ['Next page'] = '下一页', + ['Copy meta url'] = '复制订阅地址', + ['Copy short meta url'] = '复制短地址', + ['Add favorite'] = '加入收藏', + ['Add favorite success, you can switch to favorite page to see.'] = '数据收藏成功,前往收藏数据分页即可查看。', + ['MetaInfo URL: %s'] = '订阅地址:%s', + ['(Short URL: %s)'] = '(短链:%s)', + ['Subscribe list'] = '推荐数据', + ['%s request download:'] = '[%s]建议下载该数据:', + ['Title: %s'] = '标题:%s', + ['Author: %s'] = '作者:%s', + ['Update time: %s'] = '更新时间:%s', + ['%s loaded %s'] = '[%s]加载了目标监控数据:%s。', + ['Upgrade TargetMon data to latest: %s'] = '目标监控数据已更新至最新:%s。', + + -- MY_TargetMon_Subscribe_FavoriteData.lua + ['MY_TargetMon_Subscribe_FavoriteData'] = '目标监控收藏数据', + ['Embedded dataset cannot be removed!'] = '内置数据不可删除!', + ['Confirm?'] = '确定执行这个操作?', + ['See details'] = '查看详情', + ['Unsubscribe'] = '取消订阅', + ['Fetching...'] = '获取中...', + ['Downloading...'] = '下载中...', + ['Subscribed'] = '已订阅', + ['Can update'] = '有更新', + ['Subscribe'] = '订阅', + ['Author'] = '作者', + ['Title'] = '标题', + ['Sync team'] = '同步团队', + ['Check update'] = '检查更新', + ['Add url'] = '添加订阅', + ['Remove url'] = '删除订阅', + ['Export meta url'] = '导出订阅', + ['Please input meta address:'] = '请输入订阅地址,添加多个使用分号分隔:', + ['Please select one dataset first!'] = '请先选择一个数据项!', + ['Copy meta url'] = '复制订阅地址', + ['Copy short meta url'] = '复制短地址', + ['MetaInfo URL: %s'] = '订阅地址:%s', + ['(Short URL: %s)'] = '(短链:%s)', + ['Favorite list'] = '收藏数据', + + -- MY_TargetMon.PS.lua + ['Data save mode'] = '数据保存模式', + ['View render config'] = '界面渲染设置', + ['View render interval'] = '渲染频率', + ['View render interval: every %d frame'] = '渲染频率:每%d帧渲染一次。', + ['Use common data'] = '使用通用数据(即当前角色和其他角色共用同一个数据)', + ['Data settings'] = '数据设置', + ['Open config panel'] = '打开设置面板', +} diff --git a/MY_TargetMon/lang/zhtw.jx3dat b/MY_TargetMon/lang/zhtw.jx3dat new file mode 100644 index 000000000..40f93c4d6 --- /dev/null +++ b/MY_TargetMon/lang/zhtw.jx3dat @@ -0,0 +1,322 @@ +return { + ['MY_TargetMon'] = '鐩鐩f帶', + ['*'] = '鈼', + ['Target monitor'] = '鐩鐩f帶', + ['[MY TargetMon] '] = '[鑼椾紛鐩f帶] ', + ['Mingyi self buff monitor'] = '鑼椾紛鑷韩姘e媮鐩f帶', + ['Mingyi target buff monitor'] = '鑼椾紛鐩姘e媮鐩f帶', + + ['Encrypt and compressing: '] = '鏇存柊鍔犲瘑澹撶府锛', + ['Manage my online data'] = '绠$悊鎴戠殑鍦ㄧ窔鏁告摎', + + ['Enable'] = '鍟熺敤', + ['Hide others buff'] = '鍙湅鎴戠殑', + ['Hide others buff TIP'] = '鍙’绀轰締婧愬爆鏂艰嚜宸辩殑姘e媮', + ['Hide if others'] = '鍙’绀鸿嚜宸辩殑', + ['Show even others'] = '浠栦汉鐨勪篃椤ず', + ['Hide void'] = '闅辫棌娑堝け鐨', + ['Hide if void'] = '娑堝け鍓囦笉椤ず', + ['Show even void'] = '娑堝け浠嶇劧椤ず', + ['Penetrable'] = '鐣岄潰绌块', + ['Undragable'] = '绂佹鎷栧嫊', + ['Ignore system ui scale'] = '绂佺郴绲辩府鏀', + ['Show cd circle'] = '鍊掕▓鏅傚湀', + ['Show cd flash'] = '鍒嗘鐗规晥', + ['Show cd ready spark'] = '绲愭潫鐗规晥', + ['Show cd bar'] = '鍊掕▓鏅傛', + ['Show name'] = '椤ず鍚嶇ū', + ['Show time'] = '椤ず鏅傞枔', + + ['Please input name/id:'] = '璜嬭几鍏ュ悕绋/ID锛', + ['Display %d eachline.'] = '姣忚%d鍊', + ['UI scale %d%%.'] = '鐣岄潰绺斁%d%%', + ['Other font scale %d%%.'] = '鍏跺畠鏂囧瓧绺斁%d%%', + ['Icon font scale %d%%.'] = '鍦栨鏂囧瓧绺斁%d%%', + ['CD width %dpx.'] = '鍊掕▓鏅傚%dpx', + ['Select style'] = '閬告搰棰ㄦ牸', + ['Countdown style'] = '瑷堟檪棰ㄦ牸', + ['Play sound'] = '鎾斁鑱查煶', + ['Icon style'] = '鍦栨棰ㄦ牸', + ['Set target'] = '瑷疆鐩', + ['Only enable in those maps'] = '鍍呭湪鎸囧畾鍦板湒鍟熺敤', + ['Set monitor'] = '瑷疆鐩f帶', + ['Ids'] = 'ID鍒楄〃', + ['All ids'] = '鐩f帶鍏ㄩ儴', + ['Levels'] = '绛夌礆鍒楄〃', + ['All levels'] = '鐩f帶鍏ㄩ儴', + ['TARGET'] = { + ['CLIENT_PLAYER' ] = '鑷繁鐨勮鑹', + ['CONTROL_PLAYER' ] = '鎺у埗鐨勮鑹', + ['TARGET' ] = '鐣跺墠鐩', + ['TTARGET' ] = '鐩鐨勭洰妯', + ['TEAM_MARK_CLOUD'] = '鍦橀殜妯欒 - 鐧介洸', + ['TEAM_MARK_SWORD'] = '鍦橀殜妯欒 - 灏忓妽', + ['TEAM_MARK_AX' ] = '鍦橀殜妯欒 - 鏂ч牠', + ['TEAM_MARK_HOOK' ] = '鍦橀殜妯欒 - 閴ゅ瓙', + ['TEAM_MARK_DRUM' ] = '鍦橀殜妯欒 - 绱呴紦', + ['TEAM_MARK_SHEAR'] = '鍦橀殜妯欒 - 鍓垁', + ['TEAM_MARK_STICK'] = '鍦橀殜妯欒 - 妫掓', + ['TEAM_MARK_JADE' ] = '鍦橀殜妯欒 - 濡傛剰', + ['TEAM_MARK_DART' ] = '鍦橀殜妯欒 - 椋涢彚', + ['TEAM_MARK_FAN' ] = '鍦橀殜妯欒 - 鎵囧瓙', + }, + ['TYPE'] = { + ['BUFF' ] = '姘e媮鐩f帶', + ['SKILL'] = '鎷涘紡鐩f帶', + }, + ['ALIGNMENT'] = { + ['LEFT'] = '宸﹀皪榻', + ['RIGHT'] = '鍙冲皪榻', + ['CENTER'] = '灞呬腑灏嶉綂', + }, + ['Export'] = '灏庡嚭', + ['Ensure export'] = '纰鸿獚灏庡嚭', + ['Streaming client does not support export!'] = '闆茬瀹㈡埗绔笉鏀寔灏庡嚭鍔熻兘锛', + ['Press ALT to export as default data.\n Press CTRL to export as plain.'] = '鎸変綇ALT灏庡嚭鐐哄収缃暩鎿氥俓n鎸変綇CTRL灏庡嚭鐐洪潪澹撶府鏄庢枃鏂囦欢銆', + ['Ensure export (with indent)'] = '纰鸿獚灏庡嚭锛堟牸寮忓寲杓稿嚭锛', + ['Ensure export (as embedded)'] = '纰鸿獚灏庡嚭锛堜繚瀛樼偤鍏х疆鏁告摎锛', + ['Data exported, file saved at %s.'] = '鏁告摎灏庡嚭鎴愬姛锛屾枃浠跺瓨鏀惧湪鐩寗锛%s銆', + ['Import succeed, %d imported and %d replaced.'] = '鎴愬姛灏庡叆鏁告摎%d姊濓紝鍏朵腑瑕嗚搵鍚屽悕鏁告摎%d姊濄', + ['Import failed, cannot decode file.'] = '灏庡叆澶辨晽锛屾枃浠剁劇娉曡В鏋愩', + ['Insert'] = '鎻掑叆', + ['Delete'] = '鍒櫎', + ['Move up'] = '涓婄Щ', + ['Move down'] = '涓嬬Щ', + ['Create'] = '鍓靛缓', + ['Import'] = '灏庡叆', + ['Save As Default'] = '瑷偤榛樿獚', + ['Reset Default'] = '鎭㈠京榛樿獚', + ['Common monitor'] = '閫氱敤鐩f帶', + ['Current kungfu monitor'] = '鐣跺墠蹇冩硶鐩f帶', + ['Add'] = '娣诲姞', + ['Rename'] = '閲嶅懡鍚', + ['Close'] = '闂滈枆', + ['Please input import data:'] = '璜嬭几鍏ュ皫鍏ユ暩鎿', + ['Sure to save as default?'] = '纰鸿獚淇濆瓨鐐洪粯瑾嶈ō缃紵', + ['Sure to reset default?'] = '璜嬮伕鎿囦綘瑕佹仮寰╃殑鏁告摎锛', + ['Default config'] = '榛樿獚瑷疆', + ['Origin config'] = '鍒濆瑷疆', + ['MY Buff Monitor'] = '鑼椾紛姘e媮鐩f帶', + ['Cancel buff %d - %d'] = '鍗搁櫎姘e媮 %d - %d', + ['Move Up'] = '涓婄Щ', + ['Move Down'] = '涓嬬Щ', + ['Cancel buff is disabled in arena and battlefield.'] = '蹇嵎閸靛嵏闄ゆ埃鍕佸湪鍚嶅妽澶ф渻鑸囨埌鍫村収涓嶅彲鐢', + ['Hotkey cancel is only allowed for buff.'] = '蹇嵎閸靛彧鑳藉彇娑堟埃鍕佷笉鑳芥柦灞曟嫑寮', + ['Cannot find target to cancel buff.'] = '鎵句笉鍒伴渶瑕佸嵏闄ゆ埃鍕佺殑鐩', + ['Cannot find buff to cancel.'] = '闇瑕佸嵏闄ょ殑姘e媮涓嶅瓨鍦', + ['MY_TargetMon is blocked in current kungfu, temporary disabled.'] = '鐣跺墠蹇冩硶绂佹浣跨敤鐩鐩f帶锛岀浉闂滃姛鑳藉凡鏆檪闂滈枆銆', + ['Please input id:'] = '璜嬭几鍏D锛', + ['Manual add id'] = '鎵嬪嫊娣诲姞ID', + ['Please input level:'] = '璜嬭几鍏ョ瓑绱氾細', + ['Manual add level'] = '鎵嬪嫊娣诲姞绛夌礆', + + ['Always show decimal time.'] = '绺芥槸椤ず灏忔暩榛', + ['Never show decimal time.'] = '涓嶉’绀哄皬鏁搁粸', + ['Show decimal time left in %ds.'] = '鏈寰%d绉掗’绀哄皬鏁搁粸', + ['Not set'] = '鏈ō缃', + ['Long alias: %s'] = '闀峰垾鍚嶏細%s', + ['Please input long alias:'] = '璜嬭几鍏ラ暦鍒ュ悕锛', + ['Short alias: %s'] = '鐭垾鍚嶏細%s', + ['Please input short alias:'] = '璜嬭几鍏ョ煭鍒ュ悕锛', + ['Display origin name when no alias'] = '鐒″垾鍚嶆檪椤ず鍘熷鍚嶇ū', + ['Active extent animate'] = '瑷疆婵娲荤壒鏁堟', + ['Play sound when appear'] = '瑷疆鍑虹従鎻愮ず闊', + ['Play sound when disappear'] = '瑷疆娑堝け鎻愮ず闊', + ['Default alert sound'] = '榛樿獚鎻愮ず闊', + ['Self kungfu'] = '鑷韩蹇冩硶瑕佹眰', + ['Target kungfu'] = '鐩蹇冩硶瑕佹眰', + ['Map filter'] = '鎵鍦ㄥ湴鍦栬姹', + ['All maps'] = '鍏ㄩ儴鍦板湒', + ['All kungfus'] = '鍏ㄩ儴蹇冩硶', + ['Auto capture by name'] = '鑷嫊鎹曠嵅ID', + ['Search'] = '鎼滅储', + ['None'] = '鐒', + ['(Embedded caption cannot be changed)'] = '锛堝収缃暩鎿氭椤屼笉鍙洿鏀癸級', + ['Press ctrl to delete embedded data permanently.'] = '鎸変綇CTRL榛炴搳鍙竟搴曞埅闄よ┎鍏х疆鏁告摎銆', + + -- MY_TargetMonConfig.lua + ['Common map'] = '閫氱敤鍦板湒', + ['City map'] = '涓诲煄鍦板湒', + ['Dungeon map'] = '绉樺鍦板湒', + ['Team dungeon map'] = '灏忛殜绉樺鍦板湒', + ['Raid dungeon map'] = '鍦橀殜绉樺鍦板湒', + ['Starve map'] = '娴琛屽湴鍦', + ['Village map'] = '閲庡鍦板湒', + ['Arena map'] = '鍚嶅妽澶ф渻鍦板湒', + ['Battlefield map'] = '鎴板牬鍦板湒', + ['Pubg map'] = '绲曞鎴板牬鍦板湒', + ['Zombie map'] = '鏉庢浮楝煎煙鍦板湒', + ['Monster map'] = '鐧炬埌鍦板湒', + ['Moba map'] = '鍒楁槦铏涘鍦板湒', + ['Homeland map'] = '瀹跺湌鍦板湒', + ['Roguelike map'] = '鍏崚琛¢憭鍦板湒', + ['Competition map'] = '绔舵妧鍦板湒', + ['Camp map'] = '闄g嚐鍦板湒', + ['Stronghold map'] = '鎿氶粸鍦板湒', + ['School map'] = '闁娲惧湴鍦', + ['Guild territory map'] = '骞渻闋樺湴鍦板湒', + + -- MY_TargetMon_PS.lua + ['MY_TargetMon_PS'] = '鐩鐩f帶瑷疆闈㈡澘', + ['Create Config'] = '鏂板缓鐩f帶', + ['Import Export'] = '灏庡叆灏庡嚭', + ['Import local data'] = '灏庡叆鏈湴鏁告摎', + ['Export local data'] = '灏庡嚭鏈湴鏁告摎', + ['Subscribe remote data'] = '瑷傞柋鍦ㄧ窔鏁告摎', + ['Import ancient data'] = '灏庡叆鑸婄増鏁告摎', + ['Delete all datasets'] = '娓呯┖鍏ㄩ儴鏁告摎', + ['Sure to delete all datasets? This operation can not be undone.'] = '纰哄畾瑕佹竻绌哄叏閮ㄦ暩鎿氬棊锛熸暩鎿氭竻绌烘搷浣滅⒑瑾嶅緦鐒℃硶鎾ら姺銆', + ['Sure to import ancient dataset? Current data with same uuid will be overwritten.'] = '纰哄畾瑕佸皫鍏ヨ垔鐗堟暩鎿氬棊锛熺暥鍓嶆暩鎿氬鏈塙UID鑸囪垔鐗堟暩鎿氱浉鍚岀殑鐩f帶锛屽皣鏈冭鑸婄増鐩f帶鏁告摎瑕嗚搵銆', + ['Ancient datasets import success:'] = '鑸婄増鏁告摎灏庡叆鎴愬姛锛', + ['Are you sure to import datasets below?'] = '纰哄畾瑕佽級鍏ヤ互涓嬫暩鎿氬棊锛', + ['Confirm Import'] = '纰鸿獚灏庡叆', + ['Load dataset success: %s'] = '鏁告摎杓夊叆鎴愬姛锛%s', + ['Load dataset failed: %s'] = '鏁告摎杓夊叆澶辨晽锛%s', + ['Ensure export'] = '纰鸿獚灏庡嚭', + ['Ensure export (with indent)'] = '纰鸿獚灏庡嚭锛堟牸寮忓寲杓稿嚭锛', + ['Export dataset success: %s'] = '灏庡嚭鏁告摎鎴愬姛锛%s', + ['Please select at least one dataset to export'] = '鑷冲皯閬镐腑涓姊濇暩鎿氬緦鏂瑰彲灏庡嚭', + ['Open data folder'] = '鎵撻枊鏁告摎鏂囦欢澶', + ['Search Monitor'] = '鎼滅储鏁告摎', + ['Create Monitor'] = '鏂板缓姊濈洰', + ['Please Input Monitor Buff Id'] = '璜嬭几鍏ヨ鐩f帶鐨勬埃鍕両D', + ['Please Input Monitor Skill Id'] = '璜嬭几鍏ヨ鐩f帶鐨勬嫑寮廔D', + ['Invalid Input Number'] = '鐒℃硶瑙f瀽杓稿叆鐨勬暩瀛楀収瀹', + ['Please Input Monitor Buff Level'] = '璜嬭几鍏ヨ鐩f帶鐨勬埃鍕佺瓑绱氾紝杓稿叆0琛ㄧず涓嶉檺鍒剁瓑绱', + ['Please Input Monitor Skill Level'] = '璜嬭几鍏ヨ鐩f帶鐨勬嫑寮忕瓑绱氾紝杓稿叆0琛ㄧず涓嶉檺鍒剁瓑绱', + ['Open/close MY_TargetMon'] = '鎵撻枊/闂滈枆鐩鐩f帶', + + -- MY_TargetMon_ConfigPanel.lua + ['MY_TargetMon_ConfigPanel'] = '鐩鐩f帶闋呭叏灞瑷疆闈㈡澘', + ['Title:'] = '妯欓锛', + ['Author:'] = '浣滆咃細', + ['Version:'] = '鐗堟湰锛', + ['New target mon dataset'] = '鏂板缓鐩鐩f帶', + ['Sure to delete monitor? This operation can not be undone.'] = '鎮ㄧ⒑瀹氳鍒櫎瑭叉暩鎿氬棊锛熸暩鎿氬埅闄ゆ搷浣滅⒑瑾嶅緦鐒℃硶鎾ら姺銆', + ['Move to top'] = '绉诲嫊鍒伴爞閮', + ['Move to bottom'] = '绉诲嫊鍒板簳閮', + ['Current dataset total monitor count is %d, active monitors count is %d, visible monitors count is %d.'] = '鏁告摎闆嗗寘鍚附鏁告摎%d姊濓紝鐣跺墠瑙掕壊婵娲绘暩鎿%d姊濓紝鐣跺墠椤ず鏁告摎%d姊濄', + ['Current dataset is not active.'] = '鏁告摎闆嗗湪鐣跺墠瑙掕壊鐙鎱嬩笅鏈縺娲汇', + ['Total monitors reaches max limit: %d/%d.'] = '鎵鏈夌洠鎺ф暩鎿氶泦绺芥鐩暩閲忓凡瓒呭嚭鏈澶ч檺鍒讹細%d/%d锛岄儴鍒嗙洠鎺ф鐩皣涓嶆渻椤ず銆', + + -- MY_TargetMon_MonitorPanel.lua + ['MY_TargetMon_MonitorPanel'] = '鐩鐩f帶姊濈洰瑷疆闈㈡澘', + MONITOR_CONTENT_LIST = { + '鍋借', + '鐒℃暤', + '娓涢', + '鍏嶆帶', + '瀹氳韩', + '閹栬冻', + '鐪╂殘', + '灏佸収', + '灏佽紩鍔', + '闅辫韩', + '娓涚檪', + '娓涘偡', + }, + ['Monitor Enable'] = '鍟熺敤', + ['Monitor Note'] = '鍌欐敞鍚嶇ū', + ['Monitor Content'] = '鎻愮ず鍏у', + ['Monitor Group'] = '鐩f帶绲勫悕', + ['Monitor same group will only show one at the same time'] = '鐩稿悓绲勭殑鐩f帶闋呭悓鏅傚彧鏈冮’绀轰竴鍊嬶紝瑷疆瑭查爡寰屽悓绲勫儏鏈寰屼竴鍊嬬洠鎺ч爡鍙湪闅辫棌寰岄’绀哄湒妯欍', + ['Monitor Change Icon'] = '淇敼鍦栨', + ['Monitor Common Config'] = '閫氱敤瑷疆', + ['Monitor Condition Config'] = '姊濅欢瑷疆', + ['Monitor ID'] = 'ID', + ['Monitor Level'] = '绛夌礆', + ['Monitor StackNum'] = '灞ゆ暩', + ['Monitor op value set to 0, means no limit, operator will be ignored.'] = '姣旇純鏁稿艰ō缃偤0琛ㄧず浠讳綍姊濅欢鍧囨豢瓒宠姹傘', + ['Monitor Self Kungfu Requirement'] = '鑷韩蹇冩硶瑕佹眰', + ['Monitor Target Kungfu Requirement'] = '鐩蹇冩硶瑕佹眰', + ['Monitor All Kungfu'] = '鍏ㄩ儴蹇冩硶', + ['Monitor Map Requirement'] = '鎵鍦ㄥ湴鍦栬姹', + ['Monitor Map Requirement By Type'] = '鎸夊湴鍦栭鍨', + ['Monitor All Maps'] = '鍏ㄩ儴鍦板湒', + ['Monitor Show Even Void'] = '娑堝け浠嶇劧椤ず', + ['Monitor Hide If Void'] = '娑堝け鍓囦笉椤ず', + ['Monitor Show Even Others'] = '浠栦汉鐨勪篃椤ず', + ['Monitor Hide If Others'] = '鍙’绀鸿嚜宸辩殑', + ['Monitor Effect Config'] = '鏁堟灉瑷疆', + ['Monitor Play Sound When Appear'] = '瑷疆鍑虹従鎻愮ず闊', + ['Monitor Play Sound When Disappear'] = '瑷疆娑堝け鎻愮ず闊', + ['Monitor Active Extent Animate'] = '瑷疆婵娲荤壒鏁堟', + + -- MY_TargetMon_Subscribe.lua + ['MY_TargetMon_Subscribe'] = '鐩鐩f帶瑷傞柋鏁告摎', + + -- MY_TargetMon_Subscribe_Data.lua + ['MY_TargetMon_Subscribe_Data'] = '鐩鐩f帶瑷傞柋鏁告摎', + ['Fetch repo meta list failed.'] = '鐛插彇鎺ㄨ枽鏁告摎澶辨晽銆', + ['ERR: Decode info content as json failed!'] = '閷锛氭弿杩版枃浠惰В鏋愬け鏁楋紒', + ['ERR: Info content is illegal!'] = '閷锛氭弿杩版枃浠舵暩鎿氱祼妲嬩笉绗﹀悎绱勬潫锛', + ['ERR404: MetaInfo address not found!'] = '閷404锛氳▊闁卞湴鍧涓嶅瓨鍦紒', + ['ERR: Get MetaInfo failed!'] = '閷锛氱嵅鍙栨弿杩版枃浠跺け鏁楋紒', + ['Downloading in progress, please wait...'] = '鏁告摎涓嬭級姝e湪閫茶涓紝璜嬬◢寰...', + ['Decode %s failed!'] = '瑙g⒓[%s]澶辨晽锛', + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['You are not in the team.'] = '浣犱笉鍦ㄩ殜浼嶄腑銆', + ['You are not team leader.'] = '浣犱笉鏄殜闀凤紝鐒℃硶鍩疯閫欏嬫搷浣溿', + ['Please select one dataset first!'] = '璜嬪厛閬告搰涓鍊嬫暩鎿氶爡锛', + ['Confirm?'] = '纰哄畾鍩疯閫欏嬫搷浣滐紵', + ['See details'] = '鏌ョ湅瑭虫儏', + ['Unsubscribe'] = '鍙栨秷瑷傞柋', + ['Downloading...'] = '涓嬭級涓...', + ['Subscribed'] = '宸茶▊闁', + ['Can update'] = '鏈夋洿鏂', + ['Subscribe'] = '瑷傞柋', + ['Author'] = '浣滆', + ['Title'] = '妯欓', + ['Sync team'] = '鍚屾鍦橀殜', + ['Refresh list'] = '鍒锋柊鍒楄〃', + ['Prev page'] = '涓婁竴闋', + ['Next page'] = '涓嬩竴闋', + ['Copy meta url'] = '瑜囪=瑷傞柋鍦板潃', + ['Copy short meta url'] = '瑜囪=鐭湴鍧', + ['Add favorite'] = '鍔犲叆鏀惰棌', + ['Add favorite success, you can switch to favorite page to see.'] = '鏁告摎鏀惰棌鎴愬姛锛屽墠寰鏀惰棌鏁告摎鍒嗛爜鍗冲彲鏌ョ湅銆', + ['MetaInfo URL: %s'] = '瑷傞柋鍦板潃锛%s', + ['(Short URL: %s)'] = '锛堢煭閺堬細%s锛', + ['Subscribe list'] = '鎺ㄨ枽鏁告摎', + ['%s request download:'] = '[%s]寤鸿涓嬭級瑭叉暩鎿氾細', + ['Title: %s'] = '妯欓锛%s', + ['Author: %s'] = '浣滆咃細%s', + ['Update time: %s'] = '鏇存柊鏅傞枔锛%s', + ['%s loaded %s'] = '[%s]杓夊叆浜嗙洰妯欑洠鎺ф暩鎿氾細%s銆', + ['Upgrade TargetMon data to latest: %s'] = '鐩鐩f帶鏁告摎宸叉洿鏂拌嚦鏈鏂帮細%s銆', + + -- MY_TargetMon_Subscribe_FavoriteData.lua + ['MY_TargetMon_Subscribe_FavoriteData'] = '鐩鐩f帶鏀惰棌鏁告摎', + ['Embedded dataset cannot be removed!'] = '鍏х疆鏁告摎涓嶅彲鍒櫎锛', + ['Confirm?'] = '纰哄畾鍩疯閫欏嬫搷浣滐紵', + ['See details'] = '鏌ョ湅瑭虫儏', + ['Unsubscribe'] = '鍙栨秷瑷傞柋', + ['Fetching...'] = '鐛插彇涓...', + ['Downloading...'] = '涓嬭級涓...', + ['Subscribed'] = '宸茶▊闁', + ['Can update'] = '鏈夋洿鏂', + ['Subscribe'] = '瑷傞柋', + ['Author'] = '浣滆', + ['Title'] = '妯欓', + ['Sync team'] = '鍚屾鍦橀殜', + ['Check update'] = '妾㈡煡鏇存柊', + ['Add url'] = '娣诲姞瑷傞柋', + ['Remove url'] = '鍒櫎瑷傞柋', + ['Export meta url'] = '灏庡嚭瑷傞柋', + ['Please input meta address:'] = '璜嬭几鍏ヨ▊闁卞湴鍧锛屾坊鍔犲鍊嬩娇鐢ㄥ垎铏熷垎闅旓細', + ['Please select one dataset first!'] = '璜嬪厛閬告搰涓鍊嬫暩鎿氶爡锛', + ['Copy meta url'] = '瑜囪=瑷傞柋鍦板潃', + ['Copy short meta url'] = '瑜囪=鐭湴鍧', + ['MetaInfo URL: %s'] = '瑷傞柋鍦板潃锛%s', + ['(Short URL: %s)'] = '锛堢煭閺堬細%s锛', + ['Favorite list'] = '鏀惰棌鏁告摎', + + -- MY_TargetMon.PS.lua + ['Data save mode'] = '鏁告摎淇濆瓨妯″紡', + ['View render config'] = '鐣岄潰娓叉煋瑷疆', + ['View render interval'] = '娓叉煋闋荤巼', + ['View render interval: every %d frame'] = '娓叉煋闋荤巼锛氭瘡%d骞娓叉煋涓娆°', + ['Use common data'] = '浣跨敤閫氱敤鏁告摎锛堝嵆鐣跺墠瑙掕壊鍜屽叾浠栬鑹插叡鐢ㄥ悓涓鍊嬫暩鎿氾級', + ['Data settings'] = '鏁告摎瑷疆', + ['Open config panel'] = '鎵撻枊瑷疆闈㈡澘', +} diff --git a/MY_TargetMon/src/MY_TargetMon.PS.lua b/MY_TargetMon/src/MY_TargetMon.PS.lua new file mode 100644 index 000000000..746aade29 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon.PS.lua @@ -0,0 +1,79 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控配置相关 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon.PS' + +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- 设置界面 +---------------------------------------------------------------------------------------------- +local PS = { szRestriction = 'MY_TargetMon' } + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Data save mode'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX = nPaddingX + 10 + nX, nY = ui:Append('WndCheckBox', { + x = nX, y = nY, text = _L['Use common data'], + checked = MY_TargetMonConfig.bCommon, + onCheck = function(bCheck) + MY_TargetMonConfig.bCommon = bCheck + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nY = nY + 10 + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['View render config'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX = nPaddingX + 10 + nX, nY = ui:Append('WndSlider', { + x = nX, y = nY, w = 100, h = 25, + text = _L['Use common data'], + value = MY_TargetMonConfig.nInterval, + range = {1, 16}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(v) return _L('View render interval: every %d frame', v) end, + onChange = function(val) + MY_TargetMonConfig.nInterval = val + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nY = nY + 10 + + nX = nPaddingX + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Data settings'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX = nPaddingX + 10 + ui:Append('WndButton', { + x = nX, y = nY, w = 150, h = 28, + text = _L['Open config panel'], + buttonStyle = 'FLAT', + onClick = function() + MY_TargetMon_PS.OpenPanel() + end, + }) +end + +function PS.OnPanelScroll(wnd, scrollX, scrollY) + wnd:Lookup('WndWindow_Wrapper'):SetRelPos(scrollX, scrollY) +end +X.Panel.Register(_L['Target'], 'MY_TargetMon', _L['Target monitor'], 'ui/Image/ChannelsPanel/NewChannels.UITex|141', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMonConfig.lua b/MY_TargetMon/src/MY_TargetMonConfig.lua new file mode 100644 index 000000000..6d5eef753 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMonConfig.lua @@ -0,0 +1,737 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控配置相关 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMonConfig' +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TargetMon', { ['*'] = false, exp = false }) +X.RegisterRestriction('MY_TargetMon.MapRestriction', { ['*'] = true }) +-------------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_TargetMon', _L['Target'], { + bCommon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TargetMon'], + szDescription = X.MakeCaption({ + _L['Use common data'], + }), + szRestriction = 'MY_TargetMon', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nInterval = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TargetMon'], + szDescription = X.MakeCaption({ + _L['View render interval'], + }), + szRestriction = 'MY_TargetMon', + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, +}) +local D = { + CONFIG = {}, + DATASET_LIST = {}, +} +local REMOTE_DATA_ROOT = X.FormatPath({'userdata/target_mon/remote/', X.PATH_TYPE.GLOBAL}) +local DEFAULT_CONTENT_COLOR = {255, 255, 0} +local DEFAULT_MONITOR_ICON_ID = 572 +local MY_TARGET_MON_MAP_TYPE = { + COMMON = -1, -- 通用 + CITY = -2, -- 主城 + DUNGEON = -3, -- 秘境 + TEAM_DUNGEON = -4, -- 小队秘境 + RAID_DUNGEON = -5, -- 团队秘境 + STARVE = -6, -- 浪客行 + VILLAGE = -7, -- 野外 + ARENA = -8, -- 名剑大会 + BATTLEFIELD = -10, -- 战场 + PUBG = -11, -- 绝境战场 + ZOMBIE = -12, -- 李渡鬼域 + MONSTER = -13, -- 百战 + MOBA = -14, -- 列星虚境 + HOMELAND = -15, -- 家园 + ROGUELIKE = -16, -- 八荒衡鉴 + COMPETITION = -17, -- 竞技 + GUILD_TERRITORY = -18, -- 帮会领地 + CAMP = -19, -- 阵营地图 + STRONGHOLD = -20, -- 据点地图 + SCHOOL = -21, -- 门派地图 + RECYCLE_BIN = -9, -- 回收站 +} +local MY_TARGET_MON_MAP_TYPE_NAME = { + [MY_TARGET_MON_MAP_TYPE.COMMON ] = _L['Common map'], + [MY_TARGET_MON_MAP_TYPE.CITY ] = _L['City map'], + [MY_TARGET_MON_MAP_TYPE.DUNGEON ] = _L['Dungeon map'], + [MY_TARGET_MON_MAP_TYPE.TEAM_DUNGEON ] = _L['Team dungeon map'], + [MY_TARGET_MON_MAP_TYPE.RAID_DUNGEON ] = _L['Raid dungeon map'], + [MY_TARGET_MON_MAP_TYPE.STARVE ] = _L['Starve map'], + [MY_TARGET_MON_MAP_TYPE.VILLAGE ] = _L['Village map'], + [MY_TARGET_MON_MAP_TYPE.ARENA ] = _L['Arena map'], + [MY_TARGET_MON_MAP_TYPE.BATTLEFIELD ] = _L['Battlefield map'], + [MY_TARGET_MON_MAP_TYPE.PUBG ] = _L['Pubg map'], + [MY_TARGET_MON_MAP_TYPE.ZOMBIE ] = _L['Zombie map'], + [MY_TARGET_MON_MAP_TYPE.MONSTER ] = _L['Monster map'], + [MY_TARGET_MON_MAP_TYPE.MOBA ] = _L['Moba map'], + [MY_TARGET_MON_MAP_TYPE.HOMELAND ] = _L['Homeland map'], + [MY_TARGET_MON_MAP_TYPE.GUILD_TERRITORY] = _L['Guild territory map'], + [MY_TARGET_MON_MAP_TYPE.ROGUELIKE ] = _L['Roguelike map'], + [MY_TARGET_MON_MAP_TYPE.COMPETITION ] = _L['Competition map'], + [MY_TARGET_MON_MAP_TYPE.CAMP ] = _L['Camp map'], + [MY_TARGET_MON_MAP_TYPE.STRONGHOLD ] = _L['Stronghold map'], + [MY_TARGET_MON_MAP_TYPE.SCHOOL ] = _L['School map'], + [MY_TARGET_MON_MAP_TYPE.RECYCLE_BIN ] = _L['Recycle bin map'], +} + +local function GetUserDataPath() + local ePathType = O.bCommon and X.PATH_TYPE.GLOBAL or X.PATH_TYPE.ROLE + local szPath = X.FormatPath({'userdata/target_mon/local.jx3dat', ePathType}) + X.OutputDebugMessage('[MY_TargetMon] Data path: ' .. szPath, X.DEBUG_LEVEL.LOG) + return szPath +end + +function D.GetDatasetTitle(dataset) + local szTitle = dataset.szTitle + if dataset.szAuthor and dataset.szAuthor ~= '' then + szTitle = g_tStrings.STR_BRACKET_LEFT .. dataset.szAuthor .. g_tStrings.STR_BRACKET_RIGHT .. szTitle + end + if dataset.szVersion and dataset.szVersion ~= '' then + szTitle = szTitle .. g_tStrings.STR_CONNECT .. dataset.szVersion + end + return szTitle +end + +function D.AncientPatchToDataset(patch, EMBEDDED_CONFIG_HASH, EMBEDDED_MONITOR_HASH) + -- 处理用户删除的内建数据和不合法的数据 + if patch.delete or not patch.uuid then + return + end + -- 合并未修改的内嵌数据 + local embedded, config = EMBEDDED_CONFIG_HASH[patch.uuid], {} + if embedded then + -- 设置内嵌数据默认属性 + for k, v in pairs(embedded) do + if k ~= 'monitors' then + if patch[k] == nil then + config[k] = X.Clone(v) + end + end + end + -- 设置改变过的数据 + for k, v in pairs(patch) do + if k ~= 'monitors' then + config[k] = X.Clone(v) + end + end + -- 设置监控项内嵌数据删除项和自定义项 + local monitors = {} + local existMon = {} + if patch.monitors then + for i, mon in ipairs(patch.monitors) do + if not mon.delete then + local monEmbedded = EMBEDDED_MONITOR_HASH[patch.uuid][mon.uuid] + if monEmbedded then -- 复制内嵌数据 + if mon.patch then + table.insert(monitors, X.ApplyPatch(monEmbedded, mon.patch)) + else + table.insert(monitors, X.Clone(monEmbedded)) + end + elseif not mon.embedded and not mon.patch and mon.manually ~= false then -- 删除当前版本不存在的内嵌数据 + table.insert(monitors, X.Clone(mon)) + end + end + existMon[mon.uuid] = true + end + end + -- 插入新的内嵌数据 + for i, monEmbedded in ipairs(embedded.monitors) do + if not existMon[monEmbedded.uuid] then + local prevUuid, nIndex = monitors[i - 1] and monitors[i - 1].uuid, nil + if prevUuid then + for j, mon in ipairs(monitors) do + if mon.uuid == prevUuid then + nIndex = j + 1 + break + end + end + end + if nIndex then + table.insert(monitors, nIndex, X.Clone(monEmbedded)) + else + table.insert(monitors, X.Clone(monEmbedded)) + end + existMon[monEmbedded.uuid] = true + end + end + config.monitors = monitors + config.group = embedded.group + config.caption = embedded.caption + config.embedded = true + else + -- 不再存在的内嵌数据 + if patch.embedded then + return + end + for k, v in pairs(patch) do + config[k] = X.Clone(v) + end + end + return config +end + +function D.ConvertAncientDataset(dataset) + local tRecord = { + szUUID = dataset.uuid, + szTitle = dataset.caption, + szAuthor = dataset.group, + szVersion = '', + szType = dataset.type, + szTarget = dataset.target, + szAlignment = dataset.alignment, + + bEnable = dataset.enable, + bHideOthers = dataset.hideOthers, + bHideVoid = dataset.hideVoid, + bPenetrable = dataset.penetrable, + bDraggable = dataset.draggable, + bIgnoreSystemUIScale = dataset.ignoreSystemUIScale, + bCdCircle = dataset.cdCircle, + bCdFlash = dataset.cdFlash, + bCdReadySpark = dataset.cdReadySpark, + bCdBar = dataset.cdBar, + bShowName = dataset.showName, + bShowTime = dataset.showTime, + bPlaySound = dataset.playSound, + szBoxBgUITex = dataset.boxBgUITex, + szCdBarUITex = dataset.cdBarUITex, + + nMaxLineCount = dataset.maxLineCount, + fScale = dataset.scale, + fIconFontScale = dataset.iconFontScale, + fOtherFontScale = dataset.otherFontScale, + nCdBarWidth = dataset.cdBarWidth, + nDecimalTime = dataset.decimalTime, + + tAnchor = dataset.anchor, + aMonitor = {}, + } + local DEFAULT_IDS = {[0] = { ignoreLevel = true }} + local DEFAULT_LEVELS = {[0] = {}} + for _, mon in ipairs(dataset.monitors) do + for id, idConfig in pairs(X.IsEmpty(mon.ids) and DEFAULT_IDS or mon.ids) do + local tMap = X.Clone(mon.maps) or {} + tMap.bAll = tMap.all or X.IsEmpty(tMap) + tMap.all = nil + local tKungfu = X.Clone(mon.kungfus) or {} + tKungfu.bAll = tKungfu.all or X.IsEmpty(tKungfu) + tKungfu.all = nil + local tTargetKungfu = X.Clone(mon.tarkungfus) or {} + tTargetKungfu.bAll = tTargetKungfu.all or X.IsEmpty(tTargetKungfu) + tTargetKungfu.all = nil + tTargetKungfu.bNpc = tTargetKungfu.npc + tTargetKungfu.npc = nil + for level, levelConfig in pairs(X.IsEmpty(idConfig.levels) and DEFAULT_LEVELS or idConfig.levels) do + local szContent, aContentColor = '', nil + if dataset.cdBar then + if X.IsEmpty(mon.longAlias) then + szContent = mon.shortAlias + else + szContent = mon.longAlias + end + if X.IsEmpty(mon.rgbLongAlias) or X.IsEquals(mon.rgbLongAlias, DEFAULT_CONTENT_COLOR) then + aContentColor = mon.rgbShortAlias + else + aContentColor = mon.rgbLongAlias + end + else + if X.IsEmpty(mon.shortAlias) then + szContent = mon.longAlias + else + szContent = mon.shortAlias + end + if X.IsEmpty(mon.rgbShortAlias) or X.IsEquals(mon.rgbShortAlias, DEFAULT_CONTENT_COLOR) then + aContentColor = mon.rgbLongAlias + else + aContentColor = mon.rgbShortAlias + end + end + local nIconID + if levelConfig.iconid and levelConfig.iconid > 0 then + nIconID = levelConfig.iconid + elseif idConfig.iconid and idConfig.iconid > 0 then + nIconID = idConfig.iconid + elseif mon.iconid and mon.iconid > 0 then + nIconID = mon.iconid + end + table.insert(tRecord.aMonitor, X.Clone({ + szUUID = mon.uuid .. '-' .. id .. '-' .. level, + szGroupID = mon.uuid, + bEnable = mon.enable and (idConfig.ignoreLevel or levelConfig.enable), + dwID = id, + nLevel = level, + nStackNum = 0, + szNote = mon.name, + szContent = szContent, + aContentColor = aContentColor, + nIconID = nIconID, + tMap = tMap, + tKungfu = tKungfu, + tTargetKungfu = tTargetKungfu, + bFlipHideVoid = mon.rHideVoid, + bFlipHideOthers = mon.rHideOthers, + aSoundAppear = idConfig.soundAppear or mon.soundAppear, + aSoundDisappear = idConfig.soundDisappear or mon.soundDisappear, + szExtentAnimate = mon.extentAnimate, + })) + end + end + end + return tRecord +end + +function D.HasAncientData() + local szPath = X.FormatPath({'config/my_targetmon.jx3dat', X.PATH_TYPE.ROLE}) + return IsLocalFileExist(szPath) +end + +function D.ImportAncientData(fnCallback) + -- 加载内置数据 + local CUSTOM_EMBEDDED_CONFIG_ROOT = X.FormatPath({'userdata/TargetMon/', X.PATH_TYPE.GLOBAL}) + local EMBEDDED_CONFIG_LIST = {} + for _, szFile in ipairs(CPath.GetFileList(CUSTOM_EMBEDDED_CONFIG_ROOT) or {}) do + local dataset = X.LoadLUAData(CUSTOM_EMBEDDED_CONFIG_ROOT .. szFile, { passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW_E'] .. 'MY') }) + or X.LoadLUAData(CUSTOM_EMBEDDED_CONFIG_ROOT .. szFile, { passphrase = string.char(0xd3, 0x62, 0x5, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x68, 0xfa, 0x20, 0xa6, 0xd0, 0xf4, 0x40, 0x79, 0x38, 0xee, 0x60, 0x4c, 0xa0, 0xe8, 0x80, 0x1f, 0x8, 0xe2, 0xa0, 0xf2, 0x70, 0xdc, 0xc0, 0xc5, 0xd8, 0xd6, 0xe0, 0x98, 0x40, 0xd0, 0x0, 0x6b, 0xa8, 0xca, 0x20, 0x3e, 0x10, 0xc4, 0x40, 0x11, 0x78, 0xbe, 0x60, 0xe4, 0xe0, 0xb8, 0x80, 0xb7, 0x48, 0xb2, 0xa0, 0x8a, 0xb0, 0xac, 0xc0, 0x5d, 0x18, 0xa6, 0xe0, 0x30, 0x80, 0xa0, 0x0, 0x3, 0xe8, 0x9a, 0x20, 0xd6, 0x50, 0x94, 0x40, 0xa9, 0xb8, 0x8e, 0x60, 0x7c, 0x20, 0x88, 0x80, 0x4f, 0x88, 0x82, 0xa0, 0x22, 0xf0, 0x7c, 0xc0, 0xf5, 0x58, 0x76, 0xe0, 0xc8, 0xc0, 0x70, 0x0, 0x9b, 0x28, 0x6a, 0x20, 0x6e, 0x90, 0x64, 0x40, 0x41, 0xf8, 0x5e, 0x60, 0x14, 0x60, 0x58, 0x80, 0xe7, 0xc8, 0x52, 0xa0, 0xba, 0x30, 0x4c, 0xc0, 0x8d, 0x98, 0x46, 0xe0, 0x60, 0x0, 0x40, 0x0, 0x33, 0x68, 0x3a, 0x20, 0x6, 0xd0, 0x34, 0x40, 0xd9, 0x38, 0x2e, 0x60, 0xac, 0xa0, 0x28, 0x80, 0x7f, 0x8, 0x22, 0xa0, 0x52, 0x70, 0x1c, 0xc0, 0x25, 0xd8, 0x16, 0xe0, 0xf8, 0x40, 0x10, 0x0, 0xcb, 0xa8, 0xa, 0x20, 0x9e, 0x10, 0x4, 0x40, 0x71, 0x78, 0xfe, 0x60, 0x44, 0xe0, 0xf8, 0x80, 0x17, 0x48, 0xf2, 0xa0, 0xea, 0xb0, 0xec, 0xc0, 0xbd, 0x18, 0xe6, 0xe0, 0x90, 0x80, 0xe0, 0x0, 0x63, 0xe8, 0xda, 0x20, 0x36, 0x50, 0xd4, 0x40) }) + or X.LoadLUAData(CUSTOM_EMBEDDED_CONFIG_ROOT .. szFile) + if X.IsTable(dataset) and dataset.uuid and szFile:sub(1, -#'.jx3dat' - 1) == dataset.uuid and dataset.group and dataset.sort and dataset.monitors then + table.insert(EMBEDDED_CONFIG_LIST, dataset) + end + end + table.sort(EMBEDDED_CONFIG_LIST, function(a, b) + if a.group == b.group then + return b.sort > a.sort + end + return b.group > a.group + end) + local EMBEDDED_CONFIG_HASH, EMBEDDED_MONITOR_HASH = {}, {} + for _, dataset in ipairs(EMBEDDED_CONFIG_LIST) do + local embedded = dataset + if embedded then + local tMon = {} + for _, mon in ipairs(embedded.monitors) do + tMon[mon.uuid] = mon + end + -- 插入结果集 + EMBEDDED_CONFIG_HASH[embedded.uuid] = embedded + EMBEDDED_MONITOR_HASH[embedded.uuid] = tMon + end + end + -- 加载角色数据 + local ROLE_CONFIG_FILE = {'config/my_targetmon.jx3dat', X.PATH_TYPE.ROLE} + local aPatch = X.LoadLUAData(ROLE_CONFIG_FILE, { passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW'] .. 'MY') }) + or X.LoadLUAData(ROLE_CONFIG_FILE, { passphrase = string.char(0xd5, 0xa6, 0xd, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x48, 0x32, 0xa0, 0xee, 0x90, 0x64, 0x40, 0xe5, 0xd8, 0x96, 0xe0, 0xdc, 0x20, 0xc8, 0x80, 0xd3, 0x68, 0xfa, 0x20, 0xca, 0xb0, 0x2c, 0xc0, 0xc1, 0xf8, 0x5e, 0x60, 0xb8, 0x40, 0x90, 0x0, 0xaf, 0x88, 0xc2, 0xa0, 0xa6, 0xd0, 0xf4, 0x40, 0x9d, 0x18, 0x26, 0xe0, 0x94, 0x60, 0x58, 0x80, 0x8b, 0xa8, 0x8a, 0x20, 0x82, 0xf0, 0xbc, 0xc0, 0x79, 0x38, 0xee, 0x60, 0x70, 0x80, 0x20, 0x0, 0x67, 0xc8, 0x52, 0xa0, 0x5e, 0x10, 0x84, 0x40, 0x55, 0x58, 0xb6, 0xe0, 0x4c, 0xa0, 0xe8, 0x80, 0x43, 0xe8, 0x1a, 0x20, 0x3a, 0x30, 0x4c, 0xc0, 0x31, 0x78, 0x7e, 0x60, 0x28, 0xc0, 0xb0, 0x0, 0x1f, 0x8, 0xe2, 0xa0, 0x16, 0x50, 0x14, 0x40, 0xd, 0x98, 0x46, 0xe0, 0x4, 0xe0, 0x78, 0x80, 0xfb, 0x28, 0xaa, 0x20, 0xf2, 0x70, 0xdc, 0xc0, 0xe9, 0xb8, 0xe, 0x60, 0xe0, 0x0, 0x40, 0x0, 0xd7, 0x48, 0x72, 0xa0, 0xce, 0x90, 0xa4, 0x40, 0xc5, 0xd8, 0xd6, 0xe0, 0xbc, 0x20, 0x8, 0x80, 0xb3, 0x68, 0x3a, 0x20, 0xaa, 0xb0, 0x6c, 0xc0, 0xa1, 0xf8, 0x9e, 0x60, 0x98, 0x40, 0xd0, 0x0, 0x8f, 0x88, 0x2, 0xa0, 0x86, 0xd0, 0x34, 0x40, 0x7d, 0x18, 0x66, 0xe0, 0x74, 0x60, 0x98, 0x80, 0x6b, 0xa8, 0xca, 0x20, 0x62, 0xf0, 0xfc, 0xc0, 0x59, 0x38, 0x2e, 0x60, 0x50, 0x80, 0x60, 0x0, 0x47, 0xc8, 0x92, 0xa0, 0x3e, 0x10, 0xc4, 0x40) }) + or X.LoadLUAData(ROLE_CONFIG_FILE) + or {} + local aDataset, tLoaded = {}, {} + for i, patch in ipairs(aPatch) do + if patch.uuid and not tLoaded[patch.uuid] then + local dataset = D.AncientPatchToDataset(patch, EMBEDDED_CONFIG_HASH, EMBEDDED_MONITOR_HASH) + if dataset then + table.insert(aDataset, dataset) + end + tLoaded[patch.uuid] = true + end + end + for i, embedded in ipairs(EMBEDDED_CONFIG_LIST) do + if embedded.uuid and not tLoaded[embedded.uuid] then + local dataset = X.Clone(embedded) + if dataset then + dataset.embedded = true + table.insert(aDataset, dataset) + end + tLoaded[dataset.uuid] = true + end + end + -- 转换数据 + local aResult = {} + for i, dataset in ipairs(aDataset) do + table.insert(aResult, D.ConvertAncientDataset(dataset)) + end + -- 导入数据 + for _, dataset in ipairs(aResult) do + local bExist = false + for i, v in ipairs(D.DATASET_LIST) do + if v.szUUID == dataset.szUUID then + v.aMonitor = dataset.aMonitor + v.szTitle = dataset.szTitle + v.szAuthor = dataset.szAuthor + v.szVersion = dataset.szVersion + bExist = true + end + end + if not bExist then + table.insert(D.DATASET_LIST, dataset) + end + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_RELOAD') + if fnCallback then + fnCallback(aResult) + end +end + +-- 保存用户监控数据、配置 +function D.SaveUserData() + X.SaveLUAData( + GetUserDataPath(), + { + config = D.CONFIG, + data = D.DATASET_LIST, + }) +end + +-- 加载用户监控数据、配置 +function D.LoadUserData() + local data = X.LoadLUAData(GetUserDataPath()) + if X.IsTable(data) then + D.CONFIG = data.config or {} + D.DATASET_LIST = data.data or {} + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_RELOAD') + else + D.ImportAncientData() + end +end + +function D.SetUserConfig(szKey, xVal) + D.CONFIG[szKey] = xVal + FireUIEvent('MY_TARGET_MON_CONFIG__USER_CONFIG_MODIFY') +end + +function D.GetUserConfig(szKey) + return D.CONFIG[szKey] +end + +function D.ImportDatasetFile(szFile, tOption) + local aDataset = X.LoadLUAData(szFile, { passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW'] .. 'MY') }) + or X.LoadLUAData(szFile, { passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW_E'] .. 'MY') }) + or X.LoadLUAData(szFile, { passphrase = false }) + if not X.IsArray(aDataset) then + X.OutputSystemMessage(_L['MY_TargetMon'], _L('Load dataset failed: %s', tostring(szFile)), X.CONSTANT.MSG_THEME.ERROR) + return + end + for i, dataset in ipairs(aDataset) do + if dataset.uuid then + aDataset[i] = D.ConvertAncientDataset(dataset) + end + end + if #aDataset == 0 then + return + end + local tUUID = {} + if tOption and tOption.aUUID then + for _, szUUID in ipairs(tOption.aUUID) do + tUUID[szUUID] = true + end + else + for _, dataset in ipairs(aDataset) do + tUUID[dataset.szUUID] = true + end + end + local function fnAction() + for _, dataset in ipairs(aDataset) do + if tUUID[dataset.szUUID] then + local bExist = false + for i, v in ipairs(D.DATASET_LIST) do + if v.szUUID == dataset.szUUID then + v.tMap = dataset.tMap + v.aMonitor = dataset.aMonitor + v.szTitle = dataset.szTitle + v.szAuthor = dataset.szAuthor + v.szVersion = dataset.szVersion + bExist = true + end + end + if not bExist then + table.insert(D.DATASET_LIST, dataset) + end + end + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + X.OutputSystemMessage(_L['MY_TargetMon'], _L('Load dataset success: %s', tostring(szFile)), X.CONSTANT.MSG_THEME.SUCCESS) + if tOption and tOption.fnCallback then + local aImported = {} + for _, dataset in ipairs(aDataset) do + if tUUID[dataset.szUUID] then + table.insert(aImported, dataset) + end + end + tOption.fnCallback(aImported) + end + end + if tOption and tOption.bConfirmed then + fnAction() + else + local nHeight = 50 + local ui = X.UI.CreateFrame('MY_TargetMon_ImportConfirm', { + w = 460, close = true, + text = _L['Are you sure to import datasets below?'], + }) + for _, dataset in ipairs(aDataset) do + ui:Append('WndCheckBox', { + x = 30, y = nHeight, w = 400, + text = MY_TargetMonConfig.GetDatasetTitle(dataset), + checked = tUUID[dataset.szUUID], + onCheck = function(bChecked) + tUUID[dataset.szUUID] = bChecked + end, + }) + nHeight = nHeight + 30 + end + nHeight = nHeight + 10 + ui:Append('WndButton', { + x = 180, y = nHeight, w = 100, h = 40, + text = _L['Confirm Import'], + buttonStyle = 'FLAT', + onClick = function() + fnAction() + ui:Remove() + end, + }) + nHeight = nHeight + 40 + ui:Height(nHeight + 30) + end +end + +function D.ExportDatasetFile(aUUID, bIndent) + local tDataset = {} + for _, dataset in ipairs(D.DATASET_LIST) do + tDataset[dataset.szUUID] = dataset + end + local aExport = {} + for _, szUUID in ipairs(aUUID) do + table.insert(aExport, tDataset[szUUID]) + end + if #aExport == 0 then + X.OutputAnnounceMessage(_L['Please select at least one dataset to export']) + return + end + local szFile = X.FormatPath( + REMOTE_DATA_ROOT + .. '{$name}@{$server}@' + .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd_%hh%mm%ss') + .. '.{$lang}.jx3dat' + ) + if bIndent then + X.SaveLUAData(szFile, aExport, { + encoder = 'luatext', + indent = '\t', + passphrase = false, + crc = false, + }) + else + X.SaveLUAData(szFile, aExport, { + passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW'] .. 'MY'), + }) + end + X.Alert(_L('Export dataset success: %s', tostring(szFile))) + X.OutputSystemMessage(_L['MY_TargetMon'], _L('Export dataset success: %s', tostring(szFile)), X.CONSTANT.MSG_THEME.SUCCESS) + return true +end + +function D.SetDatasetList(aList) + D.DATASET_LIST = aList +end + +function D.GetDatasetList() + return D.DATASET_LIST +end + +function D.GetDataset(szUUID) + for i, v in ipairs(D.DATASET_LIST) do + if v.szUUID == szUUID then + return v + end + end +end + +function D.CreateDataset() + table.insert(D.DATASET_LIST, { + szUUID = X.GetUUID(), + szTitle = _L['New target mon dataset'] .. '#' .. (#D.DATASET_LIST + 1), + szAuthor = X.GetClientPlayerName(), + szVersion = X.FormatTime(GetCurrentTime(), '%yyyy/%MM/%dd'), + szType = 'BUFF', + szTarget = 'CLIENT_PLAYER', + szAlignment = 'LEFT', + + bEnable = true, + tMap = nil, + bHideOthers = false, + bHideVoid = false, + bPenetrable = false, + bDraggable = false, + bIgnoreSystemUIScale = false, + bCdCircle = true, + bCdFlash = true, + bCdReadySpark = true, + bCdBar = false, + bShowName = true, + bShowTime = true, + bPlaySound = true, + szBoxBgUITex = '', + szCdBarUITex = '/ui/Image/Common/Money.UITex|208', + + nMaxLineCount = 16, + fScale = 0.7, + fIconFontScale = 1, + fOtherFontScale = 1, + nCdBarWidth = 240, + nDecimalTime = 1, + + tAnchor = { y = 152, x = -343, s = 'TOPLEFT', r = 'CENTER' }, + aMonitor = {}, + }) + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') +end + +function D.DeleteDataset(szUUID) + for i, v in ipairs(D.DATASET_LIST) do + if v.szUUID == szUUID then + table.remove(D.DATASET_LIST, i) + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + return + end + end +end + +function D.DeleteAllDataset() + for i, _ in X.ipairs_r(D.DATASET_LIST) do + table.remove(D.DATASET_LIST, i) + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') +end + +function D.CreateMonitor(szUUID, nIndex, dwID, nLevel) + local dataset = D.GetDataset(szUUID) + if not dataset then + return + end + if not nIndex then + nIndex = #dataset.aMonitor + 1 + end + local szNote, nIconID = '', nil + if dataset.szType == 'BUFF' then + szNote = X.GetBuffName(dwID, nLevel == 0 and 1 or nLevel) or '' + nIconID = X.GetBuffIconID(dwID, nLevel == 0 and 1 or nLevel) + elseif dataset.szType == 'SKILL' then + szNote = X.GetSkillName(dwID, nLevel) or '' + nIconID = X.GetSkillIconID(dwID, nLevel) + end + table.insert(dataset.aMonitor, nIndex, { + szUUID = X.GetUUID(), + szGroupID = nil, + bEnable = true, + dwID = dwID, + nLevel = nLevel, + nStackNum = 0, + nStackNumOp = nil, + szNote = szNote, + szContent = '', + aContentColor = nil, + nIconID = nIconID, + tMap = nil, + tKungfu = nil, + tTargetKungfu = nil, + bFlipHideVoid = nil, + bFlipHideOthers = nil, + aSoundAppear = nil, + aSoundDisappear = nil, + szExtentAnimate = nil, + }) + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', szUUID) +end + +function D.SendBgMsg(...) + return X.SendBgMsg(...) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMonConfig', + exports = { + { + fields = { + 'bCommon', + 'nInterval', + }, + root = O, + }, + { + fields = { + REMOTE_DATA_ROOT = REMOTE_DATA_ROOT, + DEFAULT_MONITOR_ICON_ID = DEFAULT_MONITOR_ICON_ID, + MY_TARGET_MON_MAP_TYPE = MY_TARGET_MON_MAP_TYPE, + MY_TARGET_MON_MAP_TYPE_NAME = MY_TARGET_MON_MAP_TYPE_NAME, + HasAncientData = D.HasAncientData, + ImportAncientData = D.ImportAncientData, + ImportDatasetFile = D.ImportDatasetFile, + ExportDatasetFile = D.ExportDatasetFile, + SetUserConfig = D.SetUserConfig, + GetUserConfig = D.GetUserConfig, + GetDatasetTitle = D.GetDatasetTitle, + GetDatasetList = D.GetDatasetList, + GetDataset = D.GetDataset, + CreateDataset = D.CreateDataset, + DeleteDataset = D.DeleteDataset, + DeleteAllDataset = D.DeleteAllDataset, + CreateMonitor = D.CreateMonitor, + SendBgMsg = D.SendBgMsg, + }, + }, + }, + imports = { + { + fields = { + 'bCommon', + 'nInterval', + }, + triggers = { + bCommon = D.LoadUserData, + nInterval = function() FireUIEvent('MY_TARGET_MON_CONFIG__INTERVAL_CHANGE') end, + }, + root = O, + }, + }, +} +MY_TargetMonConfig = X.CreateModule(settings) +end + +do +local function DelaySaveUserData() + X.DelayCall('MY_TargetMon#SaveUserData', 500, D.SaveUserData) +end +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', 'MY_TargetMonConfig', DelaySaveUserData) +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', 'MY_TargetMonConfig', DelaySaveUserData) +X.RegisterEvent('MY_TARGET_MON_CONFIG__USER_CONFIG_MODIFY', 'MY_TargetMonConfig', DelaySaveUserData) +end + +X.RegisterInit('MY_TargetMonConfig', D.LoadUserData) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMonData.lua b/MY_TargetMon/src/MY_TargetMonData.lua new file mode 100644 index 000000000..3dcb490a2 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMonData.lua @@ -0,0 +1,914 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控数值计算相关 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMonData' + +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local BUFF_CACHE = {} -- 下标为目标ID的目标BUFF缓存数组 反正ID不可能是doodad不会冲突 +local BUFF_INFO = {} -- BUFF反向索引 +local BUFF_TIME = {} -- BUFF最长持续时间 +local SKILL_EXTRA = {} -- 缓存自己放过的技能用于扫描 +local SKILL_CACHE = {} -- 下标为目标ID的目标技能缓存数组 反正ID不可能是doodad不会冲突 +local SKILL_INFO = {} -- 技能反向索引 +local SHIELDED +local CONFIG_CACHE +local NEARBY_TARGET_FORCE_CACHE = {} -- 附近目标门派缓存 +local NEARBY_FORCE_STAT_CACHE = {} -- 附件目标门派统计缓存 +local VIEW_LIST_CACHE = {} +local DEFAULT_CONTENT_COLOR = {255, 255, 0} +local MY_TARGET_MON_MAP_TYPE = MY_TargetMonConfig.MY_TARGET_MON_MAP_TYPE +local MY_TARGET_MON_DATA_MAX_LIMIT = 2000 + +do +local function FilterDatasets(aDataset, dwMapID, dwKungfuID) + local ret = {} + for i, dataset in ipairs(aDataset) do + if dataset.bEnable + and (X.IsEmpty(dataset.tMap) or ( + dataset.tMap.bAll or dataset.tMap[dwMapID] + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.CITY ] and X.IsCityMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.DUNGEON ] and X.IsDungeonMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.TEAM_DUNGEON ] and X.IsDungeonMap(dwMapID, false)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.RAID_DUNGEON ] and X.IsDungeonMap(dwMapID, true)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.STARVE ] and X.IsStarveMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.VILLAGE ] and X.IsVillageMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.ARENA ] and X.IsArenaMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.BATTLEFIELD ] and X.IsBattlefieldMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.PUBG ] and X.IsPubgMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.ZOMBIE ] and X.IsZombieMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.MONSTER ] and X.IsMonsterMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.MOBA ] and X.IsMobaMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.HOMELAND ] and X.IsHomelandMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.GUILD_TERRITORY] and X.IsGuildTerritoryMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.ROGUELIKE ] and X.IsRoguelikeMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.COMPETITION ] and X.IsCompetitionMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.CAMP ] and X.IsCampMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.STRONGHOLD ] and X.IsStrongholdMap(dwMapID)) + or (dataset.tMap[MY_TARGET_MON_MAP_TYPE.SCHOOL ] and X.IsSchoolMap(dwMapID)) + )) then + table.insert(ret, dataset) + end + end + return ret +end +local function HasNearbyKungfu(tKungfu) + if tKungfu.bAll or tKungfu.bNpc then + return true + end + for dwKungfuID, bEnable in pairs(tKungfu) do + if bEnable then + local dwForceID = X.CONSTANT.KUNGFU_FORCE_TYPE[dwKungfuID] + if dwForceID and NEARBY_FORCE_STAT_CACHE[dwForceID] then + return true + end + end + end +end +local function FilterMonitors(aMonitor, dwMapID, dwKungfuID) + local ret = {} + for i, mon in ipairs(aMonitor) do + if mon.bEnable + and (X.IsEmpty(mon.tMap) or ( + mon.tMap.bAll or mon.tMap[dwMapID] + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.CITY ] and X.IsCityMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.DUNGEON ] and X.IsDungeonMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.TEAM_DUNGEON ] and X.IsDungeonMap(dwMapID, false)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.RAID_DUNGEON ] and X.IsDungeonMap(dwMapID, true)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.STARVE ] and X.IsStarveMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.VILLAGE ] and X.IsVillageMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.ARENA ] and X.IsArenaMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.BATTLEFIELD ] and X.IsBattlefieldMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.PUBG ] and X.IsPubgMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.ZOMBIE ] and X.IsZombieMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.MONSTER ] and X.IsMonsterMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.MOBA ] and X.IsMobaMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.HOMELAND ] and X.IsHomelandMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.GUILD_TERRITORY] and X.IsGuildTerritoryMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.ROGUELIKE ] and X.IsRoguelikeMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.COMPETITION ] and X.IsCompetitionMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.CAMP ] and X.IsCampMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.STRONGHOLD ] and X.IsStrongholdMap(dwMapID)) + or (mon.tMap[MY_TARGET_MON_MAP_TYPE.SCHOOL ] and X.IsSchoolMap(dwMapID)) + )) + and (X.IsEmpty(mon.tKungfu) or mon.tKungfu.bAll or mon.tKungfu[dwKungfuID] + or ( -- 藏剑不区分心法 + (dwKungfuID == X.CONSTANT.KUNGFU_TYPE.WEN_SHUI or dwKungfuID == X.CONSTANT.KUNGFU_TYPE.SHAN_JU) + and (mon.tKungfu[X.CONSTANT.KUNGFU_TYPE.WEN_SHUI] or mon.tKungfu[X.CONSTANT.KUNGFU_TYPE.SHAN_JU]) + ) + ) + and (X.IsEmpty(mon.tTargetKungfu) or mon.tTargetKungfu.bAll or HasNearbyKungfu(mon.tTargetKungfu)) then + table.insert(ret, mon) + end + end + return ret +end +function D.GetDatasetList() + if not CONFIG_CACHE then + local me = X.GetClientPlayer() + if not me then + return {} + end + local aConfig = {} + if not (X.IsInCompetitionMap() and X.IsClientPlayerMountMobileKungfu()) then + local dwMapID = me.GetMapID() or 0 + local dwKungfuID = me.GetKungfuMountID() or 0 + for i, dataset in ipairs(FilterDatasets(MY_TargetMonConfig.GetDatasetList(), dwMapID, dwKungfuID)) do + aConfig[i] = setmetatable( + { + aMonitor = FilterMonitors(dataset.aMonitor, dwMapID, dwKungfuID), + }, + { __index = dataset } + ) + end + end + CONFIG_CACHE = aConfig + end + return CONFIG_CACHE +end +end + +do +local TEAM_MARK = { + ['TEAM_MARK_CLOUD'] = 1, + ['TEAM_MARK_SWORD'] = 2, + ['TEAM_MARK_AX' ] = 3, + ['TEAM_MARK_HOOK' ] = 4, + ['TEAM_MARK_DRUM' ] = 5, + ['TEAM_MARK_SHEAR'] = 6, + ['TEAM_MARK_STICK'] = 7, + ['TEAM_MARK_JADE' ] = 8, + ['TEAM_MARK_DART' ] = 9, + ['TEAM_MARK_FAN' ] = 10, +} +function D.GetTarget(eTarType, eMonType) + if eMonType == 'SKILL' or eTarType == 'CONTROL_PLAYER' then + return TARGET.PLAYER, X.GetControlPlayerID() + elseif eTarType == 'CLIENT_PLAYER' then + return TARGET.PLAYER, X.GetClientPlayerID() + elseif eTarType == 'TARGET' then + local me = X.GetClientPlayer() + return X.GetCharacterTarget(me) + elseif eTarType == 'TTARGET' then + local me = X.GetClientPlayer() + local KTarget = X.GetTargetHandle(X.GetCharacterTarget(me)) + if KTarget then + return X.GetCharacterTarget(KTarget) + end + elseif TEAM_MARK[eTarType] then + local mark = X.GetTeamMark() + if mark then + for dwID, nMark in pairs(mark) do + if TEAM_MARK[eTarType] == nMark then + return TARGET[X.IsPlayer(dwID) and 'PLAYER' or 'NPC'], dwID + end + end + end + end + return TARGET.NO_TARGET, 0 +end +end + +do +local EVENT_UPDATE = {} +function D.RegisterDataUpdateEvent(frame, fnAction) + if fnAction then + EVENT_UPDATE[frame] = fnAction + else + EVENT_UPDATE[frame] = nil + end +end + +function D.FireDataUpdateEvent() + for frame, fnAction in pairs(EVENT_UPDATE) do + fnAction(frame) + end +end +end + +function D.IsShielded() + if SHIELDED == nil then + SHIELDED = X.IsRestricted('MY_TargetMon.MapRestriction') and X.IsInArenaMap() + end + return SHIELDED +end + +do +local SHIELDED_BUFF = {} +function D.IsShieldedBuff(dwID, nLevel) + if D.IsShielded() then + local szKey = dwID .. ',' .. nLevel + if SHIELDED_BUFF[szKey] == nil then + local info = Table_GetBuff(dwID, nLevel) + SHIELDED_BUFF[szKey] = not info or info.bShow == 0 + end + return SHIELDED_BUFF[szKey] + end + return false +end +end + +function D.AnnounceShielded() + local bBlock = X.IsInCompetitionMap() and X.IsClientPlayerMountMobileKungfu() + if bBlock and not D.bBlockMessageAnnounced then + X.OutputSystemMessage(_L['MY_TargetMon is blocked in current kungfu, temporary disabled.']) + end + D.bBlockMessageAnnounced = bBlock +end + +do +local function OnSkill(dwID, nLevel) + SKILL_EXTRA[dwID] = dwID +end +local function OnSysMsg(event) + if arg0 == 'UI_OME_SKILL_CAST_LOG' then + if arg1 ~= X.GetClientPlayerID() then + return + end + OnSkill(arg2, arg3) + elseif arg0 == 'UI_OME_SKILL_HIT_LOG' then + if arg1 ~= X.GetClientPlayerID() then + return + end + OnSkill(arg4, arg5) + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + if arg4 ~= SKILL_EFFECT_TYPE.SKILL or arg1 ~= X.GetClientPlayerID() then + return + end + OnSkill(arg5, arg6) + end +end +X.RegisterEvent('SYS_MSG', 'MY_TargetMonData__SKILL', OnSysMsg) +end + +-- 更新BUFF数据 更新监控条 +do +local EXTENT_ANIMATE = { + ['[0.7,0.9)'] = 'ui\\Image\\Common\\Box.UITex|17', + ['[0.9,1]'] = 'ui\\Image\\Common\\Box.UITex|20', + NONE = '', +} +local MON_EXIST_CACHE = {} +-- 通用:判断监控项是否显示 +local function Base_MonVisible(mon, dwTarKungfuID) + if X.IsEmpty(mon.tTargetKungfu) or mon.tTargetKungfu.bAll + or mon.tTargetKungfu[dwTarKungfuID] + or ( -- 藏剑不区分心法 + (dwTarKungfuID == X.CONSTANT.KUNGFU_TYPE.WEN_SHUI or dwTarKungfuID == X.CONSTANT.KUNGFU_TYPE.SHAN_JU) + and (mon.tTargetKungfu[X.CONSTANT.KUNGFU_TYPE.WEN_SHUI] or mon.tTargetKungfu[X.CONSTANT.KUNGFU_TYPE.SHAN_JU]) + ) then + return true + end + return false +end +-- 通用:监控项转视图数据 +local function Base_MonToView(mon, info, item, KObject, dataset, tMonExist, tMonLast) + -- 格式化完善视图列表信息 + if dataset.bShowTime and item.bCd and item.nTimeLeft and item.nTimeLeft > 0 then + if dataset.bCdBar then + item.szProcess = ( + item.nTimeLeft >= 60 + and X.FormatDuration(item.nTimeLeft - item.nTimeLeft % 60, 'ENGLISH_ABBR', { accuracyUnit = 'minute' }) + or '' + ) + .. ( + (dataset.nDecimalTime == -1 or item.nTimeLeft < dataset.nDecimalTime) + and ('%.1fs'):format(item.nTimeLeft % 60) + or ('%ds'):format(item.nTimeLeft % 60) + ) + item.szTimeLeft = '' + else + local nTimeLeft, szTimeLeft = item.nTimeLeft, '' + if nTimeLeft <= 3600 then + if nTimeLeft > 60 then + if dataset.nDecimalTime == -1 or nTimeLeft < dataset.nDecimalTime then + szTimeLeft = '%d\'%.1f' + else + szTimeLeft = '%d\'%d' + end + szTimeLeft = szTimeLeft:format(math.floor(nTimeLeft / 60), nTimeLeft % 60) + else + if dataset.nDecimalTime == -1 or nTimeLeft < dataset.nDecimalTime then + szTimeLeft = '%.1f' + else + szTimeLeft = '%d' + end + szTimeLeft = szTimeLeft:format(nTimeLeft) + end + end + item.szTimeLeft = szTimeLeft + item.szProcess = '' + end + else + item.szTimeLeft = '' + item.szProcess = '' + end + if not dataset.bShowName then + item.szContent = '' + end + if not item.nIconID then + item.nIconID = MY_TargetMonConfig.DEFAULT_MONITOR_ICON_ID + end + if dataset.bCdFlash and item.bCd then + if item.fProgress >= 0.9 then + item.szExtentAnimate = EXTENT_ANIMATE['[0.9,1]'] + elseif item.fProgress >= 0.7 then + item.szExtentAnimate = EXTENT_ANIMATE['[0.7,0.9)'] + else + item.szExtentAnimate = EXTENT_ANIMATE.NONE + end + item.bStaring = item.fProgress > 0.5 + else + item.bStaring = false + item.szExtentAnimate = EXTENT_ANIMATE.NONE + end + if item.szExtentAnimate == EXTENT_ANIMATE.NONE and item.bActive and mon.szExtentAnimate then + item.szExtentAnimate = mon.szExtentAnimate + end + if not dataset.bCdCircle then + item.bCd = false + end + if info and info.bCool then + if tMonLast and not tMonLast[mon.szUUID] and dataset.bPlaySound and mon.aSoundAppear then + local dwSoundID = X.RandomChild(mon.aSoundAppear) + if dwSoundID then + local szSoundPath = X.GetSoundPath(dwSoundID) + if szSoundPath then + X.PlaySound(SOUND.UI_SOUND, szSoundPath, false) + end + end + end + tMonExist[mon.szUUID] = mon + end +end +-- BUFF:判断监控项是否显示 +local function Buff_MonVisible(mon, dwTarKungfuID) + return Base_MonVisible(mon, dwTarKungfuID) +end +-- BUFF:监控项匹配 BUFF 对象 +local function Buff_MonMatch(tAllBuff, mon, dataset) + local dwClientID, dwControlID = X.GetClientPlayerID(), X.GetControlPlayerID() + local tBuff = tAllBuff[mon.dwID] + if tBuff then + for _, buff in pairs(tBuff) do + if buff and buff.bCool then + if ( + not dataset.bHideOthers == not mon.bFlipHideOthers + or buff.dwSkillSrcID == dwClientID + or buff.dwSkillSrcID == dwControlID + ) + and (not D.IsShieldedBuff(buff.dwID, buff.nLevel)) + and (mon.nLevel == 0 or mon.nLevel == buff.nLevel) + and (not mon.nStackNum or mon.nStackNum == 0 or X.JudgeOperator(mon.nStackNumOp or '=', buff.nStackNum, mon.nStackNum)) then + return buff + end + end + end + end +end +-- BUFF:监控项转视图数据 +local function Buff_MonToView(mon, buff, item, KObject, dataset, tMonExist, tMonLast) + if buff and buff.bCool then + local nTimeLeft = buff.nLeft * 0.0625 + if not BUFF_TIME[KObject.dwID] then + BUFF_TIME[KObject.dwID] = {} + end + if not BUFF_TIME[KObject.dwID][buff.szKey] or BUFF_TIME[KObject.dwID][buff.szKey] < nTimeLeft then + BUFF_TIME[KObject.dwID][buff.szKey] = nTimeLeft + end + local nTimeTotal = BUFF_TIME[KObject.dwID][buff.szKey] + item.bActive = true + item.bCd = true + item.fCd = nTimeLeft / nTimeTotal + item.fCdBar = item.fCd + item.bCdBarFlash = true + item.fProgress = 1 - item.fCd + item.bSparking = false + item.dwID = buff.dwID + item.nLevel = buff.nLevel + item.nTimeLeft = nTimeLeft + item.szStackNum = buff.nStackNum > 1 and buff.nStackNum or '' + item.nTimeTotal = nTimeTotal + item.nIconID = mon.nIconID or buff.nIcon + item.szContent = X.IsEmpty(mon.szContent) and X.GetBuffName(buff.dwID, buff.nLevel) or mon.szContent + else + item.bActive = false + item.bCd = true + item.fCd = 0 + item.fCdBar = 0 + item.bCdBarFlash = false + item.fProgress = 0 + item.nTimeLeft = -1 + item.bSparking = true + item.dwID = mon.dwID + item.nLevel = mon.nLevel + item.nIconID = mon.nIconID or X.GetBuffIconID(item.dwID, item.nLevel == 0 and 1 or item.nLevel) + item.szStackNum = '' + item.szContent = X.IsEmpty(mon.szContent) and X.GetBuffName(mon.dwID, mon.nLevel) or mon.szContent + end + item.aContentColor = mon.aContentColor or DEFAULT_CONTENT_COLOR + Base_MonToView(mon, buff, item, KObject, dataset, tMonExist, tMonLast) +end +-- 技能:判断监控项是否显示 +local function Skill_MonVisible(mon, dwTarKungfuID) + return Base_MonVisible(mon, dwTarKungfuID) +end +-- 技能:监控项匹配 BUFF 对象 +local function Skill_MonMatch(tSkill, mon, dataset) + local skill = tSkill[mon.dwID] + if skill and (mon.nLevel == 0 or mon.nLevel == skill.nLevel) then + return skill + end +end +-- 技能:监控项转视图数据 +local function Skill_MonToView(mon, skill, item, KObject, dataset, tMonExist, tMonLast) + if skill and skill.bCool then + if not item.nIconID then + item.nIconID = skill.nIcon + end + local nTimeLeft = skill.nCdLeft * 0.0625 + local nTimeTotal = skill.nCdTotal * 0.0625 + item.bActive = false + item.bCd = true + item.fCd = 1 - nTimeLeft / nTimeTotal + item.fCdBar = item.fCd + item.bCdBarFlash = true + item.fProgress = item.fCd + item.bSparking = false + item.dwID = skill.dwID + item.nLevel = skill.nLevel + item.nTimeLeft = nTimeLeft + item.nTimeTotal = nTimeTotal + item.nIconID = mon.nIconID or skill.nIcon + item.szContent = X.IsEmpty(mon.szContent) and skill.szName or mon.szContent + else + item.bActive = true + item.bCd = false + item.fCd = 1 + item.fCdBar = 1 + item.bCdBarFlash = false + item.fProgress = 0 + item.bSparking = true + item.dwID = mon.dwID + item.nLevel = mon.nLevel + item.nIconID = mon.nIconID or X.GetSkillIconID(item.dwID, item.nLevel) + item.szContent = X.IsEmpty(mon.szContent) and X.GetSkillName(mon.dwID, mon.nLevel) or mon.szContent + end + local nStackNum = (skill and skill.nCdMaxCount > 1) + and (skill.nCdMaxCount - skill.nCdCount) + or 0 + item.szStackNum = nStackNum > 0 and nStackNum or '' + item.aContentColor = mon.aContentColor or DEFAULT_CONTENT_COLOR + Base_MonToView(mon, skill, item, KObject, dataset, tMonExist, tMonLast) +end +local UpdateView +do +local fUIScale, fFontScaleBase +function UpdateView() + local nViewIndex, nViewCount, nMonitorCount = 1, #VIEW_LIST_CACHE, 0 + for _, dataset in ipairs(X.IsRestricted('MY_TargetMon') and X.CONSTANT.EMPTY_TABLE or D.GetDatasetList()) do + local dwTarType, dwTarID = D.GetTarget(dataset.szTarget, dataset.szType) + local KObject = X.GetTargetHandle(dwTarType, dwTarID) + local dwTarKungfuID = KObject + and (dwTarType == TARGET.PLAYER + and (KObject.GetKungfuMountID() or 0) + or 'bNpc' + ) + or 0 + local view = VIEW_LIST_CACHE[nViewIndex] + if not view then + view = {} + VIEW_LIST_CACHE[nViewIndex] = view + end + fUIScale = (dataset.bIgnoreSystemUIScale and 1 or Station.GetUIScale()) * dataset.fScale + fFontScaleBase = fUIScale * X.GetFontScale() * dataset.fScale + view.szUUID = dataset.szUUID + view.szType = dataset.szType + view.szTarget = dataset.szTarget + view.szCaption = MY_TargetMonConfig.GetDatasetTitle(dataset) + view.tAnchor = dataset.tAnchor + view.bIgnoreSystemUIScale = dataset.bIgnoreSystemUIScale + view.fUIScale = fUIScale + view.fIconFontScale = fFontScaleBase * dataset.fIconFontScale + view.fOtherFontScale = fFontScaleBase * dataset.fOtherFontScale + view.bPenetrable = dataset.bPenetrable + view.bDraggable = dataset.bDraggable + view.szAlignment = dataset.szAlignment + view.nMaxLineCount = dataset.nMaxLineCount + view.bCdCircle = dataset.bCdCircle + view.bCdFlash = dataset.bCdFlash + view.bCdReadySpark = dataset.bCdReadySpark + view.bCdBar = dataset.bCdBar + view.nCdBarWidth = dataset.nCdBarWidth + -- view.playSound = dataset.bPlaySound + view.szCdBarUITex = dataset.szCdBarUITex + view.szBoxBgUITex = dataset.szBoxBgUITex + view.aMonitor = dataset.aMonitor + local tMonGroupFallbackUUID = view.tMonGroupFallbackUUID + if not tMonGroupFallbackUUID then + tMonGroupFallbackUUID = {} + for _, mon in ipairs(dataset.aMonitor) do + if mon.szGroup then + tMonGroupFallbackUUID[mon.szGroup] = mon.szUUID + end + end + view.tMonGroupFallbackUUID = tMonGroupFallbackUUID + end + local tMonGroupActiveUUID = view.tMonGroupActiveUUID + if not tMonGroupActiveUUID then + tMonGroupActiveUUID = {} + view.tMonGroupActiveUUID = tMonGroupActiveUUID + end + local aItem = view.aItem + if not aItem then + aItem = {} + view.aItem = aItem + end + local nItemIndex, nItemCount = 1, #aItem + local tMonExist, tMonLast = {}, MON_EXIST_CACHE[dataset.szUUID] + if dataset.szType == 'BUFF' then + local tBuff = KObject and BUFF_CACHE[KObject.dwID] or X.CONSTANT.EMPTY_TABLE + for _, mon in ipairs(dataset.aMonitor) do + if nMonitorCount > MY_TARGET_MON_DATA_MAX_LIMIT then + break + end + nMonitorCount = nMonitorCount + 1 + if Buff_MonVisible(mon, dwTarKungfuID) then + -- 通过监控项生成视图列表 + local buff = Buff_MonMatch(tBuff, mon, dataset) + if mon.szGroup and ( + tMonGroupActiveUUID[mon.szGroup] == mon.szUUID + or tMonGroupActiveUUID[mon.szGroup] == tMonGroupFallbackUUID[mon.szGroup] + ) then + tMonGroupActiveUUID[mon.szGroup] = nil + end + if ( + not mon.szGroup -- 无同组项设置 + or ( + not tMonGroupActiveUUID[mon.szGroup] -- 不存在激活的同组项 + and ( + (buff and buff.bCool) -- 并且当前 BUFF 激活 + or tMonGroupFallbackUUID[mon.szGroup] == mon.szUUID -- 或者当前是同组项最后一个显示项 + ) + ) + ) + and ((buff and buff.bCool) or not dataset.bHideVoid == not mon.bFlipHideVoid) then + local item = aItem[nItemIndex] + if not item then + item = {} + aItem[nItemIndex] = item + end + Buff_MonToView(mon, buff, item, KObject, dataset, tMonExist, tMonLast) + if mon.szGroup then + tMonGroupActiveUUID[mon.szGroup] = mon.szUUID + end + nItemIndex = nItemIndex + 1 + end + end + end + elseif dataset.szType == 'SKILL' then + local tSkill = KObject and SKILL_CACHE[KObject.dwID] or X.CONSTANT.EMPTY_TABLE + for _, mon in ipairs(dataset.aMonitor) do + if nMonitorCount > MY_TARGET_MON_DATA_MAX_LIMIT then + break + end + nMonitorCount = nMonitorCount + 1 + if Skill_MonVisible(mon, dwTarKungfuID) then + -- 通过监控项生成视图列表 + local skill = Skill_MonMatch(tSkill, mon, dataset) + if mon.szGroup and ( + tMonGroupActiveUUID[mon.szGroup] == mon.szUUID + or tMonGroupActiveUUID[mon.szGroup] == tMonGroupFallbackUUID[mon.szGroup] + ) then + tMonGroupActiveUUID[mon.szGroup] = nil + end + if ( + not mon.szGroup -- 无同组项设置 + or ( + not tMonGroupActiveUUID[mon.szGroup] -- 不存在激活的同组项 + and ( + (skill and skill.bCool) -- 并且当前 技能CD 激活 + or tMonGroupFallbackUUID[mon.szGroup] == mon.szUUID -- 或者当前是同组项最后一个显示项 + ) + ) + ) + and (skill and skill.bCool) or not dataset.bHideVoid == not mon.bFlipHideVoid then + local item = aItem[nItemIndex] + if not item then + item = {} + aItem[nItemIndex] = item + end + if mon.szGroup then + tMonGroupActiveUUID[mon.szGroup] = mon.szUUID + end + Skill_MonToView(mon, skill, item, KObject, dataset, tMonExist, tMonLast) + nItemIndex = nItemIndex + 1 + end + end + end + end + for i = nItemIndex, nItemCount do + aItem[i] = nil + end + if tMonLast then + for uuid, mon in pairs(tMonLast) do + if not tMonExist[uuid] and dataset.bPlaySound and mon.aSoundDisappear then + local dwSoundID = X.RandomChild(mon.aSoundDisappear) + if dwSoundID then + local szSoundPath = X.GetSoundPath(dwSoundID) + if szSoundPath then + X.PlaySound(SOUND.UI_SOUND, szSoundPath, false) + end + end + end + end + end + MON_EXIST_CACHE[dataset.szUUID] = tMonExist + nViewIndex = nViewIndex + 1 + end + for i = nViewIndex, nViewCount do + VIEW_LIST_CACHE[i] = nil + end + D.FireDataUpdateEvent() +end +end + +local function OnFrameCall() + local tExistBuffMonitorTargetType = {} + local tExistSkillMonitorTargetType = {} + for _, dataset in ipairs(D.GetDatasetList()) do + if dataset.szType == 'BUFF' then + tExistBuffMonitorTargetType[dataset.szTarget] = true + elseif dataset.szType == 'SKILL' then + tExistSkillMonitorTargetType[dataset.szTarget] = true + end + end + -- 更新各目标BUFF数据 + local nLogicFrame, info = GetLogicFrameCount() + for eType, _ in pairs(tExistBuffMonitorTargetType) do + local KObject = X.GetTargetHandle(D.GetTarget(eType, 'BUFF')) + if KObject then + local tCache = BUFF_CACHE[KObject.dwID] + if not tCache then + tCache = {} + BUFF_CACHE[KObject.dwID] = tCache + end + -- 当前身上的buff + for _, buff in X.ipairs_c(X.GetBuffList(KObject)) do -- 缓存时必须复制buff表 否则buff过期后表会被回收导致显示错误的BUFF + -- 正向索引用于监控 + if not tCache[buff.dwID] then + tCache[buff.dwID] = {} + end + info = tCache[buff.dwID][buff.szKey] + if not info then + info = {} + tCache[buff.dwID][buff.szKey] = info + end + X.CloneBuff(buff, info) + info.nLeft = math.max(buff.nEndFrame - nLogicFrame, 0) + info.bCool = true + info.nRenderFrame = nLogicFrame + -- 反向索引用于捕获 + if not BUFF_INFO[buff.szName] then + BUFF_INFO[buff.szName] = {} + end + if not BUFF_INFO[buff.szName][buff.szKey] then + BUFF_INFO[buff.szName][buff.szKey] = { + szName = buff.szName, + dwID = buff.dwID, + nLevel = buff.nLevel, + szKey = buff.szKey, + nIcon = buff.nIcon, + } + end + end + -- 处理消失的buff + for _, tBuff in pairs(tCache) do + for k, info in pairs(tBuff) do + if info.nRenderFrame ~= nLogicFrame then + if info.bCool then + info.nLeft = 0 + info.bCool = false + end + info.nRenderFrame = nLogicFrame + end + end + end + end + end + for eType, _ in pairs(tExistSkillMonitorTargetType) do + local KObject = X.GetTargetHandle(D.GetTarget(eType, 'SKILL')) + if KObject then + local tSkill = {} + local aSkill = X.GetSkillMountList() + -- 遍历所有技能 生成反向索引 + for _, dwID in X.spairs(aSkill, SKILL_EXTRA) do + if not tSkill[dwID] then + local nLevel = KObject.GetSkillLevel(dwID) + local KSkill, info = X.GetSkill(dwID, nLevel) + if KSkill and info then + local szKey, szName = dwID, X.GetSkillName(dwID) + if not SKILL_INFO[szName] then + SKILL_INFO[szName] = {} + end + if not SKILL_INFO[szName][szKey] then + SKILL_INFO[szName][szKey] = {} + end + local skill = SKILL_INFO[szName][szKey] + local bCool, szType, nLeft, nInterval, nTotal, nCount, nMaxCount, nSurfaceNum = X.GetSkillCDProgress(KObject, dwID, nLevel, true) + skill.szKey = szKey + skill.dwID = dwID + skill.nLevel = info.nLevel + skill.bCool = bCool or nCount > 0 + skill.szCdType = szType + skill.nCdLeft = nLeft + skill.nCdInterval = nInterval + skill.nCdTotal = nTotal + skill.nCdCount = nCount + skill.nCdMaxCount = nMaxCount + skill.nSurfaceNum = nSurfaceNum + skill.nIcon = info.nIcon + skill.szName = X.GetSkillName(dwID) + tSkill[szKey] = skill + tSkill[dwID] = skill + tSkill[szName] = skill + end + end + end + -- 处理消失的buff + local tLastSkill = SKILL_CACHE[KObject.dwID] + if tLastSkill then + for k, skill in pairs(tLastSkill) do + if not tSkill[k] then + if skill.bCool then + skill.bCool = false + skill.nLeft = 0 + skill.nCount = 0 + end + tSkill[k] = skill + end + end + end + SKILL_CACHE[KObject.dwID] = tSkill + end + end + UpdateView() +end + +function D.OnTargetMonReload() + OnFrameCall() + FireUIEvent('MY_TARGET_MON_DATA__INIT') + X.FrameCall('MY_TargetMonData', MY_TargetMonConfig.nInterval, OnFrameCall) +end +end + +function D.GetViewData(nIndex) + if nIndex then + return VIEW_LIST_CACHE[nIndex] + end + return VIEW_LIST_CACHE +end + +---------------------------------------------------------------------------------------------- +-- 快捷键 +---------------------------------------------------------------------------------------------- +do +for i = 1, 5 do + for j = 1, 10 do + Hotkey.AddBinding( + 'MY_TargetMon_' .. i .. '_' .. j, _L('Cancel buff %d - %d', i, j), + i == 1 and j == 1 and _L['MY Buff Monitor'] or '', + function() + if X.IsRestricted('MY_TargetMon.MapRestriction') and (X.IsInArenaMap() or X.IsInBattlefieldMap()) then + OutputMessage('MSG_ANNOUNCE_RED', _L['Cancel buff is disabled in arena and battlefield.']) + return + end + local tViewData = D.GetViewData(i) + if not tViewData or tViewData.szType ~= 'BUFF' then + OutputMessage('MSG_ANNOUNCE_RED', _L['Hotkey cancel is only allowed for buff.']) + return + end + local KTarget = X.GetTargetHandle(D.GetTarget(tViewData.szTarget, tViewData.szType)) + if not KTarget then + OutputMessage('MSG_ANNOUNCE_RED', _L['Cannot find target to cancel buff.']) + return + end + local item = tViewData.aItem[j] + if not item or not item.bActive then + OutputMessage('MSG_ANNOUNCE_RED', _L['Cannot find buff to cancel.']) + return + end + X.CancelBuff(KTarget, item.dwID, item.nLevel) + end, nil) + end +end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMonData', + exports = { + { + fields = { + MY_TARGET_MON_DATA_MAX_LIMIT = MY_TARGET_MON_DATA_MAX_LIMIT, + GetTarget = D.GetTarget, + GetViewData = D.GetViewData, + RegisterDataUpdateEvent = D.RegisterDataUpdateEvent, + }, + }, + }, +} +MY_TargetMonData = X.CreateModule(settings) +end + +---------------------------------------------------------------------------------------------- +-- 事件注册 +---------------------------------------------------------------------------------------------- + +local function onShieldedReset() + SHIELDED = nil +end +X.RegisterEvent('MY_RESTRICTION', 'MY_TargetMonData__Shield', function() + if arg0 and arg0 ~= 'MY_TargetMon.MapRestriction' then + return + end + onShieldedReset() +end) +X.RegisterEvent('LOADING_END', 'MY_TargetMonData__Shield', onShieldedReset) + +X.RegisterEvent('LOADING_END', 'MY_TargetMonData__AnnounceShielded', D.AnnounceShielded) +X.RegisterKungfuMount('MY_TargetMonData__AnnounceShielded', D.AnnounceShielded) + +local function onTargetMonReload() + VIEW_LIST_CACHE = {} + CONFIG_CACHE = nil + D.OnTargetMonReload() +end +X.RegisterEvent('LOADING_ENDING', 'MY_TargetMonData', onTargetMonReload) +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_RELOAD', 'MY_TargetMonData', onTargetMonReload) +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', 'MY_TargetMonData', onTargetMonReload) +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', 'MY_TargetMonData', onTargetMonReload) +X.RegisterEvent('MY_RESTRICTION', function() + if arg0 and arg0 ~= 'MY_TargetMon' then + return + end + onTargetMonReload() +end) + +X.RegisterEvent('PLAYER_ENTER_SCENE', 'MY_TargetMonData', function() + local dwID = arg0 + X.DelayCall(function() + local player = GetPlayer(dwID) + if not player then + return + end + NEARBY_TARGET_FORCE_CACHE[dwID] = player.dwForceID + if NEARBY_FORCE_STAT_CACHE[player.dwForceID] then + NEARBY_FORCE_STAT_CACHE[player.dwForceID] = NEARBY_FORCE_STAT_CACHE[player.dwForceID] + 1 + else + NEARBY_FORCE_STAT_CACHE[player.dwForceID] = 1 + VIEW_LIST_CACHE = {} + CONFIG_CACHE = nil + end + end) +end) + +X.RegisterEvent('PLAYER_LEAVE_SCENE', 'MY_TargetMonData', function() + local dwForceID = NEARBY_TARGET_FORCE_CACHE[arg0] + if not dwForceID then + return + end + NEARBY_FORCE_STAT_CACHE[dwForceID] = NEARBY_FORCE_STAT_CACHE[dwForceID] - 1 + NEARBY_TARGET_FORCE_CACHE[arg0] = nil + if NEARBY_FORCE_STAT_CACHE[dwForceID] == 0 then + NEARBY_FORCE_STAT_CACHE[dwForceID] = nil + VIEW_LIST_CACHE = {} + CONFIG_CACHE = nil + end +end) + +local function onTargetMonIntervalChange() + X.FrameCall('MY_TargetMonData', MY_TargetMonConfig.nInterval) +end +X.RegisterEvent('MY_TARGET_MON_CONFIG__INTERVAL_CHANGE', onTargetMonIntervalChange) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMonView.lua b/MY_TargetMon/src/MY_TargetMonView.lua new file mode 100644 index 000000000..ffc5f29e7 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMonView.lua @@ -0,0 +1,475 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMonView' +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TargetMon/ui/MY_TargetMon.ini' + +function D.UpdateItemHotkey(hItem, i, j) + local nKey, bShift, bCtrl, bAlt = Hotkey.Get('MY_TargetMon_' .. i .. '_' .. j) + hItem.txtHotkey:SetText(GetKeyShow(nKey, bShift, bCtrl, bAlt, true)) +end + +function D.UpdateHotkey(frame) + local i = frame.nIndex + local hList = frame:Lookup('', 'Handle_List') + for j = 0, hList:GetItemCount() - 1 do + D.UpdateItemHotkey(hList:Lookup(j), i, j + 1) + end +end + +function D.SaveAnchor(frame) + local nHeight = frame:GetH() + frame:SetH(frame.nRowHeight) + local tAnchor = GetFrameAnchor(frame) + frame:SetH(nHeight) + if frame.tViewData.bIgnoreSystemUIScale then + local fRelativeScale = Station.GetUIScale() + tAnchor.x = tAnchor.x * fRelativeScale + tAnchor.y = tAnchor.y * fRelativeScale + end + local dataset = MY_TargetMonConfig.GetDataset(frame.tViewData.szUUID) + if dataset then + dataset.tAnchor = tAnchor + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end +end + +function D.UpdateAnchor(frame) + local anchor = frame.tViewData.tAnchor + local fRelativeScale = frame.tViewData.bIgnoreSystemUIScale and (1 / Station.GetUIScale()) or 1 + local nHeight = frame:GetH() + frame:SetH(frame.nRowHeight) + frame:SetPoint(anchor.s, 0, 0, anchor.r, anchor.x * fRelativeScale, anchor.y * fRelativeScale) + frame:SetH(nHeight) + local x, y = frame:GetAbsPos() + local w, h = frame:GetSize() + local cw, ch = Station.GetClientSize() + if (x < cw or y < ch) and (x + w > 0 and y + h > 0) then + return + end + frame:CorrectPos() +end + +function D.ResetScale(frame) + -- 界面缩放重置为1.0 + local fUIScale = Station.GetUIScale() + if frame.fUIScale ~= fUIScale then + local fRelativeScale = (frame.fUIScale or 1) / fUIScale + frame:Scale(fRelativeScale, fRelativeScale) + frame.fUIScale = fUIScale + end + this.bScaleReset = true +end + +do +local function DrawItem(hList, hItem, nGroup, nIndex, tViewData, item, bScaleReset, bRequireFormatPos) + if not hItem then + hItem = hList:AppendItemFromIni(INI_PATH, 'Handle_Item') + hItem.hBox = hItem:Lookup('Handle_Box') + hItem.box = hItem.hBox:Lookup('Box_Default') + hItem.imgBoxBg = hItem.hBox:Lookup('Image_BoxBg') + hItem.nBoxW = hItem.imgBoxBg:GetW() + hItem.nBoxH = hItem.imgBoxBg:GetH() + hItem.txtTime = hItem.hBox:Lookup('Text_Time') + hItem.txtHotkey = hItem.hBox:Lookup('Text_Hotkey') + hItem.txtStackNum = hItem.hBox:Lookup('Text_StackNum') + hItem.txtShortName = hItem.hBox:Lookup('Text_ShortName') + hItem.hCDBar = hItem:Lookup('Handle_Bar') + hItem.txtProcess = hItem.hCDBar:Lookup('Text_Process') + hItem.imgProcess = hItem.hCDBar:Lookup('Image_Process') + hItem.shaProcess = hItem.hCDBar:Lookup('Shadow_Background') + hItem.txtLongName = hItem.hCDBar:Lookup('Text_Name') + hItem.sfxProcess = hItem.hCDBar:Lookup('SFX') + hItem.imgProcess:SetPercentage(0) + hItem.txtProcess:SetFontColor(255, 255, 255) + hItem.sfxProcess:Set2DRotation(math.pi / 2) + hItem.fUIScale = 1 + hItem.fIconFontScale = X.GetFontScale() + hItem.fOtherFontScale = X.GetFontScale() + local fRelativeScale = 1 / Station.GetUIScale() + hItem:Scale(fRelativeScale, fRelativeScale) + hItem:Hide() + D.UpdateItemHotkey(hItem, nGroup, nIndex) + bRequireFormatPos = true + end + if hItem.fUIScale ~= tViewData.fUIScale + or bScaleReset then + local fRelativeScale = tViewData.fUIScale / hItem.fUIScale + hItem:Scale(fRelativeScale, fRelativeScale) + hItem.sfxProcess:SetModelScale(tViewData.fUIScale * 0.17) + hItem.nBoxW = hItem.imgBoxBg:GetW() + hItem.nBoxH = hItem.imgBoxBg:GetH() + hItem.fUIScale = tViewData.fUIScale + end + if hItem.bCdBar ~= tViewData.bCdBar + or hItem.nCdBarWidth ~= tViewData.nCdBarWidth + or hItem.fIconFontScale ~= tViewData.fIconFontScale + or hItem.fOtherFontScale ~= tViewData.fOtherFontScale + or bScaleReset then + if tViewData.bCdBar then + hItem.hCDBar:Show() + hItem.txtShortName:Hide() + hItem.hCDBar:SetW(tViewData.nCdBarWidth) + hItem.imgProcess:SetW(tViewData.nCdBarWidth) + hItem.shaProcess:SetW(tViewData.nCdBarWidth) + hItem.txtProcess:SetW(tViewData.nCdBarWidth - 10) + hItem.txtLongName:SetW(tViewData.nCdBarWidth - 10) + hItem:SetSize(hItem.nBoxW + tViewData.nCdBarWidth, hItem.nBoxH) + else + hItem.hCDBar:Hide() + hItem.txtShortName:Show() + hItem:SetSize(hItem.nBoxW, hItem.nBoxH + + (hItem.txtShortName:GetRelY() - hItem.nBoxH) * 2 + + hItem.txtShortName:GetH() * tViewData.fOtherFontScale / tViewData.fUIScale * Station.GetUIScale()) + end + hItem.txtTime:SetFontScale(tViewData.fIconFontScale * 1.2) + hItem.txtHotkey:SetFontScale(tViewData.fIconFontScale) + hItem.txtStackNum:SetFontScale(tViewData.fIconFontScale) + hItem.txtProcess:SetFontScale(tViewData.fOtherFontScale) + hItem.txtLongName:SetFontScale(tViewData.fOtherFontScale) + hItem.txtShortName:SetFontScale(tViewData.fOtherFontScale) + hItem.bCdBar = tViewData.bCdBar + hItem.nCdBarWidth = tViewData.nCdBarWidth + hItem.fIconFontScale = tViewData.fIconFontScale + hItem.fOtherFontScale = tViewData.fOtherFontScale + bRequireFormatPos = true + end + if hItem.szCdBarUITex ~= tViewData.szCdBarUITex and tViewData.bCdBar then + X.UI(hItem.imgProcess):Image(tViewData.szCdBarUITex) + hItem.szCdBarUITex = tViewData.szCdBarUITex + end + if hItem.szBoxBgUITex ~= tViewData.szBoxBgUITex then + X.UI(hItem.imgBoxBg):Image(tViewData.szBoxBgUITex) + hItem.szBoxBgUITex = tViewData.szBoxBgUITex + end + if item then + if hItem.nIconID ~= item.nIconID then + hItem.box:SetObjectIcon(item.nIconID) + hItem.nIconID = item.nIconID + end + if hItem.bCd ~= item.bCd then + hItem.box:SetObjectCoolDown(item.bCd) + hItem.bCd = item.bCd + end + if hItem.fCd ~= item.fCd and item.bCd then + hItem.box:SetCoolDownPercentage(item.fCd) + hItem.fCd = item.fCd + end + if hItem.fCdBar ~= item.fCdBar and tViewData.bCdBar then + hItem.imgProcess:SetPercentage(item.fCdBar) + hItem.shaProcess:SetW(tViewData.nCdBarWidth * (1 - item.fCdBar)) + hItem.shaProcess:SetVisible(item.fCdBar < 1) + hItem.shaProcess:SetRelX(tViewData.nCdBarWidth * item.fCdBar) + hItem.sfxProcess:SetRelX(tViewData.nCdBarWidth * item.fCdBar) + hItem.hCDBar:FormatAllItemPos() + hItem.fCdBar = item.fCdBar + end + if hItem.bCdBarFlash ~= item.bCdBarFlash then + hItem.sfxProcess:SetVisible(item.bCdBarFlash) + hItem.bCdBarFlash = item.bCdBarFlash + end + if hItem.szCdBarUITex ~= tViewData.szCdBarUITex and tViewData.bCdBar then + X.UI(hItem.imgProcess):Image(tViewData.szCdBarUITex) + hItem.szCdBarUITex = tViewData.szCdBarUITex + end + if hItem.szBoxBgUITex ~= tViewData.szBoxBgUITex then + X.UI(hItem.imgBoxBg):Image(tViewData.szBoxBgUITex) + hItem.szBoxBgUITex = tViewData.szBoxBgUITex + end + if hItem.bStaring ~= item.bStaring then + hItem.box:SetObjectStaring(item.bStaring) + hItem.bStaring = item.bStaring + end + if hItem.bSparking ~= item.bSparking then + hItem.box:SetObjectSparking(item.bSparking) + hItem.bSparking = item.bSparking + end + if hItem.szBoxExtentAnimate ~= item.szExtentAnimate then + if item.szExtentAnimate and item.szExtentAnimate ~= '' then + local szPath, nFrame = unpack(X.SplitString(item.szExtentAnimate, '|')) + hItem.box:SetExtentAnimate(szPath, nFrame) + else + hItem.box:ClearExtentAnimate() + end + hItem.szBoxExtentAnimate = item.szExtentAnimate + end + if hItem.szTimeLeft ~= item.szTimeLeft then + hItem.txtTime:SetText(item.szTimeLeft) + hItem.szTimeLeft = item.szTimeLeft + end + if hItem.szProcess ~= item.szProcess then + hItem.txtProcess:SetText(item.szProcess) + hItem.szProcess = item.szProcess + end + if hItem.szStackNum ~= item.szStackNum then + hItem.txtStackNum:SetText(item.szStackNum) + hItem.szStackNum = item.szStackNum + end + if hItem.nContentColorR ~= item.aContentColor[1] + or hItem.nContentColorG ~= item.aContentColor[2] + or hItem.nContentColorB ~= item.aContentColor[3] then + hItem.txtLongName:SetFontColor(unpack(item.aContentColor)) + hItem.txtShortName:SetFontColor(unpack(item.aContentColor)) + hItem.nContentColorR, hItem.nContentColorG, hItem.nContentColorB = unpack(item.aContentColor) + end + if hItem.szContent ~= item.szContent then + hItem.txtLongName:SetText(X.ReplaceSensitiveWord(item.szContent)) + hItem.txtShortName:SetText(X.ReplaceSensitiveWord(item.szContent)) + hItem.szContent = item.szContent + end + if not hItem:IsVisible() then + bRequireFormatPos = true + hItem:Show() + end + hItem.dwID = item.dwID + hItem.nLevel = item.nLevel + end + return hItem, bRequireFormatPos +end +function D.UpdateFrame(frame) + local me = X.GetClientPlayer() + if not me then + return + end + local tViewData = MY_TargetMonData.GetViewData(frame.nIndex) + if not tViewData then + return X.UI.CloseFrame(frame) + end + local bRequireFormatPos = false + if frame.tViewData ~= tViewData then + bRequireFormatPos = true + frame.tViewData = tViewData + frame.nWidth = 200 + frame.nHeight = 50 + D.UpdateHotkey(frame) + end + local bScaleReset = frame.bScaleReset + if bScaleReset then + bRequireFormatPos = true + frame.bScaleReset = nil + end + if frame.nMaxLineCount ~= tViewData.nMaxLineCount then + bRequireFormatPos = true + frame.nMaxLineCount = tViewData.nMaxLineCount + end + if frame.szAlignment ~= tViewData.szAlignment then + bRequireFormatPos = true + frame.szAlignment = tViewData.szAlignment + end + local hTotal, hList, nGroup, nIndex, hItem = frame.hTotal, frame.hList, frame.nIndex, 0 + for _, item in ipairs(tViewData.aItem) do + hItem = hList:Lookup(nIndex) + nIndex = nIndex + 1 + hItem, bRequireFormatPos = DrawItem(hList, hItem, nGroup, nIndex, tViewData, item, bScaleReset, bRequireFormatPos) + end + for i = nIndex, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if hItem:IsVisible() then + bRequireFormatPos = true + hItem:Hide() + end + end + -- 检查是否需要重绘界面坐标 + if bRequireFormatPos then + frame.hTemplateItem = DrawItem(hList, frame.hTemplateItem, nGroup, 0, tViewData, nil, bScaleReset, bRequireFormatPos) + hItem = frame.hTemplateItem + local nCount = hList:GetItemCount() + frame.nWidth = math.ceil(hItem:GetW()) * tViewData.nMaxLineCount + frame.nHeight = math.ceil(nCount / tViewData.nMaxLineCount) * math.ceil(hItem:GetH()) + frame.nRowHeight = math.ceil(hItem:GetH()) + hList:SetW(frame.nWidth) + hList:SetIgnoreInvisibleChild(true) + hList:SetHAlign(ALIGNMENT[tViewData.szAlignment] or ALIGNMENT.LEFT) + hList:FormatAllItemPosExt() + hList:SetSize(frame.nWidth, frame.nHeight) + hTotal:SetSize(frame.nWidth, frame.nHeight) + frame:SetSize(frame.nWidth, frame.nHeight) + frame:SetDragArea(0, 0, frame.nWidth, frame.nHeight) + D.UpdateAnchor(frame) + end + if frame.bPenetrable ~= tViewData.bPenetrable + or frame.bDraggable ~= tViewData.bDraggable then + frame.bPenetrable = tViewData.bPenetrable + frame.bDraggable = tViewData.bDraggable + frame:EnableDrag(not tViewData.bPenetrable and tViewData.bDraggable) + frame:SetMousePenetrable(tViewData.bPenetrable) + end +end +end + +MY_TargetMonView = class() + +do +local function FormatAllItemPosExt(hList) + local hItem = hList:Lookup(0) + if not hItem then + return + end + local W = hList:GetW() + local w, h = hItem:GetSize() + local columns = math.max(math.floor(W / w), 1) + local ignoreInvisible = hList:IsIgnoreInvisibleChild() + local aItem = {} + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + if not ignoreInvisible or hItem:IsVisible() then + table.insert(aItem, hItem) + end + end + local align, y = hList:GetHAlign(), 0 + while #aItem > 0 do + local x, deltaX = 0, 0 + if align == ALIGNMENT.LEFT then + x, deltaX = 0, w + elseif align == ALIGNMENT.RIGHT then + x, deltaX = W - w, - w + elseif align == ALIGNMENT.CENTER then + x, deltaX = (W - w * math.min(#aItem, columns)) / 2, w + end + for i = 1, math.min(#aItem, columns) do + table.remove(aItem, 1):SetRelPos(x, y) + x = x + deltaX + end + y = y + h + end + hList:SetSize(W, y) + hList:FormatAllItemPos() +end +function MY_TargetMonView.OnFrameCreate() + this.nIndex = tonumber(this:GetName():sub(#'MY_TargetMon#' + 1)) + this.hTotal = this:Lookup('', '') + this.hList = this:Lookup('', 'Handle_List') + this.hList:Clear() + this.hList.FormatAllItemPosExt = FormatAllItemPosExt + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('HOT_KEY_RELOADED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + D.ResetScale(this) + D.UpdateFrame(this) + MY_TargetMonData.RegisterDataUpdateEvent(this, D.UpdateFrame) +end +end + +function MY_TargetMonView.OnFrameDestroy() + MY_TargetMonData.RegisterDataUpdateEvent(this, false) +end + +function MY_TargetMonView.OnFrameDragEnd() + D.SaveAnchor(this) +end + +function MY_TargetMonView.OnItemMouseEnter() + local name = this:GetName() + local frame = this:GetRoot() + local eMonType = frame.tViewData.szType + if name == 'Box_Default' then + local hItem = this:GetParent():GetParent() + if eMonType == 'BUFF' and hItem.dwID and hItem.nLevel then + local w, h = hItem:GetW(), hItem:GetH() + local x, y = hItem:GetAbsX(), hItem:GetAbsY() + X.OutputBuffTip({x, y, w, h}, hItem.dwID, hItem.nLevel, hItem.nTimeLeft) + elseif eMonType == 'SKILL' and hItem.dwID and hItem.nLevel then + local w, h = hItem:GetW(), hItem:GetH() + local x, y = hItem:GetAbsX(), hItem:GetAbsY() + X.OutputSkillTip({x, y, w, h}, hItem.dwID, hItem.nLevel) + end + this:SetObjectMouseOver(1) + end +end + +function MY_TargetMonView.OnItemMouseLeave() + local name = this:GetName() + local frame = this:GetRoot() + local eMonType = frame.tViewData.szType + if name == 'Box_Default' then + if eMonType == 'BUFF' then + HideTip() + end + this:SetObjectMouseOver(0) + end +end + +function MY_TargetMonView.OnItemLButtonDown() + local name = this:GetName() + local frame = this:GetRoot() + local eMonType = frame.tViewData.szType + if name == 'Box_Default' then + this:SetObjectPressed(1) + end +end +MY_TargetMonView.OnItemRButtonDown = MY_TargetMonView.OnItemLButtonDown + +function MY_TargetMonView.OnItemLButtonUp() + local name = this:GetName() + local frame = this:GetRoot() + local eMonType = frame.tViewData.szType + if name == 'Box_Default' then + this:SetObjectPressed(0) + end +end +MY_TargetMonView.OnItemRButtonUp = MY_TargetMonView.OnItemLButtonUp + +function MY_TargetMonView.OnItemRButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + local tViewData = frame.tViewData + if name == 'Box_Default' and tViewData.szType == 'BUFF' then + local hItem = this:GetParent():GetParent() + local KTarget = X.GetTargetHandle(MY_TargetMonData.GetTarget(tViewData.szTarget, tViewData.szType)) + if not KTarget then + return + end + X.CancelBuff(KTarget, hItem.dwID, hItem.nLevel) + end +end + +function MY_TargetMonView.OnEvent(event) + if event == 'HOT_KEY_RELOADED' then + D.UpdateHotkey(this) + elseif event == 'ON_ENTER_CUSTOM_UI_MODE' then + this:Lookup('', 'Handle_List'):SetAlpha(90) + UpdateCustomModeWindow(this, _L['[MY TargetMon] '] .. this.tViewData.szCaption, this.tViewData.bPenetrable) + elseif event == 'ON_LEAVE_CUSTOM_UI_MODE' then + this:Lookup('', 'Handle_List'):SetAlpha(255) + UpdateCustomModeWindow(this, _L['[MY TargetMon] '] .. this.tViewData.szCaption, this.tViewData.bPenetrable) + if this.tViewData.bDraggable then + this:EnableDrag(true) + end + D.SaveAnchor(this) + elseif event == 'UI_SCALED' then + D.ResetScale(this) + D.UpdateAnchor(this) + end +end + +do +local function onDataInit() + for nIndex, _ in ipairs(MY_TargetMonData.GetViewData()) do + if not Station.Lookup('Normal/' .. 'MY_TargetMon#' .. nIndex) then + X.UI.OpenFrame(INI_PATH, 'MY_TargetMon#' .. nIndex) + end + end +end +X.RegisterEvent('MY_TARGET_MON_DATA__INIT', 'MY_TargetMonView', onDataInit) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_ConfigPanel.lua b/MY_TargetMon/src/MY_TargetMon_ConfigPanel.lua new file mode 100644 index 000000000..c563702af --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_ConfigPanel.lua @@ -0,0 +1,658 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控项全局配置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_ConfigPanel' +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local MY_TARGET_MON_MAP_TYPE = MY_TargetMonConfig.MY_TARGET_MON_MAP_TYPE +local MY_TARGET_MON_MAP_TYPE_NAME = MY_TargetMonConfig.MY_TARGET_MON_MAP_TYPE_NAME +local TARGET_TYPE_LIST = { + 'CLIENT_PLAYER' , + 'CONTROL_PLAYER' , + 'TARGET' , + 'TTARGET' , + 'TEAM_MARK_CLOUD', + 'TEAM_MARK_SWORD', + 'TEAM_MARK_AX' , + 'TEAM_MARK_HOOK' , + 'TEAM_MARK_DRUM' , + 'TEAM_MARK_SHEAR', + 'TEAM_MARK_STICK', + 'TEAM_MARK_JADE' , + 'TEAM_MARK_DART' , + 'TEAM_MARK_FAN' , +} +local CUSTOM_BOX_BG_STYLES = { + {'', _L['None']}, + {'UI/Image/Common/Box.UITex|0'}, + {'UI/Image/Common/Box.UITex|1'}, + {'UI/Image/Common/Box.UITex|2'}, + {'UI/Image/Common/Box.UITex|3'}, + {'UI/Image/Common/Box.UITex|4'}, + {'UI/Image/Common/Box.UITex|5'}, + {'UI/Image/Common/Box.UITex|6'}, + {'UI/Image/Common/Box.UITex|7'}, + {'UI/Image/Common/Box.UITex|8'}, + {'UI/Image/Common/Box.UITex|9'}, + {'UI/Image/Common/Box.UITex|10'}, + {'UI/Image/Common/Box.UITex|11'}, + {'UI/Image/Common/Box.UITex|12'}, + {'UI/Image/Common/Box.UITex|13'}, + {'UI/Image/Common/Box.UITex|14'}, + {'UI/Image/Common/Box.UITex|34'}, + {'UI/Image/Common/Box.UITex|35'}, + {'UI/Image/Common/Box.UITex|42'}, + {'UI/Image/Common/Box.UITex|43'}, + {'UI/Image/Common/Box.UITex|44'}, + {'UI/Image/Common/Box.UITex|45'}, + {'UI/Image/Common/Box.UITex|77'}, + {'UI/Image/Common/Box.UITex|78'}, +} +local CUSTOM_CD_BAR_STYLES = { + PLUGIN_ROOT .. '/img/ST.UITex|0', + PLUGIN_ROOT .. '/img/ST.UITex|1', + PLUGIN_ROOT .. '/img/ST.UITex|2', + PLUGIN_ROOT .. '/img/ST.UITex|3', + PLUGIN_ROOT .. '/img/ST.UITex|4', + PLUGIN_ROOT .. '/img/ST.UITex|5', + PLUGIN_ROOT .. '/img/ST.UITex|6', + PLUGIN_ROOT .. '/img/ST.UITex|7', + PLUGIN_ROOT .. '/img/ST.UITex|8', + '/ui/Image/Common/Money.UITex|168', + '/ui/Image/Common/Money.UITex|203', + '/ui/Image/Common/Money.UITex|204', + '/ui/Image/Common/Money.UITex|205', + '/ui/Image/Common/Money.UITex|206', + '/ui/Image/Common/Money.UITex|207', + '/ui/Image/Common/Money.UITex|208', + '/ui/Image/Common/Money.UITex|209', + '/ui/Image/Common/Money.UITex|210', + '/ui/Image/Common/Money.UITex|211', + '/ui/Image/Common/Money.UITex|212', + '/ui/Image/Common/Money.UITex|213', + '/ui/Image/Common/Money.UITex|214', + '/ui/Image/Common/Money.UITex|215', + '/ui/Image/Common/Money.UITex|216', + '/ui/Image/Common/Money.UITex|217', + '/ui/Image/Common/Money.UITex|218', + '/ui/Image/Common/Money.UITex|219', + '/ui/Image/Common/Money.UITex|220', + '/ui/Image/Common/Money.UITex|228', + '/ui/Image/Common/Money.UITex|232', + '/ui/Image/Common/Money.UITex|233', + '/ui/Image/Common/Money.UITex|234', +} + +function D.Open(szConfigUUID) + local dataset = MY_TargetMonConfig.GetDataset(szConfigUUID) + if not dataset then + return + end + local ui = X.UI.CreateFrame('MY_TargetMon_ConfigPanel', { + w = 800, h = 360, text = _L['MY_TargetMon_ConfigPanel'], + }) + local nPaddingX, nPaddingY = 10, 10 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + local uiWnd = ui:Append('WndWindow', { x = 0, y = 50, w = nW, h = 310 }) + + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Title:'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 220, h = 22, + r = 255, g = 255, b = 0, text = dataset.szTitle, + onChange = function(val) + dataset.szTitle = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }):Width() + 5 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Author:'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 180, h = 22, + r = 255, g = 255, b = 0, text = dataset.szAuthor, + onChange = function(val) + dataset.szAuthor = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }):Width() + 5 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Version:'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 120, h = 22, + r = 255, g = 255, b = 0, text = dataset.szVersion, + onChange = function(val) + dataset.szVersion = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }):Width() + 5 + nY = nY + 40 + + local nDeltaY = 31 + nX = nPaddingX + 20 + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Enable'], + checked = dataset.bEnable, + onCheck = function(bChecked) + dataset.bEnable = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 90, y = nY, w = 200, + text = _L['Hide others buff'], + tip = { + render = _L['Hide others buff TIP'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + checked = dataset.bHideOthers, + onCheck = function(bChecked) + dataset.bHideOthers = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() + return dataset.bEnable and dataset.szType == 'BUFF' + end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 180, y = nY, w = 180, + text = _L['Hide void'], + checked = dataset.bHideVoid, + onCheck = function(bChecked) + dataset.bHideVoid = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 20 + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, w = 90, + text = _L['Penetrable'], + checked = dataset.bPenetrable, + onCheck = function(bChecked) + dataset.bPenetrable = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 90, y = nY, w = 100, + text = _L['Undragable'], + checked = not dataset.bDraggable, + onCheck = function(bChecked) + dataset.bDraggable = not bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable and not dataset.bPenetrable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 180, y = nY, w = 120, + text = _L['Ignore system ui scale'], + checked = dataset.bIgnoreSystemUIScale, + onCheck = function(bChecked) + dataset.bIgnoreSystemUIScale = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 20 + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Show cd circle'], + checked = dataset.bCdCircle, + onCheck = function(bChecked) + dataset.bCdCircle = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 90, y = nY, w = 200, + text = _L['Show cd flash'], + checked = dataset.bCdFlash, + onCheck = function(bChecked) + dataset.bCdFlash = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 180, y = nY, w = 200, + text = _L['Show cd ready spark'], + checked = dataset.bCdReadySpark, + onCheck = function(bChecked) + dataset.bCdReadySpark = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable and not dataset.bHideVoid end, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 20 + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, w = 120, + text = _L['Show cd bar'], + checked = dataset.bCdBar, + onCheck = function(bChecked) + dataset.bCdBar = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 90, y = nY, w = 120, + text = _L['Show name'], + checked = dataset.bShowName, + onCheck = function(bChecked) + dataset.bShowName = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndCheckBox', { + x = nX + 180, y = nY, w = 120, + text = _L['Show time'], + checked = dataset.bShowTime, + onCheck = function(bChecked) + dataset.bShowTime = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + nX = nPaddingX + 20 + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, w = 90, + text = _L['Play sound'], + checked = dataset.bPlaySound, + onCheck = function(bChecked) + dataset.bPlaySound = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + + uiWnd:Append('WndComboBox', { + x = nX + 90, y = nY, w = 100, + text = _L['Icon style'], + menu = function() + local t, t1, szIcon, nFrame = {} + for _, p in ipairs(CUSTOM_BOX_BG_STYLES) do + szIcon, nFrame = unpack(p[1]:split('|')) + t1 = { + szOption = p[2] or p[1], + fnAction = function() + dataset.szBoxBgUITex = p[1] + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + X.UI.ClosePopupMenu() + end, + szIcon = szIcon, + nFrame = nFrame, + nIconMarginLeft = -3, + nIconMarginRight = -3, + szLayer = 'ICON_RIGHTMOST', + bCheck = true, bMCheck = true, + } + if p[1] == dataset.bBoxBgUITex then + t1.rgb = {255, 255, 0} + t1.bChecked = true + end + table.insert(t, t1) + end + return t + end, + autoEnable = function() return dataset.bEnable end, + }) + uiWnd:Append('WndComboBox', { + x = nX + 90 + 100, y = nY, w = 100, + text = _L['Countdown style'], + menu = function() + local t, t1, szIcon, nFrame = {} + for _, text in ipairs(CUSTOM_CD_BAR_STYLES) do + szIcon, nFrame = unpack(text:split('|')) + t1 = { + szOption = text, + fnAction = function() + dataset.szCdBarUITex = text + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + X.UI.ClosePopupMenu() + end, + szIcon = szIcon, + nFrame = nFrame, + szLayer = 'ICON_FILL', + bCheck = true, bMCheck = true, + } + if string.lower(text) == string.lower(dataset.szCdBarUITex) then + t1.rgb = {255, 255, 0} + t1.bChecked = true + end + table.insert(t, t1) + end + return t + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + 30 + + nY = nPaddingY + 40 + local nDeltaY = 21 + local xr = nW - 340 + uiWnd:Append('WndComboBox', { + x = xr, y = nY, w = 100, + text = _L['Set target'], + menu = function() + local t = {} + for _, eType in ipairs(TARGET_TYPE_LIST) do + table.insert(t, { + szOption = _L.TARGET[eType], + bCheck = true, bMCheck = true, + bChecked = eType == (dataset.szType == 'SKILL' and 'CONTROL_PLAYER' or dataset.szTarget), + fnDisable = function() + return dataset.szType == 'SKILL' and eType ~= 'CONTROL_PLAYER' + end, + fnAction = function() + dataset.szTarget = eType + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }) + end + table.insert(t, { bDevide = true }) + for _, eType in ipairs({'BUFF', 'SKILL'}) do + table.insert(t, { + szOption = _L.TYPE[eType], + bCheck = true, bMCheck = true, bChecked = eType == dataset.szType, + fnAction = function() + dataset.szType = eType + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }) + end + table.insert(t, { bDevide = true }) + for _, eType in ipairs({'LEFT', 'RIGHT', 'CENTER'}) do + table.insert(t, { + szOption = _L.ALIGNMENT[eType], + bCheck = true, bMCheck = true, bChecked = eType == dataset.szAlignment, + fnAction = function() + dataset.szAlignment = eType + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + }) + end + return t + end, + autoEnable = function() return dataset.bEnable end, + }) + uiWnd:Append('WndComboBox', { + x = xr + 105, y = nY, w = 165, + text = _L['Only enable in those maps'], + menu = function() + local menu = X.GetDungeonMenu({ + fnAction = function(p) + if not dataset.tMap then + dataset.tMap = {} + end + dataset.tMap[p.dwID] = not dataset.tMap[p.dwID] + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', dataset.szUUID, 'tMap') + end, + tChecked = dataset.tMap or {}, + }) + for i, p in ipairs(menu) do + p.fnDisable = function() return X.IsEmpty(dataset.tMap) or dataset.tMap.bAll end + end + local t1 = { + szOption = _L['Monitor Map Requirement By Type'], + fnDisable = function() return X.IsEmpty(dataset.tMap) or dataset.tMap.bAll end, + } + for _, eMapType in ipairs({ + MY_TARGET_MON_MAP_TYPE.CITY, -- 主城 + MY_TARGET_MON_MAP_TYPE.VILLAGE, -- 野外 + MY_TARGET_MON_MAP_TYPE.DUNGEON, -- 秘境 + MY_TARGET_MON_MAP_TYPE.TEAM_DUNGEON, -- 小队秘境 + MY_TARGET_MON_MAP_TYPE.RAID_DUNGEON, -- 团队秘境 + MY_TARGET_MON_MAP_TYPE.COMPETITION, -- 竞技 + MY_TARGET_MON_MAP_TYPE.STARVE, -- 浪客行 + MY_TARGET_MON_MAP_TYPE.ARENA, -- 名剑大会 + MY_TARGET_MON_MAP_TYPE.BATTLEFIELD, -- 战场 + MY_TARGET_MON_MAP_TYPE.PUBG, -- 绝境战场 + MY_TARGET_MON_MAP_TYPE.ZOMBIE, -- 李渡鬼域 + MY_TARGET_MON_MAP_TYPE.MONSTER, -- 百战 + MY_TARGET_MON_MAP_TYPE.MOBA, -- 列星虚境 + MY_TARGET_MON_MAP_TYPE.HOMELAND, -- 家园 + MY_TARGET_MON_MAP_TYPE.GUILD_TERRITORY, -- 帮会领地 + MY_TARGET_MON_MAP_TYPE.ROGUELIKE, -- 八荒衡鉴 + MY_TARGET_MON_MAP_TYPE.CAMP, -- 阵营地图 + MY_TARGET_MON_MAP_TYPE.STRONGHOLD, -- 据点地图 + MY_TARGET_MON_MAP_TYPE.SCHOOL, -- 门派地图 + }) do + table.insert(t1, { + szOption = MY_TARGET_MON_MAP_TYPE_NAME[eMapType], + bCheck = true, + bChecked = dataset.tMap and dataset.tMap[eMapType], + fnAction = function(_, bChecked) + if not dataset.tMap then + dataset.tMap = {} + end + dataset.tMap[eMapType] = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', dataset.szUUID, 'tMap') + end, + fnDisable = function() return X.IsEmpty(dataset.tMap) or dataset.tMap.bAll end, + }) + end + table.insert(menu, 1, t1) + table.insert(menu, 1, { + szOption = _L['Monitor All Maps'], + bCheck = true, + bChecked = X.IsEmpty(dataset.tMap) or dataset.tMap.bAll, + fnAction = function(_, bChecked) + if not dataset.tMap then + dataset.tMap = {} + end + dataset.tMap.bAll = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', dataset.szUUID, 'tMap') + end, + }) + return menu + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + 24 + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {1, 32}, + value = dataset.nMaxLineCount, + textFormatter = function(val) return _L('Display %d eachline.', val) end, + onChange = function(val) + dataset.nMaxLineCount = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {1, 300}, + value = dataset.fScale * 100, + textFormatter = function(val) return _L('UI scale %d%%.', val) end, + onChange = function(val) + dataset.fScale = val / 100 + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {1, 300}, + value = dataset.fIconFontScale * 100, + textFormatter = function(val) return _L('Icon font scale %d%%.', val) end, + onChange = function(val) + dataset.fIconFontScale = val / 100 + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {1, 300}, + value = dataset.fOtherFontScale * 100, + textFormatter = function(val) return _L('Other font scale %d%%.', val) end, + onChange = function(val) + dataset.fOtherFontScale = val / 100 + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {50, 1000}, + value = dataset.nCdBarWidth, + textFormatter = function(val) return _L('CD width %dpx.', val) end, + onChange = function(val) + dataset.nCdBarWidth = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + uiWnd:Append('WndSlider', { + x = xr, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + range = {-1, 30}, + value = dataset.nDecimalTime, + textFormatter = function(val) + if val == -1 then + return _L['Always show decimal time.'] + elseif val == 0 then + return _L['Never show decimal time.'] + else + return _L('Show decimal time left in %ds.', val) + end + end, + onChange = function(val) + dataset.nDecimalTime = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + end, + autoEnable = function() return dataset.bEnable end, + }) + nY = nY + nDeltaY + + nY = nY + 30 + + uiWnd:Append('WndButton', { + x = (nW - 70) / 2, y = nY, + w = 80, h = 35, + text = _L['Delete'], + color = { 255, 0, 0 }, + buttonStyle = 'FLAT', + onClick = function() + X.Confirm(_L['Sure to delete monitor? This operation can not be undone.'], function() + MY_TargetMonConfig.DeleteDataset(szConfigUUID) + MY_TargetMon_ConfigPanel.Close() + end) + end, + }) + + local parent = Station.Lookup('Normal/MY_TargetMon_PS') + ui:Pos(parent:GetRelX() + (parent:GetW() - ui:Width()) / 2, parent:GetRelY() + (parent:GetH() - ui:Height()) / 2) +end + +function D.Close() + X.UI.CloseFrame('MY_TargetMon_ConfigPanel') +end + +function D.OnFrameBreathe() + local parent = Station.Lookup('Normal/MY_TargetMon_PS') + if not parent then + X.UI.CloseFrame(this) + return + end + local frame, bBehindParent = parent:GetNext(), true + while frame do + if frame:GetName() == this:GetName() then + bBehindParent = false + break + end + frame = frame:GetNext() + end + if bBehindParent then + this:BringToTop() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_ConfigPanel', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + Open = D.Open, + Close = D.Close, + }, + }, + }, +} +MY_TargetMon_ConfigPanel = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_MonitorPanel.lua b/MY_TargetMon/src/MY_TargetMon_MonitorPanel.lua new file mode 100644 index 000000000..c28f3c493 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_MonitorPanel.lua @@ -0,0 +1,644 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控监控项配置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_MonitorPanel' +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local CUSTOM_BOX_EXTENT_ANIMATE = { + {nil, _L['None']}, + {'ui/Image/Common/Box.UITex|17'}, + {'ui/Image/Common/Box.UITex|20'}, +} +local DEFAULT_CONTENT_COLOR = {255, 255, 0} +local MY_TARGET_MON_MAP_TYPE = MY_TargetMonConfig.MY_TARGET_MON_MAP_TYPE +local MY_TARGET_MON_MAP_TYPE_NAME = MY_TargetMonConfig.MY_TARGET_MON_MAP_TYPE_NAME + +function D.Open(szConfigUUID, szMonitorUUID) + local dataset = MY_TargetMonConfig.GetDataset(szConfigUUID) + if not dataset then + return + end + local mon + for _, m in ipairs(dataset.aMonitor) do + if m.szUUID == szMonitorUUID then + mon = m + end + end + if not mon then + return + end + local ui = X.UI.CreateFrame('MY_TargetMon_MonitorPanel', { + w = 800, h = 420, text = '', + }) + local nPaddingX, nPaddingY = 30, 10 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + local uiWnd = ui:Append('WndWindow', { x = 0, y = 30, w = nW, h = 380 }) + + local nDeltaY = 28 + + -- 图标 + uiWnd:Append('Box', { + x = (nW - 50) / 2, y = nY, w = 50, h = 50, icon = mon.nIconID or MY_TargetMonConfig.DEFAULT_MONITOR_ICON_ID, + onHover = function(bHover) this:SetObjectMouseOver(bHover) end, + onClick = function() + local box = this + local menu = {} + local t1 = { + szOption = _L['Monitor Change Icon'], + fnAction = function() + X.UI.OpenIconPicker( + function(nIconID) + mon.nIconID = nIconID + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + box:SetObjectIcon(nIconID) + end, + mon.nIconID + ) + X.UI.ClosePopupMenu() + end, + } + if mon.nIconID then + t1.szLayer = 'ICON_RIGHT' + t1.szIcon = 'ui/Image/UICommon/Feedanimials.uitex' + t1.nFrame = 86 + t1.nMouseOverFrame = 87 + t1.fnClickIcon = function() + mon.nIconID = nil + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + box:SetObjectIcon(MY_TargetMonConfig.DEFAULT_MONITOR_ICON_ID) + X.UI.ClosePopupMenu() + end + end + table.insert(menu, t1) + local nX, nY = Cursor.GetPos() + local nW, nH = 0, 0 + menu.x = nX + menu.y = nY + nH + menu.nMiniWidth = nW + X.UI.PopupMenu(menu) + end, + }) + nY = nY + 40 + + -- 通用 + nX = nPaddingX + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Monitor Common Config'], + }):Width() + 5 + -- 启用 + nX = nX + uiWnd:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Monitor Enable'], + checked = mon.bEnable, + onCheck = function(bChecked) + mon.bEnable = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }):Width() + 5 + nY = nY + nDeltaY + + -- ID + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor ID'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 100, h = 22, + text = mon.dwID, + onChange = function(val) + local nValue = tonumber(val) + if nValue then + mon.dwID = nValue + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end + end, + }):Width() + 5 + -- 等级 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor Level'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 50, h = 22, + text = mon.nLevel, + onChange = function(val) + local nValue = tonumber(val) + if nValue then + mon.nLevel = nValue + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end + end, + }):Width() + 5 + -- 层数 + if dataset.szType == 'BUFF' then + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor StackNum'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndComboBox', { + x = nX, y = nY, w = 90, h = 25, + text = X.GetOperatorName(mon.nStackNumOp or '=='), + menu = function() + local this = this + return X.InsertOperatorMenu( + {}, + mon.nStackNumOp, + function(szOp) + mon.nStackNumOp = szOp + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + X.UI(this):Text(X.GetOperatorName(szOp)) + X.UI.ClosePopupMenu() + end + ) + end, + tip = { + render = _L['Monitor op value set to 0, means no limit, operator will be ignored.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 50, h = 22, + text = mon.nStackNum, + onChange = function(szValue) + local nValue = tonumber(szValue) + if nValue then + mon.nStackNum = nValue + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end + end, + tip = { + render = _L['Monitor op value set to 0, means no limit, operator will be ignored.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + end + nY = nY + nDeltaY + + -- 备注名称 + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor Note'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + x = nX, y = nY, w = 205, h = 22, + text = mon.szNote, + onChange = function(val) + mon.szNote = val + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }):Width() + 5 + nY = nY + nDeltaY + + -- 提示内容 + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor Content'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndAutocomplete', { + text = mon.szContent, + x = nX, y = nY, w = 180, h = 22, + onChange = function(szText) + mon.szContent = szText + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + onClick = function() + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + else + X.UI(this):Autocomplete('search', '') + end + end, + autocomplete = {{'option', 'source', _L.MONITOR_CONTENT_LIST}, {'option', 'maxOption', 40}}, + }):Width() + 5 + nX = nX + uiWnd:Append('ColorBox', { + w = 18, h = 18, text = '', + x = nX, y = nY + 1, color = mon.aContentColor or DEFAULT_CONTENT_COLOR, + onColorPick = function(r, g, b) + mon.aContentColor = {r, g, b} + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }):Width() + 5 + nY = nY + nDeltaY + + -- 提示内容 + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + text = _L['Monitor Group'], + }):Width() + 5 + nX = nX + uiWnd:Append('WndEditBox', { + text = mon.szGroup, + x = nX, y = nY, w = 180, h = 22, + onChange = function(szText) + if szText == '' then + szText = nil + end + mon.szGroup = szText + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + tip = { + render = _L['Monitor same group will only show one at the same time'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):Width() + 5 + nY = nY + nDeltaY + + -- 条件 + nX = nPaddingX + nY = nY + 10 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Monitor Condition Config'], + }):Width() + 5 + nY = nY + nDeltaY + + -- 自身心法 + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Self Kungfu Requirement'], + x = nX, y = nY, + menu = function() + local menu = { + { + szOption = _L['Monitor All Kungfu'], + rgb = {255, 255, 0}, + bCheck = true, + bChecked = X.IsEmpty(mon.tKungfu) or mon.tKungfu.bAll, + fnAction = function(_, bChecked) + if not mon.tKungfu then + mon.tKungfu = {} + end + mon.tKungfu.bAll = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }, + } + for _, force in ipairs(X.CONSTANT.FORCE_LIST) do + for i, dwKungfuID in ipairs(X.GetForceKungfuList(force.dwID) or {}) do + table.insert(menu, { + szOption = X.GetSkillName(dwKungfuID, 1), + rgb = {X.GetForceColor(force.dwID, 'foreground')}, + bCheck = true, + bChecked = not X.IsEmpty(mon.tKungfu) and mon.tKungfu[dwKungfuID], + fnAction = function(_, bChecked) + if not mon.tKungfu then + mon.tKungfu = {} + end + mon.tKungfu[dwKungfuID] = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + fnDisable = function() return X.IsEmpty(mon.tKungfu) or mon.tKungfu.bAll end, + }) + end + end + return menu + end, + }):Width() + 5 + + -- 目标心法 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Target Kungfu Requirement'], + x = nX, y = nY, + menu = function() + local menu = { + { + szOption = _L['All kungfus'], + rgb = {255, 255, 0}, + bCheck = true, + bChecked = X.IsEmpty(mon.tTargetKungfu) or mon.tTargetKungfu.bAll, + fnAction = function(_, bChecked) + if not mon.tTargetKungfu then + mon.tTargetKungfu = {} + end + mon.tTargetKungfu.bAll = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }, + { + szOption = _L['NPC'], + rgb = {255, 255, 0}, + bCheck = true, + bChecked = not X.IsEmpty(mon.tTargetKungfu) and mon.tTargetKungfu.bNpc, + fnAction = function(_, bChecked) + if not mon.tTargetKungfu then + mon.tTargetKungfu = {} + end + mon.tTargetKungfu.bNpc = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + fnDisable = function() return X.IsEmpty(mon.tTargetKungfu) or mon.tTargetKungfu.bAll end, + }, + } + for _, force in ipairs(X.CONSTANT.FORCE_LIST) do + for i, dwKungfuID in ipairs(X.GetForceKungfuList(force.dwID) or {}) do + table.insert(menu, { + szOption = X.GetSkillName(dwKungfuID, 1), + rgb = {X.GetForceColor(force.dwID, 'foreground')}, + bCheck = true, + bChecked = not X.IsEmpty(mon.tTargetKungfu) and mon.tTargetKungfu[dwKungfuID], + fnAction = function(_, bChecked) + if not mon.tTargetKungfu then + mon.tTargetKungfu = {} + end + mon.tTargetKungfu[dwKungfuID] = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + fnDisable = function() return X.IsEmpty(mon.tTargetKungfu) or mon.tTargetKungfu.bAll end, + }) + end + end + return menu + end, + }):Width() + 5 + + -- 地图要求 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Map Requirement'], + x = nX, y = nY, + menu = function() + local menu = X.GetDungeonMenu({ + fnAction = function(p) + if not mon.tMap then + mon.tMap = {} + end + mon.tMap[p.dwID] = not mon.tMap[p.dwID] + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + tChecked = mon.tMap, + }) + for i, p in ipairs(menu) do + p.fnDisable = function() return X.IsEmpty(mon.tMap) or mon.tMap.bAll end + end + local t1 = { + szOption = _L['Monitor Map Requirement By Type'], + fnDisable = function() return X.IsEmpty(mon.tMap) or mon.tMap.bAll end, + } + for _, eMapType in ipairs({ + MY_TARGET_MON_MAP_TYPE.CITY, -- 主城 + MY_TARGET_MON_MAP_TYPE.VILLAGE, -- 野外 + MY_TARGET_MON_MAP_TYPE.DUNGEON, -- 秘境 + MY_TARGET_MON_MAP_TYPE.TEAM_DUNGEON, -- 小队秘境 + MY_TARGET_MON_MAP_TYPE.RAID_DUNGEON, -- 团队秘境 + MY_TARGET_MON_MAP_TYPE.COMPETITION, -- 竞技 + MY_TARGET_MON_MAP_TYPE.STARVE, -- 浪客行 + MY_TARGET_MON_MAP_TYPE.ARENA, -- 名剑大会 + MY_TARGET_MON_MAP_TYPE.BATTLEFIELD, -- 战场 + MY_TARGET_MON_MAP_TYPE.PUBG, -- 绝境战场 + MY_TARGET_MON_MAP_TYPE.ZOMBIE, -- 李渡鬼域 + MY_TARGET_MON_MAP_TYPE.MONSTER, -- 百战 + MY_TARGET_MON_MAP_TYPE.MOBA, -- 列星虚境 + MY_TARGET_MON_MAP_TYPE.HOMELAND, -- 家园 + MY_TARGET_MON_MAP_TYPE.GUILD_TERRITORY, -- 帮会领地 + MY_TARGET_MON_MAP_TYPE.ROGUELIKE, -- 八荒衡鉴 + MY_TARGET_MON_MAP_TYPE.CAMP, -- 阵营地图 + MY_TARGET_MON_MAP_TYPE.STRONGHOLD, -- 据点地图 + MY_TARGET_MON_MAP_TYPE.SCHOOL, -- 门派地图 + }) do + table.insert(t1, { + szOption = MY_TARGET_MON_MAP_TYPE_NAME[eMapType], + bCheck = true, + bChecked = mon.tMap and mon.tMap[eMapType], + fnAction = function(_, bChecked) + if not mon.tMap then + mon.tMap = {} + end + mon.tMap[eMapType] = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + fnDisable = function() return X.IsEmpty(mon.tMap) or mon.tMap.bAll end, + }) + end + table.insert(menu, 1, t1) + table.insert(menu, 1, { + szOption = _L['Monitor All Maps'], + bCheck = true, + bChecked = X.IsEmpty(mon.tMap) or mon.tMap.bAll, + fnAction = function(_, bChecked) + if not mon.tMap then + mon.tMap = {} + end + mon.tMap.bAll = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }) + return menu + end, + }):Width() + 5 + + -- 隐藏消失的 + nX = nX + uiWnd:Append('WndCheckBox', { + w = 'auto', h = 25, text = dataset.bHideVoid and _L['Monitor Show Even Void'] or _L['Monitor Hide If Void'], + x = nX, y = nY, + checked = mon.bFlipHideVoid, + onCheck = function(bChecked) + mon.bFlipHideVoid = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }):Width() + 5 + + -- 隐藏他人的 + if dataset.szType == 'BUFF' then + nX = nX + uiWnd:Append('WndCheckBox', { + w = 'auto', h = 25, text = dataset.bHideOthers and _L['Monitor Show Even Others'] or _L['Monitor Hide If Others'], + x = nX, y = nY, + checked = mon.bFlipHideOthers, + onCheck = function(bChecked) + mon.bFlipHideOthers = bChecked + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + }):Width() + 5 + end + + nY = nY + nDeltaY + + -- 效果 + nX = nPaddingX + nY = nY + 10 + nX = nX + uiWnd:Append('Text', { + x = nX, y = nY - 3, w = 'auto', + r = 255, g = 255, b = 0, + text = _L['Monitor Effect Config'], + }):Width() + 5 + nY = nY + nDeltaY + + -- 出现声音 + nX = nPaddingX + 20 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Play Sound When Appear'], + x = nX, y = nY, + menu = function() + local menu = X.GetSoundMenu( + function(dwID, bCheck) + if not mon.aSoundAppear then + mon.aSoundAppear = {} + end + if not bCheck then + for i, v in X.ipairs_r(mon.aSoundAppear) do + if v == dwID then + table.remove(mon.aSoundAppear, i) + end + end + else + table.insert(mon.aSoundAppear, dwID) + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + mon.aSoundAppear and X.ArrayToObject(mon.aSoundAppear) or {}, + true + ) + return menu + end, + }):Width() + 5 + + -- 消失声音 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Play Sound When Disappear'], + x = nX, y = nY, + menu = function() + local menu = X.GetSoundMenu( + function(dwID, bCheck) + if not mon.aSoundDisappear then + mon.aSoundDisappear = {} + end + if not bCheck then + for i, v in X.ipairs_r(mon.aSoundDisappear) do + if v == dwID then + table.remove(mon.aSoundDisappear, i) + end + end + else + table.insert(mon.aSoundDisappear, dwID) + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + mon.aSoundDisappear and X.ArrayToObject(mon.aSoundDisappear) or {}, + true + ) + return menu + end, + }):Width() + 5 + + -- 显示特效框 + nX = nX + uiWnd:Append('WndComboBox', { + w = 'auto', h = 25, text = _L['Monitor Active Extent Animate'], + x = nX, y = nY, + menu = function() + local menu = {} + for _, p in ipairs(CUSTOM_BOX_EXTENT_ANIMATE) do + local t1 = { + szOption = p[2] or p[1], + bCheck = true, bMCheck = true, + bChecked = p[1] == mon.szExtentAnimate, + fnAction = function() + mon.szExtentAnimate = p[1] + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end, + nIconMarginLeft = -3, + nIconMarginRight = -3, + szLayer = 'ICON_RIGHTMOST', + } + if p[1] then + t1.szIcon, t1.nFrame = unpack(p[1]:split('|')) + end + table.insert(menu, t1) + end + return menu + end, + }):Width() + 5 + + nX = nPaddingX + 20 + nY = nY + nDeltaY + 20 + uiWnd:Append('WndButton', { + x = (nW - 70) / 2, y = nY, + w = 80, h = 35, + text = _L['Delete'], + color = { 255, 0, 0 }, + buttonStyle = 'FLAT', + onClick = function() + X.Confirm(_L['Sure to delete monitor? This operation can not be undone.'], function() + for i, v in X.ipairs_r(dataset.aMonitor) do + if v == mon then + table.remove(dataset.aMonitor, i) + MY_TargetMon_MonitorPanel.Close() + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + return + end + end + end) + end, + }) + + local parent = Station.Lookup('Normal/MY_TargetMon_PS') + ui:Pos(parent:GetRelX() + (parent:GetW() - ui:Width()) / 2, parent:GetRelY() + (parent:GetH() - ui:Height()) / 2) +end + +function D.Close() + X.UI.CloseFrame('MY_TargetMon_MonitorPanel') +end + +function D.OnFrameBreathe() + local parent = Station.Lookup('Normal/MY_TargetMon_PS') + if not parent or Station.Lookup('Normal/MY_TargetMon_ConfigPanel') then + X.UI.CloseFrame(this) + return + end + local frame, bBehindParent = parent:GetNext(), true + while frame do + if frame:GetName() == this:GetName() then + bBehindParent = false + break + end + frame = frame:GetNext() + end + if bBehindParent then + this:BringToTop() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_MonitorPanel', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + Open = D.Open, + Close = D.Close, + }, + }, + }, +} +MY_TargetMon_MonitorPanel = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_PS.lua b/MY_TargetMon/src/MY_TargetMon_PS.lua new file mode 100644 index 000000000..d29592095 --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_PS.lua @@ -0,0 +1,629 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控配置相关 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_PS' +-------------------------------------------------------------------------------- +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TargetMon/ui/MY_TargetMon_PS.ini' +local D = {} + +function D.OpenPanel() + if X.IsRestricted('MY_TargetMon') then + return + end + X.UI.CreateFrame('MY_TargetMon_PS', { + text = _L['MY_TargetMon_PS'], + w = 1060, h = 660, + }) +end + +function D.ClosePanel() + X.UI.CloseFrame('MY_TargetMon_PS') +end + +function D.TogglePanel() + if Station.Lookup('Normal/MY_TargetMon_PS') then + D.ClosePanel() + else + D.OpenPanel() + end +end + +function D.UpdateDatasetActiveState(frame) + local hList = frame:Lookup('Wnd_Total/WndScroll_Dataset', 'Handle_DatasetList') + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + hItem:Lookup('Image_DatasetItemBg_Sel'):SetVisible(hItem.dataset.szUUID == frame.szActiveDatasetUUID) + end +end + +function D.DrawDatasetList(frame) + local aDataset = MY_TargetMonConfig.GetDatasetList() + local szActiveDatasetUUID + -- 选中数据 + for _, dataset in ipairs(aDataset) do + if not szActiveDatasetUUID or dataset.szUUID == frame.szActiveDatasetUUID then + szActiveDatasetUUID = dataset.szUUID + end + end + frame.szActiveDatasetUUID = szActiveDatasetUUID + -- 渲染列表 + local hList = frame:Lookup('Wnd_Total/WndScroll_Dataset', 'Handle_DatasetList') + hList:Clear() + for _, dataset in ipairs(aDataset) do + local hItem = hList:AppendItemFromIni(INI_FILE, 'Handle_DatasetItem') + local aTextColor = dataset.bEnable and {255, 255, 255} or {192, 192, 192} + hItem:Lookup('Text_DatasetItemTitle'):SetText(dataset.szTitle) + hItem:Lookup('Text_DatasetItemTitle'):SetFontColor(X.Unpack(aTextColor)) + hItem:Lookup('Text_DatasetItemAuthor'):SetText(dataset.szAuthor) + hItem:Lookup('Text_DatasetItemAuthor'):SetFontColor(X.Unpack(aTextColor)) + hItem:Lookup('Text_DatasetItemVersion'):SetText(dataset.szVersion) + hItem:Lookup('Text_DatasetItemVersion'):SetFontColor(X.Unpack(aTextColor)) + hItem:Lookup('Image_DatasetItemBg_Sel'):SetVisible(dataset.szUUID == szActiveDatasetUUID) + hItem.dataset = dataset + end + hList:FormatAllItemPos() + D.DrawMonitorList(frame) +end + +function D.DrawMonitorList(frame) + local dataset = MY_TargetMonConfig.GetDataset(frame.szActiveDatasetUUID) + local hList = frame:Lookup('Wnd_Total/WndScroll_Monitor', 'Handle_Monitor_List') + local szSearchMonitor = frame.szSearchMonitor + if dataset then + local nCount = 0 + for i, mon in ipairs(dataset.aMonitor) do + if not szSearchMonitor + or szSearchMonitor == '' + or (mon.szNote and mon.szNote:find(szSearchMonitor)) + or (mon.szContent and mon.szContent:find(szSearchMonitor)) then + local hItem = hList:Lookup(nCount) + if not hItem then + hItem = hList:AppendItemFromIni(INI_FILE, 'Handle_MonitorItem') + end + hItem:Lookup('Box_MonitorItem'):SetObjectIcon(mon.nIconID or MY_TargetMonConfig.DEFAULT_MONITOR_ICON_ID) + hItem:Lookup('Text_MonitorItem'):SetText(mon.szNote) + hItem:Lookup('Image_MonitorItemRBg'):SetVisible(not X.IsEmpty(mon.szContent)) + hItem:Lookup('Text_MonitorItemDisplayName'):SetText(mon.szContent) + hItem:Lookup('Text_MonitorItemDisplayName'):SetFontColor(X.Unpack(mon.aContentColor or {255, 255, 255})) + hItem:SetAlpha(mon.bEnable and 255 or 128) + hItem.mon = mon + hItem.nMonitorIndex = i + hItem.szType = dataset.szType + nCount = nCount + 1 + end + end + for i = hList:GetItemCount() - 1, nCount, -1 do + hList:RemoveItem(i) + end + else + hList:Clear() + end + hList:FormatAllItemPos() +end + +function D.CreateMonitor(frame, nIndex) + local dataset = MY_TargetMonConfig.GetDataset(frame.szActiveDatasetUUID) + if not dataset then + return + end + GetUserInput(dataset.szType == 'BUFF' and _L['Please Input Monitor Buff Id'] or _L['Please Input Monitor Skill Id'], function(szID) + local dwID = tonumber(szID) + if not dwID then + X.Alert(_L['Invalid Input Number']) + return + end + X.DelayCall(function() + GetUserInput(dataset.szType == 'BUFF' and _L['Please Input Monitor Buff Level'] or _L['Please Input Monitor Skill Level'], function(szLevel) + local nLevel = tonumber(szLevel) + if not nLevel then + X.Alert(_L['Invalid Input Number']) + return + end + MY_TargetMonConfig.CreateMonitor(dataset.szUUID, nIndex, dwID, nLevel) + end) + end) + end) +end + +function D.OnFrameCreate() + X.UI.AppendFromIni(this:Lookup('Wnd_Total'), INI_FILE, 'Wnd_Total', true) + this:Lookup('', 'Text_Title'):SetText(_L['MY_TargetMon_PS']) + this:Lookup('Wnd_Total/Btn_CreateDataset', 'Text_CreateDataset'):SetText(_L['Create Config']) + this:Lookup('Wnd_Total/Btn_ImportExportDataset', 'Text_ImportExportDataset'):SetText(_L['Import Export']) + this:Lookup('Wnd_Total/Btn_CreateMonitor', 'Text_CreateMonitor'):SetText(_L['Create Monitor']) + this:Lookup('Wnd_Total/Wnd_SearchMonitor/Edit_SearchMonitor'):SetPlaceholderText(_L['Search Monitor']) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Btn_CreateDataset')) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Btn_ImportExportDataset')) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Btn_CreateMonitor')) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/WndScroll_Dataset/Btn_Dataset_All')) + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/WndScroll_Monitor/Scroll_Monitor')) + this:RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_RELOAD') + this:RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + this:RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY') + this:SetPoint('CENTER', 0, 0, 'CENTER', 0, -100) + D.DrawDatasetList(this) +end + +function D.OnLButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Btn_Close' then + X.UI.CloseFrame(this:GetRoot()) + elseif name == 'Btn_CreateDataset' then + MY_TargetMonConfig.CreateDataset() + elseif name == 'Btn_CreateMonitor' then + D.CreateMonitor(frame, nil) + elseif name == 'Btn_ImportExportDataset' then + local menu = {} + table.insert(menu, { + szOption = _L['Subscribe remote data'], + fnAction = function() + MY_TargetMon_Subscribe.OpenPanel() + X.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Import local data'], + fnAction = function() + local szFile = GetOpenFileName( + _L['Please select data file.'], + 'JX3 File(*.jx3dat)\0*.jx3dat\0All Files(*.*)\0*.*\0\0', + X.GetAbsolutePath(MY_TargetMonConfig.REMOTE_DATA_ROOT) + ) + if not X.IsEmpty(szFile) then + MY_TargetMonConfig.ImportDatasetFile(szFile) + end + X.UI.ClosePopupMenu() + end, + }) + local t1 = { szOption = _L['Export local data'] } + local aExportUUID = {} + for _, dataset in ipairs(MY_TargetMonConfig.GetDatasetList()) do + table.insert(t1, { + szOption = MY_TargetMonConfig.GetDatasetTitle(dataset), + bCheck = true, + fnAction = function(_, bChecked) + for i, v in ipairs(aExportUUID) do + if v == dataset.szUUID then + table.remove(aExportUUID, i) + break + end + end + if bChecked then + table.insert(aExportUUID, dataset.szUUID) + end + end, + }) + end + table.insert(t1, X.CONSTANT.MENU_DIVIDER) + table.insert(t1, { + szOption = _L['Ensure export'], + fnAction = function() + if MY_TargetMonConfig.ExportDatasetFile(aExportUUID) then + X.UI.ClosePopupMenu() + end + end, + }) + table.insert(t1, { + szOption = _L['Ensure export (with indent)'], + fnAction = function() + if MY_TargetMonConfig.ExportDatasetFile(aExportUUID, true) then + X.UI.ClosePopupMenu() + end + end, + }) + table.insert(menu, t1) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + if MY_TargetMonConfig.HasAncientData() then + table.insert(menu, { + szOption = _L['Import ancient data'], + fnAction = function() + X.Confirm(_L['Sure to import ancient dataset? Current data with same uuid will be overwritten.'], function() + MY_TargetMonConfig.ImportAncientData(function(aDataset) + local aName = {} + for _, dataset in ipairs(aDataset) do + table.insert(aName, MY_TargetMonConfig.GetDatasetTitle(dataset)) + end + X.Alert(_L['Ancient datasets import success:'] .. '\n\n' .. table.concat(aName, '\n')) + end) + end) + X.UI.ClosePopupMenu() + end, + }) + end + table.insert(menu, { + szOption = _L['Delete all datasets'], + rgb = {255, 0, 0}, + fnAction = function() + X.Confirm(_L['Sure to delete all datasets? This operation can not be undone.'], function() + MY_TargetMonConfig.DeleteAllDataset() + end) + X.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Open data folder'], + fnAction = function() + local szRoot = X.GetAbsolutePath(MY_TargetMonConfig.REMOTE_DATA_ROOT):gsub('/', '\\') + X.OpenFolder(szRoot) + X.UI.OpenTextEditor(szRoot) + X.UI.ClosePopupMenu() + end, + }) + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.x = nX + menu.y = nY + nH + menu.nMiniWidth = nW + X.UI.PopupMenu(menu) + end +end + +function D.OnEditChanged() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Edit_SearchMonitor' then + frame.szSearchMonitor = X.TrimString(this:GetText()) + D.DrawMonitorList(frame) + end +end + +function D.OnItemMouseIn() + local name = this:GetName() + if name == 'Handle_MonitorItem' then + this:Lookup('Image_MonitorItem'):Hide() + this:Lookup('Box_MonitorItem'):SetObjectMouseOver(true) + if this.szType == 'BUFF' then + local w, h = this:GetW(), this:GetH() + local x, y = this:GetAbsX(), this:GetAbsY() + X.OutputBuffTip({x, y, w, h}, this.mon.dwID, this.mon.nLevel == 0 and 1 or this.mon.nLevel) + elseif this.szType == 'SKILL' then + local w, h = this:GetW(), this:GetH() + local x, y = this:GetAbsX(), this:GetAbsY() + X.OutputSkillTip({x, y, w, h}, this.mon.dwID, this.mon.nLevel) + end + elseif name == 'Image_DatasetItemConfig' then + this:SetFrame(106) + end +end + +function D.OnItemMouseOut() + local name = this:GetName() + if name == 'Handle_MonitorItem' then + this:Lookup('Image_MonitorItem'):Show() + this:Lookup('Box_MonitorItem'):SetObjectMouseOver(false) + X.HideTip() + elseif name == 'Image_DatasetItemConfig' then + this:SetFrame(105) + end +end + +function D.OnItemLButtonUp() + local name = this:GetName() + if name == 'Handle_DatasetItem' + or name == 'Handle_MonitorItem' then + -- DragEnd bug fix + X.DelayCall(50, function() + if not X.UI.IsDragDropOpened() then + return + end + X.UI.CloseDragDrop() + end) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Handle_DatasetItem' then + frame.szActiveDatasetUUID = this.dataset.szUUID + D.UpdateDatasetActiveState(frame) + D.DrawMonitorList(frame) + elseif name == 'Handle_MonitorItem' then + MY_TargetMon_MonitorPanel.Open(frame.szActiveDatasetUUID, this.mon.szUUID) + elseif name == 'Image_DatasetItemConfig' then + MY_TargetMon_ConfigPanel.Open(this:GetParent().dataset.szUUID) + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Image_DatasetItemConfig' then + local dataset = this:GetParent().dataset + local menu = {} + table.insert(menu, { + szOption = _L['Enable'], + bCheck = true, bChecked = dataset.bEnable, + fnAction = function() + dataset.bEnable = not dataset.bEnable + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + X.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Delete'], + rgb = { 255, 0, 0 }, + fnAction = function() + X.Confirm(_L['Sure to delete monitor? This operation can not be undone.'], function() + MY_TargetMonConfig.DeleteDataset(dataset.szUUID) + end) + X.UI.ClosePopupMenu() + end, + }) + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.x = nX + menu.y = nY + nH + menu.nMiniWidth = nW + X.UI.PopupMenu(menu) + elseif name == 'Handle_MonitorItem' then + local dataset = MY_TargetMonConfig.GetDataset(frame.szActiveDatasetUUID) + local mon = this.mon + local nMonitorIndex = this.nMonitorIndex + local menu = {} + table.insert(menu, { + szOption = _L['Insert'], + fnAction = function() + D.CreateMonitor(frame, nMonitorIndex) + MY.UI.ClosePopupMenu() + end, + }) + if this.nMonitorIndex ~= 1 then + table.insert(menu, { + szOption = _L['Move to top'], + fnAction = function() + for i, m in ipairs(dataset.aMonitor) do + if m == mon then + table.remove(dataset.aMonitor, i) + break + end + end + table.insert(dataset.aMonitor, 1, mon) + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + MY.UI.ClosePopupMenu() + end, + }) + end + if this.nMonitorIndex ~= #dataset.aMonitor then + table.insert(menu, { + szOption = _L['Move to bottom'], + fnAction = function() + for i, m in ipairs(dataset.aMonitor) do + if m == mon then + table.remove(dataset.aMonitor, i) + break + end + end + table.insert(dataset.aMonitor, mon) + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + MY.UI.ClosePopupMenu() + end, + }) + end + local nX, nY = Cursor.GetPos() + local nW, nH = 40, 40 + menu.x = nX + menu.y = nY + nH + menu.nMiniWidth = nW + X.UI.PopupMenu(menu) + end +end + +function D.OnItemLButtonDrag() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Handle_DatasetItem' then + if not X.IsEmpty(frame.szSearchMonitor) then + return + end + X.UI.OpenDragDrop(this, this, 'MY_TargetMon_PS#Handle_DatasetItem', this.dataset.szUUID) + elseif name == 'Handle_MonitorItem' then + if not X.IsEmpty(frame.szSearchMonitor) then + return + end + X.UI.OpenDragDrop(this, this, 'MY_TargetMon_PS#Handle_MonitorItem', this.mon.szUUID) + end +end + +function D.OnItemMouseHover() + local name = this:GetName() + if name == 'Handle_DatasetItem' then + if not X.UI.IsDragDropOpened() then + local aView, view = MY_TargetMonData.GetViewData(), nil + local nMonitorCount = 0 + for _, v in ipairs(aView) do + if v.szUUID == this.dataset.szUUID then + view = v + end + nMonitorCount = nMonitorCount + #v.aMonitor + end + local szText = GetFormatText( + view + and _L('Current dataset total monitor count is %d, active monitors count is %d, visible monitors count is %d.', #this.dataset.aMonitor, #view.aMonitor, #view.aItem) + or _L['Current dataset is not active.'], + 162, 255, 255, 255 + ) + if nMonitorCount > MY_TargetMonData.MY_TARGET_MON_DATA_MAX_LIMIT then + szText = szText + .. GetFormatText( + '\n' .. _L('Total monitors reaches max limit: %d/%d.', nMonitorCount, MY_TargetMonData.MY_TARGET_MON_DATA_MAX_LIMIT), + 162, 255, 86, 86 + ) + end + X.OutputTip(this, szText, true, X.UI.TIP_POSITION.TOP_BOTTOM) + return + end + local szDragGroupID = X.UI.GetDragDropData() + if szDragGroupID == 'MY_TargetMon_PS#Handle_DatasetItem' then + X.UI.SetDragDropHoverEl( + this, + { + x = this:GetAbsX(), + y = this:GetAbsY() + 1, + w = this:GetW(), + h = this:GetH() - 2, + }, + true + ) + end + elseif name == 'Handle_MonitorItem' then + if not X.UI.IsDragDropOpened() then + return + end + local szDragGroupID = X.UI.GetDragDropData() + if szDragGroupID == 'MY_TargetMon_PS#Handle_MonitorItem' then + X.UI.SetDragDropHoverEl( + this, + { + x = this:GetAbsX(), + y = this:GetAbsY() + 1, + w = this:GetW(), + h = this:GetH() - 2, + }, + true + ) + end + end +end +D.OnItemMouseEnter = D.OnItemMouseHover + +function D.OnItemLButtonDragEnd() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Handle_DatasetItem' then + if not X.UI.IsDragDropOpened() then + return + end + local dropEl, szDragGroupID, xData = X.UI.CloseDragDrop() + if szDragGroupID ~= 'MY_TargetMon_PS#Handle_DatasetItem' + or not dropEl or dropEl:GetName() ~= 'Handle_DatasetItem' or dropEl:GetRoot() ~= frame then + return + end + local szDragUUID = xData + local szDropUUID = dropEl.dataset.szUUID + if szDragUUID == szDropUUID then + return + end + local aDataset = MY_TargetMonConfig.GetDatasetList() + local nPosition, dragDataset = 0, nil + for _, dataset in ipairs(aDataset) do + if dataset.szUUID == szDragUUID then + nPosition = 1 + break + elseif dataset.szUUID == szDropUUID then + break + end + end + for i, dataset in ipairs(aDataset) do + if dataset.szUUID == szDragUUID then + dragDataset = table.remove(aDataset, i) + break + end + end + for i, dataset in ipairs(aDataset) do + if dataset.szUUID == szDropUUID then + table.insert(aDataset, i + nPosition, dragDataset) + break + end + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY') + elseif name == 'Handle_MonitorItem' then + if not X.UI.IsDragDropOpened() then + return + end + local dropEl, szDragGroupID, xData = X.UI.CloseDragDrop() + if szDragGroupID ~= 'MY_TargetMon_PS#Handle_MonitorItem' + or not dropEl or dropEl:GetName() ~= 'Handle_MonitorItem' or dropEl:GetRoot() ~= frame then + return + end + local szDragUUID = xData + local szDropUUID = dropEl.mon.szUUID + if szDragUUID == szDropUUID then + return + end + local dataset = MY_TargetMonConfig.GetDataset(frame.szActiveDatasetUUID) + local nPosition, dragDataset = 0, nil + for _, mon in ipairs(dataset.aMonitor) do + if mon.szUUID == szDragUUID then + nPosition = 1 + break + elseif mon.szUUID == szDropUUID then + break + end + end + for i, mon in ipairs(dataset.aMonitor) do + if mon.szUUID == szDragUUID then + dragDataset = table.remove(dataset.aMonitor, i) + break + end + end + for i, mon in ipairs(dataset.aMonitor) do + if mon.szUUID == szDropUUID then + table.insert(dataset.aMonitor, i + nPosition, dragDataset) + break + end + end + FireUIEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', dataset.szUUID) + end +end + +function D.OnEvent(event) + if event == 'MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY' or event == 'MY_TARGET_MON_CONFIG__DATASET_RELOAD' then + local frame = this + X.DelayCall('MY_TargetMon_PS_DrawConfigList', 100, function() + D.DrawDatasetList(frame) + end) + elseif event == 'MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY' then + local frame = this + X.DelayCall('MY_TargetMon_PS_DrawConfigList', 300, function() + D.DrawMonitorList(frame) + end) + end +end + +X.RegisterHotKey('MY_TargetMon_PS', _L['Open/close MY_TargetMon'], D.TogglePanel) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_PS', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + OpenPanel = D.OpenPanel, + ClosePanel = D.ClosePanel, + }, + }, + }, +} +MY_TargetMon_PS = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_Subscribe.lua b/MY_TargetMon/src/MY_TargetMon_Subscribe.lua new file mode 100644 index 000000000..38915784d --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_Subscribe.lua @@ -0,0 +1,118 @@ +-------------------------------------------------------------------------------- +-- v is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控订阅界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_Subscribe' +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} + +function D.OpenPanel(szModule) + local ui = X.UI.CreateFrame('MY_TargetMon_Subscribe', { + w = 1000, h = 700, + close = true, + text = X.PACKET_INFO.NAME .. _L.SPLIT_DOT .. _L['MY_TargetMon_Subscribe'], + anchor = { s = 'CENTER', r = 'CENTER', x = 0, y = -100 }, + }) + ui:Append('WndPageSet', { + name = 'PageSet_All', + x = 0, y = 48, w = 1000, h = 700 - 48, + }) + ui:Append('WndButton', { + name = 'Btn_Option', + x = 960, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + menu = function() + return { + { + szOption = _L['Manage my online data'], + fnAction = function() + X.OpenBrowser('https://j3cx.com/target-monitor/mine') + X.UI.ClosePopupMenu() + end, + }, + } + end, + }) + local frame = ui:Raw() + frame:BringToTop() + D.PageSetModule.DrawUI(frame) + D.PageSetModule.ActivePage(frame, szModule or 1, true) +end + +function D.ClosePanel() + X.UI.CloseFrame('MY_TargetMon_Subscribe') +end + +function D.IsPanelOpened() + return Station.Lookup('Normal/MY_TargetMon_Subscribe') +end + +function D.TogglePanel() + if D.IsPanelOpened() then + D.ClosePanel() + else + D.OpenPanel() + end +end + +-- 注册子模块 +function D.RegisterModule(szKey, szName, tModule) + if not D.PageSetModule or not szName or not tModule then + return + end + if tModule.szFloatEntry then + table.insert(D.aFloatEntry, { szName = szName, szKey = tModule.szFloatEntry }) + end + if tModule.szSaveDB then + table.insert(D.aSaveDB, { szName = szName, szKey = tModule.szSaveDB }) + end + D.PageSetModule.RegisterModule(szKey, szName, tModule) + if D.IsPanelOpened() then + D.ClosePanel() + D.OpenPanel() + end +end + +D.PageSetModule = X.UI.CreatePageSetModule(D, 'Wnd_Total/PageSet_All') + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_Subscribe', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenPanel', + 'ClosePanel', + 'TogglePanel', + 'IsPanelOpened', + 'RegisterModule', + }, + root = D, + }, + }, +} +MY_TargetMon_Subscribe = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_Subscribe_Data.lua b/MY_TargetMon/src/MY_TargetMon_Subscribe_Data.lua new file mode 100644 index 000000000..18267317e --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_Subscribe_Data.lua @@ -0,0 +1,957 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_Subscribe_Data' +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TargetMon/ui/MY_TargetMon_Subscribe_Data.ini' +local D = {} + +local REMOTE_DATA_ROOT = MY_TargetMonConfig.REMOTE_DATA_ROOT + +local DATA_PAGINATION = { + nIndex = 1, + nSize = 30, + nTotal = 1, + nPageTotal = 1, +} +local DATA_LIST = {} +local DATA_SELECTED_KEY +local DATA_DOWNLOADING = {} + +local META_LUA_SCHEMA = X.Schema.Record({ + szURL = X.Schema.Optional(X.Schema.String), + szAboutURL = X.Schema.Optional(X.Schema.String), + szAuthor = X.Schema.String, + szDataURL = X.Schema.String, + szKey = X.Schema.Optional(X.Schema.String), + szTitle = X.Schema.String, + szUpdateTime = X.Schema.Optional(X.Schema.String), + szVersion = X.Schema.String, +}, true) +local META_JSON_SCHEMA = X.Schema.Record({ + about = X.Schema.Optional(X.Schema.String), + author = X.Schema.String, + data_url = X.Schema.String, + key = X.Schema.Optional(X.Schema.String), + name = X.Schema.String, + update = X.Schema.Optional(X.Schema.String), + version = X.Schema.String, +}, true) +local META_LIST_JSON_SCHEMA = X.Schema.Record({ + data = X.Schema.Collection(META_JSON_SCHEMA), + page = X.Schema.Record({ + index = X.Schema.Number, + size = X.Schema.Number, + total = X.Schema.Number, + }, true), +}, true) +local FEEDS_LIST_JSON_SCHEMA = X.Schema.Collection(META_JSON_SCHEMA) + +-- 陆服环境下,以下缩写均对等 +-- tinymins +-- tinymins?master +-- tinymins/JX3_MY_DATA +-- tinymins/JX3_MY_DATA?master +-- tinymins@github +-- tinymins@github?master +-- tinymins@github:/MY_TargetMon/zhcn/meta.json +-- tinymins@github/JX3_MY_DATA +-- tinymins@github/JX3_MY_DATA:/MY_TargetMon/zhcn/meta.json +-- tinymins@github/JX3_MY_DATA?master:/MY_TargetMon/zhcn/meta.json +do +local PROVIDER_PARAMS = { + github = { + szRawURL = 'https://cdn.jsdelivr.net/gh/%s/%s@%s/%s', + szRawURL_T = { + '^https://cdn.jsdelivr.net/gh/([^/]+)/([^/]+)@([^/]+)/(.+)$', + '^https://raw%.githubusercontent%.com/([^/]+)/([^/]+)/([^/]+)/(.+)$', + }, + szBlobURL = 'https://github.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://github%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + aliyun = { + szRawURL = 'https://code.aliyun.com/%s/%s/raw/%s/%s', + szRawURL_T = '^https://code%.aliyun%.com/([^/]+)/([^/]+)/raw/([^/]+)/(.+)$', + szBlobURL = 'https://code.aliyun.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://code%.aliyun%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + gitee = { + szRawURL = 'https://gitee.com/%s/%s/raw/%s/%s', + szRawURL_T = '^https://gitee%.com/([^/]+)/([^/]+)/raw/([^/]+)/(.+)$', + szBlobURL = 'https://gitee.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://gitee%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + jx3box = { + bSimple = true, + szRawURL = MY_RSS.PULL_BASE_URL .. '/api/addon/target-monitor/subscribe/feed?key=%s', + szRawURL_T = { + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/target-monitor/subscribe/feed%?.*&key%=([^&]+)&.*$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/target-monitor/subscribe/feed%?key%=([^&]+)&.*$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/target-monitor/subscribe/feed%?.*&key%=([^&]+)$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/target-monitor/subscribe/feed%?key%=([^&]+)$', + }, + }, +} +local DEFAULT_PROVIDER = 'jx3box' +local DEFAULT_PROJECT = 'JX3_MY_DATA' +local DEFAULT_BRANCH = 'master' +local DEFAULT_PATH = 'MY_TargetMon/' .. X.ENVIRONMENT.GAME_EDITION .. '/meta.json' +local function GetURL(szURL, szType) + local szSimple, szUser, szProvider, szProject, szBranch, szPath, nPos + if X.StringFindW(szURL, '://') then + for k, p in pairs(PROVIDER_PARAMS) do + if p.bSimple then + if X.IsTable(p.szRawURL_T) then + for _, s in ipairs(p.szRawURL_T) do + szSimple = szURL:match(s) + if szSimple then + break + end + end + elseif X.IsString(p.szRawURL_T) then + szSimple = szURL:match(p.szRawURL_T) + end + if szSimple then + szProvider = k + break + end + else + if X.IsTable(p.szRawURL_T) then + for _, s in ipairs(p.szRawURL_T) do + szUser, szProject, szBranch, szPath = szURL:match(s) + if szUser then + break + end + end + elseif X.IsString(p.szRawURL_T) then + szUser, szProject, szBranch, szPath = szURL:match(p.szRawURL_T) + end + if not szUser and p.szBlobURL_T then + szUser, szProject, szBranch, szPath = szURL:match(p.szBlobURL_T) + end + if szUser then + szProvider = k + break + end + end + end + else + szUser, szSimple = szURL, '' + nPos = X.StringFindW(szUser, ':') + if nPos then + szPath = szUser:sub(nPos + 1):gsub('^/+', '') + szUser = szUser:sub(1, nPos - 1) + szSimple = ':' .. szPath .. szSimple + else + szPath = DEFAULT_PATH + end + nPos = X.StringFindW(szUser, '?') + if nPos then + szBranch = szUser:sub(nPos + 1) + szUser = szUser:sub(1, nPos - 1) + szSimple = '?' .. szBranch .. szSimple + else + szBranch = DEFAULT_BRANCH + end + nPos = X.StringFindW(szUser, '/') + if nPos then + szProject = szUser:sub(nPos + 1) + szUser = szUser:sub(1, nPos - 1) + szSimple = '/' .. szProject .. szSimple + else + szProject = DEFAULT_PROJECT + end + nPos = X.StringFindW(szUser, '@') + if nPos then + szProvider = szUser:sub(nPos + 1) + if PROVIDER_PARAMS[szProvider] then + szUser = szUser:sub(1, nPos - 1) + else + szProvider = DEFAULT_PROVIDER + end + else + szProvider = DEFAULT_PROVIDER + end + szSimple = szUser .. szSimple + szSimple = X.EncodeURIComponent(AnsiToUTF8(szSimple)) + szUser = X.EncodeURIComponent(AnsiToUTF8(szUser)) + szProject = X.EncodeURIComponent(AnsiToUTF8(szProject)) + szBranch = X.EncodeURIComponent(AnsiToUTF8(szBranch)) + end + local provider = szProvider and PROVIDER_PARAMS[szProvider] + if not provider then + return + end + if szType == 'RAW' then + if provider.bSimple then + return provider.szRawURL:format(szSimple) + end + return provider.szRawURL:format(szUser, szProject, szBranch, szPath) + end + if szType == 'BLOB' then + if not provider.szBlobURL then + return + end + return provider.szBlobURL:format(szUser, szProject, szBranch, szPath) + end + if szType == 'SHORT' then + szSimple = UTF8ToAnsi(X.DecodeURIComponent(szSimple)) + szUser = UTF8ToAnsi(X.DecodeURIComponent(szUser)) + szProject = UTF8ToAnsi(X.DecodeURIComponent(szProject)) + szBranch = UTF8ToAnsi(X.DecodeURIComponent(szBranch)) + if provider.bSimple then + if szProvider ~= DEFAULT_PROVIDER then + szSimple = szSimple .. '@' .. szProvider + end + return szSimple + end + if szProvider ~= DEFAULT_PROVIDER then + szUser = szUser .. '@' .. szProvider + end + if szProject ~= DEFAULT_PROJECT then + szUser = szUser .. '/' .. szProject + end + if szBranch ~= DEFAULT_BRANCH then + szUser = szUser .. '?' .. szBranch + end + if szPath ~= DEFAULT_PATH then + szUser = szUser .. ':' .. szPath + end + return szUser + end +end +-- 将地址转化为 GIT 仓库浏览地址 +function D.GetRawURL(szURL) + return GetURL(szURL, 'RAW') +end +-- 将地址转化为 GIT 仓库源文件下载地址 +function D.GetBlobURL(szURL) + return GetURL(szURL, 'BLOB') +end +-- 将地址转化为短链接 +function D.GetShortURL(szURL) + return GetURL(szURL, 'SHORT') +end +-- 根据描述文件中的相对文件地址 计算绝对 GIT 仓库浏览地址 +function D.GetAttachRawURL(szAttach, szURL) + if not szAttach then + return + end + if X.IsURL(szAttach) then + return szAttach + end + local szURL = D.GetRawURL(szURL) + if not szURL then + return + end + return X.NormalizeURI(X.ConcatURI(X.GetParentURI(szURL), szAttach)) +end +-- 根据描述文件中的相对文件地址 计算绝对 GIT 仓库源文件下载地址 +function D.GetAttachBlobURL(szAttach, szURL) + if not szAttach then + return + end + if X.IsURL(szAttach) then + return szAttach + end + local szURL = D.GetBlobURL(szURL) + if not szURL then + return + end + return X.NormalizeURI(X.ConcatURI(X.GetParentURI(szURL), szAttach)) +end +end + +-- 格式化描述内容 +-- 进入该函数的数据必须为安全数据,即已经过 Schema 检测的数据。 +function D.FormatMetaInfo(res) + local szURL = res.szURL or res.url + local info = { + szURL = szURL, + szDataURL = D.GetAttachRawURL(res.szDataURL or res.data_url or './data.jx3dat', szURL), + szKey = res.szKey or res.key or D.GetShortURL(szURL) or ('H' .. GetStringCRC(szURL)), + szAuthor = res.szAuthor or res.author or '', + szTitle = res.szTitle or res.name or '', + szUpdateTime = res.szUpdateTime or res.update or '', + szVersion = res.szVersion or res.version or '', + } + if X.IsEmpty(info.szURL) or X.IsEmpty(info.szTitle) or X.IsEmpty(info.szVersion) then + return + end + return info +end + +function D.IsDownloading(szKey) + return DATA_DOWNLOADING[szKey] +end + +function D.IsSubscripted(info) + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + local tInfo = tSubscribed[D.GetShortURL(info.szURL) or info.szURL] + if tInfo then + return true, info.szVersion == tInfo.szVersion + end + return false, false +end + +-- 获取在线订阅列表 +function D.FetchSubscribeList(nPage) + return X.Promise:new(function(resolve, reject) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/target-monitor/subscribe/all', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + page = nPage, + pageSize = 15, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local errs = X.Schema.CheckSchema(res, META_LIST_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, i .. '. ' .. err.message) + end + local szErrmsg = _L['Fetch repo meta list failed.'] .. '\n' .. table.concat(aErrmsg, '\n') + X.OutputDebugMessage(_L['MY_TargetMon_Subscribe_Data'], szErrmsg, X.DEBUG_LEVEL.WARNING) + reject(X.Error:new(szErrmsg)) + return + end + local tPagination = { + nIndex = res.page.index, + nSize = res.page.size, + nTotal = res.page.total, + nPageTotal = math.ceil(res.page.total / res.page.size), + } + local aMetaInfo = {} + for _, info in ipairs(res.data) do + info.url = MY_RSS.PULL_BASE_URL .. '/api/addon/target-monitor/subscribe/feed?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + key = info.key, + })) + info = D.FormatMetaInfo(info) + if info then + info.bEmbedded = true + table.insert(aMetaInfo, info) + end + end + resolve({ tPagination = tPagination, aMetaInfo = aMetaInfo }) + end, + }) + end) +end + +-- 根据订阅文件地址,获取订阅文件内容 +function D.FetchSubscribeItem(szURL) + return X.Promise:new(function(resolve, reject) + local szURL = D.GetRawURL(szURL) or szURL + X.Ajax({ + url = szURL, + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if not res then + reject(X.Error:new(_L['ERR: Decode info content as json failed!'])) + return + end + local errs = X.Schema.CheckSchema(res, META_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, ' ' .. i .. '. ' .. err.message) + end + reject(X.Error:new(_L['ERR: Info content is illegal!'] .. '\n\n' .. table.concat(aErrmsg, '\n'))) + return + end + res.url = szURL + local info = D.FormatMetaInfo(res) + if not info then + reject(X.Error:new(_L['ERR: Info content is illegal!'])) + return + end + resolve(info) + end, + error = function(html, status) + if status == 404 then + reject(X.Error:new(_L['ERR404: MetaInfo address not found!'])) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_TargetMon_Subscribe_Data'], 'ERROR Get MetaInfo: ' .. X.EncodeLUAData(status) .. '\n' .. (X.ConvertToANSI(html) or ''), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + reject(X.Error:new(_L['ERR: Get MetaInfo failed!'])) + end, + }) + end) +end + +function D.Subscribe(info, bSilent) + local szUUID = 'r-' + .. ('%08x'):format(GetStringCRC(info.szDataURL)) + .. ('%08x'):format(GetStringCRC(info.szVersion)) + local LUA_CONFIG = { passphrase = X.KE(X.SECRET['FILE::TARGET_MON_DATA_PW'] .. 'MY'), crc = true, compress = true } + local szMetaFilePath = REMOTE_DATA_ROOT .. szUUID .. '.meta.jx3dat' + local szDataFilePath = REMOTE_DATA_ROOT .. szUUID .. '.jx3dat' + local aUUID = nil + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + local szURL = D.GetShortURL(info.szURL) or info.szURL + local tLastInfo = tSubscribed[szURL] + if tLastInfo then + aUUID = {} + for _, szUUID in ipairs(tLastInfo.aUUID) do + if not tLastInfo.tUUIDModified[szUUID] then + table.insert(aUUID, szUUID) + end + end + end + return X.Promise:new(function(resolve, reject) + X.Promise:new(function(resolve, reject) + local p = X.LoadLUAData(szMetaFilePath, LUA_CONFIG) + if p and p.szVersion == info.szVersion and IsLocalFileExist(szDataFilePath) then + resolve() + return + end + if DATA_DOWNLOADING[info.szKey] then + reject(X.Error:new(_L['Downloading in progress, please wait...'])) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TargetMon_Subscribe_Data', + 'Start download file. info: ' .. X.EncodeLUAData(info) + .. ' uuids: ' .. X.EncodeLUAData(aUUID), + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + DATA_DOWNLOADING[info.szKey] = true + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + X.FetchLUAData(info.szDataURL, LUA_CONFIG) + :Then(function(data) + DATA_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + if data then + X.SaveLUAData(szMetaFilePath, info, LUA_CONFIG) + X.SaveLUAData(szDataFilePath, data, LUA_CONFIG) + resolve() + else + reject(X.Error:new(_L('Decode %s failed!', info.szTitle))) + end + end) + :Catch(function(error) + DATA_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + reject(error) + end) + end) + :Then(function() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TargetMon_Subscribe_Data', + 'Load configure file ' .. szDataFilePath + .. ' info: ' .. X.EncodeLUAData(info) + .. ' uuids: ' .. X.EncodeLUAData(aUUID), + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + MY_TargetMonConfig.ImportDatasetFile(szDataFilePath, { + aUUID = aUUID, + bConfirmed = bSilent, + fnCallback = function(aDataset) + local me = X.GetClientPlayer() + if not bSilent and me.IsInParty() then + MY_TargetMonConfig.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TargetMon_Subscribe_Data', {'LOAD', info.szTitle}, true) + end + local aUUID, tUUID = {}, {} + for _, dataset in ipairs(aDataset) do + tUUID[dataset.szUUID] = true + table.insert(aUUID, dataset.szUUID) + end + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + local szURL = D.GetShortURL(info.szURL) or info.szURL + local tInfo = tSubscribed[szURL] + if tInfo then + for _, szUUID in ipairs(tInfo.aUUID) do + if not tUUID[szUUID] and not tInfo.tUUIDModified[szUUID] then + MY_TargetMonConfig.DeleteDataset(szUUID) + end + end + end + tSubscribed[szURL] = { + szKey = info.szKey, + szVersion = info.szVersion, + aUUID = aUUID, + tUUIDModified = {}, + } + MY_TargetMonConfig.SetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed', tSubscribed) + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + end, + }) + end) + :Catch(function(error) + if not bSilent then + X.OutputAnnounceMessage(error.message) + end + reject(error) + end) + end) +end + +function D.Unsubscribe(info) + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + local szURL = D.GetShortURL(info.szURL) or info.szURL + local tInfo = tSubscribed[szURL] + if tInfo then + for _, szUUID in ipairs(tInfo.aUUID) do + if not tInfo.tUUIDModified[szUUID] then + MY_TargetMonConfig.DeleteDataset(szUUID) + end + end + end + tSubscribed[szURL] = nil + MY_TargetMonConfig.SetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed', tSubscribed) + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') +end + +function D.SyncTeam(info) + local function CheckSharePerms() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + elseif not X.IsClientPlayerInParty() then + X.Alert(_L['You are not in the team.']) + elseif not X.IsClientPlayerTeamLeader() and not X.IsDebugging() then + X.Alert(_L['You are not team leader.']) + elseif not info then + MY.OutputAnnounceMessage(_L['Please select one dataset first!']) + else + return true + end + return false + end + if CheckSharePerms() then + X.Confirm(_L['Confirm?'], function() + if CheckSharePerms() then + MY_TargetMonConfig.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TargetMon_Subscribe_Data', {'SYNC', info}) + end + end) + end +end + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(DATA_LIST) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Author'):SetText(X.ReplaceSensitiveWord(info.szAuthor)) + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted, bIsLatest = D.IsSubscripted(info) + if D.IsSubscripted(info) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Unsubscribe', + x = 765, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = _L['Unsubscribe'], + onClick = function() D.Unsubscribe(info) end, + }) + end + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (DATA_DOWNLOADING[info.szKey] and _L['Downloading...']) + or (bIsSubscripted and ( + bIsLatest + and _L['Subscribed'] + or _L['Can update'])) + or _L['Subscribe'], + enable = not DATA_DOWNLOADING[info.szKey], + onClick = function() D.Subscribe(info) end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() + -- 推荐页码 + page:Lookup('Wnd_Total/Btn_PrevPage'):Enable(DATA_PAGINATION.nIndex > 1) + page:Lookup('Wnd_Total/Btn_NextPage'):Enable(DATA_PAGINATION.nIndex < DATA_PAGINATION.nTotal) + page:Lookup('Wnd_Total', 'Text_Page'):SetText(DATA_PAGINATION.nIndex .. ' / ' .. DATA_PAGINATION.nPageTotal) +end + +function D.SwitchPage(nPage) + D.FetchSubscribeList(nPage) + :Then(function(res) + DATA_LIST = res.aMetaInfo + DATA_PAGINATION = res.tPagination + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_DATA__LIST_UPDATE') + end) +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TargetMon_Subscribe_Data') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break1'):SetText(_L['Author']) + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_SyncTeam', 'Text_SyncTeam'):SetText(_L['Sync team']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Refresh list']) + wnd:Lookup('Btn_PrevPage', 'Text_PrevPage'):SetText(_L['Prev page']) + wnd:Lookup('Btn_NextPage', 'Text_NextPage'):SetText(_L['Next page']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_DATA__LIST_UPDATE') + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + + D.UpdateList(this) + D.SwitchPage(1) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TARGET_MON__SUBSCRIBE_DATA__LIST_UPDATE' + or event == 'MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE' + or event == 'MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_SyncTeam' then + local info + for _, v in ipairs(DATA_LIST) do + if v.szKey == DATA_SELECTED_KEY then + info = v + break + end + end + D.SyncTeam(info) + elseif name == 'Btn_CheckUpdate' then + D.SwitchPage(DATA_PAGINATION.nIndex) + elseif name == 'Btn_PrevPage' then + D.SwitchPage(DATA_PAGINATION.nIndex - 1) + elseif name == 'Btn_NextPage' then + D.SwitchPage(DATA_PAGINATION.nIndex + 1) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local t = {{ + szOption = _L['Copy meta url'], + fnAction = function() + X.UI.OpenTextEditor(wnd.info.szURL) + end, + }} + local szShortURL = D.GetShortURL(wnd.info.szURL) + if szShortURL then + table.insert(t, { + szOption = _L['Copy short meta url'], + fnAction = function() + X.UI.OpenTextEditor(szShortURL) + end, + }) + end + table.insert(t, { + szOption = _L['Sync team'], + fnAction = function() + D.SyncTeam(wnd.info) + end, + }) + table.insert(t, { + szOption = _L['Add favorite'], + fnAction = function() + MY_TargetMon_Subscribe_FavoriteData.Add(wnd.info) + X.OutputSystemAnnounceMessage(_L['Add favorite success, you can switch to favorite page to see.']) + end, + }) + PopupMenu(t) + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = '' + if not X.IsEmpty(wnd.info.szURL) then + szTip = szTip .. _L('MetaInfo URL: %s', wnd.info.szURL) + end + local szShortURL = D.GetShortURL(wnd.info.szURL) + if not X.IsEmpty(szShortURL) then + szTip = szTip .. _L('(Short URL: %s)', szShortURL) + end + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_Subscribe_Data', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TargetMon_Subscribe.RegisterModule('SubscribeData', _L['Subscribe list'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_Subscribe_Data', + exports = { + { + root = D, + fields = { + 'GetRawURL', + 'GetBlobURL', + 'GetShortURL', + 'GetAttachRawURL', + 'GetAttachBlobURL', + 'IsDownloading', + 'IsSubscripted', + 'Subscribe', + 'Unsubscribe', + 'FetchSubscribeItem', + 'SyncTeam', + }, + preset = 'UIEvent', + }, + }, +} +MY_TargetMon_Subscribe_Data = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterBgMsg('MY_TargetMon_Subscribe_Data', function(_, data, _, _, szTalker, _) + local action = data[1] + if action == 'SYNC' then + local errs = X.Schema.CheckSchema(data[2], META_LUA_SCHEMA) + if errs then + return + end + local info = D.FormatMetaInfo(data[2]) + if info then + X.Confirm( + _L('%s request download:', szTalker) + .. '\n' .. _L('Title: %s', info.szTitle) + .. '\n' .. _L('Author: %s', info.szAuthor) + .. (X.IsEmpty(info.szURL) + and '' + or '\n' .. _L('MetaInfo URL: %s', info.szURL)) + .. (X.IsEmpty(info.szUpdateTime) + and '' + or '\n' .. _L('Update time: %s', info.szUpdateTime)), + function() + -- D.AddFavMetaInfo(info) TODO + D.Subscribe(info) + end) + end + elseif action == 'LOAD' then + X.OutputSystemMessage(_L('%s loaded %s', szTalker, data[2])) + end +end) + +X.RegisterInit('MY_TargetMon_Subscribe_Data', function() + if X.IsDebugServer() then + return + end + -- 订阅数据自动更新 + X.DelayCall(8000, function() + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + local aKey = {} + for _, tInfo in pairs(tSubscribed) do + table.insert(aKey, tInfo.szKey) + end + if X.IsEmpty(aKey) then + return + end + local function ParseVersion(szVersion) + if X.IsString(szVersion) then + local nPos = X.StringFindW(szVersion, '.') + if nPos then + local szMajorVersion = szVersion:sub(1, nPos) + local szMinorVersion = szVersion:sub(nPos + 1) + return szMajorVersion, szMinorVersion + end + return szVersion, '' + end + return '', '' + end + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/target-monitor/subscribe/feeds?', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + key = table.concat(aKey, '|'), + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local errs = X.Schema.CheckSchema(res, FEEDS_LIST_JSON_SCHEMA) + if errs then + return + end + local aUpdateInfo = {} + for _, info in ipairs(res) do + info.url = MY_RSS.PULL_BASE_URL .. '/api/addon/target-monitor/subscribe/feed?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + key = info.key, + })) + local tInfo = D.FormatMetaInfo(info) + if tInfo then + local tLastInfo = tSubscribed[D.GetShortURL(tInfo.szURL) or tInfo.szURL] + local szPrimaryVersion = ParseVersion(tInfo.szVersion) + local szLastPrimaryVersion = ParseVersion(tLastInfo.szVersion) + if szPrimaryVersion ~= szLastPrimaryVersion then + tInfo.bEmbedded = true + table.insert(aUpdateInfo, tInfo) + end + end + end + --[[#DEBUG BEGIN]] + local nTime = GetTime() + local aUpdateLog = {} + for _, tInfo in ipairs(aUpdateInfo) do + local tLastInfo = tSubscribed[D.GetShortURL(tInfo.szURL) or tInfo.szURL] + table.insert(aUpdateLog, tInfo.szKey .. '(' .. tLastInfo.szVersion .. '->' .. tInfo.szVersion .. ')') + end + X.OutputDebugMessage( + 'MY_TargetMon_Subscribe_Data', + 'Auto update confirmed: ' .. table.concat(aUpdateLog, '; '), + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + for _, tInfo in ipairs(aUpdateInfo) do + D.Subscribe(tInfo, true) + :Then(function() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TargetMon_Subscribe_Data', + 'Auto update [' .. tInfo.szKey .. '] complete, cost time ' .. (GetTime() - nTime) .. 'ms', + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.OutputSystemMessage(_L('Upgrade TargetMon data to latest: %s', tInfo.szTitle)) + end) + end + end, + }) + end) +end) + +do +local function OnDatasetChange(szModifiedUUID) + local tSubscribed = MY_TargetMonConfig.GetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed') or {} + for _, tInfo in pairs(tSubscribed) do + for _, szUUID in ipairs(tInfo.aUUID) do + if szUUID == szModifiedUUID then + tInfo.tUUIDModified[szUUID] = true + end + end + end + MY_TargetMonConfig.SetUserConfig('MY_TargetMon_Subscribe_Data.Subscribed', tSubscribed) +end +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_CONFIG_MODIFY', 'MY_TargetMon_Subscribe_Data', function() + if arg1 == 'tMap' then + OnDatasetChange(arg0) + end +end) +X.RegisterEvent('MY_TARGET_MON_CONFIG__DATASET_MONITOR_MODIFY', 'MY_TargetMon_Subscribe_Data', function() + OnDatasetChange(arg0) +end) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/src/MY_TargetMon_Subscribe_FavoriteData.lua b/MY_TargetMon/src/MY_TargetMon_Subscribe_FavoriteData.lua new file mode 100644 index 000000000..f4d834f7b --- /dev/null +++ b/MY_TargetMon/src/MY_TargetMon_Subscribe_FavoriteData.lua @@ -0,0 +1,398 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 目标监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TargetMon/MY_TargetMon_Subscribe_FavoriteData' +local PLUGIN_NAME = 'MY_TargetMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TargetMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + GetRawURL = MY_TargetMon_Subscribe_Data.GetRawURL , + GetBlobURL = MY_TargetMon_Subscribe_Data.GetBlobURL , + GetShortURL = MY_TargetMon_Subscribe_Data.GetShortURL , + GetAttachRawURL = MY_TargetMon_Subscribe_Data.GetAttachRawURL , + GetAttachBlobURL = MY_TargetMon_Subscribe_Data.GetAttachBlobURL , + IsDownloading = MY_TargetMon_Subscribe_Data.IsDownloading , + IsSubscripted = MY_TargetMon_Subscribe_Data.IsSubscripted , + Subscribe = MY_TargetMon_Subscribe_Data.Subscribe , + Unsubscribe = MY_TargetMon_Subscribe_Data.Unsubscribe , + FetchSubscribeItem = MY_TargetMon_Subscribe_Data.FetchSubscribeItem, + SyncTeam = MY_TargetMon_Subscribe_Data.SyncTeam , +} + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TargetMon/ui/MY_TargetMon_Subscribe_FavoriteData.ini' +local DATA_SELECTED_KEY +local META_DOWNLOADING = {} + +function D.Load() + return X.LoadLUAData({'userdata/target_mon/metalist.jx3dat', X.PATH_TYPE.GLOBAL}) or {} +end + +function D.Save(aMetaInfo) + X.SaveLUAData({'userdata/target_mon/metalist.jx3dat', X.PATH_TYPE.GLOBAL}, aMetaInfo) + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE') +end + +function D.Add(info, szReplaceKey) + local aMetaInfo = D.Load() + local nIndex + if szReplaceKey then + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == szReplaceKey then + table.remove(aMetaInfo, i) + nIndex = i + end + end + end + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == info.szKey then + table.remove(aMetaInfo, i) + nIndex = i + end + end + if nIndex then + table.insert(aMetaInfo, nIndex, info) + else + table.insert(aMetaInfo, info) + end + D.Save(aMetaInfo) +end + +function D.Remove(info) + -- if info.bEmbedded then + -- X.OutputAnnounceMessage(_L['Embedded dataset cannot be removed!']) + -- return + -- end + X.Confirm(_L['Confirm?'], function() + local aMetaInfo = D.Load() + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == info.szKey then + table.remove(aMetaInfo, i) + end + end + if DATA_SELECTED_KEY == info.szKey then + DATA_SELECTED_KEY = nil + end + D.Save(aMetaInfo) + end) +end + +function D.Fetch() + for _, info in ipairs(D.Load()) do + META_DOWNLOADING[info.szKey] = true + D.FetchSubscribeItem(info.szURL) + :Then(function(res) + D.Add(res, info.szKey) + META_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + end) + :Catch(function(err) + X.OutputDebugMessage( + _L['MY_TargetMon_Subscribe_FavoriteData'], + err.message ..'\n' .. info.szURL, + X.DEBUG_LEVEL.WARNING) + META_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + end) + end + FireUIEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') +end + +function D.GetSelectedInfo() + if not DATA_SELECTED_KEY then + return + end + for _, info in ipairs(D.Load()) do + if info.szKey == DATA_SELECTED_KEY then + return info + end + end +end + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(D.Load()) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Author'):SetText(X.ReplaceSensitiveWord(info.szAuthor)) + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted, bIsLatest = D.IsSubscripted(info) + if D.IsSubscripted(info) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Unsubscribe', + x = 765, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = _L['Unsubscribe'], + onClick = function() D.Unsubscribe(info) end, + }) + end + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (META_DOWNLOADING[info.szKey] and _L['Fetching...']) + or (D.IsDownloading(info.szKey) and _L['Downloading...']) + or (bIsSubscripted and ( + bIsLatest + and _L['Subscribed'] + or _L['Can update'])) + or _L['Subscribe'], + enable = not META_DOWNLOADING[info.szKey] and not D.IsDownloading(info.szKey), + onClick = function() D.Subscribe(info) end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TargetMon_Subscribe_FavoriteData') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break1'):SetText(_L['Author']) + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_SyncTeam', 'Text_SyncTeam'):SetText(_L['Sync team']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Check update']) + wnd:Lookup('Btn_AddUrl', 'Text_AddUrl'):SetText(_L['Add url']) + wnd:Lookup('Btn_RemoveUrl', 'Text_RemoveUrl'):SetText(_L['Remove url']) + wnd:Lookup('Btn_ExportUrl', 'Text_ExportUrl'):SetText(_L['Export meta url']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE') + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + + D.UpdateList(this) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE' + or event == 'MY_TARGET_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE' + or event == 'MY_TARGET_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE' + or event == 'MY_TARGET_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Btn_AddUrl' then + GetUserInput(_L['Please input meta address:'], function(szText) + local aURL = X.SplitString(szText, ';') + local nPending = 0 + local aErrmsg = {} + local function ProcessQueue() + nPending = nPending + 1 + local szURL = aURL[nPending] + if not szURL then + if #aErrmsg > 0 then + X.Alert(table.concat(aErrmsg, '\n')) + end + return + end + D.FetchSubscribeItem(szURL) + :Then(function(info) + D.Add(info) + ProcessQueue() + end) + :Catch(function(error) + if error then + table.insert(aErrmsg, error.message) + end + ProcessQueue() + end) + end + ProcessQueue() + end) + elseif name == 'Btn_RemoveUrl' then + local info = D.GetSelectedInfo() + if not info then + return X.OutputAnnounceMessage(_L['Please select one dataset first!']) + end + D.Remove(info) + elseif name == 'Btn_ExportUrl' then + local aMetaInfoURL = {} + for _, info in ipairs(D.Load()) do + table.insert(aMetaInfoURL, D.GetShortURL(info.szURL) or D.GetRawURL(info.szURL)) + end + X.UI.OpenTextEditor(table.concat(aMetaInfoURL, ';')) + elseif name == 'Btn_Info' then + X.OpenBrowser(this:GetParent().info.szAboutURL) + elseif name == 'Btn_SyncTeam' then + D.SyncTeam(D.GetSelectedInfo()) + elseif name == 'Btn_CheckUpdate' then + D.Fetch() + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local t = {{ + szOption = _L['Copy meta url'], + fnAction = function() + X.UI.OpenTextEditor(wnd.info.szURL) + end, + }} + local szShortURL = D.GetShortURL(wnd.info.szURL) + if szShortURL then + table.insert(t, { + szOption = _L['Copy short meta url'], + fnAction = function() + X.UI.OpenTextEditor(szShortURL) + end, + }) + end + table.insert(t, { + szOption = _L['Sync team'], + fnAction = function() + D.SyncTeam(wnd.info) + end, + }) + PopupMenu(t) + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = '' + if not X.IsEmpty(wnd.info.szURL) then + szTip = szTip .. _L('MetaInfo URL: %s', wnd.info.szURL) + end + local szShortURL = D.GetShortURL(wnd.info.szURL) + if not X.IsEmpty(szShortURL) then + szTip = szTip .. _L('(Short URL: %s)', szShortURL) + end + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_Subscribe_FavoriteData', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TargetMon_Subscribe.RegisterModule('FavoriteData', _L['Favorite list'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TargetMon_Subscribe_FavoriteData', + exports = { + { + root = D, + fields = { + 'Load', + 'Save', + 'Add', + 'Remove', + 'Fetch', + }, + preset = 'UIEvent', + }, + }, +} +MY_TargetMon_Subscribe_FavoriteData = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TargetMon/ui/MY_TargetMon.ini b/MY_TargetMon/ui/MY_TargetMon.ini new file mode 100644 index 000000000..43ff7b197 --- /dev/null +++ b/MY_TargetMon/ui/MY_TargetMon.ini @@ -0,0 +1,299 @@ +[MY_TargetMon] +._WndType=WndFrame +._Parent=Normal +Left=500 +Top=100 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 +ClassName=MY_TargetMonView + +[Handle_Total] +._WndType=Handle +._Parent=MY_TargetMon +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +Width=50 +Height=50 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_List +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=50 +Height=50 +IgnoreInvisibleChild=1 +Left=0 +Top=0 + +[Handle_Box] +._WndType=Handle +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +IgnoreInvisibleChild=1 + +[Image_BoxBg] +._WndType=Image +._Parent=Handle_Box +Left=0 +Top=0 +PosType=0 +Image=UI\Image\Common\Box.UITex +Alpha=255 +Frame=43 +Width=48 +Height=48 + +[Box_Default] +._WndType=Box +._Parent=Handle_Box +Left=2 +Top=2 +PosType=0 +IconID=413 +Width=44 +Height=44 +EventID=1023 + +[Text_Time] +._WndType=Text +._Parent=Handle_Box +Left=2 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=0 +HAlign=0 +VAlign=0 +FontScheme=15 +FontColor= +ShowAll=1 +AutoEtc=0 +Width=44 +Height=18 + +[Text_Hotkey] +._WndType=Text +._Parent=Handle_Box +Left=2 +Top=31 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=0 +HAlign=0 +VAlign=2 +FontScheme=8 +FontColor= +ShowAll=1 +AutoEtc=0 +Width=44 +Height=18 + +[Text_StackNum] +._WndType=Text +._Parent=Handle_Box +Left=2 +Top=31 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=0 +HAlign=2 +VAlign=2 +FontScheme=8 +FontColor= +ShowAll=1 +AutoEtc=0 +Width=44 +Height=18 + +[Text_ShortName] +._WndType=Text +._Parent=Handle_Box +Left=2 +Top=50 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=0 +HAlign=1 +VAlign=0 +FontScheme=8 +FontColor= +$Text=STR_SKILL_NAME +ShowAll=1 +AutoEtc=0 +Width=44 +Height=18 + +[Handle_Bar] +._WndType=Handle +._Parent=Handle_Item +Left=48 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Shadow_Background] +._WndType=Shadow +._Parent=Handle_Bar +Left=0 +Top=2 +PosType=0 +ShadowColor= +Alpha=80 +Width=140 +Height=44 + +[Image_Process] +._WndType=Image +._Parent=Handle_Bar +Left=0 +Top=2 +PosType=0 +Image=ui\Image\Common\Money.UITex +Alpha=180 +Frame=217 +ImageType=1 +Width=150 +Height=44 + +[Text_Name] +._WndType=Text +._Parent=Handle_Bar +Left=5 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=0 +Width=140 +Height=50 +HAlign=0 +VAlign=1 +FontScheme=16 +FontColor= +$Text=STR_SKILL_NAME +ShowAll=0 +AutoEtc=1 + +[Text_Process] +._WndType=Text +._Parent=Handle_Bar +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=240 +OrgText=1 +$Text=15s +Width=140 +Height=48 +HAlign=2 +VAlign=1 +FontScheme=16 +FontColor= +ShowAll=0 +AutoEtc=1 + +[SFX] +._WndType=SFX +._Parent=Handle_Bar +Left=330 +Top=23 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\N_怒气充满.pss +Loop=1 +Angle=1.600000 +Scale=0.200000 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TargetMon +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +FontScheme=16 + diff --git a/MY_TargetMon/ui/MY_TargetMon_PS.ini b/MY_TargetMon/ui/MY_TargetMon_PS.ini new file mode 100644 index 000000000..d27e882d2 --- /dev/null +++ b/MY_TargetMon/ui/MY_TargetMon_PS.ini @@ -0,0 +1,746 @@ +[MY_TargetMon_PS] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=1060 +Height=680 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=0 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 +ShowModeSet=0 +ShowWhenHideUI=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TargetMon_PS +Left=0 +Top=0 +Width=1060 +Height=680 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[WndScroll_Dataset] +._WndType=WndScroll +._Parent=Wnd_Total +Left=15 +Top=62 +Width=270 +Height=540 +ScrollHandle=Handle_DatasetList +ScrollContainer= +VerScrollBar=Btn_Dataset_All +ScrollButtonUp=Btn_Dataset_Up +ScrollButtonDown=Btn_Dataset_Down + +[Handle_Dataset] +._WndType=Handle +._Parent=WndScroll_Dataset +Left=0 +Top=0 +PosType=0 +HandleType=0 +Width=270 +Height=567 +PixelScroll=1 +IgnoreInvisibleChild=1 +FirstItemPosType=0 + +[Image_New_1] +._WndType=Image +._Parent=Handle_Dataset +PosType=8 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=270 +Height=530 +ImageType=10 + +[Handle_DatasetList] +._WndType=Handle +._Parent=Handle_Dataset +Left=5 +Top=5 +PosType=0 +HandleType=3 +RowSpacing=0 +Width=260 +Height=520 +PixelScroll=1 + +[Handle_DatasetItem] +._WndType=Handle +._Parent=Handle_DatasetList +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=260 +Height=65 +EventID=787253 +Hover=Image_DatasetItemBg_Hover|Image_DatasetItemConfig + +[Image_DatasetItemBg] +._WndType=Image +._Parent=Handle_DatasetItem +Left=0 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=6 +Alpha=255 +ImageType=0 +Width=260 +Height=65 + +[Image_DatasetItemBg_Hover] +._WndType=Image +._Parent=Handle_DatasetItem +Left=0 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=7 +Alpha=255 +ImageType=0 +Width=260 +Height=65 +LockShowAndHide=1 + +[Image_DatasetItemBg_Sel] +._WndType=Image +._Parent=Handle_DatasetItem +Left=0 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=8 +Alpha=255 +ImageType=0 +Width=260 +Height=65 +LockShowAndHide=1 + +[Image_DatasetItemBg_Dis] +._WndType=Image +._Parent=Handle_DatasetItem +Left=0 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=9 +Alpha=255 +ImageType=0 +Width=260 +Height=65 +LockShowAndHide=1 + +[Text_DatasetItemTitle] +._WndType=Text +._Parent=Handle_DatasetItem +Left=10 +Top=2 +PosType=0 +FontSpacing=0 +Alpha=255 +Width=240 +Height=28 +ShowAll=0 +AutoEtc=1 +HAlign=0 +VAlign=1 +OrgText=1 +$Text=自身BUFF监控·已更新西津渡 +MultiLine=0 +RowSpacing=0 + +[Text_DatasetItemAuthor] +._WndType=Text +._Parent=Handle_DatasetItem +Left=10 +Top=26 +PosType=0 +FontSpacing=0 +Alpha=255 +Width=240 +Height=28 +ShowAll=0 +AutoEtc=1 +HAlign=0 +VAlign=2 +OrgText=1 +$Text=2023/11/14 +MultiLine=0 +RowSpacing=0 + +[Text_DatasetItemVersion] +._WndType=Text +._Parent=Handle_DatasetItem +Left=10 +Top=26 +PosType=0 +FontSpacing=0 +Alpha=255 +Width=240 +Height=28 +ShowAll=0 +AutoEtc=1 +HAlign=2 +VAlign=2 +OrgText=1 +MultiLine=0 +RowSpacing=0 +$Text=少侠AFDFDA + +[Image_DatasetItemConfig] +._WndType=Image +._Parent=Handle_DatasetItem +Left=227 +Top=4 +PosType=0 +Image=ui/Image/UICommon/CommonPanel2.UITex +Alpha=255 +Frame=105 +EventID=831 +LockShowAndHide=1 + +[Btn_Dataset_Up] +._WndType=WndButton +._Parent=WndScroll_Dataset +Frame=34 +Left=255 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_Dataset_Down] +._WndType=WndButton +._Parent=WndScroll_Dataset +Frame=38 +Left=255 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_Dataset_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Dataset +StepCount=30 +PageStepCount=10 +Left=254 +Top=0 +Width=20 +Height=530 +SlideBtn=Btn_Tree_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Dataset_ListScroll] +._WndType=WndButton +._Parent=Btn_Dataset_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_CreateDataset] +._WndType=WndButton +._Parent=Wnd_Total +Left=13 +Top=598 +Width=130 +Height=35 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=35 +MouseOverGroup=36 +MouseDownGroup=37 +DisableGroup=38 +Alpha=255 +ShowTipType=0 + +[Handle_CreateDataset] +._WndType=Handle +._Parent=Btn_CreateDataset +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=130 +Height=35 + +[Text_CreateDataset] +._WndType=Text +._Parent=Handle_CreateDataset +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=新建监控 +Width=130 +Height=35 +HAlign=1 +VAlign=1 + +[Btn_ImportExportDataset] +._WndType=WndButton +._Parent=Wnd_Total +Left=156 +Top=598 +Width=130 +Height=35 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=35 +MouseOverGroup=36 +MouseDownGroup=37 +DisableGroup=38 +Alpha=255 +ShowTipType=0 + +[Handle_ImportExportDataset] +._WndType=Handle +._Parent=Btn_ImportExportDataset +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=130 +Height=35 + +[Text_ImportExportDataset] +._WndType=Text +._Parent=Handle_ImportExportDataset +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +Width=130 +Height=35 +HAlign=1 +VAlign=1 +$Text=数据导入 + +[Wnd_SearchMonitor] +._WndType=WndWindow +._Parent=Wnd_Total +Left=295 +Top=62 +Width=295 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchMonitor] +._WndType=Handle +._Parent=Wnd_SearchMonitor +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=295 +Height=25 + +[Image_SearchMonitorBg] +._WndType=Image +._Parent=Handle_SearchMonitor +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=292 +Height=25 +ImageType=10 + +[Image_SearchMonitor_0] +._WndType=Image +._Parent=Handle_SearchMonitor +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=262 +Top=-3 +PosType=0 +ImageType=0 + +[Edit_SearchMonitor] +._WndType=WndEdit +._Parent=Wnd_SearchMonitor +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=259 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=SEARCH CONTENT +OrgPlaceholder=1 +PlaceholderAlpha=150 +TextMaxNum=-1 +TextMinNum=-1 + +[Btn_CreateMonitor] +._WndType=WndButton +._Parent=Wnd_Total +Left=916 +Top=59 +Width=130 +Height=30 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +NormalGroup=35 +MouseOverGroup=36 +MouseDownGroup=37 +DisableGroup=38 +Alpha=255 +ShowTipType=0 + +[Handle_CreateMonitor] +._WndType=Handle +._Parent=Btn_CreateMonitor +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=130 +Height=30 + +[Text_CreateMonitor] +._WndType=Text +._Parent=Handle_CreateMonitor +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +Width=130 +Height=30 +HAlign=1 +VAlign=1 +$Text=新建条目 + +[WndScroll_Monitor] +._WndType=WndScroll +._Parent=Wnd_Total +Left=295 +Top=89 +Width=750 +Height=540 +ScrollHandle=Handle_Monitor_List +ScrollContainer= +VerScrollBar=Scroll_Monitor +ScrollButtonUp=Btn_Monitor_UP +ScrollButtonDown=Btn_Monitor_Down + +[Handle_New_1] +._WndType=Handle +._Parent=WndScroll_Monitor +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0] +._WndType=Image +._Parent=Handle_New_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=750 +Height=540 +ImageType=10 + +[Handle_Monitor_List] +._WndType=Handle +._Parent=Handle_New_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=728 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Handle_MonitorItem] +._WndType=Handle +._Parent=Handle_Monitor_List +PosType=8 +HandleType=0 +Width=182 +Height=62 +FirstItemPosType=0 +EventID=786741 +Hover=Image_MonitorItem_Hover + +[Image_MonitorItem] +._WndType=Image +._Parent=Handle_MonitorItem +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=160 +Width=182 +Height=62 +Frame=7 +ImageType=10 + +[Image_MonitorItem_Hover] +._WndType=Image +._Parent=Handle_MonitorItem +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=160 +Width=182 +Height=62 +Frame=8 +ImageType=10 + +[Box_MonitorItem] +._WndType=Box +._Parent=Handle_MonitorItem +Left=4 +Top=4 +PosType=0 +IconID=13 +Width=55 +Height=55 + +[Text_MonitorItem] +._WndType=Text +._Parent=Handle_MonitorItem +Left=65 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +VAlign=1 +Width=115 +Height=62 +FontScheme=59 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 +OrgText=1 +$Text=镇山河 + +[Image_MonitorItemRBg] +._WndType=Image +._Parent=Handle_MonitorItem +Image=ui\Image\UICommon\GuildMainPanel1.UITex +Frame=38 +Alpha=255 +Left=135 +Top=46 +PosType=0 + +[Text_MonitorItemDisplayName] +._WndType=Text +._Parent=Handle_MonitorItem +Left=65 +Top=46 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=190 +VAlign=1 +HAlign=2 +Width=112 +Height=17 +FontScheme=155 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 +OrgText=1 +$Text=无敌 + +[Btn_Monitor_UP] +._WndType=WndButton +._Parent=WndScroll_Monitor +Frame=34 +Left=730 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_Monitor_Down] +._WndType=WndButton +._Parent=WndScroll_Monitor +Frame=38 +Left=730 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Scroll_Monitor] +._WndType=WndNewScrollBar +._Parent=WndScroll_Monitor +StepCount=30 +PageStepCount=10 +Left=730 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_Monitor_Scroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Monitor_Scroll] +._WndType=WndButton +._Parent=Scroll_Monitor +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + diff --git a/MY_TargetMon/ui/MY_TargetMon_Subscribe_Data.ini b/MY_TargetMon/ui/MY_TargetMon_Subscribe_Data.ini new file mode 100644 index 000000000..5e5d29452 --- /dev/null +++ b/MY_TargetMon/ui/MY_TargetMon_Subscribe_Data.ini @@ -0,0 +1,652 @@ +[MY_TargetMon_Subscribe_Data] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TargetMon_Subscribe_Data +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break1] +._WndType=Image +._Parent=Handle_Total +Left=120 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break1] +._WndType=Text +._Parent=Handle_Total +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Author +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +EventID=512 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=120 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=550 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[Text_Page] +._WndType=Text +._Parent=Handle_Total +Left=557 +Top=529 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=192 +$Text=1 / 100 +OrgText=1 +FontScheme=18 +HAlign=2 +VAlign=1 +Width=140 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Author] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=120 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=130 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=530 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_SyncTeam] +._WndType=WndButton +._Parent=Wnd_Total +Left=24 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_SyncTeam] +._WndType=Handle +._Parent=Btn_SyncTeam +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_SyncTeam] +._WndType=Text +._Parent=Handle_SyncTeam +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=SYNC TEAM + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=180 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + +[Btn_PrevPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=739 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_PrevPage] +._WndType=Handle +._Parent=Btn_PrevPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_PrevPage] +._WndType=Text +._Parent=Handle_PrevPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREV PAGE + +[Btn_NextPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=861 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_NextPage] +._WndType=Handle +._Parent=Btn_NextPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_NextPage] +._WndType=Text +._Parent=Handle_NextPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=NEXT PAGE + diff --git a/MY_TargetMon/ui/MY_TargetMon_Subscribe_FavoriteData.ini b/MY_TargetMon/ui/MY_TargetMon_Subscribe_FavoriteData.ini new file mode 100644 index 000000000..b4c503783 --- /dev/null +++ b/MY_TargetMon/ui/MY_TargetMon_Subscribe_FavoriteData.ini @@ -0,0 +1,694 @@ +[MY_TargetMon_SubscribeUI] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TargetMon_SubscribeUI +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break1] +._WndType=Image +._Parent=Handle_Total +Left=120 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break1] +._WndType=Text +._Parent=Handle_Total +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Author +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +EventID=512 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=120 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=550 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Author] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=120 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=130 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=530 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_AddUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=30 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_AddUrl] +._WndType=Handle +._Parent=Btn_AddUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_AddUrl] +._WndType=Text +._Parent=Handle_AddUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=ADD FAV + +[Btn_RemoveUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=180 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_RemoveUrl] +._WndType=Handle +._Parent=Btn_RemoveUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_RemoveUrl] +._WndType=Text +._Parent=Handle_RemoveUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=REMOVE FAV + +[Btn_ExportUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=330 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_ExportUrl] +._WndType=Handle +._Parent=Btn_ExportUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_ExportUrl] +._WndType=Text +._Parent=Handle_ExportUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=EXPORT FAV + +[Btn_SyncTeam] +._WndType=WndButton +._Parent=Wnd_Total +Left=480 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_SyncTeam] +._WndType=Handle +._Parent=Btn_SyncTeam +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_SyncTeam] +._WndType=Text +._Parent=Handle_SyncTeam +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=SYNC TEAM + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=630 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + diff --git a/MY_TeamMon/img/ST.Tga b/MY_TeamMon/img/ST.Tga new file mode 100644 index 000000000..916609ebc Binary files /dev/null and b/MY_TeamMon/img/ST.Tga differ diff --git a/MY_TeamMon/img/ST.UITex b/MY_TeamMon/img/ST.UITex new file mode 100644 index 000000000..0b462d1ee Binary files /dev/null and b/MY_TeamMon/img/ST.UITex differ diff --git a/MY_TeamMon/img/ST.txt b/MY_TeamMon/img/ST.txt new file mode 100644 index 000000000..447474695 --- /dev/null +++ b/MY_TeamMon/img/ST.txt @@ -0,0 +1,10 @@ +Farme Left Top Width High File +0 0 0 256 34 C:\Users\root\Desktop\橙色.tga +1 0 36 256 34 C:\Users\root\Desktop\粉色.tga +2 0 72 256 34 C:\Users\root\Desktop\红色.tga +3 0 108 256 34 C:\Users\root\Desktop\黄色.tga +4 0 144 256 34 C:\Users\root\Desktop\灰色.tga +5 0 180 256 34 C:\Users\root\Desktop\蓝色.tga +6 0 216 256 34 C:\Users\root\Desktop\绿色.tga +7 0 252 256 34 C:\Users\root\Desktop\青色.tga +8 0 288 256 34 C:\Users\root\Desktop\紫色.tga diff --git a/MY_TeamMon/img/Tree.Tga b/MY_TeamMon/img/Tree.Tga new file mode 100644 index 000000000..0eb87066c Binary files /dev/null and b/MY_TeamMon/img/Tree.Tga differ diff --git a/MY_TeamMon/img/Tree.UITex b/MY_TeamMon/img/Tree.UITex new file mode 100644 index 000000000..ded872685 Binary files /dev/null and b/MY_TeamMon/img/Tree.UITex differ diff --git a/MY_TeamMon/img/Tree.txt b/MY_TeamMon/img/Tree.txt new file mode 100644 index 000000000..14ab32cfe --- /dev/null +++ b/MY_TeamMon/img/Tree.txt @@ -0,0 +1,12 @@ +Farme Left Top Width High File +0 0 0 352 35 C:\Users\root\Desktop\加号_1.tga +1 0 37 352 35 C:\Users\root\Desktop\加号_2.tga +2 0 74 352 35 C:\Users\root\Desktop\加号_3.tga +3 0 111 352 35 C:\Users\root\Desktop\减号_1.tga +4 0 148 352 35 C:\Users\root\Desktop\减号_2.tga +5 0 185 352 35 C:\Users\root\Desktop\减号_3.tga +6 0 222 288 65 C:\Users\root\Desktop\按钮_1.tga +7 0 289 288 65 C:\Users\root\Desktop\按钮_2.tga +8 0 356 288 65 C:\Users\root\Desktop\按钮_3.tga +9 0 423 288 65 C:\Users\root\Desktop\按钮_4.tga +10 290 222 24 24 C:\Users\root\Desktop\蓝圆.tga diff --git a/MY_TeamMon/info.ini b/MY_TeamMon/info.ini new file mode 100644 index 000000000..0d6ae9079 --- /dev/null +++ b/MY_TeamMon/info.ini @@ -0,0 +1,25 @@ +[MY_TeamMon] +name=团队监控 +desc=秘境团队监控,配合团队面板使用 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_TeamMon.lua +lua_1=src/MY_TeamMon_SpellTimer.lua +lua_2=src/MY_TeamMon_CenterAlarm.lua +lua_3=src/MY_TeamMon_FullScreenAlarm.lua +lua_4=src/MY_TeamMon_LargeTextAlarm.lua +lua_5=src/MY_TeamMon_VoiceAlarm.lua +lua_6=src/MY_TeamMon_BuffList.lua +lua_7=src/MY_TeamMon_PartyBuffList.lua +lua_8=src/MY_TeamMon_CircleLine.lua +lua_9=src/MY_TeamMon_UI.lua +lua_10=src/MY_TeamMon_Subscribe.lua +lua_11=src/MY_TeamMon_Subscribe_Data.lua +lua_12=src/MY_TeamMon_Subscribe_FavoriteData.lua +lua_13=src/MY_TeamMon_Subscribe_VoicePacket_Official.lua +lua_14=src/MY_TeamMon_Subscribe_VoicePacket_Custom.lua +lua_15=src/MY_TeamMon_Subscribe_MergeDataSlice.lua +lua_16=src/MY_TeamMon_VoiceAlarm_Previewer.lua +lua_17=src/MY_TeamMon.PS.lua diff --git a/MY_TeamMon/info.ini.zh_TW b/MY_TeamMon/info.ini.zh_TW new file mode 100644 index 000000000..bd34b579a --- /dev/null +++ b/MY_TeamMon/info.ini.zh_TW @@ -0,0 +1,25 @@ +[MY_TeamMon] +name=鍦橀殜鐩f帶 +desc=绉樺鍦橀殜鐩f帶锛岄厤鍚堝湗闅婇潰鏉夸娇鐢 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_TeamMon.lua +lua_1=src/MY_TeamMon_SpellTimer.lua +lua_2=src/MY_TeamMon_CenterAlarm.lua +lua_3=src/MY_TeamMon_FullScreenAlarm.lua +lua_4=src/MY_TeamMon_LargeTextAlarm.lua +lua_5=src/MY_TeamMon_VoiceAlarm.lua +lua_6=src/MY_TeamMon_BuffList.lua +lua_7=src/MY_TeamMon_PartyBuffList.lua +lua_8=src/MY_TeamMon_CircleLine.lua +lua_9=src/MY_TeamMon_UI.lua +lua_10=src/MY_TeamMon_Subscribe.lua +lua_11=src/MY_TeamMon_Subscribe_Data.lua +lua_12=src/MY_TeamMon_Subscribe_FavoriteData.lua +lua_13=src/MY_TeamMon_Subscribe_VoicePacket_Official.lua +lua_14=src/MY_TeamMon_Subscribe_VoicePacket_Custom.lua +lua_15=src/MY_TeamMon_Subscribe_MergeDataSlice.lua +lua_16=src/MY_TeamMon_VoiceAlarm_Previewer.lua +lua_17=src/MY_TeamMon.PS.lua diff --git a/MY_TeamMon/lang/default.jx3dat b/MY_TeamMon/lang/default.jx3dat new file mode 100644 index 000000000..0b17e2b1a --- /dev/null +++ b/MY_TeamMon/lang/default.jx3dat @@ -0,0 +1,3 @@ +return { + ['AND_COMMA'] = ' and ', +} diff --git a/MY_TeamMon/lang/zhcn.jx3dat b/MY_TeamMon/lang/zhcn.jx3dat new file mode 100644 index 000000000..7edf22e35 --- /dev/null +++ b/MY_TeamMon/lang/zhcn.jx3dat @@ -0,0 +1,381 @@ +return { + ['MY_TeamMon'] = '团队监控', + ['Leave map %s.'] = '你已离开地图【%s】。', + ['Enter map %s.'] = '你已进入地图【%s】。', + ['Encrypt and compressing: '] = '更新加密压缩:', + ['Manage my online data'] = '管理我的在线数据', + -- MY_TeamMon_CenterAlarm.lua -- + ['MY_TeamMon_CenterAlarm'] = '中央提醒', + -- MY_TeamMon_CircleLine.lua -- + ['MY_TeamMon_CircleLine'] = '圈圈连线', + -- MY_TeamMon_BuffList.lua -- + ['MY_TeamMon_BuffList'] = '自身气劲列表', + -- MY_TeamMon_PartyBuffList.lua -- + ['MY_TeamMon_PartyBuffList'] = '团队重要气劲列表', + ['Mouse enter select'] = '鼠标滑过选中目标', + -- MY_TeamMon_LargeTextAlarm.lua -- + ['MY_TeamMon_LargeTextAlarm'] = '特大文字', + ['Font scale'] = '字体缩放', + ['Pause time'] = '停留时间', + ['FadeIn time'] = '淡入时间', + ['FadeOut time'] = '淡出时间', + ['Preview'] = '预览', + ['PVE everyday, Xuanjing everyday!'] = '每天一个本,周周见玄晶!', + -- MY_TeamMon_UI.lua -- + ['Set countdown key'] = '设置倒计时唯一标识', + ['Key supports template render: {$sender}, {$receiver}, {$1}'] = '唯一标识支持模板字符串:{$sender}, {$receiver}, {$1}', + ['Hold countdown when crossmap'] = '倒计时过图不消失', + ['Hold countdown when unfight'] = '倒计时脱战不消失', + ['Countdown key'] = '倒计时唯一标识', + ['Clear record'] = '清空记录', + ['The map does not exist'] = '这个地图不存在', + ['Common / uncategorized'] = '通用/其他', + ['All'] = '全部', + ['All data'] = '全部的数据', + ['Common data'] = '通用的数据', + ['City data'] = '主城的数据', + ['Dungeon data'] = '秘境的数据', + ['Team dungeon data'] = '小队秘境的数据', + ['Raid dungeon data'] = '团队秘境的数据', + ['Starve data'] = '浪客行的数据', + ['Village data'] = '野外的数据', + ['Arena data'] = '名剑大会的数据', + ['Battlefield data'] = '战场的数据', + ['Pubg data'] = '绝境战场的数据', + ['Zombie data'] = '李渡鬼域的数据', + ['Monster data'] = '百战的数据', + ['Moba data'] = '列星虚境的数据', + ['Homeland data'] = '家园的数据', + ['Roguelike data'] = '八荒衡鉴的数据', + ['Competition data'] = '竞技地图的数据', + ['Camp data'] = '阵营地图的数据', + ['Stronghold data'] = '据点地图的数据', + ['School data'] = '门派地图的数据', + ['Guild territory data'] = '帮会领地的数据', + ['Recycle bin'] = '回收站', + ['Recycle bin data'] = '回收站的数据', + ['['] = '【', + [']'] = '】', + ['Data exists, editor?'] = '数据已经存在,是否编辑?', + + ['MY_TeamMon DEBUG Panel'] = '团队监控测试面板', + ['Sure to delete?'] = '确认要删除?', + ['Clear this map data'] = '清空分类下数据(小心)', + ['%s share a %s data to you, accept?'] = '【%s】共享了一个【%s】数据给你,接收?', + ['Share data'] = '共享数据', + ['Manual input'] = '手动输入', + ['Battle of Taiyuan'] = '太原之战·', + ['YongWangXingGong'] = '永王行宫·', + ['Self kungfu requirement'] = '自身心法要求', + ['No request'] = '没有要求', + ['INFINITE'] = '∞', + ['Raw data, please be careful'] = '查看原始数据(仅供参考)', + ['%s call name'] = '被【%s】点名了', + ['MY_TeamMon config panel'] = '团队监控设置面板', + ['BUFF'] = '有利气劲', + ['DEBUFF'] = '不利气劲', + ['CASTING'] = '武学招式', + ['DOODAD'] = '交互物件', + ['NPC'] = '系统角色', + ['TALK'] = '角色喊话', + ['CHAT'] = '系统频道', + ['Interval time'] = '间隔时间', + ['Casting'] = '正在释放', + ['use of'] = '释放了', + ['Get buff'] = '获得气劲 ', + [', remain time %s'] = ',剩余持续时间%s', + ['%ds'] = '%d秒', + [','] = ',', + ['.'] = '。', + ['Lose buff'] = '失去气劲 ', + ['Appear'] = '出现', + ['Disappear'] = '消失', + ['[%s] enter %s'] = '[%s]出现!%s', + ['[%s] disappear'] = '[%s]消失', + ['Skills cast succeed'] = '招式成功释放', + ['Skills began to cast'] = '招式开始运功', + ['Team'] = '团队', + ['Enemy'] = '敌对', + ['Scrutiny type'] = '监控对象类型', + ['Buffcount achieve'] = '层数必须达到', + ['Count achieve'] = '数量达到', + ['Must all leave scene'] = '必须全部消失', + ['Enter scene'] = '进入场景', + ['Leave scene'] = '离开场景', + ['All leave scene'] = '全部离开场景', + ['Check level'] = '区分等级', + ['Mark'] = '标记', + ['Voice'] = '语音报警', + ['Buff target must be myself'] = '仅自身气劲', + ['No voice'] = '无', + ['Center alarm'] = '中央报警', + ['Voice alarm'] = '语音报警', + ['Large text alarm'] = '特大文字报警', + ['Lifebar alarm'] = '头顶报警', + ['Fullscreen alarm'] = '全屏泛光报警', + ['Team channel alarm'] = '团队频道报警', + ['Whisper channel alarm'] = '密聊频道报警', + ['Party buff list'] = '团队气劲列表', + ['Buff list'] = '自身气劲列表', + ['Team panel'] = '团队面板', + ['Only source self'] = '仅显示来源自己的气劲', + ['Auto Select'] = '自动选中目标', + ['Auto Cancel Buff'] = '自动卸除气劲', + ['Requires MY_LifeBar loaded.'] = '需加载并启用头顶血条', + ['Requires MY_LifeBar loaded.\nDue to official logic, only target is visible.'] = '需加载并启用头顶血条\n由于官方限制,仅目标运功状态可显示', + ['Voice alarm function'] = '语音报警功能选项', + ['Show voice recommendation confirm on load data'] = '加载数据时显示推荐语音包', + ['Prefer use official voice'] = '优先播放官方语音', + ['OfficialVoicePacketID'] = '当前官方语音包ID', + ['CustomVoicePacketID'] = '当前自定义语音包ID', + ['Add countdown'] = '添加倒计时', + ['Press CTRL click for advance menu'] = '按住CTRL点击可查看高级选项', + ['Please select type'] = '请选择类型', + ['Countdown TYPE 0'] = '其他', -- OTHER + ['Countdown TYPE 1'] = '获得气劲', -- BUFF_GET + ['Countdown TYPE 2'] = '失去气劲', -- BUFF_LOSE + ['Countdown TYPE 3'] = '角色进入场景', -- NPC_ENTER + ['Countdown TYPE 4'] = '角色离开场景', -- NPC_LEAVE + ['Countdown TYPE 5'] = '角色喊话', -- NPC_TALK + ['Countdown TYPE 6'] = '角色气血报警', -- NPC_LIFE + ['Countdown TYPE 7'] = '角色进入战斗', -- NPC_FIGHT + ['Countdown TYPE 8'] = '招式开始运功', -- SKILL_BEGIN + ['Countdown TYPE 9'] = '招式成功释放', -- SKILL_END + ['Countdown TYPE 10'] = '系统喊话', -- SYS_TALK + ['Countdown TYPE 11'] = '角色全部离开场景', -- NPC_ALLLEAVE + ['Countdown TYPE 12'] = '角色死亡', -- NPC_DEATH + ['Countdown TYPE 13'] = '角色全部死亡', -- NPC_ALLDEATH + ['Countdown TYPE 14'] = '触发喊话', -- TALK_MONITOR + ['Countdown TYPE 15'] = '触发喊话', -- COMMON + ['Countdown TYPE 16'] = '角色内力报警', -- NPC_MANA + ['Countdown TYPE 17'] = '交互物件出现', -- + ['Countdown TYPE 18'] = '交互物件消失', -- + ['Countdown TYPE 19'] = '交互物件全部消失', -- + ['Countdown TYPE 20'] = '触发监听系统信息', -- + ['NPC can not change the icon'] = '无法更改系统角色的图标', + ['Warning box'] = '系统警告框', + ['Alert content'] = '报警内容', + ['Tips: {$me} behalf of self, {$team} behalf of team.'] = '小提示:{$me} 代表自己的名字,{$team} 代表团玩家的名字。', + ['Partical search'] = '检索匹配', + ['Supports match partical.'] = '勾选后,任意部分一致即可匹配成功,会造成少量性能损耗。', + ['Regexp match'] = '正则匹配', + ['Supports backreference in note string, format: {$index}.'] = '启用正则匹配后报警内容支持引用捕获,格式为“{$捕获下标}”。\n正则匹配性能消耗较大,建议同一地图同时不超过5条,过度使用可能影响游戏帧率。\n关于“正则匹配”和“捕获组”知识,请自行搜索“LUA正则”相关知识。', + ['Speaker'] = '喊话对象', + ['Content'] = '喊话内容', + ['Chat content'] = '系统喊话', + ['Trigger talk'] = '触发喊话', + ['Trigger chat'] = '触发系统喊话', + ['Add focus'] = '添加焦点', + ['Add cataclysm buff'] = '添加团队面板气劲监控', + ['TC'] = '队', + ['is calling'] = '点', + ['\'s name.'] = '名了。', + ['JX3'] = '剑网3', + ['Life/mana statement.\n\nExample: 0.7-,Remain 70%;0.5-,Remain Half,2;0.01-,Almost empty,5'] = '气血/内力监控内容\n\n格式:剩余量[数值变化方向],提示语[,时间轴显示时长]\n示例:0.7,剩下70%,VO:cccc;0.5-,剩下一半,2,VO:cccc;0.01,快没了,5\n注意:\n① 最多支持到小数点后两位,即不支持如“0.751”写法。\n② 数值变化方向(可选)有效值为“-”表示减少,“+”表示增加,“*”表示不限制。\n③ 时间轴显示时长(可选)如果不填将不会出现时间轴提示。', + ['Raid talk warning'] = '团队喊话报警', + ['Simple countdown text'] = '普通倒计时提示语', + ['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called'] = '注:使用ID解析串可防止内容被屏蔽,支持的模式如下(包含花括号):\n1. {$B188} ID为188的气劲名称\n2. {$B188,2} ID为188,等级为2的气劲名称\n3. {$S188} ID为188的武学招式名称\n4. {$S188,2} ID为188,等级为2的武学招式名称\n5. {$N188} 模板ID为188的系统角色名称\n6. {$D188} 模板ID为188的交互物件名称\n7. {$M188} 地图ID为188的场景名称\n8. {$me} 自己的名字\n9. {$sender} 该事件发起者的名字,如点名者\n10. {$receiver} 该事件受影响者的名字,如被点名的队友', + ['Notice: spell timer starts with VO: means play voice while this part active.'] = '注:使用“VO:”开头的配置段表示该段倒计时启动时播放指定的语音报警。', + ['Please input simple countdown text...'] = '请输入普通倒计时提示语...', + ['Simple countdown time or multi countdown statement. Input pure number for simple countdown time, otherwise for multi countdown statement.\n\nMulti countdown example: 10,Countdown1;25,Countdown2;55,Countdown3\nExplain: Countdown1 finished will start Countdown2, so as Countdown3.'] = '输入纯数字表示普通倒计时时间,否则表示分段倒计时。\n\n分段倒计时示例:10,倒计时1;25,倒计时2,VO:cccc;55,倒计时3,VO:cccc\n示例解释:[倒计时1]结束再触发[倒计时2](当前倒计时设置的触发时间-已过时间)15秒的倒计时,并播放倒计时2的语音报警,[倒计时2]、[倒计时3]以此类推。倒计时的数量不限,可自由填写,常用于首领进入战斗后开始的阶段倒计时。\n\n特别:\n当倒计时时间设置为“0”时,表示从已存在的倒计时中找到与该条设置项唯一标识相同的倒计时,删除倒计时条,并清空对应CD时间。\n当倒计时时间设置为“-1”时,表示从已存在的倒计时中找到与该条设置项唯一标识相同的倒计时,删除倒计时条,但不清空对应的CD时间。\n当倒计时时间设置为“-2”时,表示从已存在的倒计时中找到与该条设置项唯一标识相同的倒计时,并清空CD时间,但是不删除正在显示的倒计时条。', + ['(OPERATOR +)'] = '↑', + ['(OPERATOR -)'] = '↓', + ['Official voice'] = '官方语音', + ['Custom voice'] = '更多语音', + ['Unknown voice'] = '未知语音', + ['Max repeat time\n\nWhen countdown get trigger again, the last countdown may get overwritten. This config is to sovle this problem, input time limit here to ensure in this time period, countdown will not be trigger again.'] = '重复调用时间限制\n\n当倒计时被再次触发时,可能会导致前一次倒计时被覆盖,该设置就是解决这个问题,在此直接输入时间即可保证在这段时间内不会再次被重复同样的倒计时。请注意,分段倒计时默认取最大的时间作为重复调用时间限制,当然您也可以自由更改。', + ['Class'] = '分类', + ['Succeed'] = '操作成功', + ['Same data exist'] = '存在相同的数据', + ['This data'] = '这个数据', + ['Open data panel'] = '打开数据设置', + ['Open/close MY_TeamMon'] = '打开/关闭团队监控', + ['Add'] = '添加', + ['Edit icon'] = '修改图标', + ['Edit color'] = '修改颜色(报警通用颜色)', + ['Clear color'] = '清空颜色', + ['Edit name'] = '修改名称', + ['MY_TeamMon is blocked in current kungfu, temporary disabled.'] = '当前心法禁止使用团队监控,相关功能已暂时关闭。', + ['MY_TeamMon is shielded other player in this map, temporary disabled.'] = '当前地图禁止使用团队监控其他玩家,相关功能已暂时关闭。', + ['Add to monitor list'] = '添加到监控列表', + ['(player)'] = '(玩家)', + ['Subscribe data'] = '订阅在线数据、语音包', + ['Merge data slice'] = '快速载入在线数据条目', + ['Import local data'] = '导入本地数据', + ['Export local data'] = '导出本地数据', + ['Clear local data'] = '清空本地数据', + ['Data voice subscribe'] = '数据语音订阅', + ['Preview voice packet'] = '预览当前语音', + ['Preview official voice packet'] = '预览官方语音', + ['Preview custom voice packet'] = '预览插件语音', + ['Are you sure to clear local data? All team mon data will be removed totally, this is not reversible.'] = '确定要清空本地数据?所有团队监控数据配置将会被彻底删除,数据清空操作后无法撤销。', + ['Browse'] = '浏览', + ['Load config success: %s'] = '数据加载成功:%s', + ['Load config failed: %s'] = '数据加载失败:%s', + ['Open data folder'] = '打开数据文件夹', + ['Includes'] = '包括', + ['File name'] = '文件名', + ['File format'] = '文件格式(不明白不需要更改,导入不支持JSON)', + ['Author name'] = '作者', + ['Unknown author'] = '佚名', + ['Lua encrypted'] = '加密压缩格式', + ['Lua plain'] = '单行原始格式', + ['Lua formated'] = '多行缩进格式', + ['JSON'] = 'JSON', + ['JSON formated'] = '多行缩进 JSON', + ['Export success: %s'] = '导出成功:%s', + ['Import success: %s'] = '导入成功:%s', + ['Import failed: %s'] = '导入失败,%s', + ['Import mode'] = '导入模式', + ['Cover'] = '覆盖(推荐)', + ['Merge priority old file'] = '合并(原文件优先,不推荐)', + ['Merge priority new file'] = '合并(新文件优先)', + ['Show target name'] = '显示目标名称', + -- ['Add content'] = '补充报警内容', + ['Add content'] = '备注信息', + ['Search map'] = '搜索地图', + ['Search content'] = '搜索内容', + ['Global search'] = '全局搜索', + ['Trigger preview'] = '触发器预览', + ['Countdown preview'] = '倒计时预览', + ['Master switch'] = '插件总开关', + ['Enable MY_TeamMon'] = '开启团队监控插件', + ['Enable circle'] = '启用画圈', + ['Circle border'] = '圈圈边框', + ['Enable alarm (master switch)'] = '启用报警模块(总开关)', + ['Team panel bind show buff'] = '团队面板关联气劲显示', + ['Max buff count'] = '最大显示数量', + ['Buff size'] = '气劲格子大小', + ['Data save mode'] = '数据保存模式', + ['Use common data'] = '使用通用数据(即当前角色和其他角色共用同一个数据)', + ['\'s life remaining to '] = '的血量剩余', + ['\'s mana reaches '] = '的内力达到', + ['File does not exist.'] = '文件不存在。', + ['Can not read data file.'] = '文件格式错误或无法读取。', + ['Data conflict'] = '数据冲突', + ['Data conflict, please check.'] = '有数据冲突,请留意聊天框的提示。\n\t这种情况一般由于合并数据造成,请根据提示搜索相应ID,您会发现有多个相同的ID数据,但没有区分其等级,请删除相同的数据或者勾选区分等级,虽然冲突并不会影响插件正常工作,但由于插件的缓存机制,这可能导致插件抓取错误的缓存,从而致使冲突的监控不生效,如果您是数据作者请及时修改,并保持良好习惯,如果您是普通用户不会修改可以选择无视。', + + ['Circle and line'] = '圈圈连线', + ['Draw line'] = '绘制连线', + ['Only when stare me'] = '仅当注视我', + ['Degree'] = '度', + ['Meter'] = '尺', + ['Alpha'] = '透明度', + ['Only my employer'] = '只绘制属于我的', + ['Draw Border'] = '绘制边框', + ['Draw name'] = '绘制名称', + ['Add circle'] = '添加圈圈', + -- MY_TeamMon_SpellTimer.lua -- + ['MY_TeamMon_SpellTimer'] = '团队计时', + ['Countdown configure'] = '时间轴显示', + ['Countdown format error'] = '倒计时格式错误', + ['[%s] remaining %ds.'] = '【%s】 剩余 %d 秒。', + ['Countdown'] = '倒计时', + ['Focuslist'] = '焦点列表', + ['Team panel buff rule list'] = '团队面板条件监控', + ['Add buff rule'] = '添加条件监控', + ['Never show decimal.'] = '从不显示小数点。', + ['Always show decimal.'] = '总是显示小数点。', + ['Show countdown decimal settings'] = '倒计时小数点设置', + ['Show countdown decimal when duration below: %ds.'] = '倒计时剩余%d秒时显示小数点。', + -- MY_TeamMon_Subscribe.lua -- + ['MY_TeamMon_Subscribe'] = '团队监控·数据订阅', + ['Default'] = '默认', + ['Default monitor data'] = '默认数据', + ['ERR: Decode info content as json failed!'] = '错误:描述文件解析失败!', + ['ERR: Info content is illegal!'] = '错误:描述文件数据结构不符合约束!', + ['Fetch repo meta list failed.'] = '获取推荐数据失败。', + ['ERR404: MetaInfo address not found!'] = '错误404:订阅地址不存在!', + ['New version found for TeamMon_RR\nSURL: %s\nName: %s\nTime: %s\n\nDo you want to update data now?'] = '团队监控数据订阅有更新\n短链:%s\n标题:%s\n时间:%s\n\n是否立即下载更新数据?', + ['Update'] = '更新', + ['Skip current version'] = '跳过此版本', + ['Downloading in progress, please wait...'] = '数据下载正在进行中,请稍后...', + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['Decode %s failed!'] = '解码[%s]失败!', + -- MY_TeamMon_Subscribe_Data.lua -- + ['Subscribe list'] = '推荐数据', + ['Please select one dataset first!'] = '请先选择一个数据项!', + ['Author'] = '作者', + ['Title'] = '标题', + ['See details'] = '查看详情', + ['Last select'] = '上次选择', + ['Can update'] = '有更新', + ['Download'] = '下载', + ['Fetching...'] = '获取中...', + ['Downloading...'] = '下载中...', + ['You are not in the team.'] = '你不在队伍中。', + ['You are not team leader.'] = '你不是队长,无法执行这个操作。', + ['Confirm?'] = '确定执行这个操作?', + ['%s request download:'] = '[%s]建议下载该数据:', + ['Title: %s'] = '标题:%s', + ['Author: %s'] = '作者:%s', + ['%s loaded %s'] = '[%s]加载了团队监控数据:%s。', + ['Upgrade TeamMon data to latest: %s'] = '团队监控数据已更新至最新:%s。', + ['Sync team'] = '同步团队', + ['Add favorite success, you can switch to favorite page to see.'] = '数据收藏成功,前往收藏数据分页即可查看。', + ['Add favorite'] = '加入收藏', + ['Check update'] = '检查更新', + ['Refresh list'] = '刷新列表', + ['Prev page'] = '上一页', + ['Next page'] = '下一页', + ['Add url'] = '添加订阅', + ['Remove url'] = '删除订阅', + ['Embedded dataset cannot be removed!'] = '内置数据不可删除!', + ['MetaInfo URL: %s'] = '订阅地址:%s', + ['Update time: %s'] = '更新时间:%s', + ['(Short URL: %s)'] = '(短链:%s)', + ['Copy meta url'] = '复制订阅地址', + ['Copy short meta url'] = '复制短地址', + ['Export meta url'] = '导出订阅', + + ['Plugin is plugin, data is data, plugin author is plugin author, data author is data author..\nYou just loaded data\'s author is %s, it works on mingyi plugin team monitor addon.\n%s is data author, do not response for plugin problems. MingYi is plugin author, do not response for data problems.\n\nIf there is some strange headtop, focus, buff or talk, please try to use other author\'s data, and response to current author %s, plugin author MingYi does not response for this.'] = '插件是插件,数据是数据;插件作者是插件作者,数据作者是数据作者。\n\n您刚刚加载的是数据作者【%s】的团队监控数据,它配置在插件作者【茗伊】编写的团队监控插件中。\n\n【%s】是数据作者不负责插件功能问题,【茗伊】是插件作者不负责具体数据问题,需要反馈问题时请注意分别。\n\n例如:出现奇怪的目标血条颜色、错误的提示、莫名的自动喊话,又或是过多的焦点列表、气劲监控、倒计时条,请尝试更换加载其他作者的数据,并且向当前数据作者【%s】反馈问题,插件作者【茗伊】不负责具体数据内容。', + + -- MY_TeamMon_Subscribe_FavoriteData.lua -- + ['Favorite list'] = '收藏数据', + ['Please input meta address:'] = '请输入订阅地址,添加多个使用分号分隔:', + + -- MY_TeamMon_VoiceAlarm.lua + ['MY_TeamMon_VoiceAlarm'] = '语音包', + ['Current loaded data recommend voice packet %s, do you want to download and use?'] = '当前数据推荐使用语音包:%s,是否下载并启用推荐的语音包?', + ['Official voice packet download success, but your settings prefer use custom voice packet, do you want to change it?'] = '官方语音包下载成功,但当前设置为优先使用非官方语音包,是否一键修改为优先使用官方语音包?', + ['Custom voice packet download success, but your settings prefer use official voice packet, do you want to change it?'] = '语音包下载成功,但当前设置为优先使用官方语音包,是否一键修改为优先使用非官方语音包?', + ['AND_COMMA'] = '、', + + -- MY_TeamMon_Subscribe_VoicePacket_Official.lua -- + ['See details'] = '查看详情', + ['Downloading...'] = '下载中...', + ['Can update'] = '有更新', + ['Current selected'] = '使用中', + ['Select'] = '使用', + ['Author'] = '作者', + ['Title'] = '标题', + ['Refresh list'] = '刷新列表', + ['Preview voice'] = '预览语音', + ['Prev page'] = '上一页', + ['Next page'] = '下一页', + ['Title: %s'] = '标题:%s', + ['Author: %s'] = '作者:%s', + ['Update at: %s'] = '最后更新于:%s', + ['Voice packet official'] = '官方语音', + ['Voice packet custom'] = '更多语音', + + -- MY_TeamMon_Subscribe_MergeDataSlice.lua + ['Please input data slice id:'] = '请输入数据唯一标识:', + ['Invalid data slice data response.'] = '获取数据失败。', + ['Invalid data slice data response payload.'] = '未知的数据载体类型。', + ['Sure to merge this data? conflict item will be overwritten.\n\nTitle: %s\nDesc: %s\nType: %s\nRecord Name: %s\nCreate at: %s\nUpdate at: %s'] = '确认要合并加载该数据吗?相同条目的数据将会被覆盖。\n\n标题:%s\n描述:%s\n类型:%s\n目标:%s\n创建时间:%s\n更新时间:%s', + ['Load data slice success.'] = '合并数据条目成功。', + ['Load data slice [%s] success.'] = '成功合并数据条目:[%s]。', + ['Load data slice failed.'] = '合并数据条目失败。', + + + -- MY_TeamMon_VoiceAlarm_Previewer.lua + ['Preview official voice'] = '预览官方语音', + ['Preview custom voice'] = '预览插件语音', + ['Voice title'] = '标题', + ['Voice preview'] = '预览', + ['Not exist'] = '无', + ['Voice not exist in current packet'] = '当前语音包不包含该条语音', + ['Click to play'] = '点击播放', + ['Voice slug name has been copied to clipboard'] = '语音标识已复制到剪切板', +} diff --git a/MY_TeamMon/lang/zhtw.jx3dat b/MY_TeamMon/lang/zhtw.jx3dat new file mode 100644 index 000000000..3fc450233 --- /dev/null +++ b/MY_TeamMon/lang/zhtw.jx3dat @@ -0,0 +1,381 @@ +return { + ['MY_TeamMon'] = '鍦橀殜鐩f帶', + ['Leave map %s.'] = '浣犲凡闆㈤枊鍦板湒銆%s銆戙', + ['Enter map %s.'] = '浣犲凡閫插叆鍦板湒銆%s銆戙', + ['Encrypt and compressing: '] = '鏇存柊鍔犲瘑澹撶府锛', + ['Manage my online data'] = '绠$悊鎴戠殑鍦ㄧ窔鏁告摎', + -- MY_TeamMon_CenterAlarm.lua -- + ['MY_TeamMon_CenterAlarm'] = '涓ぎ鎻愰啋', + -- MY_TeamMon_CircleLine.lua -- + ['MY_TeamMon_CircleLine'] = '鍦堝湀閫g窔', + -- MY_TeamMon_BuffList.lua -- + ['MY_TeamMon_BuffList'] = '鑷韩姘e媮鍒楄〃', + -- MY_TeamMon_PartyBuffList.lua -- + ['MY_TeamMon_PartyBuffList'] = '鍦橀殜閲嶈姘e媮鍒楄〃', + ['Mouse enter select'] = '婊戦紶婊戦亷閬镐腑鐩', + -- MY_TeamMon_LargeTextAlarm.lua -- + ['MY_TeamMon_LargeTextAlarm'] = '鐗瑰ぇ鏂囧瓧', + ['Font scale'] = '瀛楅珨绺斁', + ['Pause time'] = '鍋滅暀鏅傞枔', + ['FadeIn time'] = '娣″叆鏅傞枔', + ['FadeOut time'] = '娣″嚭鏅傞枔', + ['Preview'] = '闋愯', + ['PVE everyday, Xuanjing everyday!'] = '姣忓ぉ涓鍊嬫湰锛屽懆鍛ㄨ鐜勬櫠锛', + -- MY_TeamMon_UI.lua -- + ['Set countdown key'] = '瑷疆鍊掕▓鏅傚敮涓妯欒瓨', + ['Key supports template render: {$sender}, {$receiver}, {$1}'] = '鍞竴妯欒瓨鏀寔妯℃澘瀛楀厓涓诧細{$sender}, {$receiver}, {$1}', + ['Hold countdown when crossmap'] = '鍊掕▓鏅傞亷鍦栦笉娑堝け', + ['Hold countdown when unfight'] = '鍊掕▓鏅傝劔鎴颁笉娑堝け', + ['Countdown key'] = '鍊掕▓鏅傚敮涓妯欒瓨', + ['Clear record'] = '娓呯┖瑷橀寗', + ['The map does not exist'] = '閫欏嬪湴鍦栦笉瀛樺湪', + ['Common / uncategorized'] = '閫氱敤/鍏朵粬', + ['All'] = '鍏ㄩ儴', + ['All data'] = '鍏ㄩ儴鐨勬暩鎿', + ['Common data'] = '閫氱敤鐨勬暩鎿', + ['City data'] = '涓诲煄鐨勬暩鎿', + ['Dungeon data'] = '绉樺鐨勬暩鎿', + ['Team dungeon data'] = '灏忛殜绉樺鐨勬暩鎿', + ['Raid dungeon data'] = '鍦橀殜绉樺鐨勬暩鎿', + ['Starve data'] = '娴琛岀殑鏁告摎', + ['Village data'] = '閲庡鐨勬暩鎿', + ['Arena data'] = '鍚嶅妽澶ф渻鐨勬暩鎿', + ['Battlefield data'] = '鎴板牬鐨勬暩鎿', + ['Pubg data'] = '绲曞鎴板牬鐨勬暩鎿', + ['Zombie data'] = '鏉庢浮楝煎煙鐨勬暩鎿', + ['Monster data'] = '鐧炬埌鐨勬暩鎿', + ['Moba data'] = '鍒楁槦铏涘鐨勬暩鎿', + ['Homeland data'] = '瀹跺湌鐨勬暩鎿', + ['Roguelike data'] = '鍏崚琛¢憭鐨勬暩鎿', + ['Competition data'] = '绔舵妧鍦板湒鐨勬暩鎿', + ['Camp data'] = '闄g嚐鍦板湒鐨勬暩鎿', + ['Stronghold data'] = '鎿氶粸鍦板湒鐨勬暩鎿', + ['School data'] = '闁娲惧湴鍦栫殑鏁告摎', + ['Guild territory data'] = '骞渻闋樺湴鐨勬暩鎿', + ['Recycle bin'] = '鍥炴敹绔', + ['Recycle bin data'] = '鍥炴敹绔欑殑鏁告摎', + ['['] = '銆', + [']'] = '銆', + ['Data exists, editor?'] = '鏁告摎宸茬稉瀛樺湪锛屾槸鍚︾法杓紵', + + ['MY_TeamMon DEBUG Panel'] = '鍦橀殜鐩f帶娓│闈㈡澘', + ['Sure to delete?'] = '纰鸿獚瑕佸埅闄わ紵', + ['Clear this map data'] = '娓呯┖鍒嗛涓嬫暩鎿氾紙灏忓績锛', + ['%s share a %s data to you, accept?'] = '銆%s銆戝叡浜簡涓鍊嬨%s銆戞暩鎿氱郸浣狅紝鎺ユ敹锛', + ['Share data'] = '鍏变韩鏁告摎', + ['Manual input'] = '鎵嬪嫊杓稿叆', + ['Battle of Taiyuan'] = '澶師涔嬫埌路', + ['YongWangXingGong'] = '姘哥帇琛屽路', + ['Self kungfu requirement'] = '鑷韩蹇冩硶瑕佹眰', + ['No request'] = '娌掓湁瑕佹眰', + ['INFINITE'] = '鈭', + ['Raw data, please be careful'] = '鏌ョ湅鍘熷鏁告摎锛堝儏渚涘弮鑰冿級', + ['%s call name'] = '琚%s銆戦粸鍚嶄簡', + ['MY_TeamMon config panel'] = '鍦橀殜鐩f帶瑷疆闈㈡澘', + ['BUFF'] = '鏈夊埄姘e媮', + ['DEBUFF'] = '涓嶅埄姘e媮', + ['CASTING'] = '姝﹀鎷涘紡', + ['DOODAD'] = '浜や簰鐗╀欢', + ['NPC'] = '绯荤当瑙掕壊', + ['TALK'] = '瑙掕壊鍠婅┍', + ['CHAT'] = '绯荤当闋婚亾', + ['Interval time'] = '闁撻殧鏅傞枔', + ['Casting'] = '姝e湪閲嬫斁', + ['use of'] = '閲嬫斁浜', + ['Get buff'] = '鐛插緱姘e媮 ', + [', remain time %s'] = '锛屽墿椁樻寔绾屾檪闁%s', + ['%ds'] = '%d绉', + [','] = '锛', + ['.'] = '銆', + ['Lose buff'] = '澶卞幓姘e媮 ', + ['Appear'] = '鍑虹従', + ['Disappear'] = '娑堝け', + ['[%s] enter %s'] = '[%s]鍑虹従锛%s', + ['[%s] disappear'] = '[%s]娑堝け', + ['Skills cast succeed'] = '鎷涘紡鎴愬姛閲嬫斁', + ['Skills began to cast'] = '鎷涘紡闁嬪閬嬪姛', + ['Team'] = '鍦橀殜', + ['Enemy'] = '鏁靛皪', + ['Scrutiny type'] = '鐩f帶灏嶈薄椤炲瀷', + ['Buffcount achieve'] = '灞ゆ暩蹇呴爤閬斿埌', + ['Count achieve'] = '鏁搁噺閬斿埌', + ['Must all leave scene'] = '蹇呴爤鍏ㄩ儴娑堝け', + ['Enter scene'] = '閫插叆鍫存櫙', + ['Leave scene'] = '闆㈤枊鍫存櫙', + ['All leave scene'] = '鍏ㄩ儴闆㈤枊鍫存櫙', + ['Check level'] = '鍗鍒嗙瓑绱', + ['Mark'] = '妯欒', + ['Voice'] = '瑾為煶鍫辫', + ['Buff target must be myself'] = '鍍呰嚜韬埃鍕', + ['No voice'] = '鐒', + ['Center alarm'] = '涓ぎ鍫辫', + ['Voice alarm'] = '瑾為煶鍫辫', + ['Large text alarm'] = '鐗瑰ぇ鏂囧瓧鍫辫', + ['Lifebar alarm'] = '闋爞鍫辫', + ['Fullscreen alarm'] = '鍏ㄥ睆娉涘厜鍫辫', + ['Team channel alarm'] = '鍦橀殜闋婚亾鍫辫', + ['Whisper channel alarm'] = '瀵嗚亰闋婚亾鍫辫', + ['Party buff list'] = '鍦橀殜姘e媮鍒楄〃', + ['Buff list'] = '鑷韩姘e媮鍒楄〃', + ['Team panel'] = '鍦橀殜闈㈡澘', + ['Only source self'] = '鍍呴’绀轰締婧愯嚜宸辩殑姘e媮', + ['Auto Select'] = '鑷嫊閬镐腑鐩', + ['Auto Cancel Buff'] = '鑷嫊鍗搁櫎姘e媮', + ['Requires MY_LifeBar loaded.'] = '闇杓夊叆涓﹀暉鐢ㄩ牠闋傝姊', + ['Requires MY_LifeBar loaded.\nDue to official logic, only target is visible.'] = '闇杓夊叆涓﹀暉鐢ㄩ牠闋傝姊漒n鐢辨柤瀹樻柟闄愬埗锛屽儏鐩閬嬪姛鐙鎱嬪彲椤ず', + ['Voice alarm function'] = '瑾為煶鍫辫鍔熻兘閬搁爡', + ['Show voice recommendation confirm on load data'] = '杓夊叆鏁告摎鏅傞’绀烘帹钖﹁獮闊冲寘', + ['Prefer use official voice'] = '鍎厛鎾斁瀹樻柟瑾為煶', + ['OfficialVoicePacketID'] = '鐣跺墠瀹樻柟瑾為煶鍖匢D', + ['CustomVoicePacketID'] = '鐣跺墠鑷畾缇╄獮闊冲寘ID', + ['Add countdown'] = '娣诲姞鍊掕▓鏅', + ['Press CTRL click for advance menu'] = '鎸変綇CTRL榛炴搳鍙煡鐪嬮珮绱氶伕闋', + ['Please select type'] = '璜嬮伕鎿囬鍨', + ['Countdown TYPE 0'] = '鍏朵粬', -- OTHER + ['Countdown TYPE 1'] = '鐛插緱姘e媮', -- BUFF_GET + ['Countdown TYPE 2'] = '澶卞幓姘e媮', -- BUFF_LOSE + ['Countdown TYPE 3'] = '瑙掕壊閫插叆鍫存櫙', -- NPC_ENTER + ['Countdown TYPE 4'] = '瑙掕壊闆㈤枊鍫存櫙', -- NPC_LEAVE + ['Countdown TYPE 5'] = '瑙掕壊鍠婅┍', -- NPC_TALK + ['Countdown TYPE 6'] = '瑙掕壊姘h鍫辫', -- NPC_LIFE + ['Countdown TYPE 7'] = '瑙掕壊閫插叆鎴伴', -- NPC_FIGHT + ['Countdown TYPE 8'] = '鎷涘紡闁嬪閬嬪姛', -- SKILL_BEGIN + ['Countdown TYPE 9'] = '鎷涘紡鎴愬姛閲嬫斁', -- SKILL_END + ['Countdown TYPE 10'] = '绯荤当鍠婅┍', -- SYS_TALK + ['Countdown TYPE 11'] = '瑙掕壊鍏ㄩ儴闆㈤枊鍫存櫙', -- NPC_ALLLEAVE + ['Countdown TYPE 12'] = '瑙掕壊姝讳骸', -- NPC_DEATH + ['Countdown TYPE 13'] = '瑙掕壊鍏ㄩ儴姝讳骸', -- NPC_ALLDEATH + ['Countdown TYPE 14'] = '瑙哥櫦鍠婅┍', -- TALK_MONITOR + ['Countdown TYPE 15'] = '瑙哥櫦鍠婅┍', -- COMMON + ['Countdown TYPE 16'] = '瑙掕壊鍏у姏鍫辫', -- NPC_MANA + ['Countdown TYPE 17'] = '浜や簰鐗╀欢鍑虹従', -- + ['Countdown TYPE 18'] = '浜や簰鐗╀欢娑堝け', -- + ['Countdown TYPE 19'] = '浜や簰鐗╀欢鍏ㄩ儴娑堝け', -- + ['Countdown TYPE 20'] = '瑙哥櫦鐩h伣绯荤当淇℃伅', -- + ['NPC can not change the icon'] = '鐒℃硶鏇存敼绯荤当瑙掕壊鐨勫湒妯', + ['Warning box'] = '绯荤当璀﹀憡妗', + ['Alert content'] = '鍫辫鍏у', + ['Tips: {$me} behalf of self, {$team} behalf of team.'] = '灏忔彁绀猴細{$me} 浠h〃鑷繁鐨勫悕瀛楋紝{$team} 浠h〃鍦樼帺瀹剁殑鍚嶅瓧銆', + ['Partical search'] = '妾㈢储鍖归厤', + ['Supports match partical.'] = '鍕鹃伕寰岋紝浠绘剰閮ㄥ垎涓鑷村嵆鍙尮閰嶆垚鍔燂紝鏈冮犳垚灏戦噺鎬ц兘鎼嶈椼', + ['Regexp match'] = '姝e墖鍖归厤', + ['Supports backreference in note string, format: {$index}.'] = '鍟熺敤姝e墖鍖归厤寰屽牨璀﹀収瀹规敮鎸佸紩鐢ㄦ崟鐛诧紝鏍煎紡鐐衡渰$鎹曠嵅涓嬫}鈥濄俓n姝e墖鍖归厤鎬ц兘娑堣楄純澶э紝寤鸿鍚屼竴鍦板湒鍚屾檪涓嶈秴閬5姊濓紝閬庡害浣跨敤鍙兘褰遍熆娓告埐骞鐜囥俓n闂滄柤鈥滄鍓囧尮閰嶁濆拰鈥滄崟鐛茬祫鈥濈煡璀橈紝璜嬭嚜琛屾悳绱⑩淟UA姝e墖鈥濈浉闂滅煡璀樸', + ['Speaker'] = '鍠婅┍灏嶈薄', + ['Content'] = '鍠婅┍鍏у', + ['Chat content'] = '绯荤当鍠婅┍', + ['Trigger talk'] = '瑙哥櫦鍠婅┍', + ['Trigger chat'] = '瑙哥櫦绯荤当鍠婅┍', + ['Add focus'] = '娣诲姞鐒﹂粸', + ['Add cataclysm buff'] = '娣诲姞鍦橀殜闈㈡澘姘e媮鐩f帶', + ['TC'] = '闅', + ['is calling'] = '榛', + ['\'s name.'] = '鍚嶄簡銆', + ['JX3'] = '鍔嶇恫3', + ['Life/mana statement.\n\nExample: 0.7-,Remain 70%;0.5-,Remain Half,2;0.01-,Almost empty,5'] = '姘h/鍏у姏鐩f帶鍏у\n\n鏍煎紡锛氬墿椁橀噺[鏁稿艰畩鍖栨柟鍚慮,鎻愮ず瑾瀃,鏅傞枔杌搁’绀烘檪闀穄\n绀轰緥锛0.7,鍓╀笅70%,VO:cccc;0.5-,鍓╀笅涓鍗,2,VO:cccc;0.01,蹇矑浜,5\n娉ㄦ剰锛歕n鈶 鏈澶氭敮鎸佸埌灏忔暩榛炲緦鍏╀綅锛屽嵆涓嶆敮鎸佸鈥0.751鈥濆娉曘俓n鈶 鏁稿艰畩鍖栨柟鍚戯紙鍙伕锛夋湁鏁堝肩偤鈥-鈥濊〃绀烘笡灏戯紝鈥+鈥濊〃绀哄鍔狅紝鈥*鈥濊〃绀轰笉闄愬埗銆俓n鈶 鏅傞枔杌搁’绀烘檪闀凤紙鍙伕锛夊鏋滀笉濉皣涓嶆渻鍑虹従鏅傞枔杌告彁绀恒', + ['Raid talk warning'] = '鍦橀殜鍠婅┍鍫辫', + ['Simple countdown text'] = '鏅氬掕▓鏅傛彁绀鸿獮', + ['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called'] = '瑷伙細浣跨敤ID瑙f瀽涓插彲闃叉鍏у琚睆钄斤紝鏀寔鐨勬ā寮忓涓嬶紙鍖呭惈鑺辨嫭寮э級锛歕n1. {$B188} ID鐐188鐨勬埃鍕佸悕绋盶n2. {$B188,2} ID鐐188锛岀瓑绱氱偤2鐨勬埃鍕佸悕绋盶n3. {$S188} ID鐐188鐨勬瀛告嫑寮忓悕绋盶n4. {$S188,2} ID鐐188锛岀瓑绱氱偤2鐨勬瀛告嫑寮忓悕绋盶n5. {$N188} 妯℃澘ID鐐188鐨勭郴绲辫鑹插悕绋盶n6. {$D188} 妯℃澘ID鐐188鐨勪氦浜掔墿浠跺悕绋盶n7. {$M188} 鍦板湒ID鐐188鐨勫牬鏅悕绋盶n8. {$me} 鑷繁鐨勫悕瀛梊n9. {$sender} 瑭蹭簨浠剁櫦璧疯呯殑鍚嶅瓧锛屽榛炲悕鑰匼n10. {$receiver} 瑭蹭簨浠跺彈褰遍熆鑰呯殑鍚嶅瓧锛屽琚粸鍚嶇殑闅婂弸', + ['Notice: spell timer starts with VO: means play voice while this part active.'] = '瑷伙細浣跨敤鈥淰O:鈥濋枊闋殑閰嶇疆娈佃〃绀鸿┎娈靛掕▓鏅傚暉鍕曟檪鎾斁鎸囧畾鐨勮獮闊冲牨璀︺', + ['Please input simple countdown text...'] = '璜嬭几鍏ユ櫘閫氬掕▓鏅傛彁绀鸿獮...', + ['Simple countdown time or multi countdown statement. Input pure number for simple countdown time, otherwise for multi countdown statement.\n\nMulti countdown example: 10,Countdown1;25,Countdown2;55,Countdown3\nExplain: Countdown1 finished will start Countdown2, so as Countdown3.'] = '杓稿叆绱旀暩瀛楄〃绀烘櫘閫氬掕▓鏅傛檪闁擄紝鍚﹀墖琛ㄧず鍒嗘鍊掕▓鏅傘俓n\n鍒嗘鍊掕▓鏅傜ず渚嬶細10,鍊掕▓鏅1;25,鍊掕▓鏅2,VO:cccc;55,鍊掕▓鏅3,VO:cccc\n绀轰緥瑙i噵锛歔鍊掕▓鏅1]绲愭潫鍐嶈Ц鐧糩鍊掕▓鏅2]锛堢暥鍓嶅掕▓鏅傝ō缃殑瑙哥櫦鏅傞枔-宸查亷鏅傞枔锛15绉掔殑鍊掕▓鏅傦紝涓︽挱鏀惧掕▓鏅2鐨勮獮闊冲牨璀︼紝[鍊掕▓鏅2]銆乕鍊掕▓鏅3]浠ユ椤炴帹銆傚掕▓鏅傜殑鏁搁噺涓嶉檺锛屽彲鑷敱濉锛屽父鐢ㄦ柤棣栭牁閫插叆鎴伴寰岄枊濮嬬殑闅庢鍊掕▓鏅傘俓n\n鐗瑰垾锛歕n鐣跺掕▓鏅傛檪闁撹ō缃偤鈥0鈥濇檪锛岃〃绀哄緸宸插瓨鍦ㄧ殑鍊掕▓鏅備腑鎵惧埌鑸囪┎姊濊ō缃爡鍞竴妯欒瓨鐩稿悓鐨勫掕▓鏅傦紝鍒櫎鍊掕▓鏅傛锛屼甫娓呯┖灏嶆噳CD鏅傞枔銆俓n鐣跺掕▓鏅傛檪闁撹ō缃偤鈥-1鈥濇檪锛岃〃绀哄緸宸插瓨鍦ㄧ殑鍊掕▓鏅備腑鎵惧埌鑸囪┎姊濊ō缃爡鍞竴妯欒瓨鐩稿悓鐨勫掕▓鏅傦紝鍒櫎鍊掕▓鏅傛锛屼絾涓嶆竻绌哄皪鎳夌殑CD鏅傞枔銆俓n鐣跺掕▓鏅傛檪闁撹ō缃偤鈥-2鈥濇檪锛岃〃绀哄緸宸插瓨鍦ㄧ殑鍊掕▓鏅備腑鎵惧埌鑸囪┎姊濊ō缃爡鍞竴妯欒瓨鐩稿悓鐨勫掕▓鏅傦紝涓︽竻绌篊D鏅傞枔锛屼絾鏄笉鍒櫎姝e湪椤ず鐨勫掕▓鏅傛銆', + ['(OPERATOR +)'] = '鈫', + ['(OPERATOR -)'] = '鈫', + ['Official voice'] = '瀹樻柟瑾為煶', + ['Custom voice'] = '鏇村瑾為煶', + ['Unknown voice'] = '鏈煡瑾為煶', + ['Max repeat time\n\nWhen countdown get trigger again, the last countdown may get overwritten. This config is to sovle this problem, input time limit here to ensure in this time period, countdown will not be trigger again.'] = '閲嶈瑾跨敤鏅傞枔闄愬埗\n\n鐣跺掕▓鏅傝鍐嶆瑙哥櫦鏅傦紝鍙兘鏈冨皫鑷村墠涓娆″掕▓鏅傝瑕嗚搵锛岃┎瑷疆灏辨槸瑙f焙閫欏嬪晱椤岋紝鍦ㄦ鐩存帴杓稿叆鏅傞枔鍗冲彲淇濊瓑鍦ㄩ欐鏅傞枔鍏т笉鏈冨啀娆¤閲嶈鍚屾ǎ鐨勫掕▓鏅傘傝珛娉ㄦ剰锛屽垎娈靛掕▓鏅傞粯瑾嶅彇鏈澶х殑鏅傞枔浣滅偤閲嶈瑾跨敤鏅傞枔闄愬埗锛岀暥鐒舵偍涔熷彲浠ヨ嚜鐢辨洿鏀广', + ['Class'] = '鍒嗛', + ['Succeed'] = '鎿嶄綔鎴愬姛', + ['Same data exist'] = '瀛樺湪鐩稿悓鐨勬暩鎿', + ['This data'] = '閫欏嬫暩鎿', + ['Open data panel'] = '鎵撻枊鏁告摎瑷疆', + ['Open/close MY_TeamMon'] = '鎵撻枊/闂滈枆鍦橀殜鐩f帶', + ['Add'] = '娣诲姞', + ['Edit icon'] = '淇敼鍦栨', + ['Edit color'] = '淇敼椤忚壊锛堝牨璀﹂氱敤椤忚壊锛', + ['Clear color'] = '娓呯┖椤忚壊', + ['Edit name'] = '淇敼鍚嶇ū', + ['MY_TeamMon is blocked in current kungfu, temporary disabled.'] = '鐣跺墠蹇冩硶绂佹浣跨敤鍦橀殜鐩f帶锛岀浉闂滃姛鑳藉凡鏆檪闂滈枆銆', + ['MY_TeamMon is shielded other player in this map, temporary disabled.'] = '鐣跺墠鍦板湒绂佹浣跨敤鍦橀殜鐩f帶鍏朵粬鐜╁锛岀浉闂滃姛鑳藉凡鏆檪闂滈枆銆', + ['Add to monitor list'] = '娣诲姞鍒扮洠鎺у垪琛', + ['(player)'] = '锛堢帺瀹讹級', + ['Subscribe data'] = '瑷傞柋鍦ㄧ窔鏁告摎銆佽獮闊冲寘', + ['Merge data slice'] = '蹇熻級鍏ュ湪绶氭暩鎿氭鐩', + ['Import local data'] = '灏庡叆鏈湴鏁告摎', + ['Export local data'] = '灏庡嚭鏈湴鏁告摎', + ['Clear local data'] = '娓呯┖鏈湴鏁告摎', + ['Data voice subscribe'] = '鏁告摎瑾為煶瑷傞柋', + ['Preview voice packet'] = '闋愯鐣跺墠瑾為煶', + ['Preview official voice packet'] = '闋愯瀹樻柟瑾為煶', + ['Preview custom voice packet'] = '闋愯鎻掍欢瑾為煶', + ['Are you sure to clear local data? All team mon data will be removed totally, this is not reversible.'] = '纰哄畾瑕佹竻绌烘湰鍦版暩鎿氾紵鎵鏈夊湗闅婄洠鎺ф暩鎿氶厤缃皣鏈冭寰瑰簳鍒櫎锛屾暩鎿氭竻绌烘搷浣滃緦鐒℃硶鎾ら姺銆', + ['Browse'] = '鐎忚', + ['Load config success: %s'] = '鏁告摎杓夊叆鎴愬姛锛%s', + ['Load config failed: %s'] = '鏁告摎杓夊叆澶辨晽锛%s', + ['Open data folder'] = '鎵撻枊鏁告摎鏂囦欢澶', + ['Includes'] = '鍖呮嫭', + ['File name'] = '鏂囦欢鍚', + ['File format'] = '鏂囦欢鏍煎紡锛堜笉鏄庣櫧涓嶉渶瑕佹洿鏀癸紝灏庡叆涓嶆敮鎸丣SON锛', + ['Author name'] = '浣滆', + ['Unknown author'] = '浣氬悕', + ['Lua encrypted'] = '鍔犲瘑澹撶府鏍煎紡', + ['Lua plain'] = '鍠鍘熷鏍煎紡', + ['Lua formated'] = '澶氳绺叉牸寮', + ['JSON'] = 'JSON', + ['JSON formated'] = '澶氳绺 JSON', + ['Export success: %s'] = '灏庡嚭鎴愬姛锛%s', + ['Import success: %s'] = '灏庡叆鎴愬姛锛%s', + ['Import failed: %s'] = '灏庡叆澶辨晽锛%s', + ['Import mode'] = '灏庡叆妯″紡', + ['Cover'] = '瑕嗚搵锛堟帹钖︼級', + ['Merge priority old file'] = '鍚堜降锛堝師鏂囦欢鍎厛锛屼笉鎺ㄨ枽锛', + ['Merge priority new file'] = '鍚堜降锛堟柊鏂囦欢鍎厛锛', + ['Show target name'] = '椤ず鐩鍚嶇ū', + -- ['Add content'] = '瑁滃厖鍫辫鍏у', + ['Add content'] = '鍌欐敞淇℃伅', + ['Search map'] = '鎼滅储鍦板湒', + ['Search content'] = '鎼滅储鍏у', + ['Global search'] = '鍏ㄥ眬鎼滅储', + ['Trigger preview'] = '瑙哥櫦鍣ㄩ爯瑕', + ['Countdown preview'] = '鍊掕▓鏅傞爯瑕', + ['Master switch'] = '鎻掍欢绺介枊闂', + ['Enable MY_TeamMon'] = '闁嬪暉鍦橀殜鐩f帶鎻掍欢', + ['Enable circle'] = '鍟熺敤鐣湀', + ['Circle border'] = '鍦堝湀閭婃', + ['Enable alarm (master switch)'] = '鍟熺敤鍫辫妯″锛堢附闁嬮棞锛', + ['Team panel bind show buff'] = '鍦橀殜闈㈡澘闂滆伅姘e媮椤ず', + ['Max buff count'] = '鏈澶ч’绀烘暩閲', + ['Buff size'] = '姘e媮鏍煎瓙澶у皬', + ['Data save mode'] = '鏁告摎淇濆瓨妯″紡', + ['Use common data'] = '浣跨敤閫氱敤鏁告摎锛堝嵆鐣跺墠瑙掕壊鍜屽叾浠栬鑹插叡鐢ㄥ悓涓鍊嬫暩鎿氾級', + ['\'s life remaining to '] = '鐨勮閲忓墿椁', + ['\'s mana reaches '] = '鐨勫収鍔涢仈鍒', + ['File does not exist.'] = '鏂囦欢涓嶅瓨鍦ㄣ', + ['Can not read data file.'] = '鏂囦欢鏍煎紡閷鎴栫劇娉曡畝鍙栥', + ['Data conflict'] = '鏁告摎琛濈獊', + ['Data conflict, please check.'] = '鏈夋暩鎿氳绐侊紝璜嬬暀鎰忚亰澶╂鐨勬彁绀恒俓n\t閫欑ó鎯呮硜涓鑸敱鏂煎悎浣垫暩鎿氶犳垚锛岃珛鏍规摎鎻愮ず鎼滅储鐩告噳ID锛屾偍鏈冪櫦鐝炬湁澶氬嬬浉鍚岀殑ID鏁告摎锛屼絾娌掓湁鍗鍒嗗叾绛夌礆锛岃珛鍒櫎鐩稿悓鐨勬暩鎿氭垨鑰呭嬀閬稿崁鍒嗙瓑绱氾紝闆栫劧琛濈獊涓︿笉鏈冨奖闊挎彃浠舵甯稿伐浣滐紝浣嗙敱鏂兼彃浠剁殑绶╁瓨姗熷埗锛岄欏彲鑳藉皫鑷存彃浠舵姄鍙栭尟瑾ょ殑绶╁瓨锛屽緸鑰岃嚧浣胯绐佺殑鐩f帶涓嶇敓鏁堬紝濡傛灉鎮ㄦ槸鏁告摎浣滆呰珛鍙婃檪淇敼锛屼甫淇濇寔鑹ソ缈掓叄锛屽鏋滄偍鏄櫘閫氱敤鎴朵笉鏈冧慨鏀瑰彲浠ラ伕鎿囩劇瑕栥', + + ['Circle and line'] = '鍦堝湀閫g窔', + ['Draw line'] = '绻=閫g窔', + ['Only when stare me'] = '鍍呯暥娉ㄨ鎴', + ['Degree'] = '搴', + ['Meter'] = '灏', + ['Alpha'] = '閫忔槑搴', + ['Only my employer'] = '鍙躬瑁藉爆鏂兼垜鐨', + ['Draw Border'] = '绻=閭婃', + ['Draw name'] = '绻=鍚嶇ū', + ['Add circle'] = '娣诲姞鍦堝湀', + -- MY_TeamMon_SpellTimer.lua -- + ['MY_TeamMon_SpellTimer'] = '鍦橀殜瑷堟檪', + ['Countdown configure'] = '鏅傞枔杌搁’绀', + ['Countdown format error'] = '鍊掕▓鏅傛牸寮忛尟瑾', + ['[%s] remaining %ds.'] = '銆%s銆 鍓╅ %d 绉掋', + ['Countdown'] = '鍊掕▓鏅', + ['Focuslist'] = '鐒﹂粸鍒楄〃', + ['Team panel buff rule list'] = '鍦橀殜闈㈡澘姊濅欢鐩f帶', + ['Add buff rule'] = '娣诲姞姊濅欢鐩f帶', + ['Never show decimal.'] = '寰炰笉椤ず灏忔暩榛炪', + ['Always show decimal.'] = '绺芥槸椤ず灏忔暩榛炪', + ['Show countdown decimal settings'] = '鍊掕▓鏅傚皬鏁搁粸瑷疆', + ['Show countdown decimal when duration below: %ds.'] = '鍊掕▓鏅傚墿椁%d绉掓檪椤ず灏忔暩榛炪', + -- MY_TeamMon_Subscribe.lua -- + ['MY_TeamMon_Subscribe'] = '鍦橀殜鐩f帶路鏁告摎瑷傞柋', + ['Default'] = '榛樿獚', + ['Default monitor data'] = '榛樿獚鏁告摎', + ['ERR: Decode info content as json failed!'] = '閷锛氭弿杩版枃浠惰В鏋愬け鏁楋紒', + ['ERR: Info content is illegal!'] = '閷锛氭弿杩版枃浠舵暩鎿氱祼妲嬩笉绗﹀悎绱勬潫锛', + ['Fetch repo meta list failed.'] = '鐛插彇鎺ㄨ枽鏁告摎澶辨晽銆', + ['ERR404: MetaInfo address not found!'] = '閷404锛氳▊闁卞湴鍧涓嶅瓨鍦紒', + ['New version found for TeamMon_RR\nSURL: %s\nName: %s\nTime: %s\n\nDo you want to update data now?'] = '鍦橀殜鐩f帶鏁告摎瑷傞柋鏈夋洿鏂癨n鐭張锛%s\n妯欓锛%s\n鏅傞枔锛%s\n\n鏄惁绔嬪嵆涓嬭級鏇存柊鏁告摎锛', + ['Update'] = '鏇存柊', + ['Skip current version'] = '璺抽亷姝ょ増鏈', + ['Downloading in progress, please wait...'] = '鏁告摎涓嬭級姝e湪閫茶涓紝璜嬬◢寰...', + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['Decode %s failed!'] = '瑙g⒓[%s]澶辨晽锛', + -- MY_TeamMon_Subscribe_Data.lua -- + ['Subscribe list'] = '鎺ㄨ枽鏁告摎', + ['Please select one dataset first!'] = '璜嬪厛閬告搰涓鍊嬫暩鎿氶爡锛', + ['Author'] = '浣滆', + ['Title'] = '妯欓', + ['See details'] = '鏌ョ湅瑭虫儏', + ['Last select'] = '涓婃閬告搰', + ['Can update'] = '鏈夋洿鏂', + ['Download'] = '涓嬭級', + ['Fetching...'] = '鐛插彇涓...', + ['Downloading...'] = '涓嬭級涓...', + ['You are not in the team.'] = '浣犱笉鍦ㄩ殜浼嶄腑銆', + ['You are not team leader.'] = '浣犱笉鏄殜闀凤紝鐒℃硶鍩疯閫欏嬫搷浣溿', + ['Confirm?'] = '纰哄畾鍩疯閫欏嬫搷浣滐紵', + ['%s request download:'] = '[%s]寤鸿涓嬭級瑭叉暩鎿氾細', + ['Title: %s'] = '妯欓锛%s', + ['Author: %s'] = '浣滆咃細%s', + ['%s loaded %s'] = '[%s]杓夊叆浜嗗湗闅婄洠鎺ф暩鎿氾細%s銆', + ['Upgrade TeamMon data to latest: %s'] = '鍦橀殜鐩f帶鏁告摎宸叉洿鏂拌嚦鏈鏂帮細%s銆', + ['Sync team'] = '鍚屾鍦橀殜', + ['Add favorite success, you can switch to favorite page to see.'] = '鏁告摎鏀惰棌鎴愬姛锛屽墠寰鏀惰棌鏁告摎鍒嗛爜鍗冲彲鏌ョ湅銆', + ['Add favorite'] = '鍔犲叆鏀惰棌', + ['Check update'] = '妾㈡煡鏇存柊', + ['Refresh list'] = '鍒锋柊鍒楄〃', + ['Prev page'] = '涓婁竴闋', + ['Next page'] = '涓嬩竴闋', + ['Add url'] = '娣诲姞瑷傞柋', + ['Remove url'] = '鍒櫎瑷傞柋', + ['Embedded dataset cannot be removed!'] = '鍏х疆鏁告摎涓嶅彲鍒櫎锛', + ['MetaInfo URL: %s'] = '瑷傞柋鍦板潃锛%s', + ['Update time: %s'] = '鏇存柊鏅傞枔锛%s', + ['(Short URL: %s)'] = '锛堢煭閺堬細%s锛', + ['Copy meta url'] = '瑜囪=瑷傞柋鍦板潃', + ['Copy short meta url'] = '瑜囪=鐭湴鍧', + ['Export meta url'] = '灏庡嚭瑷傞柋', + + ['Plugin is plugin, data is data, plugin author is plugin author, data author is data author..\nYou just loaded data\'s author is %s, it works on mingyi plugin team monitor addon.\n%s is data author, do not response for plugin problems. MingYi is plugin author, do not response for data problems.\n\nIf there is some strange headtop, focus, buff or talk, please try to use other author\'s data, and response to current author %s, plugin author MingYi does not response for this.'] = '鎻掍欢鏄彃浠讹紝鏁告摎鏄暩鎿氾紱鎻掍欢浣滆呮槸鎻掍欢浣滆咃紝鏁告摎浣滆呮槸鏁告摎浣滆呫俓n\n鎮ㄥ墰鍓涜級鍏ョ殑鏄暩鎿氫綔鑰呫%s銆戠殑鍦橀殜鐩f帶鏁告摎锛屽畠閰嶇疆鍦ㄦ彃浠朵綔鑰呫愯寳浼娿戠法瀵殑鍦橀殜鐩f帶鎻掍欢涓俓n\n銆%s銆戞槸鏁告摎浣滆呬笉璨犺铂鎻掍欢鍔熻兘鍟忛锛屻愯寳浼娿戞槸鎻掍欢浣滆呬笉璨犺铂鍏烽珨鏁告摎鍟忛锛岄渶瑕佸弽楗嬪晱椤屾檪璜嬫敞鎰忓垎鍒ャ俓n\n渚嬪锛氬嚭鐝惧鎬殑鐩琛姊濋鑹层侀尟瑾ょ殑鎻愮ず銆佽帿鍚嶇殑鑷嫊鍠婅┍锛屽張鎴栨槸閬庡鐨勭劍榛炲垪琛ㄣ佹埃鍕佺洠鎺с佸掕▓鏅傛锛岃珛鍢楄│鏇存彌杓夊叆鍏朵粬浣滆呯殑鏁告摎锛屼甫涓斿悜鐣跺墠鏁告摎浣滆呫%s銆戝弽楗嬪晱椤岋紝鎻掍欢浣滆呫愯寳浼娿戜笉璨犺铂鍏烽珨鏁告摎鍏у銆', + + -- MY_TeamMon_Subscribe_FavoriteData.lua -- + ['Favorite list'] = '鏀惰棌鏁告摎', + ['Please input meta address:'] = '璜嬭几鍏ヨ▊闁卞湴鍧锛屾坊鍔犲鍊嬩娇鐢ㄥ垎铏熷垎闅旓細', + + -- MY_TeamMon_VoiceAlarm.lua + ['MY_TeamMon_VoiceAlarm'] = '瑾為煶鍖', + ['Current loaded data recommend voice packet %s, do you want to download and use?'] = '鐣跺墠鏁告摎鎺ㄨ枽浣跨敤瑾為煶鍖咃細%s锛屾槸鍚︿笅杓変甫鍟熺敤鎺ㄨ枽鐨勮獮闊冲寘锛', + ['Official voice packet download success, but your settings prefer use custom voice packet, do you want to change it?'] = '瀹樻柟瑾為煶鍖呬笅杓夋垚鍔燂紝浣嗙暥鍓嶈ō缃偤鍎厛浣跨敤闈炲畼鏂硅獮闊冲寘锛屾槸鍚︿竴閸典慨鏀圭偤鍎厛浣跨敤瀹樻柟瑾為煶鍖咃紵', + ['Custom voice packet download success, but your settings prefer use official voice packet, do you want to change it?'] = '瑾為煶鍖呬笅杓夋垚鍔燂紝浣嗙暥鍓嶈ō缃偤鍎厛浣跨敤瀹樻柟瑾為煶鍖咃紝鏄惁涓閸典慨鏀圭偤鍎厛浣跨敤闈炲畼鏂硅獮闊冲寘锛', + ['AND_COMMA'] = '銆', + + -- MY_TeamMon_Subscribe_VoicePacket_Official.lua -- + ['See details'] = '鏌ョ湅瑭虫儏', + ['Downloading...'] = '涓嬭級涓...', + ['Can update'] = '鏈夋洿鏂', + ['Current selected'] = '浣跨敤涓', + ['Select'] = '浣跨敤', + ['Author'] = '浣滆', + ['Title'] = '妯欓', + ['Refresh list'] = '鍒锋柊鍒楄〃', + ['Preview voice'] = '闋愯瑾為煶', + ['Prev page'] = '涓婁竴闋', + ['Next page'] = '涓嬩竴闋', + ['Title: %s'] = '妯欓锛%s', + ['Author: %s'] = '浣滆咃細%s', + ['Update at: %s'] = '鏈寰屾洿鏂版柤锛%s', + ['Voice packet official'] = '瀹樻柟瑾為煶', + ['Voice packet custom'] = '鏇村瑾為煶', + + -- MY_TeamMon_Subscribe_MergeDataSlice.lua + ['Please input data slice id:'] = '璜嬭几鍏ユ暩鎿氬敮涓妯欒瓨锛', + ['Invalid data slice data response.'] = '鐛插彇鏁告摎澶辨晽銆', + ['Invalid data slice data response payload.'] = '鏈煡鐨勬暩鎿氳級楂旈鍨嬨', + ['Sure to merge this data? conflict item will be overwritten.\n\nTitle: %s\nDesc: %s\nType: %s\nRecord Name: %s\nCreate at: %s\nUpdate at: %s'] = '纰鸿獚瑕佸悎浣佃級鍏ヨ┎鏁告摎鍡庯紵鐩稿悓姊濈洰鐨勬暩鎿氬皣鏈冭瑕嗚搵銆俓n\n妯欓锛%s\n鎻忚堪锛%s\n椤炲瀷锛%s\n鐩锛%s\n鍓靛缓鏅傞枔锛%s\n鏇存柊鏅傞枔锛%s', + ['Load data slice success.'] = '鍚堜降鏁告摎姊濈洰鎴愬姛銆', + ['Load data slice [%s] success.'] = '鎴愬姛鍚堜降鏁告摎姊濈洰锛歔%s]銆', + ['Load data slice failed.'] = '鍚堜降鏁告摎姊濈洰澶辨晽銆', + + + -- MY_TeamMon_VoiceAlarm_Previewer.lua + ['Preview official voice'] = '闋愯瀹樻柟瑾為煶', + ['Preview custom voice'] = '闋愯鎻掍欢瑾為煶', + ['Voice title'] = '妯欓', + ['Voice preview'] = '闋愯', + ['Not exist'] = '鐒', + ['Voice not exist in current packet'] = '鐣跺墠瑾為煶鍖呬笉鍖呭惈瑭叉瑾為煶', + ['Click to play'] = '榛炴搳鎾斁', + ['Voice slug name has been copied to clipboard'] = '瑾為煶妯欒瓨宸茶瑁藉埌鍓垏鏉', +} diff --git a/MY_TeamMon/src/MY_TeamMon.PS.lua b/MY_TeamMon/src/MY_TeamMon.PS.lua new file mode 100644 index 000000000..9333fd1b5 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon.PS.lua @@ -0,0 +1,291 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon.PS' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local MY_TEAM_MON_REMOTE_DATA_ROOT = MY_TeamMon.MY_TEAM_MON_REMOTE_DATA_ROOT + +local PS = { nPriority = 11, szRestriction = 'MY_TeamMon' } + +function PS.IsRestricted() + return X.IsRestricted('MY_TeamMon') +end + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW = ui:Size() + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + local nLineH = 22 + + -- ui:Append('WndButton', { + -- x = 400, y = 20, text = g_tStrings.HELP_PANEL, + -- buttonStyle = 'FLAT', + -- onClick = function() + -- OpenInternetExplorer('https://github.com/luckyyyyy/JH/blob/dev/JH_DBM/README.md') + -- end, + -- }) + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nPaddingY, text = _L['Master switch'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndCheckBox', { + x = nPaddingX + 10, y = nY, text = _L['Enable MY_TeamMon'], + checked = MY_TeamMon.bEnable, + onCheck = function(bCheck) + MY_TeamMon.bEnable = bCheck + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + if not X.IsRestricted('MY_TeamMon_CircleLine') then + nX = ui:Append('WndCheckBox', { + x = nX + 5, y = nY, text = _L['Enable circle'], + checked = MY_TeamMon_CircleLine.bEnable, + onCheck = function(bCheck) + MY_TeamMon_CircleLine.bEnable = bCheck + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndCheckBox', { + x = nX + 5, y = nY, text = _L['Circle border'], + checked = MY_TeamMon_CircleLine.bBorder, + onCheck = function(bCheck) + MY_TeamMon_CircleLine.bBorder = bCheck + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + end + nY = nY + nLineH + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Enable alarm (master switch)'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + local uiContainer = ui:Append('WndContainer', { x = nPaddingX + 5, y = nY, w = nW - nPaddingX * 2 - 5, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Team channel alarm'], + color = GetMsgFontColor('MSG_TEAM', true), + checked = MY_TeamMon.bPushTeamChannel, + onCheck = function(bCheck) + MY_TeamMon.bPushTeamChannel = bCheck + end, + }):AutoWidth() + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + checked = MY_TeamMon.bPushWhisperChannel, + onCheck = function(bCheck) + MY_TeamMon.bPushWhisperChannel = bCheck + end, + }):AutoWidth() + if not X.IsRestricted('MY_TeamMon_BuffList') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Buff list'], + checked = MY_TeamMon.bPushBuffList, + onCheck = function(bCheck) + MY_TeamMon.bPushBuffList = bCheck + end, + }):AutoWidth() + end + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Center alarm'], + checked = MY_TeamMon.bPushCenterAlarm, + onCheck = function(bCheck) + MY_TeamMon.bPushCenterAlarm = bCheck + end, + }):AutoWidth() + end + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Voice alarm'], + checked = MY_TeamMon.bPushVoiceAlarm, + onCheck = function(bCheck) + MY_TeamMon.bPushVoiceAlarm = bCheck + end, + }):AutoWidth() + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Large text alarm'], + checked = MY_TeamMon.bPushBigFontAlarm, + onCheck = function(bCheck) + MY_TeamMon.bPushBigFontAlarm = bCheck + end, + }):AutoWidth() + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Fullscreen alarm'], + checked = MY_TeamMon.bPushFullScreen, + onCheck = function(bCheck) + MY_TeamMon.bPushFullScreen = bCheck + end, + }):AutoWidth() + end + if not X.IsRestricted('MY_TeamMon_PartyBuffList') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Party buff list'], + checked = MY_TeamMon.bPushPartyBuffList, + onCheck = function(bCheck) + MY_TeamMon.bPushPartyBuffList = bCheck + end, + }):AutoWidth() + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_TeamMon.bPushScreenHead, + onCheck = function(bCheck) + MY_TeamMon.bPushScreenHead = bCheck + end, + }):AutoWidth() + end + nX = nPaddingX + nY = nY + uiContainer:Height() + + nX, nY = ui:Append('Text', { x = nX, y = nY + 5, w = 'auto', text = _L['Voice alarm function'], font = 27 }):Pos('BOTTOMRIGHT') + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show voice recommendation confirm on load data'], + checked = MY_TeamMon.bShowVoicePacketRecommendation, + onCheck = function(bCheck) + MY_TeamMon.bShowVoicePacketRecommendation = bCheck + end, + }):Width() + 5 + nX, nY = ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', text = _L['Prefer use official voice'], + checked = MY_TeamMon_VoiceAlarm.bPreferOfficial, + onCheck = function(bCheck) + MY_TeamMon_VoiceAlarm.bPreferOfficial = bCheck + end, + }):Pos('BOTTOMRIGHT') + + if not X.IsRestricted('MY_TeamMon.Cataclysm') then + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Team panel bind show buff'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndCheckBox', { + x = nPaddingX + 10, y = nY, text = _L['Team panel bind show buff'], + checked = MY_TeamMon.bPushTeamPanel, + onCheck = function(bCheck) + MY_TeamMon.bPushTeamPanel = bCheck + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + end + + if not X.IsRestricted('MY_TeamMon_BuffList') then + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Buff list'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndComboBox', { + x = nPaddingX + 10, y = nY, text = _L['Max buff count'], + menu = function() + local menu = {} + for k, v in ipairs({ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }) do + table.insert(menu, { szOption = v, bMCheck = true, bChecked = MY_TeamMon_BuffList.nCount == v, fnAction = function() + MY_TeamMon_BuffList.nCount = v + end }) + end + return menu + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndComboBox', { + x = nX + 5, y = nY, text = _L['Buff size'], + menu = function() + local menu = {} + for k, v in ipairs({ 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 100 }) do + table.insert(menu, { szOption = v, bMCheck = true, bChecked = MY_TeamMon_BuffList.fScale == v / 55, fnAction = function() + MY_TeamMon_BuffList.fScale = v / 55 + end }) + end + return menu + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + end + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Countdown configure'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndSlider', { + x = nPaddingX + 10, y = nY, w = nW - nPaddingX * 2, rw = nW / 3, h = 22, + range = {0, 3601}, + value = MY_TeamMon_SpellTimer.nBelowDecimal, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + onChange = function(val) + X.DelayCall('MY_TeamMon_SpellTimer_nBelowDecimal', 300, function() + MY_TeamMon_SpellTimer.nBelowDecimal = val + end) + end, + textFormatter = function(val) + if val == 0 then + return _L['Never show decimal.'] + end + if val == 3601 then + return _L['Always show decimal.'] + end + return _L('Show countdown decimal when duration below: %ds.', val) + end, + }):Pos('BOTTOMRIGHT') + + nX, nY = ui:Append('Text', { x = nPaddingX, y = nY + 5, text = _L['Data save mode'], font = 27 }):AutoWidth():Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndCheckBox', { + x = nPaddingX + 10, y = nY, text = _L['Use common data'], + checked = MY_TeamMon.bCommon, + onCheck = function(bCheck) + MY_TeamMon.bCommon = bCheck + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndButton', { + x = nPaddingX + 5, y = nY + 15, text = _L['Open data panel'], + buttonStyle = 'FLAT', + onClick = MY_TeamMon_UI.TogglePanel, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndButton', { + x = nX + 5, y = nY + 15, text = _L['Data voice subscribe'], + buttonStyle = 'FLAT', + onClick = function() MY_TeamMon_Subscribe.OpenPanel() end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndButton', { + x = nX + 5, y = nY + 15, text = _L['Preview voice packet'], + buttonStyle = 'FLAT', + -- menu = function() + -- return { + -- { + -- szOption = _L['Preview official voice packet'], + -- fnAction = function() MY_TeamMon_VoiceAlarm_Previewer.Open('OFFICIAL') end, + -- }, + -- { + -- szOption = _L['Preview custom voice packet'], + -- fnAction = function() MY_TeamMon_VoiceAlarm_Previewer.Open('CUSTOM') end, + -- }, + -- } + -- end, + onClick = function() MY_TeamMon_VoiceAlarm_Previewer.Open('OFFICIAL') end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndButton', { + x = nX + 5, y = nY + 15, text = _L['Import local data'], + buttonStyle = 'FLAT', + onClick = function() MY_TeamMon_UI.OpenImportPanel() end, + }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('WndButton', { + x = nX + 5, y = nY + 15, text = _L['Open data folder'], + buttonStyle = 'FLAT', + onClick = function() + local szRoot = X.GetAbsolutePath(MY_TEAM_MON_REMOTE_DATA_ROOT):gsub('/', '\\') + X.OpenFolder(szRoot) + X.UI.OpenTextEditor(szRoot) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') +end + +X.Panel.Register(_L['Raid'], 'MY_TeamMon', _L['MY_TeamMon'], 'ui/Image/UICommon/FBlist.uitex|34', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon.lua b/MY_TeamMon/src/MY_TeamMon.lua new file mode 100644 index 000000000..526f41f02 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon.lua @@ -0,0 +1,2692 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控核心 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +local bRestricted = false +X.RegisterRestriction('MY_TeamMon', { ['*'] = false }) +X.RegisterRestriction('MY_TeamMon.Cataclysm', { ['*'] = false, exp = false }) +X.RegisterRestriction('MY_TeamMon.MapRestriction', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon.HiddenBuff', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon.HiddenSkill', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon.HiddenDoodad', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon.Note', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon.AutoSelect', { ['*'] = true }) +X.RegisterRestriction('MY_TeamMon_ScreenHeadAlarm', { ['*'] = false }) +-------------------------------------------------------------------------- + +local MY_SplitString, MY_TrimString = X.SplitString, X.TrimString +local MY_GetFormatText, MY_GetPureText = X.GetFormatText, X.GetPureText +local FireUIEvent, MY_IsVisibleBuff, Table_IsSkillShow = FireUIEvent, X.IsVisibleBuff, Table_IsSkillShow +local GetHeadTextForceFontColor, TargetPanel_SetOpenState = GetHeadTextForceFontColor, TargetPanel_SetOpenState + +local MY_TEAM_MON_REMOTE_DATA_ROOT = X.FormatPath({'userdata/team_mon/remote/', X.PATH_TYPE.GLOBAL}) +local MY_TEAM_MON_TYPE = { + OTHER = 0, + BUFF_GET = 1, + BUFF_LOSE = 2, + NPC_ENTER = 3, + NPC_LEAVE = 4, + NPC_TALK = 5, + NPC_LIFE = 6, + NPC_FIGHT = 7, + SKILL_BEGIN = 8, + SKILL_END = 9, + SYS_TALK = 10, + NPC_ALLLEAVE = 11, + NPC_DEATH = 12, + NPC_ALLDEATH = 13, + TALK_MONITOR = 14, + COMMON = 15, + NPC_MANA = 16, + DOODAD_ENTER = 17, + DOODAD_LEAVE = 18, + DOODAD_ALLLEAVE = 19, + CHAT_MONITOR = 20, +} +local MY_TEAM_MON_SCRUTINY_TYPE = { SELF = 1, TEAM = 2, ENEMY = 3, TARGET = 4 } +local MY_TEAM_MON_SPECIAL_MAP = { + COMMON = -1, -- 通用 + CITY = -2, -- 主城 + DUNGEON = -3, -- 秘境 + TEAM_DUNGEON = -4, -- 小队秘境 + RAID_DUNGEON = -5, -- 团队秘境 + STARVE = -6, -- 浪客行 + VILLAGE = -7, -- 野外 + ARENA = -8, -- 名剑大会 + BATTLEFIELD = -10, -- 战场 + PUBG = -11, -- 绝境战场 + ZOMBIE = -12, -- 李渡鬼域 + MONSTER = -13, -- 百战 + MOBA = -14, -- 列星虚境 + HOMELAND = -15, -- 家园 + ROGUELIKE = -16, -- 八荒衡鉴 + COMPETITION = -17, -- 竞技 + GUILD_TERRITORY = -18, -- 帮会领地 + CAMP = -19, -- 阵营地图 + STRONGHOLD = -20, -- 据点地图 + SCHOOL = -21, -- 门派地图 + RECYCLE_BIN = -9, -- 回收站 +} +local MY_TEAM_MON_SPECIAL_MAP_NAME = { + [MY_TEAM_MON_SPECIAL_MAP.COMMON ] = _L['Common data'], + [MY_TEAM_MON_SPECIAL_MAP.CITY ] = _L['City data'], + [MY_TEAM_MON_SPECIAL_MAP.DUNGEON ] = _L['Dungeon data'], + [MY_TEAM_MON_SPECIAL_MAP.TEAM_DUNGEON ] = _L['Team dungeon data'], + [MY_TEAM_MON_SPECIAL_MAP.RAID_DUNGEON ] = _L['Raid dungeon data'], + [MY_TEAM_MON_SPECIAL_MAP.STARVE ] = _L['Starve data'], + [MY_TEAM_MON_SPECIAL_MAP.VILLAGE ] = _L['Village data'], + [MY_TEAM_MON_SPECIAL_MAP.ARENA ] = _L['Arena data'], + [MY_TEAM_MON_SPECIAL_MAP.BATTLEFIELD ] = _L['Battlefield data'], + [MY_TEAM_MON_SPECIAL_MAP.PUBG ] = _L['Pubg data'], + [MY_TEAM_MON_SPECIAL_MAP.ZOMBIE ] = _L['Zombie data'], + [MY_TEAM_MON_SPECIAL_MAP.MONSTER ] = _L['Monster data'], + [MY_TEAM_MON_SPECIAL_MAP.MOBA ] = _L['Moba data'], + [MY_TEAM_MON_SPECIAL_MAP.HOMELAND ] = _L['Homeland data'], + [MY_TEAM_MON_SPECIAL_MAP.GUILD_TERRITORY] = _L['Guild territory data'], + [MY_TEAM_MON_SPECIAL_MAP.ROGUELIKE ] = _L['Roguelike data'], + [MY_TEAM_MON_SPECIAL_MAP.COMPETITION ] = _L['Competition data'], + [MY_TEAM_MON_SPECIAL_MAP.CAMP ] = _L['Camp data'], + [MY_TEAM_MON_SPECIAL_MAP.STRONGHOLD ] = _L['Stronghold data'], + [MY_TEAM_MON_SPECIAL_MAP.SCHOOL ] = _L['School data'], + [MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN ] = _L['Recycle bin data'], +} +local MY_TEAM_MON_SPECIAL_MAP_INFO = {} +for _, dwMapID in pairs(MY_TEAM_MON_SPECIAL_MAP) do + local map = X.FreezeTable({ + dwID = dwMapID, + dwMapID = dwMapID, + szName = MY_TEAM_MON_SPECIAL_MAP_NAME[dwMapID], + }) + MY_TEAM_MON_SPECIAL_MAP_INFO[map.szName] = map + MY_TEAM_MON_SPECIAL_MAP_INFO[map.dwMapID] = map +end +-- 核心优化变量 +local MY_TEAM_MON_CORE_PLAYERID = 0 +local MY_TEAM_MON_CORE_NAME = 0 + +local MY_TEAM_MON_MAX_INTERVAL = 300 +local MY_TEAM_MON_MAX_CACHE = 3000 -- 最大的cache数量 主要是UI的问题 +local MY_TEAM_MON_DEL_CACHE = 1000 -- 每次清理的数量 然后会做一次gc +local MY_TEAM_MON_INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon.ini' + +local MY_TEAM_MON_SHARE_QUEUE = {} +local MY_TEAM_MON_MARK_QUEUE = {} +local MY_TEAM_MON_MARK_IDLE = true -- 标记空闲 + +local MY_TEAM_MON_SHIELDED_TOTAL = false -- 标记当前在功能限制状态 限制所有功能监听 +local MY_TEAM_MON_SHIELDED_OTHER_PLAYER = false -- 标记当前在可能发生PVP战斗的地图 限制他人战斗功能监听 +local MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE = false -- 标记当前在功能限制状态 限制场景目标进出功能监听 +---- +local MY_TEAM_MON_LEFT_BRACKET = _L['['] +local MY_TEAM_MON_RIGHT_BRACKET = _L[']'] +local MY_TEAM_MON_LEFT_BRACKET_XML = MY_GetFormatText(MY_TEAM_MON_LEFT_BRACKET, 44, 255, 255, 255) +local MY_TEAM_MON_RIGHT_BRACKET_XML = MY_GetFormatText(MY_TEAM_MON_RIGHT_BRACKET, 44, 255, 255, 255) +---- +local MY_TEAM_MON_TYPE_LIST = { 'BUFF', 'DEBUFF', 'CASTING', 'NPC', 'DOODAD', 'TALK', 'CHAT' } + +local MY_TEAM_MON_EVENTS = { + 'NPC_ENTER_SCENE', + 'NPC_LEAVE_SCENE', + 'MY_TEAM_MON_NPC_FIGHT', + 'MY_TEAM_MON_NPC_ENTER_SCENE', + 'MY_TEAM_MON_ALL_LEAVE_SCENE', + 'MY_TEAM_MON_NPC_LIFE_CHANGE', + 'MY_TEAM_MON_NPC_MANA_CHANGE', + + 'DOODAD_ENTER_SCENE', + 'DOODAD_LEAVE_SCENE', + 'MY_TEAM_MON_DOODAD_ENTER_SCENE', + 'MY_TEAM_MON_DOODAD_ALL_LEAVE_SCENE', + + 'BUFF_UPDATE', + 'SYS_MSG', + 'DO_SKILL_CAST', + + 'PLAYER_SAY', + 'ON_WARNING_MESSAGE', + + 'PARTY_SET_MARK', +} + +local CACHE = { + TEMP = {}, -- 近期事件记录MAP 这里用弱表 方便处理 + MAP = {}, + NPC_LIST = {}, + DOODAD_LIST = {}, + SKILL_LIST = {}, + INTERVAL = {}, + CD_STR = {}, + HP_CD_STR = {}, +} + +local D = X.LazyLoadingTable({ + FILE = {}, -- 文件原始数据 + META = {}, -- 文件原信息 + CONFIG = {}, -- 文件原始配置项 + TEMP = {}, -- 近期事件记录 + DATA = {}, -- 需要监控的数据合集 +}, { + PW = function() return X.SECRET['FILE::TEAM_MON_DATA_PW'] end, +}) + +-- 初始化table 虽然写法没有直接写来得好 但是为了方便以后改动 +do + for k, v in ipairs(MY_TEAM_MON_TYPE_LIST) do + D.FILE[v] = {} + D.DATA[v] = {} + D.TEMP[v] = {} + CACHE.MAP[v] = {} + CACHE.INTERVAL[v] = {} + CACHE.TEMP[v] = setmetatable({}, { __mode = 'v' }) + if v == 'TALK' or v == 'CHAT' then -- init talk stru + CACHE.MAP[v].HIT = {} + CACHE.MAP[v].OTHER = {} + end + end +end + +local O = X.CreateUserSettingsModule('MY_TeamMon', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Enable MY_TeamMon'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bCommon = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Use common data'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPushScreenHead = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Lifebar alarm'], + }), + szRestriction = 'MY_TeamMon', + szVersion = '20241029', + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_REMAKE, + }, + bPushCenterAlarm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Center alarm'], + }), + szRestriction = 'MY_TeamMon', + szVersion = '20241029', + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_REMAKE, + }, + bPushVoiceAlarm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Voice alarm'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPushBigFontAlarm = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Large text alarm'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPushTeamPanel = { -- 面板buff监控 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Team panel bind show buff'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPushFullScreen = { -- 全屏泛光 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Fullscreen alarm'], + }), + szRestriction = 'MY_TeamMon', + szVersion = '20241029', + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_REMAKE, + }, + bPushTeamChannel = { -- 团队报警 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Team channel alarm'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bPushWhisperChannel = { -- 密聊报警 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Whisper channel alarm'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bPushBuffList = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Buff list'], + }), + szRestriction = 'MY_TeamMon', + szVersion = '20241029', + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_REMAKE, + }, + bPushPartyBuffList = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Party buff list'], + }), + szRestriction = 'MY_TeamMon', + szVersion = '20241029', + xSchema = X.Schema.Boolean, + xDefaultValue = X.IS_REMAKE, + }, + bShowVoicePacketRecommendation = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['Show voice recommendation confirm on load data'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) + +local function GetUserDataPath() + local ePathType = O.bCommon and X.PATH_TYPE.GLOBAL or X.PATH_TYPE.ROLE + local szPathV1 = X.FormatPath({'userdata/TeamMon/Config.jx3dat', ePathType}) + local szPath = X.FormatPath({'userdata/team_mon/local.jx3dat', ePathType}) + if IsLocalFileExist(szPathV1) then + local data = X.LoadLUAData(szPathV1) + X.SaveLUAData(szPath, { + data = data, + config = {}, + }) + CPath.DelFile(szPathV1) + end + X.OutputDebugMessage('[MY_TeamMon] Data path: ' .. szPath, X.DEBUG_LEVEL.LOG) + return szPath +end + +local function RenderCustomText(szTemplate, szSender, szReceiver, aBackreferences) + local tVar = X.Clone(aBackreferences) or {} + tVar.sender = szSender + tVar.receiver = szReceiver + return X.RenderTemplateString(szTemplate, tVar, -1, false, false) +end + +local function FilterCustomText(szTemplate, szSender, szReceiver, aBackreferences) + local tVar = X.Clone(aBackreferences) or {} + tVar.sender = szSender + tVar.receiver = szReceiver + return X.RenderTemplateString(szTemplate, tVar, -1, true, false) +end + +local function ParseCustomText(szTemplate, szSender, szReceiver, aBackreferences) + local tVar = X.Clone(aBackreferences) or {} + tVar.sender = szSender + tVar.receiver = szReceiver + return X.RenderTemplateString(szTemplate, tVar, 8, true, true) +end + +local function ConstructSpeech(aText, aXml, szText, nFont, nR, nG, nB) + if aXml then + if X.IsString(nFont) then + table.insert(aXml, nFont) + else + table.insert(aXml, MY_GetFormatText(szText, nFont, nR, nG, nB)) + end + end + if aText then + table.insert(aText, szText) + end +end + +-- 解析分段倒计时 +---@param szCountdown string @倒计时字符串,如 “10,文本提示;20,文本提示;30,文本提示” +---@return table @倒计时列表 +local function ParseCountdown(szCountdown) + if not CACHE.CD_STR[szCountdown] then + local aCountdown, bError = {}, false + for _, szPart in ipairs(MY_SplitString(szCountdown, ';')) do + local aParams, bPartError = MY_SplitString(szPart, ','), true + if #aParams >= 2 then + local nTime = tonumber(aParams[1]) + local szContent = aParams[2] + local szVoice + local szParam, bUnknownParam, bParamRecognized + for i = 3, #aParams do + szParam = aParams[i] + bParamRecognized = false + if not szVoice and not bParamRecognized then + if szParam:sub(1, 3) == 'VO:' + or szParam:sub(1, 3) == 'VC:' then + szVoice = szParam:sub(4) + bParamRecognized = true + end + end + if not bParamRecognized then + bUnknownParam = true + end + end + if nTime and szContent and nTime and szContent ~= '' and not bUnknownParam then + table.insert(aCountdown, { + nTime = nTime, + szContent = szContent, + szVoice = szVoice, + }) + bPartError = false + end + end + if bPartError then + bError = true + end + end + if X.IsEmpty(aCountdown) then + aCountdown = nil + else + table.sort(aCountdown, function(a, b) + return a.nTime < b.nTime + end) + end + CACHE.CD_STR[szCountdown] = {aCountdown, bError} + end + return X.Clone(CACHE.CD_STR[szCountdown][1]), CACHE.CD_STR[szCountdown][2] +end + +-- 解析气血内力监控 +---@param szString string @气血内力监控字符串,如 “0.5-,气血下降50%提示;0.3+,气血回升30%提示,5;0.1,气血10%提示,15”,时间可选,不填时间时仅显示提示不显示倒计时 +---@return table @气血内力监控列表 +local function ParseHPCountdown(szString) + if not CACHE.HP_CD_STR[szString] then + local aHPCountdown, bError = {}, false + for _, szPart in ipairs(MY_SplitString(szString, ';')) do + local aParams, bPartError = MY_SplitString(szPart, ','), true + if #aParams >= 2 then + local nValue, szOperator = nil, aParams[1]:sub(-1) + if szOperator == '+' or szOperator == '-' or szOperator == '*' then + nValue = tonumber(aParams[1]:sub(1, -2)) + else + szOperator = '*' + nValue = tonumber(aParams[1]) + end + local szContent = aParams[2] + local nTime + local szVoice + local szParam, bUnknownParam, bParamRecognized + for i = 3, #aParams do + szParam = aParams[i] + bParamRecognized = false + if not szVoice and not bParamRecognized then + if szParam:sub(1, 3) == 'VO:' + or szParam:sub(1, 3) == 'VC:' then + szVoice = szParam:sub(4) + bParamRecognized = true + end + end + if not nTime and not bParamRecognized and i == 3 then + if tonumber(szParam) then + nTime = tonumber(szParam) + bParamRecognized = true + end + end + if not bParamRecognized then + bUnknownParam = true + end + end + if nValue and szOperator and szContent ~= '' and not bUnknownParam then + table.insert(aHPCountdown, { + nValue = nValue * 100, + szOperator = szOperator, + szContent = szContent, + nTime = nTime, + szVoice = szVoice, + }) + bPartError = false + end + end + if bPartError then + bError = true + end + end + if X.IsEmpty(aHPCountdown) then + aHPCountdown = nil + else + table.sort(aHPCountdown, function(a, b) + return a.nValue > b.nValue + end) + end + CACHE.HP_CD_STR[szString] = {aHPCountdown, bError} + end + return X.Clone(CACHE.HP_CD_STR[szString][1]), CACHE.HP_CD_STR[szString][2] +end + +function D.OnFrameCreate() + this:RegisterEvent('MY_TEAM_MON_LOADING_END') + this:RegisterEvent('MY_TEAM_MON_CREATE_CACHE') + this:RegisterEvent('LOADING_END') + D.Enable(O.bEnable) + D.Log('init success!') + X.BreatheCall('MY_TeamMon_CacheClear', 60 * 2 * 1000, function() + for k, v in ipairs(MY_TEAM_MON_TYPE_LIST) do + if #D.TEMP[v] > MY_TEAM_MON_MAX_CACHE then + D.FreeCache(v) + end + end + for k, v in pairs(CACHE.INTERVAL) do + for kk, vv in pairs(v) do + if #vv > MY_TEAM_MON_MAX_INTERVAL then + CACHE.INTERVAL[k][kk] = {} + end + end + end + end) +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then + return + end + -- local dwType, dwID = me.GetTarget() + for dwTemplateID, npcInfo in pairs(CACHE.NPC_LIST) do + local data = D.GetData('NPC', dwTemplateID) + if data then + -- local bTempTarget = false + -- for kk, vv in ipairs(data.tCountdown or {}) do + -- if vv.nClass == MY_TEAM_MON_TYPE.NPC_MANA then + -- bTempTarget = true + -- break + -- end + -- end + local bFightFlag = false + local fLifePer, fManaPer + -- TargetPanel_SetOpenState(true) + for dwNpcID, tab in pairs(npcInfo.tList) do + local npc = X.GetNpc(dwNpcID) + if npc then + -- if bTempTarget then + -- X.SetClientPlayerTarget(TARGET.NPC, vv) + -- X.SetClientPlayerTarget(dwType, dwID) + -- end + -- 血量变化检查 + local fCurrentLife, fMaxLife = X.GetCharacterLife(npc) + if fMaxLife > 1 then + local nLife = math.floor(fCurrentLife / fMaxLife * 100) + if tab.nLife ~= nLife then + local nStart = tab.nLife or nLife + local bIncrease = nLife >= nStart + local nStep = bIncrease and 1 or -1 + if tab.nLife then + nStart = nStart + nStep + end + for nLife = nStart, nLife, nStep do + FireUIEvent('MY_TEAM_MON_NPC_LIFE_CHANGE', dwTemplateID, nLife, bIncrease) + end + tab.nLife = nLife + end + end + -- 蓝量变化检查 + -- if bTempTarget then + if npc.nMaxMana > 1 then + local nMana = math.floor(npc.nCurrentMana / npc.nMaxMana * 100) + if tab.nMana ~= nMana then + local nStart = tab.nMana or nMana + local bIncrease = nMana >= nStart + local nStep = bIncrease and 1 or -1 + if tab.nMana then + nStart = nStart + nStep + end + for nMana = nStart, nMana, nStep do + FireUIEvent('MY_TEAM_MON_NPC_MANA_CHANGE', dwTemplateID, nMana, bIncrease) + end + tab.nMana = nMana + end + end + -- end + -- 战斗标记检查 + if npc.bFightState ~= tab.bFightState then + if npc.bFightState then + local nTime = GetTime() + npcInfo.nSec = nTime + FireUIEvent('MY_TEAM_MON_NPC_FIGHT', dwTemplateID, true, nTime) + else + local nTime = GetTime() - (npcInfo.nSec or GetTime()) + npcInfo.nSec = nil + FireUIEvent('MY_TEAM_MON_NPC_FIGHT', dwTemplateID, false, nTime) + end + tab.bFightState = npc.bFightState + end + end + end + -- TargetPanel_SetOpenState(false) + end + end +end + +function D.OnSetMark(bFinish) + if bFinish then + MY_TEAM_MON_MARK_IDLE = true + end + if MY_TEAM_MON_MARK_IDLE and #MY_TEAM_MON_MARK_QUEUE >= 1 then + MY_TEAM_MON_MARK_IDLE = false + local r = table.remove(MY_TEAM_MON_MARK_QUEUE, 1) + local res, err, trace = X.XpCall(r.fnAction) + if not res then + FireUIEvent('CALL_LUA_ERROR', 'MY_TeamMon_Mark ERROR: ' .. err .. '\n' .. trace) + D.OnSetMark(true) + end + end +end + +function D.OnEvent(szEvent) + if szEvent == 'BUFF_UPDATE' then + D.OnBuff(arg0, arg1, arg3, arg4, arg5, arg8, arg9) + elseif szEvent == 'SYS_MSG' then + if arg0 == 'UI_OME_DEATH_NOTIFY' then + if not X.IsPlayer(arg1) then + D.OnDeath(arg1, arg2) + end + elseif arg0 == 'UI_OME_SKILL_CAST_LOG' then + D.OnSkillCast(arg1, arg2, arg3, arg0) + elseif (arg0 == 'UI_OME_SKILL_BLOCK_LOG' + or arg0 == 'UI_OME_SKILL_SHIELD_LOG' or arg0 == 'UI_OME_SKILL_MISS_LOG' + or arg0 == 'UI_OME_SKILL_DODGE_LOG' or arg0 == 'UI_OME_SKILL_HIT_LOG') + and arg3 == SKILL_EFFECT_TYPE.SKILL then + D.OnSkillCast(arg1, arg4, arg5, arg0) + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' and arg4 == SKILL_EFFECT_TYPE.SKILL then + D.OnSkillCast(arg1, arg5, arg6, arg0) + end + elseif szEvent == 'DO_SKILL_CAST' then + D.OnSkillCast(arg0, arg1, arg2, szEvent) + elseif szEvent == 'PARTY_SET_MARK' then + D.OnSetMark(true) + elseif szEvent == 'PLAYER_SAY' then + if not X.IsPlayer(arg1) then + local szText = MY_GetPureText(arg0) + if szText and szText ~= '' then + D.OnCallMessage('TALK', szText, arg1, arg3 == '' and '%' or arg3) + else + X.OutputDebugMessage(_L['MY_TeamMon'], 'GetPureText ERROR: ' .. arg0, X.DEBUG_LEVEL.WARNING) + end + end + elseif szEvent == 'ON_WARNING_MESSAGE' then + D.OnCallMessage('TALK', arg1) + elseif szEvent == 'DOODAD_ENTER_SCENE' or szEvent == 'MY_TEAM_MON_DOODAD_ENTER_SCENE' then + local doodad = X.GetDoodad(arg0) + if doodad then + D.OnDoodadEvent(doodad, true) + end + elseif szEvent == 'DOODAD_LEAVE_SCENE' then + local doodad = X.GetDoodad(arg0) + if doodad then + D.OnDoodadEvent(doodad, false) + end + elseif szEvent == 'MY_TEAM_MON_DOODAD_ALL_LEAVE_SCENE' then + D.OnDoodadAllLeave(arg0) + elseif szEvent == 'NPC_ENTER_SCENE' or szEvent == 'MY_TEAM_MON_NPC_ENTER_SCENE' then + local npc = X.GetNpc(arg0) + if npc then + D.OnNpcEvent(npc, true) + end + elseif szEvent == 'NPC_LEAVE_SCENE' then + local npc = X.GetNpc(arg0) + if npc then + D.OnNpcEvent(npc, false) + end + elseif szEvent == 'MY_TEAM_MON_ALL_LEAVE_SCENE' then + D.OnNpcAllLeave(arg0) + elseif szEvent == 'MY_TEAM_MON_NPC_FIGHT' then + D.OnNpcFight(arg0, arg1) + elseif szEvent == 'MY_TEAM_MON_NPC_LIFE_CHANGE' or szEvent == 'MY_TEAM_MON_NPC_MANA_CHANGE' then + D.OnNpcInfoChange(szEvent, arg0, arg1, arg2) + elseif szEvent == 'LOADING_END' or szEvent == 'MY_TEAM_MON_CREATE_CACHE' or szEvent == 'MY_TEAM_MON_LOADING_END' then + D.FireCrossMapEvent('before') + D.CreateData(szEvent) + X.DelayCall('MY_TeamMon__FireCrossMapEvent__after', D.FireCrossMapEvent, 'after') + end +end + +function D.SendChat(...) + if bRestricted then + return + end + return X.SendChat(...) +end + +function D.SendBgMsg(...) + if bRestricted then + return + end + return X.SendBgMsg(...) +end + +function D.Log(szMsg) + return Log('[MY_TeamMon] ' .. szMsg) +end + +function D.Talk(szType, szMsg, szTarget) + local me = X.GetClientPlayer() + if not me then + return + end + local szKey = 'MY_TeamMon.' .. GetLogicFrameCount() + if szType == 'RAID' then + if szTarget then + szMsg = X.StringReplaceW(szMsg, _L['['] .. szTarget .. _L[']'], ' [' .. szTarget .. '] ') + szMsg = X.StringReplaceW(szMsg, _L['['] .. g_tStrings.STR_YOU .. _L[']'], ' [' .. szTarget .. '] ') + end + if me.IsInParty() then + D.SendChat(PLAYER_TALK_CHANNEL.RAID, szMsg, { uuid = szKey .. GetStringCRC(szType .. szMsg) }) + end + elseif szType == 'WHISPER' then + if szTarget then + szMsg = X.StringReplaceW(szMsg, '[' .. szTarget .. ']', _L['['] .. g_tStrings.STR_YOU .. _L[']']) + szMsg = X.StringReplaceW(szMsg, _L['['] .. szTarget .. _L[']'], _L['['] .. g_tStrings.STR_YOU .. _L[']']) + end + if szTarget == me.szName then + X.OutputWhisperMessage(szMsg, _L['MY_TeamMon']) + else + D.SendChat(szTarget, szMsg, { uuid = szKey .. GetStringCRC(szType .. szMsg) }) + end + elseif szType == 'RAID_WHISPER' then + if me.IsInParty() then + local team = GetClientTeam() + for _, v in ipairs(team.GetTeamMemberList()) do + local szName = team.GetClientTeamMemberName(v) + local szText = X.StringReplaceW(szMsg, '[' .. szName .. ']', _L['['] .. g_tStrings.STR_YOU .. _L[']']) + if szName == me.szName then + X.OutputWhisperMessage(szText, _L['MY_TeamMon']) + else + D.SendChat(szName, szText, { uuid = szKey .. GetStringCRC(szType .. szText .. szName) }) + end + end + end + end +end + +-- 更新当前地图使用条件 +function D.UpdateShieldStatus() + local bShieldedTotal = false + local bShieldedOtherPlayer = false + local bShieldedEnterLeaveScene = false + if X.IsRestricted('MY_TeamMon.MapRestriction') then + -- 地图限制判断 + if X.IsInPubgMap() then + bShieldedTotal = true + end + if not X.IsInDungeonMap() then + bShieldedOtherPlayer = true + end + -- 地图限制提示 + if not MY_TEAM_MON_SHIELDED_TOTAL and bShieldedTotal then + X.OutputSystemMessage(_L['MY_TeamMon is blocked in current kungfu, temporary disabled.']) + elseif not MY_TEAM_MON_SHIELDED_OTHER_PLAYER and bShieldedOtherPlayer then + X.OutputSystemMessage(_L['MY_TeamMon is shielded other player in this map, temporary disabled.']) + end + end + MY_TEAM_MON_SHIELDED_TOTAL = bShieldedTotal + MY_TEAM_MON_SHIELDED_OTHER_PLAYER = bShieldedOtherPlayer + MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE = bShieldedEnterLeaveScene +end + +local function CreateCache(szType, tab) + local data = D.DATA[szType] + local cache = CACHE.MAP[szType] + for k, v in ipairs(tab) do + data[#data + 1] = v + if v.nLevel then + cache[v.dwID] = cache[v.dwID] or {} + cache[v.dwID][v.nLevel] = k + else -- other + cache[v.dwID] = k + end + end + D.Log('create ' .. szType .. ' data success!') +end +-- 核心函数 缓存创建 UI缓存创建 +function D.CreateData(szEvent) + local nTime = GetTime() + local dwMapID = X.GetMapID(true) + local me = X.GetClientPlayer() + -- 用于更新 BUFF / CAST / NPC 缓存处理 不需要再获取本地对象 + MY_TEAM_MON_CORE_NAME = me.szName + MY_TEAM_MON_CORE_PLAYERID = me.dwID + D.Log('get player info cache success!') + -- 更新功能屏蔽状态 + D.UpdateShieldStatus() + -- 重建metatable 获取ALL数据的方法 主要用于UI 逻辑中毫无作用 + for kType, vTable in pairs(D.FILE) do + setmetatable(D.FILE[kType], { __index = function(me, index) + if index == _L['All data'] then + local t = {} + for k, v in pairs(vTable) do + if k ~= MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN then + for kk, vv in ipairs(v) do + t[#t +1] = vv + end + end + end + return t + end + end }) + -- 重建所有数据的metatable + for k, v in pairs(vTable) do + for kk, vv in ipairs(v) do + setmetatable(vv, { __index = function(_, val) + if val == 'dwMapID' then + return k + elseif val == 'nIndex' then + return kk + end + end }) + end + end + end + D.Log('create metatable success!') + -- 清空当前数据和MAP + for k, v in pairs(D.DATA) do + D.DATA[k] = {} + end + for k, v in pairs(CACHE.MAP) do + CACHE.MAP[k] = {} + if k == 'TALK' or k == 'CHAT' then + CACHE.MAP[k].HIT = {} + CACHE.MAP[k].OTHER = {} + end + end + pcall(Raid_MonitorBuffs) -- clear + -- 重建MAP + for _, v in ipairs({ 'BUFF', 'DEBUFF', 'CASTING', 'NPC', 'DOODAD' }) do + for _, d in D.IterTable(MY_TeamMon.GetTable(v), dwMapID, false) do + CreateCache(v, d) + end + end + -- 单独重建TALK数据 + do + for _, vType in ipairs({ 'TALK', 'CHAT' }) do + local data = D.FILE[vType] + local talk = D.DATA[vType] + CACHE.MAP[vType] = { + HIT = {}, + OTHER = {}, + } + local cache = CACHE.MAP[vType] + for _, v in D.IterTable(data, dwMapID, true) do + talk[#talk + 1] = v + end + for k, v in ipairs(talk) do + if v.szContent then + if v.szContent:find('{$me}') or v.szContent:find('{$team}') or v.bSearch or v.bReg then -- 具有通配符和搜索标记的数据不作 HIT 高速匹配策略考虑 + table.insert(cache.OTHER, v) + elseif not cache.HIT[v.szContent] then -- 按照数据优先级顺序(地图>地图组>通用),同级按照下标先后顺序,只取第一个匹配结果 + cache.HIT[v.szContent] = cache.HIT[v.szContent] or {} + cache.HIT[v.szContent][v.szTarget or 'sys'] = v + end + else + X.OutputDebugMessage('MY_TeamMon', '[Warning] ' .. vType .. ' data is not szContent #' .. k .. ', please do check it!', X.DEBUG_LEVEL.WARNING) + end + end + D.Log('create ' .. vType .. ' data success!') + end + end + if O.bPushTeamPanel then + local tBuff = {} + for k, v in ipairs(D.DATA.BUFF) do + if v[MY_TEAM_MON_TYPE.BUFF_GET] and v[MY_TEAM_MON_TYPE.BUFF_GET].bTeamPanel then + table.insert(tBuff, v.dwID) + end + end + for k, v in ipairs(D.DATA.DEBUFF) do + if v[MY_TEAM_MON_TYPE.BUFF_GET] and v[MY_TEAM_MON_TYPE.BUFF_GET].bTeamPanel then + table.insert(tBuff, v.dwID) + end + end + pcall(Raid_MonitorBuffs, tBuff) + end + D.Log('MAPID: ' .. dwMapID .. ' create data success:' .. GetTime() - nTime .. 'ms') + -- gc + if szEvent ~= 'MY_TEAM_MON_CREATE_CACHE' then + CACHE.SKILL_LIST = {} + CACHE.HP_CD_STR = {} + D.Log('collectgarbage(\'count\') ' .. collectgarbage('count')) + collectgarbage('collect') + D.Log('collectgarbage(\'collect\') ' .. collectgarbage('count')) + end + -- clear nearby cache + CACHE.NPC_LIST = {} + CACHE.DOODAD_LIST = {} + -- re-scan nearby + for _, v in pairs(X.GetNearNpcID()) do + FireUIEvent('MY_TEAM_MON_NPC_ENTER_SCENE', v) + end + for _, v in pairs(X.GetNearDoodadID()) do + FireUIEvent('MY_TEAM_MON_DOODAD_ENTER_SCENE', v) + end + FireUIEvent('MY_TEAM_MON__UI__FREE_CACHE') +end + +function D.FreeCache(szType) + local t = {} + local tTemp = D.TEMP[szType] + for i = MY_TEAM_MON_DEL_CACHE, #tTemp do + t[#t + 1] = tTemp[i] + end + D.TEMP[szType] = t + collectgarbage('collect') + FireUIEvent('MY_TEAM_MON__UI__TEMP_RELOAD', szType) + D.Log(szType .. ' cache clear!') +end + +function D.CheckScrutinyType(nScrutinyType, dwID) + if nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.SELF and dwID ~= MY_TEAM_MON_CORE_PLAYERID then + return false + elseif nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.TEAM and (not X.IsTeammate(dwID) and dwID ~= MY_TEAM_MON_CORE_PLAYERID) then + return false + elseif nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.ENEMY and not IsEnemy(MY_TEAM_MON_CORE_PLAYERID, dwID) then + return false + elseif nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.TARGET then + local me = X.GetClientPlayer() + local obj = X.GetTargetHandle(X.GetCharacterTarget(me)) + if not obj or obj and obj.dwID ~= dwID then + return false + end + end + return true +end + +function D.CheckKungFu(tKungFu) + if tKungFu['SKILL#' .. UI_GetPlayerMountKungfuID()] then + return true + end + return false +end + +function D.GetTargetHandle(dwID) + if X.IsPlayer(dwID) then + return X.GetPlayer(dwID) + end + return X.GetNpc(dwID) +end + +-- 智能标记逻辑 +function D.SetTeamMark(szType, tMark, dwCharacterID, dwID, nLevel) + if not X.IsClientPlayerTeamMarker() or bRestricted then + return + end + local function fnGetNextMark() + local team, tar = GetClientTeam() + local tTeamMark = X.FlipObjectKV(team.GetTeamMark()) + if szType == 'NPC' then + for nMark, bMark in ipairs(tMark) do + if bMark and tTeamMark[nMark] ~= dwCharacterID then + tar = tTeamMark[nMark] and tTeamMark[nMark] ~= 0 and D.GetTargetHandle(tTeamMark[nMark]) + if not tar or tar.dwTemplateID ~= dwID then + return nMark, dwCharacterID + end + end + end + elseif szType == 'BUFF' or szType == 'DEBUFF' then + for nMark, bMark in ipairs(tMark) do + if bMark and tTeamMark[nMark] ~= dwCharacterID then + tar = tTeamMark[nMark] and tTeamMark[nMark] ~= 0 and D.GetTargetHandle(tTeamMark[nMark]) + if not tar or not X.GetBuff(tar, dwID) then + return nMark, dwCharacterID + end + end + end + elseif szType == 'CASTING' then + for nMark, bMark in ipairs(tMark) do + if bMark and (not tTeamMark[nMark] or tTeamMark[nMark] ~= dwCharacterID) then + return nMark, dwCharacterID + end + end + end + end + local fnAction = function() + local nMark, dwCharacterID = fnGetNextMark() + if nMark and dwCharacterID and X.SetTeamMarkCharacter(nMark, dwCharacterID) then + return + end + D.OnSetMark(true) -- 标记失败 直接处理下一个 + end + table.insert(MY_TEAM_MON_MARK_QUEUE, { + fnAction = fnAction, + }) + D.OnSetMark() +end + +-- 根据配置获取倒计时实例的 类型 与 唯一标识符 +function D.GetCountdownTypeKey(data, nIndex, szSender, szReceiver, aBackreferences) + local v = data.tCountdown[nIndex] + local nType, szKey = v.nClass, v.key + if szKey then + nType = MY_TEAM_MON_TYPE.COMMON + szKey = RenderCustomText(szKey, szSender, szReceiver, aBackreferences) + else + szKey = nIndex .. '.' .. (data.dwID or 0) .. '.' .. (data.nLevel or 0) .. '.' .. (data.nIndex or 0) .. '.' .. X.EncodeLUAData(aBackreferences) + end + return nType, szKey +end + +-- 倒计时处理 支持定义无限的倒计时 +function D.CountdownEvent(data, nClass, szSender, szReceiver, aBackreferences) + if data.tCountdown then + for i, v in ipairs(data.tCountdown) do + if nClass == v.nClass then + local nType, szKey = D.GetCountdownTypeKey(data, i, szSender, szReceiver, aBackreferences) + local tParam = { + nIcon = v.nIcon or data.nIcon or 340, + nFrame = v.nFrame, + szContent = FilterCustomText(v.szName or data.szName, szSender, szReceiver, aBackreferences), + nTime = v.nTime, + nRefresh = v.nRefresh, + bTalk = v.bTeamChannel, + bHold = v.bHold, + } + D.FireCountdownEvent(nType, szKey, tParam, szSender, szReceiver, aBackreferences) + end + end + end +end + +-- 发布事件 为了方便日后修改 集中起来 +function D.FireCountdownEvent(nType, szKey, tParam, szSender, szReceiver, aBackreferences) + if not O.bPushTeamChannel then + tParam.bTalk = false + end + FireUIEvent('MY_TEAM_MON__SPELL_TIMER__CREATE', nType, szKey, tParam, szSender, szReceiver, aBackreferences) +end + +function D.GetSrcName(dwID) + if not dwID then + return nil + end + if dwID == 0 then + return g_tStrings.COINSHOP_SOURCE_NULL + end + local dwType = X.IsPlayer(dwID) and TARGET.PLAYER or TARGET.NPC + return X.GetTargetName(dwType, dwID) or dwID +end + +-- local a=GetTime();for i=1, 10000 do FireUIEvent('BUFF_UPDATE',X.GetClientPlayerID(),false,1,true,i,1,1,1,1,0) end;Output(GetTime()-a) +-- 事件操作 +function D.OnBuff(dwOwner, bDelete, bCanCancel, dwBuffID, nCount, nBuffLevel, dwSkillSrcID) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + if MY_TEAM_MON_SHIELDED_OTHER_PLAYER and X.IsPlayer(dwSkillSrcID) and dwSkillSrcID ~= MY_TEAM_MON_CORE_PLAYERID then + return + end + local szType = bCanCancel and 'BUFF' or 'DEBUFF' + local key = dwBuffID .. '_' .. nBuffLevel + local data = D.GetData(szType, dwBuffID, nBuffLevel) + local nTime = GetTime() + if not bDelete then + -- 近期记录 + if MY_IsVisibleBuff(dwBuffID, nBuffLevel) or not X.IsRestricted('MY_TeamMon.HiddenBuff') then + local tWeak, tTemp = CACHE.TEMP[szType], D.TEMP[szType] + if not tWeak[key] then + local t = { + dwMapID = X.GetMapID(), + dwID = dwBuffID, + nLevel = nBuffLevel, + bIsPlayer = dwSkillSrcID ~= 0 and X.IsPlayer(dwSkillSrcID), + szSrcName = D.GetSrcName(dwSkillSrcID), + nCurrentTime = GetCurrentTime() + } + tWeak[key] = t + tTemp[#tTemp + 1] = tWeak[key] + FireUIEvent('MY_TEAM_MON__UI__TEMP_UPDATE', szType, t) + end + -- 记录时间 + CACHE.INTERVAL[szType][key] = CACHE.INTERVAL[szType][key] or {} + if #CACHE.INTERVAL[szType][key] > 0 then + if nTime - CACHE.INTERVAL[szType][key][#CACHE.INTERVAL[szType][key]] > 1000 then + CACHE.INTERVAL[szType][key][#CACHE.INTERVAL[szType][key] + 1] = nTime + end + else + CACHE.INTERVAL[szType][key][#CACHE.INTERVAL[szType][key] + 1] = nTime + end + end + end + if data then + local tar = X.GetTargetHandle(X.IsPlayer(dwOwner) and TARGET.PLAYER or TARGET.NPC, dwOwner) + local buff = tar and X.GetBuff(tar, dwBuffID, nBuffLevel) + local cfg, nClass + if data.nScrutinyType and not D.CheckScrutinyType(data.nScrutinyType, dwOwner) then -- 监控对象检查 + return + end + if data.tKungFu and not D.CheckKungFu(data.tKungFu) then -- 自身身法需求检查 + return + end + if data.nCount and nCount < data.nCount then -- 层数检查 + return + end + if bDelete then + cfg, nClass = data[MY_TEAM_MON_TYPE.BUFF_LOSE], MY_TEAM_MON_TYPE.BUFF_LOSE + else + cfg, nClass = data[MY_TEAM_MON_TYPE.BUFF_GET], MY_TEAM_MON_TYPE.BUFF_GET + end + local szSender = X.GetTargetName(X.IsPlayer(dwSkillSrcID) and TARGET.PLAYER or TARGET.NPC, dwSkillSrcID) + local szReceiver = X.GetTargetName(X.IsPlayer(dwOwner) and TARGET.PLAYER or TARGET.NPC, dwOwner) + D.CountdownEvent(data, nClass, szSender, szReceiver) + if cfg then + local szName, nIcon = X.GetBuffName(dwBuffID, nBuffLevel) + if data.szName then + szName = FilterCustomText(data.szName, szSender, szReceiver) + end + if data.nIcon then + nIcon = data.nIcon + end + local aXml, aText = {}, {} + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szReceiver == MY_TEAM_MON_CORE_NAME and g_tStrings.STR_YOU or szReceiver, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + if nClass == MY_TEAM_MON_TYPE.BUFF_GET then + ConstructSpeech(aText, aXml, _L['Get buff'], 44, 255, 255, 255) + ConstructSpeech(aText, aXml, szName .. ' x' .. nCount, 44, 255, 255, 0) + if buff then + local nTime = X.GetEndTime(buff.nEndFrame) + if nTime < 31536000 then + local szTime + if nTime > 600 then + szTime = X.FormatDuration(nTime, 'CHINESE') + else + szTime = _L('%ds', nTime) + end + ConstructSpeech(aText, aXml, _L(', remain time %s', szTime), 44, 255, 255, 255) + end + end + if data.szNote and not X.IsRestricted('MY_TeamMon.Note') then + ConstructSpeech(aText, aXml, _L[','], 44, 255, 255, 255) + ConstructSpeech(aText, aXml, FilterCustomText(data.szNote, szSender, szReceiver), 44, 255, 255, 255) + end + ConstructSpeech(aText, aXml, _L['.'], 44, 255, 255, 255) + else + ConstructSpeech(aText, aXml, _L['Lose buff'], 44, 255, 255, 255) + ConstructSpeech(aText, aXml, szName, 44, 255, 255, 0) + end + local szXml, szText = table.concat(aXml), table.concat(aText) + if O.bPushCenterAlarm and cfg.bCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', szXml, 3, true) + end + -- 特大文字 + if O.bPushBigFontAlarm and cfg.bBigFontAlarm and (MY_TEAM_MON_CORE_PLAYERID == dwOwner or not X.IsPlayer(dwOwner)) then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { GetHeadTextForceFontColor(dwOwner, MY_TEAM_MON_CORE_PLAYERID) }) + end + -- 语音报警 + if O.bPushVoiceAlarm and cfg.szVoice and (not cfg.bVoiceSelfOnly or dwOwner == MY_TEAM_MON_CORE_PLAYERID) then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', cfg.szVoice) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') and cfg.bSelect then + SetTarget(X.IsPlayer(dwOwner) and TARGET.PLAYER or TARGET.NPC, dwOwner) + end + + -- 获得处理 + if nClass == MY_TEAM_MON_TYPE.BUFF_GET then + if cfg.bAutoCancel and MY_TEAM_MON_CORE_PLAYERID == dwOwner then + X.CancelBuff(X.GetClientPlayer(), dwBuffID) + end + if cfg.tMark then + D.SetTeamMark(szType, cfg.tMark, dwOwner, dwBuffID, nBuffLevel) + end + -- 重要Buff列表 + if O.bPushPartyBuffList and X.IsPlayer(dwOwner) and cfg.bPartyBuffList and (X.IsTeammate(dwOwner) or MY_TEAM_MON_CORE_PLAYERID == dwOwner) then + FireUIEvent('MY_TEAM_MON__PARTY_BUFF_LIST', dwOwner, data.dwID, data.nLevel, data.nIcon) + end + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwOwner, szType, 'MY_TEAM_MON_BUFF_' .. data.dwID, { + dwBuffID = data.dwID, + szText = szName, + col = data.col or (szType == 'BUFF' and {0, 255, 0} or {255, 0, 0}), + }) + end + if MY_TEAM_MON_CORE_PLAYERID == dwOwner then + if O.bPushBuffList and cfg.bBuffList then + local col = szType == 'BUFF' and { 0, 255, 0 } or { 255, 0, 0 } + if data.col then + col = data.col + end + FireUIEvent('MY_TEAM_MON__BUFF_LIST__CREATE', data.dwID, data.nLevel, col, data, szSender, szReceiver) + end + -- 全屏泛光 + if O.bPushFullScreen and cfg.bFullScreen then + FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', data.dwID .. '_' .. data.nLevel, { + nTime = 3, + col = data.col, + tBindBuff = { data.dwID, data.nLevel } + }) + end + end + -- 添加到团队面板 + if O.bPushTeamPanel and cfg.bTeamPanel + and (not cfg.bOnlySelfSrc or dwSkillSrcID == MY_TEAM_MON_CORE_PLAYERID) + and X.IsEmpty(data.aCataclysmBuff) + and not X.IsRestricted('MY_TeamMon.Cataclysm') then + FireUIEvent('MY_RAID_REC_BUFF', dwOwner, { + dwID = data.dwID, + nLevel = data.bCheckLevel and data.nLevel or 0, + nLevelEx = data.nLevel, + nStackNum = data.nCount, + col = data.col, + nIcon = data.nIcon, + bOnlyMine = cfg.bOnlySelfSrc, + }) + end + end + if O.bPushTeamChannel and cfg.bTeamChannel then + D.Talk('RAID', szText, szReceiver) + end + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('WHISPER', szText, szReceiver) + end + end + end +end + +-- 技能事件 +function D.OnSkillCast(dwCaster, dwCastID, dwLevel, szEvent) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + if MY_TEAM_MON_SHIELDED_OTHER_PLAYER and X.IsPlayer(dwCaster) and dwCaster ~= MY_TEAM_MON_CORE_PLAYERID then + return + end + local key = dwCastID .. '_' .. dwLevel + local nTime = GetTime() + CACHE.SKILL_LIST[dwCaster] = CACHE.SKILL_LIST[dwCaster] or {} + if CACHE.SKILL_LIST[dwCaster][key] and nTime - CACHE.SKILL_LIST[dwCaster][key] < 62.5 then -- 1/16 + return + end + if dwCastID == 13165 then -- 内功切换 + if szEvent == 'UI_OME_SKILL_CAST_LOG' then + FireUIEvent('MY_KUNGFU_SWITCH', dwCaster) + end + end + local data = D.GetData('CASTING', dwCastID, dwLevel) + if Table_IsSkillShow(dwCastID, dwLevel) or not X.IsRestricted('MY_TeamMon.HiddenSkill') then + local tWeak, tTemp = CACHE.TEMP.CASTING, D.TEMP.CASTING + if not tWeak[key] then + local t = { + dwMapID = X.GetMapID(), + dwID = dwCastID, + nLevel = dwLevel, + bIsPlayer = X.IsPlayer(dwCaster), + szSrcName = D.GetSrcName(dwCaster), + nCurrentTime = GetCurrentTime() + } + tWeak[key] = t + tTemp[#tTemp + 1] = tWeak[key] + FireUIEvent('MY_TEAM_MON__UI__TEMP_UPDATE', 'CASTING', t) + end + CACHE.INTERVAL.CASTING[key] = CACHE.INTERVAL.CASTING[key] or {} + CACHE.INTERVAL.CASTING[key][#CACHE.INTERVAL.CASTING[key] + 1] = nTime + CACHE.SKILL_LIST[dwCaster][key] = nTime + end + -- 监控数据 + if data then + if data.nScrutinyType and not D.CheckScrutinyType(data.nScrutinyType, dwCaster) then -- 监控对象检查 + return + end + if data.tKungFu and not D.CheckKungFu(data.tKungFu) then -- 自身身法需求检查 + return + end + local szName, nIcon = X.GetSkillName(dwCastID, dwLevel) + local szSender, szReceiver + local KObject = X.IsPlayer(dwCaster) and X.GetPlayer(dwCaster) or X.GetNpc(dwCaster) + if KObject then + szSender = X.GetTargetName(X.IsPlayer(dwCaster) and TARGET.PLAYER or TARGET.NPC, dwCaster) + szReceiver = X.GetTargetName(KObject.GetTarget()) + else + szSender = X.GetTargetName(X.IsPlayer(dwCaster) and TARGET.PLAYER or TARGET.NPC, dwCaster) + end + if data.szName then + szName = FilterCustomText(data.szName, szSender, szReceiver) + end + if data.nIcon then + nIcon = data.nIcon + end + local cfg, nClass + if szEvent == 'UI_OME_SKILL_CAST_LOG' then + cfg, nClass = data[MY_TEAM_MON_TYPE.SKILL_BEGIN], MY_TEAM_MON_TYPE.SKILL_BEGIN + else + cfg, nClass = data[MY_TEAM_MON_TYPE.SKILL_END], MY_TEAM_MON_TYPE.SKILL_END + end + D.CountdownEvent(data, nClass, szSender, szReceiver) + if cfg then + local aXml, aText = {}, {} + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szSender, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + if nClass == MY_TEAM_MON_TYPE.SKILL_END then + ConstructSpeech(aText, aXml, _L['use of'], 44, 255, 255, 255) + else + ConstructSpeech(aText, aXml, _L['Casting'], 44, 255, 255, 255) + end + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szName, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + if data.bMonTarget and szReceiver then + ConstructSpeech(aText, aXml, g_tStrings.TARGET, 44, 255, 255, 255) + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szReceiver == MY_TEAM_MON_CORE_NAME and g_tStrings.STR_YOU or szReceiver, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + end + if data.szNote and not X.IsRestricted('MY_TeamMon.Note') then + ConstructSpeech(aText, aXml, ' ' .. FilterCustomText(data.szNote, szSender, szReceiver), 44, 255, 255, 255) + end + local szXml, szText = table.concat(aXml), table.concat(aText) + if O.bPushCenterAlarm and cfg.bCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', szXml, 3, true) + end + -- 特大文字 + if O.bPushBigFontAlarm and cfg.bBigFontAlarm then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { GetHeadTextForceFontColor(dwCaster, MY_TEAM_MON_CORE_PLAYERID) }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') and cfg.bSelect then + SetTarget(X.IsPlayer(dwCaster) and TARGET.PLAYER or TARGET.NPC, dwCaster) + end + if cfg.tMark then + D.SetTeamMark('CASTING', cfg.tMark, dwCaster, dwCastID, dwLevel) + end + -- 语音报警 + if O.bPushVoiceAlarm and cfg.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', cfg.szVoice) + end + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwCaster, 'CASTING', 'MY_TEAM_MON_CASTING_' .. data.dwID, { + dwSkillID = dwCastID, + szText = szName, + col = data.col, + }) + end + -- 全屏泛光 + if O.bPushFullScreen and cfg.bFullScreen then + FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', data.dwID .. '#SKILL#' .. data.nLevel, { nTime = 3, col = data.col}) + end + if O.bPushTeamChannel and cfg.bTeamChannel then + D.Talk('RAID', szText, szReceiver) + end + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('RAID_WHISPER', szText, szReceiver) + end + end + end +end + +-- NPC事件 +function D.OnNpcEvent(npc, bEnter) + local data = D.GetData('NPC', npc.dwTemplateID) + local nTime = GetTime() + if MY_TEAM_MON_SHIELDED_OTHER_PLAYER and X.IsPlayer(npc.dwEmployer) and npc.dwEmployer ~= MY_TEAM_MON_CORE_PLAYERID then + return + end + if bEnter then + if not CACHE.NPC_LIST[npc.dwTemplateID] then + CACHE.NPC_LIST[npc.dwTemplateID] = { + tList = {}, + nTime = -1, + nCount = 0, + } + end + CACHE.NPC_LIST[npc.dwTemplateID].tList[npc.dwID] = { + bFightState = false, + } + CACHE.NPC_LIST[npc.dwTemplateID].nCount = CACHE.NPC_LIST[npc.dwTemplateID].nCount + 1 + local tWeak, tTemp = CACHE.TEMP.NPC, D.TEMP.NPC + if not tWeak[npc.dwTemplateID] then + local t = { + dwMapID = X.GetMapID(), + dwID = npc.dwTemplateID, + nFrame = select(2, GetNpcHeadImage(npc.dwID)), + col = { GetHeadTextForceFontColor(npc.dwID, MY_TEAM_MON_CORE_PLAYERID) }, + nCurrentTime = GetCurrentTime() + } + tWeak[npc.dwTemplateID] = t + tTemp[#tTemp + 1] = tWeak[npc.dwTemplateID] + FireUIEvent('MY_TEAM_MON__UI__TEMP_UPDATE', 'NPC', t) + end + CACHE.INTERVAL.NPC[npc.dwTemplateID] = CACHE.INTERVAL.NPC[npc.dwTemplateID] or {} + if #CACHE.INTERVAL.NPC[npc.dwTemplateID] > 0 then + if nTime - CACHE.INTERVAL.NPC[npc.dwTemplateID][#CACHE.INTERVAL.NPC[npc.dwTemplateID]] > 500 then + CACHE.INTERVAL.NPC[npc.dwTemplateID][#CACHE.INTERVAL.NPC[npc.dwTemplateID] + 1] = nTime + end + else + CACHE.INTERVAL.NPC[npc.dwTemplateID][#CACHE.INTERVAL.NPC[npc.dwTemplateID] + 1] = nTime + end + else + local npcInfo = CACHE.NPC_LIST[npc.dwTemplateID] + if npcInfo then + local tab = npcInfo.tList[npc.dwID] + if tab then + npcInfo.tList[npc.dwID] = nil + npcInfo.nCount = npcInfo.nCount - 1 + if tab.bFightState then + FireUIEvent('MY_TEAM_MON_NPC_FIGHT', npc.dwTemplateID, false, GetTime() - (tab.nSec or GetTime())) + end + if npcInfo.nCount == 0 then + CACHE.NPC_LIST[npc.dwTemplateID] = nil + FireUIEvent('MY_TEAM_MON_ALL_LEAVE_SCENE', npc.dwTemplateID) + end + end + end + end + if MY_TEAM_MON_SHIELDED_TOTAL or MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE then + return + end + if data then + local cfg, nClass, nCount + if data.tKungFu and not D.CheckKungFu(data.tKungFu) then -- 自身身法需求检查 + return + end + local szSender = nil + local szReceiver = X.GetNpcName(npc.dwID) + if bEnter then + cfg, nClass = data[MY_TEAM_MON_TYPE.NPC_ENTER], MY_TEAM_MON_TYPE.NPC_ENTER + nCount = CACHE.NPC_LIST[npc.dwTemplateID].nCount + else + cfg, nClass = data[MY_TEAM_MON_TYPE.NPC_LEAVE], MY_TEAM_MON_TYPE.NPC_LEAVE + end + if nClass == MY_TEAM_MON_TYPE.NPC_LEAVE then + if data.bAllLeave and CACHE.NPC_LIST[npc.dwTemplateID] then + return + end + else + -- 场地上的NPC数量没达到预期数量 + if data.nCount and nCount < data.nCount then + return + end + if cfg then + if cfg.tMark then + D.SetTeamMark('NPC', cfg.tMark, npc.dwID, npc.dwTemplateID) + end + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + local szNote, szName = nil, FilterCustomText(data.szName, szSender, szReceiver) + if not X.IsRestricted('MY_TeamMon.Note') then + szNote = FilterCustomText(data.szNote, szSender, szReceiver) or szName + end + FireUIEvent('MY_LIFEBAR_COUNTDOWN', npc.dwID, 'NPC', 'MY_TEAM_MON_NPC_' .. npc.dwID, { + szName = szName, + szText = szNote, + col = data.col, + }) + end + end + if nTime - CACHE.NPC_LIST[npc.dwTemplateID].nTime < 500 then -- 0.5秒内进入相同的NPC直接忽略 + return -- D.Log('IGNORE NPC ENTER SCENE ID:' .. npc.dwTemplateID .. ' TIME:' .. nTime .. ' TIME2:' .. CACHE.NPC_LIST[npc.dwTemplateID].nTime) + else + CACHE.NPC_LIST[npc.dwTemplateID].nTime = nTime + end + end + D.CountdownEvent(data, nClass, szSender, szReceiver) + if cfg then + local szName = szReceiver + if data.szName then + szName = FilterCustomText(data.szName, szSender, szReceiver) + end + local aXml, aText = {}, {} + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szName, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + if nClass == MY_TEAM_MON_TYPE.NPC_ENTER then + ConstructSpeech(aText, aXml, _L['Appear'], 44, 255, 255, 255) + if nCount > 1 then + ConstructSpeech(aText, aXml, ' x' .. nCount, 44, 255, 255, 0) + end + if data.szNote and not X.IsRestricted('MY_TeamMon.Note') then + ConstructSpeech(aText, aXml, ' ' .. FilterCustomText(data.szNote, szSender, szReceiver), 44, 255, 255, 255) + end + else + ConstructSpeech(aText, aXml, _L['Disappear'], 44, 255, 255, 255) + end + local szXml, szText = table.concat(aXml), table.concat(aText) + if O.bPushCenterAlarm and cfg.bCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', szXml, 3, true) + end + -- 特大文字 + if O.bPushBigFontAlarm and cfg.bBigFontAlarm then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { GetHeadTextForceFontColor(npc.dwID, MY_TEAM_MON_CORE_PLAYERID) }) + end + -- 语音报警 + if O.bPushVoiceAlarm and cfg.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', cfg.szVoice) + end + + if O.bPushTeamChannel and cfg.bTeamChannel then + D.Talk('RAID', szText) + end + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('RAID_WHISPER', szText) + end + + if nClass == MY_TEAM_MON_TYPE.NPC_ENTER then + if not X.IsRestricted('MY_TeamMon.AutoSelect') and cfg.bSelect then + SetTarget(TARGET.NPC, npc.dwID) + end + if O.bPushFullScreen and cfg.bFullScreen then + FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', 'NPC', { nTime = 3, col = data.col, bFlash = true }) + end + end + end + end +end + +-- DOODAD事件 +function D.OnDoodadEvent(doodad, bEnter) + local data = D.GetData('DOODAD', doodad.dwTemplateID) + local nTime = GetTime() + if bEnter then + if not CACHE.DOODAD_LIST[doodad.dwTemplateID] then + CACHE.DOODAD_LIST[doodad.dwTemplateID] = { + tList = {}, + nTime = -1, + nCount = 0, + } + end + CACHE.DOODAD_LIST[doodad.dwTemplateID].tList[doodad.dwID] = {} + CACHE.DOODAD_LIST[doodad.dwTemplateID].nCount = CACHE.DOODAD_LIST[doodad.dwTemplateID].nCount + 1 + if doodad.nKind ~= DOODAD_KIND.ORNAMENT or not X.IsRestricted('MY_TeamMon.HiddenDoodad') then + local tWeak, tTemp = CACHE.TEMP.DOODAD, D.TEMP.DOODAD + if not tWeak[doodad.dwTemplateID] then + local t = { + dwMapID = X.GetMapID(), + dwID = doodad.dwTemplateID, + nCurrentTime = GetCurrentTime() + } + tWeak[doodad.dwTemplateID] = t + tTemp[#tTemp + 1] = tWeak[doodad.dwTemplateID] + FireUIEvent('MY_TEAM_MON__UI__TEMP_UPDATE', 'DOODAD', t) + end + end + CACHE.INTERVAL.DOODAD[doodad.dwTemplateID] = CACHE.INTERVAL.DOODAD[doodad.dwTemplateID] or {} + if #CACHE.INTERVAL.DOODAD[doodad.dwTemplateID] > 0 then + if nTime - CACHE.INTERVAL.DOODAD[doodad.dwTemplateID][#CACHE.INTERVAL.DOODAD[doodad.dwTemplateID]] > 500 then + CACHE.INTERVAL.DOODAD[doodad.dwTemplateID][#CACHE.INTERVAL.DOODAD[doodad.dwTemplateID] + 1] = nTime + end + else + CACHE.INTERVAL.DOODAD[doodad.dwTemplateID][#CACHE.INTERVAL.DOODAD[doodad.dwTemplateID] + 1] = nTime + end + else + local doodadInfo = CACHE.DOODAD_LIST[doodad.dwTemplateID] + if doodadInfo then + local tab = doodadInfo.tList[doodad.dwID] + if tab then + doodadInfo.tList[doodad.dwID] = nil + doodadInfo.nCount = doodadInfo.nCount - 1 + if doodadInfo.nCount == 0 then + CACHE.DOODAD_LIST[doodad.dwTemplateID] = nil + FireUIEvent('MY_TEAM_MON_DOODAD_ALL_LEAVE_SCENE', doodad.dwTemplateID) + end + end + end + end + if MY_TEAM_MON_SHIELDED_TOTAL or MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE then + return + end + if data then + local cfg, nClass, nCount + if data.tKungFu and not D.CheckKungFu(data.tKungFu) then -- 自身身法需求检查 + return + end + local szSender = nil + local szReceiver = X.GetDoodadName(doodad.dwID) + if bEnter then + cfg, nClass = data[MY_TEAM_MON_TYPE.DOODAD_ENTER], MY_TEAM_MON_TYPE.DOODAD_ENTER + nCount = CACHE.DOODAD_LIST[doodad.dwTemplateID].nCount + else + cfg, nClass = data[MY_TEAM_MON_TYPE.DOODAD_LEAVE], MY_TEAM_MON_TYPE.DOODAD_LEAVE + end + if nClass == MY_TEAM_MON_TYPE.DOODAD_LEAVE then + if data.bAllLeave and CACHE.DOODAD_LIST[doodad.dwTemplateID] then + return + end + else + -- 场地上的DOODAD数量没达到预期数量 + if data.nCount and nCount < data.nCount then + return + end + if cfg then + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + local szNote, szName = nil, FilterCustomText(data.szName, szSender, szReceiver) + if not X.IsRestricted('MY_TeamMon.Note') then + szNote = FilterCustomText(data.szNote, szSender, szReceiver) or szName + end + FireUIEvent('MY_LIFEBAR_COUNTDOWN', doodad.dwID, 'DOODAD', 'MY_TEAM_MON_DOODAD_' .. doodad.dwID, { + szName = szName, + szText = szNote, + col = data.col, + }) + end + end + if nTime - CACHE.DOODAD_LIST[doodad.dwTemplateID].nTime < 500 then + return + else + CACHE.DOODAD_LIST[doodad.dwTemplateID].nTime = nTime + end + end + D.CountdownEvent(data, nClass, szSender, szReceiver) + if cfg then + local szName = szReceiver + if data.szName then + szName = FilterCustomText(data.szName, szSender, szReceiver) + end + local aXml, aText = {}, {} + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szName, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + if nClass == MY_TEAM_MON_TYPE.DOODAD_ENTER then + ConstructSpeech(aText, aXml, _L['Appear'], 44, 255, 255, 255) + if nCount > 1 then + ConstructSpeech(aText, aXml, ' x' .. nCount, 44, 255, 255, 0) + end + if data.szNote and not X.IsRestricted('MY_TeamMon.Note') then + ConstructSpeech(aText, aXml, ' ' .. FilterCustomText(data.szNote, szSender, szReceiver), 44, 255, 255, 255) + end + else + ConstructSpeech(aText, aXml, _L['Disappear'], 44, 255, 255, 255) + end + local szXml, szText = table.concat(aXml), table.concat(aText) + if O.bPushCenterAlarm and cfg.bCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', szXml, 3, true) + end + -- 特大文字 + if O.bPushBigFontAlarm and cfg.bBigFontAlarm then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { 255, 255, 0 }) + end + -- 语音报警 + if O.bPushVoiceAlarm and cfg.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', cfg.szVoice) + end + + if O.bPushTeamChannel and cfg.bTeamChannel then + D.Talk('RAID', szText) + end + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('RAID_WHISPER', szText) + end + + if nClass == MY_TEAM_MON_TYPE.DOODAD_ENTER then + if not X.IsRestricted('MY_TeamMon.AutoSelect') and cfg.bSelect then + SetTarget(TARGET.DOODAD, doodad.dwID) + end + if O.bPushFullScreen and cfg.bFullScreen then + FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', 'DOODAD', { nTime = 3, col = data.col, bFlash = true }) + end + end + end + end +end + +function D.OnDoodadAllLeave(dwTemplateID) + if MY_TEAM_MON_SHIELDED_TOTAL or MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE then + return + end + local data = D.GetData('DOODAD', dwTemplateID) + if data then + local szSender = nil + local szReceiver = X.GetDoodadTemplateName(dwTemplateID) + D.CountdownEvent(data, MY_TEAM_MON_TYPE.DOODAD_ALLLEAVE, szSender, szReceiver) + end +end + +-- 系统和NPC喊话处理 +-- OutputMessage('MSG_SYS', 1..'\n') +function D.OnCallMessage(szEvent, szContent, dwNpcID, szNpcName) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + if dwNpcID and not X.IsPlayer(dwNpcID) then + local npc = X.GetNpc(dwNpcID) + if npc and X.IsShieldedNpc(npc.dwTemplateID, 'TALK') then + return + end + end + -- 近期记录 + szContent = tostring(szContent) + local me = X.GetClientPlayer() + local key = (szNpcName or 'sys') .. '::' .. szContent + local tWeak, tTemp = CACHE.TEMP[szEvent], D.TEMP[szEvent] + if not tWeak[key] then + local t = { + dwMapID = me.GetMapID(), + szContent = szContent, + szTarget = szNpcName, + nCurrentTime = GetCurrentTime() + } + tWeak[key] = t + tTemp[#tTemp + 1] = tWeak[key] + FireUIEvent('MY_TEAM_MON__UI__TEMP_UPDATE', szEvent, t) + end + local cache, data = CACHE.MAP[szEvent], nil + if cache.HIT[szContent] then + data = cache.HIT[szContent][szNpcName or 'sys'] + or cache.HIT[szContent]['%'] + end + local szSender, dwReceiverID, szReceiver, aBackreferences = szNpcName or _L['JX3'] + if not data then -- 涉及匹配的规则不会被缓存,不适用 wstring ,性能考虑为前提 + local bInParty = me.IsInParty() + local team = GetClientTeam() + for _, v in ipairs(cache.OTHER) do -- 按照数据优先级顺序(地图>地图组>通用),同级按照下标先后顺序,只取第一个匹配结果 + local content = v.szContent + if v.szContent:find('{$me}', nil, true) then + dwReceiverID = me.dwID + szReceiver = me.szName + content = v.szContent:gsub('{$me}', me.szName) -- 转换me是自己名字 + else + dwReceiverID, szReceiver = nil + end + if bInParty and content:find('{$team}', nil, true) then + local c = content + for _, vv in ipairs(team.GetTeamMemberList()) do + if string.find(szContent, c:gsub('{$team}', team.GetClientTeamMemberName(vv)), nil, true) and (v.szTarget == szNpcName or v.szTarget == '%') then -- hit + data = v + dwReceiverID = vv + szReceiver = team.GetClientTeamMemberName(vv) + break + end + end + if dwReceiverID and szReceiver then + break + end + elseif v.szTarget == szNpcName or v.szTarget == '%' then + if v.bReg then + local res = {string.find(szContent, content)} + if res[1] then + table.remove(res, 1) + table.remove(res, 1) + data = v + aBackreferences = res + break + end + elseif string.find(szContent, content, nil, true) then + data = v + break + end + end + end + end + if data then + local nClass = szEvent == 'TALK' + and MY_TEAM_MON_TYPE.TALK_MONITOR + or MY_TEAM_MON_TYPE.CHAT_MONITOR + if not dwReceiverID and not szReceiver and data.szContent:find('{$me}', nil, true) then + dwReceiverID = me.dwID + szReceiver = me.szName + end + D.CountdownEvent(data, nClass, szSender, szReceiver, aBackreferences) + local cfg = data[nClass] + if cfg then + local aXml, aText, aTalkXml, aTalkText = {}, {}, {}, {} + if szReceiver then + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, szSender, 44, 255, 255, 0) + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, _L['is calling'], 44, 255, 255, 255) + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, szReceiver == me.szName and g_tStrings.STR_YOU or szReceiver, 44, 255, 255, 0) + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, _L['\'s name.'], 44, 255, 255, 255) + else + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, szSender, 44, 255, 255, 0) + ConstructSpeech(aTalkText, aTalkXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + ConstructSpeech(aTalkText, aTalkXml, g_tStrings.HEADER_SHOW_SAY, 44, 255, 255, 0) + ConstructSpeech(aTalkText, aTalkXml, szContent, 44, 255, 255, 0) + end + if data.szNote then + ConstructSpeech(aText, aXml, FilterCustomText(data.szNote, szSender, szReceiver, aBackreferences) or szContent, 44, 255, 255, 255) + end + local szXml, szText, szTalkXml, szTalkText = table.concat(aXml), table.concat(aText), table.concat(aTalkXml), table.concat(aTalkText) + if X.IsEmpty(szXml) then + szXml = szTalkXml + end + if X.IsEmpty(szText) then + szText = szTalkText + end + if dwReceiverID then -- 点了人名 + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('WHISPER', szTalkText, szReceiver) + end + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwReceiverID, 'TIME', 'MY_TEAM_MON_TIME_' .. dwReceiverID, { + nTime = GetTime() + 5000, + szText = _L('%s call name', szNpcName or g_tStrings.SYSTEM), + col = data.col, + bHideProgress = true, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') and cfg.bSelect then + SetTarget(TARGET.PLAYER, dwReceiverID) + end + else -- 没点名 + if O.bPushWhisperChannel and cfg.bWhisperChannel then + D.Talk('RAID_WHISPER', szTalkText) + end + -- 头顶报警 + if O.bPushScreenHead and cfg.bScreenHead then + FireUIEvent('MY_LIFEBAR_COUNTDOWN', dwNpcID or me.dwID, 'TIME', 'MY_TEAM_MON_TIME_' .. (dwNpcID or me.dwID), { + nTime = GetTime() + 5000, + szText = szText, + col = data.col, + bHideProgress = true, + }) + end + end + -- 中央报警 + if O.bPushCenterAlarm and cfg.bCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', #aXml > 0 and szXml or szText, 3, #aXml > 0) + end + -- 特大文字 + if O.bPushBigFontAlarm and cfg.bBigFontAlarm then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { 255, 128, 0 }) + end + -- 语音报警 + if O.bPushVoiceAlarm and cfg.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', cfg.szVoice) + end + if O.bPushFullScreen and cfg.bFullScreen then + if not dwReceiverID or dwReceiverID == me.dwID then + FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', szEvent, { nTime = 3, col = data.col or { 0, 255, 0 }, bFlash = true }) + end + end + if O.bPushTeamChannel and cfg.bTeamChannel then + if szReceiver and not data.szNote then + D.Talk('RAID', szTalkText, szReceiver) + else + D.Talk('RAID', szTalkText) + end + end + end + end +end + +-- NPC死亡事件 触发倒计时 +function D.OnDeath(dwCharacterID, dwKiller) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + local npc = X.GetNpc(dwCharacterID) + if npc then + local data = D.GetData('NPC', npc.dwTemplateID) + if data then + local dwTemplateID = npc.dwTemplateID + local szSender = X.GetTargetName(X.IsPlayer(dwKiller) and TARGET.PLAYER or TARGET.NPC, dwKiller, { eShowID = 'auto' }) + local szReceiver = X.GetNpcName(npc.dwID) + D.CountdownEvent(data, MY_TEAM_MON_TYPE.NPC_DEATH, szSender, szReceiver) + local bAllDeath = true + if CACHE.NPC_LIST[dwTemplateID] then + for k, v in pairs(CACHE.NPC_LIST[dwTemplateID].tList) do + local npc = X.GetNpc(k) + if npc and npc.nMoveState ~= MOVE_STATE.ON_DEATH then + bAllDeath = false + break + end + end + end + if bAllDeath then + D.CountdownEvent(data, MY_TEAM_MON_TYPE.NPC_ALLDEATH, szSender, szReceiver) + end + end + end +end + +-- NPC进出战斗事件 触发倒计时 +function D.OnNpcFight(dwTemplateID, bFight) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + local data = D.GetData('NPC', dwTemplateID) + if data then + local szSender = nil + local szReceiver = X.GetNpcTemplateName(dwTemplateID) + if bFight then + D.CountdownEvent(data, MY_TEAM_MON_TYPE.NPC_FIGHT, szSender, szReceiver) + elseif data.tCountdown then -- 脱离的时候清空下 + for i, v in ipairs(data.tCountdown) do + if v.nClass == MY_TEAM_MON_TYPE.NPC_FIGHT and not v.bFightHold then + local nType, szKey = D.GetCountdownTypeKey(data, i, szSender, szReceiver) + FireUIEvent('MY_TEAM_MON__SPELL_TIMER__DEL', nType, szKey) -- try kill + end + end + end + end +end + +-- 不该放在倒计时中 需要重构 +function D.OnNpcInfoChange(szEvent, dwTemplateID, nPer, bIncrease) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + local data = D.GetData('NPC', dwTemplateID) + if data and data.tCountdown then + local dwType = szEvent == 'MY_TEAM_MON_NPC_LIFE_CHANGE' and MY_TEAM_MON_TYPE.NPC_LIFE or MY_TEAM_MON_TYPE.NPC_MANA + local szSender = nil + local szReceiver = X.GetNpcTemplateName(dwTemplateID) + for k, v in ipairs(data.tCountdown) do + if v.nClass == dwType then + local aHPCountdown = ParseHPCountdown(v.nTime) + for kk, tHpCd in ipairs(aHPCountdown) do + if tHpCd.nValue == nPer + and (tHpCd.szOperator == '*' or (bIncrease and tHpCd.szOperator == '+') or (not bIncrease and tHpCd.szOperator == '-')) then -- hit + local szName = FilterCustomText(data.szName, szSender, szReceiver) or szReceiver + local aXml, aText = {}, {} + ConstructSpeech(aText, aXml, MY_TEAM_MON_LEFT_BRACKET, MY_TEAM_MON_LEFT_BRACKET_XML) + ConstructSpeech(aText, aXml, szName, 44, 255, 255, 0) + ConstructSpeech(aText, aXml, MY_TEAM_MON_RIGHT_BRACKET, MY_TEAM_MON_RIGHT_BRACKET_XML) + ConstructSpeech(aText, aXml, dwType == MY_TEAM_MON_TYPE.NPC_LIFE and _L['\'s life remaining to '] or _L['\'s mana reaches '], 44, 255, 255, 255) + ConstructSpeech(aText, aXml, ' ' .. tHpCd.nValue .. '%', 44, 255, 255, 0) + ConstructSpeech(aText, aXml, ' ' .. FilterCustomText(tHpCd.szContent, szSender, szReceiver), 44, 255, 255, 255) + local szXml, szText = table.concat(aXml), table.concat(aText) + if O.bPushCenterAlarm then + FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', szXml, 3, true) + end + if O.bPushBigFontAlarm then + FireUIEvent('MY_TEAM_MON__LARGE_TEXT_ALARM', szText, data.col or { 255, 128, 0 }) + end + if O.bPushTeamChannel and v.bTeamChannel then + D.Talk('RAID', szText) + end + if O.bPushVoiceAlarm and tHpCd.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', tHpCd.szVoice) + end + if tHpCd.nTime then + local nType, szKey = v.nClass, v.key + if szKey then + nType = MY_TEAM_MON_TYPE.COMMON + else + szKey = k .. '.' .. dwTemplateID .. '.' .. kk + end + local tParam = { + nIcon = v.nIcon, + nFrame = v.nFrame, + szContent = FilterCustomText(tHpCd.szContent, szSender, szReceiver), + nTime = tHpCd.nTime, + bTalk = v.bTeamChannel, + bHold = v.bHold, + } + D.FireCountdownEvent(nType, szKey, tParam, szSender, szReceiver) + end + break + end + end + end + end + end +end + +-- NPC 全部消失的倒计时处理 +function D.OnNpcAllLeave(dwTemplateID) + if MY_TEAM_MON_SHIELDED_TOTAL or MY_TEAM_MON_SHIELDED_ENTER_LEAVE_SCENE then + return + end + local data = D.GetData('NPC', dwTemplateID) + local szSender = nil + local szReceiver = X.GetNpcTemplateName(dwTemplateID) + if data then + D.CountdownEvent(data, MY_TEAM_MON_TYPE.NPC_ALLLEAVE, szSender, szReceiver) + end +end + +local MAP_ID, PREV_MAP_ID +function D.FireCrossMapEvent(szWhen) + local dwMapID = X.GetMapID(true) + if szWhen == 'before' then + if PREV_MAP_ID and PREV_MAP_ID ~= dwMapID then + local map = PREV_MAP_ID and X.GetMapInfo(PREV_MAP_ID) + if map then + local szEvent = 'CHAT' + local szContent = _L('Leave map %s.', map.szName) + D.OnCallMessage(szEvent, szContent) + end + PREV_MAP_ID = dwMapID + end + elseif szWhen == 'after' then + if MAP_ID ~= dwMapID then + local map = X.GetMapInfo(dwMapID) + if map then + local szEvent = 'CHAT' + local szContent = _L('Enter map %s.', map.szName) + D.OnCallMessage(szEvent, szContent) + end + MAP_ID = dwMapID + end + end +end + +-- RegisterMsgMonitor +function D.RegisterMessage(bEnable) + if bEnable then + X.RegisterMsgMonitor('MSG_SYS', 'MY_TeamMon_MON', function(szChannel, szMsg, nFont, bRich) + if MY_TEAM_MON_SHIELDED_TOTAL then + return + end + if not X.GetClientPlayer() then + return + end + if bRich then + szMsg = MY_GetPureText(szMsg) + end + -- local res, err = pcall(D.OnCallMessage, 'CHAT', szMsg:gsub('\r', '')) + -- if not res then + -- return X.OutputDebugMessage(err, X.DEBUG_LEVEL.WARNING) + -- end + szMsg = szMsg:gsub('\r', '') + D.OnCallMessage('CHAT', szMsg) + end) + else + X.RegisterMsgMonitor('MSG_SYS', 'MY_TeamMon_MON', false) + end +end + +-- UI操作 +function D.GetFrame() + return Station.Lookup('Normal/MY_TeamMon') +end + +function D.Open() + local frame = D.GetFrame() + if frame then + for k, v in ipairs(MY_TEAM_MON_EVENTS) do + frame:UnRegisterEvent(v) + frame:RegisterEvent(v) + end + D.RegisterMessage(true) + end +end + +function D.Close() + local frame = D.GetFrame() + if frame then + for k, v in ipairs(MY_TEAM_MON_EVENTS) do + frame:UnRegisterEvent(v) -- kill all event + end + D.RegisterMessage(false) + FireUIEvent('MY_TEAM_MON__SPELL_TIMER__CLEAR') + CACHE.NPC_LIST = {} + CACHE.DOODAD_LIST = {} + CACHE.SKILL_LIST = {} + collectgarbage('collect') + end +end + +function D.Enable(bEnable, bFireUIEvent) + if D.bReady and bEnable then + local res, err = pcall(D.Open) + if not res then + return X.OutputDebugMessage(err, X.DEBUG_LEVEL.WARNING) + end + if bFireUIEvent then + FireUIEvent('MY_TEAM_MON_LOADING_END') + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + else + D.Close() + end +end + +function D.Init() + local K = string.char(75, 69) + local k = string.char(80, 87) + if X.IsString(D[k]) then + D[k] = X[K](D[k] .. string.char(77, 89)) + end + D.LoadUserData() + X.UI.OpenFrame(MY_TEAM_MON_INI_FILE, 'MY_TeamMon') +end + +-- 保存用户监控数据、配置 +function D.SaveUserData() + X.SaveLUAData( + GetUserDataPath(), + { + data = D.FILE, + meta = D.META, + config = D.CONFIG, + }) +end + +-- 加载用户监控数据、配置 +function D.LoadUserData() + local data = X.LoadLUAData(GetUserDataPath()) + if X.IsTable(data) then + for k, v in pairs(D.FILE) do + D.FILE[k] = data.data[k] or {} + end + D.META = data.meta or {} + D.CONFIG = data.config or {} + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD') + else + D.ImportDataFromFile( + X.ENVIRONMENT.GAME_EDITION .. '.jx3dat', + MY_TEAM_MON_TYPE_LIST, + 'REPLACE', + function() + D.Log('load custom data finish!') + end) + end +end + +-- 获取用户配置项 +function D.GetUserConfig(szKey) + return D.CONFIG[szKey] +end + +-- 设置用户配置项 +function D.SetUserConfig(szKey, oVal) + D.CONFIG[szKey] = oVal +end + +-- 从内存导入数据 +function D.ImportData(data, aType, szMode, fnAction) + if not data then + X.SafeCall(fnAction, false, 'Can not read empty data.') + return + end + if not aType then + aType = X.Clone(MY_TEAM_MON_TYPE_LIST) + end + if szMode == 'REPLACE' then + for _, k in ipairs(aType) do + D.FILE[k] = data[k] or {} + end + elseif szMode == 'MERGE_OVERWRITE' or szMode == 'MERGE_SKIP' then + local fnMergeData = function(tab_data) + for _, szType in ipairs(aType) do + if tab_data[szType] then + for k, v in pairs(tab_data[szType]) do + for kk, vv in ipairs(v) do + if not D.CheckSameData(szType, k, vv.dwID or vv.szContent, vv.nLevel or vv.szTarget) then + D.FILE[szType][k] = D.FILE[szType][k] or {} + table.insert(D.FILE[szType][k], vv) + end + end + end + end + end + end + if szMode == 'MERGE_SKIP' then -- 源文件优先 + fnMergeData(data) + elseif szMode == 'MERGE_OVERWRITE' then -- 新文件优先 + -- 其实就是交换下顺序 + local tab_data = clone(D.FILE) + for _, k in ipairs(aType) do + D.FILE[k] = data[k] or {} + end + fnMergeData(tab_data) + end + end + if X.IsTable(data.__meta) then + if not (X.IsEmpty(data.__meta.szOfficialVoicePacketUUID) and X.IsEmpty(data.__meta.szCustomVoicePacketUUID)) + and O.bShowVoicePacketRecommendation then + MY_TeamMon_VoiceAlarm.ShowVoiceRecommendation(data.__meta.szOfficialVoicePacketUUID, data.__meta.szCustomVoicePacketUUID) + end + D.META = data.__meta + else + D.META = {} + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD') + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') + -- bStatus, szFilePath, aType, szMode, tMeta + X.SafeCall(fnAction, true, 'LUAData', aType, szMode, X.Clone(D.META)) +end + +-- 从文件导入数据 +function D.ImportDataFromFile(szFileName, aType, szMode, fnAction) + local szFullPath = szFileName:sub(2, 2) == ':' + and szFileName + or X.GetAbsolutePath(szFileName) + local szFilePath = X.GetRelativePath(szFullPath, {'', X.PATH_TYPE.NORMAL}) or szFullPath + if not IsFileExist(szFilePath) then + X.SafeCall(fnAction, false, 'File does not exist.') + return + end + local data = X.LoadLUAData(szFilePath, { passphrase = D.PW }) + or X.LoadLUAData(szFilePath, { passphrase = false }) + if not data then + X.SafeCall(fnAction, false, 'Can not read data file.') + return + end + D.ImportData(data, aType, szMode, function(bStatus, szFilePath, aType, szMode, tMeta) fnAction(bStatus, szFullPath:gsub('\\', '/'), aType, szMode, tMeta) end) +end + +-- 导出数据到文件 +function D.ExportDataToFile(szFileName, aType, szFormat, szAuthor, fnAction) + local data = {} + for _, k in ipairs(aType) do + data[k] = D.FILE[k] + end + -- MY.20231110: add meta inherit + data.__meta = X.Clone(D.META) + -- HM.20170504: add meta data + data.__meta.szEdition = X.ENVIRONMENT.GAME_EDITION + data.__meta.szAuthor = not X.IsEmpty(szAuthor) and szAuthor or X.GetClientPlayerName() + data.__meta.szServer = select(4, GetUserServer()) + data.__meta.nTimeStamp = GetCurrentTime() + data.__meta.szOfficialVoicePacketUUID = MY_TeamMon_VoiceAlarm.GetCurrentPacketUUID('OFFICIAL') + data.__meta.szCustomVoicePacketUUID = MY_TeamMon_VoiceAlarm.GetCurrentPacketUUID('CUSTOM') + local szPath = MY_TEAM_MON_REMOTE_DATA_ROOT .. szFileName + if szFormat == 'JSON' or szFormat == 'JSON_FORMATTED' then + if szFormat ~= 'JSON' then + szPath = szPath .. '.' .. szFormat:lower():sub(6) + end + szPath = szPath .. '.json' + SaveDataToFile(X.EncodeJSON(data, szFormat == 'JSON_FORMATTED'), szPath) + else + if szFormat ~= 'LUA' then + szPath = szPath .. '.' .. szFormat:lower():sub(5) + end + szPath = szPath .. '.jx3dat' + local option = { + passphrase = szFormat == 'LUA_ENCRYPTED' + and D.PW + or false, + crc = szFormat == 'LUA_ENCRYPTED', + compress = szFormat == 'LUA_ENCRYPTED', + indent = szFormat == 'LUA_FORMATTED' and '\t' or nil, + encoder = (szFormat == 'LUA' or szFormat == 'LUA_FORMATTED') and 'luatext' or nil, + } + X.SaveLUAData(szPath, data, option) + end + X.SafeCall(fnAction, X.GetAbsolutePath(szPath)) +end + +-- 获取整个表 +function D.GetTable(szType, bTemp) + if bTemp then + return D.TEMP[szType] + else + return D.FILE[szType] + end +end + +-- 迭代数据表子序列 +function D.IterTable(data, dwMapID, bIterItem, bReverse) + local res = {} + if data then + if dwMapID == 0 then + dwMapID = X.GetMapID(true) + end + if data[MY_TEAM_MON_SPECIAL_MAP.COMMON] then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.COMMON]) + end + if X.IsCompetitionMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.COMPETITION]) + end + if X.IsDungeonMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.DUNGEON]) + end + if X.IsDungeonMap(dwMapID, true) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.RAID_DUNGEON]) + end + if X.IsDungeonMap(dwMapID, false) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.TEAM_DUNGEON]) + end + if X.IsCityMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.CITY]) + end + if X.IsVillageMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.VILLAGE]) + end + if X.IsCampMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.CAMP]) + end + if X.IsStrongholdMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.STRONGHOLD]) + end + if X.IsStarveMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.STARVE]) + end + if X.IsArenaMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.ARENA]) + end + if X.IsBattlefieldMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.BATTLEFIELD]) + end + if X.IsPubgMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.PUBG]) + end + if X.IsZombieMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.ZOMBIE]) + end + if X.IsMonsterMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.MONSTER]) + end + if X.IsMobaMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.MOBA]) + end + if X.IsSchoolMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.SCHOOL]) + end + if X.IsHomelandMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.HOMELAND]) + end + if X.IsGuildTerritoryMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.GUILD_TERRITORY]) + end + if X.IsRoguelikeMap(dwMapID) then + table.insert(res, data[MY_TEAM_MON_SPECIAL_MAP.ROGUELIKE]) + end + if data[dwMapID] then + table.insert(res, data[dwMapID]) + end + end + if bReverse then + if bIterItem then + return X.sipairs(unpack(res)) + end + return X.ipairs(res) + end + if bIterItem then + return X.sipairs_r(unpack(res)) + end + return X.ipairs_r(res) +end + +function D.GetMapName(dwMapID) + if dwMapID == _L['All data'] then + return dwMapID + end + local map = D.GetMapInfo(dwMapID) + if map then + return map.szName + end + return '#' .. dwMapID +end + +function D.GetMapInfo(id) + return MY_TEAM_MON_SPECIAL_MAP_INFO[id] or X.GetMapInfo(id) +end + +local function GetData(tab, szType, dwID, nLevel) + -- D.Log('LOOKUP TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:' .. nLevel) + if nLevel then + for k, v in ipairs(tab) do + if v.dwID == dwID and (not v.bCheckLevel or v.nLevel == nLevel) then + CACHE.MAP[szType][dwID][nLevel] = k + return v + end + end + else + for k, v in ipairs(tab) do + if v.dwID == dwID then + CACHE.MAP[szType][dwID] = k + return v + end + end + end +end + +-- 获取监控数据 注意 不是获取文件内的 如果想找文件内的 请使用 GetTable +function D.GetData(szType, dwID, nLevel) + local cache = CACHE.MAP[szType][dwID] + if cache then + local tab = D.DATA[szType] + if nLevel then + if cache[nLevel] then + local data = tab[cache[nLevel]] + if data and data.dwID == dwID and (not data.bCheckLevel or data.nLevel == nLevel) then + -- D.Log('HIT TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:' .. nLevel) + return data + else + -- D.Log('RELOOKUP TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:' .. nLevel) + return GetData(tab, szType, dwID, nLevel) + end + else + for k, v in pairs(cache) do + local data = tab[cache[k]] + if data and data.dwID == dwID and (not data.bCheckLevel or data.nLevel == nLevel) then + return data + end + end + return GetData(tab, szType, dwID, nLevel) + end + else + local data = tab[cache] + if data and data.dwID == dwID then + -- D.Log('HIT TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:0') + return data + else + -- D.Log('RELOOKUP TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:0') + return GetData(tab, szType, dwID) + end + end + -- else + -- D.Log('IGNORE TYPE:' .. szType .. ' ID:' .. dwID .. ' LEVEL:' .. (nLevel or 0)) + end +end + +-- 删除 移动 添加 清空 +function D.RemoveData(szType, dwMapID, nIndex) + if nIndex then + if not D.FILE[szType][dwMapID] or not D.FILE[szType][dwMapID][nIndex] then + return + end + if dwMapID == MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN then + table.remove(D.FILE[szType][dwMapID], nIndex) + if #D.FILE[szType][dwMapID] == 0 then + D.FILE[szType][dwMapID] = nil + end + return + end + D.MoveData(szType, dwMapID, nIndex, MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN) + elseif dwMapID then + if not D.FILE[szType][dwMapID] then + return + end + D.FILE[szType][dwMapID] = nil + else + if not D.FILE[szType] then + return + end + D.FILE[szType] = {} + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') +end + +function D.RemoveMeta() + D.META = {} +end + +function D.CheckSameData(szType, dwMapID, dwID, nLevel) + if D.FILE[szType][dwMapID] then + if dwMapID ~= MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN then + for k, v in ipairs(D.FILE[szType][dwMapID]) do + if type(dwID) == 'string' then + if dwID == v.szContent and nLevel == v.szTarget then + return k, v + end + else + if dwID == v.dwID and (not v.bCheckLevel or nLevel == v.nLevel) then + return k, v + end + end + end + end + end +end + +function D.MoveData(szType, dwMapID, nIndex, dwTargetMapID, bCopy) + if dwMapID == dwTargetMapID then + return + end + if not D.FILE[szType][dwMapID] or not D.FILE[szType][dwMapID][nIndex] then + return + end + local data = D.FILE[szType][dwMapID][nIndex] + if D.CheckSameData(szType, dwTargetMapID, data.dwID or data.szContent, data.nLevel or data.szTarget) then + return X.Alert(_L['Same data exist']) + end + D.FILE[szType][dwTargetMapID] = D.FILE[szType][dwTargetMapID] or {} + table.insert(D.FILE[szType][dwTargetMapID], clone(D.FILE[szType][dwMapID][nIndex])) + if not bCopy then + table.remove(D.FILE[szType][dwMapID], nIndex) + if #D.FILE[szType][dwMapID] == 0 then + D.FILE[szType][dwMapID] = nil + end + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') +end + +-- 交换 其实没用 满足强迫症 +function D.Exchange(szType, dwMapID, nIndex1, nIndex2) + if nIndex1 == nIndex2 then + return + end + if not D.FILE[szType][dwMapID] then + return + end + local data1 = D.FILE[szType][dwMapID][nIndex1] + local data2 = D.FILE[szType][dwMapID][nIndex2] + if not data1 or not data2 then + return + end + -- local data = table.remove(D.FILE[szType][dwMapID], nIndex1) + -- table.insert(D.FILE[szType][dwMapID], nIndex2 + 1, data) + D.FILE[szType][dwMapID][nIndex1] = data2 + D.FILE[szType][dwMapID][nIndex2] = data1 + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') +end + +function D.AddData(szType, dwMapID, data) + D.FILE[szType][dwMapID] = D.FILE[szType][dwMapID] or {} + table.insert(D.FILE[szType][dwMapID], data) + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') + return D.FILE[szType][dwMapID][#D.FILE[szType][dwMapID]] +end + +function D.ClearTemp(szType) + CACHE.INTERVAL[szType] = {} + D.TEMP[szType] = {} + FireUIEvent('MY_TEAM_MON__UI__TEMP_RELOAD') + collectgarbage('collect') + D.Log('clear ' .. szType .. ' cache success!') +end + +function D.GetIntervalData(szType, key) + if CACHE.INTERVAL[szType] then + return CACHE.INTERVAL[szType][key] + end +end + +function D.ConfirmShare() + if #MY_TEAM_MON_SHARE_QUEUE > 0 then + local t = MY_TEAM_MON_SHARE_QUEUE[1] + X.Confirm(_L('%s share a %s data to you, accept?', t.szName, _L[t.szType]), function() + local data = t.tData + local nIndex = D.CheckSameData(t.szType, t.dwMapID, data.dwID or data.szContent, data.nLevel or data.szTarget) + if nIndex then + D.RemoveData(t.szType, t.dwMapID, nIndex) + end + D.AddData(t.szType, t.dwMapID, data) + table.remove(MY_TEAM_MON_SHARE_QUEUE, 1) + X.DelayCall(100, D.ConfirmShare) + end, function() + table.remove(MY_TEAM_MON_SHARE_QUEUE, 1) + X.DelayCall(100, D.ConfirmShare) + end) + end +end + +function D.OnShare(_, data, nChannel, dwID, szName, bIsSelf) + if not bIsSelf then + table.insert(MY_TEAM_MON_SHARE_QUEUE, { + szType = data[1], + tData = data[3], + szName = szName, + dwMapID = data[2] + }) + D.ConfirmShare() + end +end + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon', function() + if arg0 and arg0 ~= 'MY_TeamMon' then + return + end + FireUIEvent('MY_TEAM_MON_DATA_RELOAD') +end) +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon.MapRestriction', function() + if arg0 and arg0 ~= 'MY_TeamMon.MapRestriction' then + return + end + D.UpdateShieldStatus() +end) +X.RegisterKungfuMount('MY_TeamMon', D.UpdateShieldStatus) + +X.RegisterInit('MY_TeamMon', function() + X.RegisterEvent('LOADING_ENDING', 'MY_TeamMon', function() + FireUIEvent('MY_TEAM_MON_DATA_RELOAD') + end) + D.bReady = true + D.Init() +end) +X.RegisterFlush('MY_TeamMon', D.SaveUserData) +X.RegisterBgMsg('MY_TEAM_MON_SHARE', D.OnShare) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon', + exports = { + { + preset = 'UIEvent', + fields = { + MY_TEAM_MON_REMOTE_DATA_ROOT = MY_TEAM_MON_REMOTE_DATA_ROOT, + MY_TEAM_MON_SPECIAL_MAP = MY_TEAM_MON_SPECIAL_MAP , + MY_TEAM_MON_TYPE = MY_TEAM_MON_TYPE , + MY_TEAM_MON_TYPE_LIST = MY_TEAM_MON_TYPE_LIST , + MY_TEAM_MON_SCRUTINY_TYPE = MY_TEAM_MON_SCRUTINY_TYPE , + FilterCustomText = FilterCustomText , + ParseCustomText = ParseCustomText , + ParseCountdown = ParseCountdown , + ParseHPCountdown = ParseHPCountdown , + 'Enable', + 'GetTable', + IterTable = function(...) + if X.IsRestricted('MY_TeamMon') then + return X.ipairs_r({}) + end + return D.IterTable(...) + end, + 'GetMapName', + 'GetMapInfo', + 'GetData', + 'GetIntervalData', + 'RemoveData', + 'RemoveMeta', + 'MoveData', + 'CheckSameData', + 'ClearTemp', + 'AddData', + 'GetUserConfig', + 'SetUserConfig', + 'ImportData', + 'ImportDataFromFile', + 'ExportDataToFile', + 'Exchange', + 'SendChat', + 'SendBgMsg', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'bCommon', + 'bPushScreenHead', + 'bPushCenterAlarm', + 'bPushVoiceAlarm', + 'bPushBigFontAlarm', + 'bPushTeamPanel', + 'bPushFullScreen', + 'bPushTeamChannel', + 'bPushWhisperChannel', + 'bPushBuffList', + 'bPushPartyBuffList', + 'bShowVoicePacketRecommendation', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bCommon', + 'bPushScreenHead', + 'bPushCenterAlarm', + 'bPushVoiceAlarm', + 'bPushBigFontAlarm', + 'bPushTeamPanel', + 'bPushFullScreen', + 'bPushTeamChannel', + 'bPushWhisperChannel', + 'bPushBuffList', + 'bPushPartyBuffList', + 'bShowVoicePacketRecommendation', + }, + triggers = { + bEnable = function(k, v) + D.Enable(v, true) + end, + }, + root = O, + }, + }, +} +MY_TeamMon = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_BuffList.lua b/MY_TeamMon/src/MY_TeamMon_BuffList.lua new file mode 100644 index 000000000..a091771fa --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_BuffList.lua @@ -0,0 +1,292 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : BUFF列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_BuffList' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_BuffList' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_BuffList', { ['*'] = false, zhcn_exp = false, classic_yq = true, classic_exp = false }) +-------------------------------------------------------------------------------- + +local GetBuff = X.GetBuff +local FilterCustomText = MY_TeamMon.FilterCustomText + +local INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_BuffList.ini' +local O = X.CreateUserSettingsModule('MY_TeamMon_BuffList', _L['Raid'], { + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_BuffList'], + _L['UI Anchor'], + }), + szRestriction = 'MY_TeamMon_BuffList', + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'TOPLEFT', r = 'CENTER', x = 300, y = -200 }, + }, + nCount = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_BuffList'], + _L['Max buff count'], + }), + szRestriction = 'MY_TeamMon_BuffList', + xSchema = X.Schema.Number, + xDefaultValue = 8, + }, + fScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_BuffList'], + _L['Buff size'], + }), + szRestriction = 'MY_TeamMon_BuffList', + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, +}) +local D = { + fScale = 1, +} + +-- FireUIEvent('MY_TEAM_MON__BUFF_LIST__CREATE', 103, 1, { 255, 0, 0 }) +local function CreateBuffList(dwID, nLevel, col, tArgs, szSender, szReceiver) + local key = tostring(dwID) -- .. '.' .. nLevel + col = col or { 255, 255, 0 } + tArgs = tArgs or {} + local level = tArgs.bCheckLevel and nLevel or nil + local buff = GetBuff(X.GetClientPlayer(), dwID, level) + if buff then + local ui, bScale + if D.handle:Lookup(key) then + ui = D.handle:Lookup(key) + else + if D.handle:GetItemCount() >= O.nCount then + return + end + ui = D.handle:AppendItemFromData(D.hItem, key) + bScale = true + end + local szName, nIcon = X.GetBuffName(dwID, nLevel) + ui.dwID = dwID + ui.nLevel = level + ui:Lookup('Text_Name'):SetText(FilterCustomText(tArgs.szName, szSender, szReceiver) or szName) + ui:Lookup('Text_Name'):SetFontColor(unpack(col)) + local box = ui:Lookup('Box') + box:SetObjectIcon(tArgs.nIcon or nIcon) + box:SetObjectSparking(true) + box:SetOverTextPosition(0, ITEM_POSITION.RIGHT_BOTTOM) + box:SetOverTextFontScheme(0, 15) + if buff.nStackNum > 1 then + box:SetOverText(0, buff.nStackNum) + else + box:SetOverText(0, '') + end + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN, dwID, nLevel) + ui:Lookup('Text_Time'):SetFontColor(unpack(col)) + if bScale then + ui:Scale(O.fScale, O.fScale) + end + ui.bDelete = nil + ui:SetAlpha(255) + D.handle:FormatAllItemPos() + end +end + +function D.OnFrameCreate() + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('MY_TEAM_MON__BUFF_LIST__CREATE') + D.hItem = this:CreateItemData(INI_FILE, 'Handle_Item') + D.frame = this + D.handle = this:Lookup('', '') + D.handle:Clear() + D.ReSize() + D.UpdateAnchor(this) +end + +function D.OnEvent(szEvent) + if szEvent == 'MY_TEAM_MON__BUFF_LIST__CREATE' then + CreateBuffList(arg0, arg1, arg2, arg3, arg4, arg5) + elseif szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif szEvent == 'ON_ENTER_CUSTOM_UI_MODE' or szEvent == 'ON_LEAVE_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['Buff list']) + end +end +function D.OnItemMouseEnter() + local h = this:GetParent() + local buff = GetBuff(X.GetClientPlayer(), h.dwID, h.nLevel) + if buff then + this:SetObjectMouseOver(true) + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + X.OutputBuffTip({ x, y, w, h }, buff.dwID, buff.nLevel, X.GetEndTime(buff.nEndFrame)) + end +end + +function D.OnItemRButtonClick() + local h = this:GetParent() + X.CancelBuff(X.GetClientPlayer(), h.dwID, h.nLevel) +end + +function D.OnItemMouseLeave() + if this:IsValid() then + this:SetObjectMouseOver(false) + HideTip() + end +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then return end + for i = D.handle:GetItemCount() -1, 0, -1 do + local h = D.handle:Lookup(i) + if h and h:IsValid() then + if h.bDelete then + local nAlpha = h:GetAlpha() + if nAlpha == 0 then + D.handle:RemoveItem(h) + D.handle:FormatAllItemPos() + else + h:SetAlpha(math.max(0, nAlpha - 30)) + h:Lookup('Animate_Update'):SetAlpha(0) + end + else + local buff = GetBuff(me, h.dwID, h.nLevel) + if buff then + local nSec = X.GetEndTime(buff.nEndFrame) + if nSec > 24 * 60 * 60 then + h:Lookup('Text_Time'):SetText('') + else + h:Lookup('Text_Time'):SetText(X.FormatDuration(nSec, 'PRIME')) + end + local nAlpha = h:Lookup('Animate_Update'):GetAlpha() + if nAlpha > 0 then + h:Lookup('Animate_Update'):SetAlpha(math.max(0, nAlpha - 8)) + end + if buff.nStackNum > 1 then + h:Lookup('Box'):SetOverText(0, buff.nStackNum) + else + h:Lookup('Box'):SetOverText(0, '') + end + else + h.bDelete = true + end + end + end + end + if not X.IsInCustomUIMode() then + this:SetMousePenetrable(not IsCtrlKeyDown()) + else + this:SetMousePenetrable(false) + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this, 'TOPLEFT') +end + +function D.ReSize() + if not D.frame or not D.handle then + return + end + if D.fScale ~= O.fScale then + local fNewScale = O.fScale / D.fScale + D.frame:Scale(fNewScale, fNewScale) + D.fScale = O.fScale + end + D.frame:SetSize(O.nCount * 55 * O.fScale, 90 * O.fScale) + D.handle:SetSize(O.nCount * 55 * O.fScale, 90 * O.fScale) + D.handle:FormatAllItemPos() +end + +function D.UpdateAnchor(frame) + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + frame:CorrectPos() +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_BuffList') + if X.IsRestricted('MY_TeamMon_BuffList') then + return + end + X.UI.OpenFrame(INI_FILE, 'MY_TeamMon_BuffList') +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_BuffList', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'tAnchor', + 'nCount', + 'fScale', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'tAnchor', + 'nCount', + 'fScale', + }, + triggers = { + nCount = D.ReSize, + fScale = D.ReSize, + }, + root = O, + }, + }, +} +MY_TeamMon_BuffList = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamMon_BuffList', D.Init) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_BuffList', function() + if arg0 and arg0 ~= 'MY_TeamMon_BuffList' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_CenterAlarm.lua b/MY_TeamMon/src/MY_TeamMon_CenterAlarm.lua new file mode 100644 index 000000000..b47643ed4 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_CenterAlarm.lua @@ -0,0 +1,172 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 中央报警 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_CenterAlarm' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_CenterAlarm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_CenterAlarm', { ['*'] = false, exp = false }) +-------------------------------------------------------------------------------- + +local INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_CenterAlarm.ini' +local O = X.CreateUserSettingsModule('MY_TeamMon_CenterAlarm', _L['Raid'], { + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_CenterAlarm'], + _L['UI Anchor'], + }), + szRestriction = 'MY_TeamMon_CenterAlarm', + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'CENTER', r = 'CENTER', x = 0, y = 350 }, + }, +}) +local D = {} + +-- FireUIEvent('MY_TEAM_MON__CENTER_ALARM__CREATE', 'test', 3) +local function CreateCentralAlert(szMsg, nTime, bXml) + local msg = D.msg + nTime = nTime or 3 + msg:Clear() + if not bXml then + szMsg = GetFormatText(szMsg, 44, 255, 255, 255) + end + msg:AppendItemFromString(szMsg) + msg:FormatAllItemPos() + local w, h = msg:GetAllItemSize() + msg:SetRelPos((480 - w) / 2, (45 - h) / 2 - 1) + D.handle:FormatAllItemPos() + msg.nTime = nTime + msg.nCreate = GetTime() + D.frame:SetAlpha(255) + D.frame:Show() +end + +function D.OnFrameCreate() + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('MY_TEAM_MON__CENTER_ALARM__CREATE') + D.frame = this + D.handle = this:Lookup('', '') + D.msg = this:Lookup('', 'MessageBox') + D.UpdateAnchor(this) +end + +function D.OnFrameRender() + local nNow = GetTime() + if D.msg.nCreate then + local nTime = ((nNow - D.msg.nCreate) / 1000) + local nLeft = D.msg.nTime - nTime + if nLeft < 0 then + D.msg.nCreate = nil + D.frame:Hide() + else + local nTimeLeft = nTime * 1000 % 750 + local nAlpha = 50 * nTimeLeft / 750 + if math.floor(nTime / 0.75) % 2 == 1 then + nAlpha = 50 - nAlpha + end + D.frame:SetAlpha(255 - nAlpha) + end + end +end + +function D.OnEvent(szEvent) + if szEvent == 'MY_TEAM_MON__CENTER_ALARM__CREATE' then + CreateCentralAlert(arg0, arg1, arg2) + elseif szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif szEvent == 'ON_ENTER_CUSTOM_UI_MODE' or szEvent == 'ON_LEAVE_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['Center alarm']) + if szEvent == 'ON_ENTER_CUSTOM_UI_MODE' then + this:Show() + else + this:Hide() + end + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this) +end + +function D.UpdateAnchor(frame) + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + frame:CorrectPos() +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_CenterAlarm') + if X.IsRestricted('MY_TeamMon_CenterAlarm') then + return + end + X.UI.OpenFrame(INI_FILE, 'MY_TeamMon_CenterAlarm'):Hide() +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_CenterAlarm', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'tAnchor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'tAnchor', + }, + root = O, + }, + }, +} +MY_TeamMon_CenterAlarm = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamMon_CenterAlarm', D.Init) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_CenterAlarm', function() + if arg0 and arg0 ~= 'MY_TeamMon_CenterAlarm' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_CircleLine.lua b/MY_TeamMon/src/MY_TeamMon_CircleLine.lua new file mode 100644 index 000000000..c3c793ea9 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_CircleLine.lua @@ -0,0 +1,423 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 圈圈连线 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_CircleLine' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_CircleLine' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_CircleLine', { ['*'] = true, exp = true }) +-------------------------------------------------------------------------------- +local TARGET = TARGET +local INI_SHADOW = X.PACKET_INFO.UI_COMPONENT_ROOT .. 'Shadow.ini' +local CIRCLE_MAX_RADIUS = 30 -- 最大的半径 +local CIRCLE_LINE_ALPHA = 240 -- 线和边框最大透明度 +local CIRCLE_MAX_CIRCLE = 2 +local CIRCLE_RESERT_DRAW = false -- 全局重绘 +local CIRCLE_DEFAULT_DATA = { bEnable = true, nAngle = 80, nRadius = 4, col = { 0, 255, 0 }, bBorder = true } +local CIRCLE_PANEL_ANCHOR = { s = 'CENTER', r = 'CENTER', x = 0, y = 0 } +local CIRCLE_RULE = { + [TARGET.NPC] = {}, + [TARGET.DOODAD] = {}, +} +local CIRCLE_CACHE = { + [TARGET.NPC] = {}, + [TARGET.DOODAD] = {}, +} +local H_CIRCLE = X.UI.GetShadowHandle('Handle_Shadow_Circle') +local H_LINE = X.UI.GetShadowHandle('Handle_Shadow_Line') +local H_NAME = X.UI.GetShadowHandle('Handle_Shadow_Name') + +local O = X.CreateUserSettingsModule('MY_TeamMon_CircleLine', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_CircleLine'], + _L['Enable circle'], + }), + szRestriction = 'MY_TeamMon_CircleLine', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bBorder = { -- 全局的边框模式 边框会造成卡 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_CircleLine'], + _L['Circle border'], + }), + szRestriction = 'MY_TeamMon_CircleLine', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.UpdateRule() + if MY_TeamMon and MY_TeamMon.IterTable and MY_TeamMon.GetTable then + CIRCLE_RULE[TARGET.NPC] = {} + CIRCLE_RULE[TARGET.DOODAD] = {} + for _, ds in ipairs({ + { szType = 'NPC', dwType = TARGET.NPC}, + { szType = 'DOODAD', dwType = TARGET.DOODAD}, + }) do + for _, data in MY_TeamMon.IterTable(MY_TeamMon.GetTable(ds.szType), 0, true) do + if not X.IsEmpty(data.aCircle) or data.bDrawLine then + CIRCLE_RULE[ds.dwType][data.dwID] = data + end + end + end + D.RescanNearby() + end +end + +function D.DrawLine(dwType, tar, ttar, sha, col) + sha:SetTriangleFan(GEOMETRY_TYPE.LINE, 3) + sha:ClearTriangleFanPoint() + local r, g, b = unpack(col) + if dwType == TARGET.DOODAD then + sha:AppendDoodadID(tar.dwID, r, g, b, CIRCLE_LINE_ALPHA) + elseif dwType == TARGET.NPC then + sha:AppendCharacterID(tar.dwID, true, r, g, b, CIRCLE_LINE_ALPHA) + elseif dwType == 'Point' then -- 可能需要用到 + sha:AppendTriangleFan3DPoint(tar.nX, tar.nY, tar.nZ, r, g, b, CIRCLE_LINE_ALPHA) + end + sha:AppendCharacterID(ttar.dwID, true, r, g, b, CIRCLE_LINE_ALPHA) + sha:Show() +end + +function D.DrawShape(dwType, tar, sha, nAngle, nRadius, col, nAlpha) + local nRadius = nRadius * 64 + local nFace = math.ceil(128 * nAngle / 360) + local dwRad1 = math.pi * (tar.nFaceDirection - nFace) / 128 + if tar.nFaceDirection > (256 - nFace) then + dwRad1 = dwRad1 - math.pi - math.pi + end + local dwRad2 = dwRad1 + (nAngle / 180 * math.pi) + local nStep = 16 + if nAngle <= 45 then nStep = 180 end + if nAngle == 360 then + dwRad2 = dwRad2 + math.pi / 20 + end + -- nAlpha 补偿 + if not nAlpha then + nAlpha = 50 + local ap = 2.5 * (nRadius / 64) + if ap > 35 then + nAlpha = 15 + else + nAlpha = nAlpha - ap + end + nAlpha = nAlpha + (360 - nAngle) / 6 + end + local r, g, b = unpack(col) + -- orgina point + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + if dwType == TARGET.DOODAD then + sha:AppendDoodadID(tar.dwID, r, g, b, nAlpha) + else + sha:AppendCharacterID(tar.dwID, false, r, g, b, nAlpha) + end + sha:Show() + -- relative points + local sX, sZ = Scene_PlaneGameWorldPosToScene(tar.nX, tar.nY) + repeat + local sX_, sZ_ = Scene_PlaneGameWorldPosToScene(tar.nX + math.cos(dwRad1) * nRadius, tar.nY + math.sin(dwRad1) * nRadius) + if dwType == TARGET.DOODAD then + sha:AppendDoodadID(tar.dwID, r, g, b, nAlpha, { sX_ - sX, 0, sZ_ - sZ }) + else + sha:AppendCharacterID(tar.dwID, false, r, g, b, nAlpha, { sX_ - sX, 0, sZ_ - sZ }) + end + dwRad1 = dwRad1 + math.pi / nStep + until dwRad1 > dwRad2 +end + +function D.DrawBorder(dwType, tar, sha, nAngle, nRadius, col) + local nRadius = nRadius * 64 + local nThick = 1 + (5 * nRadius / 64 / 20) + local nFace = math.ceil(128 * nAngle / 360) + local dwRad1 = math.pi * (tar.nFaceDirection - nFace) / 128 + if tar.nFaceDirection > (256 - nFace) then + dwRad1 = dwRad1 - math.pi - math.pi + end + local dwRad2 = dwRad1 + (nAngle / 180 * math.pi) + local nStep = 16 + if nAngle <= 45 then nStep = 180 end + if nAngle == 360 then + dwRad2 = dwRad2 + math.pi / 20 + end + local sX, sZ = Scene_PlaneGameWorldPosToScene(tar.nX, tar.nY) + local r, g, b = unpack(col) + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLESTRIP) + sha:ClearTriangleFanPoint() + repeat + local tRad = { nRadius, nRadius - nThick } + for _, v in ipairs(tRad) do + local sX_, sZ_ = Scene_PlaneGameWorldPosToScene(tar.nX + math.cos(dwRad1) * v , tar.nY + math.sin(dwRad1) * v) + if dwType == TARGET.DOODAD then + sha:AppendDoodadID(tar.dwID, r, g, b, CIRCLE_LINE_ALPHA, { sX_ - sX, 0, sZ_ - sZ }) + else + sha:AppendCharacterID(tar.dwID, false, r, g, b, CIRCLE_LINE_ALPHA, { sX_ - sX, 0, sZ_ - sZ }) + end + end + dwRad1 = dwRad1 + math.pi / nStep + until dwRad1 > dwRad2 +end + +function D.DrawObject(dwType, dwID, KObject) + local cache = CIRCLE_CACHE[dwType][dwID] + if not cache then + return + end + if not KObject then + KObject = X.GetTargetHandle(dwType, dwID) + end + if not KObject then + return + end + if cache.aCircle then + for _, circle in ipairs(cache.aCircle) do + if not circle.shaCircle or circle.shaCircle.nFaceDirection ~= KObject.nFaceDirection or CIRCLE_RESERT_DRAW then -- 第一次绘制、面向不对、强制重绘 + if not circle.shaCircle then + circle.shaCircle = H_CIRCLE:AppendItemFromIni(INI_SHADOW, 'Shadow', 'Shadow_Circle') + end + circle.shaCircle.nFaceDirection = KObject.nFaceDirection + D.DrawShape(dwType, KObject, circle.shaCircle, circle.nAngle, circle.nRadius, circle.col, circle.nAlpha) + end + if O.bBorder and circle.bBorder then + if not circle.shaBorder or circle.shaBorder.nFaceDirection ~= KObject.nFaceDirection or CIRCLE_RESERT_DRAW then -- 第一次绘制、面向不对、强制重绘 + if not circle.shaBorder then + circle.shaBorder = H_CIRCLE:AppendItemFromIni(INI_SHADOW, 'Shadow', 'Shadow_Border') + end + circle.shaBorder.nFaceDirection = KObject.nFaceDirection + D.DrawBorder(dwType, KObject, circle.shaBorder, circle.nAngle, circle.nRadius, circle.col) + end + end + end + end + if cache.bDrawLine then + local dwTarType, dwTarID = TARGET.PLAYER, X.GetClientPlayerID() + if dwType == TARGET.NPC then + dwTarType, dwTarID = KObject.GetTarget() + end + + local tar = X.GetTargetHandle(dwTarType, dwTarID) or X.GetClientPlayer() + + if not cache.bDrawLineOnlyStareMe or dwTarID == X.GetClientPlayerID() then + if not cache.shaLine or cache.shaLine.dwTarID ~= dwTarID then + if not cache.shaLine then + cache.shaLine = H_LINE:AppendItemFromIni(INI_SHADOW, 'Shadow', 'Shadow_Line') + end + cache.shaLine.dwTarID = dwTarID + local r, g, b = 0, 255, 255 + if dwType == TARGET.NPC then + if dwTarID == X.GetClientPlayerID() then + r, g, b = 255, 0, 128 + else + r, g, b = 255, 255, 0 + end + end + D.DrawLine(dwType, KObject, tar, cache.shaLine, { r, g, b }) + end + elseif cache.shaLine then + local parent = cache.shaLine:GetParent() + if parent then + parent:RemoveItem(cache.shaLine) + end + cache.shaLine = nil + end + end + if cache.bDrawName then + local szText = cache.szNote or X.GetTargetName(dwType, dwID) + if not cache.shaName or cache.shaName.szText ~= szText then + if not cache.shaName then + cache.shaName = H_NAME:AppendItemFromIni(INI_SHADOW, 'Shadow', 'Shadow_Name') + cache.shaName:SetTriangleFan(GEOMETRY_TYPE.TEXT) + end + local r, g, b = 255, 128, 0 + if dwType == TARGET.DOODAD then + cache.shaName:AppendDoodadID(dwID, r, g, b, 255, 50, 40, szText, 1, 1) + else + cache.shaName:AppendCharacterID(dwID, true, r, g, b, 255, 50, 40, szText, 1, 1) + end + cache.shaName.szText = szText + end + end +end + +function D.OnObjectEnterScene(dwType, dwID) + local tar = X.GetTargetHandle(dwType, dwID) + local rule = CIRCLE_RULE[dwType][tar.dwTemplateID] + if rule and (not rule.bDrawOnlyMyEmployer or dwType ~= TARGET.NPC or tar.dwEmployer == X.GetClientPlayerID()) then + local cache = setmetatable({}, { __index = rule }) + if rule.aCircle then + local aCircle = {} + for _, rule in ipairs(rule.aCircle) do + table.insert(aCircle, setmetatable({}, { __index = rule })) + end + cache.aCircle = aCircle + end + CIRCLE_CACHE[dwType][dwID] = cache + end + D.DrawObject(dwType, dwID) +end + +function D.OnObjectLeaveScene(dwType, dwID) + local cache, parent = CIRCLE_CACHE[dwType][dwID] + if cache then + if cache.aCircle then + for _, circle in ipairs(cache.aCircle) do + if circle.shaCircle then + parent = circle.shaCircle:GetParent() + if parent then + parent:RemoveItem(circle.shaCircle) + end + end + circle.shaCircle = nil + if circle.shaBorder then + parent = circle.shaBorder:GetParent() + if parent then + parent:RemoveItem(circle.shaBorder) + end + end + circle.shaBorder = nil + end + end + if cache.shaLine then + parent = cache.shaLine:GetParent() + if parent then + parent:RemoveItem(cache.shaLine) + end + cache.shaLine = nil + end + if cache.shaName then + parent = cache.shaName:GetParent() + if parent then + parent:RemoveItem(cache.shaName) + end + cache.shaName = nil + end + CIRCLE_CACHE[dwType][dwID] = nil + end +end + +function D.OnBreathe() + local me = X.GetClientPlayer() + if not me then + return + end + for dwID, cache in pairs(CIRCLE_CACHE[TARGET.NPC]) do + D.DrawObject(TARGET.NPC, dwID) + end + for dwID, cache in pairs(CIRCLE_CACHE[TARGET.DOODAD]) do + D.DrawObject(TARGET.DOODAD, dwID) + end + CIRCLE_RESERT_DRAW = false +end + +function D.RescanNearby() + H_CIRCLE:Clear() + H_LINE:Clear() + H_NAME:Clear() + if X.IsRestricted('MY_TeamMon_CircleLine') then + return + end + for _, dwID in pairs(X.GetNearNpcID()) do + D.OnObjectEnterScene(TARGET.NPC, dwID) + end + for _, dwID in pairs(X.GetNearDoodadID()) do + D.OnObjectEnterScene(TARGET.DOODAD, dwID) + end +end + +function D.OnTMDataReload() + if arg0 and not arg0['NPC'] and not arg0['DOODAD'] then + return + end + D.UpdateRule() +end + +function D.CheckEnable() + if D.bReady and O.bEnable and not X.IsRestricted('MY_TeamMon_CircleLine') then + X.RegisterModuleEvent('MY_TeamMon_CircleLine', { + { '#BREATHE', D.OnBreathe }, + { 'NPC_ENTER_SCENE', function() D.OnObjectEnterScene(TARGET.NPC, arg0) end }, + { 'NPC_LEAVE_SCENE', function() D.OnObjectLeaveScene(TARGET.NPC, arg0) end }, + { 'DOODAD_ENTER_SCENE', function() D.OnObjectEnterScene(TARGET.DOODAD, arg0) end }, + { 'DOODAD_LEAVE_SCENE', function() D.OnObjectLeaveScene(TARGET.DOODAD, arg0) end }, + { 'LOADING_ENDING', D.UpdateRule }, + { 'MY_TEAM_MON__CIRCLE_LINE__RELOAD', D.UpdateRule }, + { 'MY_TEAM_MON_DATA_RELOAD', D.OnTMDataReload }, + { 'MY_TEAM_MON__CIRCLE_LINE__RESERT_DRAW', function() CIRCLE_RESERT_DRAW = true end } + }) + D.UpdateRule() + else + X.RegisterModuleEvent('MY_TeamMon_CircleLine', false) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_CircleLine', + exports = { + { + fields = { + 'bEnable', + 'bBorder', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bBorder', + }, + triggers = { + bEnable = D.CheckEnable, + }, + root = O, + }, + }, +} +MY_TeamMon_CircleLine = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_CircleLine', function() + if arg0 and arg0 ~= 'MY_TeamMon_CircleLine' then + return + end + D.CheckEnable() +end) +X.RegisterUserSettingsInit('MY_TeamMon_CircleLine', function() + D.bReady = true + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_FullScreenAlarm.lua b/MY_TeamMon/src/MY_TeamMon_FullScreenAlarm.lua new file mode 100644 index 000000000..7202ffbf9 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_FullScreenAlarm.lua @@ -0,0 +1,234 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 全屏泛光 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_FullScreenAlarm' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_FullScreenAlarm', { ['*'] = false, exp = false }) +-------------------------------------------------------------------------------- + +local GetBuff = X.GetBuff + +local D = {} +local FS = {} +FS.__index = FS + +local FS_HANDLE, FS_FRAME +local FS_CACHE = setmetatable({}, { __mode = 'v' }) +local INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_FullScreenAlarm.ini' + +-- FireUIEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE', Random(50, 255), { col = { Random(50, 255), Random(50, 255), Random(50, 255) }, bFlash = true}) +local function CreateFullScreen(szKey, tArgs) + if X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + return + end + assert(type(tArgs) == 'table', 'CreateFullScreen failed!') + tArgs.nTime = tArgs.nTime or 3 + if tArgs.tBindBuff then + FS:ctor(szKey, tArgs):DrawEdge() + else + FS:ctor(szKey, tArgs) + end +end + +function D.OnFrameCreate() + this:RegisterEvent('LOADING_END') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE') + + this.hItem = this:CreateItemData(INI_FILE, 'Handle_Item') + FS_FRAME = this + FS_HANDLE = this:Lookup('', '') + FS_HANDLE:Clear() +end + +function D.OnEvent(szEvent) + if szEvent == 'MY_TEAM_MON__FULL_SCREEN_ALARM__CREATE' then + CreateFullScreen(arg0, arg1) + elseif szEvent == 'UI_SCALED' then + for k, v in pairs(FS_CACHE) do + if v.tBindBuff then + v.obj:DrawEdge() + end + end + elseif szEvent == 'LOADING_END' then + FS_HANDLE:Clear() + end +end + +function D.OnFrameRender() + local nNow = GetTime() + for k, v in pairs(FS_CACHE) do + if v:IsValid() then + local nTime = ((nNow - v.nCreate) / 1000) + local nLeft = v.nTime - nTime + if nLeft > 0 then + if v.bFlash then + local nTimeLeft = nTime * 1000 % 750 + local nAlpha = 150 * nTimeLeft / 750 + if math.floor(nTime / 0.75) % 2 == 1 then + nAlpha = 150 - nAlpha + end + v.obj:DrawFullScreen(math.floor(nAlpha)) + else + local nAlpha = 150 - 150 * nTime / v.nTime + v.obj:DrawFullScreen(nAlpha) + end + else + if v.sha1:IsValid() then + if v.tBindBuff then + v.obj:RemoveFullScreen() + else + v.obj:RemoveItem() + end + end + end + if v.tBindBuff then + local dwID, nLevel = unpack(v.tBindBuff) + local buff = GetBuff(X.GetClientPlayer(), dwID) + if not buff then + v.obj:RemoveItem() + end + end + end + end +end + +function FS:ctor(szKey, tArgs) + local el = FS_CACHE[szKey] + local nTime = GetTime() + local oo = {} + setmetatable(oo, self) + oo.key = szKey + if not el or el and not el:IsValid() then + el = FS_HANDLE:AppendItemFromData(FS_FRAME.hItem) + end + if el.sha1 and el.sha1:IsValid() then + el.sha1 = el.sha1 + else + el.sha1 = el:AppendItemFromIni(X.PACKET_INFO.UI_COMPONENT_ROOT .. 'Shadow.ini', 'Shadow') + el.sha1:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + el.sha1:SetD3DPT(D3DPT.TRIANGLESTRIP) + end + el.bFlash = tArgs.bFlash + el.nTime = tArgs.nTime + el.nCreate = nTime + el.col = tArgs.col or { 255, 128, 0 } + if tArgs.tBindBuff then + if el.sha2 and el.sha2:IsValid() then + el.sha2 = el.sha2 + else + el.sha2 = el:AppendItemFromIni(X.PACKET_INFO.UI_COMPONENT_ROOT .. 'Shadow.ini', 'Shadow') + el.sha2:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + el.sha2:SetD3DPT(D3DPT.TRIANGLESTRIP) + end + el.tBindBuff = tArgs.tBindBuff + end + oo.el = el + oo.el.obj = oo + FS_CACHE[szKey] = oo.el + FS_FRAME:Show() + return oo +end + +function FS:DrawFullScreen( ... ) + self:DrawShadow(self.el.sha1, ...) + return self +end + +function FS:DrawEdge() + self:DrawShadow(self.el.sha2, 220, 15, 15) + return self +end + +function FS:DrawShadow(sha, nAlpha, fScreenX, fScreenY) + local r, g, b = unpack(self.el.col) + local w, h = Station.GetClientSize() + local bW, bH = fScreenX or w * 0.10, fScreenY or h * 0.10 + if sha:IsValid() then + sha:ClearTriangleFanPoint() + sha:AppendTriangleFanPoint(0, 0, r, g, b, nAlpha) + sha:AppendTriangleFanPoint(bW, bH, r, g, b, 0) + sha:AppendTriangleFanPoint(0, h, r, g, b, nAlpha) + sha:AppendTriangleFanPoint(bW, h - bH, r, g, b, 0) + sha:AppendTriangleFanPoint(bW, h, r, g, b, nAlpha) + sha:AppendTriangleFanPoint(w - bW, h - bH, r, g, b, 0) + sha:AppendTriangleFanPoint(w, h, r, g, b, nAlpha) + sha:AppendTriangleFanPoint(w - bW, bH, r, g, b, 0) + sha:AppendTriangleFanPoint(w, 0, r, g, b, nAlpha) + sha:AppendTriangleFanPoint(bW, bH, r, g, b, 0) + sha:AppendTriangleFanPoint(0, 0, r, g, b, nAlpha) + end + return self +end + +function FS:RemoveFullScreen() + self.el:RemoveItem(self.el.sha1) + return self +end + +function FS:RemoveItem() + FS_HANDLE:RemoveItem(self.el) + if FS_HANDLE:GetItemCount() == 0 then + FS_FRAME:Hide() + end +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_FullScreenAlarm') + if X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + return + end + X.UI.OpenFrame(INI_FILE, 'MY_TeamMon_FullScreenAlarm'):Hide() +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_FullScreenAlarm', + exports = { + { + root = D, + preset = 'UIEvent' + }, + }, +} +MY_TeamMon_FullScreenAlarm = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamMon_FullScreenAlarm', D.Init) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_FullScreenAlarm', function() + if arg0 and arg0 ~= 'MY_TeamMon_FullScreenAlarm' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_LargeTextAlarm.lua b/MY_TeamMon/src/MY_TeamMon_LargeTextAlarm.lua new file mode 100644 index 000000000..89540d6aa --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_LargeTextAlarm.lua @@ -0,0 +1,284 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 大字提醒 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_LargeTextAlarm' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_LargeTextAlarm', { ['*'] = true, intl = false, exp = true }) +-------------------------------------------------------------------------------- + +local INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_LargeTextAlarm.ini' + +local O = X.CreateUserSettingsModule('MY_TeamMon_LargeTextAlarm', _L['Raid'], { + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_LargeTextAlarm'], + _L['UI Anchor'], + }), + szRestriction = 'MY_TeamMon_LargeTextAlarm', + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'CENTER', r = 'CENTER', x = 0, y = 0 }, + }, + fScale = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_LargeTextAlarm'], + _L['Font scale'], + }), + szRestriction = 'MY_TeamMon_LargeTextAlarm', + xSchema = X.Schema.Number, + xDefaultValue = 1.5, + }, + fPause = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_LargeTextAlarm'], + _L['Pause time'], + }), + szRestriction = 'MY_TeamMon_LargeTextAlarm', + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + fFadeOut = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_LargeTextAlarm'], + _L['FadeOut time'], + }), + szRestriction = 'MY_TeamMon_LargeTextAlarm', + xSchema = X.Schema.Number, + xDefaultValue = 0.3, + }, + dwFontScheme = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_LargeTextAlarm'], + g_tStrings.FONT, + }), + szRestriction = 'MY_TeamMon_LargeTextAlarm', + xSchema = X.Schema.Number, + xDefaultValue = 23, + }, +}) +local D = {} + +function D.OnFrameCreate() + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('MY_TEAM_MON__LARGE_TEXT_ALARM') + D.UpdateAnchor(this) + D.frame = this + D.txt = this:Lookup('', 'Text_Total') +end + +function D.OnEvent(szEvent) + if szEvent == 'ON_ENTER_CUSTOM_UI_MODE' or szEvent == 'ON_LEAVE_CUSTOM_UI_MODE' then + if X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + return + end + if szEvent == 'ON_LEAVE_CUSTOM_UI_MODE' then + D.frame:Hide() + else + D.frame:FadeIn(0) + D.frame:SetAlpha(255) + D.frame:Show() + end + UpdateCustomModeWindow(this, _L['MY_TeamMon_LargeTextAlarm'], true) + elseif szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif szEvent == 'MY_TEAM_MON__LARGE_TEXT_ALARM' then + D.UpdateText(arg0, arg1) + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this) +end + +function D.UpdateAnchor(frame) + local a = O.tAnchor + if not X.IsEmpty(a) then + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + else + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + end +end + +function D.UpdateText(txt, col) + if X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + return + end + if not col then + col = { 255, 128, 0 } + end + D.txt:SetText(txt) + D.txt:SetFontScheme(O.dwFontScheme) + D.txt:SetFontScale(O.fScale) + D.txt:SetFontColor(unpack(col)) + D.frame:FadeIn(0) + D.frame:SetAlpha(255) + D.frame:Show() + D.nTime = GetTime() + X.BreatheCall('MY_TeamMon_LargeTextAlarm', D.OnBreathe) +end + +function D.OnBreathe() + local nTime = GetTime() + if D.nTime and (nTime - D.nTime) / 1000 > O.fPause then + D.nTime = nil + D.frame:FadeOut(O.fFadeOut * 10) + X.BreatheCall('MY_TeamMon_LargeTextAlarm', false) + end +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_LargeTextAlarm') + if X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + return + end + X.UI.OpenFrame(INI_FILE, 'MY_TeamMon_LargeTextAlarm') +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_LargeTextAlarm', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'tAnchor', + 'fScale', + 'fPause', + 'fFadeOut', + 'dwFontScheme', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'tAnchor', + 'fScale', + 'fPause', + 'fFadeOut', + 'dwFontScheme', + }, + root = O, + }, + }, +} +MY_TeamMon_LargeTextAlarm = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamMon_LargeTextAlarm', D.Init) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_LargeTextAlarm', function() + if arg0 and arg0 ~= 'MY_TeamMon_LargeTextAlarm' then + return + end + D.CheckEnable() +end) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- + +local PS = { nPriority = 12, szRestriction = 'MY_TeamMon_LargeTextAlarm' } +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + + nX, nY = ui:Append('Text', { x = nX, y = nY, text = _L['MY_TeamMon_LargeTextAlarm'], font = 27 }):Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { text = _L['Font scale'], x = nPaddingX + 10, y = nY + 10 }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndSlider', { + x = nX + 10, y = nY + 13, text = '', + range = {1, 2, 10}, value = O.fScale, + onChange = function(nVal) + O.fScale = nVal + ui:Children('#Text_Preview'):Font(O.dwFontScheme):scale(O.fScale) + end, + }):Pos('BOTTOMRIGHT') + + nX = ui:Append('Text', { text = _L['Pause time'], x = nPaddingX + 10, y = nY }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndSlider', { + x = nX + 10, y = nY + 3, text = _L['s'], + range = {0.5, 3, 25}, value = O.fPause, + onChange = function(nVal) + O.fPause = nVal + end, + }):Pos('BOTTOMRIGHT') + + nX = ui:Append('Text', { text = _L['FadeOut time'], x = nPaddingX + 10, y = nY }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndSlider', { + x = nX + 10, y = nY + 3, text = _L['s'], + range = {0, 3, 30}, value = O.fFadeOut, + onChange = function(nVal) + O.fFadeOut = nVal + end, + }):Pos('BOTTOMRIGHT') + + nY = nY + 10 + nX = ui:Append('WndButton', { + x = nPaddingX + 10, y = nY + 5, + text = g_tStrings.FONT, + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + O.dwFontScheme = nFont + ui:Children('#Text_Preview'):Font(O.dwFontScheme):scale(O.fScale) + end) + end, + }):Pos('BOTTOMRIGHT') + ui:Append('WndButton', { + x = nX + 10, y = nY + 5, + text = _L['Preview'], + buttonStyle = 'FLAT', + onClick = function() + D.UpdateText(_L['PVE everyday, Xuanjing everyday!']) + end, + }) + ui:Append('Text', { name = 'Text_Preview', x = 20, y = nY + 50, txt = _L['JX3'], font = O.dwFontScheme, scale = O.fScale}) +end +X.Panel.Register(_L['Raid'], 'MY_TeamMon_LargeTextAlarm', _L['MY_TeamMon_LargeTextAlarm'], 'ui/Image/TargetPanel/Target.uitex|59', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_PartyBuffList.lua b/MY_TeamMon/src/MY_TeamMon_PartyBuffList.lua new file mode 100644 index 000000000..4ad9f4031 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_PartyBuffList.lua @@ -0,0 +1,409 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队重要BUFF列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_PartyBuffList' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_PartyBuffList' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_PartyBuffList', { ['*'] = false, zhcn_exp = false, classic_yq = true, classic_exp = false }) +-------------------------------------------------------------------------------- + +local GetBuff = X.GetBuff + +-- 这个需要重写 构思已有 就是没时间。。 +local O = X.CreateUserSettingsModule('MY_TeamMon_PartyBuffList', _L['Raid'], { + bHoverSelect = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_PartyBuffList'], + _L['Mouse enter select'], + }), + szRestriction = 'MY_TeamMon_PartyBuffList', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_PartyBuffList'], + _L['UI Anchor'], + }), + szRestriction = 'MY_TeamMon_PartyBuffList', + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'CENTER', r = 'CENTER', x = 400, y = 0 }, + }, +}) +local D = {} + +local TEMP_TARGET_TYPE, TEMP_TARGET_ID +local CACHE_LIST = setmetatable({}, { __mode = 'v' }) +local PBL_INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_PartyBuffList.ini' + +function D.OnFrameCreate() + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('TARGET_CHANGE') + this:RegisterEvent('MY_TEAM_MON__PARTY_BUFF_LIST') + D.hItem = this:CreateItemData(PBL_INI_FILE, 'Handle_Item') + D.frame = this + D.handle = this:Lookup('', 'Handle_List') + D.bg = this:Lookup('', 'Image_Bg') + D.handle:Clear() + this:Lookup('', 'Text_Title'):SetText(_L['MY_TeamMon_PartyBuffList']) + D.UpdateAnchor(this) +end + +function D.OnEvent(event) + if event == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif event == 'TARGET_CHANGE' then + D.SwitchSelect() + elseif event == 'MY_TEAM_MON__PARTY_BUFF_LIST' then + D.OnTableInsert(arg0, arg1, arg2, arg3) + elseif event == 'ON_ENTER_CUSTOM_UI_MODE' or event == 'ON_LEAVE_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['MY_TeamMon_PartyBuffList']) + if event == 'ON_ENTER_CUSTOM_UI_MODE' then + D.frame:Show() + else + D.SwitchPanel(D.handle:GetItemCount()) + D.frame:EnableDrag(true) -- 还是支持拖动的 + D.frame:SetDragArea(0, 0, 200, 30) + end + end +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then return end + local dwKungfuID = UI_GetPlayerMountKungfuID() + local DISTANCE = 20 + if dwKungfuID == 10080 then -- 奶秀修正 + DISTANCE = 22 + elseif dwKungfuID == 10028 then -- 奶花修正 + DISTANCE = 24 + end + for i = D.handle:GetItemCount() -1, 0, -1 do + local h = D.handle:Lookup(i) + if h and h:IsValid() then + local data = h.data + local p, info = D.GetPlayer(data.dwID) + local buff + if p then + buff = GetBuff(p, data.dwBuffID) + end + if p and info and buff then + local nDistance = X.GetCharacterDistance(me, p) + h:Lookup('Image_life'):SetPercentage(info.fCurrentLife64 / math.max(info.fMaxLife64, 1)) + h:Lookup('Text_Name'):SetText(i + 1 .. ' ' .. info.szName) + if nDistance > DISTANCE then + h:Lookup('Image_life'):SetAlpha(150) + else + h:Lookup('Image_life'):SetAlpha(255) + end + local box = h:Lookup('Box_Icon') + local nSec = X.GetEndTime(buff.nEndFrame) + if nSec < 60 then + box:SetOverText(1, X.FormatDuration(math.min(nSec, 5999), 'PRIME')) + else + box:SetOverText(1, '') + end + if buff.nStackNum > 1 then + box:SetOverText(0, buff.nStackNum) + end + else + D.handle:RemoveItem(h) + D.handle:FormatAllItemPos() + D.SwitchPanel(D.handle:GetItemCount()) + end + end + end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Style' then + local menu = { + { szOption = _L['Mouse enter select'], bCheck = true, bChecked = O.bHoverSelect, fnAction = function() + O.bHoverSelect = not O.bHoverSelect + end } + } + PopupMenu(menu) + elseif szName == 'Btn_Close' then + D.handle:Clear() + D.SwitchPanel(0) + end +end + +function D.OnItemLButtonDown() + if this:GetName() == 'Handle_Item' then + if O.bHoverSelect then + TEMP_TARGET_TYPE, TEMP_TARGET_ID = nil + end + X.SetClientPlayerTarget(TARGET.PLAYER, this.data.dwID) + end +end + +function D.OnItemMouseLeave() + if this:GetName() == 'Handle_Item' then + if O.bHoverSelect and TEMP_TARGET_TYPE and TEMP_TARGET_ID then + X.SetClientPlayerTarget(TEMP_TARGET_TYPE, TEMP_TARGET_ID) + TEMP_TARGET_TYPE, TEMP_TARGET_ID = nil + end + HideTip() + end +end + +function D.OnItemMouseEnter() + if this:GetName() == 'Handle_Item' then + if O.bHoverSelect then + local me = X.GetClientPlayer() + TEMP_TARGET_TYPE, TEMP_TARGET_ID = X.GetCharacterTarget(me) + X.SetClientPlayerTarget(TARGET.PLAYER, this.data.dwID) + end + X.OutputBuffTip(this, this.data.dwBuffID, this.data.nLevel) + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this, 'TOPCENTER') +end + +function D.UpdateAnchor(frame) + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + frame:CorrectPos() +end + +function D.SwitchSelect() + local dwType, dwID = Target_GetTargetData() + for i = D.handle:GetItemCount() -1, 0, -1 do + local h = D.handle:Lookup(i) + if h and h:IsValid() then + local sel = h:Lookup('Image_Select') + if sel and sel:IsValid() then + if dwID == h.data.dwID then + sel:Show() + else + sel:Hide() + end + end + end + end +end + +function D.SwitchPanel(nCount) + local h = 40 + D.frame:SetH(h * nCount + 30) + D.bg:SetH(h * nCount + 30) + D.handle:SetH(h * nCount) + if nCount == 0 then + D.frame:Hide() + else + D.frame:Show() + end +end + +function D.ClosePanel() + X.UI.CloseFrame(D.frame) + D.frame = nil +end + +function D.GetPlayer(dwID) + local player, info + if dwID == X.GetClientPlayerID() then + player = X.GetClientPlayer() + info = { + dwKungfuID = UI_GetPlayerMountKungfuID(), + dwActualKungfuID = UI_GetPlayerMountKungfuID(), + szName = player.szName, + } + else + player = X.GetPlayer(dwID) + info = X.GetTeamMemberInfo(dwID) + end + if info then + if player then + info.fCurrentLife64, info.fMaxLife64 = X.GetCharacterLife(player) + else + info.fCurrentLife64, info.fMaxLife64 = X.GetCharacterLife(info) + end + end + return player, info +end + +function D.OnTableInsert(dwID, dwBuffID, nLevel, nIcon) + local p, info = D.GetPlayer(dwID) + if not p or not info then + return + end + local key = dwID .. '_' .. dwBuffID .. '_' .. nLevel -- 主要担心窗口名称太长 + if CACHE_LIST[key] and CACHE_LIST[key]:IsValid() then + return + end + local buff = GetBuff(p, dwBuffID) + if not buff then + return + end + local dwTargetType, dwTargetID = Target_GetTargetData() + -- 判断是否有8帧之内的气劲 如果有则排序时候应当拥有相同的权重(解决不同客户端同步团队BUFF顺序不一致的问题) + local nLFC = GetLogicFrameCount() + local nSortLFC = nLFC + for i = D.handle:GetItemCount() - 1, 0, -1 do + local hItem = D.handle:Lookup(i) + if nLFC - hItem.nLFC <= X.ENVIRONMENT.GAME_FPS / 2 and nLFC - hItem.nSortLFC <= X.ENVIRONMENT.GAME_FPS / 2 then + nSortLFC = hItem.nSortLFC + break + end + end + local data = { + dwID = dwID, + dwBuffID = dwBuffID, + nLevel = nLevel, + szName = info.szName, + } + local h = D.handle:AppendItemFromData(D.hItem) + local nCount = D.handle:GetItemCount() + if dwTargetID == dwID then + h:Lookup('Image_Select'):Show() + end + h:Lookup('Image_KungFu'):FromIconID(Table_GetSkillIconID(info.dwActualKungfuID) or 1435) + h:Lookup('Text_Name'):SetText(nCount .. ' ' .. info.szName) + h:Lookup('Image_life'):SetPercentage(info.fCurrentLife64 / math.max(info.fMaxLife64, 1)) + local box = h:Lookup('Box_Icon') + local _, icon = X.GetBuffName(dwBuffID, nLevel) + if nIcon then + icon = nIcon + end + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN) + box:SetObjectIcon(icon) + box:SetObjectStaring(true) + box:SetOverTextPosition(1, ITEM_POSITION.LEFT_TOP) + box:SetOverTextPosition(0, ITEM_POSITION.RIGHT_BOTTOM) + box:SetOverTextFontScheme(1, 8) + box:SetOverTextFontScheme(0, 7) + local nSec = X.GetEndTime(buff.nEndFrame) + if nSec < 60 then + box:SetOverText(1, math.floor(nSec) .. '\'') + end + if buff.nStackNum > 1 then + box:SetOverText(0, buff.nStackNum) + end + h.data = data + h.nLFC = nLFC + h.nSortLFC = nSortLFC + h:Show() + local nInsertIndex = nCount - 1 + for i = nCount - 2, 0, -1 do + local item = D.handle:Lookup(i) + if item and item:IsValid() then + local nItemSortLFC = item.nSortLFC or 0 + if nItemSortLFC < nSortLFC then + nInsertIndex = i + 1 + break + elseif nItemSortLFC == nSortLFC then + local itemID = (item.data and item.data.dwID) or 0 + if itemID <= dwID then + nInsertIndex = i + 1 + break + else + nInsertIndex = i + end + else + nInsertIndex = i + end + end + end + h:SetIndex(nInsertIndex) + for i = nInsertIndex, nCount - 1 do + local item = D.handle:Lookup(i) + if item and item:IsValid() then + local text = item:Lookup('Text_Name') + if text and text:IsValid() then + local szName = (item.data and item.data.szName) or '' + text:SetText((i + 1) .. ' ' .. szName) + end + end + end + D.handle:FormatAllItemPos() + D.SwitchPanel(nCount) + CACHE_LIST[key] = h +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_PartyBuffList') + if X.IsRestricted('MY_TeamMon_PartyBuffList') then + return + end + X.UI.OpenFrame(PBL_INI_FILE, 'MY_TeamMon_PartyBuffList') + D.SwitchPanel(0) +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_PartyBuffList', + exports = { + { + preset = 'UIEvent', + root = D, + }, + { + fields = { + 'bHoverSelect', + 'tAnchor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bHoverSelect', + 'tAnchor', + }, + root = O, + }, + }, +} +MY_TeamMon_PartyBuffList = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_TeamMon_PartyBuffList', D.Init) + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_PartyBuffList', function() + if arg0 and arg0 ~= 'MY_TeamMon_PartyBuffList' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_SpellTimer.lua b/MY_TeamMon/src/MY_TeamMon_SpellTimer.lua new file mode 100644 index 000000000..ef30d76fe --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_SpellTimer.lua @@ -0,0 +1,469 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 倒计时类 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_SpellTimer' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_SpellTimer' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_TeamMon_SpellTimer', { ['*'] = false }) +-------------------------------------------------------------------------------- + +local MY_FormatDuration = X.FormatDuration +local FilterCustomText = MY_TeamMon.FilterCustomText + +local O = X.CreateUserSettingsModule('MY_TeamMon_SpellTimer', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_SpellTimer'], + _L['Enable'], + }), + szRestriction = 'MY_TeamMon_SpellTimer', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_SpellTimer'], + _L['UI Anchor'], + }), + szRestriction = 'MY_TeamMon_SpellTimer', + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'TOPRIGHT', r = 'CENTER', x = -250, y = -300 }, + }, + nBelowDecimal = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_SpellTimer'], + _L['Show countdown decimal settings'], + }), + szRestriction = 'MY_TeamMon_SpellTimer', + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, +}) +local D = {} + +-- ST class +local ST = {} +ST.__index = ST + +local MY_TEAM_MON_TYPE = MY_TeamMon.MY_TEAM_MON_TYPE +local ST_INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_SpellTimer.ini' +local ST_UI_NORMAL = 5 +local ST_UI_WARNING = 2 +local ST_UI_ALPHA = 180 +local ST_TIME_EXPIRE = {} +local ST_CACHE = {} +do + for k, v in pairs(MY_TEAM_MON_TYPE) do + ST_CACHE[v] = setmetatable({}, { __mode = 'v' }) + ST_TIME_EXPIRE[v] = {} + end +end + +-- 解析分段倒计时 +local function ParseCountdown(szCountdown, szSender, szReceiver, aBackreferences) + local aCountdown = MY_TeamMon.ParseCountdown(szCountdown) + if X.IsTable(aCountdown) then + for _, v in ipairs(aCountdown) do + v.szContent = FilterCustomText(v.szContent, szSender, szReceiver, aBackreferences) + end + end + return aCountdown +end + +-- 倒计时模块 事件名称 MY_TEAM_MON__SPELL_TIMER__CREATE +-- nType 倒计时类型 MY_TEAM_MON_TYPE +-- szKey 同一类型内唯一标识符 +-- tParam { +-- szName -- 倒计时名称 如果是分段就不需要传名称 +-- nTime -- 时间 例 10,测试;25,测试2; 或 30 +-- nRefresh -- 多少时间内禁止重复刷新 +-- nIcon -- 倒计时图标ID +-- bTalk -- 是否发布倒计时 5秒内聊天框提示 【szName】 剩余 n 秒。 +-- } +-- 例子:FireUIEvent('MY_TEAM_MON__SPELL_TIMER__CREATE', 0, 'test', { nTime = '5,test;15,测试;25,c', szName = 'demo' }) +-- 性能测试:for i = 1, 200 do FireUIEvent('MY_TEAM_MON__SPELL_TIMER__CREATE', 0, i, { nTime = Random(5, 15), nIcon = i }) end +local function CreateCountdown(nType, szKey, tParam, szSender, szReceiver, aBackreferences) + assert(type(tParam) == 'table', 'CreateCountdown failed!') + local tTime = {} + local nTime = GetTime() + if X.IsNumber(tParam.nTime) then + tTime = { + nTime = tParam.nTime, + szContent = tParam.szContent, + } + elseif X.IsString(tParam.nTime) then + local aCountdown = ParseCountdown(tParam.nTime, szSender, szReceiver, aBackreferences) + if aCountdown then + tTime = aCountdown[1] + tParam.nTime = aCountdown + tParam.nRefresh = tParam.nRefresh or aCountdown[#aCountdown].nTime - 3 -- 最大时间内防止重复刷新 但是脱离战斗的NPC需要手动删除 + else + return X.OutputSystemMessage( + _L['MY_TeamMon'], + _L['Countdown format error'] + .. ' TYPE: ' .. _L['Countdown TYPE ' .. nType] + .. ' KEY:' .. szKey .. ' Content:' .. tParam.nTime, + X.CONSTANT.MSG_THEME.ERROR) + end + else + return X.OutputSystemMessage( + _L['MY_TeamMon'], + _L['Countdown format error'] + .. ' TYPE: ' .. _L['Countdown TYPE ' .. nType] + .. ' KEY:' .. szKey .. ' Content:' .. X.EncodeLUAData(tParam.nTime), + X.CONSTANT.MSG_THEME.ERROR) + end + if tTime.nTime == 0 then + local ui = ST_CACHE[nType][szKey] + if ui and ui:IsValid() then + ui.obj:RemoveItem() + end + ST_TIME_EXPIRE[nType][szKey] = nil + elseif tTime.nTime == -1 then + local ui = ST_CACHE[nType][szKey] + if ui and ui:IsValid() then + ui.obj:RemoveItem() + end + -- 2025.08.25增加倒计时条强制设置nRefresh,nTime为-1,-2强制更改nRefresh,为兼容旧数据,先判断有nRefresh字段再修改 + if tParam.nRefresh then + ST_TIME_EXPIRE[nType][szKey] = nTime + tParam.nRefresh * 1000 - 3 + end + elseif tTime.nTime == -2 then + ST_TIME_EXPIRE[nType][szKey] = nTime + (tParam.nRefresh or 0) * 1000 - 3 + else + local nExpire = ST_TIME_EXPIRE[nType][szKey] + if nExpire and nExpire > nTime then + return + end + ST_TIME_EXPIRE[nType][szKey] = nTime + (tParam.nRefresh or 0) * 1000 + ST:ctor(nType, szKey, tParam):SetInfo(tTime, tParam.nIcon or 13):Switch(false) + end +end + +function D.OnFrameCreate() + this:RegisterEvent('LOADING_END') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('MY_TEAM_MON__SPELL_TIMER__CREATE') + this:RegisterEvent('MY_TEAM_MON__SPELL_TIMER__DEL') + this:RegisterEvent('MY_TEAM_MON__SPELL_TIMER__CLEAR') + D.hItem = this:CreateItemData(ST_INI_FILE, 'Handle_Item') + D.UpdateAnchor(this) + D.handle = this:Lookup('', 'Handle_List') +end + +function D.OnEvent(szEvent) + if szEvent == 'MY_TEAM_MON__SPELL_TIMER__CREATE' then + CreateCountdown(arg0, arg1, arg2, arg3, arg4, arg5) + elseif szEvent == 'MY_TEAM_MON__SPELL_TIMER__DEL' then + local ui = ST_CACHE[arg0][arg1] + if ui and ui:IsValid() then + ui.obj:RemoveItem() + end + ST_TIME_EXPIRE[arg0][arg1] = nil + elseif szEvent == 'MY_TEAM_MON__SPELL_TIMER__CLEAR' then + D.handle:Clear() + for k, v in pairs(ST_TIME_EXPIRE) do + ST_TIME_EXPIRE[k] = {} + end + elseif szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif szEvent == 'ON_ENTER_CUSTOM_UI_MODE' or szEvent == 'ON_LEAVE_CUSTOM_UI_MODE' then + this:BringToTop() + UpdateCustomModeWindow(this, _L['Countdown']) + elseif szEvent == 'LOADING_END' then + for k, v in pairs(ST_CACHE) do + for kk, vv in pairs(v) do + if vv and vv:IsValid() and not vv.bHold then + vv.obj:RemoveItem() + end + end + end + end +end + +function D.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this, 'TOPLEFT') +end + +local function SetSTAction(ui, nLeft, nPer) + local me = X.GetClientPlayer() + local obj = ui.obj + if nLeft < 5 then + local nTimeLeft = nLeft * 1000 % 1000 + local nAlpha = 255 * nTimeLeft / 1000 + if math.floor(nLeft / 1) % 2 == 1 then + nAlpha = 255 - nAlpha + end + obj:SetInfo({ nTime = nLeft }):SetPercentage(nPer):Switch(true):SetAlpha(100 + nAlpha) + if ui.bTalk and me.IsInParty() then + if not ui.szTalk or ui.szTalk ~= math.floor(nLeft) then + ui.szTalk = math.floor(nLeft) + MY_TeamMon.SendChat(PLAYER_TALK_CHANNEL.RAID, _L('[%s] remaining %ds.', obj:GetName(), math.floor(nLeft))) + end + end + else + if ui.nAlpha < ST_UI_ALPHA then + ui.nAlpha = math.min(ST_UI_ALPHA, ui.nAlpha + 15) + obj:SetInfo({ nTime = nLeft }):SetPercentage(nPer):SetAlpha(ui.nAlpha) + else + obj:SetInfo({ nTime = nLeft }):SetPercentage(nPer) + end + end +end + +function D.OnFrameBreathe() + local me = X.GetClientPlayer() + if not me then return end + local nNow = GetTime() + for k, v in pairs(ST_CACHE) do + for kk, vv in pairs(v) do + if vv:IsValid() then + if type(vv.countdown) == 'number' then + local nLeft = vv.countdown - ((nNow - vv.nLeft) / 1000) + if nLeft >= 0 then + SetSTAction(vv, nLeft, nLeft / vv.countdown) + else + vv.obj:RemoveItem() + end + else + local time = vv.countdown[1] + local nLeft = time.nTime - (nNow - vv.nLeft) / 1000 + if nLeft >= 0 then + SetSTAction(vv, nLeft, nLeft / time.nTime) + else + if #vv.countdown == 1 then + vv.obj:RemoveItem() + else + local nATime = (nNow - vv.nCreate) / 1000 + vv.nLeft = nNow + table.remove(vv.countdown, 1) + local time = vv.countdown[1] + time.nTime = time.nTime - nATime + vv.obj:SetInfo(time):Switch(false) + end + end + end + end + end + end + D.handle:Sort() + D.handle:FormatAllItemPos() +end + +function D.UpdateAnchor(frame) + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + frame:CorrectPos() +end + +-- 构造函数 +function ST:ctor(nType, szKey, tParam) + if not ST_CACHE[nType] then + return + end + if not tParam.szName then + tParam.szName = nType .. '#' .. szKey + end + local ui = ST_CACHE[nType][szKey] + local nTime = GetTime() + local oo + if ui and ui:IsValid() then + oo = ui.obj + oo.ui.nCreate = nTime + oo.ui.nLeft = nTime + oo.ui.countdown = tParam.nTime + oo.ui.nRefresh = tParam.nRefresh or 1 + oo.ui.bTalk = tParam.bTalk + oo.ui.nFrame = tParam.nFrame + else -- 没有ui的情况下 创建 + oo = {} + setmetatable(oo, self) + oo.ui = D.handle:AppendItemFromData(D.hItem) + -- 参数 + oo.ui.nCreate = nTime + oo.ui.nLeft = nTime + oo.ui.countdown = tParam.nTime + oo.ui.nRefresh = tParam.nRefresh or 1 + oo.ui.bTalk = tParam.bTalk + oo.ui.nFrame = tParam.nFrame + oo.ui.bHold = tParam.bHold + -- 杂项 + oo.ui.nAlpha = 30 + -- ui + oo.ui.time = oo.ui:Lookup('TimeLeft') + oo.ui.txt = oo.ui:Lookup('SkillName') + oo.ui.img = oo.ui:Lookup('Image') + oo.ui.sha = oo.ui:Lookup('Shadow') + oo.ui.sfx = oo.ui:Lookup('SFX') + oo.ui.obj = oo + ST_CACHE[nType][szKey] = oo.ui + oo.ui:Show() + oo.ui.sfx:Set2DRotation(math.pi / 2) + D.handle:FormatAllItemPos() + end + return oo +end + +-- 设置倒计时的名称和时间 用于动态改变分段倒计时 +function ST:SetInfo(tTime, nIcon) + if tTime.szContent then + self.ui.txt:SetText(tTime.szContent) + end + if tTime.nTime then + self.ui.time:SetText( + ( + tTime.nTime >= 60 + and MY_FormatDuration(tTime.nTime - tTime.nTime % 60, 'ENGLISH_ABBR', { accuracyUnit = 'minute' }) + or '' + ) + .. ( + (D.bReady and O.nBelowDecimal ~= 0 and (O.nBelowDecimal == 3601 or (tTime.nTime < O.nBelowDecimal and tTime.nTime >= 0.1))) + and ('%.1fs'):format(tTime.nTime % 60) + or ('%ds'):format(tTime.nTime % 60) + ) + ) + self.ui:SetUserData(math.floor(tTime.nTime)) + end + if nIcon then + local box = self.ui:Lookup('Box') + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN) + box:SetObjectIcon(nIcon) + end + if MY_TeamMon.bPushVoiceAlarm and tTime.szVoice then + FireUIEvent('MY_TEAM_MON__VOICE_ALARM', tTime.szVoice) + end + return self +end + +-- 设置进度条 +function ST:SetPercentage(fPercentage) + self.ui.img:SetPercentage(fPercentage) + self.ui.sfx:SetRelX(32 + 300 * fPercentage) + self.ui.sha:SetW(300 - 300 * fPercentage) + self.ui.sha:SetRelX(32 + 300 * fPercentage) + self.ui:FormatAllItemPos() + return self +end + +-- 改变样式 如果true则更改为第二样式 用于时间小于5秒的时候 +function ST:Switch(bSwitch) + if bSwitch then + self.ui.txt:SetFontColor(255, 255, 255) + -- self.ui.time:SetFontColor(255, 255, 255) + self.ui.img:SetFrame(ST_UI_WARNING) + -- self.ui.sha:SetColorRGB(30, 0, 0) + else + self.ui.txt:SetFontColor(255, 255, 0) + self.ui.time:SetFontColor(255, 255, 255) + self.ui.img:SetFrame(self.ui.nFrame or ST_UI_NORMAL) + self.ui.img:SetAlpha(self.ui.nAlpha) + -- self.ui.sha:SetAlpha(100) + self.ui.sha:SetColorRGB(0, 0, 0) + end + return self +end + +function ST:SetAlpha(nAlpha) + self.ui.img:SetAlpha(nAlpha) + -- self.ui.sha:SetAlpha(100 * (nAlpha / 255)) + return self +end + +function ST:GetName() + return self.ui.txt:GetText() +end + +-- 删除倒计时 +function ST:RemoveItem() + D.handle:RemoveItem(self.ui) + D.handle:FormatAllItemPos() +end + +function D.CheckEnable() + X.UI.CloseFrame('MY_TeamMon_SpellTimer') + if X.IsRestricted('MY_TeamMon_SpellTimer') then + return + end + X.UI.OpenFrame(ST_INI_FILE, 'MY_TeamMon_SpellTimer') +end + +function D.Init() + D.CheckEnable() +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_SpellTimer', + exports = { + { + root = D, + preset = 'UIEvent' + }, + { + fields = { + 'nBelowDecimal', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'nBelowDecimal', + }, + root = O, + }, + }, +} +MY_TeamMon_SpellTimer = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_SpellTimer', function() + if arg0 and arg0 ~= 'MY_TeamMon_SpellTimer' then + return + end + D.CheckEnable() +end) + +X.RegisterUserSettingsInit('MY_TeamMon_SpellTimer', function() + D.bReady = true + D.Init() +end) + +X.RegisterUserSettingsRelease('MY_TeamMon_SpellTimer', function() + D.bReady = false +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe.lua new file mode 100644 index 000000000..16046a2ef --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe.lua @@ -0,0 +1,118 @@ +-------------------------------------------------------------------------------- +-- v is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控订阅界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local D = {} + +function D.OpenPanel(szModule) + local ui = X.UI.CreateFrame('MY_TeamMon_Subscribe', { + w = 1000, h = 700, + close = true, + text = X.PACKET_INFO.NAME .. _L.SPLIT_DOT .. _L['MY_TeamMon_Subscribe'], + anchor = 'CENTER', + }) + ui:Append('WndPageSet', { + name = 'PageSet_All', + x = 0, y = 48, w = 1000, h = 700 - 48, + }) + ui:Append('WndButton', { + name = 'Btn_Option', + x = 960, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + menu = function() + return { + { + szOption = _L['Manage my online data'], + fnAction = function() + X.OpenBrowser('https://j3cx.com/team-monitor/mine') + X.UI.ClosePopupMenu() + end, + }, + } + end, + }) + local frame = ui:Raw() + frame:BringToTop() + D.PageSetModule.DrawUI(frame) + D.PageSetModule.ActivePage(frame, szModule or 1, true) +end + +function D.ClosePanel() + X.UI.CloseFrame('MY_TeamMon_Subscribe') +end + +function D.IsPanelOpened() + return Station.Lookup('Normal/MY_TeamMon_Subscribe') +end + +function D.TogglePanel() + if D.IsPanelOpened() then + D.ClosePanel() + else + D.OpenPanel() + end +end + +-- 注册子模块 +function D.RegisterModule(szKey, szName, tModule) + if not D.PageSetModule or not szName or not tModule then + return + end + if tModule.szFloatEntry then + table.insert(D.aFloatEntry, { szName = szName, szKey = tModule.szFloatEntry }) + end + if tModule.szSaveDB then + table.insert(D.aSaveDB, { szName = szName, szKey = tModule.szSaveDB }) + end + D.PageSetModule.RegisterModule(szKey, szName, tModule) + if D.IsPanelOpened() then + D.ClosePanel() + D.OpenPanel() + end +end + +D.PageSetModule = X.UI.CreatePageSetModule(D, 'Wnd_Total/PageSet_All') + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenPanel', + 'ClosePanel', + 'TogglePanel', + 'IsPanelOpened', + 'RegisterModule', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe_Data.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe_Data.lua new file mode 100644 index 000000000..42b47628e --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe_Data.lua @@ -0,0 +1,897 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe_Data' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_Subscribe_Data.ini' +local D = X.LazyLoadingTable({}, { + PW = function() return X.SECRET['FILE::TEAM_MON_DATA_PW'] end, +}) + +local MY_TEAM_MON_REMOTE_DATA_ROOT = MY_TeamMon.MY_TEAM_MON_REMOTE_DATA_ROOT + +local DATA_PAGINATION = { + nIndex = 1, + nSize = 30, + nTotal = 1, + nPageTotal = 1, +} +local DATA_LIST = {} +local DATA_SELECTED_KEY +local DATA_DOWNLOADING = {} + +local META_LUA_SCHEMA = X.Schema.Record({ + szURL = X.Schema.Optional(X.Schema.String), + szAboutURL = X.Schema.Optional(X.Schema.String), + szAuthor = X.Schema.String, + szDataURL = X.Schema.String, + szKey = X.Schema.Optional(X.Schema.String), + szTitle = X.Schema.String, + szUpdateTime = X.Schema.Optional(X.Schema.String), + szVersion = X.Schema.String, +}, true) +local META_JSON_SCHEMA = X.Schema.Record({ + about = X.Schema.Optional(X.Schema.String), + author = X.Schema.String, + data_url = X.Schema.String, + key = X.Schema.Optional(X.Schema.String), + name = X.Schema.String, + update = X.Schema.Optional(X.Schema.String), + version = X.Schema.String, +}, true) +local META_LIST_JSON_SCHEMA = X.Schema.Record({ + data = X.Schema.Collection(META_JSON_SCHEMA), + page = X.Schema.Record({ + index = X.Schema.Number, + size = X.Schema.Number, + total = X.Schema.Number, + }, true), +}, true) + +-- 陆服环境下,以下缩写均对等 +-- tinymins +-- tinymins?master +-- tinymins/JX3_MY_DATA +-- tinymins/JX3_MY_DATA?master +-- tinymins@github +-- tinymins@github?master +-- tinymins@github:/MY_TeamMon/zhcn/meta.json +-- tinymins@github/JX3_MY_DATA +-- tinymins@github/JX3_MY_DATA:/MY_TeamMon/zhcn/meta.json +-- tinymins@github/JX3_MY_DATA?master:/MY_TeamMon/zhcn/meta.json +do +local PROVIDER_PARAMS = { + github = { + szRawURL = 'https://cdn.jsdelivr.net/gh/%s/%s@%s/%s', + szRawURL_T = { + '^https://cdn.jsdelivr.net/gh/([^/]+)/([^/]+)@([^/]+)/(.+)$', + '^https://raw%.githubusercontent%.com/([^/]+)/([^/]+)/([^/]+)/(.+)$', + }, + szBlobURL = 'https://github.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://github%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + aliyun = { + szRawURL = 'https://code.aliyun.com/%s/%s/raw/%s/%s', + szRawURL_T = '^https://code%.aliyun%.com/([^/]+)/([^/]+)/raw/([^/]+)/(.+)$', + szBlobURL = 'https://code.aliyun.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://code%.aliyun%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + gitee = { + szRawURL = 'https://gitee.com/%s/%s/raw/%s/%s', + szRawURL_T = '^https://gitee%.com/([^/]+)/([^/]+)/raw/([^/]+)/(.+)$', + szBlobURL = 'https://gitee.com/%s/%s/blob/%s/%s', + szBlobURL_T = '^https://gitee%.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)$', + }, + jx3box = { + bSimple = true, + szRawURL = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/subscribe/feed?key=%s', + szRawURL_T = { + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/team-monitor/subscribe/feed%?.*&key%=([^&]+)&.*$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/team-monitor/subscribe/feed%?key%=([^&]+)&.*$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/team-monitor/subscribe/feed%?.*&key%=([^&]+)$', + '^' .. X.EscapeString(MY_RSS.PULL_BASE_URL) .. '/api/addon/team-monitor/subscribe/feed%?key%=([^&]+)$', + }, + }, +} +local DEFAULT_PROVIDER = 'jx3box' +local DEFAULT_PROJECT = 'JX3_MY_DATA' +local DEFAULT_BRANCH = 'master' +local DEFAULT_PATH = 'MY_TeamMon/' .. X.ENVIRONMENT.GAME_EDITION .. '/meta.json' +local function GetURL(szURL, szType) + local szSimple, szUser, szProvider, szProject, szBranch, szPath, nPos + if X.StringFindW(szURL, '://') then + for k, p in pairs(PROVIDER_PARAMS) do + if p.bSimple then + if X.IsTable(p.szRawURL_T) then + for _, s in ipairs(p.szRawURL_T) do + szSimple = szURL:match(s) + if szSimple then + break + end + end + elseif X.IsString(p.szRawURL_T) then + szSimple = szURL:match(p.szRawURL_T) + end + if szSimple then + szProvider = k + break + end + else + if X.IsTable(p.szRawURL_T) then + for _, s in ipairs(p.szRawURL_T) do + szUser, szProject, szBranch, szPath = szURL:match(s) + if szUser then + break + end + end + elseif X.IsString(p.szRawURL_T) then + szUser, szProject, szBranch, szPath = szURL:match(p.szRawURL_T) + end + if not szUser and p.szBlobURL_T then + szUser, szProject, szBranch, szPath = szURL:match(p.szBlobURL_T) + end + if szUser then + szProvider = k + break + end + end + end + else + szUser, szSimple = szURL, '' + nPos = X.StringFindW(szUser, ':') + if nPos then + szPath = szUser:sub(nPos + 1):gsub('^/+', '') + szUser = szUser:sub(1, nPos - 1) + szSimple = ':' .. szPath .. szSimple + else + szPath = DEFAULT_PATH + end + nPos = X.StringFindW(szUser, '?') + if nPos then + szBranch = szUser:sub(nPos + 1) + szUser = szUser:sub(1, nPos - 1) + szSimple = '?' .. szBranch .. szSimple + else + szBranch = DEFAULT_BRANCH + end + nPos = X.StringFindW(szUser, '/') + if nPos then + szProject = szUser:sub(nPos + 1) + szUser = szUser:sub(1, nPos - 1) + szSimple = '/' .. szProject .. szSimple + else + szProject = DEFAULT_PROJECT + end + nPos = X.StringFindW(szUser, '@') + if nPos then + szProvider = szUser:sub(nPos + 1) + if PROVIDER_PARAMS[szProvider] then + szUser = szUser:sub(1, nPos - 1) + else + szProvider = DEFAULT_PROVIDER + end + else + szProvider = DEFAULT_PROVIDER + end + szSimple = szUser .. szSimple + szSimple = X.EncodeURIComponent(AnsiToUTF8(szSimple)) + szUser = X.EncodeURIComponent(AnsiToUTF8(szUser)) + szProject = X.EncodeURIComponent(AnsiToUTF8(szProject)) + szBranch = X.EncodeURIComponent(AnsiToUTF8(szBranch)) + end + local provider = szProvider and PROVIDER_PARAMS[szProvider] + if not provider then + return + end + if szType == 'RAW' then + if provider.bSimple then + return provider.szRawURL:format(szSimple) + end + return provider.szRawURL:format(szUser, szProject, szBranch, szPath) + end + if szType == 'BLOB' then + if not provider.szBlobURL then + return + end + return provider.szBlobURL:format(szUser, szProject, szBranch, szPath) + end + if szType == 'SHORT' then + szSimple = UTF8ToAnsi(X.DecodeURIComponent(szSimple)) + szUser = UTF8ToAnsi(X.DecodeURIComponent(szUser)) + szProject = UTF8ToAnsi(X.DecodeURIComponent(szProject)) + szBranch = UTF8ToAnsi(X.DecodeURIComponent(szBranch)) + if provider.bSimple then + if szProvider ~= DEFAULT_PROVIDER then + szSimple = szSimple .. '@' .. szProvider + end + return szSimple + end + if szProvider ~= DEFAULT_PROVIDER then + szUser = szUser .. '@' .. szProvider + end + if szProject ~= DEFAULT_PROJECT then + szUser = szUser .. '/' .. szProject + end + if szBranch ~= DEFAULT_BRANCH then + szUser = szUser .. '?' .. szBranch + end + if szPath ~= DEFAULT_PATH then + szUser = szUser .. ':' .. szPath + end + return szUser + end +end +-- 将地址转化为 GIT 仓库浏览地址 +function D.GetRawURL(szURL) + return GetURL(szURL, 'RAW') +end +-- 将地址转化为 GIT 仓库源文件下载地址 +function D.GetBlobURL(szURL) + return GetURL(szURL, 'BLOB') +end +-- 将地址转化为短链接 +function D.GetShortURL(szURL) + return GetURL(szURL, 'SHORT') +end +-- 根据描述文件中的相对文件地址 计算绝对 GIT 仓库浏览地址 +function D.GetAttachRawURL(szAttach, szURL) + if not szAttach then + return + end + if X.IsURL(szAttach) then + return szAttach + end + local szURL = D.GetRawURL(szURL) + if not szURL then + return + end + return X.NormalizeURI(X.ConcatURI(X.GetParentURI(szURL), szAttach)) +end +-- 根据描述文件中的相对文件地址 计算绝对 GIT 仓库源文件下载地址 +function D.GetAttachBlobURL(szAttach, szURL) + if not szAttach then + return + end + if X.IsURL(szAttach) then + return szAttach + end + local szURL = D.GetBlobURL(szURL) + if not szURL then + return + end + return X.NormalizeURI(X.ConcatURI(X.GetParentURI(szURL), szAttach)) +end +end + +-- 格式化描述内容 +-- 进入该函数的数据必须为安全数据,即已经过 Schema 检测的数据。 +function D.FormatMetaInfo(res) + local szURL = res.szURL or res.url + local info = { + szURL = szURL, + szDataURL = D.GetAttachRawURL(res.szDataURL or res.data_url or './data.jx3dat', szURL), + szKey = D.GetShortURL(szURL) or ('H' .. GetStringCRC(szURL)), + szAuthor = res.szAuthor or res.author or '', + szTitle = res.szTitle or res.name or '', + szUpdateTime = res.szUpdateTime or res.update or '', + szVersion = res.szVersion or res.version or '', + } + if X.IsEmpty(info.szURL) or X.IsEmpty(info.szTitle) or X.IsEmpty(info.szVersion) then + return + end + return info +end + +function D.IsDownloading(szKey) + return DATA_DOWNLOADING[szKey] +end + +function D.IsSubscripted(info) + if (D.GetShortURL(info.szURL) or info.szURL) == MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastURL') then + return true, info.szVersion == MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastVersion') + end + return false, false +end + +-- 获取在线订阅列表 +function D.FetchSubscribeList(nPage) + return X.Promise:new(function(resolve, reject) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/subscribe/all', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + page = nPage, + pageSize = 15, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local errs = X.Schema.CheckSchema(res, META_LIST_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, i .. '. ' .. err.message) + end + local szErrmsg = _L['Fetch repo meta list failed.'] .. '\n' .. table.concat(aErrmsg, '\n') + X.OutputDebugMessage(_L['MY_TeamMon_Subscribe_Data'], szErrmsg, X.DEBUG_LEVEL.WARNING) + reject(X.Error:new(szErrmsg)) + return + end + local tPagination = { + nIndex = res.page.index, + nSize = res.page.size, + nTotal = res.page.total, + nPageTotal = math.ceil(res.page.total / res.page.size), + } + local aMetaInfo = {} + for _, info in ipairs(res.data) do + info.url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/subscribe/feed?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + key = info.key, + })) + info = D.FormatMetaInfo(info) + if info then + info.bEmbedded = true + table.insert(aMetaInfo, info) + end + end + resolve({ tPagination = tPagination, aMetaInfo = aMetaInfo }) + end, + }) + end) +end + +-- 根据订阅文件地址,获取订阅文件内容 +function D.FetchSubscribeItem(szURL) + return X.Promise:new(function(resolve, reject) + local szURL = D.GetRawURL(szURL) or szURL + X.Ajax({ + url = szURL, + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if not res then + reject(X.Error:new(_L['ERR: Decode info content as json failed!'])) + return + end + local errs = X.Schema.CheckSchema(res, META_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, ' ' .. i .. '. ' .. err.message) + end + reject(X.Error:new(_L['ERR: Info content is illegal!'] .. '\n\n' .. table.concat(aErrmsg, '\n'))) + return + end + res.url = szURL + local info = D.FormatMetaInfo(res) + if not info then + reject(X.Error:new(_L['ERR: Info content is illegal!'])) + return + end + resolve(info) + end, + error = function(html, status) + if status == 404 then + reject(X.Error:new(_L['ERR404: MetaInfo address not found!'])) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_TeamMon_Subscribe_Data'], 'ERROR Get MetaInfo: ' .. X.EncodeLUAData(status) .. '\n' .. (X.ConvertToANSI(html) or ''), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + reject(X.Error:new(_L['ERR: Get MetaInfo failed!'])) + end, + }) + end) +end + +function D.SubscribeEventTracking(info, from) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/addon/statistics/monitor', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + data_url = info.szDataURL, + from = from == 'FAVORITE' and 2 or 1, + player_id = X.GetClientPlayerGlobalID(), + }, + signature = X.SECRET['J3CX::TEAM_MON_STATISTICS'], + }) +end + +function D.Subscribe(info, bSilent) + local szUUID = 'r-' + .. ('%08x'):format(GetStringCRC(info.szDataURL)) + .. ('%08x'):format(GetStringCRC(info.szVersion)) + local LUA_CONFIG = { passphrase = D.PW, crc = true, compress = true } + local PLAIN_LUA_CONFIG = { passphrase = false } + local szMetaFilePath = MY_TEAM_MON_REMOTE_DATA_ROOT .. szUUID .. '.meta.jx3dat' + local szDataFilePath = MY_TEAM_MON_REMOTE_DATA_ROOT .. szUUID .. '.jx3dat' + local aType = bSilent and MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastType') or nil + return X.Promise:new(function(resolve, reject) + X.Promise:new(function(resolve, reject) + local p = X.LoadLUAData(szMetaFilePath, LUA_CONFIG) + if p and p.szVersion == info.szVersion and IsLocalFileExist(szDataFilePath) then + resolve() + return + end + if DATA_DOWNLOADING[info.szKey] then + reject(X.Error:new(_L['Downloading in progress, please wait...'])) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TeamMon_Subscribe_Data', + 'Start download file. info: ' .. X.EncodeLUAData(info) + .. ' silentType: ' .. X.EncodeLUAData(aType), + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + DATA_DOWNLOADING[info.szKey] = true + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + X.FetchLUAFile(info.szDataURL) + :Then(function(szPath) + return X.Promise:new(function(resolve, reject) + local data = X.LoadLUAData(szPath, LUA_CONFIG) + or X.LoadLUAData(szPath, PLAIN_LUA_CONFIG) + resolve(data) + end) + end) + :Then(function(data) + DATA_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + if data then + X.SaveLUAData(szMetaFilePath, info, LUA_CONFIG) + X.SaveLUAData(szDataFilePath, data, LUA_CONFIG) + resolve() + else + reject(X.Error:new(_L('Decode %s failed!', info.szTitle))) + end + end) + :Catch(function(error) + DATA_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + reject(error) + end) + end) + :Then(function() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TeamMon_Subscribe_Data', + 'Load configure file ' .. szDataFilePath + .. ' info: ' .. X.EncodeLUAData(info) + .. ' silentType: ' .. X.EncodeLUAData(aType), + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + local function fnAction(bStatus, ...) + if bStatus then + local szFilePath, aType, szMode, tMeta = ... + local me = X.GetClientPlayer() + if not bSilent and me.IsInParty() then + MY_TeamMon.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TeamMon_Subscribe_Data', {'LOAD', info.szTitle}, true) + end + MY_TeamMon.SetUserConfig('MY_TeamMon_Subscribe_Data.LastVersion', info.szVersion) + MY_TeamMon.SetUserConfig('MY_TeamMon_Subscribe_Data.LastURL', D.GetShortURL(info.szURL) or info.szURL) + MY_TeamMon.SetUserConfig('MY_TeamMon_Subscribe_Data.LastType', aType) + MY_TeamMon.SetUserConfig('MY_TeamMon_Subscribe_Data.DataNotModified', true) + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + end + end + if bSilent then + MY_TeamMon.ImportDataFromFile(szDataFilePath, aType, 'REPLACE', fnAction) + else + MY_TeamMon_UI.OpenImportPanel(szDataFilePath, info.szTitle .. ' - ' .. info.szAuthor, fnAction) + end + end) + :Catch(function(error) + if not bSilent then + X.OutputAnnounceMessage(error.message) + end + reject(error) + end) + end) +end + +function D.SyncTeam(info) + local function CheckSharePerms() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + elseif not X.IsClientPlayerInParty() then + X.Alert(_L['You are not in the team.']) + elseif not X.IsClientPlayerTeamLeader() and not X.IsDebugging() then + X.Alert(_L['You are not team leader.']) + elseif not info then + MY.OutputAnnounceMessage(_L['Please select one dataset first!']) + else + return true + end + return false + end + if CheckSharePerms() then + X.Confirm(_L['Confirm?'], function() + if CheckSharePerms() then + MY_TeamMon.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TeamMon_Subscribe_Data', {'SYNC', info}) + end + end) + end +end + +function D.Init() + local K = string.char(75, 69) + local k = string.char(80, 87) + if X.IsString(D[k]) then + D[k] = X[K](D[k] .. string.char(77, 89)) + end +end + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(DATA_LIST) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Author'):SetText(X.ReplaceSensitiveWord(info.szAuthor)) + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted, bIsLatest = D.IsSubscripted(info) + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (DATA_DOWNLOADING[info.szKey] and _L['Downloading...']) + or (bIsSubscripted and ( + bIsLatest + and _L['Last select'] + or _L['Can update'])) + or _L['Download'], + enable = not DATA_DOWNLOADING[info.szKey], + onClick = function() + D.Subscribe(info) + D.SubscribeEventTracking(info, 'SUBSCRIBE') + end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() + -- 推荐页码 + page:Lookup('Wnd_Total/Btn_PrevPage'):Enable(DATA_PAGINATION.nIndex > 1) + page:Lookup('Wnd_Total/Btn_NextPage'):Enable(DATA_PAGINATION.nIndex < DATA_PAGINATION.nTotal) + page:Lookup('Wnd_Total', 'Text_Page'):SetText(DATA_PAGINATION.nIndex .. ' / ' .. DATA_PAGINATION.nPageTotal) +end + +function D.SwitchPage(nPage) + D.FetchSubscribeList(nPage) + :Then(function(res) + DATA_LIST = res.aMetaInfo + DATA_PAGINATION = res.tPagination + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_DATA__LIST_UPDATE') + end) +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TeamMon_Subscribe_Data') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break1'):SetText(_L['Author']) + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_SyncTeam', 'Text_SyncTeam'):SetText(_L['Sync team']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Refresh list']) + wnd:Lookup('Btn_PrevPage', 'Text_PrevPage'):SetText(_L['Prev page']) + wnd:Lookup('Btn_NextPage', 'Text_NextPage'):SetText(_L['Next page']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_DATA__LIST_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + + D.UpdateList(this) + D.SwitchPage(1) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TEAM_MON__SUBSCRIBE_DATA__LIST_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_SyncTeam' then + local info + for _, v in ipairs(DATA_LIST) do + if v.szKey == DATA_SELECTED_KEY then + info = v + break + end + end + D.SyncTeam(info) + elseif name == 'Btn_CheckUpdate' then + D.SwitchPage(DATA_PAGINATION.nIndex) + elseif name == 'Btn_PrevPage' then + D.SwitchPage(DATA_PAGINATION.nIndex - 1) + elseif name == 'Btn_NextPage' then + D.SwitchPage(DATA_PAGINATION.nIndex + 1) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local t = {{ + szOption = _L['Copy meta url'], + fnAction = function() + X.UI.OpenTextEditor(wnd.info.szURL) + end, + }} + local szShortURL = D.GetShortURL(wnd.info.szURL) + if szShortURL then + table.insert(t, { + szOption = _L['Copy short meta url'], + fnAction = function() + X.UI.OpenTextEditor(szShortURL) + end, + }) + end + table.insert(t, { + szOption = _L['Sync team'], + fnAction = function() + D.SyncTeam(wnd.info) + end, + }) + table.insert(t, { + szOption = _L['Add favorite'], + fnAction = function() + MY_TeamMon_Subscribe_FavoriteData.Add(wnd.info) + X.OutputSystemAnnounceMessage(_L['Add favorite success, you can switch to favorite page to see.']) + end, + }) + PopupMenu(t) + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = '' + if not X.IsEmpty(wnd.info.szURL) then + szTip = szTip .. _L('MetaInfo URL: %s', wnd.info.szURL) + end + local szShortURL = D.GetShortURL(wnd.info.szURL) + if not X.IsEmpty(szShortURL) then + szTip = szTip .. _L('(Short URL: %s)', szShortURL) + end + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_Data', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe.RegisterModule('SubscribeData', _L['Subscribe list'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_Data', + exports = { + { + root = D, + fields = { + 'GetRawURL', + 'GetBlobURL', + 'GetShortURL', + 'GetAttachRawURL', + 'GetAttachBlobURL', + 'IsDownloading', + 'IsSubscripted', + 'Subscribe', + 'SubscribeEventTracking', + 'FetchSubscribeItem', + 'SyncTeam', + }, + preset = 'UIEvent', + }, + }, +} +MY_TeamMon_Subscribe_Data = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterBgMsg('MY_TeamMon_Subscribe_Data', function(_, data, _, _, szTalker, _) + local action = data[1] + if action == 'SYNC' then + local errs = X.Schema.CheckSchema(data[2], META_LUA_SCHEMA) + if errs then + return + end + local info = D.FormatMetaInfo(data[2]) + if info then + X.Confirm( + _L('%s request download:', szTalker) + .. '\n' .. _L('Title: %s', info.szTitle) + .. '\n' .. _L('Author: %s', info.szAuthor) + .. (X.IsEmpty(info.szURL) + and '' + or '\n' .. _L('MetaInfo URL: %s', info.szURL)) + .. (X.IsEmpty(info.szUpdateTime) + and '' + or '\n' .. _L('Update time: %s', info.szUpdateTime)), + function() + -- D.AddFavMetaInfo(info) TODO + D.Subscribe(info) + D.SubscribeEventTracking(info, 'SHARE') + end) + end + elseif action == 'LOAD' then + X.OutputSystemMessage(_L('%s loaded %s', szTalker, data[2])) + end +end) + +X.RegisterInit(function() + D.Init() +end) + +X.RegisterInit('MY_TeamMon_Subscribe_Data', function() + if X.IsDebugServer() then + return + end + -- 订阅数据自动更新 + X.DelayCall(8000, function() + local szLastURL = MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastURL') + local bDataNotModified = MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.DataNotModified') + local aType = MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastType') + if X.IsEmpty(szLastURL) + or not bDataNotModified + or not X.IsTable(aType) or X.IsEmpty(aType) then + return + end + local function ParseVersion(szVersion) + if X.IsString(szVersion) then + local nPos = X.StringFindW(szVersion, '.') + if nPos then + local szMajorVersion = szVersion:sub(1, nPos) + local szMinorVersion = szVersion:sub(nPos + 1) + return szMajorVersion, szMinorVersion + end + return szVersion, '' + end + return '', '' + end + D.FetchSubscribeItem( + szLastURL, + function(info) + local szPrimaryVersion = ParseVersion(info.szVersion) + local szLastPrimaryVersion = ParseVersion(MY_TeamMon.GetUserConfig('MY_TeamMon_Subscribe_Data.LastVersion')) + if X.IsEmpty(szPrimaryVersion) or szPrimaryVersion == szLastPrimaryVersion then + return + end + --[[#DEBUG BEGIN]] + local nTime = GetTime() + X.OutputDebugMessage( + 'MY_TeamMon_Subscribe_Data', + 'Auto update confirmed: ' .. szLastPrimaryVersion + .. ' -> ' .. szPrimaryVersion + .. ' (' .. table.concat(aType, ',') .. ')', + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.Subscribe(info, true) + :Then(function() + --[[#DEBUG BEGIN]] + X.OutputDebugMessage( + 'MY_TeamMon_Subscribe_Data', + 'Auto update complete, cost time ' .. (GetTime() - nTime) .. 'ms', + X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.OutputSystemMessage(_L('Upgrade TeamMon data to latest: %s', info.szTitle)) + end) + D.SubscribeEventTracking(info, 'UPDATE') + end) + end) +end) + +X.RegisterEvent('MY_TEAM_MON_DATA_MODIFY', 'MY_TeamMon_Subscribe_Data', function() + MY_TeamMon.SetUserConfig('MY_TeamMon_Subscribe_Data.DataNotModified', false) +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe_FavoriteData.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe_FavoriteData.lua new file mode 100644 index 000000000..1d963863e --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe_FavoriteData.lua @@ -0,0 +1,392 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe_FavoriteData' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local D = { + GetRawURL = MY_TeamMon_Subscribe_Data.GetRawURL , + GetBlobURL = MY_TeamMon_Subscribe_Data.GetBlobURL , + GetShortURL = MY_TeamMon_Subscribe_Data.GetShortURL , + GetAttachRawURL = MY_TeamMon_Subscribe_Data.GetAttachRawURL , + GetAttachBlobURL = MY_TeamMon_Subscribe_Data.GetAttachBlobURL , + IsDownloading = MY_TeamMon_Subscribe_Data.IsDownloading , + IsSubscripted = MY_TeamMon_Subscribe_Data.IsSubscripted , + Subscribe = MY_TeamMon_Subscribe_Data.Subscribe , + SubscribeEventTracking = MY_TeamMon_Subscribe_Data.SubscribeEventTracking, + FetchSubscribeItem = MY_TeamMon_Subscribe_Data.FetchSubscribeItem , + SyncTeam = MY_TeamMon_Subscribe_Data.SyncTeam , +} + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_Subscribe_FavoriteData.ini' +local DATA_SELECTED_KEY +local META_DOWNLOADING = {} + +function D.Load() + return X.LoadLUAData({'userdata/team_mon/metalist.jx3dat', X.PATH_TYPE.GLOBAL}) or {} +end + +function D.Save(aMetaInfo) + X.SaveLUAData({'userdata/team_mon/metalist.jx3dat', X.PATH_TYPE.GLOBAL}, aMetaInfo) + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE') +end + +function D.Add(info, szReplaceKey) + local aMetaInfo = D.Load() + local nIndex + if szReplaceKey then + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == szReplaceKey then + table.remove(aMetaInfo, i) + nIndex = i + end + end + end + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == info.szKey then + table.remove(aMetaInfo, i) + nIndex = i + end + end + if nIndex then + table.insert(aMetaInfo, nIndex, info) + else + table.insert(aMetaInfo, info) + end + D.Save(aMetaInfo) +end + +function D.Remove(info) + -- if info.bEmbedded then + -- X.OutputAnnounceMessage(_L['Embedded dataset cannot be removed!']) + -- return + -- end + X.Confirm(_L['Confirm?'], function() + local aMetaInfo = D.Load() + for i, p in X.ipairs_r(aMetaInfo) do + if p.szKey == info.szKey then + table.remove(aMetaInfo, i) + end + end + if DATA_SELECTED_KEY == info.szKey then + DATA_SELECTED_KEY = nil + end + D.Save(aMetaInfo) + end) +end + +function D.Fetch() + for _, info in ipairs(D.Load()) do + META_DOWNLOADING[info.szKey] = true + D.FetchSubscribeItem(info.szURL) + :Then(function(res) + D.Add(res, info.szKey) + META_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + end) + :Catch(function(err) + X.OutputDebugMessage( + _L['MY_TeamMon_Subscribe_FavoriteData'], + err.message ..'\n' .. info.szURL, + X.DEBUG_LEVEL.WARNING) + META_DOWNLOADING[info.szKey] = nil + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + end) + end + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') +end + +function D.GetSelectedInfo() + if not DATA_SELECTED_KEY then + return + end + for _, info in ipairs(D.Load()) do + if info.szKey == DATA_SELECTED_KEY then + return info + end + end +end + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(D.Load()) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Author'):SetText(X.ReplaceSensitiveWord(info.szAuthor)) + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted, bIsLatest = D.IsSubscripted(info) + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (META_DOWNLOADING[info.szKey] and _L['Fetching...']) + or (D.IsDownloading(info.szKey) and _L['Downloading...']) + or (bIsSubscripted and ( + bIsLatest + and _L['Last select'] + or _L['Can update'])) + or _L['Download'], + enable = not META_DOWNLOADING[info.szKey] and not D.IsDownloading(info.szKey), + onClick = function() + D.Subscribe(info) + D.SubscribeEventTracking(info, 'FAVORITE') + end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TeamMon_Subscribe_FavoriteData') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break1'):SetText(_L['Author']) + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_SyncTeam', 'Text_SyncTeam'):SetText(_L['Sync team']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Check update']) + wnd:Lookup('Btn_AddUrl', 'Text_AddUrl'):SetText(_L['Add url']) + wnd:Lookup('Btn_RemoveUrl', 'Text_RemoveUrl'):SetText(_L['Remove url']) + wnd:Lookup('Btn_ExportUrl', 'Text_ExportUrl'):SetText(_L['Export meta url']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE') + + D.UpdateList(this) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__LIST_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_FAVORITE_DATA__FETCH_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_DATA__DOWNLOAD_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_DATA__SUBSCRIBE_UPDATE' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Btn_AddUrl' then + GetUserInput(_L['Please input meta address:'], function(szText) + local aURL = X.SplitString(szText, ';') + local nPending = 0 + local aErrmsg = {} + local function ProcessQueue() + nPending = nPending + 1 + local szURL = aURL[nPending] + if not szURL then + if #aErrmsg > 0 then + X.Alert(table.concat(aErrmsg, '\n')) + end + return + end + D.FetchSubscribeItem(szURL) + :Then(function(info) + D.Add(info) + ProcessQueue() + end) + :Catch(function(error) + if error then + table.insert(aErrmsg, error.message) + end + ProcessQueue() + end) + end + ProcessQueue() + end) + elseif name == 'Btn_RemoveUrl' then + local info = D.GetSelectedInfo() + if not info then + return X.OutputAnnounceMessage(_L['Please select one dataset first!']) + end + D.Remove(info) + elseif name == 'Btn_ExportUrl' then + local aMetaInfoURL = {} + for _, info in ipairs(D.Load()) do + table.insert(aMetaInfoURL, D.GetShortURL(info.szURL) or D.GetRawURL(info.szURL)) + end + X.UI.OpenTextEditor(table.concat(aMetaInfoURL, ';')) + elseif name == 'Btn_Info' then + X.OpenBrowser(this:GetParent().info.szAboutURL) + elseif name == 'Btn_SyncTeam' then + D.SyncTeam(D.GetSelectedInfo()) + elseif name == 'Btn_CheckUpdate' then + D.Fetch() + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local t = {{ + szOption = _L['Copy meta url'], + fnAction = function() + X.UI.OpenTextEditor(wnd.info.szURL) + end, + }} + local szShortURL = D.GetShortURL(wnd.info.szURL) + if szShortURL then + table.insert(t, { + szOption = _L['Copy short meta url'], + fnAction = function() + X.UI.OpenTextEditor(szShortURL) + end, + }) + end + table.insert(t, { + szOption = _L['Sync team'], + fnAction = function() + D.SyncTeam(wnd.info) + end, + }) + PopupMenu(t) + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = '' + if not X.IsEmpty(wnd.info.szURL) then + szTip = szTip .. _L('MetaInfo URL: %s', wnd.info.szURL) + end + local szShortURL = D.GetShortURL(wnd.info.szURL) + if not X.IsEmpty(szShortURL) then + szTip = szTip .. _L('(Short URL: %s)', szShortURL) + end + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_FavoriteData', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe.RegisterModule('FavoriteData', _L['Favorite list'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_FavoriteData', + exports = { + { + root = D, + fields = { + 'Load', + 'Save', + 'Add', + 'Remove', + 'Fetch', + }, + preset = 'UIEvent', + }, + }, +} +MY_TeamMon_Subscribe_FavoriteData = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe_MergeDataSlice.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe_MergeDataSlice.lua new file mode 100644 index 000000000..dca607fb9 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe_MergeDataSlice.lua @@ -0,0 +1,117 @@ +-------------------------------------------------------------------------------- +-- v is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控快速合并单条数据弹窗 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe_MergeDataSlice' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local D = {} + +function D.OpenPanel(szModule) + GetUserInput( + _L['Please input data slice id:'], + function(szText) + if X.IsEmpty(szText) then + return + end + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/slice', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + uuid = szText, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if not X.IsTable(res) then + X.OutputSystemAnnounceMessage(_L['Invalid data slice data response.']) + return + end + if not res.code == 0 then + X.OutputSystemAnnounceMessage(X.ReplaceSensitiveWord(res.msg) or _L['Invalid data slice data response.']) + return + end + if not X.IsTable(res.data) + or not X.IsString(res.data.title) + or not X.IsString(res.data.desc) + or not X.IsString(res.data.type) + or not X.IsString(res.data.szName) + or not X.IsString(res.data.created_at) + or not X.IsString(res.data.updated_at) + or not X.IsString(res.data.lua) then + X.OutputSystemAnnounceMessage(_L['Invalid data slice data response.']) + return + end + local data = X.DecodeLUAData(res.data.lua) + if not data then + X.OutputSystemAnnounceMessage(_L['Invalid data slice data response payload.']) + return + end + X.Confirm( + _L( + 'Sure to merge this data? conflict item will be overwritten.\n\nTitle: %s\nDesc: %s\nType: %s\nRecord Name: %s\nCreate at: %s\nUpdate at: %s', + res.data.title, + res.data.desc, + _L[res.data.type], + res.data.szName, + res.data.created_at, + res.data.updated_at + ), + function() + MY_TeamMon.ImportData( + data, + nil, + 'MERGE_OVERWRITE', + function(bSuccess) + if bSuccess then + X.OutputSystemAnnounceMessage(_L['Load data slice success.']) + X.OutputSystemMessage(_L('Load data slice [%s] success.', res.data.title)) + else + X.OutputSystemAnnounceMessage(_L['Load data slice failed.']) + end + end + ) + end + ) + end, + }) + end, + nil, nil, nil, '') +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_MergeDataSlice', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenPanel', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe_MergeDataSlice = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Custom.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Custom.lua new file mode 100644 index 000000000..fe2d395f9 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Custom.lua @@ -0,0 +1,244 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe_VoicePacket_Custom' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Custom.ini' +local D = {} + +local DATA_PAGINATION = { + nIndex = 1, + nSize = 30, + nTotal = 0, + nPageTotal = 1, +} +local DATA_LIST = {} +local DATA_SELECTED_KEY + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local dwCurrentPacketID, szVersion = MY_TeamMon_VoiceAlarm.GetCurrentPacketID('CUSTOM') + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(DATA_LIST) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Author'):SetText(X.ReplaceSensitiveWord(info.szAuthor)) + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted = info.dwID == dwCurrentPacketID + local bIsSubscriptedCanUpdate = bIsSubscripted and info.szVersion ~= szVersion + local fProgress = MY_TeamMon_VoiceAlarm.GetPacketDownloadProgress(info.dwID) + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (fProgress == 0 and _L['Downloading...']) + or (fProgress and ('%.2f%%'):format(fProgress * 100)) + or (bIsSubscriptedCanUpdate and _L['Can update']) + or (bIsSubscripted and _L['Current selected']) + or _L['Select'], + enable = not fProgress, + onClick = function() + if not fProgress and not bIsSubscriptedCanUpdate and bIsSubscripted then + MY_TeamMon_VoiceAlarm.SetCurrentPacketID('CUSTOM', 0) + else + MY_TeamMon_VoiceAlarm.SetCurrentPacketID('CUSTOM', info.dwID) + end + end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() + -- 推荐页码 + page:Lookup('Wnd_Total/Btn_PrevPage'):Enable(DATA_PAGINATION.nIndex > 1) + page:Lookup('Wnd_Total/Btn_NextPage'):Enable(DATA_PAGINATION.nIndex < DATA_PAGINATION.nPageTotal) + page:Lookup('Wnd_Total', 'Text_Page'):SetText(DATA_PAGINATION.nIndex .. ' / ' .. DATA_PAGINATION.nPageTotal) +end + +function D.SwitchPage(nPage) + MY_TeamMon_VoiceAlarm.FetchPacketList('CUSTOM', nPage) + :Then(function(res) + DATA_LIST = res.aPacket + DATA_PAGINATION = res.tPagination + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__LIST_UPDATE') + end) +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TeamMon_Subscribe_VoicePacket_Custom') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break1'):SetText(_L['Author']) + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Refresh list']) + wnd:Lookup('Btn_Preview', 'Text_Preview'):SetText(_L['Preview voice']) + wnd:Lookup('Btn_PrevPage', 'Text_PrevPage'):SetText(_L['Prev page']) + wnd:Lookup('Btn_NextPage', 'Text_NextPage'):SetText(_L['Next page']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__LIST_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__SUBSCRIBE_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS') + + D.UpdateList(this) + D.SwitchPage(1) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__LIST_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__DOWNLOAD_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_CUSTOM__SUBSCRIBE_UPDATE' + or event == 'MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE' + or event == 'MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_CheckUpdate' then + D.SwitchPage(DATA_PAGINATION.nIndex) + elseif name == 'Btn_Preview' then + MY_TeamMon_VoiceAlarm_Previewer.Open('CUSTOM') + elseif name == 'Btn_PrevPage' then + D.SwitchPage(DATA_PAGINATION.nIndex - 1) + elseif name == 'Btn_NextPage' then + D.SwitchPage(DATA_PAGINATION.nIndex + 1) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = _L('Title: %s', X.ReplaceSensitiveWord(wnd.info.szTitle)) + .. '\n' .. _L('Author: %s', X.ReplaceSensitiveWord(wnd.info.szAuthor)) + .. '\n' .. _L('Update at: %s', X.ReplaceSensitiveWord(wnd.info.szUpdateTime)) + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- Module exports +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_VoicePacket_Custom', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe.RegisterModule('Subscribe_VoicePacket_Custom', _L['Voice packet custom'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_VoicePacket_Custom', + exports = { + { + root = D, + fields = { + 'IsDownloading', + 'Subscribe', + }, + preset = 'UIEvent', + }, + }, +} +MY_TeamMon_Subscribe_VoicePacket_Custom = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Official.lua b/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Official.lua new file mode 100644 index 000000000..f95a7e56c --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_Subscribe_VoicePacket_Official.lua @@ -0,0 +1,241 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控订阅数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_Subscribe_VoicePacket_Official' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Official.ini' +local D = {} + +local DATA_PAGINATION = { + nIndex = 1, + nSize = 30, + nTotal = 0, + nPageTotal = 1, +} +local DATA_LIST = {} +local DATA_SELECTED_KEY + +function D.UpdateList(page) + if not page or not page:IsValid() then + return + end + local szSel, bExistSelect = DATA_SELECTED_KEY, false + local dwCurrentPacketID, szVersion = MY_TeamMon_VoiceAlarm.GetCurrentPacketID('OFFICIAL') + local container = page:Lookup('Wnd_Total/WndScroll_Subscribe/WndContainer_Subscribe') + container:Clear() + for _, info in ipairs(DATA_LIST) do + local bSel = szSel and info.szKey == szSel + if bSel then + bExistSelect = true + end + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Item') + wnd:Lookup('', 'Text_Item_Title'):SetText(X.ReplaceSensitiveWord(info.szTitle)) + wnd:Lookup('', 'Text_Item_Download'):SetText(X.ReplaceSensitiveWord(info.szUpdateTime)) + wnd:Lookup('', 'Image_Item_Sel'):SetVisible(bSel) + if not X.IsEmpty(info.szAboutURL) then + X.UI(wnd):Append('WndButton', { + name = 'Btn_Info', + x = 760, y = 1, w = 90, h = 30, + buttonStyle = 'LINK', + text = _L['See details'], + }) + end + local bIsSubscripted = info.dwID == dwCurrentPacketID + local bIsSubscriptedCanUpdate = bIsSubscripted and info.szVersion ~= szVersion + local fProgress = MY_TeamMon_VoiceAlarm.GetPacketDownloadProgress(info.dwID) + X.UI(wnd):Append('WndButton', { + name = 'Btn_Download', + x = 860, y = 1, w = 90, h = 30, + buttonStyle = 'SKEUOMORPHISM', + text = (fProgress == 0 and _L['Downloading...']) + or (fProgress and ('%.2f%%'):format(fProgress * 100)) + or (bIsSubscriptedCanUpdate and _L['Can update']) + or (bIsSubscripted and _L['Current selected']) + or _L['Select'], + enable = not fProgress, + onClick = function() + if not fProgress and not bIsSubscriptedCanUpdate and bIsSubscripted then + MY_TeamMon_VoiceAlarm.SetCurrentPacketID('OFFICIAL', 0) + else + MY_TeamMon_VoiceAlarm.SetCurrentPacketID('OFFICIAL', info.dwID) + end + end, + }) + wnd.info = info + end + if not bExistSelect then + page.szMetaInfoKeySel = nil + end + container:FormatAllContentPos() + -- 推荐页码 + page:Lookup('Wnd_Total/Btn_PrevPage'):Enable(DATA_PAGINATION.nIndex > 1) + page:Lookup('Wnd_Total/Btn_NextPage'):Enable(DATA_PAGINATION.nIndex < DATA_PAGINATION.nPageTotal) + page:Lookup('Wnd_Total', 'Text_Page'):SetText(DATA_PAGINATION.nIndex .. ' / ' .. DATA_PAGINATION.nPageTotal) +end + +function D.SwitchPage(nPage) + MY_TeamMon_VoiceAlarm.FetchPacketList('OFFICIAL', nPage) + :Then(function(res) + DATA_LIST = res.aPacket + DATA_PAGINATION = res.tPagination + FireUIEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__LIST_UPDATE') + end) +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(INI_PATH, 'MY_TeamMon_Subscribe_VoicePacket_Official') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + wnd:SetRelPos(0, 0) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Subscribe/Scroll_Subscribe')) + + wnd:Lookup('', 'Text_Break2'):SetText(_L['Title']) + wnd:Lookup('Btn_CheckUpdate', 'Text_CheckUpdate'):SetText(_L['Refresh list']) + wnd:Lookup('Btn_Preview', 'Text_Preview'):SetText(_L['Preview voice']) + wnd:Lookup('Btn_PrevPage', 'Text_PrevPage'):SetText(_L['Prev page']) + wnd:Lookup('Btn_NextPage', 'Text_NextPage'):SetText(_L['Next page']) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__LIST_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__DOWNLOAD_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__SUBSCRIBE_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE') + frame:RegisterEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS') + + D.UpdateList(this) + D.SwitchPage(1) +end + +function D.OnActivePage() +end + +function D.OnEvent(event) + if event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__LIST_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__DOWNLOAD_UPDATE' + or event == 'MY_TEAM_MON__SUBSCRIBE_VOICE_PACKET_OFFICIAL__SUBSCRIBE_UPDATE' + or event == 'MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE' + or event == 'MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS' then + D.UpdateList(this) + end +end + +function D.OnFrameDestroy() + DATA_SELECTED_KEY = nil +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_CheckUpdate' then + D.SwitchPage(DATA_PAGINATION.nIndex) + elseif name == 'Btn_Preview' then + MY_TeamMon_VoiceAlarm_Previewer.Open('OFFICIAL') + elseif name == 'Btn_PrevPage' then + D.SwitchPage(DATA_PAGINATION.nIndex - 1) + elseif name == 'Btn_NextPage' then + D.SwitchPage(DATA_PAGINATION.nIndex + 1) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local container = wnd:GetParent() + for i = 0, container:GetAllContentCount() - 1 do + local wnd = container:LookupContent(i) + wnd:Lookup('', 'Image_Item_Sel'):Hide() + end + wnd:Lookup('', 'Image_Item_Sel'):Show() + DATA_SELECTED_KEY = wnd.info.szKey + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Item' then + local wnd = this:GetParent() + local szTip = _L('Title: %s', X.ReplaceSensitiveWord(wnd.info.szTitle)) + .. '\n' .. _L('Update at: %s', X.ReplaceSensitiveWord(wnd.info.szUpdateTime)) + if IsCtrlKeyDown() then + szTip = szTip .. '\n' .. X.EncodeLUAData(wnd.info, ' ') + end + if X.IsEmpty(szTip) then + return + end + X.OutputTip(this, szTip) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Handle_Item' then + HideTip() + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_VoicePacket_Official', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TeamMon_Subscribe.RegisterModule('Subscribe_VoicePacket_Official', _L['Voice packet official'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_Subscribe_VoicePacket_Official', + exports = { + { + root = D, + fields = { + 'IsDownloading', + 'Subscribe', + }, + preset = 'UIEvent', + }, + }, +} +MY_TeamMon_Subscribe_VoicePacket_Official = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_UI.lua b/MY_TeamMon/src/MY_TeamMon_UI.lua new file mode 100644 index 000000000..5b13f16ad --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_UI.lua @@ -0,0 +1,3628 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队监控界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : William Chan (Webster) +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_UI' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local ParseCustomText = MY_TeamMon.ParseCustomText +local FilterCustomText = MY_TeamMon.FilterCustomText +local MY_TEAM_MON_TYPE = MY_TeamMon.MY_TEAM_MON_TYPE +local MY_TEAM_MON_SCRUTINY_TYPE = MY_TeamMon.MY_TEAM_MON_SCRUTINY_TYPE +local MY_TEAM_MON_REMOTE_DATA_ROOT = MY_TeamMon.MY_TEAM_MON_REMOTE_DATA_ROOT +local MY_TEAM_MON_SPECIAL_MAP = MY_TeamMon.MY_TEAM_MON_SPECIAL_MAP +local MY_TEAM_MON__UI__INI_FILE = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI.ini' +local MY_TEAM_MON__UI__ITEM_L = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI_ITEM_L.ini' +local MY_TEAM_MON__UI__TALK_L = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI_TALK_L.ini' +local MY_TEAM_MON__UI__ITEM_R = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI_ITEM_R.ini' +local MY_TEAM_MON__UI__TALK_R = X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI_TALK_R.ini' +local MY_TEAM_MON__UI__TYPE = MY_TeamMon.MY_TEAM_MON_TYPE_LIST +local MY_TEAM_MON__UI__SELECT_TYPE = MY_TEAM_MON__UI__TYPE[1] +local MY_TEAM_MON__UI__SELECT_MAP = _L['All data'] +local MY_TEAM_MON__UI__TREE_EXPAND = { [_L['All']] = true } -- 默认第一项展开 +local MY_TEAM_MON__UI__ITEM_PER_PAGE = 27 +local MY_TEAM_MON__UI__SEARCH +local MY_TEAM_MON__UI__MAP_SEARCH +local MY_TEAM_MON__UI__DRAG = false +local MY_TEAM_MON__UI__GLOBAL_SEARCH = false +local MY_TEAM_MON__UI__SEARCH_CACHE = {} +local MY_TEAM_MON__UI__PANEL_ANCHOR = { s = 'CENTER', r = 'CENTER', x = 0, y = 0 } +local MY_TEAM_MON__UI__ANCHOR = {} +local D = {} + +local MY_TEAM_MON__UI__DOODAD_ICON = { + [DOODAD_KIND.INVALID ] = 1434, -- 无效 + [DOODAD_KIND.NORMAL ] = 4956, + [DOODAD_KIND.CORPSE ] = 179 , -- 尸体 + [DOODAD_KIND.QUEST ] = 1676, -- 任务 + [DOODAD_KIND.READ ] = 243 , -- 阅读 + [DOODAD_KIND.DIALOG ] = 3267, -- 对话 + [DOODAD_KIND.ACCEPT_QUEST] = 1678, -- 接受任务 + [DOODAD_KIND.TREASURE ] = 3557, -- 宝箱 + [DOODAD_KIND.ORNAMENT ] = 1395, -- 装饰物 + [DOODAD_KIND.CRAFT_TARGET] = 351 , + [DOODAD_KIND.CHAIR ] = 3912, -- 椅子 + [DOODAD_KIND.CLIENT_ONLY ] = 240 , + [DOODAD_KIND.GUIDE ] = 885 , -- 路牌 + [DOODAD_KIND.DOOR ] = 1890, -- 门 + [DOODAD_KIND.NPCDROP ] = 381 , +} +setmetatable(MY_TEAM_MON__UI__DOODAD_ICON, { __index = function(me, key) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_TeamMon'], 'Unknown Kind: ' .. key, X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + return 369 +end }) + +local function OpenDragPanel(el) + local frame = X.UI.OpenFrame(X.PACKET_INFO.ROOT .. 'MY_TeamMon/ui/MY_TeamMon_UI_DRAG.ini', 'MY_TeamMon_UI_DRAG') + local x, y = Cursor.GetPos() + local w, h = el:GetSize() + -- local x, y = el:GetAbsPos() + frame.szName = this:GetName() + frame:SetAbsPos(x, y) + frame:StartMoving() + frame.data = el.dat + local szName = D.GetDataName(MY_TEAM_MON__UI__SELECT_TYPE, el.dat) + frame:Lookup('', 'Text'):SetText(szName or el.dat.key) + frame:SetSize(w, h) + frame:Lookup('', 'Image'):SetSize(w, h) + frame:Lookup('', 'Text'):SetSize(w, h) + frame:Lookup('', ''):FormatAllItemPos() + frame:BringToTop() + MY_TEAM_MON__UI__DRAG = true +end + +local function CloseDragPanel() + local frame = Station.Lookup('Normal1/MY_TeamMon_UI_DRAG') + if frame then + frame:EndMoving() + X.UI.CloseFrame(frame) + return frame.data, frame.szName + end +end + +local function DragPanelIsOpened() + return Station.Lookup('Normal1/MY_TeamMon_UI_DRAG') and Station.Lookup('Normal1/MY_TeamMon_UI_DRAG'):IsVisible() +end + +function D.OnFrameCreate() + this:RegisterEvent('MY_TEAM_MON__UI__TEMP_UPDATE') + this:RegisterEvent('MY_TEAM_MON__UI__TEMP_RELOAD') + this:RegisterEvent('MY_TEAM_MON__UI__DATA_RELOAD') + this:RegisterEvent('MY_TEAM_MON__UI__SELECT_MAP') + this:RegisterEvent('UI_SCALED') + X.UI.AppendFromIni(this:Lookup('Wnd_Total'), MY_TEAM_MON__UI__INI_FILE, 'Wnd_Total', true) + -- Esc + X.RegisterEsc('MY_TeamMon', D.IsOpened, D.ClosePanel) + -- CreateItemData + this.hItemL = this:CreateItemData(MY_TEAM_MON__UI__ITEM_L, 'Handle_L') + this.hTalkL = this:CreateItemData(MY_TEAM_MON__UI__TALK_L, 'Handle_TALK_L') + this.hItemR = this:CreateItemData(MY_TEAM_MON__UI__ITEM_R, 'Handle_R') + this.hTalkR = this:CreateItemData(MY_TEAM_MON__UI__TALK_R, 'Handle_TALK_R') + -- tree + this.hTreeN = this:CreateItemData(MY_TEAM_MON__UI__INI_FILE, 'Handle_TreeNode') + this.hTreeI = this:CreateItemData(MY_TEAM_MON__UI__INI_FILE, 'Handle_TreeItem') + this.hTreeH = this:Lookup('Wnd_Total/PageSet_Main/WndScroll_Tree', '') + this.hTreeS = this:Lookup('Wnd_Total/PageSet_Main/WndScroll_Tree/Btn_Tree_All') + + MY_TEAM_MON__UI__SEARCH = nil -- 重置搜索 + MY_TEAM_MON__UI__MAP_SEARCH = nil -- 重置搜索 + MY_TEAM_MON__UI__GLOBAL_SEARCH = false + MY_TEAM_MON__UI__DRAG = false + + this.hPageSet = this:Lookup('Wnd_Total/PageSet_Main') + + this:Lookup('Wnd_Total/PageSet_Main/Wnd_SearchMap/Edit_SearchMap'):SetPlaceholderText(_L['Search map']) + this:Lookup('Wnd_Total/PageSet_Main/Wnd_SearchContent/Edit_SearchContent'):SetPlaceholderText(_L['Search content']) + + local ui = X.UI(this) + ui:Text(_L['MY_TeamMon config panel']) + + for k, v in ipairs(MY_TEAM_MON__UI__TYPE) do + this.hPageSet:Lookup('CheckBox_' .. v, 'Text_Page_' .. v):SetText(_L[v]) + X.UI.AdaptComponentAppearance(this.hPageSet:Lookup('CheckBox_' .. v), 'WndTab') + X.UI.AdaptComponentAppearance(this.hPageSet:Lookup('Page_' .. v .. '/WndScroll_' .. v .. '_L/Btn_' .. v .. '_L_ALL')) + X.UI.AdaptComponentAppearance(this.hPageSet:Lookup('Page_' .. v .. '/WndScroll_' .. v .. '_R/Btn_' .. v .. '_R_ALL')) + end + X.UI.AdaptComponentAppearance(this:Lookup('Wnd_Total/Wnd_Bg', 'Image_TabBg')) + X.UI.AdaptComponentAppearance(this.hPageSet:Lookup('WndScroll_Tree/Btn_Tree_All')) + + ui:Append('WndButton', { + x = 900, y = 52, w = 140, h = 27, + text = g_tStrings.SYS_MENU, + buttonStyle = 'FLAT_LACE_BORDER', + menu = function() + local menu = {} + local szLang = X.ENVIRONMENT.GAME_LANG + if szLang == 'zhcn' or szLang == 'zhtw' then + table.insert(menu, { + szOption = _L['Subscribe data'], + fnAction = function() + MY_TeamMon_Subscribe.OpenPanel() + MY.UI.ClosePopupMenu() + end, + }) + table.insert(menu, { + szOption = _L['Merge data slice'], + fnAction = function() + MY_TeamMon_Subscribe_MergeDataSlice.OpenPanel() + MY.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + table.insert(menu, { + szOption = _L['Import local data'], + fnAction = function() + D.OpenImportPanel() + MY.UI.ClosePopupMenu() + end, -- 有传参 不要改 + }) + table.insert(menu, { szOption = _L['Export local data'], fnAction = D.OpenExportPanel }) + table.insert(menu, { + szOption = _L['Clear local data'], + fnAction = function() + X.Confirm(_L['Are you sure to clear local data? All team mon data will be removed totally, this is not reversible.'], function() + for _, v in ipairs(MY_TeamMon.MY_TEAM_MON_TYPE_LIST) do + MY_TeamMon.RemoveData(v) + MY_TeamMon.RemoveMeta() + end + end) + MY.UI.ClosePopupMenu() + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { szOption = _L['Open data folder'], fnAction = function() + local szRoot = X.GetAbsolutePath(MY_TEAM_MON_REMOTE_DATA_ROOT):gsub('/', '\\') + X.OpenFolder(szRoot) + X.UI.OpenTextEditor(szRoot) + MY.UI.ClosePopupMenu() + end }) + return menu + end, + }) + -- debug + if X.IsDebugging() then + ui:Append('WndButton', { text = 'Reload', x = 10, y = 10, onClick = ReloadUIAddon }) + ui:Append('WndButton', { + name = 'On', text = 'Enable', x = 110, y = 10, enable = not MY_TeamMon.bEnable, + onClick = function() + MY_TeamMon.bEnable = true + this:Enable(false) + ui:Children('#Off'):Enable(true) + end, + }) + ui:Append('WndButton', { + name = 'Off', text = 'Disable', x = 210, y = 10, enable = MY_TeamMon.bEnable, + onClick = function() + MY_TeamMon.bEnable = false + this:Enable(false) + ui:Children('#On'):Enable(true) + end, + }) + end + local uiPageSetMain = ui:Children('#PageSet_Main') + uiPageSetMain:Append('WndCheckBox', { + x = 575, y = 40, checked = MY_TEAM_MON__UI__GLOBAL_SEARCH, text = _L['Global search'], + onCheck = function(bCheck) + MY_TEAM_MON__UI__GLOBAL_SEARCH = bCheck + FireUIEvent('MY_TEAM_MON__UI__TEMP_RELOAD') + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') + end, + }) + uiPageSetMain:Append('WndButton', { + x = 920, y = 40, + text = _L['Clear record'], + buttonStyle = 'FLAT', + onClick = function() + X.Confirm(_L['Confirm?'], function() + MY_TeamMon.ClearTemp(MY_TEAM_MON__UI__SELECT_TYPE) + end) + end, + }) + D.UpdateAnchor(this) + -- 首次加载 + for k, v in ipairs(MY_TEAM_MON__UI__TYPE) do + if MY_TEAM_MON__UI__SELECT_TYPE == v then + this.hPageSet:ActivePage(k - 1) + break + end + end + D.ScrollMapIntoView(this) +end + +function D.OnEvent(szEvent) + if szEvent == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif szEvent == 'MY_TEAM_MON__UI__TEMP_UPDATE' then + if arg0 ~= MY_TEAM_MON__UI__SELECT_TYPE then + return + end + D.UpdateRList(arg1) + elseif szEvent == 'MY_TEAM_MON__UI__DATA_RELOAD' then + D.RefreshTable(this, 'L') + elseif szEvent == 'MY_TEAM_MON__UI__TEMP_RELOAD' then + D.RefreshTable(this, 'R') + elseif szEvent == 'MY_TEAM_MON__UI__SELECT_MAP' then + MY_TEAM_MON__UI__SELECT_MAP = arg0 + D.UpdateMapList(this) + D.ScrollMapIntoView(this) + end +end + +function D.OnFrameDragEnd() + MY_TEAM_MON__UI__ANCHOR = GetFrameAnchor(this) +end + +function D.RefreshTable(frame, szRefresh) + if szRefresh == 'L' then + D.UpdateLList() + D.RedrawMapList(frame) + elseif szRefresh == 'R' then + D.UpdateRList() + end +end + +-- 用于刷新滚动条 来刷新内容 +function D.RefreshScroll(szRefresh) + local frame = D.GetFrame() + local szName = string.format('WndScroll_%s_%s/Btn_%s_%s_ALL', MY_TEAM_MON__UI__SELECT_TYPE, szRefresh, MY_TEAM_MON__UI__SELECT_TYPE, szRefresh) + local hWndScroll = frame.hPageSet:GetActivePage():Lookup(szName) + X.ExecuteWithThis(hWndScroll, D.OnScrollBarPosChanged) +end + +function D.ConflictCheck() + if MY_TEAM_MON__UI__SELECT_TYPE == 'BUFF' or MY_TEAM_MON__UI__SELECT_TYPE == 'DEBUFF' or MY_TEAM_MON__UI__SELECT_TYPE == 'CASTING' then + local data = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE) + local bMsg = false + for k, v in pairs(data) do + if k ~= MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN then + local tTemp = {} + for kk, vv in ipairs(v) do + tTemp[vv.dwID] = tTemp[vv.dwID] or {} + table.insert(tTemp[vv.dwID], vv) + end + for kk, vv in pairs(tTemp) do + if #vv > 1 then + for kkk, vvv in ipairs(vv) do + if not vvv.bCheckLevel then + bMsg = true + X.OutputSystemMessage( + _L['MY_TeamMon'], + _L['Data conflict'] .. ' ' .. _L[MY_TEAM_MON__UI__SELECT_TYPE] .. ' ' + .. MY_TeamMon.GetMapName(k) .. ' :: ' .. vvv.dwID .. ' :: ' + .. (vvv.szName or D.GetDataName(MY_TEAM_MON__UI__SELECT_TYPE, vvv)), + X.CONSTANT.MSG_THEME.ERROR) + break + end + end + end + end + end + end + if bMsg then + X.OutputSystemMessage(_L['MY_TeamMon'], _L['Data conflict, please check.'], X.CONSTANT.MSG_THEME.ERROR) + end + end +end + +function D.OnActivePage() + local nPage = this:GetActivePageIndex() + local frame = this:GetRoot() + MY_TEAM_MON__UI__SELECT_TYPE = MY_TEAM_MON__UI__TYPE[nPage + 1] + D.RefreshTable(frame, 'L') + D.RefreshTable(frame, 'R') + FireUIEvent('MY_TEAM_MON__UI__SWITCH_PAGE') + D.ConflictCheck() + D.UpdateBG() +end + +function D.UpdateBG() + -- background + local frame = D.GetFrame() + local DungeonInfo = X.GetGameTable('DungeonInfo', true) + local info = X.IsNumber(MY_TEAM_MON__UI__SELECT_MAP) and DungeonInfo and DungeonInfo:Search(MY_TEAM_MON__UI__SELECT_MAP) + if MY_TEAM_MON__UI__SELECT_TYPE ~= 'TALK' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'CHAT' and info and info.szDungeonImage2 then + frame:Lookup('Wnd_Total/Wnd_Bg', 'Handle_BG'):Show() + frame:Lookup('Wnd_Total/Wnd_Bg', 'Handle_BG/Image_BG'):FromUITex(info.szDungeonImage2, 0) + frame:Lookup('Wnd_Total/Wnd_Bg', 'Handle_BG/Text_BgTitle'):SetText(info.szLayer3Name .. g_tStrings.STR_CONNECT .. info.szOtherName) + else + frame:Lookup('Wnd_Total/Wnd_Bg', 'Handle_BG'):Hide() + end +end + +function D.UpdateMapList(frame) + local dwCurrentMapID, dwSelectMapID = X.GetMapID(), MY_TEAM_MON__UI__SELECT_MAP + local hList, hTreeNode, hTreeItem = frame.hTreeH, nil + for i = 0, hList:GetItemCount() - 1 do + local el = hList:Lookup(i) + if el:GetName() == 'Handle_TreeNode' then + hTreeNode = el + if hTreeNode.nCount == 0 then + if not hTreeNode.col then + hTreeNode.col = {hTreeNode:Lookup('Text_TreeNode'):GetFontColor()} + end + hTreeNode:Lookup('Text_TreeNode'):SetFontColor(222, 222, 222) + end + hTreeNode:Lookup('Image_TreeNodeLocation'):Hide() + else + hTreeItem = el + if hTreeItem.nCount == 0 then + if not hTreeItem.col then + hTreeItem.col = {hTreeItem:Lookup('Text_TreeItem'):GetFontColor()} + end + hTreeItem:Lookup('Text_TreeItem'):SetFontColor(222, 222, 222) + end + if hTreeItem.dwMapID == dwCurrentMapID then + hTreeNode:Lookup('Image_TreeNodeLocation'):Show() + end + hTreeItem:Lookup('Image_TreeItemBg_Sel'):SetVisible(hTreeItem.dwMapID == dwSelectMapID) + hTreeItem:Lookup('Image_TreeItemLocation'):SetVisible(hTreeItem.dwMapID == dwCurrentMapID) + end + end +end + +function D.RedrawMapList(frame) + local data, aGroupMap = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE), {} + -- 全部/其他 + local tAll = { + szGroup = _L['All'], + aMapInfo = { + _L['All data'], -- 全部 + }, + } + table.insert(aGroupMap, tAll) + -- 全部/其他 + local tCommon = { + szGroup = _L['Common / uncategorized'], + aMapInfo = { + MY_TEAM_MON_SPECIAL_MAP.COMMON, -- 通用 + MY_TEAM_MON_SPECIAL_MAP.CITY, -- 主城 + MY_TEAM_MON_SPECIAL_MAP.VILLAGE, -- 野外 + MY_TEAM_MON_SPECIAL_MAP.DUNGEON, -- 秘境 + MY_TEAM_MON_SPECIAL_MAP.TEAM_DUNGEON, -- 小队秘境 + MY_TEAM_MON_SPECIAL_MAP.RAID_DUNGEON, -- 团队秘境 + MY_TEAM_MON_SPECIAL_MAP.COMPETITION, -- 竞技 + MY_TEAM_MON_SPECIAL_MAP.STARVE, -- 浪客行 + MY_TEAM_MON_SPECIAL_MAP.ARENA, -- 名剑大会 + MY_TEAM_MON_SPECIAL_MAP.BATTLEFIELD, -- 战场 + MY_TEAM_MON_SPECIAL_MAP.PUBG, -- 绝境战场 + MY_TEAM_MON_SPECIAL_MAP.ZOMBIE, -- 李渡鬼域 + MY_TEAM_MON_SPECIAL_MAP.MONSTER, -- 百战 + MY_TEAM_MON_SPECIAL_MAP.MOBA, -- 列星虚境 + MY_TEAM_MON_SPECIAL_MAP.HOMELAND, -- 家园 + MY_TEAM_MON_SPECIAL_MAP.GUILD_TERRITORY, -- 帮会领地 + MY_TEAM_MON_SPECIAL_MAP.ROGUELIKE, -- 八荒衡鉴 + MY_TEAM_MON_SPECIAL_MAP.CAMP, -- 阵营地图 + MY_TEAM_MON_SPECIAL_MAP.STRONGHOLD, -- 据点地图 + MY_TEAM_MON_SPECIAL_MAP.SCHOOL, -- 门派地图 + }, + } + table.insert(aGroupMap, tCommon) + -- 秘境 + for _, v in ipairs(X.GetTypeGroupMap()) do + table.insert(aGroupMap, v) + end + -- 回收站 + table.insert(aGroupMap, { + szGroup = _L['Recycle bin'], + aMapInfo = { MY_TEAM_MON_SPECIAL_MAP.RECYCLE_BIN }, + }) + -- 未知的 + local tMapExist = {} + for _, v in ipairs(aGroupMap) do + for _, vv in ipairs(v.aMapInfo) do + if X.IsTable(vv) then + vv = vv.dwID + end + tMapExist[vv] = true + end + end + for k, v in pairs(data) do + if X.IsNumber(k) and not tMapExist[k] then + table.insert(tCommon.aMapInfo, k) + end + end + -- 格式化 + for _, v in ipairs(aGroupMap) do + for i, vv in ipairs(v.aMapInfo) do + if not X.IsTable(vv) then + v.aMapInfo[i] = { + dwID = vv, + szName = MY_TeamMon.GetMapName(vv) or tostring(vv), + } + end + end + end + -- 搜索 + if MY_TEAM_MON__UI__MAP_SEARCH then + for i, v in X.ipairs_r(aGroupMap) do + if not X.StringFindW(v.szGroup, MY_TEAM_MON__UI__MAP_SEARCH) then + for i, vv in X.ipairs_r(v.aMapInfo) do + if not X.StringFindW(vv.szName, MY_TEAM_MON__UI__MAP_SEARCH) then + table.remove(v.aMapInfo, i) + end + end + if #v.aMapInfo == 0 then + table.remove(aGroupMap, i) + end + end + end + end + -- 渲染列表 + local hList, hTreeNode, hTreeItem = frame.hTreeH + hList:Clear() + for i, v in ipairs(aGroupMap) do + hTreeNode = hList:AppendItemFromData(frame.hTreeN) + hTreeNode.szKey = v.szGroup + hTreeNode:Lookup('Text_TreeNode'):SetText(v.szGroup) + for _, vv in ipairs(v.aMapInfo) do + hTreeItem = hList:AppendItemFromData(frame.hTreeI) + local aData = data[vv.dwID] + local nCount = aData and #aData or 0 + if MY_TEAM_MON__UI__SEARCH and aData then + nCount = 0 + for k, v in ipairs(aData) do + if D.CheckSearch(MY_TEAM_MON__UI__SELECT_TYPE, v) then + nCount = nCount + 1 + end + end + end + if vv.dwID ~= _L['All data'] then + local szClassName = hTreeNode.szName or hTreeNode:Lookup('Text_TreeNode'):GetText() + hTreeNode.szName = szClassName + if not hTreeNode.nCount then + hTreeNode.nCount = 0 + end + hTreeNode.nCount = hTreeNode.nCount + nCount + hTreeNode:Lookup('Text_TreeNode'):SetText(szClassName .. ' ('.. hTreeNode.nCount .. ')') + end + hTreeItem:Lookup('Text_TreeItem'):SetText(vv.szName .. ' ('.. nCount .. ')') + hTreeItem.dwMapID = vv.dwID + hTreeItem.nCount = nCount + hTreeItem:SetVisible(MY_TEAM_MON__UI__TREE_EXPAND[v.szGroup]) + end + D.UpdateMapNodeMouseState(hTreeNode) + end + hList:FormatAllItemPos() + D.UpdateMapList(frame) +end + +function D.UpdateMapNodeMouseState(hTreeNode) + local szStatus = MY_TEAM_MON__UI__TREE_EXPAND[hTreeNode.szKey] and 'Collapse' or 'Expand' + if hTreeNode.bMouseDown then + szStatus = szStatus .. 'Down' + elseif hTreeNode:IsMouseIn() then + szStatus = szStatus .. 'Hover' + end + if not hTreeNode:Lookup('Image_TreeNodeBg_Expand') then + return + end + hTreeNode:Lookup('Image_TreeNodeBg_Expand'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_ExpandDown'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_ExpandHover'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_Collapse'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_CollapseDown'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_CollapseHover'):Hide() + hTreeNode:Lookup('Image_TreeNodeBg_' .. szStatus):Show() +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Close' then + D.ClosePanel() + end +end + +function D.OnItemLButtonDown() + local szName = this:GetName() + if szName == 'Handle_TreeNode' then + this.bMouseDown = true + D.UpdateMapNodeMouseState(this) + elseif IsCtrlKeyDown() then + if szName == 'Handle_R' or szName == 'Handle_L' then + local data = {} + local szName + if this:Lookup('Text') then + if MY_TEAM_MON__UI__SELECT_TYPE == 'CASTING' then + szName = '[' .. Table_GetSkillName(this.dat.dwID, this.dat.nLevel) .. ']' + data = { + type = 'skill', + skill_id = this.dat.dwID, + skill_level = this.dat.nLevel, + text = szName + } + else + szName = this:Lookup('Text'):GetText() + data = { type = 'text', text = szName } + end + elseif this:Lookup('Text_Name') and this:Lookup('Text_Content') then + szName = this:Lookup('Text_Name'):GetText() .. g_tStrings.STR_COLON .. this:Lookup('Text_Content'):GetText() + data = { type = 'text', text = szName } + end + if szName then + local edit = X.GetChatInput() + edit:InsertObj(szName, data) + Station.SetFocusWindow(edit) + end + end + end +end + +function D.OnItemLButtonUp() + local szName = this:GetName() + if szName == 'Handle_TreeNode' then + this.bMouseDown = nil + D.UpdateMapNodeMouseState(this) + end + -- DragEnd bug fix + X.DelayCall(50, function() + if not DragPanelIsOpened() then + return + end + CloseDragPanel() + end) +end + +function D.OnItemLButtonClick() + local szName = this:GetName() + if szName == 'Handle_TreeNode' then + MY_TEAM_MON__UI__TREE_EXPAND[this.szKey] = not MY_TEAM_MON__UI__TREE_EXPAND[this.szKey] + D.UpdateMapNodeMouseState(this) + local nIndex = this:GetIndex() + local hList = this:GetParent() + for i = nIndex + 1, hList:GetItemCount() - 1 do + local hTreeItem = hList:Lookup(i) + if hTreeItem:GetName() ~= 'Handle_TreeItem' then + break + end + hTreeItem:SetVisible(MY_TEAM_MON__UI__TREE_EXPAND[this.szKey]) + end + hList:FormatAllItemPos() + elseif szName == 'Handle_TreeItem' then + local frame = this:GetRoot() + MY_TEAM_MON__UI__SELECT_MAP = this.dwMapID + D.UpdateMapList(frame) + D.UpdateLList() + D.UpdateBG() + elseif szName == 'Handle_L' then + if MY_TEAM_MON__UI__DRAG or IsCtrlKeyDown() then + return + end + D.OpenSettingPanel(this.dat, MY_TEAM_MON__UI__SELECT_TYPE) + end +end + +function D.OnItemRButtonClick() + local szName = this:GetName() + if szName == 'Handle_TreeItem' then + local dwMapID = this.dwMapID + if dwMapID == _L['All data'] then + dwMapID = nil + end + local menu = {} + table.insert(menu, { szOption = this:Lookup('Text_TreeItem'):GetText(), bDisable = true }) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Clear this map data'], rgb = { 255, 0, 0 }, fnAction = function() + D.RemoveData(dwMapID, nil, dwMapID + and X.Get(MY_TeamMon.GetMapInfo(dwMapID), 'szName', _L['This data']) + or _L['All data']) + end }) + PopupMenu(menu) + elseif szName == 'Handle_L' then + local t = this.dat + local menu = {} + local name = this:Lookup('Text') and this:Lookup('Text'):GetText() or t.szContent + if MY_TEAM_MON__UI__SELECT_TYPE ~= 'TALK' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'CHAT' then -- 太长 + table.insert(menu, { szOption = g_tStrings.CHAT_NAME .. g_tStrings.STR_COLON .. name, bDisable = true }) + end + table.insert(menu, { szOption = _L['Class'] .. g_tStrings.STR_COLON .. MY_TeamMon.GetMapName(t.dwMapID), bDisable = true }) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = g_tStrings.STR_FRIEND_MOVE_TO }) + table.insert(menu[#menu], { szOption = _L['Manual input'], fnAction = function() + GetUserInput(g_tStrings.MSG_INPUT_MAP_NAME, function(szText) + local map = MY_TeamMon.GetMapInfo(szText) + if map then + return D.MoveData(t.dwMapID, t.nIndex, map, IsCtrlKeyDown()) + end + return X.Alert(_L['The map does not exist']) + end) + end }) + table.insert(menu[#menu], { bDevide = true }) + D.InsertDungeonMenu(menu[#menu], function(dwMapID) + D.MoveData(t.dwMapID, t.nIndex, dwMapID, IsCtrlKeyDown()) + end) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Share data'], bDisable = not X.IsClientPlayerInParty(), fnAction = function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + if X.IsClientPlayerTeamLeader() or X.IsDebugging() then + MY_TeamMon.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TEAM_MON_SHARE', {MY_TEAM_MON__UI__SELECT_TYPE, t.dwMapID, t}) + X.OutputAnnounceMessage(g_tStrings.STR_MAIL_SUCCEED) + else + return X.Alert(_L['You are not team leader.']) + end + end }) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Delete'], rgb = { 255, 0, 0 }, fnAction = function() + D.RemoveData(t.dwMapID, t.nIndex, name) + end }) + PopupMenu(menu) + elseif szName == 'Handle_R' then + local menu = {} + local t = this.dat + local szName = D.GetDataName(MY_TEAM_MON__UI__SELECT_TYPE, t) + -- table.insert(menu, { szOption = _L['Add to monitor list'], fnAction = function() D.OpenAddPanel(MY_TEAM_MON__UI__SELECT_TYPE, t) end }) + -- table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = g_tStrings.STR_DATE .. g_tStrings.STR_COLON .. FormatTime('%Y%m%d %H:%M:%S',t.nCurrentTime) , bDisable = true }) + if MY_TEAM_MON__UI__SELECT_TYPE ~= 'TALK' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'CHAT' then + table.insert(menu, { szOption = g_tStrings.CHAT_NAME .. g_tStrings.STR_COLON .. szName, bDisable = true }) + end + table.insert(menu, { szOption = g_tStrings.MAP_TALK .. g_tStrings.STR_COLON .. Table_GetMapName(t.dwMapID), bDisable = true }) + if MY_TEAM_MON__UI__SELECT_TYPE ~= 'NPC' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'TALK' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'DOODAD' then + table.insert(menu, { szOption = g_tStrings.STR_SKILL_H_CAST_TIME .. (t.szSrcName or g_tStrings.STR_CRAFT_NONE) .. (t.bIsPlayer and _L['(player)'] or ''), bDisable = true }) + end + if MY_TEAM_MON__UI__SELECT_TYPE ~= 'TALK' and MY_TEAM_MON__UI__SELECT_TYPE ~= 'CHAT' then + local cmenu = { szOption = _L['Interval time'] } + local tInterval + if t.nLevel then + tInterval = MY_TeamMon.GetIntervalData(MY_TEAM_MON__UI__SELECT_TYPE, t.dwID .. '_' .. t.nLevel) + else + tInterval = MY_TeamMon.GetIntervalData(MY_TEAM_MON__UI__SELECT_TYPE, t.dwID) + end + + if tInterval and #tInterval > 1 then + local nTime = tInterval[#tInterval] + for k, v in X.ipairs_r(tInterval) do + if #cmenu == 16 then break end + table.insert(cmenu, { szOption = string.format('%.1f', (nTime - v) / 1000) .. g_tStrings.STR_TIME_SECOND }) + nTime = v + end + table.remove(cmenu, 1) + else + table.insert(cmenu, { szOption = g_tStrings.STR_FIGHT_NORECORD, bDisable = true }) + end + table.insert(menu, cmenu) + end + PopupMenu(menu) + end +end + +function D.OnItemMouseEnter() + local szName = this:GetName() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + if szName == 'Handle_TreeNode' then + D.UpdateMapNodeMouseState(this) + elseif szName == 'Handle_TreeItem' then + local DungeonInfo = X.GetGameTable('DungeonInfo', true) + local info = X.IsNumber(this.dwMapID) and DungeonInfo and DungeonInfo:Search(this.dwMapID) + local szXml = GetFormatText(MY_TeamMon.GetMapName(this.dwMapID) ..' (' .. this.nCount .. ')\n', 47, 255, 255, 0) + if info and X.TrimString(info.szBossInfo) ~= '' then + local tBoss = X.SplitString(info.szBossInfo, ' ') + for k, v in ipairs(tBoss or {}) do + if X.TrimString(v) ~= '' then + szXml = szXml .. GetFormatText(k .. ') ' .. v .. '\n', 47, 255, 255, 255) + end + end + szXml = szXml .. GetFormatImage(info.szDungeonImage3, 0, 200, 200) + end + if IsCtrlKeyDown() then + szXml = szXml .. GetFormatText('\n\n' .. g_tStrings.DEBUG_INFO_ITEM_TIP .. '\nMapID:' .. this.dwMapID, 47, 255, 0, 0) + end + OutputTip(szXml, 300, { x, y, w, h }) + elseif szName == 'Handle_L' or szName == 'Handle_R' then + if MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT' then + this:Lookup('Image_Light'):Show() + else + this:Lookup('Image'):SetFrame(8) + local box = this:Lookup('Box') + box:SetObjectMouseOver(true) + end + D.OutputTip(MY_TEAM_MON__UI__SELECT_TYPE, this.dat, { x, y, w, h }) + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if szName == 'Handle_TreeNode' then + D.UpdateMapNodeMouseState(this) + elseif szName == 'Handle_TreeItem' then + if this:Lookup('Image_TreeItemBg_Hover') then + this:Lookup('Image_TreeItemBg_Hover'):Hide() + end + elseif szName == 'Handle_L' or szName == 'Handle_R' then + if MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT' then + if this:Lookup('Image_Light') and this:Lookup('Image_Light'):IsValid() then + this:Lookup('Image_Light'):Hide() + end + else + if this:Lookup('Image') and this:Lookup('Image'):IsValid() then + this:Lookup('Image'):SetFrame(7) + local box = this:Lookup('Box') + if box and box:IsValid() then + box:SetObjectMouseOver(false) + end + end + end + end + HideTip() +end + +function D.OnItemLButtonDrag() + local szName = this:GetName() + if szName == 'Handle_L' or szName == 'Handle_R' then + OpenDragPanel(this) + end +end + +function D.OnItemLButtonDragEnd() + local szName = this:GetName() + if not DragPanelIsOpened() then + return + end + local data, szAction = CloseDragPanel() + if szName == 'Handle_TreeItem' then + if szAction:find('Handle.+L') then + if data and data.dwMapID ~= this.dwMapID then + D.MoveData(data.dwMapID, data.nIndex, this.dwMapID, IsCtrlKeyDown()) + end + elseif szAction:find('Handle.+R') then + D.OpenAddPanel(MY_TEAM_MON__UI__SELECT_TYPE, data) + end + elseif szName:find('Handle.+L') then + if szAction:find('Handle.+L') and not szName:find('Handle.+List_L') then + if MY_TEAM_MON__UI__SELECT_MAP ~= _L['All data'] then + D.Exchange(MY_TEAM_MON__UI__SELECT_MAP, data.nIndex, this.dat.nIndex) + else + D.RedrawMapList(this:GetRoot()) + end + elseif szAction:find('Handle.+R') then + D.OpenAddPanel(MY_TEAM_MON__UI__SELECT_TYPE, data) + end + end + X.DelayCall(50, function() -- 由于 click在 dragend 之后 + MY_TEAM_MON__UI__DRAG = false + end) +end + +function D.OnEditChanged() + local name = this:GetName() + if name == 'Edit_SearchMap' then + local szText = X.TrimString(this:GetText()) + if szText == '' then + MY_TEAM_MON__UI__MAP_SEARCH = nil + else + MY_TEAM_MON__UI__MAP_SEARCH = szText + end + D.RedrawMapList(this:GetRoot()) + elseif name == 'Edit_SearchContent' then + local szText = X.TrimString(this:GetText()) + if szText == '' then + MY_TEAM_MON__UI__SEARCH = nil + else + MY_TEAM_MON__UI__SEARCH = szText + end + FireUIEvent('MY_TEAM_MON__UI__TEMP_RELOAD') + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') + end +end + +function D.OnKillFocus() + local name = this:GetName() + if name == 'Edit_SearchContent' then + FireUIEvent('MY_TEAM_MON__UI__FREE_CACHE') + end +end + +-- 优化核心函数 根据滚动条加载内容 +function D.OnScrollBarPosChanged() + -- print(this:GetName()) + local hWndScroll = this:GetParent() + local szName = hWndScroll:GetName() + local dir = szName:match('WndScroll_' .. MY_TEAM_MON__UI__SELECT_TYPE .. '_(.*)') + if dir then + local handle = hWndScroll:Lookup('', string.format('Handle_%s_List_%s', MY_TEAM_MON__UI__SELECT_TYPE, dir)) + local nPer = this:GetScrollPos() / math.max(1, this:GetStepCount()) + local nCount = math.ceil(handle:GetItemCount() * nPer) + for i = math.max(0, nCount - MY_TEAM_MON__UI__ITEM_PER_PAGE), nCount + MY_TEAM_MON__UI__ITEM_PER_PAGE, 1 do -- 每次渲染两页 + local h = handle:Lookup(i) + if h then + if not h.bDraw then + if MY_TEAM_MON__UI__SELECT_TYPE == 'BUFF' or MY_TEAM_MON__UI__SELECT_TYPE == 'DEBUFF' then + D.SetBuffItemAction(h) + elseif MY_TEAM_MON__UI__SELECT_TYPE == 'CASTING' then + D.SetCastingItemAction(h) + elseif MY_TEAM_MON__UI__SELECT_TYPE == 'NPC' then + D.SetNpcItemAction(h) + elseif MY_TEAM_MON__UI__SELECT_TYPE == 'DOODAD' then + D.SetDoodadItemAction(h) + elseif MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' then + D.SetTalkItemAction(h) + elseif MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT' then + D.SetChatItemAction(h) + end + end + else + break + end + end + end +end + +function D.OutputTip(szType, data, rect) + if szType == 'BUFF' or szType == 'DEBUFF' then + X.OutputBuffTip(rect, data.dwID, data.nLevel) + elseif szType == 'CASTING' then + OutputSkillTip(data.dwID, data.nLevel, rect) + elseif szType == 'NPC' then + X.OutputNpcTemplateTip(rect, data.dwID) + elseif szType == 'DOODAD' then + X.OutputDoodadTemplateTip(rect, data.dwID) + elseif szType == 'TALK' then + OutputTip(GetFormatText((data.szTarget or _L['Warning box']) .. '\t', 41, 255, 255, 0) .. GetFormatText(MY_TeamMon.GetMapName(data.dwMapID) .. '\n', 41, 255, 255, 255) .. GetFormatText(data.szContent, 41, 255, 255, 255), 300, rect) + elseif szType == 'CHAT' then + OutputTip(GetFormatText(_L['CHAT'] .. '\t', 41, 255, 255, 0) .. GetFormatText(MY_TeamMon.GetMapName(data.dwMapID) .. '\n', 41, 255, 255, 255) .. GetFormatText(data.szContent, 41, 255, 255, 255), 300, rect) + end +end + +function D.InsertDungeonMenu(menu, fnAction) + local dwMapID = X.GetMapID() + local aDungeon = X.GetTypeGroupMap() + local data = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE) + table.insert(menu, { + szOption = g_tStrings.CHANNEL_COMMON + .. ' (' .. (data[MY_TEAM_MON_SPECIAL_MAP.COMMON] and #data[MY_TEAM_MON_SPECIAL_MAP.COMMON] or 0) .. ')', + fnAction = function() + if fnAction then + fnAction(MY_TEAM_MON_SPECIAL_MAP.COMMON) + end + end, + }) + table.insert(menu, { bDevide = true }) + for k, v in ipairs(aDungeon) do + local tMenu = { szOption = v.szGroup } + for _, vv in ipairs(v.aMapInfo) do + table.insert(tMenu, { + szOption = Table_GetMapName(vv.dwID) .. ' (' .. (data[vv.dwID] and #data[vv.dwID] or 0) .. ')', + rgb = { 255, 128, 0 }, + szIcon = dwMapID == vv.dwID and 'ui/Image/Minimap/Minimap.uitex', + szLayer = dwMapID == vv.dwID and 'ICON_RIGHT', + nFrame = dwMapID == vv.dwID and 10, + fnAction = function() + if fnAction then + fnAction(vv.dwID) + end + end + }) + end + table.insert(menu, tMenu) + end +end + +function D.OpenImportPanel(szDefault, szTitle, fnAction) + local ui = X.UI.CreateFrame('MY_TeamMon_DataPanel', { w = 720, h = 330, text = _L['Import local data'], close = true }) + local nX, nY = ui:Append('Text', { x = 20, y = 50, text = _L['Includes'], font = 27 }):Pos('BOTTOMRIGHT') + nX = 20 + for k, v in ipairs(MY_TEAM_MON__UI__TYPE) do + nX = ui:Append('WndCheckBox', { name = v, x = nX + 5, y = nY, checked = true, text = _L[v] }):Pos('BOTTOMRIGHT') + end + nY = 110 + nX, nY = ui:Append('Text', { x = 20, y = nY, text = _L['File name'], font = 27 }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndEditBox', { name = 'FilePtah', x = 25, y = nY, w = 450, h = 25, text = szTitle, enable = not szDefault }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndButton', { + x = nX + 5, y = nY, + text = _L['Browse'], + buttonStyle = 'FLAT', + enable = not szDefault, + onClick = function() + local szFile = GetOpenFileName( + _L['please select data file.'], + 'JX3 File(*.jx3dat)\0*.jx3dat\0All Files(*.*)\0*.*\0\0', + MY_TeamMon.MY_TEAM_MON_REMOTE_DATA_ROOT + ) + if not X.IsEmpty(szFile) then + ui:Children('#FilePtah'):Text(szFile) + end + end, + }):Pos('BOTTOMRIGHT') + nY = nY + 10 + nX, nY = ui:Append('Text', { x = 20, y = nY, text = _L['Import mode'], font = 27 }):Pos('BOTTOMRIGHT') + local szMode = 'REPLACE' + nX = ui:Append('WndRadioBox', { + x = 25, y = nY, + text = _L['Cover'], + group = 'type', checked = true, + onCheck = function() + szMode = 'REPLACE' + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['Merge priority new file'], group = 'type', + onCheck = function() + szMode = 'MERGE_OVERWRITE' + end, + }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['Merge priority old file'], group = 'type', + onCheck = function() + szMode = 'MERGE_SKIP' + end, + }):Pos('BOTTOMRIGHT') + ui:Append('WndButton', { + x = 285, y = nY + 30, text = g_tStrings.STR_HOTKEY_SURE, + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + local szFileName = szDefault or ui:Children('#FilePtah'):Text() + local aType = {} + for k, v in ipairs(MY_TEAM_MON__UI__TYPE) do + if ui:Children('#' .. v):Check() then + table.insert(aType, v) + end + end + MY_TeamMon.ImportDataFromFile( + szFileName, + aType, + szMode, + function(bStatus, ...) + if bStatus then + local szFilePath, aType, szMode, tMeta = ... + X.OutputSystemMessage(_L['MY_TeamMon'], _L('Load config success: %s', tostring(szFilePath)), X.CONSTANT.MSG_THEME.SUCCESS) + -- local function fnAlert2() + -- local szAuthor = tMeta and X.ReplaceSensitiveWord(tostring(tMeta.szAuthor)) or _L['Unknown author'] + -- X.Alert( + -- _L('Plugin is plugin, data is data, plugin author is plugin author, data author is data author..\nYou just loaded data\'s author is %s, it works on mingyi plugin team monitor addon.\n%s is data author, do not response for plugin problems. MingYi is plugin author, do not response for data problems.\n\nIf there is some strange headtop, focus, buff or talk, please try to use other author\'s data, and response to current author %s, plugin author MingYi does not response for this.', szAuthor, szAuthor, szAuthor), + -- nil, + -- nil, + -- 'FORBIDDEN', + -- 2) + -- end + -- X.Alert(_L('Import success: %s', szTitle or szFilePath), fnAlert2, nil, fnAlert2) + X.Alert(_L('Import success: %s', szTitle or szFilePath)) + ui:Remove() + if MY_TeamMon and not MY_TeamMon.bEnable then + MY_TeamMon.bEnable = true + end + if MY_Focus and not MY_Focus.bEnable then + MY_Focus.bEnable = true + end + X.SafeCall(fnAction, bStatus, szFilePath, aType, szMode, tMeta) + else + -- bStatus, szMsg + local szMsg = ... + X.OutputSystemMessage(_L['MY_TeamMon'], _L('Load config failed: %s', _L[szMsg]), X.CONSTANT.MSG_THEME.ERROR) + X.Alert(_L('Import failed: %s', szTitle or _L[szMsg])) + X.SafeCall(fnAction, bStatus, szMsg) + end + end) + end, + }) +end + +function D.OpenExportPanel() + local ui = X.UI.CreateFrame('MY_TeamMon_DataPanel', { w = 720, h = 410, text = _L['Export local data'], close = true }) + local nX, nY = ui:Append('Text', { x = 20, y = 50, text = _L['Includes'], font = 27 }):Pos('BOTTOMRIGHT') + nX = 20 + for k, v in ipairs(MY_TEAM_MON__UI__TYPE) do + nX = ui:Append('WndCheckBox', { name = v, x = nX + 5, y = nY, checked = true, text = _L[v] }):Pos('BOTTOMRIGHT') + end + nY = 110 + local szAuthor = X.GetClientPlayerName() + nX, nY = ui:Append('Text', { x = 20, y = nY, text = _L['Author name'], font = 27 }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndEditBox', { + x = 25, y = nY, w = 500, h = 25, + text = szAuthor, + limit = 6, + onChange = function(szText) + szAuthor = X.TrimString(szText) + end, + }):Pos('BOTTOMRIGHT') + nY = nY + 10 + local szFileName = 'TM-' .. X.ENVIRONMENT.GAME_EDITION .. FormatTime('-%Y%m%d_%H.%M', GetCurrentTime()) + nX, nY = ui:Append('Text', { x = 20, y = nY, text = _L['File name'], font = 27 }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndEditBox', { + x = 25, y = nY, w = 500, h = 25, + text = szFileName, + onChange = function(szText) + szFileName = szText + end, + }):Pos('BOTTOMRIGHT') + nY = nY + 10 + nX, nY = ui:Append('Text', { x = 20, y = nY, text = _L['File format'], font = 27 }):Pos('BOTTOMRIGHT') + local szFormat = 'LUA_ENCRYPTED' + nX = ui:Append('WndRadioBox', { + x = 25, y = nY, + text = _L['Lua encrypted'], group = 'type', + checked = true, + onCheck = function() + szFormat = 'LUA_ENCRYPTED' + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['Lua plain'], group = 'type', + checked = false, + onCheck = function() + szFormat = 'LUA' + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['Lua formated'], group = 'type', + checked = false, + onCheck = function() + szFormat = 'LUA_FORMATTED' + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['JSON'], group = 'type', + checked = false, + onCheck = function() + szFormat = 'JSON' + end, + }):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('WndRadioBox', { + x = nX + 5, y = nY, + text = _L['JSON formated'], group = 'type', + checked = false, + onCheck = function() + szFormat = 'JSON_FORMATTED' + end, + }):Pos('BOTTOMRIGHT') + ui:Append('WndButton', { + x = 285, y = nY + 30, text = g_tStrings.STR_HOTKEY_SURE, + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + local aType = {} + for _, v in ipairs(MY_TEAM_MON__UI__TYPE) do + if ui:Children('#' .. v):Check() then + table.insert(aType, v) + end + end + MY_TeamMon.ExportDataToFile( + szFileName, + aType, + szFormat, + szAuthor, + function(szPath) + local szMsg = _L('Export success: %s', szPath) + X.Alert(szMsg) + X.OutputSystemMessage(szMsg) + ui:Remove() + end) + end, + }) +end + +function D.MoveData( ... ) + MY_TeamMon.MoveData(MY_TEAM_MON__UI__SELECT_TYPE, ... ) +end + +function D.Exchange( ... ) + MY_TeamMon.Exchange(MY_TEAM_MON__UI__SELECT_TYPE, ...) +end + +function D.RemoveData(dwMapID, nIndex, szMsg) + local function fnAction() + MY_TeamMon.RemoveData(MY_TEAM_MON__UI__SELECT_TYPE, dwMapID, nIndex) + end + if not nIndex then + X.Confirm(FormatString(g_tStrings.MSG_DELETE_NAME, szMsg), fnAction) + else + fnAction() + end +end + +function D.GetSearchCache(data) + if not MY_TEAM_MON__UI__SEARCH_CACHE[MY_TEAM_MON__UI__SELECT_TYPE] then + MY_TEAM_MON__UI__SEARCH_CACHE[MY_TEAM_MON__UI__SELECT_TYPE] = {} + end + local cache = MY_TEAM_MON__UI__SEARCH_CACHE[MY_TEAM_MON__UI__SELECT_TYPE] + local szString, tParsedData + if data.dwMapID and data.nIndex then + if cache[data.dwMapID] and cache[data.dwMapID][data.nIndex] then + szString = cache[data.dwMapID][data.nIndex] + else + if not cache[data.dwMapID] then + cache[data.dwMapID] = {} + end + tParsedData = {} + for k, v in pairs(data) do + tParsedData[k] = v + end + if tParsedData.szName then + tParsedData.szName = ParseCustomText(tParsedData.szName) + end + szString = X.EncodeLUAData(data) .. X.EncodeLUAData(tParsedData) + cache[data.dwMapID][data.nIndex] = szString + end + else -- 临时记录 暂时还不做缓存处理 + szString = X.EncodeLUAData(data) + end + return szString +end + +function D.CheckSearch(szType, data) + if MY_TEAM_MON__UI__GLOBAL_SEARCH then + if D.GetSearchCache(data):find(MY_TEAM_MON__UI__SEARCH, nil, true) then + return true + end + else + local szName = D.GetDataName(szType, data) + if tostring(szName):find(MY_TEAM_MON__UI__SEARCH, nil, true) + or (data.szNote and tostring(data.szNote):find(MY_TEAM_MON__UI__SEARCH, nil, true)) + or (data.key and tostring(data.key):find(MY_TEAM_MON__UI__SEARCH, nil, true)) -- 画圈圈 + or (data.dwID and tostring(data.dwID):find(MY_TEAM_MON__UI__SEARCH, nil, true)) + or (data.dwMapID and MY_TeamMon.GetMapName(data.dwMapID):find(MY_TEAM_MON__UI__SEARCH, nil, true)) + or (data.szTarget and tostring(data.szTarget):find(MY_TEAM_MON__UI__SEARCH, nil, true)) + then + return true + end + end + return false +end + +function D.GetDataName(szType, data) + local szName, nIcon + if szType == 'CASTING' then + szName, nIcon = X.GetSkillName(data.dwID, data.nLevel) + elseif szType == 'NPC' then + if data.dwID then + szName = X.GetNpcTemplateName(data.dwID) or data.dwID + nIcon = data.nFrame + end + elseif szType == 'DOODAD' then + local doodad = GetDoodadTemplate(data.dwID) + szName = X.GetDoodadTemplateName(data.dwID) or data.dwID + nIcon = doodad and MY_TEAM_MON__UI__DOODAD_ICON[doodad.nKind] or 13 + elseif szType == 'TALK' or szType == 'CHAT' then + szName = data.szContent + else + szName, nIcon = X.GetBuffName(data.dwID, data.nLevel) + end + if data.nIcon then + nIcon = data.nIcon + end + if data.szName then + szName = ParseCustomText(data.szName) + end + return szName, nIcon +end + +function D.SetBuffItemAction(h) + local dat = h.dat + local szName, nIcon = D.GetDataName('BUFF', dat) + h:Lookup('Text'):SetText(szName) + if dat.col then + h:Lookup('Text'):SetFontColor(unpack(dat.col)) + end + local nSec = select(3, GetBuffTime(dat.dwID, dat.nLevel)) + if not nSec then + h:Lookup('Text_R'):SetText('N/A') + elseif nSec > 24 * 60 * 60 / X.ENVIRONMENT.GAME_FPS then + h:Lookup('Text_R'):SetText(_L['INFINITE']) + else + nSec = nSec / X.ENVIRONMENT.GAME_FPS + h:Lookup('Text_R'):SetText(X.FormatDuration(nSec, 'PRIME')) + end + h:Lookup('Image_RBg'):Show() + local box = h:Lookup('Box') + box:SetObjectIcon(nIcon) + if dat.nCount then + box:SetOverTextPosition(0, ITEM_POSITION.RIGHT_BOTTOM) + box:SetOverTextFontScheme(0, 15) + box:SetOverText(0, dat.nCount) + end + h.bDraw = true +end + +function D.SetCastingItemAction(h) + local dat = h.dat + local szName, nIcon = D.GetDataName('CASTING', dat) + h:Lookup('Text'):SetText(szName) + if dat.col then + h:Lookup('Text'):SetFontColor(unpack(dat.col)) + end + local hSkill = GetSkillInfo({ skill_id = dat.dwID, skill_level = dat.nLevel }) + if not hSkill or hSkill.AreaRadius == 0 then + h:Lookup('Text_R'):SetText('N/A') + else + h:Lookup('Text_R'):SetText(hSkill.AreaRadius / 64 .. g_tStrings.STR_METER) + end + h:Lookup('Image_RBg'):Show() + local box = h:Lookup('Box') + box:SetObjectIcon(nIcon) + h.bDraw = true +end + +function D.SetNpcItemAction(h) + local dat = h.dat + local szName = D.GetDataName('NPC', dat) + h:Lookup('Text'):SetText(szName) + if dat.col then + h:Lookup('Text'):SetFontColor(unpack(dat.col)) + end + local box = h:Lookup('Box') + box:ClearObjectIcon() + box:SetExtentImage('ui/Image/TargetPanel/Target.UITex', dat.nFrame) + h.bDraw = true +end + +function D.SetDoodadItemAction(h) + local dat = h.dat + local szName, nIcon = D.GetDataName('DOODAD', dat) + h:Lookup('Text'):SetText(szName) + if dat.col then + h:Lookup('Text'):SetFontColor(unpack(dat.col)) + end + local box = h:Lookup('Box') + box:SetObjectIcon(nIcon) + h.bDraw = true +end + +function D.SetTalkItemAction(h) + local dat = h.dat + h:Lookup('Text_Name'):SetText(dat.szTarget or _L['Warning box']) + if not dat.szTarget or dat.szTarget == '%' then -- system and %% + h:Lookup('Text_Name'):SetFontColor(255, 255, 0) + end + h:Lookup('Text_Content'):SetText(dat.szContent) + if dat.col then + h:Lookup('Text_Content'):SetFontColor(unpack(dat.col)) + end + h.bDraw = true +end + +function D.SetChatItemAction(h) + local dat = h.dat + h:Lookup('Text_Name'):SetText(_L['CHAT']) + h:Lookup('Text_Name'):SetFontColor(255, 255, 0) + h:Lookup('Text_Content'):SetText(dat.szContent) + if dat.col then + h:Lookup('Text_Content'):SetFontColor(unpack(dat.col)) + end + h.bDraw = true +end + +-- 更新监控数据 +function D.UpdateLList() + local tab = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE) + if tab then + local dat, dat2 = tab[MY_TEAM_MON__UI__SELECT_MAP] or {}, {} + if MY_TEAM_MON__UI__SEARCH then + for k, v in ipairs(dat) do + if D.CheckSearch(MY_TEAM_MON__UI__SELECT_TYPE, v) then + table.insert(dat2, v) + end + end + else + dat2 = dat + end + D.DrawTableL(dat2) + end +end + +function D.DrawTableL(data) + local frame = D.GetFrame() + local page = frame.hPageSet:GetActivePage() + local handle = page:Lookup('WndScroll_' .. MY_TEAM_MON__UI__SELECT_TYPE .. '_L', 'Handle_' .. MY_TEAM_MON__UI__SELECT_TYPE .. '_List_L') + local hItemData = (MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT') and frame.hTalkL or frame.hItemL + handle:Clear() + if #data > 0 then + for k, v in X.ipairs_r(data) do + local h = handle:AppendItemFromData(hItemData, 'Handle_L') + h.dat = v + end + end + handle:FormatAllItemPos() + D.RefreshScroll('L') +end + +-- 更新临时数据 +function D.UpdateRList(data) + if data then + D.DrawTableR(data, true) + else + local tab, tab2 = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE, true), {} + if tab then + if MY_TEAM_MON__UI__SEARCH then + for k, v in ipairs(tab) do + if D.CheckSearch(MY_TEAM_MON__UI__SELECT_TYPE, v) then + table.insert(tab2, v) + end + end + else + tab2 = tab + end + D.DrawTableR(tab2) + end + end +end + +function D.DrawTableR(data, bInsert) + local frame = D.GetFrame() + local page = frame.hPageSet:GetActivePage() + local handle = page:Lookup('WndScroll_' .. MY_TEAM_MON__UI__SELECT_TYPE .. '_R', 'Handle_' .. MY_TEAM_MON__UI__SELECT_TYPE .. '_List_R') + if not bInsert then + handle:Clear() + local hItemData = (MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT') and frame.hTalkR or frame.hItemR + if #data > 0 then + for k, v in X.ipairs_r(data) do + local h = handle:AppendItemFromData(hItemData, 'Handle_R') + h.dat = v + end + end + else + -- 少一个 InsertItemFromData + local szIniFile = (MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT') and MY_TEAM_MON__UI__TALK_R or MY_TEAM_MON__UI__ITEM_R + local szSectionName = (MY_TEAM_MON__UI__SELECT_TYPE == 'TALK' or MY_TEAM_MON__UI__SELECT_TYPE == 'CHAT') and 'Handle_TALK_R' or 'Handle_R' + if not MY_TEAM_MON__UI__SEARCH or D.CheckSearch(MY_TEAM_MON__UI__SELECT_TYPE, data) then + handle:InsertItemFromIni(0, false, szIniFile, szSectionName, 'Handle_R') + local h = handle:Lookup(0) + h.dat = data + end + end + handle:FormatAllItemPos() + D.RefreshScroll('R') +end + +function D.ScrollMapIntoView(frame) + local hList, hNode, hItem = frame.hTreeH + for i = 0, hList:GetItemCount() - 1 do + hItem = hList:Lookup(i) + if hItem:GetName() == 'Handle_TreeNode' then + hNode = hItem + elseif hItem.dwMapID == MY_TEAM_MON__UI__SELECT_MAP then + break + end + hItem = nil + end + if not hItem then + return + end + if hNode and not MY_TEAM_MON__UI__TREE_EXPAND[hNode.szKey] then + X.ExecuteWithThis(hNode, D.OnItemLButtonClick) + end + X.UI.ScrollIntoView(hItem, frame.hTreeS) +end + +-- 添加面板 +function D.OpenAddPanel(szType, data) + local szName, nIcon = _L[szType], 340 + if szType ~= 'TALK' and szType ~= 'CHAT' then + szName, nIcon = D.GetDataName(szType, data) + end + local ui = X.UI.CreateFrame('MY_TeamMon_NewData', { w = 380, h = 250, text = szName, focus = true, close = true }) + local nX, nY = 0, 0 + ui:Event('MY_TEAM_MON__UI__SWITCH_PAGE', function() ui:Remove() end) + ui:Event('MY_TEAM_MON__UI__TEMP_RELOAD', function() ui:Remove() end) + if szType ~= 'NPC' then + nX, nY = ui:Append('Box', { name = 'Box_Icon', w = 48, h = 48, x = 166, y = 40, icon = nIcon }):Pos('BOTTOMRIGHT') + else + nX, nY = ui:Append('Box', { + name = 'Box_Icon', w = 48, h = 48, x = 166, y = 40, icon = nIcon, + image = 'ui/Image/TargetPanel/Target.uitex', imageFrame = data.nFrame, + }):Pos('BOTTOMRIGHT') + end + ui:Children('#Box_Icon'):Hover(function(bHover) + this:SetObjectMouseOver(bHover) + if bHover then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + D.OutputTip(szType, data, { x, y, w, h }) + else + HideTip() + end + end) + nX, nY = ui:Append('WndEditBox', { + name = 'map', x = 100, y = nY + 15, w = 200, h = 30, + text = MY_TEAM_MON__UI__SELECT_MAP ~= _L['All data'] + and MY_TeamMon.GetMapName(MY_TEAM_MON__UI__SELECT_MAP) + or MY_TeamMon.GetMapName(data.dwMapID), + autocomplete = {{'option', 'source', X.GetMapNameList()}}, + onChange = function() + local el = this + local ui = X.UI(el) + if ui:Text() == '' then + local menu = {} + D.InsertDungeonMenu(menu, function(dwMapID) + ui:Text(MY_TeamMon.GetMapName(dwMapID)) + end) + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.nMiniWidth = nW + menu.x = nX + menu.y = nY + nH + menu.fnAutoClose = function() return not el or not el:IsValid() end + menu.bShowKillFocus = true + menu.bDisableSound = true + PopupMenu(menu) + end + end, + }):Pos('BOTTOMRIGHT') + ui:Append('WndButton', { + x = 120, y = nY + 40, text = _L['Add'], + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + local txt = ui:Children('#map'):Text() + local map = MY_TeamMon.GetMapInfo(txt) + if not map then + return X.Alert(_L['The map does not exist']) + end + local tab = select(2, MY_TeamMon.CheckSameData(szType, map.dwID, data.dwID or data.szContent, data.nLevel or data.szTarget)) + if tab then + return X.Confirm(_L['Data exists, editor?'], function() + FireUIEvent('MY_TEAM_MON__UI__SELECT_MAP', map.dwID) + D.OpenSettingPanel(tab, szType) + ui:Remove() + end) + end + local dat = { + dwID = data.dwID, + nLevel = data.nLevel, + nFrame = data.nFrame, + szContent = data.szContent, + szTarget = data.szTarget + } + FireUIEvent('MY_TEAM_MON__UI__SELECT_MAP', map.dwID) + D.OpenSettingPanel(MY_TeamMon.AddData(szType, map.dwID, dat), szType) + ui:Remove() + end, + }) +end + +-- 数据调试面板 +function D.OpenJsonPanel(data, fnAction) + local ui = X.UI.CreateFrame('MY_TeamMon_JsonPanel', { w = 720,h = 500, text = _L['MY_TeamMon DEBUG Panel'], close = true }) + ui:Event('MY_TEAM_MON__UI__DATA_RELOAD', function() ui:Remove() end) + ui:Event('MY_TEAM_MON__UI__SWITCH_PAGE', function() ui:Remove() end) + ui:Append('WndEditBox', { + name = 'CODE', w = 660, h = 350, x = 30, y = 60, + color = { 255, 255, 0 }, + text = X.EncodeLUAData(data, '\t'), + multiline = true, limit = 999999, + onChange = function() + local code = ui:Children('#CODE') + local dat = X.DecodeLUAData(code:Text()) + if dat then + code:Color(255, 255, 0) + else + code:Color(255, 0, 0) + end + end, + }) + ui:Append('WndButton',{ + x = 30, y = 440, + text = g_tStrings.STR_HOTKEY_SURE, + buttonStyle = 'FLAT_LACE_BORDER', + onClick = function() + X.Confirm(_L['Confirm?'], function() + local dat = X.DecodeLUAData(ui:Children('#CODE'):Text()) + if fnAction and dat then + ui:Remove() + return fnAction(dat) + end + end) + end, + }) +end + +-- 设置面板 +function D.OpenSettingPanel(data, szType) + local function RedrawPanel() + D.OpenSettingPanel(data, szType) + end + X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_UI__OpenSettingPanel', function() + RedrawPanel() + end) + local function GetPatternName() + if szType == 'BUFF' or szType == 'DEBUFF' then + return '{$B' .. data.dwID .. '}' + end + if szType == 'CASTING' then + return '{$S' .. data.dwID .. '}' + end + if szType == 'NPC' then + return '{$N' .. data.dwID .. '}' + end + if szType == 'DOODAD' then + return '{$D' .. data.dwID .. '}' + end + end + local function GetScrutinyTypeMenu() + local menu = { + { + szOption = g_tStrings.STR_GUILD_ALL, + bMCheck = true, + bChecked = type(data.nScrutinyType) == 'nil', + fnAction = function() + data.nScrutinyType = nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }, + -- { bDevide = true }, + { + szOption = g_tStrings.MENTOR_SELF, + bMCheck = true, + bChecked = data.nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.SELF, + fnAction = function() + data.nScrutinyType = MY_TEAM_MON_SCRUTINY_TYPE.SELF + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }, + { + szOption = _L['Team'], + bMCheck = true, + bChecked = data.nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.TEAM, + fnAction = function() + data.nScrutinyType = MY_TEAM_MON_SCRUTINY_TYPE.TEAM + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }, + { + szOption = _L['Enemy'], + bMCheck = true, + bChecked = data.nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.ENEMY, + fnAction = function() + data.nScrutinyType = MY_TEAM_MON_SCRUTINY_TYPE.ENEMY + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }, + { + szOption = g_tStrings.STR_RAID_TIP_TARGET, + bMCheck = true, + bChecked = data.nScrutinyType == MY_TEAM_MON_SCRUTINY_TYPE.TARGET, + fnAction = function() + data.nScrutinyType = MY_TEAM_MON_SCRUTINY_TYPE.TARGET + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }, + } + return menu + end + local function GetKungFuMenu() + local menu = {} + if data.tKungFu then + table.insert(menu, { szOption = _L['No request'], bCheck = true, bChecked = type(data.tKungFu) == 'nil', fnAction = function() + data.tKungFu = nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + X.UI.ClosePopupMenu() + end }) + end + for k, v in ipairs(X.CONSTANT.KUNGFU_LIST) do + table.insert(menu, { + szOption = X.GetSkillName(v.dwID, 1), + bCheck = true, + bChecked = data.tKungFu and data.tKungFu['SKILL#' .. v.dwID], + szIcon = v.szUITex, + nFrame = v.nFrame, + szLayer = 'ICON_RIGHTMOST', + fnAction = function() + data.tKungFu = data.tKungFu or {} + if not data.tKungFu['SKILL#' .. v.dwID] then + data.tKungFu['SKILL#' .. v.dwID] = true + else + data.tKungFu['SKILL#' .. v.dwID] = nil + if X.IsEmpty(data.tKungFu) then + data.tKungFu = nil + end + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end + }) + end + return menu + end + local function GetMarkMenu(nClass) + local menu = {} + for k, v in X.ipairs_c(PARTY_MARK_ICON_FRAME_LIST) do + table.insert(menu, { + szOption = X.CONSTANT.TEAM_MARK_NAME[k] or '?', + szIcon = PARTY_MARK_ICON_PATH, + nFrame = v, szLayer = 'ICON_RIGHT', + bCheck = true, bChecked = data[nClass] and data[nClass].tMark and data[nClass].tMark[k], + fnAction = function(_, bCheck) + if bCheck then + data[nClass] = data[nClass] or {} + if not data[nClass].tMark then + data[nClass].tMark = {} + for kk, vv in X.ipairs_c(PARTY_MARK_ICON_FRAME_LIST) do + data[nClass].tMark[kk] = false + end + end + data[nClass].tMark[k] = true + else + data[nClass].tMark[k] = false + local bDelete = true + for k, v in ipairs(data[nClass].tMark) do + if v then + bDelete = false + break + end + end + if bDelete then + data[nClass].tMark = nil + end + if X.IsEmpty(data[nClass]) then data[nClass] = nil end + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + end + return menu + end + local function GetVoiceMenu(nClass, bSelf) + local menu = {} + if bSelf then + table.insert(menu, { + szOption = _L['Buff target must be myself'], + bCheck = true, + bChecked = data[nClass] and data[nClass].bVoiceSelfOnly, + fnAction = function() + data[nClass] = data[nClass] or {} + data[nClass].bVoiceSelfOnly = not data[nClass].bVoiceSelfOnly + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + + local menuVoice = {} + local function UpdateVoiceSelection() + local szVoice = nil + if data[nClass] then + szVoice = data[nClass].szVoice + end + for _, m1 in ipairs(menuVoice) do + if m1.szOption then + m1.rgb = nil + for _, m2 in ipairs(m1) do + if m2.bCheck then + if m2.UserData == szVoice then + m2.bChecked = true + m1.rgb = { 255, 255, 0 } + else + m2.bChecked = false + end + end + end + if m1.bCheck then + m1.bChecked = m1.UserData == szVoice + end + end + end + end + + table.insert(menuVoice, { + szOption = _L['No voice'], + bCheck = true, + bMCheck = true, + bChecked = not data[nClass] or not data[nClass].szVoice, + fnAction = function(_, bCheck) + if data[nClass] then + data[nClass].szVoice = nil + UpdateVoiceSelection() + end + end, + UserData = nil, + }) + + table.insert(menuVoice, X.CONSTANT.MENU_DIVIDER) + local bOfficial = true + for _, tGroup in ipairs(MY_TeamMon_VoiceAlarm.GetSlugList()) do + local m1 = { szOption = tGroup.szGroupName } + for _, tSlug in ipairs(tGroup) do + local bChecked = data[nClass] and data[nClass].szVoice == tSlug.szSlug + if bChecked then + menu.rgb = { 255, 255, 0 } + m1.rgb = { 255, 255, 0 } + end + table.insert(m1, { + szOption = tSlug.szRemark, + bCheck = true, + bMCheck = true, + bChecked = bChecked, + fnAction = function(_, bCheck) + data[nClass] = data[nClass] or {} + data[nClass].szVoice = tSlug.szSlug + UpdateVoiceSelection() + end, + UserData = tSlug.szSlug, + }) + end + if bOfficial and not tGroup.bOfficial then + table.insert(menuVoice, X.CONSTANT.MENU_DIVIDER) + bOfficial = false + end + table.insert(menuVoice, m1) + end + UpdateVoiceSelection() + + for _, m in ipairs(menuVoice) do + table.insert(menu, m) + end + return menu + end + local function SetDataClass(nClass, key, value) + if value then + data[nClass] = data[nClass] or {} + data[nClass][key] = value + else + data[nClass][key] = nil + if X.IsEmpty(data[nClass]) then + data[nClass] = nil + end + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end + + local function IsSimpleCountdown(dat) + if dat.nClass == MY_TEAM_MON_TYPE.NPC_LIFE or dat.nClass == MY_TEAM_MON_TYPE.NPC_MANA then + return false + end + if X.IsEmpty(dat.nTime) or tonumber(dat.nTime) then + return true + end + return false + end + + local function FormatElPosByCountdownType(dat, ui, i) + local bSimple = IsSimpleCountdown(dat) + ui:Children('#CountdownTime' .. i):Width(bSimple and 100 or 400) + ui:Children('#CountdownName' .. i):Visible(bSimple) + end + + local function SetCountdownType(dat, val, ui, i) + dat.nClass = val + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FormatElPosByCountdownType(dat, ui, i) + ui:Children('#Countdown' .. i):Text(_L['Countdown TYPE ' .. dat.nClass]) + X.UI.ClosePopupMenu() + end + + local function ParseCountdown(szCountdown, nClass) + local aCountdown, bError, bTrigger + if nClass == MY_TEAM_MON_TYPE.NPC_LIFE or nClass == MY_TEAM_MON_TYPE.NPC_MANA then + bTrigger = true + aCountdown, bError = MY_TeamMon.ParseHPCountdown(szCountdown) + else + bTrigger = false + aCountdown, bError = MY_TeamMon.ParseCountdown(szCountdown) + end + return aCountdown, bError, bTrigger + end + -- local tSkillInfo + local file = 'ui/Image/UICommon/Feedanimials.uitex' + local szName, nIcon = _L[szType], 340 + if szType ~= 'TALK' and szType ~= 'CHAT' then + szName, nIcon = D.GetDataName(szType, data) + elseif szType == 'CHAT' then + nIcon = 439 + end + local ui = X.UI.CreateFrame('MY_TeamMon_SettingPanel', { + w = 770, h = 450, text = szName, close = true, focus = true, esc = true, + onRemove = function() + X.RegisterEvent('MY_RESTRICTION', 'MY_TeamMon_UI__OpenSettingPanel', false) + end, + }) + local frame = Station.Lookup('Normal/MY_TeamMon_SettingPanel') + ui:Event('MY_TEAM_MON__UI__DATA_RELOAD', function() ui:Remove() end) + ui:Event('MY_TEAM_MON__UI__SWITCH_PAGE', function() ui:Remove() end) + frame.OnFrameDragEnd = function() + MY_TEAM_MON__UI__PANEL_ANCHOR = GetFrameAnchor(frame, 'CENTER') + end + local nX, nY, _ = 0, 0, 0 + local nW, nH = ui:Size() + local function fnClickBox() + local menu, box = {}, this + if szType ~= 'TALK' and szType ~= 'CHAT' then + table.insert(menu, { szOption = _L['Edit name'], fnAction = function() + local szKey = X.Alert(_L['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called']) + local function CloseHelp() + X.DoMessageBox(szKey) + end + local szDefault = data.szName or GetPatternName() or szName + GetUserInput(_L['Edit name'], function(szText) + szText = X.TrimString(szText) + if szText == '' or szText == szName or szText == GetPatternName() then + data.szName = nil + ui:Text(szName) + else + data.szName = szText + ui:Text(ParseCustomText(szText)) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + CloseHelp() + end, CloseHelp, function() return not frame or not frame:IsValid() end, nil, szDefault) + end}) + table.insert(menu, { bDevide = true }) + end + if szType ~= 'NPC' and szType ~= 'TALK' and szType ~= 'CHAT' then + table.insert(menu, { szOption = _L['Edit icon'], fnAction = function() + X.UI.OpenIconPicker( + function(nNewIcon) + nIcon = nNewIcon + data.nIcon = nNewIcon + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + box:SetObjectIcon(nNewIcon) + end, + data.nIcon + ) + end}) + table.insert(menu, { bDevide = true }) + end + table.insert(menu, { + szOption = _L['Edit color'], + szLayer = 'ICON_RIGHT', + szIcon = 'ui/Image/UICommon/Feedanimials.uitex', + nFrame = 86, + nMouseOverFrame = 87, + fnClickIcon = function() + data.col = nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + ui:Children('#Shadow_Color'):Alpha(0) + end, + fnAction = function() + X.UI.OpenColorPicker(function(r, g, b) + data.col = { r, g, b } + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + ui:Children('#Shadow_Color'):Color(r, g, b):Alpha(255) + end) + end + }) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Raw data, please be careful'], color = { 255, 255, 0 }, fnAction = function() + D.OpenJsonPanel(data, function(dat) + local file = MY_TeamMon.GetTable(MY_TEAM_MON__UI__SELECT_TYPE) + if file and file[MY_TEAM_MON__UI__SELECT_MAP] and file[data.dwMapID][data.nIndex] then + file[data.dwMapID][data.nIndex] = dat + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + FireUIEvent('MY_TEAM_MON__UI__DATA_RELOAD') + D.OpenSettingPanel(file[data.dwMapID][data.nIndex], szType) + end) + end }) + PopupMenu(menu) + end + + ui:Append('Shadow', { name = 'Shadow_Color', w = 52, h = 52, x = 359, y = 38, color = data.col, alpha = data.col and 255 or 0 }) + if szType ~= 'NPC' then + nX, nY = ui:Append('Box', { name = 'Box_Icon', w = 48, h = 48, x = 361, y = 40, icon = nIcon }):Pos('BOTTOMRIGHT') + else + nX, nY = ui:Append('Box', { + name = 'Box_Icon', w = 48, h = 48, x = 361, y = 40, icon = nIcon, + image = 'ui/Image/TargetPanel/Target.uitex', imageFrame = data.nFrame, + }):Pos('BOTTOMRIGHT') + end + ui:Children('#Box_Icon'):Hover(function(bHover) + this:SetObjectMouseOver(bHover) + if bHover then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + D.OutputTip(szType, data, { x, y, w, h }) + else + HideTip() + end + end):Click(fnClickBox) + + local CAPTION_MARGIN_TOP, CAPTION_MARGIN_BOTTOM = 4, 3 + if szType == 'BUFF' or szType == 'DEBUFF' then + -- 通用 + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = g_tStrings.CHANNEL_COMMON, font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndComboBox', { + text = _L['Scrutiny type'], + menu = function() + return GetScrutinyTypeMenu(data) + end, + }) + uiContainer:Append('WndComboBox', { + text = _L['Self kungfu requirement'], + menu = function() + return GetKungFuMenu(data) + end, + }) + uiContainer:Append('WndWindow', { w = 5, h = 30 }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Buffcount achieve'] }) + uiContainer:Append('WndEditBox', { + w = 30, h = 26, + text = data.nCount or 1, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + data.nCount = tonumber(nNum) + if data.nCount == 1 then + data.nCount = nil + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndCheckBox', { + checked = data.bCheckLevel, text = _L['Check level'], + onCheck = function(bCheck) + data.bCheckLevel = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, + }) + nY = nY + uiContainer:Height() + + -- 获得气劲 + local cfg = data[MY_TEAM_MON_TYPE.BUFF_GET] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Get buff'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + w = 'auto', h = 25, + text = _L['Mark'], + menu = function() + return GetMarkMenu(MY_TEAM_MON_TYPE.BUFF_GET) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.BUFF_GET, true) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_PartyBuffList') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bPartyBuffList, text = _L['Party buff list'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bPartyBuffList', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_BuffList') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBuffList, text = _L['Buff list'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bBuffList', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.Cataclysm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamPanel, text = _L['Team panel'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bTeamPanel', bCheck) + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + RedrawPanel() + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bOnlySelfSrc, text = _L['Only source self'], + enable = cfg.bTeamPanel == true, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bOnlySelfSrc', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bSelect', bCheck) + end, + }) + if szType == 'BUFF' then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bAutoCancel, text = _L['Auto Cancel Buff'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_GET, 'bAutoCancel', bCheck) + end, + }) + end + end + nY = nY + uiContainer:Height() + + -- 失去气劲 + local cfg = data[MY_TEAM_MON_TYPE.BUFF_LOSE] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Lose buff'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, + text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.BUFF_LOSE, true) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_LOSE, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_LOSE, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_LOSE, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_LOSE, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.BUFF_LOSE, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + elseif szType == 'CASTING' then + -- 通用 + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = g_tStrings.CHANNEL_COMMON, font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + text = _L['Scrutiny type'], + menu = function() + return GetScrutinyTypeMenu(data) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + text = _L['Self kungfu requirement'], + menu = function() + return GetKungFuMenu(data) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = data.bCheckLevel, text = _L['Check level'], + onCheck = function(bCheck) + data.bCheckLevel = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = data.bMonTarget, text = _L['Show target name'], + onCheck = function(bCheck) + data.bMonTarget = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + nY = nY + uiContainer:Height() + + -- 招式成功释放 + local cfg = data[MY_TEAM_MON_TYPE.SKILL_END] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Skills cast succeed'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Mark'], + menu = function() + return GetMarkMenu(MY_TEAM_MON_TYPE.SKILL_END) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.SKILL_END) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_END, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + + -- local tRecipeKey = me.GetSkillRecipeKey(data.dwID, data.nLevel) + -- tSkillInfo = GetSkillInfo(tRecipeKey) + -- if tSkillInfo and tSkillInfo.CastTime ~= 0 then + -- 招式开始运功 + local cfg = data[MY_TEAM_MON_TYPE.SKILL_BEGIN] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Skills began to cast'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Mark'], + menu = function() + return GetMarkMenu(MY_TEAM_MON_TYPE.SKILL_BEGIN) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.SKILL_BEGIN) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.\nDue to official logic, only target is visible.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.SKILL_BEGIN, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + -- end + elseif szType == 'NPC' then + -- 通用 + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = g_tStrings.CHANNEL_COMMON, font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + text = _L['Self kungfu requirement'], + menu = function() + return GetKungFuMenu(data) + end, + }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Count achieve'] }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + w = 30, h = 26, + text = data.nCount or 1, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + data.nCount = tonumber(nNum) + if data.nCount == 1 then + data.nCount = nil + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = data.bAllLeave, text = _L['Must all leave scene'], + onCheck = function(bCheck) + data.bAllLeave = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + RedrawPanel() + end, + }) + nY = nY + uiContainer:Height() + + -- 进入场景 + local cfg = data[MY_TEAM_MON_TYPE.NPC_ENTER] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Enter scene'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Mark'], + menu = function() + return GetMarkMenu(MY_TEAM_MON_TYPE.NPC_ENTER) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.NPC_ENTER) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_ENTER, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + + -- 离开场景 + local cfg = data[MY_TEAM_MON_TYPE.NPC_LEAVE] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = data.bAllLeave and _L['All leave scene'] or _L['Leave scene'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.NPC_LEAVE) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_LEAVE, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_LEAVE, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_LEAVE, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.NPC_LEAVE, 'bBigFontAlarm', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + elseif szType == 'DOODAD' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = g_tStrings.CHANNEL_COMMON, font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + text = _L['Self kungfu requirement'], + menu = function() + return GetKungFuMenu(data) + end, + }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Count achieve'] }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + w = 30, h = 26, text = data.nCount or 1, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + data.nCount = tonumber(nNum) + if data.nCount == 1 then + data.nCount = nil + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = data.bAllLeave, text = _L['Must all leave scene'], + onCheck = function(bCheck) + data.bAllLeave = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + RedrawPanel() + end, + }) + nY = nY + uiContainer:Height() + + -- 进入场景 + local cfg = data[MY_TEAM_MON_TYPE.DOODAD_ENTER] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Enter scene'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.DOODAD_ENTER) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_ENTER, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + + -- 离开场景 + local cfg = data[MY_TEAM_MON_TYPE.DOODAD_LEAVE] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = data.bAllLeave and _L['All leave scene'] or _L['Leave scene'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + x = nX + 5, y = nY + 8, w = 60, h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.DOODAD_LEAVE) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_LEAVE, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_LEAVE, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_LEAVE, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.DOODAD_LEAVE, 'bBigFontAlarm', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + elseif szType == 'TALK' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Alert content'], font = 27 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + text = data.szNote, w = 650, h = 25, + onChange = function(text) + local szText = X.TrimString(text) + if szText == '' then + data.szNote = nil + else + data.szNote = szText + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + tip = { + render = _L['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called'], + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + }) + nY = nY + uiContainer:Height() + + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Speaker'], font = 27 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + text = data.szTarget or _L['Warning box'], w = 650, h = 25, + onChange = function(text) + local szText = X.TrimString(text) + if szText == '' or szText == _L['Warning box'] then + data.szTarget = nil + else + data.szTarget = szText + end + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + nY = nY + uiContainer:Height() + + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Content'], font = 27 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + text = data.szContent, w = 650, h = 55, multiline = true, + onChange = function(text) + data.szContent = X.TrimString(text) + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + nY = nY + uiContainer:Height() + + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Content'], font = 27, alpha = 0 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + h = 25, text = _L['Partical search'], + tip = { + render = _L['Supports match partical.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = data.bSearch, + onCheck = function(bCheck) + data.bSearch = bCheck + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + h = 25, text = _L['Regexp match'], + tip = { + render = _L['Supports backreference in note string, format: {$index}.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = data.bReg, + onCheck = function(bCheck) + data.bReg = bCheck + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndWindow', { w = 20, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, text = _L['Tips: {$me} behalf of self, {$team} behalf of team.'], alpha = 200 }) + nY = nY + uiContainer:Height() + + -- 触发喊话 + local cfg = data[MY_TEAM_MON_TYPE.TALK_MONITOR] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Trigger talk'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.TALK_MONITOR) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.TALK_MONITOR, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + elseif szType == 'CHAT' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Alert content'], font = 27 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + text = data.szNote, w = 650, h = 25, + onChange = function(text) + local szText = X.TrimString(text) + if szText == '' then + data.szNote = nil + else + data.szNote = szText + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + tip = { + render = _L['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called'], + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + }) + nY = nY + uiContainer:Height() + + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Chat content'], font = 27 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndEditBox', { + text = data.szContent, w = 650, h = 85, multiline = true, + onChange = function(text) + data.szContent = text:gsub('\r', '') + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + nY = nY + uiContainer:Height() + + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Chat content'], font = 27, alpha = 0 }) + uiContainer:Append('WndWindow', { w = 5, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Partical search'], + tip = { + render = _L['Supports match partical.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = data.bSearch, + onCheck = function(bCheck) + data.bSearch = bCheck + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + text = _L['Regexp match'], + tip = { + render = _L['Supports backreference in note string, format: {$index}.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = data.bReg, + onCheck = function(bCheck) + data.bReg = bCheck + FireUIEvent('MY_TEAM_MON_CREATE_CACHE') + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }) + uiContainer:Append('WndWindow', { w = 20, h = 25 }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Tips: {$me} behalf of self, {$team} behalf of team.'], alpha = 200 }) + nY = nY + uiContainer:Height() + + -- 触发系统喊话 + local cfg = data[MY_TEAM_MON_TYPE.CHAT_MONITOR] or {} + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Trigger chat'], font = 27 }) + uiContainer:Append('WndDummyWrapper'):Append('WndComboBox', { + h = 25, text = _L['Voice'], + menu = function() + return GetVoiceMenu(MY_TEAM_MON_TYPE.CHAT_MONITOR) + end, + }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + local uiContainer = ui:Append('WndContainer', { x = 30, y = nY, w = nW - 30 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bTeamChannel, text = _L['Team channel alarm'], color = GetMsgFontColor('MSG_TEAM', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bTeamChannel', bCheck) + end, + }) + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bWhisperChannel, text = _L['Whisper channel alarm'], color = GetMsgFontColor('MSG_WHISPER', true), + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bWhisperChannel', bCheck) + end, + }) + if not X.IsRestricted('MY_TeamMon_CenterAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bCenterAlarm, text = _L['Center alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bCenterAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_LargeTextAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bBigFontAlarm, text = _L['Large text alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bBigFontAlarm', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_ScreenHeadAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bScreenHead, text = _L['Lifebar alarm'], + tip = { + render = _L['Requires MY_LifeBar loaded.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bScreenHead', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon_FullScreenAlarm') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bFullScreen, text = _L['Fullscreen alarm'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bFullScreen', bCheck) + end, + }) + end + if not X.IsRestricted('MY_TeamMon.AutoSelect') then + uiContainer:Append('WndDummyWrapper'):Append('WndCheckBox', { + checked = cfg.bSelect, text = _L['Auto Select'], + onCheck = function(bCheck) + SetDataClass(MY_TEAM_MON_TYPE.CHAT_MONITOR, 'bSelect', bCheck) + end, + }) + end + nY = nY + uiContainer:Height() + end + -- 补充报警内容 + if szType ~= 'TALK' and szType ~= 'CHAT' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Add content'], font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + nX, nY = ui:Append('WndEditBox', { + x = 30, y = nY, text = data.szNote, w = 650, h = 25, limit = 10, + onChange = function(text) + local szText = X.TrimString(text) + if szText == '' then + data.szNote = nil + else + data.szNote = szText + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + }):Pos('BOTTOMRIGHT') + end + -- 倒计时 + if not X.IsRestricted('MY_TeamMon_SpellTimer') then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Countdown'], font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + for k, v in ipairs(data.tCountdown or {}) do + -- 类型 + nX = ui:Append('WndComboBox', { + name = 'Countdown' .. k, x = 30, w = 155, h = 25, y = nY, + color = v.key and { 255, 255, 0 }, + text = v.nClass == -1 and _L['Please select type'] or _L['Countdown TYPE ' .. v.nClass], + menu = function() + local menu = {} + if IsCtrlKeyDown() then + table.insert(menu, { + szOption = _L['Set countdown key'], + rgb = { 255, 255, 0 }, + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['Key supports template render: {$sender}, {$receiver}, {$1}'], nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + fnAction = function() + GetUserInput(_L['Countdown key'], function(szKey) + if X.TrimString(szKey) == '' then + v.key = nil + else + v.key = X.TrimString(szKey) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + D.OpenSettingPanel(data, szType) + end, nil, nil, nil, v.key) + end, + }) + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Hold countdown when crossmap'], bCheck = true, bChecked = v.bHold, fnAction = function() + v.bHold = not v.bHold + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end }) + if v.nClass == MY_TEAM_MON_TYPE.NPC_FIGHT then + table.insert(menu, { szOption = _L['Hold countdown when unfight'], bCheck = true, bChecked = v.bFightHold, fnAction = function() + v.bFightHold = not v.bFightHold + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end }) + end + + table.insert(menu, { bDevide = true }) + table.insert(menu, { szOption = _L['Color Picker'], bDisable = true }) + -- Color Picker + for i = 0, 8 do + table.insert(menu, { + bMCheck = true, + bChecked = v.nFrame == i, + fnAction = function() + v.nFrame = i + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + X.UI.ClosePopupMenu() + end, + szIcon = PLUGIN_ROOT .. '/img/ST.UITex', + nFrame = i, + szLayer = 'ICON_FILL', + }) + end + else + table.insert(menu, { szOption = _L['Please select type'], bDisable = true, bChecked = v.nClass == -1 }) + table.insert(menu, { bDevide = true }) + if szType == 'BUFF' or szType == 'DEBUFF' then + for kk, vv in ipairs({ MY_TEAM_MON_TYPE.BUFF_GET, MY_TEAM_MON_TYPE.BUFF_LOSE }) do + table.insert(menu, { szOption = _L['Countdown TYPE ' .. vv], bMCheck = true, bChecked = v.nClass == vv, fnAction = function() + SetCountdownType(v, vv, ui, k) + end }) + end + elseif szType == 'CASTING' then + table.insert(menu, { szOption = _L['Countdown TYPE ' .. MY_TEAM_MON_TYPE.SKILL_END], bMCheck = true, bChecked = v.nClass == MY_TEAM_MON_TYPE.SKILL_END, fnAction = function() + SetCountdownType(v, MY_TEAM_MON_TYPE.SKILL_END, ui, k) + end }) + -- if tSkillInfo and tSkillInfo.CastTime ~= 0 then + table.insert(menu, { szOption = _L['Countdown TYPE ' .. MY_TEAM_MON_TYPE.SKILL_BEGIN], bMCheck = true, bChecked = v.nClass == MY_TEAM_MON_TYPE.SKILL_BEGIN, fnAction = function() + SetCountdownType(v, MY_TEAM_MON_TYPE.SKILL_BEGIN, ui, k) + end }) + -- end + elseif szType == 'NPC' then + for kk, vv in ipairs({ MY_TEAM_MON_TYPE.NPC_ENTER, MY_TEAM_MON_TYPE.NPC_LEAVE, MY_TEAM_MON_TYPE.NPC_ALLLEAVE, MY_TEAM_MON_TYPE.NPC_FIGHT, MY_TEAM_MON_TYPE.NPC_DEATH, MY_TEAM_MON_TYPE.NPC_ALLDEATH, MY_TEAM_MON_TYPE.NPC_LIFE, MY_TEAM_MON_TYPE.NPC_MANA }) do + table.insert(menu, { szOption = _L['Countdown TYPE ' .. vv], bMCheck = true, bChecked = v.nClass == vv, fnAction = function() + SetCountdownType(v, vv, ui, k) + end }) + end + elseif szType == 'DOODAD' then + for kk, vv in ipairs({ MY_TEAM_MON_TYPE.DOODAD_ENTER, MY_TEAM_MON_TYPE.DOODAD_LEAVE, MY_TEAM_MON_TYPE.DOODAD_ALLLEAVE }) do + table.insert(menu, { szOption = _L['Countdown TYPE ' .. vv], bMCheck = true, bChecked = v.nClass == vv, fnAction = function() + SetCountdownType(v, vv, ui, k) + end }) + end + elseif szType == 'TALK' then + table.insert(menu, { szOption = _L['Countdown TYPE ' .. MY_TEAM_MON_TYPE.TALK_MONITOR], bMCheck = true, bChecked = v.nClass == MY_TEAM_MON_TYPE.TALK_MONITOR, fnAction = function() + SetCountdownType(v, MY_TEAM_MON_TYPE.TALK_MONITOR, ui, k) + end }) + elseif szType == 'CHAT' then + table.insert(menu, { szOption = _L['Countdown TYPE ' .. MY_TEAM_MON_TYPE.CHAT_MONITOR], bMCheck = true, bChecked = v.nClass == MY_TEAM_MON_TYPE.CHAT_MONITOR, fnAction = function() + SetCountdownType(v, MY_TEAM_MON_TYPE.CHAT_MONITOR, ui, k) + end }) + end + end + return menu + end, + tip = { + render = function() + local szTip = GetFormatText(_L['Press CTRL click for advance menu'], 136) + if X.IsString(v.key) then + szTip = szTip .. GetFormatText('\n\nKEY: ' .. tostring(v.key), 136, 255, 255, 255) + end + return szTip, true + end, + position = X.UI.TIP_POSITION.LEFT_RIGHT, + }, + }):Pos('BOTTOMRIGHT') + -- 图标 + nX = ui:Append('Box', { + x = nX + 5, y = nY, w = 24, h = 24, icon = v.nIcon or nIcon, + onHover = function(bHover) this:SetObjectMouseOver(bHover) end, + onClick = function() + local box = this + X.UI.OpenIconPicker( + function(nIcon) + v.nIcon = nIcon + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + box:SetObjectIcon(nIcon) + end, + v.nIcon + ) + end, + }):Pos('BOTTOMRIGHT') + -- 队伍频道报警 + nX = ui:Append('WndCheckBox', { + x = nX + 5, y = nY - 2, text = _L['TC'], color = GetMsgFontColor('MSG_TEAM', true), checked = v.bTeamChannel, + onCheck = function(bCheck) + v.bTeamChannel = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + tip = { + render = _L['Raid talk warning'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):Pos('BOTTOMRIGHT') + -- 普通倒计时时间/分段倒计时 + ui:Append('WndEditBox', { + name = 'CountdownTime' .. k, + x = nX + 5, y = nY, w = 100, h = 25, + text = v.nTime, + color = (IsSimpleCountdown(v) or not select(2, ParseCountdown(v.nTime, v.nClass))) + and { 255, 255, 255 } + or { 255, 0, 0 }, + onChange = function(szNum) + v.nTime = tonumber(szNum) or szNum + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + local edit = ui:Children('#CountdownTime' .. k) + if szNum == '' then + return + end + if IsSimpleCountdown(v) then + if this:GetW() > 200 then + edit:Size(100, 25):Color(255, 255, 255) + ui:Children('#CountdownName' .. k):Visible(true):Text(v.szName or g_tStrings.CHAT_NAME) + end + else + local aCountdown, bError, bTrigger = ParseCountdown(szNum, v.nClass) + if aCountdown then + local tOperatorDesc = { + ['+'] = _L['(OPERATOR +)'], + ['-'] = _L['(OPERATOR -)'], + } + local xml = { GetFormatText(_L[bTrigger and 'Trigger preview' or 'Countdown preview'] .. '\n', 0, 255, 255, 0) } + for kk, vv in ipairs(aCountdown) do + table.insert(xml, GetFormatText( + ( + bTrigger + and (vv.nValue .. '%') + or X.FormatDuration(vv.nTime, 'SYMBOL', { mode = 'fixed-except-leading', maxUnit = 'minute', keepUnit = 'minute' }) + ) + .. (tOperatorDesc[vv.szOperator or ''] or '') + .. ' - ' + .. FilterCustomText(vv.szContent, '{$sender}', '{$receiver}') + .. (bTrigger and vv.nTime and (' (' .. vv.nTime .. 's)') or '') + .. ( + vv.szVoice + and ( + ' - [' .. _L['Voice'] .. ']' + .. (MY_TeamMon_VoiceAlarm.GetSlugRemark(vv.szVoice) or _L['Unknown voice']) + .. '(' .. vv.szVoice .. ')' + ) + or '' + ) + .. '\n' + )) + end + X.OutputTip(this, table.concat(xml), true) + else + HideTip() + end + if aCountdown and not bError then + edit:Color(255, 255, 255) + else + edit:Color(255, 0, 0) + end + if this:GetW() < 200 then + edit:Size(400, 25) + ui:Children('#CountdownName' .. k):Visible(false) + end + end + end, + tip = { + render = function() + local aText = {} + if v.nClass == MY_TEAM_MON_TYPE.NPC_LIFE or v.nClass == MY_TEAM_MON_TYPE.NPC_MANA then + table.insert(aText, _L['Life/mana statement.\n\nExample: 0.7-,Remain 70%;0.5-,Remain Half,2;0.01-,Almost empty,5']) + else + table.insert(aText, _L['Simple countdown time or multi countdown statement. Input pure number for simple countdown time, otherwise for multi countdown statement.\n\nMulti countdown example: 10,Countdown1;25,Countdown2;55,Countdown3\nExplain: Countdown1 finished will start Countdown2, so as Countdown3.']) + end + table.insert(aText, '\n\n') + table.insert(aText, _L['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called']) + table.insert(aText, '\n\n') + table.insert(aText, _L['Notice: spell timer starts with VO: means play voice while this part active.']) + return table.concat(aText) + end, + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + }) + -- 普通倒计时文本 + nX = ui:Append('WndEditBox', { + name = 'CountdownName' .. k, + x = nX + 5 + 100 + 5, y = nY, w = 295, h = 25, text = v.szName, + onChange = function(szName) + v.szName = szName + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + tip = { + render = _L['Simple countdown text'] .. '\n\n' .. _L['Notice: Pattern can be used here in order to skip sensitive word scan. Currently supports:\n1. {$B188} Buff name which id is 188\n2. {$S188} Skill name which id is 188\n3. {$N188} Npc name which template id is 188\n4. {$D188} Doodad name which template id is 188\n5. {$me} Self name\n6. {$sender} Sender name, likes caller name\n7. {$receiver} Receiver name, likes teammate be called'], + position = X.UI.TIP_POSITION.RIGHT_LEFT, + }, + placeholder = _L['Please input simple countdown text...'], + }):Pos('BOTTOMRIGHT') + -- 重复调用时间限制 + nX = ui:Append('WndEditBox', { + x = nX + 5, y = nY, w = 30, h = 25, + text = v.nRefresh, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(szNum) + v.nRefresh = tonumber(szNum) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + end, + tip = { + render = _L['Max repeat time\n\nWhen countdown get trigger again, the last countdown may get overwritten. This config is to sovle this problem, input time limit here to ensure in this time period, countdown will not be trigger again.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):Pos('BOTTOMRIGHT') + -- 删除按钮 + nX, nY = ui:Append('Image', { + x = nX + 5, y = nY, w = 26, h = 26, + image = file, imageFrame = 86, + onHover = function(bIn) + if bIn then + this:SetFrame(87) + else + this:SetFrame(86) + end + end, + onClick = function() + if v.nClass ~= -1 then + local nClass = v.key and MY_TEAM_MON_TYPE.COMMON or v.nClass + if data.dwID then + local szKey = v.key or (k .. '.' .. data.dwID .. '.' .. (data.nLevel or 0)) + FireUIEvent('MY_TEAM_MON__SPELL_TIMER__DEL', nClass, szKey) -- try kill + else + local szKey = v.key or (data.nIndex .. '.' .. k) + FireUIEvent('MY_TEAM_MON__SPELL_TIMER__DEL', nClass, szKey) -- try kill + end + end + if #data.tCountdown == 1 then + data.tCountdown = nil + else + table.remove(data.tCountdown, k) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + D.OpenSettingPanel(data, szType) + end, + }):Pos('BOTTOMRIGHT') + FormatElPosByCountdownType(v, ui, k) + end + nX, nY = ui:Append('WndButton', { + x = 30, y = nY + (X.IsEmpty(data.tCountdown) and 0 or 10), + text = _L['Add countdown'], + buttonStyle = 'FLAT', + enable = not (data.tCountdown and #data.tCountdown > 10), + onClick = function() + if not data.tCountdown then + data.tCountdown = {} + end + local szCountdown = _L['Countdown'] + local szPattern = GetPatternName() + if szPattern then + szCountdown = szCountdown .. ' ' .. szPattern + end + table.insert(data.tCountdown, { + nTime = 10, + szName = szCountdown, + nClass = -1, + nIcon = nIcon or 13, + }) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + D.OpenSettingPanel(data, szType) + end, + }):Pos('BOTTOMRIGHT') + end + -- 圈圈连线 + if (szType == 'NPC' or szType == 'DOODAD') and not X.IsRestricted('MY_TeamMon_CircleLine') then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Circle and line'], font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + nX = 30 + if szType == 'NPC' then + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, h = 25, text = _L['Only my employer'], + checked = data.bDrawOnlyMyEmployer, + onCheck = function(bCheck) + data.bDrawOnlyMyEmployer = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + 5 + end + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, h = 25, text = _L['Draw line'], + checked = data.bDrawLine, + onCheck = function(bCheck) + data.bDrawLine = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + 5 + if szType == 'NPC' then + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, h = 25, text = _L['Only when stare me'], + checked = data.bDrawLineOnlyStareMe, + onCheck = function(bCheck) + data.bDrawLineOnlyStareMe = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + 5 + end + nX, nY = ui:Append('WndCheckBox', { + x = nX, y = nY, h = 25, text = _L['Draw name'], + checked = data.bDrawName, + onCheck = function(bCheck) + data.bDrawName = bCheck and true or nil + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + -- 圈圈列表 + if not X.IsEmpty(data.aCircle) then + nY = nY + 10 + for k, circle in ipairs(data.aCircle) do + nX = ui:Append('Shadow', { + x = 35, y = nY + 3, w = 23, h = 23, + color = circle.col, + onClick = function() + local ui = X.UI(this) + X.UI.OpenColorPicker(function(r, g, b) + ui:Color(r, g, b) + circle.col = { r, g, b } + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end) + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndEditBox', { + x = nX + 5, y = nY + 2, w = 80, h = 26, text = circle.nAngle, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + circle.nAngle = tonumber(nNum) or 80 + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { x = nX, y = nY, text = _L['Degree'] }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndEditBox', { + x = nX + 10, y = nY + 2, w = 80, h = 26, text = circle.nRadius, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + circle.nRadius = tonumber(nNum) or 4 + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { x = nX, y = nY, text = _L['Meter'] }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndEditBox', { + x = nX + 10, y = nY + 2, w = 80, h = 26, text = circle.nAlpha, editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(nNum) + circle.nAlpha = tonumber(nNum) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { x = nX, y = nY, text = _L['Alpha'] }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndCheckBox', { + x = nX + 10, y = nY + 1, + text = _L['Draw Border'], + checked = circle.bBorder, + onCheck = function(bChecked) + circle.bBorder = bChecked + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + end, + }):Pos('BOTTOMRIGHT') + nX = ui:Append('Image', { + x = nX + 5, y = nY + 1, + w = 26, h = 26, + onHover = function(bIn) + if bIn then + this:SetFrame(87) + else + this:SetFrame(86) + end + end, + onClick = function() + if #data.aCircle == 1 then + data.aCircle = nil + else + table.remove(data.aCircle, k) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + D.OpenSettingPanel(data, szType) + end, + image = file, imageFrame = 86, + }):Pos('BOTTOMRIGHT') + nY = nY + 30 + end + nY = nY + 10 + end + nX = ui:Append('WndButton', { + x = 30, y = nY, + text = _L['Add circle'], + buttonStyle = 'FLAT', + enable = not (data.aCircle and #data.aCircle > 10), + onClick = function() + if not data.aCircle then + data.aCircle = {} + end + table.insert(data.aCircle, { + nAngle = 80, + nRadius = 4, + col = {0, 255, 0}, + bBorder = true, + }) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON__CIRCLE_LINE__RELOAD') + D.OpenSettingPanel(data, szType) + end, + }):Pos('BOTTOMRIGHT') + nY = nY + 35 + end + -- 焦点列表 + if MY_Focus then + if szType == 'NPC' or szType == 'DOODAD' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Focuslist'], font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + nX = 30 + for _, p in ipairs(data.aFocus or X.CONSTANT.EMPTY_TABLE) do + local uiBtn = ui:Append('WndButton', { + x = nX, y = nY, w = 100, + text = MY_Focus.FormatRuleText(p, true), + buttonStyle = 'FLAT', + onClick = function() + local ui = X.UI(this) + MY_Focus.OpenRuleEditor(p, function(dat) + if dat then + for k, v in pairs(dat) do + if k ~= 'szPattern' and k ~= 'szMethod' then + p[k] = v + end + end + ui:Text(MY_Focus.FormatRuleText(dat, true)) + else + for k, v in ipairs(data.aFocus) do + if v == p then + table.remove(data.aFocus, k) + break + end + end + D.OpenSettingPanel(data, szType) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, true) + end, + }) + nX = nX + uiBtn:Width() + 5 + if nX + 130 > nW then + nX = 30 + nY = nY + uiBtn:Height() + 3 + end + end + nY = nY + ui:Append('WndButton', { + x = nX, y = nY, w = 100, + text = _L['Add focus'], + buttonStyle = 'FLAT', + onClick = function() + if not data.aFocus then + data.aFocus = {} + end + table.insert(data.aFocus, {}) + D.OpenSettingPanel(data, szType) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, + }):Height() + 3 + end + end + -- 团队面板条件监控 + if MY_Cataclysm and not X.IsRestricted('MY_Cataclysm_BuffMonitor') then + if szType == 'BUFF' or szType == 'DEBUFF' then + local uiContainer = ui:Append('WndContainer', { x = 20, y = nY + CAPTION_MARGIN_TOP, w = nW - 20 * 2, h = 'auto', containerType = X.UI.WND_CONTAINER_STYLE.LEFT_TOP }) + uiContainer:Append('WndDummyWrapper'):Append('Text', { h = 25, alignVertical = 1, text = _L['Team panel buff rule list'], font = 27 }) + nY = nY + uiContainer:Height() + CAPTION_MARGIN_TOP + CAPTION_MARGIN_BOTTOM + + nX = 30 + for _, p in ipairs(data.aCataclysmBuff or X.CONSTANT.EMPTY_TABLE) do + local uiBtn = ui:Append('WndButton', { + x = nX, y = nY, w = 100, h = 28, + text = MY_Cataclysm.EncodeBuffRule(p, true), + buttonStyle = 'FLAT', + onClick = function() + local ui = X.UI(this) + MY_Cataclysm.OpenBuffRuleEditor(p, function(dat) + if dat then + for k, v in pairs(dat) do + if k ~= 'dwID' and k ~= 'nLevel' then + p[k] = v + end + end + ui:Text(MY_Cataclysm.EncodeBuffRule(dat, true)) + else + for k, v in ipairs(data.aCataclysmBuff) do + if v == p then + table.remove(data.aCataclysmBuff, k) + break + end + end + D.OpenSettingPanel(data, szType) + end + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, nil, true) + end, + }) + nX = nX + uiBtn:Width() + 5 + if nX + 130 > nW then + nX = 30 + nY = nY + uiBtn:Height() + 3 + end + end + nY = nY + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Add buff rule'], + buttonStyle = 'FLAT', + onClick = function() + if not data.aCataclysmBuff then + data.aCataclysmBuff = {} + end + table.insert(data.aCataclysmBuff, {}) + D.OpenSettingPanel(data, szType) + FireUIEvent('MY_TEAM_MON_DATA_MODIFY') + FireUIEvent('MY_TEAM_MON_DATA_RELOAD', { [szType] = true }) + end, + }):Height() + 3 + end + end + -- nX = ui:Append('WndButton', { + -- x = 640, y = nY + 10, text = g_tStrings.HELP_PANEL, + -- buttonStyle = 'FLAT', + -- onClick = function() + -- OpenInternetExplorer('https://github.com/luckyyyyy/JH/blob/master/JH_DBM/README.md') + -- end, + -- }):Pos('BOTTOMRIGHT') + ui:Append('WndButton', { + x = 335, y = nY + 10, + text = _L['Delete'], color = { 255, 0, 0 }, + buttonStyle = 'FLAT', + onClick = function() + X.Confirm(_L['Sure to delete?'], function() + D.RemoveData(data.dwMapID, data.nIndex, szName or _L['This data']) + end) + end, + }) + nY = nY + 40 + ui:Size(nW, nY + 25):Anchor(MY_TEAM_MON__UI__PANEL_ANCHOR) +end + +function D.UpdateAnchor(frame) + local a = MY_TEAM_MON__UI__ANCHOR + if not X.IsEmpty(a) then + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + else + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + end +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_TeamMon_UI') +end + +D.IsOpened = D.GetFrame + +function D.TogglePanel() + if D.IsOpened() then + D.ClosePanel() + else + D.OpenPanel() + end +end +function D.OpenPanel(szType) + if X.IsRestricted('MY_TeamMon') then + return + end + if not D.IsOpened() then + if szType then + MY_TEAM_MON__UI__SELECT_TYPE = szType + end + X.UI.CreateFrame('MY_TeamMon_UI', { + w = 1070, h = 685, + }) + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) + end +end + +function D.ClosePanel() + if D.IsOpened() then + FireUIEvent('MY_TEAM_MON__UI__FREE_CACHE') + X.UI.CloseFrame(D.GetFrame()) + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) + X.RegisterEsc('MY_TeamMon', false) + end +end + +X.RegisterEvent('MY_TEAM_MON__UI__FREE_CACHE', function() + MY_TEAM_MON__UI__SEARCH_CACHE = {} +end) +X.RegisterAddonMenu(function() + if X.IsRestricted('MY_TeamMon') then + return + end + return { szOption = _L['MY_TeamMon'], fnAction = D.TogglePanel } +end) +X.RegisterHotKey('MY_TeamMon_UI', _L['Open/close MY_TeamMon'], D.TogglePanel) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_UI', + exports = { + { + root = D, + preset = 'UIEvent' + }, + { + fields = { + OpenPanel = D.OpenPanel, + ClosePanel = D.ClosePanel, + IsOpened = D.GetFrame, + TogglePanel = D.TogglePanel, + OpenImportPanel = D.OpenImportPanel, + OpenExportPanel = D.OpenExportPanel, + }, + }, + }, +} +MY_TeamMon_UI = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_VoiceAlarm.lua b/MY_TeamMon/src/MY_TeamMon_VoiceAlarm.lua new file mode 100644 index 000000000..e30cc65a1 --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_VoiceAlarm.lua @@ -0,0 +1,703 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 语音报警 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_VoiceAlarm' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_VoiceAlarm' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_TeamMon_VoiceAlarm', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_VoiceAlarm'], + _L['Enable'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bPreferOfficial= { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_VoiceAlarm'], + _L['Prefer use official voice'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + dwOfficialVoicePacketID = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_VoiceAlarm'], + _L['OfficialVoicePacketID'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + szOfficialVoicePacketVersion = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.String, + xDefaultValue = '', + }, + dwCustomVoicePacketID = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamMon'], + szDescription = X.MakeCaption({ + _L['MY_TeamMon_VoiceAlarm'], + _L['CustomVoicePacketID'], + }), + szRestriction = 'MY_TeamMon', + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + szCustomVoicePacketVersion = { + ePathType = X.PATH_TYPE.ROLE, + xSchema = X.Schema.String, + xDefaultValue = '', + }, +}) +local D = {} +local MY_TEAM_MON_VA_VOICE_ROOT = X.FormatPath({'userdata/team_mon/audio/', X.PATH_TYPE.GLOBAL}) +local DOWNLOADER_CACHE = {} +local CACHE_FILE = {'temporary/team_mon/voice_alarm.jx3dat', X.PATH_TYPE.GLOBAL} + +CPath.MakeDir(MY_TEAM_MON_VA_VOICE_ROOT) + +local VOICE_PACKET_LIST_JSON_SCHEMA = X.Schema.Record({ + list = X.Schema.Collection(X.Schema.Record({ + id = X.Schema.Number, + title = X.Schema.String, + version = X.Schema.Number, + display_name = X.Schema.String, + update = X.Schema.String, + }, true)), + page = X.Schema.Record({ + index = X.Schema.Number, + pageSize = X.Schema.Number, + total = X.Schema.Number, + pageTotal = X.Schema.Number, + }, true), +}, true) + +local VOICE_LIST_JSON_SCHEMA = X.Schema.Record({ + data = X.Schema.Record({ + list = X.Schema.Collection(X.Schema.Record({ + id = X.Schema.Number, + slug = X.Schema.String, + filename = X.Schema.String, + group = X.Schema.String, + crc = X.Schema.Number, + }, true)), + vpk_id = X.Schema.Number, + vpk_uuid = X.Schema.String, + vpk_version = X.Schema.Number, + }, true) +}, true) + +local SLUG_LIST_JSON_SCHEMA = X.Schema.Record({ + data = X.Schema.Collection(X.Schema.Record({ + id = X.Schema.Number, + group = X.Schema.String, + group_name = X.Schema.String, + is_official = X.Schema.Number, + slug = X.Schema.String, + remark = X.Schema.String, + }, true)), +}, true) + +function D.SaveCache() + X.SaveLUAData(CACHE_FILE, { + aSlugGroup = D.aSlugGroup, + dwOfficialVoicePacketID = D.dwOfficialVoicePacketID, + tOfficialPacketInfo = D.tOfficialPacketInfo, + tOfficialVoiceCache = D.tOfficialVoiceCache, + dwCustomVoicePacketID = D.dwCustomVoicePacketID, + tCustomPacketInfo = D.tCustomPacketInfo, + tCustomVoiceCache = D.tCustomVoiceCache, + }) +end + +function D.LoadCache() + local cache = X.LoadLUAData(CACHE_FILE) + if not cache then + return + end + D.aSlugGroup = cache.aSlugGroup + D.dwOfficialVoicePacketID = cache.dwOfficialVoicePacketID + D.tOfficialPacketInfo = cache.tOfficialPacketInfo + D.tOfficialVoiceCache = cache.tOfficialVoiceCache + D.dwCustomVoicePacketID = cache.dwCustomVoicePacketID + D.tCustomPacketInfo = cache.tCustomPacketInfo + D.tCustomVoiceCache = cache.tCustomVoiceCache +end + +function D.FetchPacketList(szType, nPage) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + return X.Promise:new(function(resolve, reject) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + is_official = szType == 'OFFICIAL' and 1 or 0, + pageIndex = nPage, + pageSize = 15, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local res = X.IsTable(res) and res.data + local errs = X.Schema.CheckSchema(res, VOICE_PACKET_LIST_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, i .. '. ' .. err.message) + end + local szErrmsg = _L['Fetch repo meta list failed.'] .. '\n' .. table.concat(aErrmsg, '\n') + X.OutputDebugMessage(_L['MY_TeamMon_VoiceAlarm'], szErrmsg, X.DEBUG_LEVEL.WARNING) + reject(X.Error:new(szErrmsg)) + return + end + local tPagination = { + nIndex = res.page.index, + nSize = res.page.pageSize, + nTotal = res.page.total, + nPageTotal = res.page.pageTotal, + } + local aPacket = {} + for _, info in ipairs(res.list) do + table.insert(aPacket, { + dwID = info.id, + szUUID = info.uuid, + szTitle = info.title, + szVersion = tostring(info.version), + szAuthor = info.display_name, + szUpdateTime = info.update, + }) + end + resolve({ tPagination = tPagination, aPacket = aPacket }) + end, + }) + end) +end + +function D.SetCurrentPacketID(szType, dwID) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + if szType == 'OFFICIAL' then + O.dwOfficialVoicePacketID = dwID + else + O.dwCustomVoicePacketID = dwID + end + if dwID ~= 0 then + D.DownloadPacket(szType) + :Then(function() + if szType == 'OFFICIAL' and not O.bPreferOfficial then + X.Confirm(_L['Official voice packet download success, but your settings prefer use custom voice packet, do you want to change it?'], function() + O.bPreferOfficial = true + end) + elseif szType == 'CUSTOM' and O.bPreferOfficial then + X.Confirm(_L['Custom voice packet download success, but your settings prefer use official voice packet, do you want to change it?'], function() + O.bPreferOfficial = false + end) + end + end) + end + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE', szType, dwID) +end + +function D.GetCurrentPacketID(szType) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + if szType == 'OFFICIAL' then + return O.dwOfficialVoicePacketID, O.szOfficialVoicePacketVersion + else + return O.dwCustomVoicePacketID, O.szCustomVoicePacketVersion + end +end + +function D.GetCurrentPacketUUID(szType) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + if szType == 'OFFICIAL' then + return D.tOfficialPacketInfo and D.tOfficialPacketInfo.szUUID or '' + else + return D.tCustomPacketInfo and D.tCustomPacketInfo.szUUID or '' + end +end + +function D.FetchSlugList() + return X.Promise:new(function(resolve, reject) + if D.aSlugGroup then + resolve(D.aSlugGroup) + return + end + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk/slugs', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local errs = X.Schema.CheckSchema(res, SLUG_LIST_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, i .. '. ' .. err.message) + end + local szErrmsg = _L['Fetch repo meta list failed.'] .. '\n' .. table.concat(aErrmsg, '\n') + X.OutputDebugMessage(_L['MY_TeamMon_VoiceAlarm'], szErrmsg, X.DEBUG_LEVEL.WARNING) + reject(X.Error:new(szErrmsg)) + return + end + local aSlugGroup, tSlugGroup = {}, {} + for _, slug in ipairs(res.data) do + if not tSlugGroup[slug.group] then + tSlugGroup[slug.group] = { + bOfficial = slug.is_official == 1, + szGroupID = slug.group, + szGroupName = slug.group_name, + } + table.insert(aSlugGroup, tSlugGroup[slug.group]) + end + table.insert(tSlugGroup[slug.group], { + dwID = slug.id, + szSlug = slug.slug, + szRemark = slug.remark, + }) + end + table.sort(aSlugGroup, function(g1, g2) + if g1.bOfficial and not g2.bOfficial then + return true + end + return false + end) + D.aSlugGroup = aSlugGroup + D.SaveCache() + resolve(aSlugGroup) + end, + }) + end) +end + +function D.GetSlugList(szType) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM' or X.IsNil(szType), 'Invalid type: ' .. tostring(szType)) + local aSlugGroup = {} + for _, tSlugGroup in ipairs(D.aSlugGroup) do + if (szType == 'OFFICIAL' and tSlugGroup.bOfficial) + or szType == 'CUSTOM' or X.IsNil(szType) then + table.insert(aSlugGroup, X.Clone(tSlugGroup)) + end + end + return aSlugGroup +end + +function D.GetSlugRemark(szSlug) + for _, tSlugGroup in ipairs(D.aSlugGroup) do + for _, v in ipairs(tSlugGroup) do + if v.szSlug == szSlug then + return v.szRemark + end + end + end +end + +function D.FetchVoiceList(szType, bDownload) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + return X.Promise:new(function(resolve, reject) + if szType == 'OFFICIAL' and O.dwOfficialVoicePacketID == 0 then + reject(X.Error:new(_L['No official voice packet selected.'])) + return + end + if szType == 'CUSTOM' and O.dwCustomVoicePacketID == 0 then + reject(X.Error:new(_L['No custom voice packet selected.'])) + return + end + if not bDownload then + if szType == 'OFFICIAL' and D.tOfficialPacketInfo + and D.tOfficialPacketInfo.dwID == O.dwOfficialVoicePacketID then + resolve(X.Clone(D.tOfficialPacketInfo)) + return + end + if szType == 'CUSTOM' and D.tCustomPacketInfo + and D.tCustomPacketInfo.dwID == O.dwCustomVoicePacketID then + resolve(X.Clone(D.tCustomPacketInfo)) + return + end + end + local dwPacketID = szType == 'OFFICIAL' and O.dwOfficialVoicePacketID or O.dwCustomVoicePacketID + X.Ajax({ + url = bDownload + and MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk/voices/d' + or MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk/voices', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + id = dwPacketID, + }, + signature = X.SECRET['J3CX::TEAM_MON_VOICES_DOWNLOAD'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local errs = X.Schema.CheckSchema(res, VOICE_LIST_JSON_SCHEMA) + if errs then + local aErrmsg = {} + for i, err in ipairs(errs) do + table.insert(aErrmsg, i .. '. ' .. err.message) + end + local szErrmsg = _L['Fetch repo meta list failed.'] .. '\n' .. table.concat(aErrmsg, '\n') + X.OutputDebugMessage(_L['MY_TeamMon_VoiceAlarm'], szErrmsg, X.DEBUG_LEVEL.WARNING) + reject(X.Error:new(szErrmsg)) + return + end + local aVoice = {} + for _, info in ipairs(res.data.list) do + table.insert(aVoice, { + dwID = info.id, + szSlug = info.slug, + szURL = info.filename, + szGroup = info.group, + dwCRC = info.crc, + }) + end + local tInfo = { + dwID = res.data.vpk_id, + szUUID = res.data.vpk_uuid, + szName = tostring(res.data.vpk_name or res.data.name or ''), + szVersion = tostring(res.data.vpk_version), + aVoice = aVoice, + } + local tVoiceCache = {} + for _, info in ipairs(aVoice) do + tVoiceCache[info.szSlug] = info + end + if szType == 'OFFICIAL' then + D.tOfficialPacketInfo = tInfo + D.tOfficialVoiceCache = tVoiceCache + else + D.tCustomPacketInfo = tInfo + D.tCustomVoiceCache = tVoiceCache + end + D.SaveCache() + resolve(X.Clone(tInfo)) + end, + error = function(html, status) + reject(X.Error:new('Fetch voice list failed: ' .. tostring(status) .. ' ' .. tostring(html))) + end + }) + end) +end + +function D.DownloadPacket(szType) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + local dwPacketID = szType == 'OFFICIAL' and O.dwOfficialVoicePacketID or O.dwCustomVoicePacketID + if DOWNLOADER_CACHE[dwPacketID] then + return DOWNLOADER_CACHE[dwPacketID] + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'DownloadPacket ' .. szType .. ' ' .. dwPacketID, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + DOWNLOADER_CACHE[dwPacketID] = X.ProgressPromise:new(function(resolve, reject, progress) + if dwPacketID == 0 then + if szType == 'OFFICIAL' then + O.szOfficialVoicePacketVersion = '' + D.dwOfficialVoicePacketID = nil + D.tOfficialPacketInfo = nil + D.tOfficialVoiceCache = nil + else + O.szCustomVoicePacketVersion = '' + D.dwCustomVoicePacketID = nil + D.tCustomPacketInfo = nil + D.tCustomVoiceCache = nil + end + DOWNLOADER_CACHE[dwPacketID] = nil + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS', dwPacketID) + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_FILE_SUCCESS') + resolve() + return + end + D.FetchVoiceList(szType, true) + :Then(function(tInfo) + local aVoice = tInfo.aVoice + if X.ENVIRONMENT.SOUND_DRIVER == 'WWISE' and tInfo.szName ~= '' then + aVoice = {} + end + local tProgress = {} + for _, voice in ipairs(aVoice) do + tProgress[voice.dwID] = 0 + end + local function SetProgress(dwID, nProgress) + tProgress[dwID] = nProgress + local nTotal = 0 + local nAlready = 0 + for _, n in pairs(tProgress) do + nTotal = nTotal + 1 + nAlready = nAlready + n + end + progress(nAlready / nTotal) + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS', dwPacketID) + end + local szRoot = MY_TEAM_MON_VA_VOICE_ROOT .. dwPacketID .. '/' + CPath.MakeDir(szRoot) + + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'DownloadPacket ' .. szType .. ' (ID' .. dwPacketID .. ') ' .. #aVoice .. ' voices', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + + local function FetchNext() + local voice = table.remove(aVoice) + if not voice then + if szType == 'OFFICIAL' then + O.szOfficialVoicePacketVersion = tInfo.szVersion + else + O.szCustomVoicePacketVersion = tInfo.szVersion + end + DOWNLOADER_CACHE[dwPacketID] = nil + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_PROGRESS', dwPacketID) + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_FILE_SUCCESS') + resolve() + return + end + local szKey = voice.dwID + local szURL = voice.szURL + local szPath = szRoot .. szKey .. '.ogg' + if IsLocalFileExist(szPath) and GetFileCRC(szPath) == voice.dwCRC then + SetProgress(szKey, 1) + FetchNext() + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'DownloadPacket Voice ' .. szURL .. ' to ' .. szPath, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + X.DownloadFile(szURL, szPath) + :Then(function() + SetProgress(szKey, 1) + FireUIEvent('MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_FILE_SUCCESS') + FetchNext() + end) + :Catch(function(err) + reject(err) + end) + :Progress(function(nTotal, nAlready) + SetProgress(szKey, nAlready / nTotal) + end) + end + FetchNext() + end) + :Catch(function(error) + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'DownloadPacket ERROR ' .. szType .. ' ' .. dwPacketID .. '\n' .. error.message, X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + return X.Promise.Reject(error) + end) + end) + return DOWNLOADER_CACHE[dwPacketID] +end + +function D.GetPacketDownloadProgress(dwID) + local oPromise = DOWNLOADER_CACHE[dwID] + if oPromise then + return oPromise.progress or 0 + end +end + +function D.PlayVoice(szType, szSlug) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + -- 根据优先级获取要播放的语音条目 + local tVoiceInfo = X.IIf(szType == 'OFFICIAL', D.tOfficialPacketInfo, D.tCustomPacketInfo) + local tVoiceCache = X.IIf(szType == 'OFFICIAL', D.tOfficialVoiceCache, D.tCustomVoiceCache) + local dwPacketID = szType == 'OFFICIAL' and O.dwOfficialVoicePacketID or O.dwCustomVoicePacketID + local voice = tVoiceCache and tVoiceCache[szSlug] + if not voice or dwPacketID == 0 then + tVoiceInfo = X.IIf(szType ~= 'OFFICIAL', D.tOfficialPacketInfo, D.tCustomPacketInfo) + tVoiceCache = X.IIf(szType ~= 'OFFICIAL', D.tOfficialVoiceCache, D.tCustomVoiceCache) + dwPacketID = szType ~= 'OFFICIAL' and O.dwOfficialVoicePacketID or O.dwCustomVoicePacketID + voice = tVoiceCache and tVoiceCache[szSlug] + if not voice or dwPacketID == 0 then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'PlayVoice ERROR ' .. szType .. ' ' .. szSlug .. ' ' .. ' voice not found', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + return + end + end + -- WWISE 引擎下官方语音走 WWISE 事件播放 + if X.ENVIRONMENT.SOUND_DRIVER == 'WWISE' and tVoiceInfo == D.tOfficialPacketInfo and tVoiceInfo and tVoiceInfo.szName ~= '' then + PlaySound(SOUND.UI_SOUND, 'UserPluginAudio_Interface' .. tVoiceInfo.szName .. '_' .. szSlug) + return + end + -- 其他情况走普通播放 + local szPath = MY_TEAM_MON_VA_VOICE_ROOT .. dwPacketID .. '/' .. voice.dwID .. '.ogg' + local dwCRC = GetFileCRC(szPath) + if dwCRC ~= voice.dwCRC then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_TeamMon_VoiceAlarm', 'PlayVoice ERROR ' .. szType .. ' ' .. szSlug .. ' ' .. szPath .. ' CRC mismatch ' .. tostring(dwCRC) .. ' ~= ' .. voice.dwCRC, X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + return + end + X.PlaySound(SOUND.UI_SOUND, szPath, false) +end + +function D.IsVoiceExist(szType, szSlug) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + local tVoiceCache = X.IIf(szType == 'OFFICIAL', D.tOfficialVoiceCache, D.tCustomVoiceCache) + local voice = tVoiceCache and tVoiceCache[szSlug] + return voice ~= nil +end + +function D.ShowVoiceRecommendation(szOfficialVoicePacketUUID, szCustomVoicePacketUUID) + local dwOfficialVoicePacketID, szOfficialVoicePacketName + local dwCustomVoicePacketID, szCustomVoicePacketName + local function CheckConfirm() + if not X.IsEmpty(szOfficialVoicePacketUUID) and not dwOfficialVoicePacketID then + return + end + if not X.IsEmpty(szCustomVoicePacketUUID) and not dwCustomVoicePacketID then + return + end + local szName = '' + if szOfficialVoicePacketName and szOfficialVoicePacketName ~= D.GetCurrentPacketUUID('OFFICIAL') then + szName = szOfficialVoicePacketName + end + if szCustomVoicePacketName and szCustomVoicePacketName ~= D.GetCurrentPacketUUID('CUSTOM') then + if szName ~= '' then + szName = szName .. _L.AND_COMMA + end + szName = szName .. szCustomVoicePacketName + end + X.Confirm(_L('Current loaded data recommend voice packet %s, do you want to download and use?', szName), function() + if dwOfficialVoicePacketID then + D.SetCurrentPacketID('OFFICIAL', dwOfficialVoicePacketID) + end + if dwCustomVoicePacketID then + D.SetCurrentPacketID('CUSTOM', dwCustomVoicePacketID) + end + end) + end + if not X.IsEmpty(szOfficialVoicePacketUUID) then + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + uuid = szOfficialVoicePacketUUID, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local res = X.IsTable(res) and res.data + local errs = X.Schema.CheckSchema(res, VOICE_PACKET_LIST_JSON_SCHEMA) + if errs then + return + end + if res.list[1] and res.list[1].is_official == 1 then + dwOfficialVoicePacketID = res.list[1].id + szOfficialVoicePacketName = res.list[1].title + end + CheckConfirm() + end, + }) + end + if not X.IsEmpty(szCustomVoicePacketUUID) then + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/team-monitor/vpk', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + uuid = szCustomVoicePacketUUID, + }, + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + local res = X.IsTable(res) and res.data + local errs = X.Schema.CheckSchema(res, VOICE_PACKET_LIST_JSON_SCHEMA) + if errs then + return + end + if res.list[1] and res.list[1].is_official == 0 then + dwCustomVoicePacketID = res.list[1].id + szCustomVoicePacketName = res.list[1].title + end + CheckConfirm() + end, + }) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_VoiceAlarm', + exports = { + { + root = D, + fields = { + 'FetchPacketList', + 'SetCurrentPacketID', + 'GetCurrentPacketID', + 'GetCurrentPacketUUID', + 'GetPacketDownloadProgress', + 'GetSlugList', + 'PlayVoice', + 'IsVoiceExist', + 'GetSlugRemark', + 'ShowVoiceRecommendation', + }, + preset = 'UIEvent' + }, + { + fields = { + 'bEnable', + 'bPreferOfficial', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bPreferOfficial', + }, + triggers = { + bEnable = D.CheckEnable, + }, + root = O, + }, + }, +} +MY_TeamMon_VoiceAlarm = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterInit('MY_TeamMon_VoiceAlarm', function() + D.FetchSlugList() + D.FetchVoiceList('OFFICIAL') + D.FetchVoiceList('CUSTOM') +end) + +X.RegisterEvent('MY_TEAM_MON__VOICE_ALARM', 'MY_TeamMon_VoiceAlarm', function() + D.PlayVoice(O.bPreferOfficial and 'OFFICIAL' or 'CUSTOM', arg0) +end) + +D.LoadCache() + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/src/MY_TeamMon_VoiceAlarm_Previewer.lua b/MY_TeamMon/src/MY_TeamMon_VoiceAlarm_Previewer.lua new file mode 100644 index 000000000..865c7786a --- /dev/null +++ b/MY_TeamMon/src/MY_TeamMon_VoiceAlarm_Previewer.lua @@ -0,0 +1,133 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 语音报警 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamMon/MY_TeamMon_VoiceAlarm_Previewer' +local PLUGIN_NAME = 'MY_TeamMon' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamMon_VoiceAlarm_Previewer' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- + +local D = {} + +function D.Open(szType) + assert(szType == 'OFFICIAL' or szType == 'CUSTOM', 'Invalid type: ' .. tostring(szType)) + X.UI.CloseFrame('MY_TeamMon_VoiceAlarm_Previewer') + local ui = X.UI.CreateFrame('MY_TeamMon_VoiceAlarm_Previewer', { + w = 400, h = 620, anchor = 'CENTER', + text = szType == 'OFFICIAL' and _L['Preview official voice'] or _L['Preview custom voice'], + events = { + { + 'MY_TEAM_MON__VOICE_ALARM__CURRENT_PACKET_UPDATE', + function() + X.DelayCall('MY_TeamMon_VoiceAlarm_Previewer', 10, function() D.Open(szType) end) + end, + }, + { + 'MY_TEAM_MON__VOICE_ALARM__DOWNLOAD_FILE_SUCCESS', + function() + X.DelayCall('MY_TeamMon_VoiceAlarm_Previewer', 10, function() D.Open(szType) end) + end, + }, + }, + }) + ui:Raw():GetRoot().szType = szType + + local aDataSource = {} + for _, tGroup in ipairs(MY_TeamMon_VoiceAlarm.GetSlugList(szType)) do + table.insert(aDataSource, { szType = 'group', szGroupName = tGroup.szGroupName }) + for _, tSlug in ipairs(tGroup) do + table.insert(aDataSource, { szType = 'slug', szRemark = tSlug.szRemark, szSlug = tSlug.szSlug }) + end + end + ui:Append('WndTable', { + name = 'WndTable_Preview', + x = 20, y = 60, w = 360, h = 530, + columns = { + { + key = 'title', + title = _L['Voice title'], + alignHorizontal = 'left', + width = 200, + render = function(value, record, index) + if record.szType == 'group' then + return GetFormatText(' + ' .. record.szGroupName, 162, 192, 192, 0) + end + local r, g, b = 255, 255, 255 + if not MY_TeamMon_VoiceAlarm.IsVoiceExist(szType, record.szSlug) then + r, g, b = 128, 128, 128 + end + return GetFormatText(' ' .. record.szRemark, 162, r, g, b, 277, 'this.szSlug = ' .. X.EncodeLUAData(record.szSlug), 'Text_Preview_Title') + end, + }, + { + key = 'preview', + title = _L['Voice preview'], + alignHorizontal = 'center', + width = 160, + render = function(value, record, index) + if record.szType == 'group' then + return '' + end + if not MY_TeamMon_VoiceAlarm.IsVoiceExist(szType, record.szSlug) then + return GetFormatText(_L['Not exist'], 162, 128, 128, 128) + end + return GetFormatText(_L['Click to play'], 162, nil, nil, nil, 277, 'this.szSlug = ' .. X.EncodeLUAData(record.szSlug), 'Text_Preview_Play') + end, + }, + }, + rowTip = { + render = function(rec) + if not MY_TeamMon_VoiceAlarm.IsVoiceExist(szType, rec.szSlug) then + return GetFormatText(_L['Voice not exist in current packet'], 162, 255, 255, 0), true + end + return rec.szSlug + end, + position = X.UI.TIP_POSITION.LEFT_RIGHT, + }, + dataSource = aDataSource, + }) +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Text_Preview_Play' then + MY_TeamMon_VoiceAlarm.PlayVoice(this:GetRoot().szType, this.szSlug) + elseif name == 'Text_Preview_Title' then + SetDataToClip(this.szSlug) + MY.OutputAnnounceMessage(_L['Voice slug name has been copied to clipboard']) + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamMon_VoiceAlarm_Previewer', + exports = { + { + root = D, + fields = { + 'Open', + }, + preset = 'UIEvent' + }, + }, +} +MY_TeamMon_VoiceAlarm_Previewer = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamMon/ui/MY_TeamMon.ini b/MY_TeamMon/ui/MY_TeamMon.ini new file mode 100644 index 000000000..a7eb0790a --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon.ini @@ -0,0 +1,15 @@ +[MY_TeamMon] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +LockShowAndHide=1 +BreatheWhenHide=1 + diff --git a/MY_TeamMon/ui/MY_TeamMon_BuffList.ini b/MY_TeamMon/ui/MY_TeamMon_BuffList.ini new file mode 100644 index 000000000..a6e9e76aa --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_BuffList.ini @@ -0,0 +1,156 @@ +[MY_TeamMon_BuffList] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=440 +Height=90 +MousePenetrable=1 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_List] +._Parent=MY_TeamMon_BuffList +._WndType=Handle +Left=0 +Top=0 +Width=440 +Height=90 +HandleType=3 +PosType=0 +RowSpacing=0 + +[Handle_Item] +._Parent=Handle_List +._WndType=Handle +Width=55 +Height=90 +HandleType=0 +FirstItemPosType=1 +PosType=8 + +[Text_Time] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=55 +Height=16 +FontScheme=40 +AutoEtc=1 +ShowAll=0 +MlAutoAdj=0 +HAlign=1 +VAlign=1 +CenterEachRow=0 +$Text= + +[Box] +._WndType=Box +._Parent=Handle_Item +Left=0 +Top=17 +IconID=13 +PosType=0 +Width=55 +Height=55 +EventID=288 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=55 +Height=16 +FontScheme=40 +AutoEtc=1 +ShowAll=0 +MlAutoAdj=0 +HAlign=1 +VAlign=1 +CenterEachRow=0 +$Text= + +[Animate_Update] +._WndType=Animate +._Parent=Handle_Item +Image=ui\Image\Common\Box.UITex +Group=17 +LoopCount=-1 +Left=-1 +Top=16 +PosType=0 +Width=56 +Height=56 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TeamMon_BuffList +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text= +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +OrgText=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_CenterAlarm.ini b/MY_TeamMon/ui/MY_TeamMon_CenterAlarm.ini new file mode 100644 index 000000000..3829efa3e --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_CenterAlarm.ini @@ -0,0 +1,105 @@ +[MY_TeamMon_CenterAlarm] +._WndType=WndFrame +._Parent=Normal1 +Left=0 +Top=0 +Width=480 +Height=53 +DummyWnd=1 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +RenderEvent=1 +DisableBreath=1 + +[Handle_Total] +._Parent=MY_TeamMon_CenterAlarm +._WndType=Handle +Left=0 +Top=0 +Width=480 +Height=53 +HandleType=0 +FirstItemPosType=2 +PosType=0 + +[Image_Bg] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel4.UITex +Frame=1 +Alpha=255 +Left=0 +Top=0 +PosType=0 + +[MessageBox] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +HandleType=3 +FirstItemPosType=2 +PosType=0 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TeamMon_CenterAlarm +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text= +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +OrgText=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_FullScreenAlarm.ini b/MY_TeamMon/ui/MY_TeamMon_FullScreenAlarm.ini new file mode 100644 index 000000000..91d29503c --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_FullScreenAlarm.ini @@ -0,0 +1,29 @@ +[MY_TeamMon_FullScreenAlarm] +._WndType=WndFrame +._Parent=Topmost2 +Left=0 +Top=0 +Width=0 +Height=0 +DummyWnd=1 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +RenderEvent=1 +DisableBreath=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamMon_FullScreenAlarm + +[Handle_Item] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + diff --git a/MY_TeamMon/ui/MY_TeamMon_LargeTextAlarm.ini b/MY_TeamMon/ui/MY_TeamMon_LargeTextAlarm.ini new file mode 100644 index 000000000..7f679ce4c --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_LargeTextAlarm.ini @@ -0,0 +1,95 @@ +[MY_TeamMon_LargeTextAlarm] +._WndType=WndFrame +._Parent=Topmost +Left=0 +Top=0 +Width=600 +Height=150 +IsCustomDragable=1 +DisableBreath=1 +MousePenetrable=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamMon_LargeTextAlarm +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=600 +Height=150 + +[Text_Total] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=600 +Height=150 +HAlign=1 +VAlign=1 +FontScheme=19 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TeamMon_LargeTextAlarm +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text= +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 diff --git a/MY_TeamMon/ui/MY_TeamMon_PartyBuffList.ini b/MY_TeamMon/ui/MY_TeamMon_PartyBuffList.ini new file mode 100644 index 000000000..38a0752ae --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_PartyBuffList.ini @@ -0,0 +1,241 @@ +[MY_TeamMon_PartyBuffList] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=200 +Height=60 +DragAreaWidth=200 +DragAreaHeight=30 +IsCustomDragable=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamMon_PartyBuffList +HandleType=0 +FirstItemPosType=0 +PosType=10 + +[Image_Bg] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\MapMark.UITex +Frame=74 +Alpha=255 +PosType=0 +Width=200 +Height=60 +ImageType=10 +Left=0 +Top=0 + +[Image_Title] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\MapMark.UITex +Frame=77 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=200 +Height=30 + +[Text_Title] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=120 +$Text=MY_TeamMon_PartyBuffList +Left=33 +Top=5 +PosType=0 +FontScheme=41 +VAlign=1 +HAlign=0 +Height=20 +OrgText=1 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=30 +HandleType=3 +FirstItemPosType=1 +PosType=0 +Width=200 +Height=40 +EventID=257 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_List +Left=0 +Top=0 +Width=200 +Height=40 +HandleType=0 +LockShowAndHide=1 +EventID=257 + +[Image_life] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\Common\money.uitex +Frame=213 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=1 +Width=200 +Height=40 + +[Image_KungFu] +._WndType=Image +._Parent=Handle_Item +Alpha=255 +Left=4 +Top=4 +PosType=0 +ImageType=10 +Width=32 +Height=32 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=40 +Top=0 +PosType=0 +FontScheme=40 +VAlign=1 +HAlign=0 +Height=40 +Width=110 +MlAutoAdj=0 +AutoEtc=1 +ShowAll=0 + +[Image_Select] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\Common\TempBox.UITex +Frame=5 +Alpha=120 +Left=0 +Top=0 +PosType=0 +ImageType=0 +Width=200 +Height=39 +LockShowAndHide=1 + +[Box_Icon] +._WndType=Box +._Parent=Handle_Item +Left=164 +Top=4 +Width=32 +Height=32 + +[Btn_Close] +._WndType=WndButton +._Parent=MY_TeamMon_PartyBuffList +Frame=0 +Left=170 +Top=5 +Alpha=255 +$Tip=STR_CLOSE +OrgTip=0 +Width=30 +Height=30 +NormalGroup=43 +MouseOverGroup=44 +MouseDownGroup=45 +DisableGroup=42 +Image=ui\Image\UICommon\CommonPanel.UITex +DummyWnd=0 + +[Btn_Style] +._WndType=WndButton +._Parent=MY_TeamMon_PartyBuffList +Frame=0 +Left=5 +Top=6 +Alpha=200 +Width=18 +Height=18 +$Tip=STR_TITLE_MESLINE_SETTINGS +OrgTip=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +NormalGroup=40 +MouseOverGroup=41 +MouseDownGroup=42 +DisableGroup=43 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TeamMon_PartyBuffList +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text= +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +OrgText=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_SpellTimer.ini b/MY_TeamMon/ui/MY_TeamMon_SpellTimer.ini new file mode 100644 index 000000000..e18550574 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_SpellTimer.ini @@ -0,0 +1,183 @@ +[MY_TeamMon_SpellTimer] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=332 +Height=32 +DummyWnd=1 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamMon_SpellTimer +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +HandleType=3 +FirstItemPosType=1 +Left=0 +Top=0 +PosType=0 +Width=0 +Height=0 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_List +HandleType=0 +FirstItemPosType=0 +PosType=8 +Width=332 +Height=33 +LockShowAndHide=1 + +[Shadow] +._WndType=Shadow +._Parent=Handle_Item +Alpha=80 +Left=32 +Top=0 +PosType=0 +Width=0 +Height=32 +color=black +ShadowColor= + +[Image] +._WndType=Image +._Parent=Handle_Item +Image=interface\MY\MY_TeamMon\img\ST.UITex +Frame=0 +Alpha=180 +Left=32 +Top=0 +PosType=0 +Width=300 +Height=32 +ImageType=1 + +[Box] +._WndType=Box +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +Width=32 +Height=32 +IconID=0 + +[TimeLeft] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=5" +Left=0 +Top=1 +PosType=0 +OrgText=1 +HAlign=2 +VAlign=1 +FontScheme=16 +Width=324 +Height=32 + +[SkillName] +._WndType=Text +._Parent=Handle_Item +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Name +Left=40 +Top=1 +PosType=0 +OrgText=1 +HAlign=0 +VAlign=1 +FontScheme=16 +Width=300 +Height=32 + +[SFX] +._WndType=SFX +._Parent=Handle_Item +Left=330 +Top=16 +PosType=0 +SFXFile=data\source\other\新特效\其他\Pss\N_怒气充满.pss +Loop=1 +Angle=1.600000 +Scale=0.200000 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_TeamMon_SpellTimer +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +FontScheme=41 +PosType=0 +HAlign=1 +VAlign=1 + diff --git a/MY_TeamMon/ui/MY_TeamMon_Subscribe_Data.ini b/MY_TeamMon/ui/MY_TeamMon_Subscribe_Data.ini new file mode 100644 index 000000000..4bc19800c --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_Subscribe_Data.ini @@ -0,0 +1,652 @@ +[MY_TeamMon_Subscribe_Data] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamMon_Subscribe_Data +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break1] +._WndType=Image +._Parent=Handle_Total +Left=120 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break1] +._WndType=Text +._Parent=Handle_Total +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Author +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +EventID=512 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=120 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=550 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[Text_Page] +._WndType=Text +._Parent=Handle_Total +Left=557 +Top=529 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=192 +$Text=1 / 100 +OrgText=1 +FontScheme=18 +HAlign=2 +VAlign=1 +Width=140 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Author] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=120 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=130 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=530 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_SyncTeam] +._WndType=WndButton +._Parent=Wnd_Total +Left=24 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_SyncTeam] +._WndType=Handle +._Parent=Btn_SyncTeam +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_SyncTeam] +._WndType=Text +._Parent=Handle_SyncTeam +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=SYNC TEAM + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=180 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + +[Btn_PrevPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=739 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_PrevPage] +._WndType=Handle +._Parent=Btn_PrevPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_PrevPage] +._WndType=Text +._Parent=Handle_PrevPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREV PAGE + +[Btn_NextPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=861 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_NextPage] +._WndType=Handle +._Parent=Btn_NextPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_NextPage] +._WndType=Text +._Parent=Handle_NextPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=NEXT PAGE + diff --git a/MY_TeamMon/ui/MY_TeamMon_Subscribe_FavoriteData.ini b/MY_TeamMon/ui/MY_TeamMon_Subscribe_FavoriteData.ini new file mode 100644 index 000000000..5d08a989c --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_Subscribe_FavoriteData.ini @@ -0,0 +1,694 @@ +[MY_TeamMon_SubscribeUI] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamMon_SubscribeUI +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break1] +._WndType=Image +._Parent=Handle_Total +Left=120 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break1] +._WndType=Text +._Parent=Handle_Total +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Author +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +EventID=512 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=120 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=550 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Author] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=120 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=130 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=530 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_AddUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=30 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_AddUrl] +._WndType=Handle +._Parent=Btn_AddUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_AddUrl] +._WndType=Text +._Parent=Handle_AddUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=ADD FAV + +[Btn_RemoveUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=180 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_RemoveUrl] +._WndType=Handle +._Parent=Btn_RemoveUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_RemoveUrl] +._WndType=Text +._Parent=Handle_RemoveUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=REMOVE FAV + +[Btn_ExportUrl] +._WndType=WndButton +._Parent=Wnd_Total +Left=330 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_ExportUrl] +._WndType=Handle +._Parent=Btn_ExportUrl +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_ExportUrl] +._WndType=Text +._Parent=Handle_ExportUrl +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=EXPORT FAV + +[Btn_SyncTeam] +._WndType=WndButton +._Parent=Wnd_Total +Left=480 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_SyncTeam] +._WndType=Handle +._Parent=Btn_SyncTeam +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_SyncTeam] +._WndType=Text +._Parent=Handle_SyncTeam +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=SYNC TEAM + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=630 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + diff --git a/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Custom.ini b/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Custom.ini new file mode 100644 index 000000000..69eb0fe65 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Custom.ini @@ -0,0 +1,652 @@ +[MY_TeamMon_Subscribe_VoicePacket_Custom] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamMon_Subscribe_VoicePacket_Custom +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break1] +._WndType=Image +._Parent=Handle_Total +Left=120 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break1] +._WndType=Text +._Parent=Handle_Total +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Author +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=120 +Height=30 +EventID=512 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=120 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=550 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[Text_Page] +._WndType=Text +._Parent=Handle_Total +Left=557 +Top=529 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=192 +$Text=1 / 100 +OrgText=1 +FontScheme=18 +HAlign=2 +VAlign=1 +Width=140 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Author] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=41 +Width=120 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=130 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=530 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=24 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + +[Btn_Preview] +._WndType=WndButton +._Parent=Wnd_Total +Left=179 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_Preview] +._WndType=Handle +._Parent=Btn_Preview +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_Preview] +._WndType=Text +._Parent=Handle_Preview +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREVIEW + +[Btn_PrevPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=739 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_PrevPage] +._WndType=Handle +._Parent=Btn_PrevPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_PrevPage] +._WndType=Text +._Parent=Handle_PrevPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREV PAGE + +[Btn_NextPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=861 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_NextPage] +._WndType=Handle +._Parent=Btn_NextPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_NextPage] +._WndType=Text +._Parent=Handle_NextPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=NEXT PAGE + diff --git a/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Official.ini b/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Official.ini new file mode 100644 index 000000000..bab80d426 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_Subscribe_VoicePacket_Official.ini @@ -0,0 +1,604 @@ +[MY_TeamMon_Subscribe_VoicePacket_Official] +._WndType=WndFrame +._Parent=Normal +Width=1000 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamMon_Subscribe_VoicePacket_Official +Left=0 +Top=30 +Width=1000 +Height=620 +DummyWnd=0 +Frame=0 + +[Handle_Total] +._WndType=Handle +._Parent=Wnd_Total +Left=20 +Top=20 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=580 +EventID=786 + +[Image_BG] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=960 +Height=510 + +[Image_BG1] +._WndType=Image +._Parent=Handle_Total +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=960 +Height=480 + +[Image_Line1_0] +._WndType=Image +._Parent=Handle_Total +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=954 +Height=3 + +[Image_Break2] +._WndType=Image +._Parent=Handle_Total +Left=670 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break2] +._WndType=Text +._Parent=Handle_Total +Left=20 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Title +OrgText=1 +FontScheme=18 +HAlign=0 +VAlign=1 +Width=650 +Height=30 + +[Image_Break3] +._WndType=Image +._Parent=Handle_Total +Left=750 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Text_Break3] +._WndType=Text +._Parent=Handle_Total +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TIME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=80 +Height=30 + +[Text_Break4] +._WndType=Text +._Parent=Handle_Total +Left=750 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_ALIGNMENT_OTHERS +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=220 +Height=30 + +[Text_Page] +._WndType=Text +._Parent=Handle_Total +Left=557 +Top=529 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=192 +$Text=1 / 100 +OrgText=1 +FontScheme=18 +HAlign=2 +VAlign=1 +Width=140 +Height=30 + +[WndScroll_Subscribe] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=50 +Width=960 +Height=480 +ScrollHandle= +ScrollContainer=WndContainer_Subscribe +VerScrollBar=Scroll_Subscribe +ScrollButtonUp=Btn_Subscribe_Scroll_Up +ScrollButtonDown=Btn_Subscribe_Scroll_Down + +[WndContainer_Subscribe] +._WndType=WndContainer +._Parent=WndScroll_Subscribe +Left=0 +Top=0 +Width=960 +Height=480 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Item] +._WndType=WndWindow +._Parent=WndContainer_Subscribe +Left=0 +Top=1 +Width=960 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Item +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=960 +Height=32 +EventID=816 +Hover=Image_Item_Unused + +[Image_Line] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=1 +PosType=0 +Alpha=180 +Image=ui\Image\UICommon\RaidTotal.UITex +Frame=7 +ImageType=10 +Width=960 +Height=29 + +[Image_Line1] +._WndType=Image +._Parent=Handle_Item +Left=2 +Top=29 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=115 +Frame=8 +ImageType=11 +Width=956 +Height=3 + +[Text_Item_Title] +._WndType=Text +._Parent=Handle_Item +Left=20 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=0 +VAlign=1 +FontScheme=41 +Width=650 +Height=29 +AutoEtc=1 +ShowAll=0 + +[Text_Item_Download] +._WndType=Text +._Parent=Handle_Item +Left=670 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +HAlign=1 +VAlign=1 +FontScheme=228 +Width=80 +Height=29 +AutoEtc=1 +ShowAll=0 +OrgText=0 +FontColor= + +[Image_Item_Sel] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-15 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Image_Item_Unused] +._WndType=Image +._Parent=Handle_Item +Image=ui\Image\common\textshadow.uitex +Frame=0 +Alpha=255 +Left=-14 +Top=1 +PosType=0 +Width=960 +Height=28 +LockShowAndHide=1 + +[Btn_Subscribe_Scroll_Up] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=34 +Left=940 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Subscribe_Scroll_Down] +._WndType=WndButton +._Parent=WndScroll_Subscribe +Frame=38 +Left=940 +Top=455 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Subscribe] +._WndType=WndNewScrollBar +._Parent=WndScroll_Subscribe +StepCount=30 +PageStepCount=10 +Left=940 +Top=0 +Width=20 +Height=475 +SlideBtn=Btn_Scroll_Subscribe +Type=1 +AutoHideSlideButton=0 +AutoResizeSlideButton=0 + +[Btn_Scroll_Subscribe] +._WndType=WndButton +._Parent=Scroll_Subscribe +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Btn_CheckUpdate] +._WndType=WndButton +._Parent=Wnd_Total +Left=24 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_CheckUpdate] +._WndType=Handle +._Parent=Btn_CheckUpdate +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_CheckUpdate] +._WndType=Text +._Parent=Handle_CheckUpdate +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=CHECK UPDATE + +[Btn_Preview] +._WndType=WndButton +._Parent=Wnd_Total +Left=179 +Top=550 +Width=148 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_Preview] +._WndType=Handle +._Parent=Btn_Preview +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=33 + +[Text_Preview] +._WndType=Text +._Parent=Handle_Preview +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=148 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREVIEW + +[Btn_PrevPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=739 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_PrevPage] +._WndType=Handle +._Parent=Btn_PrevPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_PrevPage] +._WndType=Text +._Parent=Handle_PrevPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=PREV PAGE + +[Btn_NextPage] +._WndType=WndButton +._Parent=Wnd_Total +Left=861 +Top=550 +Width=110 +Height=33 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\VH1.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +ShowTipType=0 +Alpha=255 + +[Handle_NextPage] +._WndType=Handle +._Parent=Btn_NextPage +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=33 + +[Text_NextPage] +._WndType=Text +._Parent=Handle_NextPage +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=110 +Height=29 +HAlign=1 +VAlign=1 +FontScheme=162 +OrgText=1 +$Text=NEXT PAGE + diff --git a/MY_TeamMon/ui/MY_TeamMon_UI.ini b/MY_TeamMon/ui/MY_TeamMon_UI.ini new file mode 100644 index 000000000..6243ff622 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI.ini @@ -0,0 +1,2917 @@ +[MY_TeamMon_UI] +._WndType=WndFrame +._Parent=Normal +Left=200 +Top=200 +Width=1060 +Height=680 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=0 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 +ShowModeSet=0 +ShowWhenHideUI=0 +ViewMutexKey= + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamMon_UI +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Wnd_Bg] +._WndType=WndWindow +._Parent=Wnd_Total +Left=10 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Wnd_Bg] +._WndType=Handle +._Parent=Wnd_Bg +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_BG] +._WndType=Handle +._Parent=Handle_Wnd_Bg +PosType=0 +HandleType=0 +Left=282 +Top=122 +Width=595 +Height=535 +FirstItemPosType=0 +LockShowAndHide=1 + +[Image_BG] +._WndType=Image +._Parent=Handle_BG +Left=0 +Top=0 +Width=595 +Height=535 +PosType=0 +Alpha=196 +ImageType=0 +Image= + +[Text_BgTitle] +._WndType=Text +._Parent=Handle_BG +RowSpacing=0 +FontSpacing=0 +Alpha=200 +Left=10 +Top=490 +PosType=0 +FontScheme=231 +Width=575 +Height=40 +HAlign=2 +VAlign=1 + +[Image_TabBg] +._WndType=Image +._Parent=Handle_Wnd_Bg +Image=ui\Image\UICommon\ActivePopularize2.UITex +Frame=46 +Alpha=255 +PosType=0 +Width=1070 +Height=32 +ImageType=11 +Left=-10 +Top=51 + +[PageSet_Main] +._WndType=WndPageSet +._Parent=Wnd_Total +Left=10 +Top=50 +Width=1060 +Height=630 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +PageCount=7 +Page_0=Page_BUFF +CheckBox_0=CheckBox_BUFF +Page_1=Page_DEBUFF +CheckBox_1=CheckBox_DEBUFF +Page_2=Page_CASTING +CheckBox_2=CheckBox_CASTING +Page_3=Page_NPC +CheckBox_3=CheckBox_NPC +Page_4=Page_DOODAD +CheckBox_4=CheckBox_DOODAD +Page_5=Page_TALK +CheckBox_5=CheckBox_TALK +Page_6=Page_CHAT +CheckBox_6=CheckBox_CHAT + +[CheckBox_BUFF] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=20 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_BUFF] +._WndType=Handle +._Parent=CheckBox_BUFF +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_BUFF] +._WndType=Text +._Parent=Handle_CheckBox_BUFF +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=BUFF +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_BUFF] +._WndType=Image +._Parent=Handle_CheckBox_BUFF +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 +LockShowAndHide=1 + +[Page_BUFF] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_BUFF_L] +._WndType=WndScroll +._Parent=Page_BUFF +Left=0 +Top=0 +Width=620 +Height=540 +ScrollHandle=Handle_BUFF_List_L +ScrollContainer= +VerScrollBar=Btn_BUFF_L_ALL +ScrollButtonUp=Btn_BUFF_L_UP +ScrollButtonDown=Btn_BUFF_L_Down + +[Handle_New_1] +._WndType=Handle +._Parent=WndScroll_BUFF_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0] +._WndType=Image +._Parent=Handle_New_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=600 +Height=540 +ImageType=10 + +[Handle_BUFF_List_L] +._WndType=Handle +._Parent=Handle_New_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=596 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_BUFF_L_UP] +._WndType=WndButton +._Parent=WndScroll_BUFF_L +Frame=34 +Left=600 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_BUFF_L_Down] +._WndType=WndButton +._Parent=WndScroll_BUFF_L +Frame=38 +Left=600 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_BUFF_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_BUFF_L +StepCount=30 +PageStepCount=10 +Left=598 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_BUFF_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_BUFF_L_ListScroll] +._WndType=WndButton +._Parent=Btn_BUFF_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[WndScroll_BUFF_R] +._WndType=WndScroll +._Parent=Page_BUFF +Left=620 +Top=0 +Width=160 +Height=540 +ScrollHandle=Handle_BUFF_List_R +ScrollContainer= +VerScrollBar=Btn_BUFF_R_ALL +ScrollButtonUp=Btn_BUFF_R_UP +ScrollButtonDown=Btn_BUFF_R_Down + +[Handle_New_1_0] +._WndType=Handle +._Parent=WndScroll_BUFF_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_0] +._WndType=Image +._Parent=Handle_New_1_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=140 +Height=540 +ImageType=10 + +[Handle_BUFF_List_R] +._WndType=Handle +._Parent=Handle_New_1_0 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=136 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_BUFF_R_UP] +._WndType=WndButton +._Parent=WndScroll_BUFF_R +Frame=34 +Left=135 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_BUFF_R_Down] +._WndType=WndButton +._Parent=WndScroll_BUFF_R +Frame=38 +Left=135 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_BUFF_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_BUFF_R +StepCount=30 +PageStepCount=10 +Left=135 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_BUFF_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_BUFF_R_ListScroll] +._WndType=WndButton +._Parent=Btn_BUFF_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_DEBUFF] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=120 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_DEBUFF] +._WndType=Handle +._Parent=CheckBox_DEBUFF +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_DEBUFF] +._WndType=Text +._Parent=Handle_CheckBox_DEBUFF +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=DEBUFF +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_DEBUFF] +._WndType=Image +._Parent=Handle_CheckBox_DEBUFF +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_DEBUFF] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_DEBUFF_L] +._WndType=WndScroll +._Parent=Page_DEBUFF +Left=0 +Top=0 +Width=620 +Height=540 +ScrollHandle=Handle_DEBUFF_List_L +ScrollContainer= +VerScrollBar=Btn_DEBUFF_L_ALL +ScrollButtonUp=Btn_DEBUFF_L_UP +ScrollButtonDown=Btn_DEBUFF_L_Down + +[Handle_New_1_1] +._WndType=Handle +._Parent=WndScroll_DEBUFF_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_1] +._WndType=Image +._Parent=Handle_New_1_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=600 +Height=540 +ImageType=10 + +[Handle_DEBUFF_List_L] +._WndType=Handle +._Parent=Handle_New_1_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=596 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_DEBUFF_L_UP] +._WndType=WndButton +._Parent=WndScroll_DEBUFF_L +Frame=34 +Left=600 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_DEBUFF_L_Down] +._WndType=WndButton +._Parent=WndScroll_DEBUFF_L +Frame=38 +Left=600 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DEBUFF_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_DEBUFF_L +StepCount=30 +PageStepCount=10 +Left=598 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_DEBUFF_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_DEBUFF_L_ListScroll] +._WndType=WndButton +._Parent=Btn_DEBUFF_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[WndScroll_DEBUFF_R] +._WndType=WndScroll +._Parent=Page_DEBUFF +Left=620 +Top=0 +Width=160 +Height=540 +ScrollHandle=Handle_DEBUFF_List_R +ScrollContainer= +VerScrollBar=Btn_DEBUFF_R_ALL +ScrollButtonUp=Btn_DEBUFF_R_UP +ScrollButtonDown=Btn_DEBUFF_R_Down + +[Handle_New_1_0_0] +._WndType=Handle +._Parent=WndScroll_DEBUFF_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_0_0] +._WndType=Image +._Parent=Handle_New_1_0_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=140 +Height=540 +ImageType=10 + +[Handle_DEBUFF_List_R] +._WndType=Handle +._Parent=Handle_New_1_0_0 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=136 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_DEBUFF_R_UP] +._WndType=WndButton +._Parent=WndScroll_DEBUFF_R +Frame=34 +Left=135 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DEBUFF_R_Down] +._WndType=WndButton +._Parent=WndScroll_DEBUFF_R +Frame=38 +Left=135 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DEBUFF_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_DEBUFF_R +StepCount=30 +PageStepCount=10 +Left=135 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_DEBUFF_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_DEBUFF_R_ListScroll] +._WndType=WndButton +._Parent=Btn_DEBUFF_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_CASTING] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=220 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_CASTING] +._WndType=Handle +._Parent=CheckBox_CASTING +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_CASTING] +._WndType=Text +._Parent=Handle_CheckBox_CASTING +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=CASTING +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_CASTING] +._WndType=Image +._Parent=Handle_CheckBox_CASTING +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_CASTING] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_CASTING_L] +._WndType=WndScroll +._Parent=Page_CASTING +Left=0 +Top=0 +Width=620 +Height=540 +ScrollHandle=Handle_CASTING_List_L +ScrollContainer= +VerScrollBar=Btn_CASTING_L_ALL +ScrollButtonUp=Btn_CASTING_L_UP +ScrollButtonDown=Btn_CASTING_L_Down + +[Handle_New_1_3] +._WndType=Handle +._Parent=WndScroll_CASTING_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_3] +._WndType=Image +._Parent=Handle_New_1_3 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=600 +Height=540 +ImageType=10 + +[Handle_CASTING_List_L] +._WndType=Handle +._Parent=Handle_New_1_3 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=596 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_CASTING_L_UP] +._WndType=WndButton +._Parent=WndScroll_CASTING_L +Frame=34 +Left=600 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_CASTING_L_Down] +._WndType=WndButton +._Parent=WndScroll_CASTING_L +Frame=38 +Left=600 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_CASTING_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_CASTING_L +StepCount=30 +PageStepCount=10 +Left=598 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_CASTING_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_CASTING_L_ListScroll] +._WndType=WndButton +._Parent=Btn_CASTING_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[WndScroll_CASTING_R] +._WndType=WndScroll +._Parent=Page_CASTING +Left=620 +Top=0 +Width=160 +Height=540 +ScrollHandle=Handle_CASTING_List_R +ScrollContainer= +VerScrollBar=Btn_CASTING_R_ALL +ScrollButtonUp=Btn_CASTING_R_UP +ScrollButtonDown=Btn_CASTING_R_Down + +[Handle_New_1_0_1] +._WndType=Handle +._Parent=WndScroll_CASTING_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=136 +Height=441 + +[Image_New_0_0_1] +._WndType=Image +._Parent=Handle_New_1_0_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=140 +Height=540 +ImageType=10 + +[Handle_CASTING_List_R] +._WndType=Handle +._Parent=Handle_New_1_0_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=136 +Height=536 +RowSpacing=0 +StencilCircle=0 +ControlShow=1 +PixelScroll=1 + +[Btn_CASTING_R_UP] +._WndType=WndButton +._Parent=WndScroll_CASTING_R +Frame=34 +Left=135 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_CASTING_R_Down] +._WndType=WndButton +._Parent=WndScroll_CASTING_R +Frame=38 +Left=135 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_CASTING_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_CASTING_R +StepCount=30 +PageStepCount=10 +Left=135 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_NPC_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_CASTING_R_ListScroll] +._WndType=WndButton +._Parent=Btn_CASTING_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_NPC] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=320 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_NPC] +._WndType=Handle +._Parent=CheckBox_NPC +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_NPC] +._WndType=Text +._Parent=Handle_CheckBox_NPC +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=NPC +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_NPC] +._WndType=Image +._Parent=Handle_CheckBox_NPC +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_NPC] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_NPC_L] +._WndType=WndScroll +._Parent=Page_NPC +Left=0 +Top=0 +Width=620 +Height=540 +ScrollHandle=Handle_NPC_List_L +ScrollContainer= +VerScrollBar=Btn_NPC_L_ALL +ScrollButtonUp=Btn_NPC_L_UP +ScrollButtonDown=Btn_NPC_L_Down + +[Handle_New_1_3_0] +._WndType=Handle +._Parent=WndScroll_NPC_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_3_0] +._WndType=Image +._Parent=Handle_New_1_3_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=600 +Height=540 +ImageType=10 + +[Handle_NPC_List_L] +._WndType=Handle +._Parent=Handle_New_1_3_0 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=596 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_NPC_L_UP] +._WndType=WndButton +._Parent=WndScroll_NPC_L +Frame=34 +Left=600 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_NPC_L_Down] +._WndType=WndButton +._Parent=WndScroll_NPC_L +Frame=38 +Left=600 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_NPC_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_NPC_L +StepCount=30 +PageStepCount=10 +Left=598 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_NPC_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_NPC_L_ListScroll] +._WndType=WndButton +._Parent=Btn_NPC_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[WndScroll_NPC_R] +._WndType=WndScroll +._Parent=Page_NPC +Left=620 +Top=0 +Width=160 +Height=540 +ScrollHandle=Handle_NPC_List_R +ScrollContainer= +VerScrollBar=Btn_NPC_R_ALL +ScrollButtonUp=Btn_NPC_R_UP +ScrollButtonDown=Btn_NPC_R_Down + +[Handle_New_1_0_1_0] +._WndType=Handle +._Parent=WndScroll_NPC_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_0_1_0] +._WndType=Image +._Parent=Handle_New_1_0_1_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=140 +Height=540 +ImageType=10 + +[Handle_NPC_List_R] +._WndType=Handle +._Parent=Handle_New_1_0_1_0 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=136 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_NPC_R_UP] +._WndType=WndButton +._Parent=WndScroll_NPC_R +Frame=34 +Left=135 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_NPC_R_Down] +._WndType=WndButton +._Parent=WndScroll_NPC_R +Frame=38 +Left=135 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_NPC_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_NPC_R +StepCount=30 +PageStepCount=10 +Left=135 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_NPC_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_NPC_R_ListScroll] +._WndType=WndButton +._Parent=Btn_NPC_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_DOODAD] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=420 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_DOODAD] +._WndType=Handle +._Parent=CheckBox_DOODAD +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_DOODAD] +._WndType=Text +._Parent=Handle_CheckBox_DOODAD +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=DOODAD +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_DOODAD] +._WndType=Image +._Parent=Handle_CheckBox_DOODAD +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_DOODAD] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_DOODAD_L] +._WndType=WndScroll +._Parent=Page_DOODAD +Left=0 +Top=0 +Width=620 +Height=540 +ScrollHandle=Handle_DOODAD_List_L +ScrollContainer= +VerScrollBar=Btn_DOODAD_L_ALL +ScrollButtonUp=Btn_DOODAD_L_UP +ScrollButtonDown=Btn_DOODAD_L_Down + +[Handle_New_1_3_0_1] +._WndType=Handle +._Parent=WndScroll_DOODAD_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_3_0_1] +._WndType=Image +._Parent=Handle_New_1_3_0_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=600 +Height=540 +ImageType=10 + +[Handle_DOODAD_List_L] +._WndType=Handle +._Parent=Handle_New_1_3_0_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=596 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_DOODAD_L_UP] +._WndType=WndButton +._Parent=WndScroll_DOODAD_L +Frame=34 +Left=600 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_DOODAD_L_Down] +._WndType=WndButton +._Parent=WndScroll_DOODAD_L +Frame=38 +Left=600 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DOODAD_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_DOODAD_L +StepCount=30 +PageStepCount=10 +Left=598 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_NPC_L_ListScroll_0 +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_DOODAD_L_ListScroll] +._WndType=WndButton +._Parent=Btn_DOODAD_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[WndScroll_DOODAD_R] +._WndType=WndScroll +._Parent=Page_DOODAD +Left=620 +Top=0 +Width=160 +Height=540 +ScrollHandle=Handle_DOODAD_List_R +ScrollContainer= +VerScrollBar=Btn_DOODAD_R_ALL +ScrollButtonUp=Btn_DOODAD_R_UP +ScrollButtonDown=Btn_DOODAD_R_Down + +[Handle_New_1_0_1_0_1] +._WndType=Handle +._Parent=WndScroll_DOODAD_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_0_0_1_0_1] +._WndType=Image +._Parent=Handle_New_1_0_1_0_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=48 +Width=140 +Height=540 +ImageType=10 + +[Handle_DOODAD_List_R] +._WndType=Handle +._Parent=Handle_New_1_0_1_0_1 +Left=2 +Top=2 +PosType=0 +HandleType=3 +Width=136 +Height=536 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_DOODAD_R_UP] +._WndType=WndButton +._Parent=WndScroll_DOODAD_R +Frame=34 +Left=135 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DOODAD_R_Down] +._WndType=WndButton +._Parent=WndScroll_DOODAD_R +Frame=38 +Left=135 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_DOODAD_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_DOODAD_R +StepCount=30 +PageStepCount=10 +Left=135 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_NPC_R_ListScroll_0 +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_DOODAD_R_ListScroll] +._WndType=WndButton +._Parent=Btn_DOODAD_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_TALK] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=520 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_TALK] +._WndType=Handle +._Parent=CheckBox_TALK +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_TALK] +._WndType=Text +._Parent=Handle_CheckBox_TALK +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=TALK +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_TALK] +._WndType=Image +._Parent=Handle_CheckBox_TALK +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_TALK] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_TALK_L] +._WndType=WndScroll +._Parent=Page_TALK +Left=0 +Top=0 +Width=380 +Height=540 +ScrollHandle=Handle_TALK_List_L +ScrollContainer= +VerScrollBar=Btn_TALK_L_ALL +ScrollButtonUp=Btn_TALK_L_UP +ScrollButtonDown=Btn_TALK_L_Down + +[Handle_New_1_3_0_0_1] +._WndType=Handle +._Parent=WndScroll_TALK_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Table_Bg] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +ImageType=10 +Frame=50 +Width=360 +Height=540 + +[Image_Table_Bg1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1 +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=360 +Height=508 + +[Image_Table_Line] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1 +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Table_Break1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1 +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=534 + +[Text_Table_Break1] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1 +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_NAME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 + +[Text_Table_Break2] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1 +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TALK +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=260 +Height=30 + +[Handle_TALK_List_L] +._WndType=Handle +._Parent=Handle_New_1_3_0_0_1 +Left=2 +Top=28 +PosType=0 +HandleType=3 +Width=356 +Height=508 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_TALK_L_UP] +._WndType=WndButton +._Parent=WndScroll_TALK_L +Frame=34 +Left=360 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_TALK_L_Down] +._WndType=WndButton +._Parent=WndScroll_TALK_L +Frame=38 +Left=360 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_TALK_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_TALK_L +StepCount=30 +PageStepCount=10 +Left=360 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_TALK_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_TALK_L_ListScroll] +._WndType=WndButton +._Parent=Btn_TALK_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[WndScroll_TALK_R] +._WndType=WndScroll +._Parent=Page_TALK +Left=390 +Top=0 +Width=380 +Height=540 +ScrollHandle=Handle_TALK_List_R +ScrollContainer= +VerScrollBar=Btn_TALK_R_ALL +ScrollButtonUp=Btn_TALK_R_UP +ScrollButtonDown=Btn_TALK_R_Down + +[Handle_New_1_3_0_0_1_0] +._WndType=Handle +._Parent=WndScroll_TALK_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Table_Bg_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +ImageType=10 +Frame=50 +Width=360 +Height=540 + +[Image_Table_Bg1_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0 +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=360 +Height=508 + +[Image_Table_Line_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0 +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Table_Break1_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0 +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=534 + +[Text_Table_Break1_0] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_0 +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_NAME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 + +[Text_Table_Break2_0] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_0 +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TALK +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=260 +Height=30 + +[Handle_TALK_List_R] +._WndType=Handle +._Parent=Handle_New_1_3_0_0_1_0 +Left=2 +Top=28 +PosType=0 +HandleType=3 +Width=356 +Height=508 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_TALK_R_UP] +._WndType=WndButton +._Parent=WndScroll_TALK_R +Frame=34 +Left=360 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_TALK_R_Down] +._WndType=WndButton +._Parent=WndScroll_TALK_R +Frame=38 +Left=360 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_TALK_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_TALK_R +StepCount=30 +PageStepCount=10 +Left=360 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_TALK_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_TALK_R_ListScroll] +._WndType=WndButton +._Parent=Btn_TALK_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[CheckBox_CHAT] +._WndType=WndCheckBox +._Parent=PageSet_Main +Left=620 +Top=0 +Width=100 +Height=30 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckBox_CHAT] +._WndType=Handle +._Parent=CheckBox_CHAT +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_Page_CHAT] +._WndType=Text +._Parent=Handle_CheckBox_CHAT +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=CHAT +OrgText=1 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +FontScheme=162 +FontColor= + +[Image_Break_CHAT] +._WndType=Image +._Parent=Handle_CheckBox_CHAT +Left=0 +Top=1 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Page_CHAT] +._WndType=WndPage +._Parent=PageSet_Main +Left=280 +Top=70 +Width=780 +Height=540 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 + +[WndScroll_CHAT_L] +._WndType=WndScroll +._Parent=Page_CHAT +Left=0 +Top=0 +Width=380 +Height=540 +ScrollHandle=Handle_CHAT_List_L +ScrollContainer= +VerScrollBar=Btn_CHAT_L_ALL +ScrollButtonUp=Btn_CHATL_UP +ScrollButtonDown=Btn_CHAT_L_Down + +[Handle_New_1_3_0_0_1_1] +._WndType=Handle +._Parent=WndScroll_CHAT_L +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Table_Bg_1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +ImageType=10 +Frame=50 +Width=360 +Height=540 + +[Image_Table_Bg1_1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_1 +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=360 +Height=508 + +[Image_Table_Line_1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_1 +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Table_Break1_1] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_1 +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=534 + +[Text_Table_Break1_1] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_1 +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_NAME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 + +[Text_Table_Break2_1] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_1 +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TALK +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=260 +Height=30 + +[Handle_CHAT_List_L] +._WndType=Handle +._Parent=Handle_New_1_3_0_0_1_1 +Left=2 +Top=28 +PosType=0 +HandleType=3 +Width=356 +Height=508 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 +EventID=524288 + +[Btn_CHATL_UP] +._WndType=WndButton +._Parent=WndScroll_CHAT_L +Frame=34 +Left=360 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_CHAT_L_Down] +._WndType=WndButton +._Parent=WndScroll_CHAT_L +Frame=38 +Left=360 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_CHAT_L_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_CHAT_L +StepCount=30 +PageStepCount=10 +Left=360 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_CHAT_L_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_CHAT_L_ListScroll] +._WndType=WndButton +._Parent=Btn_CHAT_L_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[WndScroll_CHAT_R] +._WndType=WndScroll +._Parent=Page_CHAT +Left=390 +Top=0 +Width=380 +Height=540 +ScrollHandle=Handle_CHAT_List_R +ScrollContainer= +VerScrollBar=Btn_CHAT_R_ALL +ScrollButtonUp=Btn_CHAT_R_UP +ScrollButtonDown=Btn_CHAT_R_Down + +[Handle_New_1_3_0_0_1_0_0] +._WndType=Handle +._Parent=WndScroll_CHAT_R +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Table_Bg_0_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +ImageType=10 +Frame=50 +Width=360 +Height=540 + +[Image_Table_Bg1_0_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=0 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=360 +Height=508 + +[Image_Table_Line_0_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Table_Break1_0_0] +._WndType=Image +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=534 + +[Text_Table_Break1_0_0] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_NAME +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 + +[Text_Table_Break2_0_0] +._WndType=Text +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=100 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TITLE_TALK +OrgText=0 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=260 +Height=30 + +[Handle_CHAT_List_R] +._WndType=Handle +._Parent=Handle_New_1_3_0_0_1_0_0 +Left=2 +Top=28 +PosType=0 +HandleType=3 +Width=356 +Height=508 +RowSpacing=0 +PixelScroll=1 +ControlShow=1 + +[Btn_CHAT_R_UP] +._WndType=WndButton +._Parent=WndScroll_CHAT_R +Frame=34 +Left=360 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_CHAT_R_Down] +._WndType=WndButton +._Parent=WndScroll_CHAT_R +Frame=38 +Left=360 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_CHAT_R_ALL] +._WndType=WndNewScrollBar +._Parent=WndScroll_CHAT_R +StepCount=30 +PageStepCount=10 +Left=360 +Top=2 +Width=20 +Height=536 +SlideBtn=Btn_CHAT_R_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_CHAT_R_ListScroll] +._WndType=WndButton +._Parent=Btn_CHAT_R_ALL +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[WndScroll_Tree] +._WndType=WndScroll +._Parent=PageSet_Main +Left=10 +Top=70 +Width=270 +Height=540 +ScrollHandle=Handle_Tree +ScrollContainer= +VerScrollBar=Btn_Tree_All +ScrollButtonUp=Btn_Tree_Up +ScrollButtonDown=Btn_Tree_Down + +[Handle_Tree] +._WndType=Handle +._Parent=WndScroll_Tree +Left=0 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 +Width=260 +Height=540 +PixelScroll=1 +IgnoreInvisibleChild=1 + +[Handle_TreeNode] +._WndType=Handle +._Parent=Handle_Tree +PosType=8 +HandleType=0 +FirstItemPosType=0 +EventID=789 +Width=260 +Height=28 + +[Image_TreeNodeBg_Expand] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=0 +ImageType=0 +Width=260 +Height=28 + +[Image_TreeNodeBg_ExpandHover] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=1 +ImageType=0 +Width=260 +Height=28 +LockShowAndHide=1 + +[Image_TreeNodeBg_ExpandDown] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=2 +ImageType=0 +Width=260 +Height=28 +LockShowAndHide=1 + +[Image_TreeNodeBg_Collapse] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=3 +ImageType=0 +Width=260 +Height=28 +LockShowAndHide=1 + +[Image_TreeNodeBg_CollapseHover] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=4 +ImageType=0 +Width=260 +Height=28 +LockShowAndHide=1 + +[Image_TreeNodeBg_CollapseDown] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=5 +ImageType=0 +Width=260 +Height=28 +LockShowAndHide=1 + +[Text_TreeNode] +._WndType=Text +._Parent=Handle_TreeNode +Left=25 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=CATOGORY NAME +OrgText=1 +FontScheme=0 +FontColor= +TableType=1 +Width=205 +Height=28 +HAlign=1 +VAlign=1 +AutoEtc=1 +ShowAll=0 + +[Image_TreeNodeLocation] +._WndType=Image +._Parent=Handle_TreeNode +Left=2 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=255 +Frame=10 +ImageType=0 +LockShowAndHide=1 + +[Handle_TreeItem] +._WndType=Handle +._Parent=Handle_Tree +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=260 +Height=28 +EventID=525104 +Hover=Image_TreeItemBg_Hover + +[Image_TreeItemBg] +._WndType=Image +._Parent=Handle_TreeItem +Left=10 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=6 +Alpha=255 +ImageType=0 +Width=250 +Height=28 + +[Image_TreeItemBg_Hover] +._WndType=Image +._Parent=Handle_TreeItem +Left=10 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=7 +Alpha=255 +ImageType=0 +Width=250 +Height=28 +LockShowAndHide=1 + +[Image_TreeItemBg_Sel] +._WndType=Image +._Parent=Handle_TreeItem +Left=10 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=8 +Alpha=255 +ImageType=0 +Width=250 +Height=28 +LockShowAndHide=1 + +[Image_TreeItemBg_Dis] +._WndType=Image +._Parent=Handle_TreeItem +Left=10 +Top=0 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Frame=9 +Alpha=255 +ImageType=0 +Width=250 +Height=28 +LockShowAndHide=1 + +[Text_TreeItem] +._WndType=Text +._Parent=Handle_TreeItem +Left=10 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=250 +Height=28 +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +OrgText=1 +$Text=MAP NAME + +[Image_TreeItemLocation] +._WndType=Image +._Parent=Handle_TreeItem +Left=12 +Top=1 +PosType=0 +Image=interface\MY\MY_TeamMon\img\Tree.UITex +Alpha=150 +Frame=10 +ImageType=0 +LockShowAndHide=1 + +[Btn_Tree_Up] +._WndType=WndButton +._Parent=WndScroll_Tree +Frame=34 +Left=255 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +BreatheWhenHide=0 +LockShowAndHide=1 +Alpha=255 + +[Btn_Tree_Down] +._WndType=WndButton +._Parent=WndScroll_Tree +Frame=38 +Left=255 +Top=425 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=1 +Alpha=255 + +[Btn_Tree_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Tree +StepCount=30 +PageStepCount=10 +Left=254 +Top=0 +Width=20 +Height=540 +SlideBtn=Btn_Tree_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Tree_ListScroll] +._WndType=WndButton +._Parent=Btn_Tree_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=255 + +[Wnd_SearchMap] +._WndType=WndWindow +._Parent=PageSet_Main +Left=13 +Top=40 +Width=263 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchMap] +._WndType=Handle +._Parent=Wnd_SearchMap +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=263 +Height=25 + +[Image_SearchMapBg] +._WndType=Image +._Parent=Handle_SearchMap +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=-1 +Top=0 +PosType=0 +Width=260 +Height=25 +ImageType=10 + +[Image_SearchMap_0] +._WndType=Image +._Parent=Handle_SearchMap +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=230 +Top=-3 +PosType=0 +ImageType=0 + +[Edit_SearchMap] +._WndType=WndEdit +._Parent=Wnd_SearchMap +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=227 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=SEARCH MAP +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[Wnd_SearchContent] +._WndType=WndWindow +._Parent=PageSet_Main +Left=281 +Top=40 +Width=295 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_SearchContent] +._WndType=Handle +._Parent=Wnd_SearchContent +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=295 +Height=25 + +[Image_SearchContentBg] +._WndType=Image +._Parent=Handle_SearchContent +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=-1 +Top=0 +PosType=0 +Width=292 +Height=25 +ImageType=10 + +[Image_SearchContent_0] +._WndType=Image +._Parent=Handle_SearchContent +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=262 +Top=-3 +PosType=0 +ImageType=0 + +[Edit_SearchContent] +._WndType=WndEdit +._Parent=Wnd_SearchContent +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=259 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=SEARCH CONTENT +OrgPlaceholder=1 +PlaceholderAlpha=150 +TextMaxNum=-1 +TextMinNum=-1 + diff --git a/MY_TeamMon/ui/MY_TeamMon_UI_DRAG.ini b/MY_TeamMon/ui/MY_TeamMon_UI_DRAG.ini new file mode 100644 index 000000000..bca4102be --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI_DRAG.ini @@ -0,0 +1,52 @@ +[MY_TeamMon_UI_DRAG] +._WndType=WndFrame +._Parent=Normal1 +Left=0 +Top=0 +Width=480 +Height=53 +DummyWnd=1 +DisableBringToTop=1 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +RenderEvent=0 +DisableBreath=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_TeamMon_UI_DRAG +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 +HAlign=1 +VAlign=1 + +[Image] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 + +[Text] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +AutoEtc=1 +ShowAll=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_L.ini b/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_L.ini new file mode 100644 index 000000000..bfd511334 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_L.ini @@ -0,0 +1,81 @@ +[Handle_L] +._WndType=Handle +._Parent=Handle_Buff_List_L +PosType=8 +HandleType=0 +Width=198 +Height=63 +FirstItemPosType=0 +EventID=524597 + +[Image] +._WndType=Image +._Parent=Handle_L +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=160 +Width=198 +Height=63 +Frame=7 +ImageType=10 + +[Box] +._WndType=Box +._Parent=Handle_L +Left=4 +Top=4 +PosType=0 +IconID=13 +Width=55 +Height=55 + +[Text] +._WndType=Text +._Parent=Handle_L +Left=65 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +VAlign=1 +Width=128 +Height=63 +FontScheme=59 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 + +[Image_RBg] +._WndType=Image +._Parent=Handle_L +Image=ui\Image\UICommon\GuildMainPanel1.UITex +Frame=38 +Alpha=255 +Left=150 +Top=45 +PosType=0 +ImagePercent=1.000 +LockShowAndHide=1 + +[Text_R] +._WndType=Text +._Parent=Handle_L +Left=150 +Top=47 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=190 +VAlign=1 +HAlign=1 +Width=54 +Height=17 +FontScheme=155 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_R.ini b/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_R.ini new file mode 100644 index 000000000..80cd9f43d --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI_ITEM_R.ini @@ -0,0 +1,81 @@ +[Handle_R] +._WndType=Handle +._Parent=Handle_Buff_List_R +PosType=8 +HandleType=0 +Width=136 +Height=40 +FirstItemPosType=0 +EventID=524597 + +[Image] +._WndType=Image +._Parent=Handle_R +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\RaidTotal.UITex +Alpha=160 +Width=136 +Height=40 +Frame=7 +ImageType=10 + +[Box] +._WndType=Box +._Parent=Handle_R +Left=3 +Top=3 +PosType=0 +IconID=13 +Width=34 +Height=34 + +[Text] +._WndType=Text +._Parent=Handle_R +Left=40 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +VAlign=1 +Width=88 +Height=40 +FontScheme=162 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 + +[Image_RBg] +._WndType=Image +._Parent=Handle_R +Image=ui\Image\UICommon\GuildMainPanel1.UITex +Frame=38 +Alpha=200 +Left=85 +Top=22 +PosType=0 +ImagePercent=1.000 +LockShowAndHide=1 + +[Text_R] +._WndType=Text +._Parent=Handle_R +Left=85 +Top=24 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=190 +VAlign=1 +HAlign=1 +Width=54 +Height=17 +FontScheme=155 +AutoEtc=1 +CenterEachRow=0 +ShowAll=0 +MlAutoAdj=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_UI_TALK_L.ini b/MY_TeamMon/ui/MY_TeamMon_UI_TALK_L.ini new file mode 100644 index 000000000..11350ae17 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI_TALK_L.ini @@ -0,0 +1,85 @@ +[Handle_TALK_L] +._WndType=Handle +._Parent=Handle_Result +Left=0 +Top=0 +HandleType=0 +FirstItemPosType=0 +EventID=524597 +Width=360 +Height=32 + +[Image_Light] +._WndType=Image +._Parent=Handle_TALK_L +Image=ui\Image\Common\TextShadow.UITex +Frame=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=360 +Height=32 +LockShowAndHide=1 + +[Image_BreakList] +._WndType=Image +._Parent=Handle_TALK_L +Left=2 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Line] +._WndType=Image +._Parent=Handle_TALK_L +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=360 +Height=30 + +[Text_Name] +._WndType=Text +._Parent=Handle_TALK_L +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=30 +VAlign=1 +HAlign=1 +AutoEtc=1 +ShowAll=0 +FontScheme=41 +MultiLine=0 + +[Text_Content] +._WndType=Text +._Parent=Handle_TALK_L +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=105 +Top=0 +PosType=0 +Width=250 +Height=30 +VAlign=1 +HAlign=0 +AutoEtc=1 +ShowAll=0 +FontScheme=41 +MultiLine=0 diff --git a/MY_TeamMon/ui/MY_TeamMon_UI_TALK_R.ini b/MY_TeamMon/ui/MY_TeamMon_UI_TALK_R.ini new file mode 100644 index 000000000..815e23043 --- /dev/null +++ b/MY_TeamMon/ui/MY_TeamMon_UI_TALK_R.ini @@ -0,0 +1,85 @@ +[Handle_TALK_R] +._WndType=Handle +._Parent=Handle_TALK_Result +Left=0 +Top=0 +HandleType=0 +FirstItemPosType=0 +EventID=524597 +Width=360 +Height=32 + +[Image_Light] +._WndType=Image +._Parent=Handle_TALK_R +Image=ui\Image\Common\TextShadow.UITex +Frame=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=360 +Height=32 +LockShowAndHide=1 + +[Image_BreakList] +._WndType=Image +._Parent=Handle_TALK_R +Left=2 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=355 +Height=3 + +[Image_Line] +._WndType=Image +._Parent=Handle_TALK_R +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=360 +Height=30 + +[Text_Name] +._WndType=Text +._Parent=Handle_TALK_R +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=30 +VAlign=1 +HAlign=1 +AutoEtc=1 +ShowAll=0 +FontScheme=41 +MultiLine=0 + +[Text_Content] +._WndType=Text +._Parent=Handle_TALK_R +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=105 +Top=0 +PosType=0 +Width=250 +Height=30 +VAlign=1 +HAlign=0 +AutoEtc=1 +ShowAll=0 +FontScheme=41 +MultiLine=0 diff --git a/MY_TeamTools/info.ini b/MY_TeamTools/info.ini new file mode 100644 index 000000000..efadf6584 --- /dev/null +++ b/MY_TeamTools/info.ini @@ -0,0 +1,38 @@ +[MY_TeamTools] +name=团队工具 +desc=组队优化,队友属性,重伤记录,小吃小药附魔检查,团队评分 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_TeamTools.lua +lua_1=src/MY_TeamTools_Summary.lua +lua_2=src/MY_TeamTools_DeathLog.lua +lua_3=src/MY_TeamTools_EnterMap.lua +lua_4=src/MY_TeamTools_Achievement.lua +lua_5=src/MY_CharInfo.lua +lua_6=src/MY_TeamAD.lua +lua_7=src/MY_TeamNotice.lua +lua_8=src/MY_TeamNoticeOfficial.lua +lua_9=src/MY_TeamCountdown.lua +lua_10=src/MY_PartyRequest.lua +lua_11=src/MY_RoomRequest.lua +lua_12=src/MY_EvokeRequest.lua +lua_13=src/MY_RideRequest.lua +lua_14=src/MY_SocialRequest.lua +lua_15=src/MY_WorldMark.lua +lua_16=src/MY_TeamRestore.lua +lua_17=src/MY_CombatLogs.lua +lua_18=src/MY_TeamTools.PS.lua +lua_19=src/MY_JBEventVote.lua +lua_20=src/MY_JBAchievementRank.lua +lua_21=src/MY_JBAchievementSync.lua +lua_22=src/MY_JBLoverSync.lua +lua_23=src/MY_JBBind.lua +lua_24=src/MY_JBTeam.lua +lua_25=src/MY_JBTeamSnapshot.lua +lua_26=src/MY_YunWorldMark.lua +lua_27=src/MY_YunWorldMark_Subscribe.lua +lua_28=src/MY_YunWorldMark_Favorite.lua +lua_29=src/MY_YunWorldMark_LocalData.lua +lua_30=src/MY_JB.PS.lua diff --git a/MY_TeamTools/info.ini.zh_TW b/MY_TeamTools/info.ini.zh_TW new file mode 100644 index 000000000..195054cc5 --- /dev/null +++ b/MY_TeamTools/info.ini.zh_TW @@ -0,0 +1,38 @@ +[MY_TeamTools] +name=鍦橀殜宸ュ叿 +desc=绲勯殜鍎寲锛岄殜鍙嬪爆鎬э紝閲嶅偡瑷橀寗锛屽皬鍚冨皬钘ラ檮榄旀鏌ワ紝鍦橀殜瑭曞垎 +package=MY +version=1.0 +default=1 +dependence=MY_!Base +lua_0=src/MY_TeamTools.lua +lua_1=src/MY_TeamTools_Summary.lua +lua_2=src/MY_TeamTools_DeathLog.lua +lua_3=src/MY_TeamTools_EnterMap.lua +lua_4=src/MY_TeamTools_Achievement.lua +lua_5=src/MY_CharInfo.lua +lua_6=src/MY_TeamAD.lua +lua_7=src/MY_TeamNotice.lua +lua_8=src/MY_TeamNoticeOfficial.lua +lua_9=src/MY_TeamCountdown.lua +lua_10=src/MY_PartyRequest.lua +lua_11=src/MY_RoomRequest.lua +lua_12=src/MY_EvokeRequest.lua +lua_13=src/MY_RideRequest.lua +lua_14=src/MY_SocialRequest.lua +lua_15=src/MY_WorldMark.lua +lua_16=src/MY_TeamRestore.lua +lua_17=src/MY_CombatLogs.lua +lua_18=src/MY_TeamTools.PS.lua +lua_19=src/MY_JBEventVote.lua +lua_20=src/MY_JBAchievementRank.lua +lua_21=src/MY_JBAchievementSync.lua +lua_22=src/MY_JBLoverSync.lua +lua_23=src/MY_JBBind.lua +lua_24=src/MY_JBTeam.lua +lua_25=src/MY_JBTeamSnapshot.lua +lua_26=src/MY_YunWorldMark.lua +lua_27=src/MY_YunWorldMark_Subscribe.lua +lua_28=src/MY_YunWorldMark_Favorite.lua +lua_29=src/MY_YunWorldMark_LocalData.lua +lua_30=src/MY_JB.PS.lua diff --git a/MY_TeamTools/lang/default.jx3dat b/MY_TeamTools/lang/default.jx3dat new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/MY_TeamTools/lang/default.jx3dat @@ -0,0 +1 @@ +return {} diff --git a/MY_TeamTools/lang/jx3box/zhcn.jx3dat b/MY_TeamTools/lang/jx3box/zhcn.jx3dat new file mode 100644 index 000000000..6e101a102 --- /dev/null +++ b/MY_TeamTools/lang/jx3box/zhcn.jx3dat @@ -0,0 +1,111 @@ +return { + ['MY_TeamTools'] = '团队工具', + ['Team Platform'] = '团队平台', + + -- MY_JBBind.lua + ['MY_JBBind'] = '魔盒认证', + ['Character Certification'] = '角色认证', + ['Current character: %s'] = '当前角色:%s', + ['Status: '] = '状态:', + ['Loading'] = '加载中…', + ['Unknown'] = '未知', + ['Click fetch'] = '点击获取', + ['Bind'] = '绑定', + ['Not bind'] = '未绑定', + ['You are crossing server, please do this after backing.'] = '当前处于跨服状态,请在结束跨服后再试。', + ['Request failed.'] = '请求失败', + ['Click bind'] = '点击绑定', + ['Binded (ID: %s)'] = '已绑定(ID:%s)', + ['Click unbind'] = '点击解绑', + ['Please input certification code:'] = '请输入“角色认证”验证码:', + ['Bind succeed!'] = '恭喜您!角色绑定成功!', + ['Unbind succeed!'] = '角色认证解除成功!', + ['Please unlock equip lock first!'] = '请先解除玲珑密保锁!', + ['Sure to unbind character certification?'] = '确认要解除当前“角色认证”吗?', + ['Login team platform'] = '登录团队平台', + ['Today recomment posts'] = '今日推荐', + + -- JBAchievementRank.lua + ['MY_JBAchievementRank'] = '赛事上报', + ['Dungeon Rank'] = '赛事上报', + ['Share boss kill'] = '分享首次击败秘境首领', + ['Share boss kill record for kill rank.'] = '参加秘境百强榜,公开分享首次击败秘境首领相关团队与战斗信息。', + ['(Checked this option to join dungeon rank.)'] = '(秘境百强榜参赛期间,需勾选方能上报)', + ['Sync competition'] = '同步赛事', + ['Current map achievement rank:'] = '当前地图赛事成就:', + ['(Done)'] = '(已达成)', + ['(Pending)'] = '(可参赛)', + ['None'] = '无', + ['Try share boss kill: %s - %ds (%s).'] = '正在分享:%s,战斗%d秒,%s。', + ['Share boss kill success: %s - %ds (%s).'] = '成功分享:%s,战斗%d秒,%s。', + ['Full win'] = '全胜', + + -- JBAchievementSync.lua + ['MY_JBAchievementSync'] = '成就同步', + ['Sync achievement'] = '同步成就', + ['Auto sync achievement on exit'] = '下线自动同步成就', + ['Sync success.'] = '同步成功', + ['Request failed.'] = '请求失败', + + -- MY_JBLoverSync.lua + ['Sync lover'] = '同步情缘', + ['Sync lover request sent, please wait for peer to agree.'] = '同步情缘信息请求已发送至对方,请等待情缘同意请求。', + ['[%s] want to sync lover relation to jx3box, do you agree?'] = '[%s] 请求同步情缘信息到魔盒平台中,是否同意同步?', + ['Sync lover is a sensitive action, please unlock to continue.'] = '同步情缘信息为敏感操作,请先解除聊天锁。', + ['Peer is not your lover, please check, or do fix lover first.'] = '对方不是您的情缘,请先检查或修复情缘状态。', + ['[%s] disabled ui config sync, unable to read data.'] = '[%s] 关闭了界面设置同步,无法获取情缘状态信息。', + ['Sync success.'] = '同步成功', + ['Request failed.'] = '请求失败', + + -- MY_JBEventVote.lua + ['Dungeon Vote'] = '赛事投票', + ['MY_JBEventVote'] = '团队投票', + ['ERR: Decode eventlist content as json failed!'] = '错误:解码榜单列表失败!', + ['ERR: Eventlist content is illegal!'] = '错误:榜单列表内容数据结构不符合约束!', + ['ERR404: Eventlist address not found!'] = '错误:榜单列表地址不存在!', + ['Team Name'] = '团队名称', + ['Server'] = '服务器', + ['Leader'] = '团长', + ['Slogan'] = '宣言', + ['Vote Count'] = '人气', + ['Vote'] = '投票', + ['Voted'] = '已投票', + ['Finish achieves: '] = '完成成就:', + ['Start time: '] = '开始时间:', + ['End time: '] = '结束时间:', + ['ERR: Decode rankdata content as json failed!'] = '错误:解码列表失败!', + ['ERR: Rankdata content is illegal!'] = '错误:列表内容数据结构不符合约束!', + ['ERR404: Rankdata address not found!'] = '错误:列表地址不存在!', + ['View Detail'] = '查看详情', + ['ERR: Decode vote content as json failed!'] = '错误:解码投票结果失败!', + ['ERR: Vote content is illegal!'] = '错误:投票结果内容数据结构不符合约束!', + ['ERR404: Vote address not found!'] = '错误:投票结果地址不存在!', + + -- MY_JBTeam.lua + ['Quick team'] = '快捷入团', + ['Team name/id'] = '团名/ID', + ['Team name/id:'] = '团名/ID:', + ['Apply join team'] = '申请入团', + ['Processing, please wait.'] = '操作中,请稍后。', + ['Please input team name/id.'] = '请先输入团队名称/ID。', + ['Sure to apply join team %s?'] = '确定要申请加入团队 %s 吗?', + ['Apply succeed!'] = '申请成功!', + ['Apply failed!'] = '申请失败!', + ['Apply quit team'] = '退出团队', + ['Sure to apply quit team %s?'] = '确定要退出团队 %s 吗?', + ['Quit succeed!'] = '退出成功!', + ['Quit failed!'] = '退出失败!', + + -- MY_JBTeamSnapshot.lua + ['MY_JBTeamSnapshot'] = '团队快照', + ['Team Snapshot'] = '团队快照', + ['Team name/id:'] = '团名/ID:', + ['(Input: Team@Server:Passcode)'] = '(输入:团队名称@服务器名:团队密码)', + ['Upload Snapshot'] = '快照上传', + ['>> View Snapshots <<'] = '>> 查看快照 <<', + ['Upload snapshot succeed!'] = '快照上传成功!', + ['Upload snapshot failed!'] = '快照上传失败!', + + -- MY_JB.PS.lua + ['Data sync'] = '数据同步', +} diff --git a/MY_TeamTools/lang/jx3box/zhtw.jx3dat b/MY_TeamTools/lang/jx3box/zhtw.jx3dat new file mode 100644 index 000000000..e233fee0f --- /dev/null +++ b/MY_TeamTools/lang/jx3box/zhtw.jx3dat @@ -0,0 +1,111 @@ +return { + ['MY_TeamTools'] = '鍦橀殜宸ュ叿', + ['Team Platform'] = '鍦橀殜骞宠嚭', + + -- MY_JBBind.lua + ['MY_JBBind'] = '榄旂洅瑾嶈瓑', + ['Character Certification'] = '瑙掕壊瑾嶈瓑', + ['Current character: %s'] = '鐣跺墠瑙掕壊锛%s', + ['Status: '] = '鐙鎱嬶細', + ['Loading'] = '杓夊叆涓', + ['Unknown'] = '鏈煡', + ['Click fetch'] = '榛炴搳鐛插彇', + ['Bind'] = '缍佸畾', + ['Not bind'] = '鏈秮瀹', + ['You are crossing server, please do this after backing.'] = '鐣跺墠铏曟柤璺ㄦ湇鐙鎱嬶紝璜嬪湪绲愭潫璺ㄦ湇寰屽啀瑭︺', + ['Request failed.'] = '璜嬫眰澶辨晽', + ['Click bind'] = '榛炴搳缍佸畾', + ['Binded (ID: %s)'] = '宸茬秮瀹氾紙ID锛%s锛', + ['Click unbind'] = '榛炴搳瑙g秮', + ['Please input certification code:'] = '璜嬭几鍏モ滆鑹茶獚璀夆濋璀夌⒓锛', + ['Bind succeed!'] = '鎭枩鎮紒瑙掕壊缍佸畾鎴愬姛锛', + ['Unbind succeed!'] = '瑙掕壊瑾嶈瓑瑙i櫎鎴愬姛锛', + ['Please unlock equip lock first!'] = '璜嬪厛瑙i櫎鐜茬搹瀵嗕繚閹栵紒', + ['Sure to unbind character certification?'] = '纰鸿獚瑕佽В闄ょ暥鍓嶁滆鑹茶獚璀夆濆棊锛', + ['Login team platform'] = '鐧婚寗鍦橀殜骞宠嚭', + ['Today recomment posts'] = '浠婃棩鎺ㄨ枽', + + -- JBAchievementRank.lua + ['MY_JBAchievementRank'] = '璩戒簨涓婂牨', + ['Dungeon Rank'] = '璩戒簨涓婂牨', + ['Share boss kill'] = '鍒嗕韩棣栨鎿婃晽绉樺棣栭牁', + ['Share boss kill record for kill rank.'] = '鍙冨姞绉樺鐧惧挤姒滐紝鍏枊鍒嗕韩棣栨鎿婃晽绉樺棣栭牁鐩搁棞鍦橀殜鑸囨埌楝ヤ俊鎭', + ['(Checked this option to join dungeon rank.)'] = '锛堢澧冪櫨寮锋鍙冭辰鏈熼枔锛岄渶鍕鹃伕鏂硅兘涓婂牨锛', + ['Sync competition'] = '鍚屾璩戒簨', + ['Current map achievement rank:'] = '鐣跺墠鍦板湒璩戒簨鎴愬氨锛', + ['(Done)'] = '锛堝凡閬旀垚锛', + ['(Pending)'] = '锛堝彲鍙冭辰锛', + ['None'] = '鐒', + ['Try share boss kill: %s - %ds (%s).'] = '姝e湪鍒嗕韩锛%s锛屾埌楝%d绉掞紝%s銆', + ['Share boss kill success: %s - %ds (%s).'] = '鎴愬姛鍒嗕韩锛%s锛屾埌楝%d绉掞紝%s銆', + ['Full win'] = '鍏ㄥ嫕', + + -- JBAchievementSync.lua + ['MY_JBAchievementSync'] = '鎴愬氨鍚屾', + ['Sync achievement'] = '鍚屾鎴愬氨', + ['Auto sync achievement on exit'] = '涓嬬窔鑷嫊鍚屾鎴愬氨', + ['Sync success.'] = '鍚屾鎴愬姛', + ['Request failed.'] = '璜嬫眰澶辨晽', + + -- MY_JBLoverSync.lua + ['Sync lover'] = '鍚屾鎯呯罚', + ['Sync lover request sent, please wait for peer to agree.'] = '鍚屾鎯呯罚淇℃伅璜嬫眰宸茬櫦閫佽嚦灏嶆柟锛岃珛绛夊緟鎯呯罚鍚屾剰璜嬫眰銆', + ['[%s] want to sync lover relation to jx3box, do you agree?'] = '[%s] 璜嬫眰鍚屾鎯呯罚淇℃伅鍒伴瓟鐩掑钩鑷轰腑锛屾槸鍚﹀悓鎰忓悓姝ワ紵', + ['Sync lover is a sensitive action, please unlock to continue.'] = '鍚屾鎯呯罚淇℃伅鐐烘晱鎰熸搷浣滐紝璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['Peer is not your lover, please check, or do fix lover first.'] = '灏嶆柟涓嶆槸鎮ㄧ殑鎯呯罚锛岃珛鍏堟鏌ユ垨淇鎯呯罚鐙鎱嬨', + ['[%s] disabled ui config sync, unable to read data.'] = '[%s] 闂滈枆浜嗙晫闈㈣ō缃悓姝ワ紝鐒℃硶鐛插彇鎯呯罚鐙鎱嬩俊鎭', + ['Sync success.'] = '鍚屾鎴愬姛', + ['Request failed.'] = '璜嬫眰澶辨晽', + + -- MY_JBEventVote.lua + ['Dungeon Vote'] = '璩戒簨鎶曠エ', + ['MY_JBEventVote'] = '鍦橀殜鎶曠エ', + ['ERR: Decode eventlist content as json failed!'] = '閷锛氳В纰兼鍠垪琛ㄥけ鏁楋紒', + ['ERR: Eventlist content is illegal!'] = '閷锛氭鍠垪琛ㄥ収瀹规暩鎿氱祼妲嬩笉绗﹀悎绱勬潫锛', + ['ERR404: Eventlist address not found!'] = '閷锛氭鍠垪琛ㄥ湴鍧涓嶅瓨鍦紒', + ['Team Name'] = '鍦橀殜鍚嶇ū', + ['Server'] = '浼烘湇鍣', + ['Leader'] = '鍦橀暦', + ['Slogan'] = '瀹h█', + ['Vote Count'] = '浜烘埃', + ['Vote'] = '鎶曠エ', + ['Voted'] = '宸叉姇绁', + ['Finish achieves: '] = '瀹屾垚鎴愬氨锛', + ['Start time: '] = '闁嬪鏅傞枔锛', + ['End time: '] = '绲愭潫鏅傞枔锛', + ['ERR: Decode rankdata content as json failed!'] = '閷锛氳В纰煎垪琛ㄥけ鏁楋紒', + ['ERR: Rankdata content is illegal!'] = '閷锛氬垪琛ㄥ収瀹规暩鎿氱祼妲嬩笉绗﹀悎绱勬潫锛', + ['ERR404: Rankdata address not found!'] = '閷锛氬垪琛ㄥ湴鍧涓嶅瓨鍦紒', + ['View Detail'] = '鏌ョ湅瑭虫儏', + ['ERR: Decode vote content as json failed!'] = '閷锛氳В纰兼姇绁ㄧ祼鏋滃け鏁楋紒', + ['ERR: Vote content is illegal!'] = '閷锛氭姇绁ㄧ祼鏋滃収瀹规暩鎿氱祼妲嬩笉绗﹀悎绱勬潫锛', + ['ERR404: Vote address not found!'] = '閷锛氭姇绁ㄧ祼鏋滃湴鍧涓嶅瓨鍦紒', + + -- MY_JBTeam.lua + ['Quick team'] = '蹇嵎鍏ュ湗', + ['Team name/id'] = '鍦樺悕/ID', + ['Team name/id:'] = '鍦樺悕/ID锛', + ['Apply join team'] = '鐢宠珛鍏ュ湗', + ['Processing, please wait.'] = '鎿嶄綔涓紝璜嬬◢寰屻', + ['Please input team name/id.'] = '璜嬪厛杓稿叆鍦橀殜鍚嶇ū/ID銆', + ['Sure to apply join team %s?'] = '纰哄畾瑕佺敵璜嬪姞鍏ュ湗闅 %s 鍡庯紵', + ['Apply succeed!'] = '鐢宠珛鎴愬姛锛', + ['Apply failed!'] = '鐢宠珛澶辨晽锛', + ['Apply quit team'] = '閫鍑哄湗闅', + ['Sure to apply quit team %s?'] = '纰哄畾瑕侀鍑哄湗闅 %s 鍡庯紵', + ['Quit succeed!'] = '閫鍑烘垚鍔燂紒', + ['Quit failed!'] = '閫鍑哄け鏁楋紒', + + -- MY_JBTeamSnapshot.lua + ['MY_JBTeamSnapshot'] = '鍦橀殜蹇収', + ['Team Snapshot'] = '鍦橀殜蹇収', + ['Team name/id:'] = '鍦樺悕/ID锛', + ['(Input: Team@Server:Passcode)'] = '锛堣几鍏ワ細鍦橀殜鍚嶇ū@浼烘湇鍣ㄥ悕:鍦橀殜瀵嗙⒓锛', + ['Upload Snapshot'] = '蹇収涓婂偝', + ['>> View Snapshots <<'] = '>> 鏌ョ湅蹇収 <<', + ['Upload snapshot succeed!'] = '蹇収涓婂偝鎴愬姛锛', + ['Upload snapshot failed!'] = '蹇収涓婂偝澶辨晽锛', + + -- MY_JB.PS.lua + ['Data sync'] = '鏁告摎鍚屾', +} diff --git a/MY_TeamTools/lang/zhcn.jx3dat b/MY_TeamTools/lang/zhcn.jx3dat new file mode 100644 index 000000000..b3c320405 --- /dev/null +++ b/MY_TeamTools/lang/zhcn.jx3dat @@ -0,0 +1,329 @@ +return { + -- MY_TeamTools + ['MY_TeamTools'] = '团队工具', + ['Open/Close MY_TeamTools'] = '打开/关闭团队工具', + ['Fetch teammate\'s data failed, please unlock talk and reopen.'] = '获取队友数据失败,请解除聊天锁后重新打开界面。', + ['Option'] = '设置', + ['Manage my online world mark'] = '管理我的在线标记', + ['Open Panel'] = '打开界面', + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['[%s] will see your detailed character info request, sure to send request?'] = '查看 [%s] 的详细属性信息需要对方确认,要继续发送请求吗?', + ['Raid Stat'] = '团队统计', + ['Room Stat'] = '房间统计', + -- MY_TeamTools_DeathLog + ['MY_TeamTools_DeathLog'] = '重伤记录', + ['OUTER GUEST'] = '天外来客', + ['Last 5 skill damage'] = '最近5次伤害', + ['PHYSICS_DAMAGE'] = '外功伤害', + ['SOLAR_MAGIC_DAMAGE'] = '阳性内功伤害', + ['NEUTRAL_MAGIC_DAMAGE'] = '混元性内功伤害', + ['LUNAR_MAGIC_DAMAGE'] = '阴性内功伤害', + ['POISON_DAMAGE'] = '毒性伤害', + ['REFLECTIED_DAMAGE'] = '反弹伤害', + ['THERAPY'] = '治疗', + ['STEAL_LIFE'] = '生命偷取', + ['ABSORB_THERAPY'] = '化解治疗', + ['ABSORB_DAMAGE'] = '化解伤害', + ['SHIELD_DAMAGE'] = '无效伤害', + ['PARRY_DAMAGE'] = '拆招', + ['INSIGHT_DAMAGE'] = '识破', + ['EFFECTIVE_DAMAGE'] = '有效伤害', + ['EFFECTIVE_THERAPY'] = '有效治疗', + ['TRANSFER_LIFE'] = '吸取生命', + ['TRANSFER_MANA'] = '吸取内力', + [' * '] = '※', + ['Show all'] = '全部显示', + ['Clear record'] = '清除记录', + -- MY_TeamTools_EnterMap + ['MY_TeamTools_EnterMap'] = '过图记录', + [' enter map %s'] = '进入地图 %s', + [', copy id is %s'] = ',秘境ID为 %s', + [', copy cd is %s'] = ',已有进度 %s', + ['.'] = '。', + -- MY_TeamTools_Summary + ['MY_TeamTools_Summary'] = '团队概况', + ['Equip score'] = '装备得分', + ['Buff score'] = '气劲得分', + ['Food score'] = '小吃得分', + ['Enchant score'] = '附魔得分', + ['Special equip score'] = '特效得分', + ['Too far'] = '距离太远', + ['Loading'] = '加载中', + ['Equip'] = '装备', + ['Dungeon CD'] = '秘境刷新', + ['Room stat map will follow system room dest, cannot be customized.'] = '房间统计模式下地图仅支持跟随房间设置。', + ['Fight'] = '战斗', + ['None'] = '无', + ['Unknown'] = '未知', + ['r'] = '√', + ['x'] = '×', + ['?'] = '?', + [' '] = ' ', + ['%s\'s Team'] = '%s的团队', + -- 匹配特效腰坠,缺少 item.dwSkillID + ['Use:'] = '使用:', + ['Use: '] = '使用:', + ['15 seconds'] = '15秒', + ['Team strength(%d/%d)'] = '团队实力(%d/%d)', + -- MY_TeamTools_Achievement + ['MY_TeamTools_Achievement'] = '成就状态', + ['Name'] = '名字', + ['(Finished)'] = '(已完成)', + ['(Progress)'] = '(未完成)', + ['(Unknown)'] = '(未知)', + ['All map'] = '全部地图', + ['Current map'] = '当前地图', + ['Search'] = '搜索', + ['Intelligent hide'] = '智能隐藏', + ['Hide unimportant achievements'] = '隐藏声望等不需要优先关注的成就', + ['Achievement point: %d'] = '获得资历:%d', + ['Achievement point: %d / %d'] = '获得资历:%d / %d', + ['Refresh'] = '刷新', + ['Team achievement request sent.'] = '刷新团队成就请求已发送。', + + -- MY_PartyRequest + ['MY_CharInfo'] = '角色属性', + ['Party Request'] = '优化申请列表', + ['MY_PartyRequest'] = '组队助手', + ['Party invite request.'] = '对方邀请你组队。', + ['Party apply request.'] = '对方申请加入你的队伍。', + ['Ask details'] = '询问详情', + ['Press ctrl and click to ask detail.'] = '按住CTRL点击左键可询问详情', + ['loading...'] = '读取中..', + ['If it is always loading, the target may not install plugin or refuse.'] = '如果一直提示加载中,可能是对方没有安装插件或者拒绝了您的请求', + ['Allow view charinfo'] = '允许其他人查看属性', + ['MY_WorldMark'] = '世界标记', + ['World mark enhance'] = '世界标记增强', + ['Auto refuse low level player'] = '自动拒绝未满级角色', + ['Auto refuse robot player'] = '自动拒绝疑似工作室角色', + ['Full level and equip score less than 2/3 of yours'] = '非好友、非帮会成员、满级且装备分数低于你的装备分数的三分之二', + ['Auto accept friend'] = '自动通过好友', + ['Auto accept tong member'] = '自动通过帮会成员', + ['Auto accept same camp'] = '自动通过相同阵营角色', + ['Auto accept all'] = '自动通过所有人', + ['Auto accept specific names'] = '自动通过指定角色', + ['Auto accept specific names list'] = '自动通过指定角色具体角色名', + ['Add'] = '添加', + ['Please input custom name, multiple split with ",[]":'] = '请输入自定义角色名称,多个角色名请使用半角逗号或方括号分隔:', + ['Auto refuse %s(%s %d%s) party request, equip score: %d, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动拒绝了 %s(%s %d%s) 的组队请求,装备分数:%d,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto refuse %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动拒绝了 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了好友 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto tong member friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了帮会成员 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto camp %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了同阵营角色 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept %s(%s %d%s) custom party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了指定角色 %s(%s %d%s) 的组队请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Asking...'] = '正在征询对方意见\n如果长时间未响应可能是对方没有安装插件。', + ['Syncing: %.2f%%.'] = '正在同步数据(%.2f%%)...', + ['Refuse request'] = '对方拒绝了您的请求!', + ['Only max level can use this feature.'] = '只有满级角色才能使用该功能。', + ['Party limit'] = '必须和对方组队', + + -- MY_RoomRequest + ['MY_RoomRequest'] = '房间助手', + ['Enable'] = '启用', + ['Auto accept friend'] = '自动通过好友', + ['Auto accept team member'] = '自动通过团队成员', + ['Auto accept tong member'] = '自动通过帮会成员', + ['Auto accept same camp'] = '自动通过相同阵营角色', + ['Auto accept all'] = '自动通过所有人', + ['Auto accept specific names'] = '自动通过指定角色', + ['Add'] = '添加', + ['Please input custom name, multiple split with ",[]":'] = '请输入自定义角色名称,多个角色名请使用半角逗号或方括号分隔:', + ['Please unlock talk lock first.'] = '请先解除聊天锁。', + ['loading...'] = '读取中..', + ['If it is always loading, the target may not install plugin or refuse.'] = '如果一直提示加载中,可能是对方没有安装插件或者拒绝了您的请求', + ['Press ctrl and click to ask detail.'] = '按住CTRL点击左键可询问详情', + ['Auto accept %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了 %s(%s %d%s) 的房间请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept %s(%s %d%s) custom room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了指定角色 %s(%s %d%s) 的房间请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了好友 %s(%s %d%s) 的房间请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto tong member friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了帮会成员 %s(%s %d%s) 的房间请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto camp %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了同阵营角色 %s(%s %d%s) 的房间请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Room invite request.'] = '对方邀请你加入房间。', + ['Room apply request.'] = '对方申请加入你的房间。', + + -- MY_RideRequest + ['MY_RideRequest'] = '同乘助手', + ['Optimize ride and emotion request'] = '优化双人同骑、双人动作请求列表。', + ['Auto accept party'] = '自动通过队友', + ['Auto accept friend'] = '自动通过好友', + ['Auto accept tong member'] = '自动通过帮会成员', + ['Auto accept all'] = '自动通过所有人', + ['Auto accept specific names'] = '自动通过指定角色', + ['Auto refuse others'] = '自动拒绝不符合以上要求的', + ['Auto refuse unknown'] = '自动拒绝非好友、非帮会成员', + ['Add'] = '添加', + ['Please input custom name, multiple split with ",[]":'] = '请输入自定义角色名称,多个角色名请使用半角逗号或方括号分隔:', + ['Auto refuse %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动拒绝了 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept party %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了队友 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了好友 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto tong member friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了帮会成员 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + ['Auto accept %s custom ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '自动通过了指定角色 %s 的同乘请求,如需关闭该功能请前往茗伊插件/团队/团队工具取消勾选对应项。', + + -- MY_EvokeRequest + ['MY_EvokeRequest'] = '召请助手', + + -- MY_SocialRequest + ['MY_SocialRequest'] = '社交助手', + ['Optimize social friend request'] = '优化好友添加请求列表。', + ['Enable'] = '启用', + ['Add'] = '添加', + ['Ignore'] = '忽略', + + -- MY_TeamNotice + ['MY_TeamNotice'] = '团队小告示', + ['Edit team info?'] = '是否填写团队小告示(团员进组可看到)', + ['Team Message'] = '团队告示', + ['Asking..., If no response in longtime, team leader not enable plug-in.'] = '请求已发出,如果没有响应可能是团长没有开启小告示', + ['YY:'] = 'YY:', + ['DC:'] = 'DC:', + ['Paste YY'] = '发布YY', + ['Paste DC'] = '发布DC', + ['Copy YY'] = '复制YY', + ['Copy DC'] = '复制DC', + ['Channel number has been copied to clipboard'] = '频道号已复制到剪贴板', + ['GKP Golden Team Record'] = '金团记录', + ['You haven\'t had MY_GKP installed and loaded yet.'] = '喂!你并没有安装和加载茗伊金团记录!小退检查下插件吧╭(╯^╰)╮', + ['Import Data'] = '导入数据', + + ['TeamNotice is disabled in this map.'] = '本地图禁止使用团队告示', + + -- MY_TeamRestore.lua -- + ['MY_TeamRestore'] = '团队保存', + ['You are not in a team'] = '你不在团队中。', + ['Left click to recovery, right click for more.'] = '左键单击恢复队伍,右键查看更多选项。', + ['Save team name'] = '保存团队名称', + ['Restore'] = '恢复', + ['Restore2'] = '恢复', + ['Delete'] = '删除', + ['Rename'] = '改名', + ['Replace'] = '替换', + ['Detail'] = '详情', + ['Save Team'] = '保存队伍', + ['Leader:%s'] = '队长:%s', + ['Distribute:%s'] = '分配者:%s', + ['Mark:%s'] = '标记者:%s', + ['Party %d'] = '小队 %d', + ['Team list data saved'] = '团队列表数据已保存。', + ['Restore formation of %d group: %s'] = '恢复%d小队阵眼:%s。', + ['Restore player marked as [%s]: %s'] = '恢复团队标记[%s]:%s。', + ['You have not saved team list data'] = '你没有保存过该团队列表', + ['You are not team leader, permission denied'] = '你不是队长,不能恢复。', + ['Unable get player of %d group: #%d'] = '恢复%d小队角色失败:#%d。', + ['Unknown status: %s'] = '未知状态:%s。', + ['Need not adjust: %s'] = '无需操作:%s。', + ['Restore distributor: %s'] = '恢复分配者:%s。', + ['Change group of [%s] to %d'] = '调整队伍[%s]到%d小队。', + ['Restore team leader: %s'] = '恢复团队队长:%s。', + ['Restore team marker: %s'] = '恢复团队标记者:%s。', + ['Team list restored'] = '团队列表已恢复。', + + -- TeamAD.lua -- + ['MY_TeamAD'] = '团队喊话', + ['Gadgets'] = '小玩意', + ['Delete'] = '删除', + ['Advertising Tips'] = '<< 将保留在聊天编辑框内的喊话保存', + ['Save Talk'] = '喊话保存', + ['Chat box is empty'] = '聊天框是空的!请将编辑在聊天框的广告不要发出。', + ['Save Advertising'] = '保存喊话', + ['Save Advertising Name'] = '保存名(如:烛龙殿2/HG) 5字内', + ['Advertising List'] = '喊话列表 (左键导入聊天框,右键更多选项)', + + -- MY_TeamCountdown.lua -- + ['MY_TeamCountdown'] = '团队倒计时', + ['You are not leader!'] = '你不是队长!', + ['Please unlock safety talk lock first!'] = '请先解除聊天锁!', + ['Team countdown seconds'] = '团队倒计时秒数:', + ['Invalid countdown time input.'] = '输入的秒数不是纯数字!', + ['Countdown time cannot be more than %ds.'] = '秒数不能超过%d秒!', + ['Countdown time cannot be less than %ds.'] = '秒数不能低于%d秒!', + ['Send team countdown'] = '发送团队倒计时', + ['Fight Begin'] = '战斗开始', + ['[TeamCountdown] Fight Begin!'] = '【团队倒计时】战斗开始!', + ['[TeamCountdown] Fight Countdown Begin!'] = '【团队倒计时】开始倒数!', + ['[TeamCountdown] %ds!'] = '【团队倒计时】%d!', + ['Open MY_TeamCountdown'] = '打开团队倒计时', + + -- MY_CombatLogs.lua + ['MY_CombatLogs'] = '战斗事件记录', + ['This feature has been disabled on HDD disk machine for performance issues.'] = '检测到游戏所在磁盘为机械硬盘,由于磁盘吞吐量限制,该功能无法正常启用,请将游戏移动到固态硬盘后再尝试开启。', + ['Enable in dungeon'] = '在秘境地图中启用', + ['Enable in arena'] = '在名剑大会中启用', + ['Enable in battlefield'] = '在战场地图中启用', + ['Enable in other maps'] = '在其他地图中启用', + ['Save all nearby records'] = '保存所有角色记录', + ['Check to save all nearby records, otherwise only save records related to me'] = '勾选则保存附近所有角色的事件记录,否则仅记录与自身有关的事件记录', + ['PVP mode'] = '启用角色对抗模式', + ['Save target information on event\n(Only in arena)'] = '记录各类事件发生时的角色坐标面向气血内力等基础信息(仅在名剑大会中生效)', + ['Target Information Throttle Time'] = '保存角色状态数据节流时间间隔', + ['Max history'] = '最大历史记录数量', + ['Min fight time'] = '最小战斗时间限制', + ['%s second(s)'] = '%s秒', + ['Show data files'] = '打开数据所在目录', + + -- MY_YunWorldMark.lua + ['MY_YunWorldMark'] = '云世界标记', + ['Data subscribe'] = '数据订阅', + ['World mark'] = '世界标记', + ['Get current mark data'] = '获取当前标记数据', + ['Restore world mark position'] = '恢复世界标记位置', + ['Please input world mark json:'] = '请输入世界标记 JSON:', + ['Search MY cloud world mark'] = '搜索茗伊云端标记', + ['Key'] = '标识', + ['ID'] = 'ID', + ['About'] = '关于', + ['Author'] = '作者', + ['Update time'] = '更新时间', + ['Action'] = '操作', + ['Use'] = '使用', + ['Fetch repo meta list failed.'] = '获取仓库列表失败。', + ['Decode %s failed!'] = '解码%s失败!', + ['Done, %s marks applied.'] = '完成,已应用%s个标点。', + ['Failed.'] = '失败。', + ['Only team marker can do this.'] = '仅团队标记者可进行该操作。', + ['About to clear all current world marks and set %d new world marks, continue?'] = '即将清空当前所有世界标记,并设置新的%d个世界标记,是否继续?', + ['All maps'] = '所有地图', + ['Favorite list'] = '收藏列表', + ['Filter favorites'] = '过滤收藏', + ['Add to favorites'] = '添加到收藏', + ['Remove from favorites'] = '从收藏中移除', + ['Added to favorites.'] = '已添加到收藏。', + -- MY_YunWorldMark_LocalData.lua + ['Local data'] = '本地数据', + ['Add to local data'] = '添加到本地数据', + ['Added to local data.'] = '已添加到本地数据。', + ['Local data updated.'] = '本地数据已更新。', + ['Filter local data'] = '过滤本地数据', + ['Edit data'] = '编辑数据', + ['Delete data'] = '删除数据', + ['No data.'] = '没有数据。', + ['Edit local data'] = '编辑本地数据', + ['Add local data'] = '添加本地数据', + ['Map'] = '地图', + ['Title'] = '标题', + ['Content'] = '内容', + ['Confirm'] = '确认', + ['Data title'] = '数据标题', + ['Data author'] = '数据作者', + ['World mark json data'] = '世界标记 JSON 数据', + ['Please input title.'] = '请输入标题。', + ['Confirm?'] = '确定?', +} diff --git a/MY_TeamTools/lang/zhtw.jx3dat b/MY_TeamTools/lang/zhtw.jx3dat new file mode 100644 index 000000000..cc0c8283a --- /dev/null +++ b/MY_TeamTools/lang/zhtw.jx3dat @@ -0,0 +1,329 @@ +return { + -- MY_TeamTools + ['MY_TeamTools'] = '鍦橀殜宸ュ叿', + ['Open/Close MY_TeamTools'] = '鎵撻枊/闂滈枆鍦橀殜宸ュ叿', + ['Fetch teammate\'s data failed, please unlock talk and reopen.'] = '鐛插彇闅婂弸鏁告摎澶辨晽锛岃珛瑙i櫎鑱婂ぉ閹栧緦閲嶆柊鎵撻枊鐣岄潰銆', + ['Option'] = '瑷疆', + ['Manage my online world mark'] = '绠$悊鎴戠殑鍦ㄧ窔妯欒', + ['Open Panel'] = '鎵撻枊鐣岄潰', + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['[%s] will see your detailed character info request, sure to send request?'] = '鏌ョ湅 [%s] 鐨勮┏绱板爆鎬т俊鎭渶瑕佸皪鏂圭⒑瑾嶏紝瑕佺辜绾岀櫦閫佽珛姹傚棊锛', + ['Raid Stat'] = '鍦橀殜绲辫▓', + ['Room Stat'] = '鎴块枔绲辫▓', + -- MY_TeamTools_DeathLog + ['MY_TeamTools_DeathLog'] = '閲嶅偡瑷橀寗', + ['OUTER GUEST'] = '澶╁渚嗗', + ['Last 5 skill damage'] = '鏈杩5娆″偡瀹', + ['PHYSICS_DAMAGE'] = '澶栧姛鍌峰', + ['SOLAR_MAGIC_DAMAGE'] = '闄芥у収鍔熷偡瀹', + ['NEUTRAL_MAGIC_DAMAGE'] = '娣峰厓鎬у収鍔熷偡瀹', + ['LUNAR_MAGIC_DAMAGE'] = '闄版у収鍔熷偡瀹', + ['POISON_DAMAGE'] = '姣掓у偡瀹', + ['REFLECTIED_DAMAGE'] = '鍙嶅綀鍌峰', + ['THERAPY'] = '娌荤檪', + ['STEAL_LIFE'] = '鐢熷懡鍋峰彇', + ['ABSORB_THERAPY'] = '鍖栬В娌荤檪', + ['ABSORB_DAMAGE'] = '鍖栬В鍌峰', + ['SHIELD_DAMAGE'] = '鐒℃晥鍌峰', + ['PARRY_DAMAGE'] = '鎷嗘嫑', + ['INSIGHT_DAMAGE'] = '璀樼牬', + ['EFFECTIVE_DAMAGE'] = '鏈夋晥鍌峰', + ['EFFECTIVE_THERAPY'] = '鏈夋晥娌荤檪', + ['TRANSFER_LIFE'] = '鍚稿彇鐢熷懡', + ['TRANSFER_MANA'] = '鍚稿彇鍏у姏', + [' * '] = '鈥', + ['Show all'] = '鍏ㄩ儴椤ず', + ['Clear record'] = '娓呴櫎瑷橀寗', + -- MY_TeamTools_EnterMap + ['MY_TeamTools_EnterMap'] = '閬庡湒瑷橀寗', + [' enter map %s'] = '閫插叆鍦板湒 %s', + [', copy id is %s'] = '锛岀澧僆D鐐 %s', + [', copy cd is %s'] = '锛屽凡鏈夐插害 %s', + ['.'] = '銆', + -- MY_TeamTools_Summary + ['MY_TeamTools_Summary'] = '鍦橀殜姒傛硜', + ['Equip score'] = '瑁濆倷寰楀垎', + ['Buff score'] = '姘e媮寰楀垎', + ['Food score'] = '灏忓悆寰楀垎', + ['Enchant score'] = '闄勯瓟寰楀垎', + ['Special equip score'] = '鐗规晥寰楀垎', + ['Too far'] = '璺濋洟澶仩', + ['Loading'] = '杓夊叆涓', + ['Equip'] = '瑁濆倷', + ['Dungeon CD'] = '绉樺鍒锋柊', + ['Room stat map will follow system room dest, cannot be customized.'] = '鎴块枔绲辫▓妯″紡涓嬪湴鍦栧儏鏀寔璺熼毃鎴块枔瑷疆銆', + ['Fight'] = '鎴伴', + ['None'] = '鐒', + ['Unknown'] = '鏈煡', + ['r'] = '鈭', + ['x'] = '脳', + ['?'] = '锛', + [' '] = '銆', + ['%s\'s Team'] = '%s鐨勫湗闅', + -- 鍖归厤鐗规晥鑵板锛岀己灏 item.dwSkillID + ['Use:'] = '浣跨敤:', + ['Use: '] = '浣跨敤锛', + ['15 seconds'] = '15绉', + ['Team strength(%d/%d)'] = '鍦橀殜瀵﹀姏(%d/%d)', + -- MY_TeamTools_Achievement + ['MY_TeamTools_Achievement'] = '鎴愬氨鐙鎱', + ['Name'] = '鍚嶅瓧', + ['(Finished)'] = '(宸插畬鎴)', + ['(Progress)'] = '(鏈畬鎴)', + ['(Unknown)'] = '(鏈煡)', + ['All map'] = '鍏ㄩ儴鍦板湒', + ['Current map'] = '鐣跺墠鍦板湒', + ['Search'] = '鎼滅储', + ['Intelligent hide'] = '鏅鸿兘闅辫棌', + ['Hide unimportant achievements'] = '闅辫棌鑱叉湜绛変笉闇瑕佸劒鍏堥棞娉ㄧ殑鎴愬氨', + ['Achievement point: %d'] = '鐛插緱璩囨锛%d', + ['Achievement point: %d / %d'] = '鐛插緱璩囨锛%d / %d', + ['Refresh'] = '鍒锋柊', + ['Team achievement request sent.'] = '鍒锋柊鍦橀殜鎴愬氨璜嬫眰宸茬櫦閫併', + + -- MY_PartyRequest + ['MY_CharInfo'] = '瑙掕壊灞', + ['Party Request'] = '鍎寲鐢宠珛鍒楄〃', + ['MY_PartyRequest'] = '绲勯殜鍔╂墜', + ['Party invite request.'] = '灏嶆柟閭璜嬩綘绲勯殜銆', + ['Party apply request.'] = '灏嶆柟鐢宠珛鍔犲叆浣犵殑闅婁紞銆', + ['Ask details'] = '瑭㈠晱瑭虫儏', + ['Press ctrl and click to ask detail.'] = '鎸変綇CTRL榛炴搳宸﹂嵉鍙鍟忚┏鎯', + ['loading...'] = '璁鍙栦腑..', + ['If it is always loading, the target may not install plugin or refuse.'] = '濡傛灉涓鐩存彁绀鸿級鍏ヤ腑锛屽彲鑳芥槸灏嶆柟娌掓湁瀹夎鎻掍欢鎴栬呮嫆绲曚簡鎮ㄧ殑璜嬫眰', + ['Allow view charinfo'] = '鍏佽ū鍏朵粬浜烘煡鐪嬪爆鎬', + ['MY_WorldMark'] = '涓栫晫妯欒', + ['World mark enhance'] = '涓栫晫妯欒澧炲挤', + ['Auto refuse low level player'] = '鑷嫊鎷掔禃鏈豢绱氳鑹', + ['Auto refuse robot player'] = '鑷嫊鎷掔禃鐤戜技宸ヤ綔瀹よ鑹', + ['Full level and equip score less than 2/3 of yours'] = '闈炲ソ鍙嬨侀潪骞渻鎴愬摗銆佹豢绱氫笖瑁濆倷鍒嗘暩浣庢柤浣犵殑瑁濆倷鍒嗘暩鐨勪笁鍒嗕箣浜', + ['Auto accept friend'] = '鑷嫊閫氶亷濂藉弸', + ['Auto accept tong member'] = '鑷嫊閫氶亷骞渻鎴愬摗', + ['Auto accept same camp'] = '鑷嫊閫氶亷鐩稿悓闄g嚐瑙掕壊', + ['Auto accept all'] = '鑷嫊閫氶亷鎵鏈変汉', + ['Auto accept specific names'] = '鑷嫊閫氶亷鎸囧畾瑙掕壊', + ['Auto accept specific names list'] = '鑷嫊閫氶亷鎸囧畾瑙掕壊鍏烽珨瑙掕壊鍚', + ['Add'] = '娣诲姞', + ['Please input custom name, multiple split with ",[]":'] = '璜嬭几鍏ヨ嚜瀹氱京瑙掕壊鍚嶇ū锛屽鍊嬭鑹插悕璜嬩娇鐢ㄥ崐褰㈤楄櫉鎴栨柟鎷姬鍒嗛殧锛', + ['Auto refuse %s(%s %d%s) party request, equip score: %d, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊鎷掔禃浜 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝瑁濆倷鍒嗘暩锛%d锛屽闇闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto refuse %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊鎷掔禃浜 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗ソ鍙 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto tong member friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗公鏈冩垚鍝 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto camp %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗悓闄g嚐瑙掕壊 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept %s(%s %d%s) custom party request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗘寚瀹氳鑹 %s(%s %d%s) 鐨勭祫闅婅珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Asking...'] = '姝e湪寰佃灏嶆柟鎰忚\n濡傛灉闀锋檪闁撴湭闊挎噳鍙兘鏄皪鏂规矑鏈夊畨瑁濇彃浠躲', + ['Syncing: %.2f%%.'] = '姝e湪鍚屾鏁告摎(%.2f%%)...', + ['Refuse request'] = '灏嶆柟鎷掔禃浜嗘偍鐨勮珛姹傦紒', + ['Only max level can use this feature.'] = '鍙湁婊跨礆瑙掕壊鎵嶈兘浣跨敤瑭插姛鑳姐', + ['Party limit'] = '蹇呴爤鍜屽皪鏂圭祫闅', + + -- MY_RoomRequest + ['MY_RoomRequest'] = '鎴块枔鍔╂墜', + ['Enable'] = '鍟熺敤', + ['Auto accept friend'] = '鑷嫊閫氶亷濂藉弸', + ['Auto accept team member'] = '鑷嫊閫氶亷鍦橀殜鎴愬摗', + ['Auto accept tong member'] = '鑷嫊閫氶亷骞渻鎴愬摗', + ['Auto accept same camp'] = '鑷嫊閫氶亷鐩稿悓闄g嚐瑙掕壊', + ['Auto accept all'] = '鑷嫊閫氶亷鎵鏈変汉', + ['Auto accept specific names'] = '鑷嫊閫氶亷鎸囧畾瑙掕壊', + ['Add'] = '娣诲姞', + ['Please input custom name, multiple split with ",[]":'] = '璜嬭几鍏ヨ嚜瀹氱京瑙掕壊鍚嶇ū锛屽鍊嬭鑹插悕璜嬩娇鐢ㄥ崐褰㈤楄櫉鎴栨柟鎷姬鍒嗛殧锛', + ['Please unlock talk lock first.'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栥', + ['loading...'] = '璁鍙栦腑..', + ['If it is always loading, the target may not install plugin or refuse.'] = '濡傛灉涓鐩存彁绀鸿級鍏ヤ腑锛屽彲鑳芥槸灏嶆柟娌掓湁瀹夎鎻掍欢鎴栬呮嫆绲曚簡鎮ㄧ殑璜嬫眰', + ['Press ctrl and click to ask detail.'] = '鎸変綇CTRL榛炴搳宸﹂嵉鍙鍟忚┏鎯', + ['Auto accept %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜 %s(%s %d%s) 鐨勬埧闁撹珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept %s(%s %d%s) custom room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗘寚瀹氳鑹 %s(%s %d%s) 鐨勬埧闁撹珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗ソ鍙 %s(%s %d%s) 鐨勬埧闁撹珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto tong member friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗公鏈冩垚鍝 %s(%s %d%s) 鐨勬埧闁撹珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto camp %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗悓闄g嚐瑙掕壊 %s(%s %d%s) 鐨勬埧闁撹珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Room invite request.'] = '灏嶆柟閭璜嬩綘鍔犲叆鎴块枔銆', + ['Room apply request.'] = '灏嶆柟鐢宠珛鍔犲叆浣犵殑鎴块枔銆', + + -- MY_RideRequest + ['MY_RideRequest'] = '鍚屼箻鍔╂墜', + ['Optimize ride and emotion request'] = '鍎寲闆欎汉鍚岄◣銆侀洐浜哄嫊浣滆珛姹傚垪琛ㄣ', + ['Auto accept party'] = '鑷嫊閫氶亷闅婂弸', + ['Auto accept friend'] = '鑷嫊閫氶亷濂藉弸', + ['Auto accept tong member'] = '鑷嫊閫氶亷骞渻鎴愬摗', + ['Auto accept all'] = '鑷嫊閫氶亷鎵鏈変汉', + ['Auto accept specific names'] = '鑷嫊閫氶亷鎸囧畾瑙掕壊', + ['Auto refuse others'] = '鑷嫊鎷掔禃涓嶇鍚堜互涓婅姹傜殑', + ['Auto refuse unknown'] = '鑷嫊鎷掔禃闈炲ソ鍙嬨侀潪骞渻鎴愬摗', + ['Add'] = '娣诲姞', + ['Please input custom name, multiple split with ",[]":'] = '璜嬭几鍏ヨ嚜瀹氱京瑙掕壊鍚嶇ū锛屽鍊嬭鑹插悕璜嬩娇鐢ㄥ崐褰㈤楄櫉鎴栨柟鎷姬鍒嗛殧锛', + ['Auto refuse %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊鎷掔禃浜 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept party %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗛殜鍙 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗ソ鍙 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto tong member friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗗公鏈冩垚鍝 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + ['Auto accept %s custom ride request, go to MY/raid/teamtools panel if you want to turn off this feature.'] + = '鑷嫊閫氶亷浜嗘寚瀹氳鑹 %s 鐨勫悓涔樿珛姹傦紝濡傞渶闂滈枆瑭插姛鑳借珛鍓嶅線鑼椾紛鎻掍欢/鍦橀殜/鍦橀殜宸ュ叿鍙栨秷鍕鹃伕灏嶆噳闋呫', + + -- MY_EvokeRequest + ['MY_EvokeRequest'] = '鍙珛鍔╂墜', + + -- MY_SocialRequest + ['MY_SocialRequest'] = '绀句氦鍔╂墜', + ['Optimize social friend request'] = '鍎寲濂藉弸娣诲姞璜嬫眰鍒楄〃銆', + ['Enable'] = '鍟熺敤', + ['Add'] = '娣诲姞', + ['Ignore'] = '蹇界暐', + + -- MY_TeamNotice + ['MY_TeamNotice'] = '鍦橀殜灏忓憡绀', + ['Edit team info?'] = '鏄惁濉鍦橀殜灏忓憡绀猴紙鍦樺摗閫茬祫鍙湅鍒帮級', + ['Team Message'] = '鍦橀殜鍛婄ず', + ['Asking..., If no response in longtime, team leader not enable plug-in.'] = '璜嬫眰宸茬櫦鍑猴紝濡傛灉娌掓湁闊挎噳鍙兘鏄湗闀锋矑鏈夐枊鍟熷皬鍛婄ず', + ['YY:'] = 'YY:', + ['DC:'] = 'DC:', + ['Paste YY'] = '鐧间綀YY', + ['Paste DC'] = '鐧间綀DC', + ['Copy YY'] = '瑜囪=YY', + ['Copy DC'] = '瑜囪=DC', + ['Channel number has been copied to clipboard'] = '闋婚亾铏熷凡瑜囪=鍒板壀璨兼澘', + ['GKP Golden Team Record'] = '閲戝湗瑷橀寗', + ['You haven\'t had MY_GKP installed and loaded yet.'] = '鍠傦紒浣犱甫娌掓湁瀹夎鍜岃級鍏ヨ寳浼婇噾鍦樿閷勶紒灏忛妾㈡煡涓嬫彃浠跺惂鈺(鈺痎鈺)鈺', + ['Import Data'] = '灏庡叆鏁告摎', + + ['TeamNotice is disabled in this map.'] = '鏈湴鍦栫姝娇鐢ㄥ湗闅婂憡绀', + + -- MY_TeamRestore.lua -- + ['MY_TeamRestore'] = '鍦橀殜淇濆瓨', + ['You are not in a team'] = '浣犱笉鍦ㄥ湗闅婁腑銆', + ['Left click to recovery, right click for more.'] = '宸﹂嵉鍠搳鎭㈠京闅婁紞锛屽彸閸垫煡鐪嬫洿澶氶伕闋呫', + ['Save team name'] = '淇濆瓨鍦橀殜鍚嶇ū', + ['Restore'] = '鎭㈠京', + ['Restore2'] = '鎭㈠京', + ['Delete'] = '鍒櫎', + ['Rename'] = '鏀瑰悕', + ['Replace'] = '鏇挎彌', + ['Detail'] = '瑭虫儏', + ['Save Team'] = '淇濆瓨闅婁紞', + ['Leader:%s'] = '闅婇暦锛%s', + ['Distribute:%s'] = '鍒嗛厤鑰咃細%s', + ['Mark:%s'] = '妯欒鑰咃細%s', + ['Party %d'] = '灏忛殜 %d', + ['Team list data saved'] = '鍦橀殜鍒楄〃鏁告摎宸蹭繚瀛樸', + ['Restore formation of %d group: %s'] = '鎭㈠京%d灏忛殜闄g溂锛%s銆', + ['Restore player marked as [%s]: %s'] = '鎭㈠京鍦橀殜妯欒[%s]锛%s銆', + ['You have not saved team list data'] = '浣犳矑鏈変繚瀛橀亷瑭插湗闅婂垪琛', + ['You are not team leader, permission denied'] = '浣犱笉鏄殜闀凤紝涓嶈兘鎭㈠京銆', + ['Unable get player of %d group: #%d'] = '鎭㈠京%d灏忛殜瑙掕壊澶辨晽锛#%d銆', + ['Unknown status: %s'] = '鏈煡鐙鎱嬶細%s銆', + ['Need not adjust: %s'] = '鐒¢渶鎿嶄綔锛%s銆', + ['Restore distributor: %s'] = '鎭㈠京鍒嗛厤鑰咃細%s銆', + ['Change group of [%s] to %d'] = '瑾挎暣闅婁紞[%s]鍒%d灏忛殜銆', + ['Restore team leader: %s'] = '鎭㈠京鍦橀殜闅婇暦锛%s銆', + ['Restore team marker: %s'] = '鎭㈠京鍦橀殜妯欒鑰咃細%s銆', + ['Team list restored'] = '鍦橀殜鍒楄〃宸叉仮寰┿', + + -- TeamAD.lua -- + ['MY_TeamAD'] = '鍦橀殜鍠婅┍', + ['Gadgets'] = '灏忕帺鎰', + ['Delete'] = '鍒櫎', + ['Advertising Tips'] = '<< 灏囦繚鐣欏湪鑱婂ぉ绶ㄨ集妗嗗収鐨勫枈瑭变繚瀛', + ['Save Talk'] = '鍠婅┍淇濆瓨', + ['Chat box is empty'] = '鑱婂ぉ妗嗘槸绌虹殑锛佽珛灏囩法杓湪鑱婂ぉ妗嗙殑寤e憡涓嶈鐧煎嚭銆', + ['Save Advertising'] = '淇濆瓨鍠婅┍', + ['Save Advertising Name'] = '淇濆瓨鍚(濡傦細鐕緧娈2/HG) 5瀛楀収', + ['Advertising List'] = '鍠婅┍鍒楄〃 锛堝乏閸靛皫鍏ヨ亰澶╂锛屽彸閸垫洿澶氶伕闋咃級', + + -- MY_TeamCountdown.lua -- + ['MY_TeamCountdown'] = '鍦橀殜鍊掕▓鏅', + ['You are not leader!'] = '浣犱笉鏄殜闀凤紒', + ['Please unlock safety talk lock first!'] = '璜嬪厛瑙i櫎鑱婂ぉ閹栵紒', + ['Team countdown seconds'] = '鍦橀殜鍊掕▓鏅傜鏁革細', + ['Invalid countdown time input.'] = '杓稿叆鐨勭鏁镐笉鏄磾鏁稿瓧锛', + ['Countdown time cannot be more than %ds.'] = '绉掓暩涓嶈兘瓒呴亷%d绉掞紒', + ['Countdown time cannot be less than %ds.'] = '绉掓暩涓嶈兘浣庢柤%d绉掞紒', + ['Send team countdown'] = '鐧奸佸湗闅婂掕▓鏅', + ['Fight Begin'] = '鎴伴闁嬪', + ['[TeamCountdown] Fight Begin!'] = '銆愬湗闅婂掕▓鏅傘戞埌楝ラ枊濮嬶紒', + ['[TeamCountdown] Fight Countdown Begin!'] = '銆愬湗闅婂掕▓鏅傘戦枊濮嬪掓暩锛', + ['[TeamCountdown] %ds!'] = '銆愬湗闅婂掕▓鏅傘%d锛', + ['Open MY_TeamCountdown'] = '鎵撻枊鍦橀殜鍊掕▓鏅', + + -- MY_CombatLogs.lua + ['MY_CombatLogs'] = '鎴伴浜嬩欢瑷橀寗', + ['This feature has been disabled on HDD disk machine for performance issues.'] = '妾㈡脯鍒版父鎴叉墍鍦ㄧ纰熺偤姗熸纭锛岀敱鏂肩纰熷悶鍚愰噺闄愬埗锛岃┎鍔熻兘鐒℃硶姝e父鍟熺敤锛岃珛灏囨父鎴茬Щ鍕曞埌鍥烘厠纭寰屽啀鍢楄│闁嬪暉銆', + ['Enable in dungeon'] = '鍦ㄧ澧冨湴鍦栦腑鍟熺敤', + ['Enable in arena'] = '鍦ㄥ悕鍔嶅ぇ鏈冧腑鍟熺敤', + ['Enable in battlefield'] = '鍦ㄦ埌鍫村湴鍦栦腑鍟熺敤', + ['Enable in other maps'] = '鍦ㄥ叾浠栧湴鍦栦腑鍟熺敤', + ['Save all nearby records'] = '淇濆瓨鎵鏈夎鑹茶閷', + ['Check to save all nearby records, otherwise only save records related to me'] = '鍕鹃伕鍓囦繚瀛橀檮杩戞墍鏈夎鑹茬殑浜嬩欢瑷橀寗锛屽惁鍓囧儏瑷橀寗鑸囪嚜韬湁闂滅殑浜嬩欢瑷橀寗', + ['PVP mode'] = '鍟熺敤瑙掕壊灏嶆姉妯″紡', + ['Save target information on event\n(Only in arena)'] = '瑷橀寗鍚勯浜嬩欢鐧肩敓鏅傜殑瑙掕壊鍧愭闈㈠悜姘h鍏у姏绛夊熀绀庝俊鎭紙鍍呭湪鍚嶅妽澶ф渻涓敓鏁堬級', + ['Target Information Throttle Time'] = '淇濆瓨瑙掕壊鐙鎱嬫暩鎿氱瘈娴佹檪闁撻枔闅', + ['Max history'] = '鏈澶ф鍙茶閷勬暩閲', + ['Min fight time'] = '鏈灏忔埌楝ユ檪闁撻檺鍒', + ['%s second(s)'] = '%s绉', + ['Show data files'] = '鎵撻枊鏁告摎鎵鍦ㄧ洰閷', + + -- MY_YunWorldMark.lua + ['MY_YunWorldMark'] = '闆蹭笘鐣屾瑷', + ['Data subscribe'] = '鏁告摎瑷傞柋', + ['World mark'] = '涓栫晫妯欒', + ['Get current mark data'] = '鐛插彇鐣跺墠妯欒鏁告摎', + ['Restore world mark position'] = '鎭㈠京涓栫晫妯欒浣嶇疆', + ['Please input world mark json:'] = '璜嬭几鍏ヤ笘鐣屾瑷 JSON锛', + ['Search MY cloud world mark'] = '鎼滅储鑼椾紛闆茬妯欒', + ['Key'] = '妯欒瓨', + ['ID'] = 'ID', + ['About'] = '闂滄柤', + ['Author'] = '浣滆', + ['Update time'] = '鏇存柊鏅傞枔', + ['Action'] = '鎿嶄綔', + ['Use'] = '浣跨敤', + ['Fetch repo meta list failed.'] = '鐛插彇鍊夊韩鍒楄〃澶辨晽銆', + ['Decode %s failed!'] = '瑙g⒓%s澶辨晽锛', + ['Done, %s marks applied.'] = '瀹屾垚锛屽凡鎳夌敤%s鍊嬫榛炪', + ['Failed.'] = '澶辨晽銆', + ['Only team marker can do this.'] = '鍍呭湗闅婃瑷樿呭彲閫茶瑭叉搷浣溿', + ['About to clear all current world marks and set %d new world marks, continue?'] = '鍗冲皣娓呯┖鐣跺墠鎵鏈変笘鐣屾瑷橈紝涓﹁ō缃柊鐨%d鍊嬩笘鐣屾瑷橈紝鏄惁绻肩簩锛', + ['All maps'] = '鎵鏈夊湴鍦', + ['Favorite list'] = '鏀惰棌鍒楄〃', + ['Filter favorites'] = '閬庢烤鏀惰棌', + ['Add to favorites'] = '娣诲姞鍒版敹钘', + ['Remove from favorites'] = '寰炴敹钘忎腑绉婚櫎', + ['Added to favorites.'] = '宸叉坊鍔犲埌鏀惰棌銆', + -- MY_YunWorldMark_LocalData.lua + ['Local data'] = '鏈湴鏁告摎', + ['Add to local data'] = '娣诲姞鍒版湰鍦版暩鎿', + ['Added to local data.'] = '宸叉坊鍔犲埌鏈湴鏁告摎銆', + ['Local data updated.'] = '鏈湴鏁告摎宸叉洿鏂般', + ['Filter local data'] = '閬庢烤鏈湴鏁告摎', + ['Edit data'] = '绶ㄨ集鏁告摎', + ['Delete data'] = '鍒櫎鏁告摎', + ['No data.'] = '娌掓湁鏁告摎銆', + ['Edit local data'] = '绶ㄨ集鏈湴鏁告摎', + ['Add local data'] = '娣诲姞鏈湴鏁告摎', + ['Map'] = '鍦板湒', + ['Title'] = '妯欓', + ['Content'] = '鍏у', + ['Confirm'] = '纰鸿獚', + ['Data title'] = '鏁告摎妯欓', + ['Data author'] = '鏁告摎浣滆', + ['World mark json data'] = '涓栫晫妯欒 JSON 鏁告摎', + ['Please input title.'] = '璜嬭几鍏ユ椤屻', + ['Confirm?'] = '纰哄畾锛', +} diff --git a/MY_TeamTools/src/MY_CharInfo.lua b/MY_TeamTools/src/MY_CharInfo.lua new file mode 100644 index 000000000..4c11d41e2 --- /dev/null +++ b/MY_TeamTools/src/MY_CharInfo.lua @@ -0,0 +1,250 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 角色属性 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_CharInfo' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_CharInfo.Daddy', { ['*'] = true }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_CharInfo', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CharInfo'], + _L['Allow view charinfo'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local CharInfo = {} + +function CharInfo.GetFrame(dwID) + return Station.Lookup('Normal/MY_CharInfo' .. dwID) +end + +function CharInfo.CreateFrame(dwID, szName) + local ui = X.UI.CreateFrame('MY_CharInfo' .. dwID, { w = 240, h = 400, text = '', close = true }) + local frame = CharInfo.GetFrame(dwID) + local x, y = 20, 10 + x = x + ui:Append('Image', { + name = 'Image_Kungfu', + x = x, y = y, w = 30, h = 30, + }):Width() + 5 + ui:Append('Text', { + name = 'Text_Name', + x = x, y = y + 2, w = 240 - 2 * x, + text = X.StringSubW(szName, 1, 6), alignHorizontal = 1, + }) -- UI超了 + ui:Append('WndButton', { + name = 'LOOKUP', x = 70, y = 360, + text = g_tStrings.STR_LOOKUP, + buttonStyle = 'FLAT', + onClick = function() + X.ViewOtherPlayerByID(dwID) + end, + }) + ui:Append('Text', { name = 'Text_Info', x = 20, y = 72, text = _L['Asking...'], w = 200, h = 70, font = 27, multiline = true }) + frame.pending = true +end + +function CharInfo.UpdateFrame(frame, status, data) + if not frame or not frame.pending then + return + end + local ui = X.UI(frame) + if status == 'REFUSE' then + ui:Children('#Text_Info'):Text(_L['Refuse request']):Show() + frame.pending = false + elseif status == 'PROGRESS' then + ui:Children('#Text_Info'):Text(_L('Syncing: %.2f%%.', data)):Show() + elseif status == 'ACCEPT' and data and type(data) == 'table' then + local self_data = X.GetClientPlayerCharInfo() + local function GetSelfValue(label, value) + for i = 1, #self_data do + local v = self_data[i] + if v.label == label then + local sc = tonumber((tostring(v.value):gsub('%%', ''))) + local tc = tonumber((tostring(value):gsub('%%', ''))) + if sc and tc then + return tc > sc and { 200, 255, 200 } or tc < sc and { 255, 200, 200 } or { 255, 255, 255 } + end + end + end + return { 255, 255, 255 } + end + -- 设置基础属性 + ui:Children('#Image_Kungfu'):Icon((select(2, X.GetSkillName(data.dwActualKungfuID or data.dwKungfuID, 1)))) + ui:Children('#Text_Name'):Color({ X.GetForceColor(data.dwForceID) }) + -- 绘制属性条 + local y0 = 20 + for i = 1, #data do + local v = data[i] + if v.category then + ui:Append('Text', { x = 20, y = y0 + i * 25, w = 200, h = 25, alignHorizontal = 1, text = v.label }) + else + ui:Append('Text', { x = 20, y = y0 + i * 25, w = 200, h = 25, alignHorizontal = 0, text = v.label }) + ui:Append('Text', { + x = 20, y = y0 + i * 25, w = 200, h = 25, + alignHorizontal = 2, text = v.value, + color = GetSelfValue(v.label, v.value), + onHover = function(bHover) + if not v.tip or v.szTip then + return + end + if bHover then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(v.tip or v.szTip, 550, { x, y, w, h }) + else + HideTip() + end + end, + }) + end + end + -- 避免大小不够 + ui:Size(240, y0 + 75 + #data * 25) + ui:Children('#LOOKUP'):Pos(70, y0 + 35 + #data * 25) + ui:Anchor('CENTER') + ui:Children('#Text_Info'):Hide() + frame.pending = false + end +end + +X.RegisterBgMsg('CHAR_INFO', function(szMsgID, aData, nChannel, dwID, szName, bIsSelf) + local szAction, dwTarID, oData = aData[1], aData[2], aData[3] + if not bIsSelf and dwTarID == X.GetClientPlayerID() then + local frame = CharInfo.GetFrame(dwID) + if not frame then + return + end + CharInfo.UpdateFrame(frame, szAction, oData) + end +end, function(szMsgID, nSegCount, nSegRecv, nSegIndex, nChannel, dwID, szName, bIsSelf) + if bIsSelf then + return + end + local frame = CharInfo.GetFrame(dwID) + if not frame then + return + end + CharInfo.UpdateFrame(frame, 'PROGRESS', nSegRecv / nSegCount * 100) +end) + +-- public API +function D.ViewCharInfoToPlayer(dwID) + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + local cpi = X.GetClientPlayerInfo() + if cpi and cpi.nLevel ~= X.CONSTANT.MAX_PLAYER_LEVEL then + return X.Alert(_L['Only max level can use this feature.']) + end + local nChannel, szName + if X.IsTeammate(dwID) then + local team = GetClientTeam() + local info = team.GetMemberInfo(dwID) + if info then + nChannel = PLAYER_TALK_CHANNEL.RAID + szName = info.szName + end + end + if not nChannel then + local tar = X.GetPlayer(dwID) + if tar then + nChannel = tar.szName + szName = tar.szName + end + end + if not nChannel and MY_Farbnamen and MY_Farbnamen.Get then + local info = MY_Farbnamen.Get(dwID) + if info then + nChannel = info.szName + szName = info.szName + end + end + if not nChannel or not szName then + X.Alert(_L['Party limit']) + else + local bAcquaintance = X.IsTeammate(dwID) or X.IsFellowship(dwID) or X.IsAuthorPlayer(X.GetClientPlayerID(), X.GetClientPlayerName()) + local function onAccept() + CharInfo.CreateFrame(dwID, szName) + X.SendBgMsg(nChannel, 'CHAR_INFO', {'ASK', dwID, X.IsRestricted('MY_CharInfo.Daddy') and 'DEBUG'}) + end + if bAcquaintance then + onAccept() + else + X.Confirm(_L('[%s] will see your detailed character info request, sure to send request?', szName), onAccept) + end + end +end + +do +local function GetInfoPanelMenu() + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + if dwType == TARGET.PLAYER and dwID ~= X.GetClientPlayerID() then + return { + szOption = g_tStrings.STR_LOOK .. g_tStrings.STR_EQUIP_ATTR, + fnAction = function() + D.ViewCharInfoToPlayer(dwID) + end + } + end +end +X.RegisterTargetAddonMenu('MY_CharInfo', GetInfoPanelMenu) +end + + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_CharInfo', + exports = { + { + fields = { + 'ViewCharInfoToPlayer', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_CharInfo = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_CombatLogs.lua b/MY_TeamTools/src/MY_CombatLogs.lua new file mode 100644 index 000000000..cc01d2961 --- /dev/null +++ b/MY_TeamTools/src/MY_CombatLogs.lua @@ -0,0 +1,1074 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 战斗日志 流式保存原始事件数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_CombatLogs' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_CombatLogs.BanHDD', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_CombatLogs', _L['Raid'], { + bEnable = { -- 数据记录总开关 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nMaxHistory = { -- 最大历史数据数量 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Max history'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 300, + }, + nMinFightTime = { -- 最小战斗时间 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Min fight time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 30, + }, + bEnableInDungeon = { -- 在秘境中启用 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Enable in dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEnableInArena = { -- 在名剑大会中启用 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Enable in arena'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bEnableInBattleField = { -- 在战场中启用 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Enable in battlefield'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEnableInOtherMaps = { -- 在其他类型地图中启用 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Enable in other maps'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bNearbyAll = { -- 保存附近所有角色事件记录 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Save all nearby records'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTargetInformation = { -- 保存角色状态数据 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['PVP mode'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nTargetInformationThrottle = { -- 保存角色状态数据节流时间间隔 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_CombatLogs'], + _L['Target Information Throttle Time'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 200, + }, +}) +local D = {} +local DS_ROOT = {'userdata/combat_logs/', X.PATH_TYPE.ROLE} + +local LOG_ENABLE = false -- 计算出来的总开关,按条件随时重算 +local LOG_TARGET_INFORMATION_ENABLE = false -- 计算出来的目标状态记录开关,按条件随时重算 +local LOG_TARGET_INFORMATION_THROTTLE = 0 -- 计算出来的目标状态记录限流,按条件随时重算 +local LOG_TIME = 0 +local LOG_FILE -- 当前日志文件,处于存盘模式,即处于逻辑战斗状态时不为空 +local LOG_CACHE = {} -- 尚未存盘的数据(降低磁盘压力) +local LOG_CACHE_LIMIT = 20 -- 缓存数据达到数量触发存盘 +local LOG_CRC = 0 +local LOG_TARGET_INFO_TIME = {} -- 目标信息记录时间 +local LOG_TARGET_INFO_TIME_LIMIT = 10000 -- 目标信息再次记录最小时间间隔 +local LOG_DOODAD_INFO_TIME = {} -- 交互物件信息记录时间 +local LOG_DOODAD_INFO_TIME_LIMIT = 10000 -- 交互物件信息再次记录最小时间间隔 +local LOG_NAMING_COUNT = {} -- 记录中NPC被提及的数量统计,用于命名记录文件 +local LOG_TARGET_LOCATION_TIME = {} -- 记录角色坐标节流器数据 + +local LOG_REPLAY = {} -- 最近的数据 (进战时候将最近的数据压进来) +local LOG_REPLAY_FRAME = X.ENVIRONMENT.GAME_FPS * 1 -- 进战时候将多久的数据压进来(逻辑帧) + +local LOG_TYPE = { + FIGHT_TIME = 1, -- 战斗时间 + PLAYER_ENTER_SCENE = 2, -- 玩家进入场景 + PLAYER_LEAVE_SCENE = 3, -- 玩家离开场景 + PLAYER_INFO = 4, -- 玩家信息数据 + PLAYER_FIGHT_HINT = 5, -- 玩家战斗状态改变 + NPC_ENTER_SCENE = 6, -- NPC 进入场景 + NPC_LEAVE_SCENE = 7, -- NPC 离开场景 + NPC_INFO = 8, -- NPC 信息数据 + NPC_FIGHT_HINT = 9, -- NPC 战斗状态改变 + DOODAD_ENTER_SCENE = 10, -- 交互物件进入场景 + DOODAD_LEAVE_SCENE = 11, -- 交互物件离开场景 + DOODAD_INFO = 12, -- 交互物件信息数据 + BUFF_UPDATE = 13, -- BUFF 刷新 + PLAYER_SAY = 14, -- 角色喊话(仅记录NPC) + ON_WARNING_MESSAGE = 15, -- 显示警告框 + PARTY_ADD_MEMBER = 16, -- 团队添加成员 + PARTY_SET_MEMBER_ONLINE_FLAG = 17, -- 团队成员在线状态改变 + MSG_SYS = 18, -- 系统消息 + SYS_MSG_UI_OME_SKILL_CAST_LOG = 19, -- 技能施放日志 + SYS_MSG_UI_OME_SKILL_CAST_RESPOND_LOG = 20, -- 技能施放结果日志 + SYS_MSG_UI_OME_SKILL_EFFECT_LOG = 21, -- 技能最终产生的效果(生命值的变化) + SYS_MSG_UI_OME_SKILL_BLOCK_LOG = 22, -- 格挡日志 + SYS_MSG_UI_OME_SKILL_SHIELD_LOG = 23, -- 技能被屏蔽日志 + SYS_MSG_UI_OME_SKILL_MISS_LOG = 24, -- 技能未命中目标日志 + SYS_MSG_UI_OME_SKILL_HIT_LOG = 25, -- 技能命中目标日志 + SYS_MSG_UI_OME_SKILL_DODGE_LOG = 26, -- 技能被闪避日志 + SYS_MSG_UI_OME_COMMON_HEALTH_LOG = 27, -- 普通治疗日志 + SYS_MSG_UI_OME_DEATH_NOTIFY = 28, -- 死亡日志 + TARGET_INFORMATION = 29, -- 目标状态信息 +} + +-- 更新启用状态 +function D.UpdateEnable() + local bEnable = D.bReady and O.bEnable + if X.IsRestricted('MY_CombatLogs.BanHDD') and X.GetDiskType() == 'HDD' then + bEnable = false + end + if bEnable then + if X.IsInDungeonMap() then + bEnable = O.bEnableInDungeon + elseif X.IsInArenaMap() then + bEnable = O.bEnableInArena + elseif X.IsInBattlefieldMap() then + bEnable = O.bEnableInBattleField + else + bEnable = O.bEnableInOtherMaps + end + end + if not bEnable and LOG_ENABLE then + D.CloseCombatLogs() + elseif bEnable and not LOG_ENABLE and X.IsFighting() then + D.OpenCombatLogs() + end + LOG_ENABLE = bEnable + LOG_TARGET_INFORMATION_ENABLE = false + if bEnable and O.bTargetInformation and X.IsInArenaMap() then + LOG_TARGET_INFORMATION_ENABLE = true + end + LOG_TARGET_INFORMATION_THROTTLE = O.nTargetInformationThrottle +end +X.RegisterEvent('LOADING_ENDING', D.UpdateEnable) + +-- 加载历史数据列表 +function D.GetHistoryFiles() + local aFiles = {} + local szRoot = X.FormatPath(DS_ROOT) + for _, v in ipairs(CPath.GetFileList(szRoot)) do + if v:find('.jcl.tsv$') then + table.insert(aFiles, v) + end + end + table.sort(aFiles, function(a, b) return a > b end) + for k, v in ipairs(aFiles) do + aFiles[k] = szRoot .. v + end + return aFiles +end + +-- 限制历史数据数量 +function D.LimitHistoryFile() + local aFiles = D.GetHistoryFiles() + for i = O.nMaxHistory + 1, #aFiles do + CPath.DelFile(aFiles[i]) + end +end + +-- 连接到新的日志文件 +function D.OpenCombatLogs() + D.CloseCombatLogs() + local szRoot = X.FormatPath(DS_ROOT) + CPath.MakeDir(szRoot) + local szTime = X.FormatTime(GetCurrentTime(), '%yyyy-%MM-%dd-%hh-%mm-%ss') + local szMapName = '' + local me = X.GetClientPlayer() + if me then + local map = X.GetMapInfo(me.GetMapID()) + if map then + szMapName = '-' .. map.szName + end + szMapName = szMapName .. '(' .. me.GetMapID().. ')' + end + LOG_FILE = szRoot .. szTime .. szMapName .. '.jcl.log' + LOG_TIME = GetCurrentTime() + LOG_CACHE = {} + LOG_TARGET_INFO_TIME = {} + LOG_DOODAD_INFO_TIME = {} + LOG_TARGET_LOCATION_TIME = {} + LOG_NAMING_COUNT = {} + LOG_CRC = 0 + Log(LOG_FILE, '', 'clear') +end + +-- 关闭到日志文件的连接 +function D.CloseCombatLogs() + if not LOG_FILE then + return + end + D.FlushLogs(true) + Log(LOG_FILE, '', 'close') + if GetCurrentTime() - LOG_TIME < O.nMinFightTime then + CPath.DelFile(LOG_FILE) + else + local szName, nCount = '', 0 + for _, p in pairs(LOG_NAMING_COUNT) do + if p.nCount > nCount then + nCount = p.nCount + szName = '-' .. p.szName .. '(' .. p.dwTemplateID .. ')' + end + end + CPath.Move(LOG_FILE, X.StringSubW(LOG_FILE, 1, -9) .. szName .. '.jcl') + end + LOG_FILE = nil +end +X.RegisterReload('MY_CombatLogs', D.CloseCombatLogs) + +-- 将缓存数据写入磁盘 +function D.FlushLogs(bForce) + if not LOG_FILE then + return + end + if not bForce and #LOG_CACHE < LOG_CACHE_LIMIT then + return + end + for _, v in ipairs(LOG_CACHE) do + Log(LOG_FILE, v) + end + LOG_CACHE = {} +end + +-- 插入事件数据 +function D.InsertLog(szEvent, oData, bReplay) + if not LOG_ENABLE then + return + end + assert(szEvent, 'error: missing event id') + -- 生成日志行 + local nLFC = GetLogicFrameCount() + local szLog = nLFC + .. '\t' .. GetCurrentTime() + .. '\t' .. GetTime() + .. '\t' .. szEvent + .. '\t' .. X.StringReplaceW(X.StringReplaceW(X.EncodeLUAData(oData), '\\\n', '\\n'), '\t', '\\t') + local nCRC = GetStringCRC(LOG_CRC .. szLog .. X.SECRET['HASH::MY_COMBAT_JCL']) + -- 插入缓存 + table.insert(LOG_CACHE, nCRC .. '\t' .. szLog .. '\n') + -- 插入最近事件表 + if bReplay ~= false then + while LOG_REPLAY[1] and nLFC - LOG_REPLAY[1].nLFC > LOG_REPLAY_FRAME do + table.remove(LOG_REPLAY, 1) + end + table.insert(LOG_REPLAY, { nLFC = nLFC, szLog = szLog }) + end + -- 更新流式校验码 + LOG_CRC = nCRC + -- 检查数据存盘 + D.FlushLogs() +end + +-- 重放最近事件 +function D.ImportRecentLogs() + -- 检查最近事件表插入缓存 + local nLFC, nCRC = GetLogicFrameCount(), LOG_CRC + for _, v in ipairs(LOG_REPLAY) do + if nLFC - v.nLFC <= LOG_REPLAY_FRAME then + nCRC = GetStringCRC(nCRC .. v.szLog .. X.SECRET['HASH::MY_COMBAT_JCL']) + table.insert(LOG_CACHE, nCRC .. '\t' .. v.szLog .. '\n') + end + end + -- 更新流式校验码 + LOG_CRC = nCRC + -- 检查数据存盘 + D.FlushLogs() +end + +-- 过图清除当前战斗数据 +X.RegisterEvent({ 'LOADING_ENDING', 'RELOAD_UI_ADDON_END', 'BATTLE_FIELD_END', 'ARENA_END', 'MY_CLIENT_PLAYER_LEAVE_SCENE' }, function() + D.FlushLogs(true) +end) + +-- 退出战斗 保存数据 +X.RegisterEvent('MY_FIGHT_HINT', function() + if not LOG_ENABLE then + return + end + local bFighting, szUUID, nDuring = arg0, arg1, arg2 + local dwMapID = X.GetMapID() + if not bFighting then + D.InsertLog(LOG_TYPE.FIGHT_TIME, { bFighting, szUUID, nDuring, dwMapID }) + end + if bFighting then -- 进入新的战斗 + D.OpenCombatLogs() + D.ImportRecentLogs() + else + D.CloseCombatLogs() + end + if bFighting then + D.InsertLog(LOG_TYPE.FIGHT_TIME, { bFighting, szUUID, nDuring, dwMapID }) + end +end) + +function D.WillRecID(dwID) + if not D.bReady then + return false + end + if not O.bNearbyAll then + if not X.IsPlayer(dwID) then + local npc = X.GetNpc(dwID) + if npc then + dwID = npc.dwEmployer + end + end + return dwID == X.GetClientPlayerID() + end + return true +end + +-- 保存目标信息 +function D.OnTargetUpdate(dwID, bForce) + if not X.IsNumber(dwID) then + return + end + local bIsPlayer = X.IsPlayer(dwID) + if bIsPlayer and not X.IsTeammate(dwID) and not X.IsInArenaMap() and not X.IsInBattlefieldMap() then + return + end + if not bIsPlayer then + if not LOG_NAMING_COUNT[dwID] then + LOG_NAMING_COUNT[dwID] = { + nCount = 0, + szName = '', + dwTemplateID = 0, + } + end + LOG_NAMING_COUNT[dwID].nCount = LOG_NAMING_COUNT[dwID].nCount + 1 + end + if not bForce and LOG_TARGET_INFO_TIME[dwID] and GetTime() - LOG_TARGET_INFO_TIME[dwID] < LOG_TARGET_INFO_TIME_LIMIT then + D.OnTargetInformationUpdate(bIsPlayer and TARGET.PLAYER or TARGET.NPC, dwID) + return + end + if bIsPlayer then + local player = X.GetPlayer(dwID) + if not player then + return + end + local szName = player.szName + local dwForceID = player.dwForceID + local dwKungfuID = -1 + if dwID == X.GetClientPlayerID() then + dwKungfuID = UI_GetPlayerMountKungfuID() + else + local info = X.GetTeamMemberInfo(dwID) + if info and not X.IsEmpty(info.dwActualKungfuID) then + dwKungfuID = info.dwActualKungfuID + else + local kungfu = player.GetKungfuMount() + if kungfu then + dwKungfuID = kungfu.dwSkillID + end + end + end + local szGUID = X.GetPlayerGlobalID(dwID) or '' + local aEquip, nEquipScore, aTalent, tZhenPai + local function OnGet() + D.InsertLog(LOG_TYPE.PLAYER_INFO, { dwID, szName, dwForceID, dwKungfuID, nEquipScore, aEquip, aTalent, szGUID, tZhenPai }) + end + X.GetPlayerEquipScore(dwID, function(nScore) + nEquipScore = nScore + OnGet() + end) + X.GetPlayerEquipInfo(dwID, function(tEquip) + aEquip = {} + for nEquipIndex, tEquipInfo in pairs(tEquip) do + table.insert(aEquip, { + nEquipIndex, + tEquipInfo.dwTabType, + tEquipInfo.dwTabIndex, + tEquipInfo.nStrengthLevel, + tEquipInfo.aSlotItem, + tEquipInfo.dwPermanentEnchantID, + tEquipInfo.dwTemporaryEnchantID, + tEquipInfo.dwTemporaryEnchantLeftSeconds, + }) + end + OnGet() + end) + X.GetPlayerTalentInfo(dwID, function(a) + aTalent = {} + for i, p in ipairs(a) do + aTalent[i] = { + p.nIndex, + p.dwSkillID, + p.dwSkillLevel, + } + end + OnGet() + end) + X.GetPlayerZhenPaiInfo(dwID, function(a) + tZhenPai = {} + for k, p in pairs(a) do + if p ~= 0 then + tZhenPai[k] = p + end + end + OnGet() + end) + D.OnTargetInformationUpdate(TARGET.PLAYER, dwID) + else + local npc = X.GetNpc(dwID) + if not npc then + return + end + local szName = X.GetNpcName(dwID, { eShowID = 'never' }) or '' + LOG_NAMING_COUNT[dwID].szName = szName + LOG_NAMING_COUNT[dwID].dwTemplateID = npc.dwTemplateID + D.InsertLog(LOG_TYPE.NPC_INFO, { dwID, szName, npc.dwTemplateID, npc.dwEmployer, npc.nX, npc.nY, npc.nZ, npc.nFaceDirection }) + end + LOG_TARGET_INFO_TIME[dwID] = GetTime() +end + +-- 保存交互物件信息 +function D.OnDoodadUpdate(dwID, bForce) + if not bForce and LOG_DOODAD_INFO_TIME[dwID] and GetTime() - LOG_DOODAD_INFO_TIME[dwID] < LOG_DOODAD_INFO_TIME_LIMIT then + return + end + local doodad = X.GetDoodad(dwID) + if not doodad then + return + end + D.InsertLog(LOG_TYPE.DOODAD_INFO, { dwID, doodad.dwTemplateID, doodad.nX, doodad.nY, doodad.nZ, doodad.nFaceDirection }) + LOG_DOODAD_INFO_TIME[dwID] = GetTime() +end + +function D.OnTargetInformationUpdate(dwType, dwID) + if not LOG_TARGET_INFORMATION_ENABLE then + return + end + if LOG_TARGET_LOCATION_TIME[dwID] and GetTime() - LOG_TARGET_LOCATION_TIME[dwID] < LOG_TARGET_INFORMATION_THROTTLE then + return + end + local tar + if dwType == TARGET.PLAYER then + tar = X.GetPlayer(dwID) + elseif dwType == TARGET.NPC then + tar = X.GetNpc(dwID) + elseif dwType == TARGET.DOODAD then + tar = X.GetDoodad(dwID) + end + if tar then + local nLife, nMaxLife = X.GetCharacterLife(tar) + local nMana, nMaxMana = X.GetCharacterMana(tar) + local nDamageAbsorbValue = tar.nDamageAbsorbValue + D.InsertLog(LOG_TYPE.TARGET_INFORMATION, { + dwType, dwID, + tar.nX, tar.nY, tar.nZ, tar.nFaceDirection, + nLife, nMaxLife, nMana, nMaxMana, nDamageAbsorbValue, + }) + end + LOG_TARGET_LOCATION_TIME[dwID] = GetTime() -- 忽略 doodad 与 player 的 id 冲突,为了性能,一般也不会冲突 +end + +-- 系统日志监控(数据源) +X.RegisterEvent('SYS_MSG', function() + if not LOG_ENABLE then + return + end + if arg0 == 'UI_OME_SKILL_CAST_LOG' then + -- 技能施放日志; + -- (arg1)dwCaster:技能施放者 (arg2)dwSkillID:技能ID (arg3)dwLevel:技能等级 + -- D.OnSkillCast(arg1, arg2, arg3) + if D.WillRecID(arg1) then + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_CAST_LOG, { arg1, arg2, arg3 }) + end + elseif arg0 == 'UI_OME_SKILL_CAST_RESPOND_LOG' then + -- 技能施放结果日志; + -- (arg1)dwCaster:技能施放者 (arg2)dwSkillID:技能ID + -- (arg3)dwLevel:技能等级 (arg4)nRespond:见枚举型[[SKILL_RESULT_CODE]] + -- D.OnSkillCastRespond(arg1, arg2, arg3, arg4) + if D.WillRecID(arg1) then + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_CAST_RESPOND_LOG, { arg1, arg2, arg3, arg4 }) + end + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + -- if not X.IsInArenaMap() then + -- 技能最终产生的效果(生命值的变化); + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)bReact:是否为反击 (arg4)nType:Effect类型 (arg5)dwID:Effect的ID + -- (arg6)dwLevel:Effect的等级 (arg7)bCriticalStrike:是否会心 (arg8)nCount:tResultCount数据表中元素个数 (arg9)tResultCount:数值集合 + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_EFFECT_LOG, { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 }) + end + elseif arg0 == 'UI_OME_SKILL_BLOCK_LOG' then + -- 格挡日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)nType:Effect的类型 + -- (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 (arg6)nDamageType:伤害类型,见枚举型[[SKILL_RESULT_TYPE]] + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_BLOCK_LOG, { arg1, arg2, arg3, arg4, arg5, arg6 }) + end + elseif arg0 == 'UI_OME_SKILL_SHIELD_LOG' then + -- 技能被屏蔽日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_SHIELD_LOG, { arg1, arg2, arg3, arg4, arg5 }) + end + elseif arg0 == 'UI_OME_SKILL_MISS_LOG' then + -- 技能未命中目标日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_MISS_LOG, { arg1, arg2, arg3, arg4, arg5 }) + end + elseif arg0 == 'UI_OME_SKILL_HIT_LOG' then + -- 技能命中目标日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_HIT_LOG, { arg1, arg2, arg3, arg4, arg5 }) + end + elseif arg0 == 'UI_OME_SKILL_DODGE_LOG' then + -- 技能被闪避日志; + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 + -- (arg3)nType:Effect的类型 (arg4)dwID:Effect的ID (arg5)dwLevel:Effect的等级 + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_SKILL_DODGE_LOG, { arg1, arg2, arg3, arg4, arg5 }) + end + elseif arg0 == 'UI_OME_COMMON_HEALTH_LOG' then + -- 普通治疗日志; + -- (arg1)dwCharacterID:承疗玩家ID (arg2)nDeltaLife:增加血量值 + -- D.OnCommonHealth(arg1, arg2) + if D.WillRecID(arg1) then + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_COMMON_HEALTH_LOG, { arg1, arg2 }) + end + elseif arg0 == 'UI_OME_DEATH_NOTIFY' then + -- 死亡日志; + -- (arg1)dwCharacterID:死亡目标ID (arg2)dwKiller:击杀者ID + if D.WillRecID(arg1) or D.WillRecID(arg2) then + D.OnTargetUpdate(arg1) + D.OnTargetUpdate(arg2) + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_DEATH_NOTIFY, { arg1, arg2 }) + end + end +end) + +-- 系统BUFF监控(数据源) +X.RegisterEvent('BUFF_UPDATE', function() + -- local owner, bdelete, index, cancancel, id , stacknum, endframe, binit, level, srcid, isvalid, leftframe + -- = arg0 , arg1 , arg2 , arg3 , arg4, arg5 , arg6 , arg7 , arg8 , arg9 , arg10 , arg11 + if not LOG_ENABLE then + return + end + -- buff update: + -- arg0:dwPlayerID,arg1:bDelete,arg2:nIndex,arg3:bCanCancel + -- arg4:dwBuffID,arg5:nStackNum,arg6:nEndFrame,arg7:?update all? + -- arg8:nLevel,arg9:dwSkillSrcID + if D.WillRecID(arg0) then + D.OnTargetUpdate(arg0) + D.InsertLog(LOG_TYPE.BUFF_UPDATE, { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 }) + end +end) + +X.RegisterEvent('PLAYER_ENTER_SCENE', function() + if not LOG_ENABLE then + return + end + if D.WillRecID(arg0) then + D.OnTargetUpdate(arg0) + D.InsertLog(LOG_TYPE.PLAYER_ENTER_SCENE, { arg0 }) + end +end) + +X.RegisterEvent('PLAYER_LEAVE_SCENE', function() + if not LOG_ENABLE then + return + end + if D.WillRecID(arg0) then + D.OnTargetUpdate(arg0) + D.InsertLog(LOG_TYPE.PLAYER_LEAVE_SCENE, { arg0 }) + end +end) + +X.RegisterEvent('NPC_ENTER_SCENE', function() + if not LOG_ENABLE then + return + end + if D.WillRecID(arg0) then + D.OnTargetUpdate(arg0) + D.InsertLog(LOG_TYPE.NPC_ENTER_SCENE, { arg0 }) + end +end) + +X.RegisterEvent('NPC_LEAVE_SCENE', function() + if not LOG_ENABLE then + return + end + if D.WillRecID(arg0) then + D.OnTargetUpdate(arg0) + D.InsertLog(LOG_TYPE.NPC_LEAVE_SCENE, { arg0 }) + end +end) + +X.RegisterEvent('DOODAD_ENTER_SCENE', function() + if not LOG_ENABLE then + return + end + D.OnDoodadUpdate(arg0) + D.InsertLog(LOG_TYPE.DOODAD_ENTER_SCENE, { arg0 }) +end) + +X.RegisterEvent('DOODAD_LEAVE_SCENE', function() + if not LOG_ENABLE then + return + end + D.OnDoodadUpdate(arg0) + D.InsertLog(LOG_TYPE.DOODAD_LEAVE_SCENE, { arg0 }) +end) + +-- 系统消息日志 +X.RegisterMsgMonitor('MSG_SYS', 'MY_CombatLogs', function(szChannel, szMsg, nFont, bRich) + if not LOG_ENABLE then + return + end + local szText = szMsg + if bRich then + if X.ContainsEchoMsgHeader(szMsg) then + return + end + szText = X.GetPureText(szMsg) + end + szText = szText:gsub('\r', '') + D.InsertLog(LOG_TYPE.MSG_SYS, { szText, szChannel }) +end) + +-- 角色喊话日志 +X.RegisterEvent('PLAYER_SAY', function() + if not LOG_ENABLE then + return + end + -- arg0: szContent, arg1: dwTalkerID, arg2: nChannel, arg3: szName, arg4: bOnlyShowBallon + -- arg5: bSecurity, arg6: bGMAccount, arg7: bCheater, arg8: dwTitleID, arg9: szMsg + if not X.IsPlayer(arg1) and D.WillRecID(arg1) then + local szText = X.GetPureText(arg0) + if szText and szText ~= '' then + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.PLAYER_SAY, { szText, arg1, arg2, arg3 }) + end + end +end) + +-- 系统警告框日志 +X.RegisterEvent('ON_WARNING_MESSAGE', function() + if not LOG_ENABLE then + return + end + -- arg0: szWarningType, arg1: szText + D.InsertLog(LOG_TYPE.ON_WARNING_MESSAGE, { arg0, arg1 }) +end) + +-- 玩家进入退出战斗日志 +X.RegisterEvent('MY_PLAYER_FIGHT_HINT', function() + if not LOG_ENABLE then + return + end + local dwID, bFight = arg0, arg1 + if not D.WillRecID(dwID) then + return + end + local KObject = X.GetTargetHandle(TARGET.PLAYER, dwID) + local fCurrentLife, fMaxLife, nCurrentMana, nMaxMana = -1, -1, -1, -1 + if KObject then + fCurrentLife, fMaxLife = X.GetCharacterLife(KObject) + nCurrentMana, nMaxMana = KObject.nCurrentMana, KObject.nMaxMana + end + D.OnTargetUpdate(dwID, true) + D.InsertLog(LOG_TYPE.PLAYER_FIGHT_HINT, { dwID, bFight, fCurrentLife, fMaxLife, nCurrentMana, nMaxMana }) +end) + +-- NPC 进入退出战斗日志 +X.RegisterEvent('MY_NPC_FIGHT_HINT', function() + if not LOG_ENABLE then + return + end + local dwID, bFight = arg0, arg1 + if not D.WillRecID(dwID) then + return + end + local KObject = X.GetTargetHandle(TARGET.NPC, dwID) + local fCurrentLife, fMaxLife, nCurrentMana, nMaxMana = -1, -1, -1, -1 + if KObject then + fCurrentLife, fMaxLife = X.GetCharacterLife(KObject) + nCurrentMana, nMaxMana = KObject.nCurrentMana, KObject.nMaxMana + end + D.OnTargetUpdate(dwID, true) + D.InsertLog(LOG_TYPE.NPC_FIGHT_HINT, { dwID, bFight, fCurrentLife, fMaxLife, nCurrentMana, nMaxMana }) +end) + +-- 上线下线日志 +X.RegisterEvent('PARTY_SET_MEMBER_ONLINE_FLAG', function() + if not LOG_ENABLE then + return + end + -- arg0: dwTeamID, arg1: dwMemberID, arg2: nOnlineFlag + if not D.WillRecID(arg1) then + return + end + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.PARTY_SET_MEMBER_ONLINE_FLAG, { arg0, arg1, arg2 }) +end) + +-- 进出战斗暂离记录 +X.RegisterEvent('MY_RECOUNT_NEW_FIGHT', function() -- 开战扫描队友 记录开战就死掉/掉线的人 + if not LOG_ENABLE then + return + end + local team = GetClientTeam() + local me = X.GetClientPlayer() + if not team or not me or (not me.IsInParty() and not me.IsInRaid()) then + return + end + for _, dwID in ipairs(team.GetTeamMemberList()) do + local info = X.GetTeamMemberInfo(dwID) + if info and D.WillRecID(dwID) then + D.OnTargetUpdate(dwID) + if not info.bOnline then + D.InsertLog(LOG_TYPE.PARTY_SET_MEMBER_ONLINE_FLAG, { team.dwTeamID, dwID, 0 }) + elseif info.bDeathFlag then + D.InsertLog(LOG_TYPE.SYS_MSG_UI_OME_DEATH_NOTIFY, { dwID, nil }) + end + end + end +end) + +-- 中途有人进队 补上暂离记录 +X.RegisterEvent('PARTY_ADD_MEMBER', function() + if not LOG_ENABLE then + return + end + -- arg0: dwTeamID, arg1: dwMemberID, arg2: nGroupIndex + if D.WillRecID(arg1) then + D.OnTargetUpdate(arg1) + D.InsertLog(LOG_TYPE.PARTY_ADD_MEMBER, { arg0, arg1, arg2 }) + end +end) + +function D.GetOptionsMenu() + local bBan = X.IsRestricted('MY_CombatLogs.BanHDD') and X.GetDiskType() == 'HDD' + local fnMouseEnter = bBan + and function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['This feature has been disabled on HDD disk machine for performance issues.'], nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.BOTTOM_TOP) + end + or nil + local fnMouseLeave = bBan + and function() + HideTip() + end + or nil + local menu = { + szOption = _L['MY_CombatLogs'], + bCheck = true, + bChecked = not bBan and MY_CombatLogs.bEnable, + fnAction = function() + MY_CombatLogs.bEnable = not MY_CombatLogs.bEnable + end, + fnMouseEnter = fnMouseEnter, + fnMouseLeave = fnMouseLeave, + fnDisable = function() return bBan end, + } + table.insert(menu, { + szOption = _L['Enable in dungeon'], + bCheck = true, + bChecked = MY_CombatLogs.bEnableInDungeon, + fnAction = function() + MY_CombatLogs.bEnableInDungeon = not MY_CombatLogs.bEnableInDungeon + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, { + szOption = _L['Enable in arena'], + bCheck = true, + bChecked = MY_CombatLogs.bEnableInArena, + fnAction = function() + MY_CombatLogs.bEnableInArena = not MY_CombatLogs.bEnableInArena + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, { + szOption = _L['Enable in battlefield'], + bCheck = true, + bChecked = MY_CombatLogs.bEnableInBattleField, + fnAction = function() + MY_CombatLogs.bEnableInBattleField = not MY_CombatLogs.bEnableInBattleField + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, { + szOption = _L['Enable in other maps'], + bCheck = true, + bChecked = MY_CombatLogs.bEnableInOtherMaps, + fnAction = function() + MY_CombatLogs.bEnableInOtherMaps = not MY_CombatLogs.bEnableInOtherMaps + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + table.insert(menu, { + szOption = _L['Save all nearby records'], + bCheck = true, + bChecked = MY_CombatLogs.bNearbyAll, + fnAction = function() + MY_CombatLogs.bNearbyAll = not MY_CombatLogs.bNearbyAll + end, + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['Check to save all nearby records, otherwise only save records related to me'], nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.TOP_BOTTOM) + end, + fnMouseLeave = function() + HideTip() + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, { + szOption = _L['PVP mode'], + bCheck = true, + bChecked = MY_CombatLogs.bTargetInformation, + fnAction = function() + MY_CombatLogs.bTargetInformation = not MY_CombatLogs.bTargetInformation + end, + fnMouseEnter = function() + local nX, nY = this:GetAbsX(), this:GetAbsY() + local nW, nH = this:GetW(), this:GetH() + OutputTip(GetFormatText(_L['Save target information on event\n(Only in arena)'], nil, 255, 255, 0), 600, {nX, nY, nW, nH}, ALW.TOP_BOTTOM) + end, + fnMouseLeave = function() + HideTip() + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + local m0 = { + szOption = _L['Max history'], + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + } + for _, i in ipairs({10, 20, 30, 50, 100, 200, 300, 500, 1000, 2000, 5000}) do + table.insert(m0, { + szOption = tostring(i), + fnAction = function() + MY_CombatLogs.nMaxHistory = i + end, + bCheck = true, + bMCheck = true, + bChecked = MY_CombatLogs.nMaxHistory == i, + }) + end + table.insert(menu, m0) + local m0 = { + szOption = _L['Min fight time'], + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + } + for _, i in ipairs({10, 20, 30, 60, 90, 120, 180, 240}) do + table.insert(m0, { + szOption = _L('%s second(s)', i), + fnAction = function() + MY_CombatLogs.nMinFightTime = i + end, + bCheck = true, + bMCheck = true, + bChecked = MY_CombatLogs.nMinFightTime == i, + }) + end + table.insert(menu, m0) + table.insert(menu, { + szOption = _L['Show data files'], + fnAction = function() + local szRoot = X.GetAbsolutePath(DS_ROOT) + X.OpenFolder(szRoot) + X.UI.OpenTextEditor(szRoot) + end, + fnDisable = function() return bBan or not MY_CombatLogs.bEnable end, + }) + return menu +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + local bBan = X.IsRestricted('MY_CombatLogs.BanHDD') and X.GetDiskType() == 'HDD' + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['MY_CombatLogs'], + checked = not bBan and MY_CombatLogs.bEnable, + enable = not bBan, + tip = bBan and { + render = _L['This feature has been disabled on HDD disk machine for performance issues.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + } or nil, + onCheck = function(bChecked) + MY_CombatLogs.bEnable = bChecked + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 25, h = 25, + buttonStyle = 'OPTION', + autoEnable = function() return MY_CombatLogs.bEnable end, + menu = D.GetOptionsMenu, + }):Width() + 5 + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_CombatLogs', + exports = { + { + fields = { + 'GetOptionsMenu', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nMaxHistory', + 'nMinFightTime', + 'bEnableInDungeon', + 'bEnableInArena', + 'bEnableInBattleField', + 'bEnableInOtherMaps', + 'bNearbyAll', + 'bTargetInformation', + 'nTargetInformationThrottle', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nMaxHistory', + 'nMinFightTime', + 'bEnableInDungeon', + 'bEnableInArena', + 'bEnableInBattleField', + 'bEnableInOtherMaps', + 'bNearbyAll', + 'bTargetInformation', + 'nTargetInformationThrottle', + }, + triggers = { + bEnable = D.UpdateEnable, + bEnableInDungeon = D.UpdateEnable, + bEnableInArena = D.UpdateEnable, + bEnableInBattleField = D.UpdateEnable, + bEnableInOtherMaps = D.UpdateEnable, + bNearbyAll = D.UpdateEnable, + bTargetInformation = D.UpdateEnable, + nTargetInformationThrottle = D.UpdateEnable, + }, + root = O, + }, + }, +} +MY_CombatLogs = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_CombatLogs', function() + D.bReady = true + D.UpdateEnable() +end) + +X.RegisterUserSettingsRelease('MY_CombatLogs', function() + D.bReady = false +end) + +X.RegisterEvent('MY_RESTRICTION', 'MY_CombatLogs.BanHDD', function() + if arg0 and arg0 ~= 'MY_CombatLogs.BanHDD' then + return + end + D.UpdateEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_EvokeRequest.lua b/MY_TeamTools/src/MY_EvokeRequest.lua new file mode 100644 index 000000000..224501edd --- /dev/null +++ b/MY_TeamTools/src/MY_EvokeRequest.lua @@ -0,0 +1,276 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 召请助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_EvokeRequest' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_EvokeRequest.ini' +local O = X.CreateUserSettingsModule('MY_EvokeRequest', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_EvokeRequest'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +local EVOKE_MSG = { + ['A2M'] = g_tStrings.MENTOR_APPRENTICE_EVOKE_MSG, + ['M2A'] = g_tStrings.MENTOR_MENTOR_EVOKE_MSG, + ['FRIEND'] = g_tStrings.MENTOR_FRIEND_EVOKE_MSG, + ['TONG'] = g_tStrings.MENTOR_TONG_EVOKE_MSG, + ['TONGALL'] = g_tStrings.MENTOR_TONGALL_EVOKE_MSG, + ['TONGALLS'] = g_tStrings.MENTOR_TONGALLS_EVOKE_MSG, + ['ZUIYUAN'] = g_tStrings.MENTOR_QINGMINGJIE_ZUIYUAN_EVOKE_MSG_MSG, + ['PARTY'] = g_tStrings.MENTOR_PARTY_EVOKE_MSG, +} +local EVOKE_LIST = {} + +function D.GetMenu() + local menu = { + szOption = _L['MY_EvokeRequest'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = MY_EvokeRequest.bEnable, + fnAction = function() + MY_EvokeRequest.bEnable = not MY_EvokeRequest.bEnable + end, + }, + } + return menu +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Accept' then + D.AcceptRequest(this:GetParent().info) + elseif name == 'Btn_Refuse' then + D.RefuseRequest(this:GetParent().info) + end +end + +function D.OnRButtonClick() + if this.info then + PopupMenu(X.InsertPlayerContextMenu({}, this.info.szName, this.info.dwID)) + end +end + +function D.OnMouseEnter() + if this.info then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = GetFormatText(this.info.szDesc) + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end +end + +function D.OnMouseLeave() + if this.info then + HideTip() + end +end + +function D.AcceptRequest(info) + EVOKE_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_EvokeRequest', info.szName) + info.fnAccept() +end + +function D.RefuseRequest(info) + EVOKE_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_EvokeRequest', info.szName) + info.fnRefuse() +end + +function D.OnMessageBoxOpen() + local szMsgName, frame = arg0, arg1 + if not O.bEnable or not frame or not frame:IsValid() then + return + end + if szMsgName:find('^A_E_M_') then + local szName = szMsgName:sub(7) + local hContent = X.GetMessageBoxContentHandle(frame) + local txt = hContent and hContent:Lookup(0) + local szMsg, szType = txt and txt:GetType() == 'Text' and txt:GetText() + for k, szMsgTpl in pairs(EVOKE_MSG) do + if FormatString(szMsgTpl, szName) == szMsg then + szType = k + break + end + end + if szType then + local fnAccept = X.GetMessageBoxButtonAction(frame, 1) + local fnRefuse = X.GetMessageBoxButtonAction(frame, 2) + if fnAccept and fnRefuse then + local info = EVOKE_LIST[szName] + if not info then + info = {} + EVOKE_LIST[szName] = info + end + info.szType = szType + info.szName = szName + info.szDesc = szMsg + info.fnAccept = function() + EVOKE_LIST[szName] = nil + X.Call(fnAccept) + end + info.fnRefuse = function() + EVOKE_LIST[szName] = nil + X.Call(fnRefuse) + end + -- 获取dwID + local tar = X.GetTargetHandle(TARGET.PLAYER, szName) + if not info.dwID and tar then + info.dwID = tar.dwID + end + if not info.dwID and MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(szName) + if data then + info.dwID = data.dwID + end + end + X.UI.ReplaceRequest('MY_EvokeRequest', info.szName, info) + -- 关闭对话框 + frame.fnAutoClose = nil + frame.fnCancelAction = nil + frame.szCloseSound = nil + X.UI.CloseFrame(frame) + end + end + end +end + +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_EvokeRequest' , D.OnMessageBoxOpen) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 120, + text = _L['MY_EvokeRequest'], + menu = D.GetMenu, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_EvokeRequest', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_EvokeRequest = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 注册邀请 +-------------------------------------------------------------------------------- +local R = { + szIconUITex = 'ui\\Image\\button\\SystemButton.UITex', + nIconFrame = 55, +} + +function R.Drawer(container, info) + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_EvokeRequest') + wnd.info = info + wnd.OnMouseEnter = D.OnMouseEnter + wnd.OnMouseLeave = D.OnMouseLeave + wnd:Lookup('', 'Text_Name'):SetText(info.szName) + + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Accept', + x = 326, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_ACCEPT, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Refuse', + x = 393, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_REFUSE, + onClick = D.OnLButtonClick, + }) + + return wnd +end + +function R.GetTip(info) + return GetFormatText(info.szDesc) +end + +function R.GetIcon(info, szImage, nFrame) + if info.szType == 'A2M' or info.szType == 'M2A' then + local tFellowship = X.GetFellowshipInfo(info.szName) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei then + local szAvatarFile, nAvatarFrame, bAnimate = X.GetPlayerAvatar(tFei.dwForceID, tFei.nRoleType, tFei.dwMiniAvatarID) + if szAvatarFile and not bAnimate then + szImage, nFrame = szAvatarFile, nAvatarFrame + end + end + elseif info.szType == 'FRIEND' then + szImage, nFrame = 'FromIconID', 307 + elseif info.szType == 'TONG' then + szImage, nFrame = 'FromIconID', 305 + elseif info.szType == 'TONGALL' then + szImage, nFrame = 'FromIconID', 592 + elseif info.szType == 'TONGALLS' then + szImage, nFrame = 'FromIconID', 591 + end + return szImage, nFrame +end + +function R.GetMenu() + return D.GetMenu() +end + +function R.OnClear() + EVOKE_LIST = {} +end + +X.UI.RegisterRequest('MY_EvokeRequest', R) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JB.PS.lua b/MY_TeamTools/src/MY_JB.PS.lua new file mode 100644 index 000000000..311e58e86 --- /dev/null +++ b/MY_TeamTools/src/MY_JB.PS.lua @@ -0,0 +1,79 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : JX3BOX 分页 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JB.PS' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBBind' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_TeamTools_JB', { ['*'] = false }) +-------------------------------------------------------------------------- + +local PS = { + -- nPriority = 0, + -- bWelcome = true, +} + +function PS.IsRestricted() + if X.IsDebugServer() then + return true + end + return X.IsRestricted('MY_TeamTools_JB') +end + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY, LH = 20, 20, 30 + local nW, nH = ui:Size() + local nX, nY, nLFY = nPaddingX, nPaddingY, nPaddingY + + -- 角色认证 + nX, nY, nLFY = MY_JBBind.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + + -- 快捷入团 + nX = nPaddingX + nLFY = nLFY + 5 + nX, nY, nLFY = MY_JBTeam.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + + -- 赛事上报 + nX = nPaddingX + nLFY = nLFY + 5 + nX, nY, nLFY = MY_JBAchievementRank.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + nX, nY, nLFY = MY_CombatLogs.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + + -- 数据同步 + nLFY = nLFY + 5 + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Data sync'], font = 27 }):Height() + 2 + nX = nPaddingX + 10 + nX, nY, nLFY = MY_JBLoverSync.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + nX = nX + 5 + nX, nY, nLFY = MY_JBAchievementSync.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + + -- 赛事投票 + nX = nPaddingX + nLFY = nLFY + 5 + nX, nY, nLFY = MY_JBEventVote.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) + + -- 团队快照 + nX = nPaddingX + nLFY = nLFY + 5 + nX, nY, nLFY = MY_JBTeamSnapshot.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, LH, nX, nY, nLFY) +end + +X.Panel.Register(_L['Raid'], 'MY_JX3BOX', _L['Team Platform'], 5962, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBAchievementRank.lua b/MY_TeamTools/src/MY_JBAchievementRank.lua new file mode 100644 index 000000000..2815389f3 --- /dev/null +++ b/MY_TeamTools/src/MY_JBAchievementRank.lua @@ -0,0 +1,383 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 分享首次击杀 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBAchievementRank' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_JBAchievementRank', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_JBAchievementRank'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = { + dwFightBeginTime = 0, + szFightUUID = '', + dwDamage = 0, + dwTherapy = 0, +} + +local BOSS_ACHIEVE_ACQUIRE_LOG = {} -- 等待上传的首领击杀信息 +local BOSS_ACHIEVE_ACQUIRE_STATE = {} -- 当前地图首领击杀状态 +local DATA_FILE_OLD = {'data/boss_achieve_acquire.jx3dat', X.PATH_TYPE.ROLE} +local DATA_FILE = {'userdata/achievement_rank_acquire.jx3dat', X.PATH_TYPE.ROLE} + +function D.GetTargetHandle(dwID) + if X.IsPlayer(dwID) then + return X.GetPlayer(dwID) + end + return X.GetNpc(dwID) +end + +function D.LoadData() + local szPathOld = X.FormatPath(DATA_FILE_OLD) + local szPath = X.FormatPath(DATA_FILE) + if IsLocalFileExist(szPathOld) then + CPath.Move(szPathOld, szPath) + end + BOSS_ACHIEVE_ACQUIRE_LOG = X.LoadLUAData(szPath) or {} +end +X.RegisterInit('MY_JBAchievementRank', function() + D.bReady = true + D.LoadData() +end) + +function D.SaveData() + local aAchieveAcquireLog = X.Clone(BOSS_ACHIEVE_ACQUIRE_LOG) + for _, rec in ipairs(aAchieveAcquireLog) do + rec.bPending = nil + end + X.SaveLUAData(DATA_FILE, aAchieveAcquireLog) +end +X.RegisterFlush('MY_JBAchievementRank', D.SaveData) + +X.RegisterEvent('MY_FIGHT_HINT', function() + if arg0 then + D.dwFightBeginTime = GetCurrentTime() + D.szFightUUID = arg1 + D.dwDamage = 0 + D.dwTherapy = 0 + end +end) +X.RegisterEvent('SYS_MSG', function() + if arg0 == 'UI_OME_SKILL_EFFECT_LOG' then + -- 技能最终产生的效果(生命值的变化); + -- (arg1)dwCaster:施放者 (arg2)dwTarget:目标 (arg3)bReact:是否为反击 (arg4)nType:Effect类型 (arg5)dwID:Effect的ID + -- (arg6)dwLevel:Effect的等级 (arg7)bCriticalStrike:是否会心 (arg8)nCount:tResultCount数据表中元素个数 (arg9)tResult:数值集合 + local KCaster = D.GetTargetHandle(arg1) + if KCaster and not X.IsPlayer(arg1) and KCaster.dwEmployer and KCaster.dwEmployer ~= 0 then -- 宠物的数据算在主人统计中 + KCaster = D.GetTargetHandle(KCaster.dwEmployer) + end + if KCaster and KCaster.dwID == X.GetClientPlayerID() then + D.dwDamage = D.dwDamage + (arg9[SKILL_RESULT_TYPE.EFFECTIVE_DAMAGE] or 0) + D.dwTherapy = D.dwTherapy + (arg9[SKILL_RESULT_TYPE.EFFECTIVE_THERAPY] or 0) + end + end +end) + +function D.ShareBKR(p, bOnymous, onfulfilled, oncomplete) + local tConfig = { + url = MY_RSS.PUSH_BASE_URL .. '/api/achievement-rank/uploads', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + server = p.szServer, + name = p.szName, + leader = p.szLeader, + teammate = p.szTeammate, + guid = p.szClientGUID, + achieve = p.dwAchieveID, + time = p.dwTime, + fightBegin = p.dwFightBeginTime, + fightDuring = p.nFightTime, + fightUUID = p.szFightUUID, + damage = p.dwDamage, + therapy = p.dwTherapy, + roleType = p.nRoleType, + achievement = p.nAchievement, + onymous = bOnymous and 1 or 0, + }, + signature = X.SECRET['J3CX::ACHIEVEMENT_RANK_UPLOADS'], + fulfilled = onfulfilled, + complete = oncomplete, + } + X.Ajax(tConfig) + X.EnsureAjax(tConfig) +end + +function D.CheckUpdateAcquire() + if not D.bReady or not O.bEnable then + return + end + for _, p in ipairs(BOSS_ACHIEVE_ACQUIRE_LOG) do + if not p.bPending then + local szAchieve = X.GetAchievement(p.dwAchieveID).szName + local szTime = X.FormatTime(p.dwTime, '%yyyy-%MM-%dd %hh:%mm:%ss') + p.bPending = true + X.OutputSystemMessage(_L('Try share boss kill: %s - %ds (%s).', szAchieve, p.nFightTime / 1000, szTime)) + D.ShareBKR(p, true, + function() + for i, v in X.ipairs_r(BOSS_ACHIEVE_ACQUIRE_LOG) do + if v.dwAchieveID == p.dwAchieveID then + table.remove(BOSS_ACHIEVE_ACQUIRE_LOG, i) + end + end + X.OutputSystemMessage(_L('Share boss kill success: %s - %ds (%s).', szAchieve, p.nFightTime / 1000, szTime)) + end, + function() + for _, v in X.ipairs_r(BOSS_ACHIEVE_ACQUIRE_LOG) do + if v.dwAchieveID == p.dwAchieveID then + v.bPending = nil + end + end + end) + end + end +end + +function D.ShotAchievementAcquire() + local me = X.GetClientPlayer() + local aAcquired = {} + local Achievement = X.GetGameTable('Achievement', true) + if Achievement then + for i = 1, Achievement:GetRowCount() do + local achi = Achievement:GetRow(i) + if me.IsAchievementAcquired(achi.dwID) then + table.insert(aAcquired, achi.dwID) + end + end + end + X.SaveLUAData({'userdata/achievement_acquire_shot.jx3dat', X.PATH_TYPE.ROLE}, aAcquired, { encoder = 'luatext', crc = false, passphrase = false }) +end + +function D.UpdateMapBossAchieveAcquire() + local me = X.GetClientPlayer() + local dwMapID = me.GetMapID() + local tBossAchieveAcquireState = {} + -- 根据成就名称自动识别地图全胜成就 + local aMapAchievements = {} + for _, dwAchieveID in ipairs(X.GetMapAchievements(dwMapID) or X.CONSTANT.EMPTY_TABLE) do + local achi = X.GetAchievement(dwAchieveID) + if achi and X.StringFindW(achi.szName, _L['Full win']) then + table.insert(aMapAchievements, dwAchieveID) + end + end + -- 初始化所有监听成就状态 + local rss = MY_RSS.Get('achievement-rank') + for _, dwAchieveID in X.sipairs( + aMapAchievements, + X.IsTable(rss) and rss[dwMapID] or X.CONSTANT.EMPTY_TABLE, + X.IsTable(rss) and rss['*'] or X.CONSTANT.EMPTY_TABLE + ) do + local achi = X.GetAchievement(dwAchieveID) + if achi then + for _, s in ipairs(X.SplitString(achi.szSubAchievements, '|', true)) do + local dwSubAchieve = tonumber(s) + if dwSubAchieve then + tBossAchieveAcquireState[dwSubAchieve] = me.IsAchievementAcquired(dwSubAchieve) + end + end + tBossAchieveAcquireState[dwAchieveID] = me.IsAchievementAcquired(dwAchieveID) + end + end + --[[#DEBUG BEGIN]] + if not X.IsEmpty(tBossAchieveAcquireState) then + X.OutputDebugMessage('Current map boss achieve: ' .. X.EncodeQuerystring(tBossAchieveAcquireState) .. '.', X.DEBUG_LEVEL.LOG) + end + --[[#DEBUG END]] + BOSS_ACHIEVE_ACQUIRE_STATE = tBossAchieveAcquireState +end +X.RegisterEvent('MY_RSS_UPDATE', 'MY_JBAchievementRank', function() + if arg0 and arg0 ~= 'achievement-rank' then + return + end + D.UpdateMapBossAchieveAcquire() +end) +X.RegisterEvent('LOADING_ENDING', 'MY_JBAchievementRank', D.UpdateMapBossAchieveAcquire) + +X.RegisterEvent({ + 'NEW_ACHIEVEMENT', + 'SYNC_ACHIEVEMENT_DATA', + 'UPDATE_ACHIEVEMENT_POINT', + 'UPDATE_ACHIEVEMENT_COUNT', +}, 'MY_JBAchievementRank', function() + local me = X.GetClientPlayer() + for dwAchieveID, bAcquired in pairs(BOSS_ACHIEVE_ACQUIRE_STATE) do + if not bAcquired and me.IsAchievementAcquired(dwAchieveID) then + local aTeammate, szLeader = {}, '' + local team = X.IsClientPlayerInParty() and GetClientTeam() + if team then + -- 队长 + local dwLeader = team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER) + local leader = dwLeader and team.GetMemberInfo(dwLeader) + if leader then + szLeader = leader.szName + end + -- 团员 + for _, dwTarID in ipairs(team.GetTeamMemberList()) do + local info = X.GetTeamMemberInfo(dwTarID) + local guid = X.GetPlayerGlobalID(dwTarID) or 0 + if info then + table.insert(aTeammate, info.szName .. ',' .. info.dwActualKungfuID .. ',' .. guid .. ',' .. dwTarID) + end + end + else + szLeader = me.szName + table.insert(aTeammate, me.szName .. ',' .. UI_GetPlayerMountKungfuID() .. ',' .. X.GetClientPlayerGlobalID() .. ',' .. X.GetClientPlayerID()) + end + local rec = { + szServer = X.GetServerOriginName(), + szName = me.szName, + szLeader = szLeader, + szTeammate = table.concat(aTeammate, ';'), + dwAchieveID = dwAchieveID, + dwTime = GetCurrentTime(), + dwFightBeginTime = D.dwFightBeginTime, + szFightUUID = D.szFightUUID, + dwDamage = D.dwDamage, + dwTherapy = D.dwTherapy, + nRoleType = me.nRoleType, + nAchievement = me.GetAchievementRecord(), + nFightTime = X.GetFightTime(), + szClientGUID = X.GetClientGUID(), + } + table.insert(BOSS_ACHIEVE_ACQUIRE_LOG, rec) + BOSS_ACHIEVE_ACQUIRE_STATE[dwAchieveID] = true + -- D.ShareBKR(rec, false) + end + end + D.CheckUpdateAcquire() + -- D.ShotAchievementAcquire() +end) + +X.RegisterExit('MY_JBAchievementRank', D.ShotAchievementAcquire) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Dungeon Rank'], font = 27 }):Height() + 2 + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + checked = MY_JBAchievementRank.bEnable, + text = _L['Share boss kill'], + onCheck = function(bChecked) + MY_JBAchievementRank.bEnable = bChecked + end, + tip = { + render = _L['Share boss kill record for kill rank.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('Text', { + x = nX, y = nY, h = 25, + text = _L['(Checked this option to join dungeon rank.)'], + color = { 172, 172, 172 }, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, + text = _L['Sync competition'], + onClick = function() + MY_RSS.Sync() + end, + tip = { + type = 'table', + columns = { + { nPaddingRight = 20, nMinWidth = 100 }, + { szAlignment = 'RIGHT' }, + }, + dataSource = function() + local aDataSource = { + {GetFormatText(_L['Current map achievement rank:'], 162, 255, 255, 0)}, + } + local aAchievement = {} + for dwAchieveID, bAcquired in pairs(BOSS_ACHIEVE_ACQUIRE_STATE) do + table.insert(aAchievement, { dwAchieveID = dwAchieveID, bAcquired = bAcquired }) + end + table.sort(aAchievement, function(a, b) return a.dwAchieveID < b.dwAchieveID end) + for _, v in ipairs(aAchievement) do + local achi = X.GetAchievement(v.dwAchieveID) + table.insert(aDataSource, { + GetFormatText('[' .. (achi and achi.szName or v.dwAchieveID) .. ']', 162, 255, 255, 0), + v.bAcquired and GetFormatText(_L['(Done)'], 162, 255, 128, 0) or GetFormatText(_L['(Pending)'], 162, 0, 255, 128), + }) + end + if #aDataSource == 1 then + aDataSource[1][2] = GetFormatText(_L['None']) + end + return aDataSource + end, + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):AutoWidth():Width() + 5 + + nX = nPaddingX + 10 + nY = nY + nLH + nLFY = nY + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBAchievementRank', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = function(_, v) + if v then + D.CheckUpdateAcquire() + end + end, + }, + root = O, + }, + }, +} +MY_JBAchievementRank = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBAchievementSync.lua b/MY_TeamTools/src/MY_JBAchievementSync.lua new file mode 100644 index 000000000..e3292c3ba --- /dev/null +++ b/MY_TeamTools/src/MY_JBAchievementSync.lua @@ -0,0 +1,149 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 成就同步 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBAchievementSync' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBAchievementSync' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_JBAchievementSync', _L['Raid'], { + bAuto = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_JBAchievementSync'], + _L['Auto sync achievement on exit'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.EncodeAchievement() + local me = X.GetClientPlayer() + local Achievement = X.GetGameTable('Achievement', true) + local achi = Achievement and Achievement:GetRow(Achievement:GetRowCount()) + local nMaxIndex = achi and achi.dwID + local aByte = {} + local aBit = {0, 0, 0, 0, 0, 0, 0, 0} + local nIndex = 0 + while nIndex <= nMaxIndex do + for nOffset = 0, 7 do + aBit[nOffset + 1] = me.IsAchievementAcquired(nIndex + nOffset) or 0 + end + table.insert(aByte, string.char(X.Bitmap2Number(aBit))) + nIndex = nIndex + 8 + end + local szBin = table.concat(aByte) + local szCompressBin = X.Deflate:CompressZlib(szBin) + local szCompressBinBase64 = X.EncodeBase64(szCompressBin) + return szCompressBinBase64 +end + +function D.Sync(bSilent, resolve, reject) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/achievements', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + achievements = D.EncodeAchievement(), + }, + signature = X.SECRET['J3CX::ACHIEVEMENT_SYNC'], + success = function(szHTML) + if bSilent then + return + end + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + X.Alert((X.Get(res, {'msg'}, _L['Sync success.']))) + X.SafeCall(resolve) + else + X.Alert((X.Get(res, {'msg'}, _L['Request failed.']))) + X.SafeCall(reject) + end + end, + }) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + -- 成就同步 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, w = 'auto', + buttonStyle = 'FLAT', text = _L['Sync achievement'], + onClick = function() + D.Sync() + end, + }):Width() + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY + 2, w = 'auto', + text = _L['Auto sync achievement on exit'], + checked = MY_JBAchievementSync.bAuto, + onCheck = function(bChecked) + MY_JBAchievementSync.bAuto = bChecked + end, + }):Width() + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBAchievementSync', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + { + fields = { + 'bAuto', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bAuto', + }, + triggers = { + bAuto = function(_, v) + if v then + D.Sync(true) + end + end, + }, + root = O, + }, + }, +} +MY_JBAchievementSync = X.CreateModule(settings) +end + +X.RegisterFrameCreate('ExitPanel', 'MY_JBAchievementSync', function() + if O.bAuto then + D.Sync(true) + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBBind.lua b/MY_TeamTools/src/MY_JBBind.lua new file mode 100644 index 000000000..d24df30a1 --- /dev/null +++ b/MY_TeamTools/src/MY_JBBind.lua @@ -0,0 +1,225 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 绑定 JX3BOX +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBBind' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBBind' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local O = { + uid = nil, + pending = false, +} + +function D.FetchBindStatus(resolve, reject) + if X.IsNil(O.uid) then + O.pending = true + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/role/query', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + }, + signature = X.SECRET['J3CX::ROLE_QUERY'], + success = function(szHTML) + O.pending = false + local res = X.DecodeJSON(szHTML) + local code = X.Get(res, {'code'}) + if code == 0 then + O.uid = X.Get(res, {'data', 'uid'}) + X.SafeCall(resolve, O.uid) + elseif code == 404 then + O.uid = 0 + X.SafeCall(resolve, O.uid) + else + X.SafeCall(reject) + end + end, + error = function() + O.pending = false + X.SafeCall(reject) + end, + }) + else + X.SafeCall(resolve, O.uid) + end +end + +function D.Bind(szToken, resolve, reject) + local dwID = X.GetClientPlayerID() + if IsRemotePlayer(dwID) then + X.Alert(_L['You are crossing server, please do this after backing.']) + return + end + local me = X.GetClientPlayer() + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/role/bind', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + token = szToken, + cguid = X.GetClientGUID(), + jx3id = X.GetClientPlayerGlobalID(), + server = X.GetServerOriginName(), + id = dwID, + name = X.GetClientPlayerName(), + mount = me.GetKungfuMount().dwMountType, + type = me.nRoleType, + }, + signature = X.SECRET['J3CX::ROLE_BIND'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + O.uid = nil + X.SafeCall(resolve, O.uid) + else + X.Alert((X.Get(res, {'msg'}, _L['Request failed.']))) + X.SafeCall(reject) + end + end, + }) +end + +function D.Unbind(resolve, reject) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/role/unbind', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + }, + signature = X.SECRET['J3CX::ROLE_UNBIND'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + O.uid = nil + X.SafeCall(resolve) + else + X.Alert((X.Get(res, {'msg'}, _L['Request failed.']))) + X.SafeCall(reject) + end + end, + }) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + -- 角色认证 + local uiCCStatus, uiBtnCCStatus, uiBtnCCLink + local function UpdateUI() + if uiCCStatus:Count() == 0 or uiBtnCCStatus:Count() == 0 or uiBtnCCLink:Count() == 0 then + return + end + if O.pending then + uiCCStatus:Text(_L['Loading']) + uiBtnCCStatus:Text(_L['Click fetch']) + elseif X.IsNil(O.uid) then + uiCCStatus:Text(_L['Unknown']) + uiBtnCCStatus:Text(_L['Click fetch']) + elseif X.IsEmpty(O.uid) then + uiCCStatus:Text(_L['Not bind']) + uiBtnCCStatus:Text(_L['Click bind']) + else + uiCCStatus:Text(_L('Binded (ID: %s)', O.uid)) + uiBtnCCStatus:Text(_L['Click unbind']) + end + uiCCStatus:AutoWidth() + uiBtnCCStatus:Enable(not O.pending) + uiBtnCCStatus:Left(uiCCStatus:Left() + uiCCStatus:Width() + 20) + uiBtnCCLink:Left(uiBtnCCStatus:Left() + uiBtnCCStatus:Width() + 10) + end + + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Character Certification'], font = 27 }):Height() + 2 + + nX = nPaddingX + 10 + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L('Current character: %s', X.GetClientPlayerName()) }):Width() + 20 + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L['Status: '] }):Width() + uiCCStatus = ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L['Loading'] }) + nX = nX + uiCCStatus:Width() + uiBtnCCStatus = ui:Append('WndButton', { + x = nX, y = nY + 2, + buttonStyle = 'FLAT', text = _L['Bind'], enable = false, + onClick = function() + if O.pending or X.IsNil(O.uid) then + D.FetchBindStatus(UpdateUI, UpdateUI) + elseif X.IsEmpty(O.uid) then + GetUserInput(_L['Please input certification code:'], function(szText) + uiBtnCCStatus:Enable(false) + D.Bind( + szText, + function() + X.Alert(_L['Bind succeed!']) + D.FetchBindStatus(UpdateUI, UpdateUI) + end, + function() + D.FetchBindStatus(UpdateUI, UpdateUI) + end) + end) + elseif X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) then + X.OutputAnnounceMessage(_L['Please unlock equip lock first!'], X.CONSTANT.MSG_THEME.ERROR) + else + X.Confirm(_L['Sure to unbind character certification?'], function() + uiBtnCCStatus:Enable(false) + D.Unbind( + function() + X.Alert(_L['Unbind succeed!']) + D.FetchBindStatus(UpdateUI, UpdateUI) + end, + function() + D.FetchBindStatus(UpdateUI, UpdateUI) + end) + end) + end + end, + }) + nX = nX + uiBtnCCStatus:Width() + uiBtnCCLink = ui:Append('WndButton', { + x = nX, y = nY + 2, w = 120, + buttonStyle = 'FLAT', text = _L['Login team platform'], + onClick = function() + X.OpenBrowser(MY_RSS.PAGE_BASE_URL .. '/jx3box/team/platform') + end, + }) + nX = nX + uiBtnCCLink:Width() + + UpdateUI() + D.FetchBindStatus(UpdateUI, UpdateUI) + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBBind', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_JBBind = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBEventVote.lua b/MY_TeamTools/src/MY_JBEventVote.lua new file mode 100644 index 000000000..f38dd9ae2 --- /dev/null +++ b/MY_TeamTools/src/MY_JBEventVote.lua @@ -0,0 +1,414 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 魔盒投票 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBEventVote' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = PLUGIN_ROOT .. '/ui/MY_JBEventVote.ini' +local SZ_MOD_INI = PLUGIN_ROOT .. '/ui/MY_JBEventVote__Mod.ini' +local D = { + aEventList = {}, + tChangedEventID = {}, + tEventRankInfo = {}, + szEventSearch = '', +} + +local Schema = X.Schema +local EVENT_LIST_SCHEMA = X.Schema.Record({ + data = X.Schema.Collection(X.Schema.Record({ + achieve_ids = X.Schema.String, -- 8548,8549.. 一段以半角逗号分隔的成就ID字符串 + id = X.Schema.Number, -- 活动ID + name = X.Schema.String, -- 活动名称,可用于显示 + vote_start = X.Schema.Number, -- 投票开启时间 + vote_end = X.Schema.Number, -- 投票结束时间 + }, true)), +}, true) +local RANK_DATA_SCHEMA = X.Schema.Record({ + data = X.Schema.Record({ + list = X.Schema.Collection(X.Schema.Record({ + id = X.Schema.Number, -- 团队ID + event_id = X.Schema.Number, -- 活动ID + count = X.Schema.Number, -- 票数 + name = X.Schema.String, -- 团队名称 + server = X.Schema.String, -- 团队服务器 + leader_name = X.Schema.String, -- 团长名字 + slogan = X.Schema.String, -- 参赛宣言,已由运营审核 + link = X.Schema.String, -- 团队主页(查看详情的链接地址) + checked = X.Schema.Number, -- 默认为0,当为1时代表该用户已投票该队伍 + }, true)), + record = X.Schema.Record({ + status = X.Schema.Number, -- 是否已投票 + team_id = X.Schema.Number, -- 已投票的团队ID + }, true), + }, true), +}, true) +local VOTE_SCHEMA = X.Schema.Record({ + msg = X.Schema.String, +}, true) + +function D.FetchEventList(frame) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/event/list', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + }, + signature = X.SECRET['J3CX::EVENT_LIST'], + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if not res then + X.Alert(_L['ERR: Decode eventlist content as json failed!'] .. err) + X.UI.CloseFrame(frame) + return + end + local errs = X.Schema.CheckSchema(res, EVENT_LIST_SCHEMA) + if errs then + local aErrmsgs = {} + for i, err in ipairs(errs) do + table.insert(aErrmsgs, ' ' .. i .. '. ' .. err.message) + end + X.Alert(_L['ERR: Eventlist content is illegal!'] .. '\n\n' .. X.ReplaceSensitiveWord(table.concat(aErrmsgs, '\n'))) + X.UI.CloseFrame(frame) + return + end + D.aEventList = res.data + D.UpdateEventList(frame) + end, + error = function(html, status) + if status == 404 then + X.Alert(_L['ERR404: Eventlist address not found!']) + X.UI.CloseFrame(frame) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_JBEventVote'], 'ERROR Get Eventlist: ' .. status .. '\n' .. UTF8ToAnsi(html), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + X.UI.CloseFrame(frame) + end, + }) +end + +function D.UpdateEventList(frame) + frame.bInitPageset = true + local pageset = frame:Lookup('PageSet_All') + for i, eve in ipairs(D.aEventList) do + local frameMod = X.UI.OpenFrame(SZ_MOD_INI, 'MY_JBEventVote__Mod') + local checkbox = frameMod:Lookup('PageSet_All/WndCheck_Event') + local page = frameMod:Lookup('PageSet_All/Page_Event') + page:Lookup('Wnd_Event/WndScroll_Event', 'Handle_EventColumns/Handle_EventColumn_Name/Handle_EventColumn_Name_Title/Text_EventColumn_Name_Title'):SetText(_L['Team Name']) + page:Lookup('Wnd_Event/WndScroll_Event', 'Handle_EventColumns/Handle_EventColumn_Server/Handle_EventColumn_Server_Title/Text_EventColumn_Server_Title'):SetText(_L['Server']) + page:Lookup('Wnd_Event/WndScroll_Event', 'Handle_EventColumns/Handle_EventColumn_Leader/Handle_EventColumn_Leader_Title/Text_EventColumn_Leader_Title'):SetText(_L['Leader']) + page:Lookup('Wnd_Event/WndScroll_Event', 'Handle_EventColumns/Handle_EventColumn_Slogan/Handle_EventColumn_Slogan_Title/Text_EventColumn_Slogan_Title'):SetText(_L['Slogan']) + page:Lookup('Wnd_Event/WndScroll_Event', 'Handle_EventColumns/Handle_EventColumn_Count/Handle_EventColumn_Count_Title/Text_EventColumn_Count_Title'):SetText(_L['Vote Count']) + page:Lookup('Wnd_Event/WndScroll_Event/WndContainer_List'):Clear() + checkbox:ChangeRelation(pageset, true, true) + page:ChangeRelation(pageset, true, true) + X.UI.CloseFrame(frameMod) + pageset:AddPage(page, checkbox) + checkbox:Show() + checkbox:Lookup('', 'Text_CheckEvent'):SetText(X.ReplaceSensitiveWord(eve.name)) + checkbox:SetRelX(checkbox:GetRelX() + checkbox:GetW() * (i - 1)) + checkbox.eve = eve + page.eve = eve + end + if D.aEventList[1] then + D.FetchRankList(frame, D.aEventList[1].id) + end + frame.bInitPageset = nil +end + +function D.FetchRankList(frame, szEventID) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/rank/list', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + event_id = szEventID, + }, + signature = X.SECRET['J3CX::RANK_LIST'], + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if not res then + X.Alert(_L['ERR: Decode rankdata content as json failed!'] ..err) + return + end + local errs = X.Schema.CheckSchema(res, RANK_DATA_SCHEMA) + if errs then + local aErrmsgs = {} + for i, err in ipairs(errs) do + table.insert(aErrmsgs, ' ' .. i .. '. ' .. err.message) + end + X.Alert(_L['ERR: Rankdata content is illegal!'] .. '\n\n' .. X.ReplaceSensitiveWord(table.concat(aErrmsgs, '\n'))) + return + end + D.tChangedEventID[szEventID] = true + D.tEventRankInfo[szEventID] = res.data + D.UpdateEvent(frame) + end, + error = function(html, status) + if status == 404 then + X.Alert(_L['ERR404: Rankdata address not found!']) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_JBEventVote'], 'ERROR Get Rankdata: ' .. status .. '\n' .. UTF8ToAnsi(html), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end, + }) +end + +function D.UpdateEvent(frame) + local pageset = frame:Lookup('PageSet_All') + local page = pageset:GetFirstChild() + local szEventSearch = X.StringReplaceW(D.szEventSearch, ' ', ',') + while page do + if page:GetName() == 'Page_Event' and (D.tChangedEventID[page.eve.id] or D.tChangedEventID['*']) then + local bInTime = page.eve.vote_start <= GetCurrentTime() and page.eve.vote_end >= GetCurrentTime() + local bVoted = X.Get(D.tEventRankInfo, {page.eve.id, 'record', 'status'}, 0) ~= 0 + local nVotedTeamID = X.Get(D.tEventRankInfo, {page.eve.id, 'record', 'team_id'}, 0) + local container = page:Lookup('Wnd_Event/WndScroll_Event/WndContainer_List') + container:Clear() + for i, team in ipairs(X.Get(D.tEventRankInfo, {page.eve.id, 'list'}, {})) do + if X.IsEmpty(D.szEventSearch) + or X.StringSimpleMatch(team.server .. ',' .. team.name, szEventSearch) then + local wnd = container:AppendContentFromIni(SZ_MOD_INI, 'Wnd_Row') + wnd:Lookup('', 'Text_ItemName'):SetText(X.ReplaceSensitiveWord(team.name)) + wnd:Lookup('', 'Text_ItemServer'):SetText(X.ReplaceSensitiveWord(team.server)) + wnd:Lookup('', 'Text_ItemLeader'):SetText(X.ReplaceSensitiveWord(team.leader_name)) + wnd:Lookup('', 'Text_ItemSlogan'):SetText(X.ReplaceSensitiveWord(team.slogan)) + wnd:Lookup('', 'Text_ItemCount'):SetText(X.ReplaceSensitiveWord(team.count)) + wnd:Lookup('', 'Image_RowBg'):SetVisible(i % 2 == 1) + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Info', + x = 860, y = 3, w = 100, h = 25, + buttonStyle = 'LINK', + text = _L['View Detail'], + }) + local btn = ui:Append('WndButton', { + name = 'Btn_Vote', + x = 960, y = 3, w = 80, h = 25, + buttonStyle = 'SKEUOMORPHISM', + }) + if bInTime and not bVoted then + btn:Text(_L['Vote']) + elseif nVotedTeamID == team.id then + btn:Text(_L['Voted']) + btn:Enable(false) + else + btn:Hide() + end + wnd.team = team + end + end + container:FormatAllContentPos() + end + page = page:GetNext() + end + D.tChangedEventID = {} +end + +function D.Vote(frame, szEventID, szTeamID) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/rank/vote', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + jx3id = X.GetClientPlayerGlobalID(), + event_id = szEventID, + team_id = szTeamID, + }, + signature = X.SECRET['J3CX::RANK_VOTE'], + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if not res then + X.Alert(_L['ERR: Decode vote content as json failed!'] ..err) + return + end + local errs = X.Schema.CheckSchema(res, VOTE_SCHEMA) + if errs then + local aErrmsgs = {} + for i, err in ipairs(errs) do + table.insert(aErrmsgs, ' ' .. i .. '. ' .. err.message) + end + X.Alert(_L['ERR: Vote content is illegal!'] .. '\n\n' .. X.ReplaceSensitiveWord(table.concat(aErrmsgs, '\n'))) + return + end + X.Alert(X.ReplaceSensitiveWord(res.msg)) + D.FetchRankList(frame, szEventID) + end, + error = function(html, status) + if status == 404 then + X.Alert(_L['ERR404: Vote address not found!']) + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_JBEventVote'], 'ERROR Push Vote: ' .. status .. '\n' .. UTF8ToAnsi(html), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + end, + }) +end + +function D.OnFrameCreate() + this.bInitializing = true + this:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + this:Lookup('', 'Text_Title'):SetText(_L['MY_JBEventVote']) + this:Lookup('Wnd_Search/Edit_Search'):SetText(D.szEventSearch) + D.tChangedEventID['*'] = true + this.bInitializing = nil + D.OnEvent('UI_SCALED') + D.UpdateEventList(this) + D.UpdateEvent(this) + D.FetchEventList(this) +end + +function D.OnEvent(event) +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Close' then + X.UI.CloseFrame(this:GetRoot()) + elseif name == 'Btn_Info' then + X.OpenBrowser(this:GetParent().team.link) + elseif name == 'Btn_Vote' then + D.Vote(this:GetRoot(), this:GetParent().team.event_id, this:GetParent().team.id) + end +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'WndCheck_Event' then + local aXml = {} + table.insert(aXml, GetFormatText(this.eve.name, 82)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(_L['Finish achieves: '], 82)) + for _, szAcheveID in ipairs(X.SplitString(this.eve.achieve_ids, ',', true)) do + table.insert(aXml, GetFormatText('[' .. X.Get(X.GetAchievement(szAcheveID), {'szName'}, '') .. ']', 82)) + if IsCtrlKeyDown() then + table.insert(aXml, GetFormatText('(' .. szAcheveID .. ')', 102)) + end + end + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(_L['Start time: '], 82)) + table.insert(aXml, GetFormatText(X.FormatTime(this.eve.vote_start, '%yyyy/%MM/%dd %hh:%mm:%ss'), 82)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXml, GetFormatText(_L['End time: '], 82)) + table.insert(aXml, GetFormatText(X.FormatTime(this.eve.vote_end, '%yyyy/%MM/%dd %hh:%mm:%ss'), 82)) + table.insert(aXml, X.CONSTANT.XML_LINE_BREAKER) + if IsCtrlKeyDown() then + table.insert(aXml, GetFormatText('ID: ' .. this.eve.id, 102)) + end + X.OutputTip(this, table.concat(aXml), true, ALW.TOP_BOTTOM, 400) + end +end + +function D.OnMouseLeave() + local name = this:GetName() + if name == 'WndCheck_Event' then + HideTip() + end +end + +function D.OnEditChanged() + local frame = this:GetRoot() + if not frame or frame.bInitializing then + return + end + local name = this:GetName() + local frame = this:GetRoot() + if name == 'Edit_Search' then + D.szEventSearch = X.TrimString(this:GetText()) + D.tChangedEventID['*'] = true + X.DelayCall('MY_JBEventVote__Search', 300, function() D.UpdateEvent(frame) end) + end +end + +function D.OnActivePage() + local frame = this:GetRoot() + if not frame or frame.bInitializing then + return + end + if frame.bInitPageset then + return + end + local name = this:GetName() + if name == 'PageSet_All' then + local page = this:GetActivePage() + D.FetchRankList(frame, page.eve.id) + end +end + +function D.Open() + X.UI.OpenFrame(INI_PATH, 'MY_JBEventVote'):BringToTop() +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_JBEventVote') +end + +function D.Close() + X.UI.CloseFrame('MY_JBEventVote') +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + local me = X.GetClientPlayer() + if me and me.nMaxLevel == me.nLevel then + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Dungeon Vote'], font = 27 }):Height() + 2 + + nX = nPaddingX + 10 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, w = 'auto', + buttonStyle = 'FLAT', + text = _L['MY_JBEventVote'], + onClick = function() + D.Open() + end, + }):Width() + 5 + + nLFY = nY + nLH + end + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBEventVote', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + { + preset = 'UIEvent', + root = D, + }, + }, +} +MY_JBEventVote = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBLoverSync.lua b/MY_TeamTools/src/MY_JBLoverSync.lua new file mode 100644 index 000000000..3bb208e58 --- /dev/null +++ b/MY_TeamTools/src/MY_JBLoverSync.lua @@ -0,0 +1,119 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 情缘同步 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBLoverSync' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBLoverSync' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} + +local function OnBgTalk(_, aData, nChannel, dwTalkerID, szTalkerName, bSelf) + if not MY_Love or MY_Love.IsShielded() then + return + end + if not bSelf then + if not X.CanUseOnlineRemoteStorage() then + X.SendBgMsg(szTalkerName, 'MY_JB_LOVER_SYNC', {'DATA_NOT_SYNC'}) + return + end + local szKey, data = aData[1], aData[2] + if szKey == 'SYNC' then + local lover = MY_Love.GetLover() + local tFellowship = X.GetFellowshipInfo(dwTalkerID) + if lover and tFellowship and lover.xID == tFellowship.xID then + X.Confirm(_L('[%s] want to sync lover relation to jx3box, do you agree?', szTalkerName), function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Sync lover is a sensitive action, please unlock to continue.']) + return false + end + X.SendBgMsg(szTalkerName, 'MY_JB_LOVER_SYNC', {'SYNC_ANS', X.GetClientPlayerGlobalID()}) + end) + else + X.SendBgMsg(szTalkerName, 'MY_JB_LOVER_SYNC', {'SYNC_ANS_NOT_LOVER'}) + end + elseif szKey == 'SYNC_ANS' then + D.SyncLover(szTalkerName, data) + elseif szKey == 'SYNC_ANS_NOT_LOVER' then + X.Alert(_L['Peer is not your lover, please check, or do fix lover first.']) + elseif szKey == 'DATA_NOT_SYNC' then + X.Alert(_L('[%s] disabled ui config sync, unable to read data.', szTalkerName)) + end + end +end +X.RegisterBgMsg('MY_JB_LOVER_SYNC', OnBgTalk) + +function D.SyncLover(szLoverName, szLoverUUID, resolve, reject) + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/role/bind/love', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + role1 = X.GetClientPlayerGlobalID(), + role2 = szLoverUUID, + }, + signature = X.SECRET['J3CX::LOVER_SYNC'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + X.Alert((X.Get(res, {'msg'}, _L['Sync success.']))) + X.SafeCall(resolve) + else + X.Alert((X.Get(res, {'msg'}, _L['Request failed.']))) + X.SafeCall(reject) + end + end, + }) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + -- 情缘同步 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, w = 'auto', + buttonStyle = 'FLAT', text = _L['Sync lover'], + onClick = function() + local lover = MY_Love.GetLover() + if lover then + X.OutputSystemAnnounceMessage(_L['Sync lover request sent, please wait for peer to agree.']) + X.SendBgMsg(lover.szName, 'MY_JB_LOVER_SYNC', {'SYNC'}) + else + D.SyncLover('', '') + end + end, + }):Width() + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBLoverSync', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_JBLoverSync = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBTeam.lua b/MY_TeamTools/src/MY_JBTeam.lua new file mode 100644 index 000000000..e130b8ecd --- /dev/null +++ b/MY_TeamTools/src/MY_JBTeam.lua @@ -0,0 +1,160 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 快捷入团 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBTeam' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBBind' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local O = {} + +function D.ApplyAPI(szAction, szTeam, resolve, reject) + local dwID = X.GetClientPlayerID() + if IsRemotePlayer(dwID) then + X.Alert(_L['You are crossing server, please do this after backing.']) + return + end + local me = X.GetClientPlayer() + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/team/' .. (szAction == 'join' and 'join' or 'quit'), + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + team = szTeam, + cguid = X.GetClientGUID(), + jx3id = X.GetClientPlayerGlobalID(), + server = X.GetServerOriginName(), + id = dwID, + name = X.GetClientPlayerName(), + mount = me.GetKungfuMount().dwMountType, + body_type = me.nRoleType, + }, + signature = szAction == 'join' and X.SECRET['J3CX::TEAM_JOIN'] or X.SECRET['J3CX::TEAM_QUIT'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + X.SafeCall(resolve) + else + X.SafeCall(reject, X.ReplaceSensitiveWord(X.Get(res, {'msg'}, _L['Request failed.']))) + end + end, + }) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + -- 快捷入团 + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Quick team'], font = 27 }):Height() + 2 + + nX = nPaddingX + 10 + local bLoading + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L['Team name/id:'] }):Width() + local uiInput = ui:Append('WndEditBox', { x = nX, y = nY + 2, w = 150, h = 25 }) + nX = nX + uiInput:Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, + buttonStyle = 'FLAT', text = _L['Apply join team'], + onClick = function() + if bLoading then + return X.OutputSystemAnnounceMessage(_L['Processing, please wait.']) + end + local szTeam = uiInput:Text() + if X.IsEmpty(szTeam) then + return X.Alert(_L['Please input team name/id.']) + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) then + return X.OutputAnnounceMessage(_L['Please unlock equip lock first!'], X.CONSTANT.MSG_THEME.ERROR) + end + X.Confirm(_L('Sure to apply join team %s?', szTeam), function() + bLoading = true + D.ApplyAPI( + 'join', + szTeam, + function() + bLoading = false + X.Alert(_L['Apply succeed!']) + uiInput:Text('') + end, + function(szMsg) + bLoading = false + X.Alert(_L['Apply failed!'] .. szMsg) + end) + end) + end, + }):Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, + buttonStyle = 'FLAT', text = _L['Apply quit team'], + onClick = function() + if bLoading then + return X.OutputSystemAnnounceMessage('Processing, please wait.') + end + local szTeam = uiInput:Text() + if X.IsEmpty(szTeam) then + return X.Alert(_L['Please input team name/id.']) + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) then + return X.OutputAnnounceMessage(_L['Please unlock equip lock first!'], X.CONSTANT.MSG_THEME.ERROR) + end + X.Confirm(_L('Sure to apply quit team %s?', szTeam), function() + bLoading = true + D.ApplyAPI( + 'quit', + szTeam, + function() + bLoading = false + X.Alert(_L['Quit succeed!']) + uiInput:Text('') + end, + function(szMsg) + bLoading = false + X.Alert(_L['Quit failed!'] .. szMsg) + end) + end) + end, + }):Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 5, w = 20, h = 20, + buttonStyle = 'QUESTION', + onClick = function() + X.UI.OpenBrowser(MY_RSS.PAGE_BASE_URL .. '/jx3box/team/about') + end, + }):Width() + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBTeam', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_JBTeam = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_JBTeamSnapshot.lua b/MY_TeamTools/src/MY_JBTeamSnapshot.lua new file mode 100644 index 000000000..56793df35 --- /dev/null +++ b/MY_TeamTools/src/MY_JBTeamSnapshot.lua @@ -0,0 +1,158 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 快捷入团 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_JBTeamSnapshot' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_JBBind' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/jx3box/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local O = X.CreateUserSettingsModule('MY_JBTeamSnapshot', _L['Raid'], { + szTeam = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_JBTeamSnapshot'], + _L['Team name/id'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, +}) +local D = {} + +function D.CreateSnapshot() + local dwID = X.GetClientPlayerID() + if IsRemotePlayer(dwID) then + X.Alert(_L['You are crossing server, please do this after backing.']) + return + end + if X.IsEmpty(O.szTeam) then + X.Panel.Show() + X.Panel.SwitchTab('MY_JX3BOX') + return X.Alert(_L['Please input team name/id.']) + end + local aTeammate = {} + local team = X.IsClientPlayerInParty() and GetClientTeam() + if team then + for _, dwTarID in ipairs(team.GetTeamMemberList()) do + local info = X.GetTeamMemberInfo(dwTarID) + local guid = X.GetPlayerGlobalID(dwTarID) or 0 + table.insert(aTeammate, info.szName .. ',' .. dwTarID .. ',' .. guid .. ',' .. info.dwActualKungfuID) + end + end + local me = X.GetClientPlayer() + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/team/snapshot', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + team = O.szTeam, + cguid = X.GetClientGUID(), + jx3id = X.GetClientPlayerGlobalID(), + server = X.GetServerOriginName(), + teammate = table.concat(aTeammate, ';'), + }, + signature = X.SECRET['J3CX::TEAM_SNAPSHOT'], + success = function(szHTML) + local res = X.DecodeJSON(szHTML) + if X.Get(res, {'code'}) == 0 then + X.Alert(_L['Upload snapshot succeed!']) + else + X.Alert(_L['Upload snapshot failed!'] .. X.ReplaceSensitiveWord(X.Get(res, {'msg'}, _L['Request failed.']))) + end + end, + error = function() + X.Alert(_L['Upload snapshot failed!']) + end, + }) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + -- 快捷入团 + nX = nPaddingX + nY = nLFY + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Team Snapshot'], font = 27 }):Height() + 2 + + nX = nPaddingX + 10 + local bLoading + nX = nX + ui:Append('Text', { x = nX, y = nY, w = 'auto', text = _L['Team name/id:'] }):Width() + ui:Append('Text', { + x = nX, y = nY + nLH, h = 25, + text = _L['(Input: Team@Server:Passcode)'], + color = { 172, 172, 172 }, + }):AutoWidth() + nX = nX + ui:Append('WndEditBox', { + x = nX, y = nY + 2, w = 300, h = 25, + text = O.szTeam, + onChange = function(szText) + O.szTeam = szText + end, + }):Width() + 5 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY + 2, + buttonStyle = 'FLAT', text = _L['Upload Snapshot'], + onClick = function() + D.CreateSnapshot() + end, + }):Width() + 5 + nX = nX + ui:Append('WndButtonBox', { + x = nX, y = nY + 5, w = 130, h = 20, + color = { 234, 235, 185 }, + buttonStyle = 'LINK', + text = _L['>> View Snapshots <<'], + onClick = function() + X.OpenBrowser(MY_RSS.PAGE_BASE_URL .. '/jx3box/team/snapshot') + end, + }):AutoWidth():Width() + 5 + + nLFY = nY + nLH + return nX, nY, nLFY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JBTeamSnapshot', + exports = { + { + fields = { + 'CreateSnapshot', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'szTeam', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'szTeam', + }, + root = O, + }, + }, +} +MY_JBTeamSnapshot = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_PartyRequest.lua b/MY_TeamTools/src/MY_PartyRequest.lua new file mode 100644 index 000000000..88cf846c4 --- /dev/null +++ b/MY_TeamTools/src/MY_PartyRequest.lua @@ -0,0 +1,665 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 组队助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_PartyRequest' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local PR_INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_PartyRequest.ini' +local PR_PARTY_REQUEST = {} + +local O = X.CreateUserSettingsModule('MY_PartyRequest', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bRefuseLowLv = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto refuse low level player'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bRefuseRobot = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto refuse robot player'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptTong = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept tong member'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptCamp = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept same camp'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptFriend = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept friend'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptAll = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept all'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept specific names'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_PartyRequest'], + _L['Auto accept specific names'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, +}) +RegisterCustomData('MY_PartyRequest.tAcceptCustom') + +function D.GetMenu() + local menu = { + szOption = _L['MY_PartyRequest'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = O.bEnable, + fnAction = function() + O.bEnable = not O.bEnable + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Auto refuse low level player'], + bCheck = true, bChecked = O.bRefuseLowLv, + fnAction = function() + O.bRefuseLowLv = not O.bRefuseLowLv + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto refuse robot player'], + bCheck = true, bChecked = O.bRefuseRobot, + fnAction = function() + O.bRefuseRobot = not O.bRefuseRobot + end, + fnMouseEnter = function() + local szXml = GetFormatText(_L['Full level and equip score less than 2/3 of yours'], nil, 255, 255, 0) + OutputTip(szXml, 600, {this:GetAbsX(), this:GetAbsY(), this:GetW(), this:GetH()}, ALW.RIGHT_LEFT) + end, + fnMouseLeave = function() + HideTip() + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept friend'], + bCheck = true, bChecked = O.bAcceptFriend, + fnAction = function() + O.bAcceptFriend = not O.bAcceptFriend + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept tong member'], + bCheck = true, bChecked = O.bAcceptTong, + fnAction = function() + O.bAcceptTong = not O.bAcceptTong + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept same camp'], + bCheck = true, bChecked = O.bAcceptCamp, + fnAction = function() + O.bAcceptCamp = not O.bAcceptCamp + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept all'], + bCheck = true, bChecked = O.bAcceptAll, + fnAction = function() + O.bAcceptAll = not O.bAcceptAll + end, + fnDisable = function() return not O.bEnable end, + }, + } + local t = { + szOption = _L['Auto accept specific names'], + bCheck = true, bChecked = O.bAcceptCustom, + fnAction = function() + O.bAcceptCustom = not O.bAcceptCustom + end, + fnDisable = function() return not O.bEnable end, + } + for szName, bEnable in pairs(O.tAcceptCustom) do + table.insert(t, { + szOption = szName, + bCheck = true, bChecked = bEnable, + fnAction = function() + O.tAcceptCustom[szName] = not O.tAcceptCustom[szName] + O.tAcceptCustom = O.tAcceptCustom + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tAcceptCustom[szName] = nil + O.tAcceptCustom = O.tAcceptCustom + X.UI.ClosePopupMenu() + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + end + if #t ~= 0 then + table.insert(t, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t, { + szOption = _L['Add'], + fnAction = function() + GetUserInput(_L['Please input custom name, multiple split with ",[]":'], function(val) + for _, v in ipairs(X.SplitString(val, {',', '[', ']'}, true)) do + O.tAcceptCustom[v] = true + O.tAcceptCustom = O.tAcceptCustom + end + end) + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + table.insert(menu, t) + return menu +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Accept' then + D.AcceptRequest(this:GetParent().info) + elseif name == 'Btn_Refuse' then + D.RefuseRequest(this:GetParent().info) + elseif name == 'Btn_Lookup' then + local info = this:GetParent().info + if not info.dwID or (not info.bDetail and IsCtrlKeyDown()) then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(info.szName, 'RL', {'ASK'}) + this:Enable(false) + this:Lookup('', 'Text_Default'):SetText(_L['loading...']) + X.OutputSystemMessage(_L['If it is always loading, the target may not install plugin or refuse.']) + elseif info.dwID then + X.ViewOtherPlayerByID(info.dwID) + end + elseif this.info then + if IsCtrlKeyDown() then + X.EditBox_AppendLinkPlayer(this.info.szName) + elseif IsAltKeyDown() and this.info.dwID then + X.ViewOtherPlayerByID(this.info.dwID) + end + end +end + +function D.OnRButtonClick() + if this.info then + PopupMenu(X.InsertPlayerContextMenu({}, this.info.szName, this.info.dwID)) + end +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'Btn_Lookup' then + local info = this:GetParent().info + if info.dwID and not info.bDetail then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = GetFormatText(_L['Press ctrl and click to ask detail.']) + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end + elseif this.info then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = MY_Farbnamen and MY_Farbnamen.GetTip(this.info.szName) + if szTip then + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end + end +end + +function D.OnMouseLeave() + if this.info then + HideTip() + end +end + +function D.GetFrame() + return Station.Lookup('Normal2/MY_PartyRequest') +end + +function D.OpenPanel() + if D.GetFrame() then + return + end + X.UI.OpenFrame(PR_INI_PATH, 'MY_PartyRequest') +end + +-- 判断是否需要更新界面 +function D.CheckRequestUpdate(info) + if not info.szName or not info.fnAccept or (info.dwDelayTime and info.dwDelayTime > GetTime()) then + X.UI.RemoveRequest('MY_PartyRequest', info.szName) + else + X.UI.ReplaceRequest('MY_PartyRequest', info.szName, info) + end +end + +function D.OnPeekPlayer(dwID, eState, kPlayer) + if eState == X.CONSTANT.PEEK_OTHER_PLAYER_RESPOND.SUCCESS then + local me = X.GetClientPlayer() + local dwTarType, dwTarID = me.GetTarget() + X.SetClientPlayerTarget(TARGET.PLAYER, dwID) + X.SetClientPlayerTarget(dwTarType, dwTarID) + local p = X.GetPlayer(dwID) + if p then + local mnt = p.GetKungfuMount() + local data = { nil, dwID, mnt and mnt.dwSkillID or nil, false } + D.Feedback(p.szName, data, false) + end + end +end + +function D.PeekPlayer(dwID) + X.PeekOtherPlayerByID(dwID, D.OnPeekPlayer) +end + +function D.AcceptRequest(info) + PR_PARTY_REQUEST[info.szName] = nil + X.UI.RemoveRequest('MY_PartyRequest', info.szName) + info.fnAccept() +end + +function D.RefuseRequest(info) + PR_PARTY_REQUEST[info.szName] = nil + X.UI.RemoveRequest('MY_PartyRequest', info.szName) + info.fnRefuse() +end + +function D.GetRequestStatus(info) + local szStatus, szMsg = 'normal' + if O.bAcceptAll then + szStatus = 'accept' + szMsg = _L('Auto accept %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif O.bAcceptCustom and O.tAcceptCustom[info.szName] then + szStatus = 'accept' + szMsg = _L('Auto accept %s(%s %d%s) custom party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bFriend and O.bAcceptFriend then + szStatus = 'accept' + szMsg = _L('Auto accept friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bTongMember and O.bAcceptTong then + szStatus = 'accept' + szMsg = _L('Auto tong member friend %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bSameCamp and O.bAcceptCamp then + szStatus = 'accept' + szMsg = _L('Auto camp %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + end + if szStatus == 'normal' and not info.bFriend and not info.bTongMember then + if O.bRefuseRobot and info.dwID and info.nLevel == X.CONSTANT.MAX_PLAYER_LEVEL then + local me = X.GetClientPlayer() + local tar = X.GetPlayer(info.dwID) + if tar then + local nScore = tar.GetTotalEquipScore() + if nScore == 0 then + szStatus = 'suspicious' + elseif tar.GetTotalEquipScore() < me.GetTotalEquipScore() * 2 / 3 then + szStatus = 'refuse' + szMsg = _L('Auto refuse %s(%s %d%s) party request, equip score: %d, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL, nScore) + end + end + end + if O.bRefuseLowLv and info.nLevel < X.CONSTANT.MAX_PLAYER_LEVEL then + szStatus = 'refuse' + szMsg = _L('Auto refuse %s(%s %d%s) party request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + end + end + return szStatus, szMsg +end + +function D.DoAutoAction(info) + local bAction, szStatus, szMsg = false + if info.szName and info.fnAccept then + szStatus, szMsg = D.GetRequestStatus(info) + if szStatus == 'refuse' then + bAction = true + D.RefuseRequest(info) + elseif szStatus == 'accept' then + bAction = true + D.AcceptRequest(info) + end + if szMsg then + X.OutputSystemMessage(szMsg) + end + end + return bAction, szStatus, szMsg +end + +function D.OnMessageBoxOpen() + local szMsgName, frame = arg0, arg1 + local szPrefix, szName = unpack(X.SplitString(szMsgName, '_', true, 2)) + if not O.bEnable or not frame or not frame:IsValid() or (szPrefix ~= 'ATMP' and szPrefix ~= 'IMTP') then + return + end + local fnAccept = X.GetMessageBoxButtonAction(frame, g_tStrings.STR_ACCEPT) + local fnRefuse = X.GetMessageBoxButtonAction(frame, g_tStrings.STR_REFUSE) + if fnAccept and fnRefuse then + -- 获取组队方法 + local info = PR_PARTY_REQUEST[szName] + if not info then + info = {} + PR_PARTY_REQUEST[szName] = info + end + info.fnAccept = function() + PR_PARTY_REQUEST[szName] = nil + X.Call(fnAccept) + end + info.fnRefuse = function() + PR_PARTY_REQUEST[szName] = nil + X.Call(fnRefuse) + end + D.DoAutoAction(info) + -- 关闭对话框 + frame.fnAutoClose = nil + frame.fnCancelAction = nil + frame.szCloseSound = nil + X.UI.CloseFrame(frame) + end +end + +function D.OnApplyRequest(event) + if not O.bEnable then + return + end + local szName, nCamp, dwForce, nLevel, nType, nClientVersionType = arg0, arg1, arg2, arg3, arg4, arg10 + local info = PR_PARTY_REQUEST[szName] + if not info then + info = {} + PR_PARTY_REQUEST[szName] = info + end + local me = X.GetClientPlayerInfo() + -- 判断对方是否已在进组列表中 + info.szType = event == 'PARTY_INVITE_REQUEST' and 'invite' or 'request' + info.szName = szName + info.nCamp = nCamp + info.dwForce = dwForce + info.nLevel = nLevel + info.bFriend = X.IsFellowship(szName) + info.bTongMember = X.IsTongMember(szName) + info.bSameCamp = info.nCamp == me.nCamp + info.nClientVersionType = nClientVersionType + info.dwDelayTime = nil + -- 获取dwID + local tar = X.GetTargetHandle(TARGET.PLAYER, szName) + if not info.dwID and tar then + info.dwID = tar.dwID + end + if not info.dwID and MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(szName) + if data then + info.dwID = data.dwID + end + end + -- 自动拒绝 没拒绝的自动申请装备 + local bAction, szStatus = D.DoAutoAction(info) + if szStatus == 'suspicious' then + info.dwDelayTime = GetTime() + 2000 + D.DelayInterval() + end + if not bAction then + if info.dwID then + D.PeekPlayer(info.dwID) + end + D.CheckRequestUpdate(info) + end +end + +function D.DelayInterval() + local dwTime, dwDelayTime = GetTime(), nil + for _, info in pairs(PR_PARTY_REQUEST) do + if info.dwDelayTime and info.dwDelayTime > dwTime then + dwDelayTime = math.min(dwDelayTime or math.huge, info.dwDelayTime + 75) + end + D.CheckRequestUpdate(info) + end + if dwDelayTime then + X.DelayCall('MY_PartyRequest', dwDelayTime - dwTime, D.DelayInterval) + end +end + +function D.Feedback(szName, data, bDetail) + local info = PR_PARTY_REQUEST[szName] + if info then + info.bDetail = bDetail + info.dwID = data[2] + info.dwKungfuID = data[3] + info.nGongZhan = data[4] + info.bEx = data[5] + D.DoAutoAction(info) + end + D.DelayInterval() +end + +X.RegisterEvent('PEEK_OTHER_PLAYER', 'MY_PartyRequest' , D.OnPeekPlayer ) +X.RegisterEvent('PARTY_INVITE_REQUEST', 'MY_PartyRequest', D.OnApplyRequest) +X.RegisterEvent('PARTY_APPLY_REQUEST', 'MY_PartyRequest' , D.OnApplyRequest) +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_PartyRequest' , D.OnMessageBoxOpen) + +X.RegisterInit('MY_PartyRequest', function() + for _, k in ipairs({'tAcceptCustom'}) do + if D[k] then + X.SafeCall(X.Set, O, k, D[k]) + D[k] = nil + end + end +end) + +X.RegisterBgMsg('RL', function(_, data, nChannel, dwID, szName, bIsSelf) + if not bIsSelf then + if data[1] == 'Feedback' then + D.Feedback(szName, data, true) + end + end +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 120, + text = _L['MY_PartyRequest'], + menu = D.GetMenu, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_PartyRequest', + exports = { + { + fields = { + 'tAcceptCustom', + 'OnPanelActivePartial', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'tAcceptCustom', + }, + root = D, + }, + }, +} +MY_PartyRequest = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 注册邀请 +-------------------------------------------------------------------------------- +local R = { + szIconUITex = 'ui\\Image\\button\\SystemButton.UITex', + nIconFrame = 8, +} + +function R.Drawer(container, info) + local wnd = container:AppendContentFromIni(PR_INI_PATH, 'Wnd_PartyRequest') + wnd.info = info + wnd.OnMouseEnter = D.OnMouseEnter + wnd.OnMouseLeave = D.OnMouseLeave + wnd.OnLButtonClick = D.OnLButtonClick + wnd.OnRButtonClick = D.OnRButtonClick + + local hItem = wnd:Lookup('', '') + if info.dwKungfuID then + hItem:Lookup('Image_Icon'):FromIconID(Table_GetSkillIconID(info.dwKungfuID, 1)) + else + hItem:Lookup('Image_Icon'):FromUITex(GetForceImage(info.dwForce)) + end + hItem:Lookup('Handle_Status/Handle_Gongzhan'):SetVisible(info.nGongZhan == 1) + + local szCampImg, nCampFrame = X.GetCampImage(info.nCamp) + if szCampImg then + hItem:Lookup('Handle_Status/Handle_Camp/Image_Camp'):FromUITex(szCampImg, nCampFrame) + end + hItem:Lookup('Handle_Status/Handle_Camp'):SetVisible(not not szCampImg) + + hItem:Lookup('Handle_Status/Handle_Mobile'):SetVisible(X.IsMobileClient(info.nClientVersionType)) + + hItem:Lookup('Handle_Status'):FormatAllItemPos() + + if info.bDetail and info.bEx == 'Author' then + hItem:Lookup('Text_Name'):SetFontColor(255, 255, 0) + end + hItem:Lookup('Text_Name'):SetText(info.szName) + hItem:Lookup('Text_Level'):SetText(info.nLevel) + + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Accept', + x = 240, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_ACCEPT, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Refuse', + x = 305, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_REFUSE, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Lookup', + x = 370, y = 9, w = 82, h = 34, + buttonStyle = 'FLAT', + text = info.dwID and g_tStrings.STR_LOOKUP or _L['Ask details'], + onHover = function(bIn) + if bIn then + D.OnMouseEnter() + else + D.OnMouseLeave() + end + end, + onClick = D.OnLButtonClick, + }) + + return wnd +end + +function R.GetTip(info) + if info.szType == 'invite' then + return GetFormatText(_L['Party invite request.']) + end + return GetFormatText(_L['Party apply request.']) +end + +function R.GetMenu() + return D.GetMenu() +end + +function R.OnClear() + PR_PARTY_REQUEST = {} +end + +X.UI.RegisterRequest('MY_PartyRequest', R) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_RideRequest.lua b/MY_TeamTools/src/MY_RideRequest.lua new file mode 100644 index 000000000..d4ee89594 --- /dev/null +++ b/MY_TeamTools/src/MY_RideRequest.lua @@ -0,0 +1,489 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 双骑助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_RideRequest' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_RideRequest.ini' +local O = X.CreateUserSettingsModule('MY_RideRequest', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bRefuseOthers = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto refuse others'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bRefuseUnknown = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto refuse unknown'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptTong = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept tong member'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptParty = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept party'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptFriend = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept friend'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptAll = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept all'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept specific names'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RideRequest'], + _L['Auto accept specific names list'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, +}) +local D = {} +RegisterCustomData('MY_RideRequest.tAcceptCustom') + +local RIDE_MSG = {} +local RIDE_LIST = {} + +do + local function CaptureRideMsgTpl(v) + if X.IsTable(v) then + for _, vv in pairs(v) do + CaptureRideMsgTpl(vv) + end + elseif X.IsString(v) then + table.insert(RIDE_MSG, (v:gsub('', '^(.-)'))) + end + end + CaptureRideMsgTpl(g_tStrings.tInviteType) +end + +function D.GetMenu() + local menu = { + szOption = _L['MY_RideRequest'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = O.bEnable, + fnAction = function() + O.bEnable = not O.bEnable + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Auto accept party'], + bCheck = true, bChecked = O.bAcceptParty, + fnAction = function() + O.bAcceptParty = not O.bAcceptParty + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept friend'], + bCheck = true, bChecked = O.bAcceptFriend, + fnAction = function() + O.bAcceptFriend = not O.bAcceptFriend + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept tong member'], + bCheck = true, bChecked = O.bAcceptTong, + fnAction = function() + O.bAcceptTong = not O.bAcceptTong + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept all'], + bCheck = true, bChecked = O.bAcceptAll, + fnAction = function() + O.bAcceptAll = not O.bAcceptAll + end, + fnDisable = function() return not O.bEnable end, + }, + } + local t = { + szOption = _L['Auto accept specific names'], + bCheck = true, bChecked = O.bAcceptCustom, + fnAction = function() + O.bAcceptCustom = not O.bAcceptCustom + end, + fnDisable = function() return not O.bEnable end, + } + for szName, bEnable in pairs(O.tAcceptCustom) do + table.insert(t, { + szOption = szName, + bCheck = true, bChecked = bEnable, + fnAction = function() + O.tAcceptCustom[szName] = not O.tAcceptCustom[szName] + O.tAcceptCustom = O.tAcceptCustom + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tAcceptCustom[szName] = nil + O.tAcceptCustom = O.tAcceptCustom + X.UI.ClosePopupMenu() + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + end + if #t ~= 0 then + table.insert(t, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t, { + szOption = _L['Add'], + fnAction = function() + GetUserInput(_L['Please input custom name, multiple split with ",[]":'], function(val) + for _, v in ipairs(X.SplitString(val, {',', '[', ']'}, true)) do + O.tAcceptCustom[v] = true + O.tAcceptCustom = O.tAcceptCustom + end + end) + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + table.insert(menu, t) + table.insert(menu, { + szOption = _L['Auto refuse others'], + bCheck = true, bChecked = O.bRefuseOthers, + fnAction = function() + O.bRefuseOthers = not O.bRefuseOthers + end, + fnDisable = function() return not O.bEnable end, + }) + table.insert(menu, { + szOption = _L['Auto refuse unknown'], + bCheck = true, bChecked = O.bRefuseUnknown, + fnAction = function() + O.bRefuseUnknown = not O.bRefuseUnknown + end, + fnDisable = function() return not O.bEnable end, + }) + return menu +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Accept' then + D.AcceptRequest(this:GetParent().info) + elseif name == 'Btn_Refuse' then + D.RefuseRequest(this:GetParent().info) + end +end + +function D.OnRButtonClick() + if this.info then + PopupMenu(X.InsertPlayerContextMenu({}, this.info.szName, this.info.dwID)) + end +end + +function D.OnMouseEnter() + if this.info then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = GetFormatText(this.info.szDesc) + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end +end + +function D.OnMouseLeave() + if this.info then + HideTip() + end +end + +function D.AcceptRequest(info) + RIDE_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_RideRequest', info.szName) + info.fnAccept() +end + +function D.RefuseRequest(info) + RIDE_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_RideRequest', info.szName) + info.fnRefuse() +end + +function D.GetRequestStatus(info) + local szStatus, szMsg = 'normal' + if O.bAcceptAll then + szStatus = 'accept' + szMsg = _L('Auto accept %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif O.bAcceptCustom and O.tAcceptCustom[info.szName] then + szStatus = 'accept' + szMsg = _L('Auto accept %s custom ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif info.bParty and O.bAcceptParty then + szStatus = 'accept' + szMsg = _L('Auto accept party %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif info.bFriend and O.bAcceptFriend then + szStatus = 'accept' + szMsg = _L('Auto accept friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif info.bTongMember and O.bAcceptTong then + szStatus = 'accept' + szMsg = _L('Auto tong member friend %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif O.bRefuseOthers then + szStatus = 'refuse' + szMsg = _L('Auto refuse %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + elseif O.bRefuseUnknown and not info.bFriend and not info.bTongMember then + szStatus = 'refuse' + szMsg = _L('Auto refuse %s ride request, go to MY/raid/teamtools panel if you want to turn off this feature.', info.szName) + end + return szStatus, szMsg +end + +function D.DoAutoAction(info) + local bAction = false + local szStatus, szMsg = D.GetRequestStatus(info) + if szStatus == 'refuse' then + bAction = true + D.RefuseRequest(info) + elseif szStatus == 'accept' then + bAction = true + D.AcceptRequest(info) + end + if szMsg then + X.OutputSystemMessage(szMsg) + end + return bAction, szStatus, szMsg +end + +function D.OnMessageBoxOpen() + local szMsgName, frame = arg0, arg1 + if not O.bEnable or not frame or not frame:IsValid() then + return + end + if szMsgName == 'OnInviteFollow' then + local hContent = X.GetMessageBoxContentHandle(frame) + local txt = hContent and hContent:Lookup(0) + local szMsg, bRide, szName = txt and txt:GetType() == 'Text' and txt:GetText() + for _, szMsgTpl in ipairs(RIDE_MSG) do + szName = szMsg:match(szMsgTpl) + if szName then + bRide = true + break + end + end + if bRide then + local fnAccept = X.GetMessageBoxButtonAction(frame, 1) + local fnRefuse = X.GetMessageBoxButtonAction(frame, 2) + if fnAccept and fnRefuse then + local info = RIDE_LIST[szName] + if not info then + info = {} + RIDE_LIST[szName] = info + end + info.szName = szName + info.szDesc = szMsg + info.bParty = X.IsTeammate(szName) + info.bFriend = X.IsFellowship(szName) + info.bTongMember = X.IsTongMember(szName) + info.fnAccept = function() + RIDE_LIST[szName] = nil + X.Call(fnAccept) + end + info.fnRefuse = function() + RIDE_LIST[szName] = nil + X.Call(fnRefuse) + end + -- 获取dwID + local tar = X.GetTargetHandle(TARGET.PLAYER, szName) + if not info.dwID and tar then + info.dwID = tar.dwID + end + if not info.dwID and MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(szName) + if data then + info.dwID = data.dwID + end + end + if not D.DoAutoAction(info) then + X.UI.ReplaceRequest('MY_RideRequest', info.szName, info) + end + -- 关闭对话框 + frame.fnAutoClose = nil + frame.fnCancelAction = nil + frame.szCloseSound = nil + X.UI.CloseFrame(frame) + end + end + end +end + +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_RideRequest' , D.OnMessageBoxOpen) + +X.RegisterInit('MY_RideRequest', function() + for _, k in ipairs({'tAcceptCustom'}) do + if D[k] then + X.SafeCall(X.Set, O, k, D[k]) + D[k] = nil + end + end +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 120, + text = _L['MY_RideRequest'], + menu = D.GetMenu, + tip = { + render = _L['Optimize ride and emotion request'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RideRequest', + exports = { + { + fields = { + 'tAcceptCustom', + 'OnPanelActivePartial', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'tAcceptCustom', + }, + root = D, + }, + }, +} +MY_RideRequest = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 注册邀请 +-------------------------------------------------------------------------------- +local R = { + szIconUITex = 'FromIconID', + nIconFrame = 3554, +} + +function R.Drawer(container, info) + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_RideRequest') + wnd.info = info + wnd.OnMouseEnter = D.OnMouseEnter + wnd.OnMouseLeave = D.OnMouseLeave + wnd:Lookup('', 'Text_Name'):SetText(info.szName) + + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Accept', + x = 326, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_ACCEPT, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Refuse', + x = 393, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_REFUSE, + onClick = D.OnLButtonClick, + }) + + return wnd +end + +function R.GetTip(info) + return GetFormatText(info.szDesc) +end + +function R.GetMenu() + return D.GetMenu() +end + +function R.OnClear() + RIDE_LIST = {} +end + +X.UI.RegisterRequest('MY_RideRequest', R) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_RoomRequest.lua b/MY_TeamTools/src/MY_RoomRequest.lua new file mode 100644 index 000000000..b14e98787 --- /dev/null +++ b/MY_TeamTools/src/MY_RoomRequest.lua @@ -0,0 +1,615 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 房间助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_RoomRequest' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local PR_INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_RoomRequest.ini' +local PR_ROOM_REQUEST = {} + +local O = X.CreateUserSettingsModule('MY_RoomRequest', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptTeam = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept team member'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptTong = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept tong member'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptCamp = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept same camp'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptFriend = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept friend'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptAll = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept all'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept specific names'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tAcceptCustom = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_RoomRequest'], + _L['Auto accept specific names list'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = {}, + }, +}) + +function D.GetMenu() + local menu = { + szOption = _L['MY_RoomRequest'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = O.bEnable, + fnAction = function() + O.bEnable = not O.bEnable + end, + }, + X.CONSTANT.MENU_DIVIDER, + { + szOption = _L['Auto accept friend'], + bCheck = true, bChecked = O.bAcceptFriend, + fnAction = function() + O.bAcceptFriend = not O.bAcceptFriend + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept team member'], + bCheck = true, bChecked = O.bAcceptTeam, + fnAction = function() + O.bAcceptTeam = not O.bAcceptTeam + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept tong member'], + bCheck = true, bChecked = O.bAcceptTong, + fnAction = function() + O.bAcceptTong = not O.bAcceptTong + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept same camp'], + bCheck = true, bChecked = O.bAcceptCamp, + fnAction = function() + O.bAcceptCamp = not O.bAcceptCamp + end, + fnDisable = function() return not O.bEnable end, + }, + { + szOption = _L['Auto accept all'], + bCheck = true, bChecked = O.bAcceptAll, + fnAction = function() + O.bAcceptAll = not O.bAcceptAll + end, + fnDisable = function() return not O.bEnable end, + }, + } + local t = { + szOption = _L['Auto accept specific names'], + bCheck = true, bChecked = O.bAcceptCustom, + fnAction = function() + O.bAcceptCustom = not O.bAcceptCustom + end, + fnDisable = function() return not O.bEnable end, + } + for szGlobalName, bEnable in pairs(O.tAcceptCustom) do + table.insert(t, { + szOption = szGlobalName, + bCheck = true, bChecked = bEnable, + fnAction = function() + O.tAcceptCustom[szGlobalName] = not O.tAcceptCustom[szGlobalName] + O.tAcceptCustom = O.tAcceptCustom + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tAcceptCustom[szGlobalName] = nil + O.tAcceptCustom = O.tAcceptCustom + X.UI.ClosePopupMenu() + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + end + if #t ~= 0 then + table.insert(t, X.CONSTANT.MENU_DIVIDER) + end + table.insert(t, { + szOption = _L['Add'], + fnAction = function() + GetUserInput(_L['Please input custom name, multiple split with ",[]":'], function(val) + for _, v in ipairs(X.SplitString(val, {',', '[', ']'}, true)) do + O.tAcceptCustom[v] = true + O.tAcceptCustom = O.tAcceptCustom + end + end) + end, + fnDisable = function() return not O.bEnable or not O.bAcceptCustom end, + }) + table.insert(menu, t) + return menu +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Accept' then + D.AcceptRequest(this:GetParent().info) + elseif name == 'Btn_Refuse' then + D.RefuseRequest(this:GetParent().info) + elseif name == 'Btn_Lookup' then + local info = this:GetParent().info + if not info.bDetail and IsCtrlKeyDown() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(info.szGlobalName, 'RL', {'ASK'}) + this:Enable(false) + this:Lookup('', 'Text_Default'):SetText(_L['loading...']) + X.OutputSystemMessage(_L['If it is always loading, the target may not install plugin or refuse.']) + elseif info.szGlobalID then + X.ViewOtherPlayerByGlobalID(info.dwServerID, info.szGlobalID) + end + elseif this.info then + local info = this.info + if IsCtrlKeyDown() then + X.EditBox_AppendLinkPlayer(info.szGlobalName) + elseif IsAltKeyDown() then + X.ViewOtherPlayerByGlobalID(info.dwServerID, info.szGlobalID) + end + end +end + +function D.OnMouseEnter() + local name = this:GetName() + if name == 'Btn_Lookup' then + local info = this:GetParent().info + if not info.bDetail then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = GetFormatText(_L['Press ctrl and click to ask detail.']) + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end + elseif this.info then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = MY_Farbnamen and MY_Farbnamen.GetTip(this.info.szGlobalID) + if szTip then + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end + end +end + +function D.OnMouseLeave() + if this.info then + HideTip() + end +end + +function D.GetFrame() + return Station.Lookup('Normal2/MY_RoomRequest') +end + +function D.OpenPanel() + if D.GetFrame() then + return + end + X.UI.OpenFrame(PR_INI_PATH, 'MY_RoomRequest') +end + +-- 判断是否需要更新界面 +function D.CheckRequestUpdate(info) + if not info.szGlobalName or not info.fnAccept or (info.dwDelayTime and info.dwDelayTime > GetTime()) then + X.UI.RemoveRequest('MY_RoomRequest', info.szGlobalID) + else + X.UI.ReplaceRequest('MY_RoomRequest', info.szGlobalID, info) + end +end + +function D.OnPeekPlayer(szGlobalID, eState, kPlayer) + if kPlayer and eState == X.CONSTANT.PEEK_OTHER_PLAYER_RESPOND.SUCCESS then + local me = X.GetClientPlayer() + local dwType, dwID = me.GetTarget() + X.SetClientPlayerTarget(TARGET.PLAYER, kPlayer.dwID) + X.SetClientPlayerTarget(dwType, dwID) + local mnt = kPlayer.GetKungfuMount() + local data = { nil, kPlayer.dwID, mnt and mnt.dwSkillID or nil, false } + D.Feedback(kPlayer.szName, data, false) + end +end + +function D.PeekPlayer(szGlobalID, dwServerID) + X.PeekOtherPlayerByGlobalID(dwServerID, szGlobalID, D.OnPeekPlayer) +end + +function D.AcceptRequest(info) + PR_ROOM_REQUEST[info.szGlobalID] = nil + X.UI.RemoveRequest('MY_RoomRequest', info.szGlobalID) + info.fnAccept() +end + +function D.RefuseRequest(info) + PR_ROOM_REQUEST[info.szGlobalID] = nil + X.UI.RemoveRequest('MY_RoomRequest', info.szGlobalID) + info.fnRefuse() +end + +function D.GetRequestStatus(info) + local szStatus, szMsg = 'normal' + if O.bAcceptAll then + szStatus = 'accept' + szMsg = _L('Auto accept %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif O.bAcceptCustom and O.tAcceptCustom[info.szGlobalName] then + szStatus = 'accept' + szMsg = _L('Auto accept %s(%s %d%s) custom room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bFriend and O.bAcceptFriend then + szStatus = 'accept' + szMsg = _L('Auto accept friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bTeamMember and O.bAcceptTeam then + szStatus = 'accept' + szMsg = _L('Auto tong member friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bTongMember and O.bAcceptTong then + szStatus = 'accept' + szMsg = _L('Auto tong member friend %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + elseif info.bSameCamp and O.bAcceptCamp then + szStatus = 'accept' + szMsg = _L('Auto camp %s(%s %d%s) room request, go to MY/raid/teamtools panel if you want to turn off this feature.', + info.szGlobalName, g_tStrings.tForceTitle[info.dwForce], info.nLevel, g_tStrings.STR_LEVEL) + end + return szStatus, szMsg +end + +function D.DoAutoAction(info) + local bAction, szStatus, szMsg = false + if info.szGlobalName and info.fnAccept then + szStatus, szMsg = D.GetRequestStatus(info) + if szStatus == 'refuse' then + bAction = true + D.RefuseRequest(info) + elseif szStatus == 'accept' then + bAction = true + D.AcceptRequest(info) + end + if szMsg then + X.OutputSystemMessage(szMsg) + end + end + return bAction, szStatus, szMsg +end + +function D.OnMessageBoxOpen() + local szMsgName, frame = arg0, arg1 + local szPrefix, szGlobalID = unpack(X.SplitString(szMsgName, '_', true, 2)) + if not O.bEnable or not frame or not frame:IsValid() or (szPrefix ~= 'RMIV' and szPrefix ~= 'RMAP') then + return + end + local fnAccept = X.GetMessageBoxButtonAction(frame, 1) + local fnRefuse = X.GetMessageBoxButtonAction(frame, 2) + if fnAccept and fnRefuse then + -- 获取组队方法 + local info = PR_ROOM_REQUEST[szGlobalID] + if not info then + info = {} + PR_ROOM_REQUEST[szGlobalID] = info + end + info.fnAccept = function() + PR_ROOM_REQUEST[szGlobalID] = nil + X.Call(fnAccept) + end + info.fnRefuse = function() + PR_ROOM_REQUEST[szGlobalID] = nil + X.Call(fnRefuse) + end + D.DoAutoAction(info) + -- 关闭对话框 + frame.fnAutoClose = nil + frame.fnCancelAction = nil + frame.szCloseSound = nil + X.UI.CloseFrame(frame) + end +end + +function D.OnApplyRequest(event) + if not O.bEnable then + return + end + local eType = arg0 + local szName = arg1 + local szGlobalID = arg2 + local dwServerID = arg4 + local tPlayer = MY_Farbnamen and MY_Farbnamen.Get and MY_Farbnamen.Get(szGlobalID) + local info = PR_ROOM_REQUEST[szGlobalID] + if not info then + info = {} + PR_ROOM_REQUEST[szGlobalID] = info + end + local me = X.GetClientPlayerInfo() + local szServerName = X.GetServerNameByID(dwServerID) + -- 判断对方是否已在进组列表中 + local bTeamMember = false + for _, dwID in ipairs(X.GetTeamMemberList()) do + local tMember = X.GetTeamMemberInfo(dwID) + if tMember and tMember.szGlobalID == szGlobalID then + bTeamMember = true + break + end + end + info.szType = eType == GLOBAL_ROOM_JOIN_TYPE.INVITE and 'invite' or 'request' + info.szGlobalID = szGlobalID + info.dwServerID = dwServerID + info.szName = szName + info.szGlobalName = X.AssemblePlayerGlobalName(szName, szServerName) + info.nCamp = tPlayer and tPlayer.nCamp or -1 + info.dwForce = tPlayer and tPlayer.dwForceID or -1 + info.nLevel = tPlayer and tPlayer.nLevel or -1 + info.bFriend = X.IsFellowship(info.szGlobalName) + info.bTeamMember = bTeamMember + info.bTongMember = szServerName == X.GetServerOriginName() and X.IsTongMember(szName) + info.bSameCamp = info.nCamp == me.nCamp + info.dwDelayTime = nil + -- 自动拒绝 没拒绝的自动申请装备 + local bAction, szStatus = D.DoAutoAction(info) + if szStatus == 'suspicious' then + info.dwDelayTime = GetTime() + 2000 + D.DelayInterval() + end + if not bAction then + D.PeekPlayer(info.szGlobalID, info.dwServerID) + D.CheckRequestUpdate(info) + end +end + +function D.DelayInterval() + local dwTime, dwDelayTime = GetTime(), nil + for _, info in pairs(PR_ROOM_REQUEST) do + if info.dwDelayTime and info.dwDelayTime > dwTime then + dwDelayTime = math.min(dwDelayTime or math.huge, info.dwDelayTime + 75) + end + D.CheckRequestUpdate(info) + end + if dwDelayTime then + X.DelayCall('MY_RoomRequest', dwDelayTime - dwTime, D.DelayInterval) + end +end + +function D.Feedback(szName, data, bDetail) + local tPlayer = MY_Farbnamen and MY_Farbnamen.Get and MY_Farbnamen.Get(szName) + local info = tPlayer and tPlayer.szGlobalID and PR_ROOM_REQUEST[tPlayer.szGlobalID] + if info then + info.bDetail = bDetail + info.dwID = data[2] + info.dwKungfuID = data[3] + info.nGongZhan = data[4] + info.bEx = data[5] + D.DoAutoAction(info) + end + D.DelayInterval() +end + +X.RegisterEvent('PEEK_OTHER_PLAYER', 'MY_RoomRequest' , D.OnPeekPlayer ) +X.RegisterEvent('GLOBAL_ROOM_JOIN_REQUEST', 'MY_RoomRequest', D.OnApplyRequest) +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_RoomRequest' , D.OnMessageBoxOpen) + +X.RegisterInit('MY_RoomRequest', function() + for _, k in ipairs({'tAcceptCustom'}) do + if D[k] then + X.SafeCall(X.Set, O, k, D[k]) + D[k] = nil + end + end +end) + +X.RegisterBgMsg('RL', function(_, data, nChannel, dwID, szName, bIsSelf) + if not bIsSelf then + if data[1] == 'Feedback' then + D.Feedback(szName, data, true) + end + end +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 120, + text = _L['MY_RoomRequest'], + menu = D.GetMenu, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RoomRequest', + exports = { + { + fields = { + 'tAcceptCustom', + 'OnPanelActivePartial', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'tAcceptCustom', + }, + root = D, + }, + }, +} +MY_RoomRequest = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 注册邀请 +-------------------------------------------------------------------------------- +local R = { + szIconUITex = 'ui\\Image\\button\\SystemButton.UITex', + nIconFrame = 20, +} + +function R.Drawer(container, info) + local wnd = container:AppendContentFromIni(PR_INI_PATH, 'Wnd_RoomRequest') + wnd.info = info + wnd.OnMouseEnter = D.OnMouseEnter + wnd.OnMouseLeave = D.OnMouseLeave + wnd.OnLButtonClick = D.OnLButtonClick + wnd.OnRButtonClick = D.OnRButtonClick + + local hItem = wnd:Lookup('', '') + if info.dwKungfuID then + hItem:Lookup('Image_Icon'):FromIconID(Table_GetSkillIconID(info.dwKungfuID, 1)) + else + hItem:Lookup('Image_Icon'):FromUITex(GetForceImage(info.dwForce)) + end + hItem:Lookup('Handle_Status/Handle_Gongzhan'):SetVisible(info.nGongZhan == 1) + + local szCampImg, nCampFrame = X.GetCampImage(info.nCamp) + if szCampImg then + hItem:Lookup('Handle_Status/Handle_Camp/Image_Camp'):FromUITex(szCampImg, nCampFrame) + end + hItem:Lookup('Handle_Status/Handle_Camp'):SetVisible(not not szCampImg) + + hItem:Lookup('Handle_Status'):FormatAllItemPos() + + if info.bDetail and info.bEx == 'Author' then + hItem:Lookup('Text_Name'):SetFontColor(255, 255, 0) + end + hItem:Lookup('Text_Name'):SetText(info.szGlobalName) + hItem:Lookup('Text_Level'):SetText(info.nLevel) + + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Accept', + x = 240, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_ACCEPT, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Refuse', + x = 305, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_REFUSE, + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Lookup', + x = 370, y = 9, w = 82, h = 34, + buttonStyle = 'FLAT', + text = g_tStrings.STR_LOOKUP, + onHover = function(bIn) + if bIn then + D.OnMouseEnter() + else + D.OnMouseLeave() + end + end, + onClick = D.OnLButtonClick, + }) + + return wnd +end + +function R.GetTip(info) + if info.szType == 'invite' then + return GetFormatText(_L['Room invite request.']) + end + return GetFormatText(_L['Room apply request.']) +end + +function R.GetMenu() + return D.GetMenu() +end + +function R.OnClear() + PR_ROOM_REQUEST = {} +end + +X.UI.RegisterRequest('MY_RoomRequest', R) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_SocialRequest.lua b/MY_TeamTools/src/MY_SocialRequest.lua new file mode 100644 index 000000000..fd9e5d0b5 --- /dev/null +++ b/MY_TeamTools/src/MY_SocialRequest.lua @@ -0,0 +1,265 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 好友助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_SocialRequest' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_SocialRequest.ini' +local O = X.CreateUserSettingsModule('MY_SocialRequest', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_SocialRequest'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +local REQUEST_MSG = {} +local REQUEST_LIST = {} + +for k, v in pairs({ + ['ADD_FRIEND_FELLOWSHIP'] = g_tStrings.STR_FRIEND_NEED_ADD_FRIEND_FELLOWSHIP, + ['ADD_FRIEND' ] = g_tStrings.STR_FRIEND_NEED_ADD_FRIEND, +}) do + REQUEST_MSG[k] = v:gsub('', '^(.-)') +end + +function D.GetMenu() + local menu = { + szOption = _L['MY_SocialRequest'], + { + szOption = _L['Enable'], + bCheck = true, bChecked = MY_SocialRequest.bEnable, + fnAction = function() + MY_SocialRequest.bEnable = not MY_SocialRequest.bEnable + end, + }, + } + return menu +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Accept' then + D.AcceptRequest(this:GetParent().info) + elseif name == 'Btn_Refuse' then + D.RefuseRequest(this:GetParent().info) + end +end + +function D.OnRButtonClick() + if this.info then + PopupMenu(X.InsertPlayerContextMenu({}, this.info.szName, this.info.dwID)) + end +end + +function D.OnMouseEnter() + if this.info then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local szTip = GetFormatText(this.info.szDesc) + OutputTip(szTip, 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) + end +end + +function D.OnMouseLeave() + if this.info then + HideTip() + end +end + +function D.AcceptRequest(info) + REQUEST_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_SocialRequest', info.szName) + info.fnAccept() +end + +function D.RefuseRequest(info) + REQUEST_LIST[info.szName] = nil + X.UI.RemoveRequest('MY_SocialRequest', info.szName) + info.fnRefuse() +end + +function D.OnMessageBoxOpen() + local szMsgName, frame = arg0, arg1 + if not O.bEnable or not frame or not frame:IsValid() then + return + end + if szMsgName == 'NeedAddFriend' then + local hContent = X.GetMessageBoxContentHandle(frame) + local txt = hContent and hContent:Lookup(0) + local szMsg, szType, szName = txt and txt:GetType() == 'Text' and txt:GetText() + for k, szMsgTpl in pairs(REQUEST_MSG) do + szName = szMsg:match(szMsgTpl) + if szName then + szType = k + break + end + end + if szType then + local fnAccept = X.GetMessageBoxButtonAction(frame, 1) + local fnRefuse = X.GetMessageBoxButtonAction(frame, 2) + if fnAccept and fnRefuse then + local info = REQUEST_LIST[szName] + if not info then + info = {} + REQUEST_LIST[szName] = info + end + info.szType = szType + info.szName = szName + info.szDesc = szMsg + info.fnAccept = function() + REQUEST_LIST[szName] = nil + X.Call(fnAccept) + end + info.fnRefuse = function() + REQUEST_LIST[szName] = nil + X.Call(fnRefuse) + end + -- 获取dwID + local tar + for _, p in ipairs(X.GetNearPlayer()) do + if p.szName == szName then + tar = p + break + end + end + if not info.dwID and tar then + info.dwID = tar.dwID + end + if not info.dwID and MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(szName) + if data then + info.dwID = data.dwID + end + end + X.UI.ReplaceRequest('MY_SocialRequest', info.szName, info) + -- 关闭对话框 + frame.fnAutoClose = nil + frame.fnCancelAction = nil + frame.szCloseSound = nil + X.UI.CloseFrame(frame) + end + end + end +end + +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_SocialRequest' , D.OnMessageBoxOpen) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 120, + text = _L['MY_SocialRequest'], + menu = D.GetMenu, + tip = { + render = _L['Optimize social friend request'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + + nX = nPaddingX + nY = nY + 20 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_SocialRequest', + exports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_SocialRequest = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 注册邀请 +-------------------------------------------------------------------------------- +local R = { + szIconUITex = 'FromIconID', + nIconFrame = 2118, +} + +function R.Drawer(container, info) + local wnd = container:AppendContentFromIni(INI_PATH, 'Wnd_Request') + wnd.info = info + wnd.OnMouseEnter = D.OnMouseEnter + wnd.OnMouseLeave = D.OnMouseLeave + wnd:Lookup('', 'Text_Name'):SetText(info.szName) + + local ui = X.UI(wnd) + ui:Append('WndButton', { + name = 'Btn_Accept', + x = 326, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = _L['Add'], + onClick = D.OnLButtonClick, + }) + ui:Append('WndButton', { + name = 'Btn_Refuse', + x = 393, y = 9, w = 60, h = 34, + buttonStyle = 'FLAT', + text = _L['Ignore'], + onClick = D.OnLButtonClick, + }) + + return wnd +end + +function R.GetTip(info) + return GetFormatText(info.szDesc) +end + +function R.GetMenu() + return D.GetMenu() +end + +function R.OnClear() + REQUEST_LIST = {} +end + +X.UI.RegisterRequest('MY_SocialRequest', R) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamAD.lua b/MY_TeamTools/src/MY_TeamAD.lua new file mode 100644 index 000000000..a00b584b7 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamAD.lua @@ -0,0 +1,127 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 保存喊话 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamAD' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamAD' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} +local O = { + szDataFile = {'userdata/team_advertising.jx3dat', X.PATH_TYPE.GLOBAL}, + tItem = { + { dwTabType = 5, dwIndex = 24430, nUiId = 153192 }, + { dwTabType = 5, dwIndex = 23988, nUiId = 152748 }, + { dwTabType = 5, dwIndex = 23841, nUiId = 152596 }, + { dwTabType = 5, dwIndex = 22939, nUiId = 151677 }, + { dwTabType = 5, dwIndex = 23759, nUiId = 152512 }, + { dwTabType = 5, dwIndex = 22084, nUiId = 150827 }, + { dwTabType = 5, dwIndex = 22085, nUiId = 150828 }, + { dwTabType = 5, dwIndex = 22086, nUiId = 150829 }, + { dwTabType = 5, dwIndex = 22087, nUiId = 150830 }, + { dwTabType = 5, dwIndex = 25831, nUiId = 153898 }, + { dwTabType = 5, dwIndex = 33450, nUiId = 162223 }, + } +} + +function D.LoadLUAData() + O.tADList = X.LoadLUAData(O.szDataFile, { passphrase = false, crc = false }) or {} +end + +function D.SaveLUAData() + X.SaveLUAData(O.szDataFile, O.tADList, { encoder = 'luatext', indent = '\t', passphrase = false, crc = false }) +end + +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 20 + local nW, nH = ui:Size() + local nX, nY = nPaddingX, nPaddingY + D.LoadLUAData() + + nX = nPaddingX + nX, nY = ui:Append('Text', { x = nX, y = nY, text = _L['Save Talk'], font = 27 }):Pos('BOTTOMRIGHT') + + nX = nPaddingX + 10 + nX = ui:Append('WndButton', { x = nX, y = nY + 10, text = _L['Save Advertising'], buttonStyle = 'FLAT' }):Click(function(bChecked) + local edit = X.GetChatInput() + local txt, data = edit:GetText(), edit:GetTextStruct() + if X.TrimString(txt) == '' then + X.Alert(_L['Chat box is empty']) + else + GetUserInput(_L['Save Advertising Name'],function(text) + table.insert(O.tADList, { key = text, text = txt, ad = data }) + D.SaveLUAData() + X.Panel.SwitchTab('MY_TeamAD', true) + end, nil, nil, nil, nil, 5) + end + end):Pos('BOTTOMRIGHT') + nX, nY = ui:Append('Text', { x = nX + 5, y = nY + 10, text = _L['Advertising Tips'] }):Pos('BOTTOMRIGHT') + + nX = nPaddingX + nX, nY = ui:Append('Text', { x = nX, y = nY + 5, text = _L['Gadgets'], font = 27 }):Pos('BOTTOMRIGHT') + for k, v in ipairs(O.tItem) do + if GetItemInfo(v.dwTabType, v.dwIndex) then + nX = ui:Append('Box', { x = (k - 1) * 48 + nPaddingX + 10, y = nY + 10, w = 38, h = 38 }):ItemInfo(X.ENVIRONMENT.CURRENT_ITEM_VERSION, v.dwTabType, v.dwIndex):Pos('BOTTOMRIGHT') + end + end + + nX = nPaddingX + nY = nY + 58 + nX, nY = ui:Append('Text', { x = nX, y = nY, text = _L['Advertising List'], font = 27 }):Pos('BOTTOMRIGHT') + + nX = nPaddingX + 10 + nY = nY + 10 + for k, v in ipairs(O.tADList) do + if nX + 80 > nW then + nX = nPaddingX + 10 + nY = nY + 28 + end + nX = ui:Append('WndButton', { + x = nX, y = nY, w = 80, text = v.key, + buttonStyle = 'FLAT', + onLClick = function() + X.SetChatInput(v.ad) + X.FocusChatInput() + end, + menuRClick = function() + local menu = {{ + szOption = _L['Delete'], + fnAction = function() + table.remove(O.tADList, k) + D.SaveLUAData() + X.Panel.SwitchTab('MY_TeamAD', true) + end, + }} + return menu + end, + onHover = function(bIn) + if bIn then + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(GetFormatText(v.text), 550, { x, y, w, h }) + else + HideTip() + end + end, + }):Pos('BOTTOMRIGHT') + 10 + end +end +X.Panel.Register(_L['Raid'], 'MY_TeamAD', _L['MY_TeamAD'], 5958, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamCountdown.lua b/MY_TeamTools/src/MY_TeamCountdown.lua new file mode 100644 index 000000000..6312c78d2 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamCountdown.lua @@ -0,0 +1,141 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队倒计时 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamCountdown' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamCountdown' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_TeamCountdown', _L['Raid'], { + nCountdown = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamCountdown'], + _L['Team countdown seconds'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 5, + }, +}) +local D = {} + +function D.Open() + if not X.IsClientPlayerTeamLeader() then + X.OutputAnnounceMessage(_L['You are not leader!']) + return + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputAnnounceMessage(_L['Please unlock safety talk lock first!']) + return + end + GetUserInput(_L['Team countdown seconds'], function(text) + local nCountdown = tonumber(text) + if not nCountdown then + X.OutputAnnounceMessage(_L['Invalid countdown time input.']) + return + end + if nCountdown > 10 then + X.OutputAnnounceMessage(_L('Countdown time cannot be more than %ds.', 10)) + return + end + if nCountdown < 1 then + X.OutputAnnounceMessage(_L('Countdown time cannot be less than %ds.', 1)) + return + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TeamCountdown', {nCountdown}, true) + O.nCountdown = nCountdown + end, nil, nil, nil, tostring(O.nCountdown), 50) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nPaddingX + nX, nY = ui:Append('Text', { x = nX, y = nY + 15, text = _L['MY_TeamCountdown'], font = 27 }):Pos('BOTTOMRIGHT') + + nX = nPaddingX + 10 + nY = nY + 5 + nX = ui:Append('WndButton', { + x = nX + 5, y = nY, w = 200, + text = _L['Send team countdown'], + buttonStyle = 'FLAT', + onClick = D.Open, + }):Pos('BOTTOMRIGHT') + nY = nY + 28 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamCountdown', + exports = { + { + fields = { + Open = D.Open, + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_TeamCountdown = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- +X.RegisterBgMsg('MY_TeamCountdown', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + if not X.IsPlayerTeamLeader(dwTalkerID) then + return + end + local nCountdown = data[1] + if X.IsNumber(nCountdown) and nCountdown >= 1 and nCountdown <= 10 then + if X.IsClientPlayerTeamLeader() then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, _L['[TeamCountdown] Fight Countdown Begin!']) + end + X.BreatheCall('MY_TeamCountdown', 1000, function() + local szText = nCountdown == 0 and _L['Fight Begin'] or tostring(nCountdown) + X.UI.CreateFloatText(szText, 1000, { + nFont = 230, + fScale = 10, + nR = 255, + nG = 255, + nB = 0, + szAnimation = 'ZOOM_IN_FADE_IN_OUT', + }) + if X.IsClientPlayerTeamLeader() then + X.SendChat( + PLAYER_TALK_CHANNEL.RAID, + nCountdown == 0 + and _L['[TeamCountdown] Fight Begin!'] + or _L('[TeamCountdown] %ds!', nCountdown) + ) + end + -- 喊话 + if nCountdown <= 0 then + return 0 + end + nCountdown = nCountdown - 1 + end) + end +end) + +X.RegisterHotKey('MY_TeamCountdown', _L['Open MY_TeamCountdown'], D.Open, nil) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamNotice.lua b/MY_TeamTools/src/MY_TeamNotice.lua new file mode 100644 index 000000000..f51739697 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamNotice.lua @@ -0,0 +1,456 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队告示 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamNotice' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = { + szYY = '', + szNote = '', +} + +local O = X.CreateUserSettingsModule('MY_TeamNotice', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamNotice'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nWidth = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamNotice'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 320, + }, + nHeight = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamNotice'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 195, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamNotice'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'CENTER', r = 'CENTER', x = 0, y = 0 }, + }, +}) + +function D.SaveList() + X.SaveLUAData({'config/yy.jx3dat', X.PATH_TYPE.GLOBAL}, D.tList, { encoder = 'luatext', indent = '\t', passphrase = false, crc = false }) +end + +function D.GetList() + if not D.tList then + D.tList = X.LoadLUAData({'config/yy.jx3dat', X.PATH_TYPE.GLOBAL}, { passphrase = false }) or {} + end + return D.tList +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_TeamNotice') +end + +function D.CreateFrame(szInitYY, szInitNote) + if X.IsInZombieMap() then + return + end + if szInitNote then + szInitNote = X.ReplaceSensitiveWord(szInitNote) + end + local ui = D.GetFrame() + if ui then + ui = X.UI(ui) + ui:Children('#YY'):Text(szInitYY, WNDEVENT_FIRETYPE.PREVENT) + ui:Children('#Message'):Text(szInitNote, WNDEVENT_FIRETYPE.PREVENT) + else + local function FormatAllContentPos() + if not ui then + return + end + X.DelayCall('MY_TeamNotice#DragResize', 500, function() + O.nWidth = ui:Width() + O.nHeight = ui:Height() + O.anchor = ui:Anchor() + end) + local nW, nH = ui:ContainerSize() + ui:Fetch('YY'):Width(ui:Width() - 160) + local uiBtn = ui:Fetch('Btn_YY') + uiBtn:Left(nW - uiBtn:Width() - 10) + local uiBtns = ui:Fetch('WndBtn_RaidTools'):Add(ui:Fetch('WndBtn_GKP')):Add(ui:Fetch('WndBtn_TeamMon')) + uiBtns:Top(nH - uiBtns:Height() - 10) + local uiMessage = ui:Fetch('Message') + uiMessage:Size(nW - 20, uiBtns:Top() - uiMessage:Top() - 10) + end + ui = X.UI.CreateFrame('MY_TeamNotice', { + w = O.nWidth, h = O.nHeight, + text = _L['Team Message'], + anchor = O.anchor, + theme = X.UI.FRAME_THEME.SIMPLE, close = true, resize = true, + minWidth = 320, minHeight = 195, + setting = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_TeamTools') + end, + onSizeChange = FormatAllContentPos, + }) + local x, y = 10, 5 + x = x + ui:Append('Text', { x = x, y = y - 3, text = X.ENVIRONMENT.GAME_LANG == 'zhcn' and _L['YY:'] or _L['DC:'], font = 48 }):AutoWidth():Width() + 5 + x = x + ui:Append('WndAutocomplete', { + name = 'YY', + w = 160, h = 26, x = x, y = y, + text = szInitYY, font = 48, color = { 128, 255, 0 }, + editType = X.UI.EDIT_TYPE.NUMBER, + onClick = function() + if IsPopupMenuOpened() then + X.UI(this):Autocomplete('close') + elseif X.IsClientPlayerTeamLeader() then + X.UI(this):Autocomplete('search', '') + end + end, + onBlur = function() + local szText = X.UI(this):Text() + if D.szYY == szText then + return + end + if X.IsClientPlayerTeamLeader() then + if not X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + D.szYY = szText + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'Edit', szText, ui:Children('#Message'):Text()}) + return + end + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock first.']) + end + ui:Fetch('YY'):Text(D.szYY, WNDEVENT_FIRETYPE.PREVENT) + end, + autocomplete = { + { + 'option', 'beforeSearch', function(text) + local source = {} + if X.IsClientPlayerTeamLeader() then + D.tList = D.GetList() + for k, v in pairs(D.tList) do + table.insert(source, k) + end + if #source == 1 and tostring(source[1]) == text then + source = {} + end + end + X.UI(this):Autocomplete('option', 'source', source) + end, + }, + { + 'option', 'beforeDelete', function(szOption) + D.tList[tonumber(szOption)] = nil + D.SaveList() + end, + }, + }, + }):Width() + 5 + y = y + ui:Append('WndButton', { + name = 'Btn_YY', + x = x, y = y, text = X.IsClientPlayerTeamLeader() + and (X.ENVIRONMENT.GAME_LANG == 'zhcn' and _L['Paste YY'] or _L['Paste DC']) + or (X.ENVIRONMENT.GAME_LANG == 'zhcn' and _L['Copy YY'] or _L['Copy DC']), + buttonStyle = 'FLAT', + onClick = function() + local yy = ui:Children('#YY'):Text() + if X.IsClientPlayerTeamLeader() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + if tonumber(yy) then + D.tList = D.GetList() + if not D.tList[tonumber(yy)] then + D.tList[tonumber(yy)] = true + D.SaveList() + end + end + if yy ~= '' then + for i = 0, 2 do -- 发三次 + X.SendChat(PLAYER_TALK_CHANNEL.RAID, yy) + end + end + local message = ui:Children('#Message'):Text():gsub('\n', ' ') + if message ~= '' then + X.SendChat(PLAYER_TALK_CHANNEL.RAID, message) + end + else + SetDataToClip(yy) + X.OutputAnnounceMessage(_L['Channel number has been copied to clipboard']) + end + end, + }):Height() + 5 + ui:Append('WndEditBox', { + name = 'Message', + w = 300, h = 80, x = 10, y = y, + multiline = true, limit = 512, + text = szInitNote, + onBlur = function() + local szText = X.ReplaceSensitiveWord(X.UI(this):Text()) + if D.szNote == szText then + return + end + if X.IsClientPlayerTeamLeader() then + if not X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + D.szNote = szText + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'Edit', ui:Children('#YY'):Text(), szText}) + return + end + X.OutputSystemAnnounceMessage(_L['Please unlock talk lock first.']) + end + ui:Fetch('Message'):Text(D.szNote, WNDEVENT_FIRETYPE.PREVENT) + end, + }) + x, y = 11, 130 + x = x + ui:Append('WndButton', { + name = 'WndBtn_RaidTools', + x = x, y = y, w = 96, + text = _L['MY_TeamTools'], + buttonStyle = 'FLAT', + onClick = MY_TeamTools.Toggle, + }):AutoWidth():Width() + 5 + x = x + ui:Append('WndButton', { + name = 'WndBtn_GKP', + x = x, y = y, w = 96, + text = _L['GKP Golden Team Record'], + buttonStyle = 'FLAT', + onClick = function() + if MY_GKP then + MY_GKP_MI.TogglePanel() + else + X.Alert(_L['You haven\'t had MY_GKP installed and loaded yet.']) + end + end, + }):AutoWidth():Width() + 5 + if MY_TeamMon_Subscribe then + x = x + ui:Append('WndButton', { + name = 'WndBtn_TeamMon', + x = x, y = y, w = 96, + text = _L['Import Data'], + buttonStyle = 'FLAT', + onClick = MY_TeamMon_Subscribe.OpenPanel, + }):AutoWidth():Width() + 5 + end + FormatAllContentPos() + -- 注册事件 + local frame = D.GetFrame() + frame.OnFrameKeyDown = nil -- esc close --> nil + frame:RegisterEvent('PARTY_DISBAND') + frame:RegisterEvent('PARTY_DELETE_MEMBER') + frame:RegisterEvent('PARTY_ADD_MEMBER') + frame:RegisterEvent('UI_SCALED') + frame:RegisterEvent('TEAM_AUTHORITY_CHANGED') + frame.OnEvent = function(szEvent) + if szEvent == 'PARTY_DISBAND' then + ui:Remove() + elseif szEvent == 'PARTY_DELETE_MEMBER' then + if arg1 == X.GetClientPlayerID() then + ui:Remove() + end + elseif szEvent == 'PARTY_ADD_MEMBER' then + if X.IsClientPlayerTeamLeader() then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'reply', arg1, D.szYY, D.szNote}) + end + elseif szEvent == 'UI_SCALED' then + ui:Anchor(O.anchor) + elseif szEvent == 'TEAM_AUTHORITY_CHANGED' then + ui:Fetch('Btn_YY'):Text(X.IsClientPlayerTeamLeader() and _L['Paste YY'] or _L['Copy YY']) + end + end + frame.OnFrameDragSetPosEnd = function() + this:CorrectPos() + end + frame.OnFrameDragEnd = function() + this:CorrectPos() + O.anchor = GetFrameAnchor(this) + end + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) + end + D.szYY = szInitYY or D.szYY + D.szNote = szInitNote or D.szNote +end + +function D.OpenFrame() + if MY_TeamNoticeOfficial.bEnable then + return MY_TeamNoticeOfficial.OpenFrame() + end + if X.IsInZombieMap() then + return X.OutputAnnounceMessage(_L['TeamNotice is disabled in this map.']) + end + O.bEnable = true + if X.IsClientPlayerInParty() then + if X.IsClientPlayerTeamLeader() then + D.CreateFrame() + else + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.Alert('TALK_LOCK', _L['Please unlock talk lock first.']) + end + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'ASK'}) + X.OutputSystemMessage(_L['Asking..., If no response in longtime, team leader not enable plug-in.']) + end + end +end + +X.RegisterEvent('PARTY_LEVEL_UP_RAID', 'TEAM_NOTICE', function() + if X.IsInZombieMap() then + return + end + if X.IsClientPlayerTeamLeader() then + X.Confirm(_L['Edit team info?'], function() + O.bEnable = true + D.OpenFrame() + end) + end +end) +X.RegisterEvent('FIRST_LOADING_END', 'TEAM_NOTICE', function() + if not O.bEnable then + return + end + -- 不存在队长不队长的问题了 + if X.IsClientPlayerInParty() then + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'ASK'}, true) + end +end) +X.RegisterEvent('LOADING_END', 'TEAM_NOTICE', function() + local frame = D.GetFrame() + if frame and X.IsInZombieMap() then + X.UI.CloseFrame(frame) + X.OutputAnnounceMessage(_L['TeamNotice is disabled in this map.']) + end +end) + +-- 退队时清空团队告示 +X.RegisterEvent({'PARTY_DISBAND', 'PARTY_DELETE_MEMBER'}, 'TEAM_NOTICE', function(e) + if e == 'PARTY_DISBAND' or (e == 'PARTY_DELETE_MEMBER' and arg1 == X.GetClientPlayerID()) then + local frame = D.GetFrame() + if frame then + X.UI.CloseFrame(frame) + end + D.szYY = nil + D.szNote = nil + end +end) + +X.RegisterEvent('ON_BG_CHANNEL_MSG', 'LR_TeamNotice', function() + if not O.bEnable then + return + end + local szMsgID, nChannel, dwID, szName, aMsg, bSelf = arg0, arg1, arg2, arg3, arg4, arg2 == X.GetClientPlayerID() + if szMsgID ~= 'LR_TeamNotice' or bSelf then + return + end + if not X.IsClientPlayerTeamLeader(dwID) then + return + end + local szCmd, szText = aMsg[1], aMsg[2] + if szCmd == 'SEND' then + D.CreateFrame('', szText) + end +end) + +X.RegisterBgMsg('TI', function(_, data, nChannel, dwID, szName, bIsSelf) + if not O.bEnable then + return + end + if not bIsSelf then + local me = X.GetClientPlayer() + local team = GetClientTeam() + if team then + if data[1] == 'ASK' and X.IsClientPlayerTeamLeader() then + if D.GetFrame() then + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'TI', {'reply', szName, D.szYY, D.szNote}, true) + end + else + if not X.IsPlayerTeamLeader(dwID) then + return + end + if data[1] == 'Edit' then + D.CreateFrame(data[2], data[3]) + elseif data[1] == 'reply' and (tonumber(data[2]) == X.GetClientPlayerID() or data[2] == me.szName) then + D.CreateFrame(data[3], data[4]) + end + end + end + end +end) + +X.RegisterAddonMenu(function() + return {{ + szOption = _L['Team Message'], + fnDisable = function() + return not X.IsClientPlayerInParty() + end, + fnAction = D.OpenFrame, + }} +end) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamNotice', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenFrame', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_TeamNotice = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamNoticeOfficial.lua b/MY_TeamTools/src/MY_TeamNoticeOfficial.lua new file mode 100644 index 000000000..e8460fc25 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamNoticeOfficial.lua @@ -0,0 +1,150 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队告示 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamNoticeOfficial' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = { + bEnable = not not NoticeBoard_Open, +} + +function D.ApplyNoticeBoard() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.DelayCall('MY_TeamNoticeOfficial__ApplyNoticeBoard', 500, D.ApplyNoticeBoard) + return + end + ApplyNoticeBoard(1) +end + +function D.OpenFrame() + if not D.bEnable then + return + end + if X.IsClientPlayerInParty() then + if X.IsClientPlayerTeamLeader() then + NoticeBoard_Open(1) + else + D.ApplyNoticeBoard() + X.OutputSystemMessage(_L['Asking..., If no response in longtime, team leader not enable plug-in.']) + end + end +end + +function D.UpdateHookFrame(hFrame, bForce) + if not hFrame then + return + end + local nW, nH = hFrame:GetSize() + if not bForce and hFrame.__nMY_TeamNotice_W == nW and hFrame.__nMY_TeamNotice_H == nH then + return + end + local hEdit = hFrame:Lookup('Edit_Text') + local hEditBg = hFrame:Lookup('', 'Handle_Bg/Image_TextEditBg') + local hEditMaxText = hFrame:Lookup('', 'Handle_Bg/Text_TextMax') + nW = nW - 24 + hEdit:SetH(nH - 89 - 30) + hEditBg:SetH(nH - 89 - 30) + hEditMaxText:SetRelY(nH - 17 - 30) + hEditMaxText:SetAbsY(hFrame:GetAbsY() + nH - 17 - 30 - 15) + + local ui = X.UI(hFrame) + local nX = 12 + local nY = nH - 40 + local nItemW = (nW + 5) / 3 - 5 + local uiBtnRaidTools = ui:Fetch('WndBtn_RaidTools') + if uiBtnRaidTools:Count() == 0 then + uiBtnRaidTools = ui:Append('WndButton', { + name = 'WndBtn_RaidTools', + text = _L['MY_TeamTools'], + buttonStyle = 'FLAT', + onClick = MY_TeamTools.Toggle, + }) + end + uiBtnRaidTools:Pos(nX, nY):Width(nItemW) + + local uiBtnGKP = ui:Fetch('WndBtn_GKP') + if uiBtnGKP:Count() == 0 then + uiBtnGKP = ui:Append('WndButton', { + name = 'WndBtn_GKP', + text = _L['GKP Golden Team Record'], + buttonStyle = 'FLAT', + onClick = function() + if MY_GKP then + MY_GKP_MI.TogglePanel() + else + X.Alert(_L['You haven\'t had MY_GKP installed and loaded yet.']) + end + end, + }) + end + uiBtnGKP:Pos(nX + nItemW + 5, nY):Width(nItemW) + + local uiBtnTeamMon = ui:Fetch('WndBtn_TeamMon') + if uiBtnTeamMon:Count() == 0 then + uiBtnTeamMon = ui:Append('WndButton', { + name = 'WndBtn_TeamMon', + text = _L['Import Data'], + buttonStyle = 'FLAT', + onClick = MY_TeamMon_Subscribe.OpenPanel, + }) + end + uiBtnTeamMon:Pos(nX + (nItemW + 5) * 2, nY):Width(nItemW) +end + +function D.UpdateHook(bForce) + for i = 1, 1 do + local hFrame = Station.Lookup('Normal/NoticeBoard' .. i) + D.UpdateHookFrame(hFrame, bForce) + end +end + +X.RegisterEvent('FIRST_LOADING_END', 'TEAM_NOTICE', function() + if not D.bEnable then + return + end + -- 不存在队长不队长的问题了 + if X.IsClientPlayerInParty() then + D.ApplyNoticeBoard() + end +end) + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamNoticeOfficial', + exports = { + { + preset = 'UIEvent', + fields = { + 'bEnable', + 'OpenFrame', + }, + root = D, + }, + }, +} +MY_TeamNoticeOfficial = X.CreateModule(settings) +end + +if D.bEnable then + X.BreatheCall('MY_TeamNoticeOfficial', function() D.UpdateHook() end) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamRestore.lua b/MY_TeamTools/src/MY_TeamRestore.lua new file mode 100644 index 000000000..84abc3a8e --- /dev/null +++ b/MY_TeamTools/src/MY_TeamRestore.lua @@ -0,0 +1,410 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 保存团队 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamRestore' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamRestore' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local DATA_PATH = {'userdata/team_restore.jx3dat', X.PATH_TYPE.SERVER} +local D = {} +local O = { + bKeepMark = true, + bKeepForm = true, + SaveList = X.LoadLUAData(DATA_PATH) or {}, + szMarkImage = PARTY_MARK_ICON_PATH, + tMarkFrame = PARTY_MARK_ICON_FRAME_LIST, +} + +function D.LoadLUAData() + O.SaveList = X.LoadLUAData(DATA_PATH) or {} +end + +function D.SaveLUAData() + X.SaveLUAData(DATA_PATH, O.SaveList) +end + +function D.Save(nIndex, szName) + local tList, tList2, me, team = {}, {}, X.GetClientPlayer(), GetClientTeam() + if not me or not me.IsInParty() then + return X.OutputSystemMessage(_L['You are not in a team'], X.CONSTANT.MSG_THEME.ERROR) + end + local tSave = {} + tSave.szLeader = team.GetClientTeamMemberName(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER)) + tSave.szMark = team.GetClientTeamMemberName(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK)) + tSave.szDistribute = team.GetClientTeamMemberName(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE)) + tSave.nLootMode = team.nLootMode + local tMark = team.GetTeamMark() + for nGroup = 0, team.nGroupNum - 1 do + local tGroupInfo = team.GetGroupInfo(nGroup) + tList2[nGroup] = {} + for _, dwID in ipairs(tGroupInfo.MemberList) do + local szName = team.GetClientTeamMemberName(dwID) + local info = X.GetTeamMemberInfo(dwID) + if szName then + local item = {} + item.nGroup = nGroup + item.nMark = tMark[dwID] + item.bForm = dwID == tGroupInfo.dwFormationLeader + tList[szName] = item + table.insert(tList2[nGroup], { + dwKungfuID = info.dwKungfuID, + nMark = tMark[dwID], + bForm = dwID == tGroupInfo.dwFormationLeader, + nGroup = nGroup, + }) + end + end + end + szName = X.TrimString(szName) + if X.IsEmpty(szName) then + szName = X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss') + end + tSave.name = szName + tSave.data = tList + tSave.data2 = tList2 + -- saved ok + if not nIndex or nIndex > #O.SaveList then + nIndex = #O.SaveList + 1 + end + O.SaveList[nIndex] = tSave + D.SaveLUAData() + X.OutputSystemMessage(_L['Team list data saved']) +end +function D.Delete(nIndex) + table.remove(O.SaveList, nIndex) + D.SaveLUAData() +end +function D.SyncMember(team, dwID, szName, state) + if O.bKeepForm and state.bForm then --如果这货之前有阵眼 + team.SetTeamFormationLeader(dwID, state.nGroup) -- 阵眼给他 + X.OutputSystemMessage(_L('Restore formation of %d group: %s', state.nGroup + 1, szName)) + end + if O.bKeepMark and state.nMark then -- 如果这货之前有标记 + X.SetTeamMarkCharacter(state.nMark, dwID) -- 标记给他 + X.OutputSystemMessage(_L('Restore player marked as [%s]: %s', X.CONSTANT.TEAM_MARK_NAME[state.nMark] or '?', szName)) + end +end + +function D.GetWrongIndex(tWrong, bState) + for k, v in ipairs(tWrong) do + if not bState or v.state then + return k + end + end +end + +function D.Restore(n) + -- 获取自己和团队操作对象 + local me, team = X.GetClientPlayer(), GetClientTeam() + -- update之前保存的团队列表 + D.LoadLUAData() + + if not me or not me.IsInParty() then + return X.OutputSystemMessage(_L['You are not in a team'], X.CONSTANT.MSG_THEME.ERROR) + elseif not O.SaveList[n] then + return X.OutputSystemMessage(_L['You have not saved team list data'], X.CONSTANT.MSG_THEME.ERROR) + end + -- get perm + if team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER) ~= me.dwID then + local nGroup = team.GetMemberGroupIndex(me.dwID) + 1 + local szLeader = team.GetClientTeamMemberName(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER)) + return X.OutputSystemMessage(_L['You are not team leader, permission denied'], X.CONSTANT.MSG_THEME.ERROR) + end + + if team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK) ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK, me.dwID) + end + + --parse wrong member + local tSaved, tWrong, dwLeader, dwMark = O.SaveList[n].data, {}, 0, 0 + for nGroup = 0, team.nGroupNum - 1 do + tWrong[nGroup] = {} + local tGroupInfo = team.GetGroupInfo(nGroup) + for _, dwID in pairs(tGroupInfo.MemberList) do + local szName = team.GetClientTeamMemberName(dwID) + if not szName then + X.OutputSystemMessage(_L('Unable get player of %d group: #%d', nGroup + 1, dwID), X.CONSTANT.MSG_THEME.ERROR) + else + if not tSaved[szName] then + szName = string.gsub(szName, '@.*', '') + end + local state = tSaved[szName] + if not state then + table.insert(tWrong[nGroup], { dwID = dwID, szName = szName, state = nil }) + X.OutputSystemMessage(_L('Unknown status: %s', szName)) + elseif state.nGroup == nGroup then + D.SyncMember(team, dwID, szName, state) + X.OutputSystemMessage(_L('Need not adjust: %s', szName)) + else + table.insert(tWrong[nGroup], { dwID = dwID, szName = szName, state = state }) + end + if szName == O.SaveList[n].szLeader then + dwLeader = dwID + end + if szName == O.SaveList[n].szMark then + dwMark = dwID + end + if szName == O.SaveList[n].szDistribute and dwID ~= team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE) then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.DISTRIBUTE,dwID) + X.OutputSystemMessage(_L('Restore distributor: %s', szName)) + end + end + end + end + -- loop to restore + for nGroup = 0, team.nGroupNum - 1 do + local nIndex = D.GetWrongIndex(tWrong[nGroup], true) + while nIndex do + -- wrong user to be adjusted + local src = tWrong[nGroup][nIndex] + local dIndex = D.GetWrongIndex(tWrong[src.state.nGroup], false) + table.remove(tWrong[nGroup], nIndex) + -- do adjust + if not dIndex then + team.ChangeMemberGroup(src.dwID, src.state.nGroup, 0) -- 直接丢过去 + else + local dst = tWrong[src.state.nGroup][dIndex] + table.remove(tWrong[src.state.nGroup], dIndex) + team.ChangeMemberGroup(src.dwID, src.state.nGroup, dst.dwID) + if not dst.state or dst.state.nGroup ~= nGroup then + table.insert(tWrong[nGroup], dst) + else -- bingo + X.OutputSystemMessage(_L('Change group of [%s] to %d', dst.szName, nGroup + 1)) + D.SyncMember(team, dst.dwID, dst.szName, dst.state) + end + end + X.OutputSystemMessage(_L('Change group of [%s] to %d', src.szName, src.state.nGroup + 1)) + D.SyncMember(team, src.dwID, src.szName, src.state) + nIndex = D.GetWrongIndex(tWrong[nGroup], true) -- update nIndex + end + end + -- restore others + if team.nLootMode ~= O.SaveList[n].nLootMode then + team.SetTeamLootMode(O.SaveList[n].nLootMode) + end + if dwMark ~= 0 and dwMark ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK, dwMark) + X.OutputSystemMessage(_L('Restore team marker: %s', O.SaveList[n].szMark)) + end + if dwLeader ~= 0 and dwLeader ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER, dwLeader) + X.OutputSystemMessage(_L('Restore team leader: %s', O.SaveList[n].szLeader)) + end + X.OutputSystemMessage(_L['Team list restored']) +end + +function D.Restore2(n) + D.LoadLUAData() + local me, team = X.GetClientPlayer(), GetClientTeam() + if not me or not me.IsInParty() then + return X.OutputSystemMessage(_L['You are not in a team'], X.CONSTANT.MSG_THEME.ERROR) + elseif not O.SaveList[n] then + return X.OutputSystemMessage(_L['You have not saved team list data'], X.CONSTANT.MSG_THEME.ERROR) + end + -- get perm + if team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER) ~= me.dwID then + local nGroup = team.GetMemberGroupIndex(me.dwID) + 1 + local szLeader = team.GetClientTeamMemberName(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER)) + return X.OutputSystemMessage(_L['You are not team leader, permission denied'], X.CONSTANT.MSG_THEME.ERROR) + end + + if team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK) ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK, me.dwID) + end + + local tSaved, tWrong, dwLeader, dwMark = O.SaveList[n].data2, {}, 0, 0 + for nGroup = 0, team.nGroupNum - 1 do + local tGroupInfo = team.GetGroupInfo(nGroup) + for k,v in pairs(tGroupInfo.MemberList) do + local info = X.GetTeamMemberInfo(v) + tWrong[v] = { nGroup = nGroup, dwKungfuID = info.dwKungfuID } + end + end + + local fnAction = function(dwKungfuID,nGroup,dwID) + for k,v in pairs(tWrong) do + if dwKungfuID and v.dwKungfuID == dwKungfuID then -- 只要内功匹配的人 + return k,v + elseif nGroup and v.nGroup == nGroup and k ~= dwID then -- 不是自己的同组人要一个 + return k,v + end + end + return false,false + end + + for nGroup,tGroup in pairs(tSaved) do + for k,v in ipairs(tGroup) do + local tGroupInfo = team.GetGroupInfo(nGroup) + local dwID,tab = fnAction(v.dwKungfuID) + if dwID then + local info = X.GetTeamMemberInfo(dwID) + if nGroup == tab.nGroup then + tWrong[dwID] = nil + X.OutputSystemMessage(_L('Need not adjust: %s', info.szName)) + D.SyncMember(team, dwID, info.szName, v) + else + if #tGroupInfo.MemberList < 5 then + team.ChangeMemberGroup(dwID,nGroup,0) + tWrong[dwID] = nil + X.OutputSystemMessage(_L('Change group of [%s] to %d', info.szName, nGroup + 1)) + D.SyncMember(team, dwID, info.szName, v) + else + local ddwID,dtab = fnAction(false,nGroup,dwID) + if ddwID then + team.ChangeMemberGroup(dwID,nGroup,ddwID) + tWrong[ddwID].nGroup = tab.nGroup -- update + tWrong[dwID] = nil + X.OutputSystemMessage(_L('Change group of [%s] to %d', info.szName, nGroup + 1)) + D.SyncMember(team, dwID, info.szName, v) + end + end + end + end + end + end + -- restore others + if team.nLootMode ~= O.SaveList[n].nLootMode then + team.SetTeamLootMode(O.SaveList[n].nLootMode) + end + if dwMark ~= 0 and dwMark ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK, dwMark) + X.OutputSystemMessage(_L('Restore team marker: %s', O.SaveList[n].szMark)) + end + if dwLeader ~= 0 and dwLeader ~= me.dwID then + team.SetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER, dwLeader) + X.OutputSystemMessage(_L('Restore team leader: %s', O.SaveList[n].szLeader)) + end + X.OutputSystemMessage(_L['Team list restored']) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nPaddingX + nX, nY = ui:Append('Text', { x = nX, y = nY + 15, text = _L['MY_TeamRestore'], font = 27 }):Pos('BOTTOMRIGHT') + + nX = nPaddingX + 10 + nY = nY + 5 + for i, v in ipairs(O.SaveList) do + nX = ui:Append('WndButton', { + x = nX + 5, y = nY, w = 80, text = v.name, + buttonStyle = 'FLAT', + tip = { + render = v.name .. '\n' .. _L['Left click to recovery, right click for more.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + onLClick = function() + if IsCtrlKeyDown() then + D.Restore2(i) + else + D.Restore(i) + end + end, + menuRClick = function() + local menu = { + { + szOption = _L['Restore'], + fnAction = function() + D.Restore(i) + end, + }, + { + szOption = _L['Restore2'], + fnAction = function() + D.Restore2(i) + end, + }, + { + szOption = _L['Delete'], + fnAction = function() + D.Delete(i) + X.Panel.SwitchTab('MY_TeamTools', true) + end, + }, + { + szOption = _L['Rename'], + fnAction = function() + GetUserInput(_L['Save team name'], function(text) + text = X.TrimString(text) + if not X.IsEmpty(text) then + v.name = text + D.SaveLUAData() + X.Panel.SwitchTab('MY_TeamTools', true) + end + end, nil, nil, nil, nil, 50) + end, + }, + { + szOption = _L['Replace'], + fnAction = function() + D.Save(i) + end, + }, + } + local menu1 = { szOption = _L['Detail'] } + table.insert(menu1, { szOption = _L('Leader:%s', v['szLeader']) }) + table.insert(menu1, { szOption = _L('Distribute:%s', v['szDistribute']) }) + table.insert(menu1, { szOption = _L('Mark:%s', v['szMark']) }) + table.insert(menu1, { bDevide = true }) + for i = 1, 5 do + table.insert(menu1, { szOption = _L('Party %d', i) }) + end + for kk, vv in pairs(v['data']) do + table.insert(menu1[5 + vv.nGroup], { szOption = kk }) + end + table.insert(menu, menu1) + return menu + end, + }):Pos('BOTTOMRIGHT') + 10 + if nX + 80 > nW then + nX = nPaddingX + 10 + nY = nY + 28 + end + end + + nX = ui:Append('WndButton', { + x = nX + 5, y = nY, text = _L['Save Team'], + buttonStyle = 'FLAT', + onClick = function() + GetUserInput(_L['Save team name'], function(text) + D.Save(nil, text) + X.Panel.SwitchTab('MY_TeamTools', true) + end, nil, nil, nil, nil, 50) + end, + }):Pos('BOTTOMRIGHT') + nY = nY + 28 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamRestore', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_TeamRestore = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools.PS.lua b/MY_TeamTools/src/MY_TeamTools.PS.lua new file mode 100644 index 000000000..fdaa0fc66 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools.PS.lua @@ -0,0 +1,87 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools.PS' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_WorldMark', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- +local PS = { nPriority = 0 } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 30 + local nX, nY, nLFY = nPaddingX, nPaddingY, nPaddingY + local nW, nH = ui:Size() + local nLH = 25 + + ui:Append('WndButton', { + x = nW - 165, y = nY, w = 150, h = 38, + text = _L['Open Panel'], + buttonStyle = 'SKEUOMORPHISM_LACE_BORDER', + onClick = MY_TeamTools.Open, + }) + + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['MY_TeamTools'], font = 27 }):Height() + 5 + nX = nPaddingX + 10 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + checked = MY_TeamNotice.bEnable, + text = _L['Team Message'], + onCheck = function(bChecked) + MY_TeamNotice.bEnable = bChecked + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + checked = MY_CharInfo.bEnable, + text = _L['Allow view charinfo'], + onCheck = function(bChecked) + MY_CharInfo.bEnable = bChecked + end, + }):AutoWidth():Width() + 5 + + if not X.IsRestricted('MY_WorldMark') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + checked = MY_WorldMark.bEnable, + text = _L['World mark enhance'], + onCheck = function(bChecked) + MY_WorldMark.bEnable = bChecked + MY_WorldMark.CheckEnable() + end, + }):AutoWidth():Width() + 5 + end + + nLFY = nY + nLH + nX, nY, nLFY = MY_CombatLogs.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nLH, nX, nY, nLFY) + + nX = nPaddingX + nY = nY + 30 + nY = nY + ui:Append('Text', { x = nX, y = nY, text = _L['Party Request'], font = 27 }):Height() + 5 + nX = nPaddingX + 10 + nX, nY = MY_PartyRequest.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_RoomRequest.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_RideRequest.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_EvokeRequest.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_SocialRequest.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_TeamCountdown.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX, nY = MY_TeamRestore.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) +end +X.Panel.Register(_L['Raid'], 'MY_TeamTools', _L['MY_TeamTools'], 5962, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools.lua b/MY_TeamTools/src/MY_TeamTools.lua new file mode 100644 index 000000000..bb6f5ea60 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools.lua @@ -0,0 +1,261 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具框架 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + aFloatEntry = {}, + aSaveDB = {}, + nActivePageIndex = nil, + szStatRange = 'RAID', +} +local Framework = {} +local SZ_INI = PLUGIN_ROOT .. '/ui/MY_TeamTools.ini' +local SZ_MOD_INI = PLUGIN_ROOT .. '/ui/MY_TeamTools.Mod.ini' + +function D.Open(szModule) + local ui = X.UI.CreateFrame('MY_TeamTools', { + w = 1096, h = 700, + close = true, + text = X.PACKET_INFO.NAME .. _L.SPLIT_DOT .. _L['MY_TeamTools'], + anchor = 'CENTER', + onSizeChange = function() + local ui = X.UI(this) + local nW, nH = ui:Size() + ui:Children('#Btn_Option'):Left(nW - 40) + ui:Children('#PageSet_All'):Size(nW, nH - 48) + D.PageSetModule.BroadcastPageEvent(this, 'OnResizePage') + end, + }) + local frame = ui:Raw() + D.PageSetModule.DrawUI(frame) + D.PageSetModule.ActivePage(frame, szModule or 1, true) +end + +function D.Close() + X.UI.CloseFrame('MY_TeamTools') +end + +function D.IsOpened() + return Station.Lookup('Normal/MY_TeamTools') +end + +function D.Toggle() + if D.IsOpened() then + D.Close() + else + D.Open() + end +end + +-- 注册子模块 +function D.RegisterModule(szKey, szName, tModule) + if not D.PageSetModule or not szName or not tModule then + return + end + if tModule.szFloatEntry then + table.insert(D.aFloatEntry, { szName = szName, szKey = tModule.szFloatEntry }) + end + if tModule.szSaveDB then + table.insert(D.aSaveDB, { szName = szName, szKey = tModule.szSaveDB }) + end + D.PageSetModule.RegisterModule(szKey, szName, tModule) + if D.IsOpened() then + D.Close() + D.Open() + end +end + +function D.OnLButtonClick() + local name = this:GetName() + if name == 'Btn_Close' then + D.Close() + elseif name == 'Btn_Option' then + local menu = {} + table.insert(menu, { + szOption = _L['Option'], + fnAction = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_TeamTools') + end, + }) + local tFloatEntryMenu = { szOption = _L['Float panel'] } + for _, m in ipairs(D.aFloatEntry) do + table.insert(tFloatEntryMenu, { + szOption = m.szName, + bCheck = true, bChecked = X.Get(_G, m.szKey), + fnAction = function() + X.Set(_G, m.szKey, not X.Get(_G, m.szKey)) + end, + }) + end + if #tFloatEntryMenu > 0 then + table.insert(menu, tFloatEntryMenu) + end + local tSaveDBMenu = { szOption = _L['Save DB'] } + for _, m in ipairs(D.aSaveDB) do + table.insert(tSaveDBMenu, { + szOption = m.szName, + bCheck = true, bChecked = X.Get(_G, m.szKey), + fnAction = function() + X.Set(_G, m.szKey, not X.Get(_G, m.szKey)) + end, + }) + end + if #tSaveDBMenu > 0 then + table.insert(menu, tSaveDBMenu) + end + if #menu > 0 then + local nX, nY = this:GetAbsPos() + local nW, nH = this:GetSize() + menu.nMiniWidth = nW + menu.x = nX + menu.y = nY + nH + X.UI.PopupMenu(menu) + end + end +end + +function D.OnFrameCreate() + this:BringToTop() + this:RegisterEvent('PARTY_ADD_MEMBER') + this:RegisterEvent('PARTY_DELETE_MEMBER') + this:RegisterEvent('TEAM_AUTHORITY_CHANGED') + this:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + local frame = this + local ui = X.UI(frame) + ui:Append('WndPageSet', { + name = 'PageSet_All', + x = 0, y = 48, w = 1096, h = 700 - 48, + }) + ui:Append('WndButton', { + name = 'Btn_Option', + x = 1056, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + }) + -- 模式选择 + local aStatRange = { + { szKey = 'RAID', szName = _L['Raid Stat'] }, + { szKey = 'ROOM', szName = _L['Room Stat'] }, + } + ui:Append('WndComboBox', { + name = 'WndComboBox_Mode', + x = 930, y = 52, w = 110, h = 26, + text = (function() + for _, v in ipairs(aStatRange) do + if v.szKey == D.szStatRange then + return v.szName + end + end + return aStatRange[1].szName + end)(), + menu = function() + local menu = {} + local ui = X.UI(this) + for _, tMode in ipairs(aStatRange) do + table.insert(menu, { + szOption = tMode.szName, + fnAction = function() + D.szStatRange = tMode.szKey + FireUIEvent('MY_TEAM_TOOLS__STAT_RANGE_CHANGE') + ui:Text(tMode.szName) + X.UI.ClosePopupMenu() + end, + }) + end + return menu + end, + }) + -- 标题修改 + local szTitle = X.PACKET_INFO.NAME .. ' - ' .. _L['MY_TeamTools'] + if X.IsClientPlayerInParty() then + local team = GetClientTeam() + local info = team.GetMemberInfo(team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER)) + szTitle = _L('%s\'s Team', info.szName) .. ' (' .. team.GetTeamSize() .. '/' .. team.nGroupNum * 5 .. ')' + end + frame:Lookup('', 'Text_Title'):SetText(szTitle) + -- 注册关闭 + X.RegisterEsc('MY_TeamTools', D.IsOpened, D.Close) + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) +end + +function D.OnFrameDestroy() + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) + X.RegisterEsc('MY_TeamTools', false) +end + +function D.OnEvent(event) + -- update title + if event == 'PARTY_ADD_MEMBER' + or event == 'PARTY_DELETE_MEMBER' + or event == 'TEAM_AUTHORITY_CHANGED' + then + local team = GetClientTeam() + local dwID = team.GetAuthorityInfo(TEAM_AUTHORITY_TYPE.LEADER) + local info = team.GetMemberInfo(dwID) + if info then + this:Lookup('', 'Text_Title'):SetText(_L('%s\'s Team', info.szName) .. ' (' .. team.GetTeamSize() .. '/' .. team.nGroupNum * 5 .. ')') + end + end +end + +D.PageSetModule = X.UI.CreatePageSetModule(D, 'Wnd_Total/PageSet_All') +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamTools', + exports = { + { + root = D, + fields = { + 'szStatRange', + Open = D.Open, + Close = D.Close, + IsOpened = D.IsOpened, + Toggle = D.Toggle, + RegisterModule = D.RegisterModule, + }, + interceptors = { + ['*'] = function(k) + if D.PageSetModule and D.PageSetModule.tModuleAPI[k] then + return D.PageSetModule.tModuleAPI[k] + end + end, + }, + preset = 'UIEvent' + }, + }, +} +MY_TeamTools = X.CreateModule(settings) +end + +do +local menu = { + szOption = _L['MY_TeamTools'], + fnAction = function() D.Toggle() end, +} +X.RegisterAddonMenu('MY_TeamTools', menu) +end +X.RegisterHotKey('MY_RaidTools', _L['Open/Close MY_TeamTools'], D.Toggle, nil) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools_Achievement.lua b/MY_TeamTools/src/MY_TeamTools_Achievement.lua new file mode 100644 index 000000000..f12b6da8f --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools_Achievement.lua @@ -0,0 +1,961 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具 - 团队成就 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools_Achievement' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools_Achievement' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_TeamTools_Achievement.ini' +local O = X.CreateUserSettingsModule('MY_TeamTools_Achievement', _L['Raid'], { + bIntelligentHide = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_TeamTools_Achievement'], + _L['Intelligent hide'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = { + dwMapID = 0, + szSearch = '', + szSort = 'name', + szSortOrder = 'asc', + aAchievement = {}, + aSearchAC = {}, +} + +local MAX_ALL_MAP_ACHI = 40 +local ACHIEVE_CACHE = {} +local COUNTER_CACHE = {} +local EXCEL_WIDTH = 1056 +local ACHI_MIN_WIDTH = 15 +local ACHI_MAX_WIDTH = math.huge +local STAT_SORT = setmetatable({ + ['FINISH'] = 3, + ['PROGRESS'] = 2, + ['UNKNOWN'] = 1, +}, { __index = function() return 0 end }) + +local function GeneCommonFormatText(id) + return function(r) + return GetFormatText(r[id], 162, 255, 255, 255) + end +end +local function GeneCommonCompare(id) + return function(r1, r2) + if r1[id] == r2[id] then + return 0 + end + return r1[id] > r2[id] and 1 or -1 + end +end + +function D.GetColumns() + local aCol = { + { -- 名字 + id = 'name', + szTitle = _L['Name'], + nMinWidth = 110, nMaxWidth = 200, + GetFormatText = function(rec) + local name = rec.name + if MY_ChatMosaics and MY_ChatMosaics.MosaicsString then + name = MY_ChatMosaics.MosaicsString(name) + end + return GetFormatText(name, 162, X.GetForceColor(rec.force, 'foreground')) + end, + Compare = GeneCommonCompare('name'), + }, + } + for _, dwAchieveID in ipairs(D.aAchievement) do + local achi = X.GetAchievement(dwAchieveID) + if achi then + table.insert(aCol, { + id = 'achievement_' .. dwAchieveID, + dwAchieveID = dwAchieveID, + szTitle = achi.szName, + nMinWidth = ACHI_MIN_WIDTH, nMaxWidth = ACHI_MAX_WIDTH, + GetFormatText = function(rec) + local szStat = D.GetPlayerAchievementStat(rec.id, dwAchieveID) + local szText, nR, nG, nB + if szStat == 'FINISH' then + szText, nR, nG, nB = _L['r'], 128, 255, 128 + elseif szStat == 'PROGRESS' then + szText, nR, nG, nB = _L['x'], 255, 255, 255 + else + szText, nR, nG, nB = _L['--'], 173, 173, 173 + end + return GetFormatText(szText, 162, nR, nG, nB, 786, + 'this.playerid=' .. X.EncodeLUAData(rec.id) .. ';this.achieveid=' .. X.EncodeLUAData(dwAchieveID), 'Text_Achieve') + end, + Compare = function(r1, r2) + local szStat1, aProgressCounter1 = D.GetPlayerAchievementStat(r1.id, dwAchieveID) + local szStat2, aProgressCounter2 = D.GetPlayerAchievementStat(r2.id, dwAchieveID) + if szStat1 == szStat2 then + if szStat1 == 'PROGRESS' then + local nCounter1, nCounter2 = 0, 0 + for _, v in ipairs(aProgressCounter1) do + nCounter1 = nCounter1 + v.nNumber + end + for _, v in ipairs(aProgressCounter2) do + nCounter2 = nCounter2 + v.nNumber + end + if nCounter1 == nCounter2 then + return 0 + end + return nCounter1 > nCounter2 and 1 or -1 + end + return 0 + end + return STAT_SORT[szStat1] > STAT_SORT[szStat2] and 1 or -1 + end, + }) + end + end + return aCol +end + +function D.GetDispColumns() + local aCol, nW = {}, 0 + local nExtraWidth, nFlexWidth = EXCEL_WIDTH, 0 + for _, col in ipairs(D.GetColumns()) do + if nExtraWidth < col.nMinWidth then + break + end + col.nFlexWidth = (col.nMaxWidth and not X.IsHugeNumber(col.nMaxWidth) + and col.nMaxWidth + or EXCEL_WIDTH) - col.nMinWidth + table.insert(aCol, col) + nFlexWidth = nFlexWidth + col.nFlexWidth + nExtraWidth = nExtraWidth - col.nMinWidth + end + for i, col in ipairs(aCol) do + col.nWidth = i == #aCol + and (EXCEL_WIDTH - nW) + or math.min(nExtraWidth * col.nFlexWidth / nFlexWidth + col.nMinWidth, col.nMaxWidth or math.huge) + nW = nW + col.nWidth + end + return aCol +end + +function D.UpdateSearchAC() + local DungeonInfo = X.GetGameTable('DungeonInfo', true) + local info = DungeonInfo and DungeonInfo:Search(D.dwMapID) + D.aSearchAC = info + and X.SplitString(info.szBossInfo, ' ', true) + or {} + FireUIEvent('MY_TEAM_TOOLS__ACHIEVE_SEARCH_AC') +end + +function D.AchievementSorter(a, b) + local v1 = a.dwSub == 10 + and 0 + or 1 + local v2 = b.dwSub == 10 + and 0 + or 1 + if v1 == v2 then + return a.dwID > b.dwID + end + return v1 > v2 +end + +function D.UpdateAchievementID() + local aAchievement = {} + if D.dwMapID == 0 then + local Achievement = X.GetGameTable('Achievement', true) + if Achievement then + local nCount = Achievement:GetRowCount() + for i = 2, nCount do + local achi = Achievement:GetRow(i) + if achi and achi.nVisible == 1 and achi.dwGeneral == 1 + and (not O.bIntelligentHide or achi.dwSub ~= 10) -- 隐藏声望成就 + and (X.IsEmpty(D.szSearch) or X.StringFindW(achi.szName, D.szSearch) or X.StringFindW(achi.szDesc, D.szSearch)) then + table.insert(aAchievement, achi) + if #aAchievement >= MAX_ALL_MAP_ACHI then + break + end + end + end + end + else + for _, dwAchieveID in ipairs(X.GetMapAchievements(D.dwMapID) or X.CONSTANT.EMPTY_TABLE) do + local achi = X.GetAchievement(dwAchieveID) + if achi + and (not O.bIntelligentHide or achi.dwSub ~= 10) -- 隐藏声望成就 + and (X.IsEmpty(D.szSearch) or X.StringFindW(achi.szName, D.szSearch) or X.StringFindW(achi.szDesc, D.szSearch)) then + table.insert(aAchievement, achi) + end + end + end + table.sort(aAchievement, D.AchievementSorter) + for i, achi in ipairs(aAchievement) do + aAchievement[i] = achi.dwID + end + D.aAchievement = aAchievement + FireUIEvent('MY_TEAM_TOOLS__ACHIEVE') +end + +X.RegisterEvent('LOADING_ENDING', function() + if MY_TeamTools.IsOpened() then + return + end + D.dwMapID = X.GetClientPlayer().GetMapID() + D.szSearch = '' + D.UpdateSearchAC() + D.UpdateAchievementID() +end) + +-- 获取成员列表 +function D.GetMemberList(bOnline) + local aList = {} + if MY_TeamTools.szStatRange == 'RAID' then + for _, dwID in ipairs(X.GetTeamMemberList()) do + local tMember = X.GetTeamMemberInfo(dwID) + if tMember and (not bOnline or tMember.bOnline) then + table.insert(aList, { + dwID = tMember.dwID, + szGlobalID = tMember.szGlobalID, + szName = tMember.szName, + dwForceID = tMember.dwForceID, + }) + end + end + elseif MY_TeamTools.szStatRange == 'ROOM' then + for _, szGlobalID in ipairs(X.GetRoomMemberList()) do + local tMember = X.GetRoomMemberInfo(szGlobalID) + local szServerName = tMember and X.GetServerNameByID(tMember.dwServerID) + if tMember and szServerName then + table.insert(aList, { + szGlobalID = tMember.szGlobalID, + szName = tMember.szName .. g_tStrings.STR_CONNECT .. szServerName, + dwForceID = tMember.dwForceID, + }) + end + end + end + return aList +end + +function D.GetPlayerAchievementStat(dwID, dwAchieveID) + if ACHIEVE_CACHE[dwID] and X.IsBoolean(ACHIEVE_CACHE[dwID][dwAchieveID]) then + if ACHIEVE_CACHE[dwID][dwAchieveID] then + return 'FINISH' + end + local achi = X.GetAchievement(dwAchieveID) + if achi then + local aProgressCounter = {} + if COUNTER_CACHE[dwID] then + for _, s in ipairs(X.SplitString(achi.szCounters, '|', true)) do + local dwCounter = tonumber(s) + if dwCounter and COUNTER_CACHE[dwID][dwCounter] then + table.insert(aProgressCounter, { + dwCounter = dwCounter, + nNumber = COUNTER_CACHE[dwID][dwCounter], + }) + end + end + end + return 'PROGRESS', aProgressCounter + end + end + return 'UNKNOWN' +end + +do local ACHIEVE_POINT_CACHE = {} +function D.GetAchievementPoint(dwAchieveID) + if not ACHIEVE_POINT_CACHE[dwAchieveID] then + local nAchievePoint = X.Get(X.GetAchievementInfo(dwAchieveID), {'nPoint'}, 0) + local achi = X.GetAchievement(dwAchieveID) + if achi then + for _, s in ipairs(X.SplitString(achi.szCounters, '|', true)) do + local dwCounter = tonumber(s) + if dwCounter then + nAchievePoint = nAchievePoint + X.Get(X.GetAchievementInfo(dwCounter), {'nPoint'}, 0) + end + end + end + ACHIEVE_POINT_CACHE[dwAchieveID] = nAchievePoint + end + return ACHIEVE_POINT_CACHE[dwAchieveID] +end +end + +do +local function AnalysisAchievementRequest(dwAchieveID, tAchieveID, tCounterID) + local info = X.GetAchievement(dwAchieveID) + if info then + tAchieveID[dwAchieveID] = true + for _, s in ipairs(X.SplitString(info.szCounters, '|', true)) do + local dwCounter = tonumber(s) + if dwCounter then + tCounterID[dwCounter] = true + end + end + for _, s in ipairs(X.SplitString(info.szSeries, '|', true)) do + local dwSerie = tonumber(s) + if dwSerie and not tAchieveID[dwSerie] then + AnalysisAchievementRequest(dwSerie, tAchieveID, tCounterID) + end + end + for _, s in ipairs(X.SplitString(info.szSubAchievements, '|', true)) do + local dwSubAchieve = tonumber(s) + if dwSubAchieve and not tAchieveID[dwSubAchieve] then + AnalysisAchievementRequest(dwSubAchieve, tAchieveID, tCounterID) + end + end + end + return tAchieveID, tCounterID +end +function D.AnalysisAchievementRequest(aAchievement) + local tAchieveID, tCounterID = {}, {} + for _, dwAchieveID in ipairs(aAchievement) do + AnalysisAchievementRequest(dwAchieveID, tAchieveID, tCounterID) + end + local aAchieveID, aCounterID = {}, {} + for dwAchieveID, _ in pairs(tAchieveID) do + table.insert(aAchieveID, dwAchieveID) + end + for dwCounterID, _ in pairs(tCounterID) do + table.insert(aCounterID, dwCounterID) + end + return aAchieveID, aCounterID +end +end + +function D.UpdateSelfData() + local aAchieveID, aCounterID = D.AnalysisAchievementRequest(D.aAchievement) + local dwID, szGlobalID = X.GetClientPlayerID(), X.GetClientPlayerGlobalID() + local me = X.GetClientPlayer() + if not ACHIEVE_CACHE[dwID] then + ACHIEVE_CACHE[dwID] = {} + end + if not COUNTER_CACHE[dwID] then + COUNTER_CACHE[dwID] = {} + end + for _, dwAchieveID in ipairs(aAchieveID) do + ACHIEVE_CACHE[dwID][dwAchieveID] = me.IsAchievementAcquired(dwAchieveID) + end + for _, dwCounterID in ipairs(aCounterID) do + COUNTER_CACHE[dwID][dwCounterID] = me.GetAchievementCount(dwCounterID) + end + ACHIEVE_CACHE[szGlobalID] = ACHIEVE_CACHE[dwID] + COUNTER_CACHE[szGlobalID] = COUNTER_CACHE[dwID] + FireUIEvent('MY_TEAM_TOOLS__ACHIEVE') +end + +function D.RequestTeamData() + -- 计算强制请求和刷新请求列表 + local aAchieveID, aCounterID = D.AnalysisAchievementRequest(D.aAchievement) + local aTeamRequestID, aTeamRefreshID, tTeamRequestID = {}, {}, {} + local aRoomRequestID, aRoomRefreshID, tRoomRequestID = {}, {}, {} + local aMemberList = D.GetMemberList(true) + if MY_TeamTools.szStatRange == 'RAID' then + for _, tMember in ipairs(aMemberList) do + for _, dwAchieveID in ipairs(aAchieveID) do + if not ACHIEVE_CACHE[tMember.dwID] or X.IsNil(ACHIEVE_CACHE[tMember.dwID][dwAchieveID]) then + tTeamRequestID[tMember.dwID] = true + end + end + for _, dwCounterID in ipairs(aCounterID) do + if not COUNTER_CACHE[tMember.dwID] or X.IsNil(COUNTER_CACHE[tMember.dwID][dwCounterID]) then + tTeamRequestID[tMember.dwID] = true + end + end + end + for _, tMember in ipairs(aMemberList) do + if tMember.dwID ~= X.GetClientPlayerID() then + if tTeamRequestID[tMember.dwID] then + table.insert(aTeamRequestID, tMember.dwID) + else + table.insert(aTeamRefreshID, tMember.dwID) + end + end + end + if (not X.IsEmpty(aAchieveID) or not X.IsEmpty(aCounterID)) and (not X.IsEmpty(aTeamRequestID) or not X.IsEmpty(aTeamRefreshID)) then + if #aTeamRequestID == #aMemberList - 1 then + aTeamRequestID = nil + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Fetch teammate\'s data failed, please unlock talk and reopen.']) + else + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_TEAM_TOOLS__ACHIEVE_REQ', {aAchieveID, aCounterID, aTeamRequestID, nil}) + end + end + elseif MY_TeamTools.szStatRange == 'ROOM' then + for _, tMember in ipairs(aMemberList) do + for _, dwAchieveID in ipairs(aAchieveID) do + if not ACHIEVE_CACHE[tMember.szGlobalID] or X.IsNil(ACHIEVE_CACHE[tMember.szGlobalID][dwAchieveID]) then + tRoomRequestID[tMember.szGlobalID] = true + end + end + for _, dwCounterID in ipairs(aCounterID) do + if not COUNTER_CACHE[tMember.szGlobalID] or X.IsNil(COUNTER_CACHE[tMember.szGlobalID][dwCounterID]) then + tRoomRequestID[tMember.szGlobalID] = true + end + end + end + for _, tMember in ipairs(aMemberList) do + if tMember.szGlobalID ~= X.GetClientPlayerGlobalID() then + if tRoomRequestID[tMember.szGlobalID] then + table.insert(aRoomRequestID, tMember.szGlobalID) + else + table.insert(aRoomRefreshID, tMember.szGlobalID) + end + end + end + if (not X.IsEmpty(aAchieveID) or not X.IsEmpty(aCounterID)) and (not X.IsEmpty(aRoomRequestID) or not X.IsEmpty(aRoomRefreshID)) then + if #aRoomRequestID == #aMemberList - 1 then + aRoomRequestID = nil + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Fetch teammate\'s data failed, please unlock talk and reopen.']) + else + X.SendBgMsg(PLAYER_TALK_CHANNEL.ROOM, 'MY_TEAM_TOOLS__ACHIEVE_REQ', {aAchieveID, aCounterID, aRoomRequestID, nil}) + end + end + end + -- 刷新自己的 + D.UpdateSelfData() +end + +function D.DelayRequestTeamData() + X.DelayCall('MY_TeamTools_Achievement_DelayReq', 1000, D.RequestTeamData) +end + +X.RegisterBgMsg('MY_TEAM_TOOLS__ACHIEVE_RES', function(_, data, nChannel, dwTalkerID, szTalkerName, bSelf) + local aAchieveRes, aCounterRes, szGlobalID = data[1], data[2], data[3] + if not ACHIEVE_CACHE[dwTalkerID] then + ACHIEVE_CACHE[dwTalkerID] = {} + end + if not COUNTER_CACHE[dwTalkerID] then + COUNTER_CACHE[dwTalkerID] = {} + end + for _, v in ipairs(aAchieveRes) do + ACHIEVE_CACHE[dwTalkerID][v[1]] = v[2] + end + for _, v in ipairs(aCounterRes) do + COUNTER_CACHE[dwTalkerID][v[1]] = v[2] + end + if X.IsString(szGlobalID) then + ACHIEVE_CACHE[szGlobalID] = ACHIEVE_CACHE[dwTalkerID] + COUNTER_CACHE[szGlobalID] = COUNTER_CACHE[dwTalkerID] + end + FireUIEvent('MY_TEAM_TOOLS__ACHIEVE') +end) + +function D.OutputRowTip(this, rec) + local aXml, nAchievePoint, nAciquiePoint = {}, 0, 0 + local aCol = D.GetColumns() + local nLen = 0 + for _, col in ipairs(aCol) do + if col.dwAchieveID then + nLen = math.max(nLen, X.StringLenW(col.szTitle)) + end + end + for _, col in ipairs(aCol) do + if col.dwAchieveID then + local nPoint = D.GetAchievementPoint(col.dwAchieveID) + local szSpace = g_tStrings.STR_ONE_CHINESE_SPACE:rep(nLen - X.StringLenW(col.szTitle)) + if D.GetPlayerAchievementStat(rec.id, col.dwAchieveID) == 'FINISH' then + nAciquiePoint = nAciquiePoint + nPoint + end + nAchievePoint = nAchievePoint + nPoint + table.insert(aXml, GetFormatText('[' .. col.szTitle .. ']' .. szSpace .. ' ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec)) + table.insert(aXml, GetFormatText(' (+' .. nPoint .. ')', 162, 255, 128, 0)) + else + table.insert(aXml, GetFormatText(col.szTitle, 162, 255, 255, 0)) + table.insert(aXml, GetFormatText(': ', 162, 255, 255, 0)) + table.insert(aXml, col.GetFormatText(rec)) + end + if IsCtrlKeyDown() then + table.insert(aXml, GetFormatText('\t' .. col.id, 162, 255, 0, 0)) + else + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + end + table.insert(aXml, 5, GetFormatText(_L('Achievement point: %d / %d', nAciquiePoint, nAchievePoint) .. '\n', 162, 255, 128, 0)) + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local nPosType = X.UI.TIP_POSITION.RIGHT_LEFT + OutputTip(table.concat(aXml), 450, {x, y, w, h}, nPosType) +end + +function D.OutputAchieveTip(dwAchieveID, dwID) + local achi = X.GetAchievement(dwAchieveID) + if not achi then + return + end + local aXml = {} + -- 成就名称 + table.insert(aXml, GetFormatText('[' .. achi.szName .. ']', 162, 255, 255, 0)) + -- 完成状态 + if dwID then + table.insert(aXml, GetFormatText(' ', 162, 255, 255, 255)) + local szStat, aProgressCounter = D.GetPlayerAchievementStat(dwID, dwAchieveID) + if szStat == 'FINISH' then + table.insert(aXml, GetFormatText(_L['(Finished)'] .. '\n', 162, 255, 255, 255)) + elseif szStat == 'PROGRESS' then + if X.IsEmpty(aProgressCounter) then + table.insert(aXml, GetFormatText(_L['(Progress)'] .. '\n', 162, 173, 173, 173)) + else + table.insert(aXml, GetFormatText('(', 162, 255, 255, 255)) + for i, progress in ipairs(aProgressCounter) do + local nTriggerVal = X.Get(X.GetAchievementInfo(progress.dwCounter), {'nTriggerVal'}, 1) + if i ~= 1 then + table.insert(aXml, GetFormatText(', ', 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(progress.nNumber .. '/' .. nTriggerVal, 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(')\n', 162, 255, 255, 255)) + end + else --if szStat == 'UNKNOWN' then + table.insert(aXml, GetFormatText(_L['(Unknown)'] .. '\n', 162, 255, 255, 255)) + end + else + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(_L('Achievement point: %d', D.GetAchievementPoint(dwAchieveID)) .. '\n', 162, 255, 128, 0)) + table.insert(aXml, GetFormatText(achi.szDesc .. '\n', 162, 255, 255, 255)) + -- 子成就 + for _, s in ipairs(X.SplitString(achi.szSubAchievements, '|', true)) do + local dwSubAchieveID = tonumber(s) + if dwSubAchieveID then + local achi = X.GetAchievement(dwSubAchieveID) + if dwID then + local szStat, aProgressCounter = D.GetPlayerAchievementStat(dwID, dwSubAchieveID) + if achi then + if szStat == 'FINISH' then + table.insert(aXml, GetFormatText(_L['r'], 162, 128, 255, 128)) + elseif szStat == 'PROGRESS' then + table.insert(aXml, GetFormatText(_L['x'], 162, 173, 173, 173)) + else --if szStat == 'UNKNOWN' then + table.insert(aXml, GetFormatText(_L['?'], 162, 173, 173, 173)) + end + table.insert(aXml, GetFormatText(' ', 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(achi.szName, 162, 255, 255, 255)) + if not X.IsEmpty(aProgressCounter) then + table.insert(aXml, GetFormatText(' (', 162, 255, 255, 255)) + for i, progress in ipairs(aProgressCounter) do + local nTriggerVal = X.Get(X.GetAchievementInfo(progress.dwCounter), {'nTriggerVal'}, 1) + if i ~= 1 then + table.insert(aXml, GetFormatText(', ', 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(progress.nNumber .. '/' .. nTriggerVal, 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText(')', 162, 255, 255, 255)) + end + table.insert(aXml, GetFormatText('\n', 162, 255, 255, 255)) + else + table.insert(aXml, GetFormatText(_L[' '] .. achi.szName .. '\n', 162, 255, 255, 255)) + end + end + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(table.concat(aXml), 450, {x, y, w, h}, X.UI.TIP_POSITION.TOP_BOTTOM) +end + +function D.UpdatePage(page) + X.UI(page):Fetch('Wnd_Total/WndAutocomplete_Map') + :Text(D.tMapName[D.dwMapID] or '', WNDEVENT_FIRETYPE.PREVENT) + + local hCols = page:Lookup('Wnd_Total/WndScroll_Stat', 'Handle_StatColumns') + hCols:Clear() + + local aCol, nX, Sorter = D.GetDispColumns(), 0, nil + for i, col in ipairs(aCol) do + local hCol = hCols:AppendItemFromData(page.hStatColumnData, 'Handle_StatColumn') + local hTitle = hCol:Lookup('Handle_Stat_Title') + local txt = hTitle:Lookup('Text_Stat_Title') + local imgAsc = hCol:Lookup('Image_Stat_Asc') + local imgDesc = hCol:Lookup('Image_Stat_Desc') + local nWidth, nHeight = col.nWidth, hCol:GetH() + local nSortDelta = nWidth > 70 and 25 or 15 + if i == 0 then + hCol:Lookup('Image_Stat_Break'):Hide() + end + hCol.col = col + hCol.achieveid = col.dwAchieveID + hCol:SetRelX(nX) + hCol:SetW(nWidth) + hTitle:SetRelX(3) + hTitle:SetSize(nWidth - 5, nHeight) + txt:SetText(col.szTitle) + txt:AutoSize() + if hTitle:GetW() < txt:GetW() and hTitle:GetW() > 80 then + txt:SetW(hTitle:GetW()) + end + txt:SetRelX(hTitle:GetW() > txt:GetW() and (hTitle:GetW() - txt:GetW()) / 2 or 0) + txt:SetRelY((hTitle:GetH() - txt:GetH()) / 2) + hTitle:FormatAllItemPos() + imgAsc:SetRelX(nWidth - nSortDelta) + imgDesc:SetRelX(nWidth - nSortDelta) + if D.szSort == col.id then + Sorter = function(r1, r2) + if D.szSortOrder == 'asc' then + return col.Compare(r1, r2) < 0 + end + return col.Compare(r1, r2) > 0 + end + end + imgAsc:SetVisible(D.szSort == col.id and D.szSortOrder == 'asc') + imgDesc:SetVisible(D.szSort == col.id and D.szSortOrder == 'desc') + hCol:FormatAllItemPos() + nX = nX + nWidth + end + hCols:FormatAllItemPos() + + local aRec = {} + local aMemberList = D.GetMemberList() + for _, tMember in ipairs(aMemberList) do + table.insert(aRec, { + id = tMember.dwID or tMember.szGlobalID, + name = tMember.szName, + force = tMember.dwForceID, + achi = (tMember.dwID and ACHIEVE_CACHE[tMember.dwID]) + or (tMember.szGlobalID and ACHIEVE_CACHE[tMember.szGlobalID]) + or X.CONSTANT.EMPTY_TABLE, + }) + end + + if Sorter then + table.sort(aRec, Sorter) + end + + local aCol = D.GetDispColumns() + local hList = page:Lookup('Wnd_Total/WndScroll_Stat', 'Handle_List') + hList:Clear() + for i, rec in ipairs(aRec) do + local hRow = hList:AppendItemFromData(page.hRowData, 'Handle_Row') + hRow.rec = rec + hRow:Lookup('Image_RowBg'):SetVisible(i % 2 == 1) + local nX = 0 + for j, col in ipairs(aCol) do + local hItem = hRow:AppendItemFromData(page.hItemData, 'Handle_Item') -- 外部居中层 + local hItemContent = hItem:Lookup('Handle_ItemContent') -- 内部文本布局层 + hItemContent:AppendItemFromString(col.GetFormatText(rec)) + hItemContent:SetW(99999) + hItemContent:FormatAllItemPos() + hItemContent:SetSizeByAllItemSize() + local nWidth = col.nWidth + hItem:SetRelX(nX) + hItem:SetW(nWidth) + hItemContent:SetRelPos((nWidth - hItemContent:GetW()) / 2, (hItem:GetH() - hItemContent:GetH()) / 2) + hItem:FormatAllItemPos() + nX = nX + nWidth + end + hRow:FormatAllItemPos() + end + hList:FormatAllItemPos() +end + +function D.DelayUpdatePage(page) + X.DelayCall('MY_TeamTools_Achievement__DelayUpdatePage', 200, function() + if X.IsElement(page) then + D.UpdatePage(page) + end + end) +end + +function D.SetSearch(szSearch) + D.szSearch = szSearch + D.UpdateAchievementID() +end + +function D.OnInitPage() + if not D.tMapMenu or not D.tMapName or not D.aMapName or not D.tMapID then + local tMapMenu, tMapName, aMapName = {}, {}, {} + table.insert(tMapMenu, { + szOption = _L['All map'], + fnAction = function() + D.dwMapID = 0 + D.UpdateSearchAC() + D.UpdateAchievementID() + D.RequestTeamData() + X.UI.ClosePopupMenu() + end, + }) + tMapName[0] = _L['All map'] + table.insert(aMapName, _L['All map']) + table.insert(tMapMenu, { + szOption = _L['Current map'], + fnAction = function() + D.dwMapID = X.GetClientPlayer().GetMapID() + D.UpdateSearchAC() + D.UpdateAchievementID() + D.RequestTeamData() + X.UI.ClosePopupMenu() + end, + }) + for _, group in ipairs(X.GetTypeGroupMap()) do + local tSub = { szOption = group.szGroup } + for _, info in ipairs(group.aMapInfo) do + table.insert(tSub, { + szOption = info.szName, + fnAction = function() + D.dwMapID = info.dwID + D.UpdateSearchAC() + D.UpdateAchievementID() + D.RequestTeamData() + X.UI.ClosePopupMenu() + end + }) + tMapName[info.dwID] = info.szName + table.insert(aMapName, info.szName) + end + table.insert(tMapMenu, tSub) + end + D.tMapMenu = tMapMenu + D.aMapName = aMapName + D.tMapName = tMapName + D.tMapID = X.FlipObjectKV(tMapName) + end + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_TeamTools_Achievement') + local wnd = frameTemp:Lookup('Wnd_Total') + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('WndScroll_Stat/Scroll_Stat_All')) + + local nX = 20 + nX = nX + X.UI(wnd):Append('WndAutocomplete', { + x = nX, y = 20, w = 250, h = 25, + name = 'WndAutocomplete_Map', + onChange = function(szText) + if D.tMapID[szText] then + D.dwMapID = D.tMapID[szText] + D.UpdateSearchAC() + D.UpdateAchievementID() + D.RequestTeamData() + end + end, + autocomplete = {{'option', 'source', D.aMapName}}, + menu = function() return D.tMapMenu end, + }):Width() + 5 + + nX = nX + X.UI(wnd):Append('WndAutocomplete', { + x = nX, y = 20, w = 200, h = 25, + name = 'WndAutocomplete_Search', + text = D.szSearch, + placeholder = _L['Search'], + onChange = function(szText) + X.Debounce( + 'MY_TeamTools_Achievement_Search', + 500, + D.SetSearch, + szText) + X.Debounce('MY_TeamTools_Achievement_RequestTeamData', 2000, D.RequestTeamData) + end, + autocomplete = {{'option', 'source', D.aSearchAC}}, + onClick = function() X.UI(this):Autocomplete('search', '') end, + onBlur = function() + D.RequestTeamData() + X.Debounce('MY_TeamTools_Achievement_RequestTeamData', false) + end, + }):Width() + 5 + + nX = nX + X.UI(wnd):Append('WndCheckBox', { + x = nX, y = 20, w = 200, + text = _L['Intelligent hide'], + checked = O.bIntelligentHide, + onCheck = function(bChecked) + O.bIntelligentHide = bChecked + D.UpdateAchievementID() + end, + tip = { + render = _L['Hide unimportant achievements'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + + X.UI(wnd):Append('WndButton', { + x = 960, y = 20, w = 120, + text = _L['Refresh'], + onClick = function() + D.RequestTeamData() + X.OutputSystemAnnounceMessage(_L['Team achievement request sent.']) + end, + }) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAM_TOOLS__ACHIEVE') + frame:RegisterEvent('MY_TEAM_TOOLS__ACHIEVE_SEARCH_AC') + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('NEW_ACHIEVEMENT') + frame:RegisterEvent('SYNC_ACHIEVEMENT_DATA') + frame:RegisterEvent('UPDATE_ACHIEVEMENT_POINT') + frame:RegisterEvent('UPDATE_ACHIEVEMENT_COUNT') + frame:RegisterEvent('PARTY_DELETE_MEMBER') + frame:RegisterEvent('PARTY_DISBAND') + frame:RegisterEvent('GLOBAL_ROOM_DETAIL_INFO') + frame:RegisterEvent('MY_TEAM_TOOLS__STAT_RANGE_CHANGE') + this.hRowData = frame:CreateItemData(SZ_INI, 'Handle_Row') + this.hItemData = frame:CreateItemData(SZ_INI, 'Handle_Item') + this.hStatColumnData = frame:CreateItemData(SZ_INI, 'Handle_StatColumn') +end + +function D.OnActivePage() + D.RequestTeamData() + D.UpdatePage(this) +end + +function D.OnEvent(event) + if event == 'MY_TEAM_TOOLS__ACHIEVE' then + D.DelayUpdatePage(this) + elseif event == 'MY_TEAM_TOOLS__ACHIEVE_SEARCH_AC' then + X.UI(this):Fetch('Wnd_Total/WndAutocomplete_Search'):Autocomplete('option', 'source', D.aSearchAC) + elseif event == 'ON_MY_MOSAICS_RESET' then + D.UpdatePage(this) + elseif event == 'NEW_ACHIEVEMENT' or event == 'SYNC_ACHIEVEMENT_DATA' + or event == 'UPDATE_ACHIEVEMENT_POINT' or event == 'UPDATE_ACHIEVEMENT_COUNT' + or event == 'PARTY_DELETE_MEMBER' or event == 'PARTY_DISBAND' + or event == 'GLOBAL_ROOM_DETAIL_INFO' + or event == 'MY_TEAM_TOOLS__STAT_RANGE_CHANGE' + then + D.UpdateSelfData() + D.DelayUpdatePage(this) + D.DelayRequestTeamData() + elseif event == 'PARTY_ADD_MEMBER' or event == 'PARTY_UPDATE_BASE_INFO' then + D.DelayRequestTeamData() + end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Clear' then + X.Confirm(_L['Clear record'], D.ClearAchievementLog) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Row' then + local AchievementPanel = _G.AchievementPanel or GetInsideEnv().AchievementPanel + if AchievementPanel then + AchievementPanel.Compare(this.rec.id) + end + elseif name == 'Handle_StatColumn' then + if IsCtrlKeyDown() then + if this.achieveid then + X.InsertChatInput('achievement', this.achieveid) + end + elseif this.col.id then + local page = this:GetParent():GetParent():GetParent():GetParent():GetParent() + if D.szSort == this.col.id then + D.szSortOrder = D.szSortOrder == 'asc' and 'desc' or 'asc' + else + D.szSort = this.col.id + end + D.UpdatePage(page) + end + elseif name == 'Text_Achieve' then + if not this.achieveid then + return + end + if IsCtrlKeyDown() then + if this.achieveid then + X.InsertChatInput('achievement', this.achieveid) + end + else + local AchievementPanel = _G.AchievementPanel or GetInsideEnv().AchievementPanel + if AchievementPanel then + AchievementPanel.Open(nil, this.achieveid) + end + end + end +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Handle_Row' then + D.OutputRowTip(this, this.rec) + elseif name == 'Handle_StatColumn' or name == 'Text_Achieve' then + if not this.achieveid then + return + end + D.OutputAchieveTip(this.achieveid, this.playerid) + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if szName == 'Handle_Achievement' then + if this and this:Lookup('Image_Cover') and this:Lookup('Image_Cover'):IsValid() then + this:Lookup('Image_Cover'):Hide() + end + end + HideTip() +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamTools_Achievement_Module', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + bStatRange = true, + }, + root = D, + }, + }, +} +MY_TeamTools.RegisterModule('Achievement', _L['MY_TeamTools_Achievement'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamTools_Achievement', + exports = { + { + fields = { + 'bIntelligentHide', + }, + root = O, + }, + { + preset = 'UIEvent', + root = D, + }, + }, + imports = { + { + fields = { + 'bIntelligentHide', + }, + root = O, + }, + }, +} +MY_TeamTools_Achievement = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools_DeathLog.lua b/MY_TeamTools/src/MY_TeamTools_DeathLog.lua new file mode 100644 index 000000000..4e8341723 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools_DeathLog.lua @@ -0,0 +1,463 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具 - 重伤记录 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools_DeathLog' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools_DeathLog' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_TeamTools_DeathLog.ini' +local SKILL_RESULT_TYPE = SKILL_RESULT_TYPE +local GetCurrentTime = GetCurrentTime +local MY_IsParty, MY_GetSkillName, MY_GetBuffName = X.IsTeammate, X.GetSkillName, X.GetBuffName + +local MAX_COUNT = 5 +local PLAYER_ID = 0 +local DAMAGE_LOG = {} +local DEATH_LOG = {} +local INFO_CACHE = {} +local RT_SELECT_DEATH + +local RT_SKILL_TYPE = { + [0] = 'PHYSICS_DAMAGE', + [1] = 'SOLAR_MAGIC_DAMAGE', + [2] = 'NEUTRAL_MAGIC_DAMAGE', + [3] = 'LUNAR_MAGIC_DAMAGE', + [4] = 'POISON_DAMAGE', + [5] = 'REFLECTIED_DAMAGE', + [6] = 'THERAPY', + [7] = 'STEAL_LIFE', + [8] = 'ABSORB_THERAPY', + [9] = 'ABSORB_DAMAGE', + [10] = 'SHIELD_DAMAGE', + [11] = 'PARRY_DAMAGE', + [12] = 'INSIGHT_DAMAGE', + [13] = 'EFFECTIVE_DAMAGE', + [14] = 'EFFECTIVE_THERAPY', + [15] = 'TRANSFER_LIFE', + [16] = 'TRANSFER_MANA', +} + +local function OnSkillEffectLog(dwCaster, dwTarget, nEffectType, dwSkillID, dwLevel, bCriticalStrike, nCount, tResult) + if not tResult[SKILL_RESULT_TYPE.REFLECTIED_DAMAGE] then -- 没有反弹的情况下 + if not X.IsPlayer(dwTarget) or not MY_IsParty(dwTarget) and dwTarget ~= PLAYER_ID then -- 目标不是队友也不是自己 + return + end + else + if not X.IsPlayer(dwCaster) or not MY_IsParty(dwCaster) and dwCaster ~= PLAYER_ID then -- 目标不是队友也不是自己 + return + end + end + local KCaster = X.IsPlayer(dwCaster) and X.GetPlayer(dwCaster) or X.GetNpc(dwCaster) + local KTarget = X.IsPlayer(dwTarget) and X.GetPlayer(dwTarget) or X.GetNpc(dwTarget) + + local szSkill = nEffectType == SKILL_EFFECT_TYPE.SKILL and MY_GetSkillName(dwSkillID, dwLevel) or MY_GetBuffName(dwSkillID, dwLevel) + -- 五类伤害 + if X.IsPlayer(dwTarget) + and tResult[SKILL_RESULT_TYPE.PHYSICS_DAMAGE] + or tResult[SKILL_RESULT_TYPE.SOLAR_MAGIC_DAMAGE] + or tResult[SKILL_RESULT_TYPE.NEUTRAL_MAGIC_DAMAGE] + or tResult[SKILL_RESULT_TYPE.LUNAR_MAGIC_DAMAGE] + or tResult[SKILL_RESULT_TYPE.POISON_DAMAGE] + then + local szCaster = X.GetTargetName(X.IsPlayer(dwCaster) and TARGET.PLAYER or TARGET.NPC, dwCaster, { eShowID = 'never' }) or _L['OUTER GUEST'] + local key = dwTarget == PLAYER_ID and 'self' or dwTarget + if not DAMAGE_LOG[key] then + DAMAGE_LOG[key] = {} + elseif DAMAGE_LOG[key][MAX_COUNT] then + DAMAGE_LOG[key][MAX_COUNT] = nil + end + table.insert(DAMAGE_LOG[key], 1, { + nCurrentTime = GetCurrentTime(), + szKiller = szCaster, + szSkill = szSkill .. (nEffectType == SKILL_EFFECT_TYPE.BUFF and '(BUFF)' or ''), + tResult = tResult, + bCriticalStrike = bCriticalStrike, + }) + end + -- 有反弹伤害 + if tResult[SKILL_RESULT_TYPE.REFLECTIED_DAMAGE] and X.IsPlayer(dwCaster) then + local szTarget = X.GetTargetName(X.IsPlayer(dwTarget) and TARGET.PLAYER or TARGET.NPC, dwTarget, { eShowID = 'never' }) or _L['OUTER GUEST'] + local key = dwCaster == PLAYER_ID and 'self' or dwCaster + if not DAMAGE_LOG[key] then + DAMAGE_LOG[key] = {} + elseif DAMAGE_LOG[key][MAX_COUNT] then + DAMAGE_LOG[key][MAX_COUNT] = nil + end + table.insert(DAMAGE_LOG[key], 1, { + nCurrentTime = GetCurrentTime(), + szKiller = szTarget, + szSkill = szSkill .. (nEffectType == SKILL_EFFECT_TYPE.BUFF and '(BUFF)' or ''), + tResult = tResult, + bCriticalStrike = bCriticalStrike, + }) + end +end + +-- 意外摔伤 会触发这个日志 +local function OnCommonHealthLog(dwCharacterID, nDeltaLife) + -- 过滤非玩家和治疗日志 + if not X.IsPlayer(dwCharacterID) or nDeltaLife >= 0 then + return + end + local p = X.GetPlayer(dwCharacterID) + if not p then + return + end + if MY_IsParty(dwCharacterID) or dwCharacterID == PLAYER_ID then + local key = dwCharacterID == PLAYER_ID and 'self' or dwCharacterID + if not DAMAGE_LOG[key] then + DAMAGE_LOG[key] = {} + elseif DAMAGE_LOG[key][MAX_COUNT] then + DAMAGE_LOG[key][MAX_COUNT] = nil + end + table.insert(DAMAGE_LOG[key], 1, { nCurrentTime = GetCurrentTime(), nCount = nDeltaLife * -1 }) + end +end + +local function OnSkill(dwCaster, dwSkillID, dwLevel) + local p = X.GetPlayer(dwCaster) + if not p then return end + + local key = dwCaster == PLAYER_ID and 'self' or dwCaster + if not DAMAGE_LOG[key] then + DAMAGE_LOG[key] = {} + elseif DAMAGE_LOG[key][MAX_COUNT] then + DAMAGE_LOG[key][MAX_COUNT] = nil + end + table.insert(DAMAGE_LOG[key], 1, { + nCurrentTime = GetCurrentTime(), + szKiller = p.szName, + szSkill = MY_GetSkillName(dwSkillID, dwLevel), + }) +end +-- 这里的szKiller有个很大的坑 +-- 因为策划不喜欢写模板名称 导致NPC名字全是空的 摔死和淹死也是空 +-- 这就特别郁闷 +local function OnDeath(dwID, dwKiller) + if X.IsPlayer(dwID) and (MY_IsParty(dwID) or dwID == PLAYER_ID) then + local key = dwID == PLAYER_ID + and 'self' + or dwID + if not DEATH_LOG[key] then + DEATH_LOG[key] = {} + end + if not INFO_CACHE[dwID] then + if key == 'self' then + local me = X.GetClientPlayer() + INFO_CACHE[dwID] = { + szName = me.szName, + dwForceID = me.dwForceID, + dwKungfuID = UI_GetPlayerMountKungfuID(), + dwActualKungfuID = UI_GetPlayerMountKungfuID(), + } + else + local team = GetClientTeam() + local info = X.GetTeamMemberInfo(dwID) + if info then + INFO_CACHE[dwID] = { + szName = info.szName, + dwForceID = info.dwForceID, + dwKungfuID = info.dwActualKungfuID, + dwActualKungfuID = info.dwActualKungfuID, + } + end + end + end + local szKiller = X.GetTargetName(X.IsPlayer(dwKiller) and TARGET.PLAYER or TARGET.NPC, dwKiller, { eShowID = 'never' }) + table.insert(DEATH_LOG[key], { + nCurrentTime = GetCurrentTime(), + data = DAMAGE_LOG[key] or { szCaster = szKiller }, + szKiller = szKiller, + }) + DAMAGE_LOG[key] = nil + FireUIEvent('MY_TEAMTOOLS_DEATHLOG', key) + end +end + +X.RegisterEvent('LOADING_END', function() + DAMAGE_LOG = {} + PLAYER_ID = X.GetClientPlayerID() +end) + +X.RegisterEvent('SYS_MSG', function() + if arg0 == 'UI_OME_DEATH_NOTIFY' then -- 死亡记录 + OnDeath(arg1, arg2) + elseif arg0 == 'UI_OME_SKILL_EFFECT_LOG' then -- 技能记录 + OnSkillEffectLog(arg1, arg2, arg4, arg5, arg6, arg7, arg8, arg9) + elseif arg0 == 'UI_OME_COMMON_HEALTH_LOG' then + OnCommonHealthLog(arg1, arg2) + end +end) + +X.RegisterEvent('DO_SKILL_CAST', function() + if arg1 == 608 and X.IsPlayer(arg0) then -- 自觉经脉 + OnSkill(arg0, arg1, arg2) + end +end) + +function D.ClearDeathLog() + DEATH_LOG = {} + INFO_CACHE = {} + FireUIEvent('MY_TEAMTOOLS_DEATHLOG') +end + +-- 重伤记录 +function D.UpdatePage(page) + local hDeathList = page:Lookup('Wnd_DeathLog/Scroll_Player_List', '') + local me = X.GetClientPlayer() + local team = GetClientTeam() + local aList = {} + for k, v in pairs(DEATH_LOG) do + table.insert(aList, { + dwID = k, + nCount = #v, + }) + end + table.sort(aList, function(a, b) return a.nCount > b.nCount end) + hDeathList:Clear() + for _, v in ipairs(aList) do + local dwID = v.dwID == 'self' and me.dwID or v.dwID + local info = INFO_CACHE[dwID] + if info then + local h = hDeathList:AppendItemFromData(page.hDeathPlayer, 'Handle_DeathPlayer') + local icon = select(2, MY_GetSkillName(info.dwActualKungfuID)) + local szName = info.szName + h.dwID = dwID + h.szName = szName + h:Lookup('Image_DeathIcon'):FromIconID(icon) + h:Lookup('Text_DeathName'):SetText(szName) + h:Lookup('Text_DeathName'):SetFontColor(X.GetForceColor(info.dwForceID)) + h:Lookup('Text_DeathCount'):SetText(v.nCount) + h:Lookup('Image_Select'):SetVisible(dwID == RT_SELECT_DEATH) + end + end + hDeathList:FormatAllItemPos() + D.UpdateList(page, RT_SELECT_DEATH) +end + +function D.OnShowDeathInfo() + local dwID, i = this:GetName():match('(%d+)_(%d+)') + if dwID then + dwID, i = tonumber(dwID), tonumber(i) + else + dwID = 'self' + i = tonumber(this:GetName():match('self_(%d+)')) + end + local tDeath = DEATH_LOG + if tDeath[dwID] and tDeath[dwID][i] then + local tab = tDeath[dwID][i] + local xml = {} + table.insert(xml, GetFormatText(_L['Last 5 skill damage'] .. '\n\n' , 59)) + for k, v in ipairs(tab.data) do + if v.szKiller then + table.insert(xml, GetFormatText(v.szKiller .. g_tStrings.STR_COLON, 41, 255, 128, 0)) + else + table.insert(xml, GetFormatText(_L['OUTER GUEST'] .. g_tStrings.STR_COLON, 41, 255, 128, 0)) + end + if v.szSkill then + table.insert(xml, GetFormatText(v.szSkill .. (v.bCriticalStrike and g_tStrings.STR_SKILL_CRITICALSTRIKE or ''), 41, 255, 128, 0)) + else + table.insert(xml, GetFormatText(g_tStrings.STR_UNKOWN_SKILL, 41, 255, 128, 0)) + end + local t = TimeToDate(v.nCurrentTime) + table.insert(xml, GetFormatText('\t' .. string.format('%02d:%02d:%02d', t.hour, t.minute, t.second), 41)) + if v.tResult then + for kk, vv in pairs(v.tResult) do + if vv > 0 then + table.insert(xml, GetFormatText(_L[RT_SKILL_TYPE[kk]] .. g_tStrings.STR_COLON, 157)) + table.insert(xml, GetFormatText(vv .. '\n', 41)) + end + end + elseif v.nCount then + table.insert(xml, GetFormatText(_L['EFFECTIVE_DAMAGE'] .. g_tStrings.STR_COLON, 157)) + table.insert(xml, GetFormatText(v.nCount .. '\n', 41)) + end + end + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + OutputTip(table.concat(xml), 400, { x, y, w, h }) + end +end + +function D.OnAppendEdit() + local handle = this:GetParent() + local edit = X.GetChatInput() + edit:ClearText() + for i = this:GetIndex(), handle:GetItemCount() do + local h = handle:Lookup(i) + local szText = h:GetText() + if szText == '\n' then + break + end + if h:GetName() == 'namelink' then + edit:InsertObj(szText, { type = 'name', text = szText, name = string.sub(szText, 2, -2) }) + else + edit:InsertObj(szText, { type = 'text', text = szText }) + end + end + Station.SetFocusWindow(edit) +end + +function D.UpdateList(page, dwID) + local hDeathMsg = page:Lookup('Wnd_DeathLog/Scroll_Death_Info', '') + local me = X.GetClientPlayer() + local team = GetClientTeam() + local aRec = {} + local key = dwID == me.dwID and 'self' or dwID + local aDeathLog = X.Clone(DEATH_LOG) + for k, v in pairs(aDeathLog) do + if not dwID or k == key then + for kk, vv in ipairs(v) do + if k == 'self' then + vv.dwID = me.dwID + else + vv.dwID = k + end + vv.nIndex = kk + table.insert(aRec, vv) + end + end + end + table.sort(aRec, function(a, b) return a.nCurrentTime > b.nCurrentTime end) + hDeathMsg:Clear() + for _, data in ipairs(aRec) do + local info = INFO_CACHE[data.dwID] + if info then + local key = data.dwID == me.dwID and 'self' or data.dwID + local t = TimeToDate(data.nCurrentTime) + local xml = {} + table.insert(xml, GetFormatText(_L[' * '] .. string.format('[%02d:%02d:%02d]', t.hour, t.minute, t.second), 10, 255, 255, 255, 16, 'this.OnItemLButtonClick = MY_TeamTools_DeathLog.OnAppendEdit')) + local r, g, b = X.GetForceColor(info.dwForceID) + table.insert(xml, GetFormatText('[' .. info.szName ..']', 10, r, g, b, 16, 'this.OnItemLButtonClick = function() OnItemLinkDown(this) end', 'namelink')) + table.insert(xml, GetFormatText(g_tStrings.TRADE_BE, 10, 255, 255, 255)) + if data.szKiller == '' and data.data[1].szKiller ~= '' then + table.insert(xml, GetFormatText('[' .. _L['OUTER GUEST'] .. g_tStrings.STR_OR .. data.data[1].szKiller ..']', 10, 13, 150, 70, 256, 'this.OnItemMouseEnter = MY_TeamTools_DeathLog.OnShowDeathInfo', key .. '_' .. data.nIndex)) + else + table.insert(xml, GetFormatText('[' .. (data.szKiller ~= '' and data.szKiller or _L['OUTER GUEST']) ..']', 10, 255, 128, 0, 256, 'this.OnItemMouseEnter = MY_TeamTools_DeathLog.OnShowDeathInfo', key .. '_' .. data.nIndex)) + end + table.insert(xml, GetFormatText(g_tStrings.STR_KILL .. g_tStrings.STR_FULL_STOP, 10, 255, 255, 255)) + table.insert(xml, GetFormatText('\n')) + hDeathMsg:AppendItemFromString(table.concat(xml)) + end + end + hDeathMsg:FormatAllItemPos() +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_TeamTools_DeathLog') + local wnd = frameTemp:Lookup('Wnd_DeathLog') + wnd:Lookup('Btn_All', 'Text_BtnAll'):SetText(_L['Show all']) + wnd:Lookup('Btn_Clear', 'Text_BtnClear'):SetText(_L['Clear record']) + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('Btn_All')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Btn_Clear')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Scroll_Player_List/ScrolBarl_Player_All_0')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Scroll_Death_Info/ScrolBarl_Player_All_0_0')) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAMTOOLS_DEATHLOG') + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + this.hDeathPlayer = frame:CreateItemData(SZ_INI, 'Handle_Item_DeathPlayer') +end + +function D.OnActivePage() + D.UpdatePage(this) +end + +function D.OnEvent(event) + if event == 'MY_TEAMTOOLS_DEATHLOG' then + D.UpdatePage(this) + elseif event == 'ON_MY_MOSAICS_RESET' then + D.UpdatePage(this) + end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_All' then + RT_SELECT_DEATH = nil + D.UpdatePage(this:GetParent():GetParent()) + elseif szName == 'Btn_Clear' then + X.Confirm(_L['Clear record'], D.ClearDeathLog) + end +end + +function D.OnItemLButtonClick() + local szName = this:GetName() + if szName == 'Handle_DeathPlayer' then + if IsCtrlKeyDown() then + X.EditBox_AppendLinkPlayer(this.szName) + else + RT_SELECT_DEATH = this.dwID + D.UpdatePage(this:GetParent():GetParent():GetParent():GetParent()) + end + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if szName == 'Handle_DeathPlayer' then + if this and this:Lookup('Image_Cover') and this:Lookup('Image_Cover'):IsValid() then + this:Lookup('Image_Cover'):Hide() + end + end + HideTip() +end + +-- Module exports +do +local settings = { + name = 'MY_TeamTools_DeathLog_Module', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + }, + root = D, + }, + }, +} +MY_TeamTools.RegisterModule('DeathLog', _L['MY_TeamTools_DeathLog'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamTools_DeathLog', + exports = { + { + preset = 'UIEvent', + fields = { + OnShowDeathInfo = D.OnShowDeathInfo, + OnAppendEdit = D.OnAppendEdit, + }, + root = D, + }, + }, +} +MY_TeamTools_DeathLog = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools_EnterMap.lua b/MY_TeamTools/src/MY_TeamTools_EnterMap.lua new file mode 100644 index 000000000..14f30a9cd --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools_EnterMap.lua @@ -0,0 +1,314 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具 - 过图记录 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools_EnterMap' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools_EnterMap' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = {} +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_TeamTools_EnterMap.ini' + +local PLAYER_ID = 0 +local ENTER_MAP_LOG = { RAID = {}, ROOM = {} } +local INFO_CACHE = { RAID = {}, ROOM = {} } +local RT_SELECT_MAP + +function D.ClearEnterMapLog() + ENTER_MAP_LOG = { RAID = {}, ROOM = {} } + INFO_CACHE = { RAID = {}, ROOM = {} } + FireUIEvent('MY_TEAMTOOLS_ENTERMAP') +end + +X.RegisterEvent('LOADING_END', function() + PLAYER_ID = X.GetClientPlayerID() +end) + +X.RegisterBgMsg('MY_ENTER_MAP', function(_, aData, nChannel, dwTalkerID, szTalkerName, bSelf) + local dwMapID, dwSubID, aMapCopy, dwTime, dwSwitchTime, nCopyIndex = aData[1], aData[2], aData[3], aData[4], aData[5], aData[6] + local tInfoCache, aEnterMapLog = {}, {} + if nChannel == PLAYER_TALK_CHANNEL.RAID then + aEnterMapLog = ENTER_MAP_LOG.RAID + tInfoCache = INFO_CACHE.RAID + elseif nChannel == PLAYER_TALK_CHANNEL.ROOM then + aEnterMapLog = ENTER_MAP_LOG.ROOM + tInfoCache = INFO_CACHE.ROOM + end + local key = dwTalkerID == PLAYER_ID + and 'self' + or dwTalkerID + if not tInfoCache[dwTalkerID] then + if key == 'self' then + local me = X.GetClientPlayer() + tInfoCache[dwTalkerID] = { + szName = me.szName, + dwForceID = me.dwForceID, + dwKungfuID = UI_GetPlayerMountKungfuID(), + } + else + local team = GetClientTeam() + local info = X.GetTeamMemberInfo(dwTalkerID) + if info then + tInfoCache[dwTalkerID] = { + szName = info.szName, + dwForceID = info.dwForceID, + dwKungfuID = info.dwActualKungfuID, + } + end + end + end + if not dwTime then + dwTime = GetCurrentTime() + end + if not dwSwitchTime then + dwSwitchTime = dwTime + end + if not nCopyIndex then + nCopyIndex = 0 + end + for i, v in X.ipairs_r(aEnterMapLog) do -- 删除重复发送的过图 + if v.dwID == key and v.dwMapID == dwMapID and v.dwSubID == dwSubID and v.dwTime == dwTime then + table.remove(aEnterMapLog, i) + end + end + table.insert(aEnterMapLog, { + dwID = key, + szName = szTalkerName, + dwMapID = dwMapID, + dwSubID = dwSubID, + aMapCopy = aMapCopy, + dwTime = dwTime, + dwSwitchTime = dwSwitchTime, + nCopyIndex = nCopyIndex, + }) + FireUIEvent('MY_TEAMTOOLS_ENTERMAP', key) +end) + +-- 重伤记录 +function D.UpdatePage(page) + local tInfoCache, aEnterMapLog = {}, {} + if MY_TeamTools.szStatRange == 'RAID' then + tInfoCache = INFO_CACHE.RAID + aEnterMapLog = ENTER_MAP_LOG.RAID + elseif MY_TeamTools.szStatRange == 'ROOM' then + tInfoCache = INFO_CACHE.ROOM + aEnterMapLog = ENTER_MAP_LOG.ROOM + end + local hDeathList = page:Lookup('Wnd_EnterMap/Scroll_Player_List', '') + local aList, tList = {}, {} + for _, v in ipairs(aEnterMapLog) do + if tList[v.dwMapID] then + tList[v.dwMapID].nCount = tList[v.dwMapID].nCount + 1 + else + table.insert(aList, { + dwMapID = v.dwMapID, + nCount = 1, + }) + tList[v.dwMapID] = aList[#aList] + end + end + table.sort(aList, function(a, b) return a.nCount > b.nCount end) + hDeathList:Clear() + for _, v in ipairs(aList) do + local map = X.GetMapInfo(v.dwMapID) + if map then + local h = hDeathList:AppendItemFromData(page.hEnterMap, 'Handle_EnterMap') + h.dwID = v.dwMapID + h:Lookup('Text_DeathName'):SetText(map.szName) + h:Lookup('Text_DeathCount'):SetText(v.nCount) + h:Lookup('Image_Select'):SetVisible(v.dwMapID == RT_SELECT_MAP) + end + end + hDeathList:FormatAllItemPos() + D.UpdateList(page, RT_SELECT_MAP) +end + +function D.OnAppendEdit() + local handle = this:GetParent() + local edit = X.GetChatInput() + edit:ClearText() + for i = this:GetIndex(), handle:GetItemCount() do + local h = handle:Lookup(i) + local szText = h:GetText() + if szText == '\n' then + break + end + if h:GetName() == 'namelink' then + edit:InsertObj(szText, { type = 'name', text = szText, name = string.sub(szText, 2, -2) }) + else + edit:InsertObj(szText, { type = 'text', text = szText }) + end + end + Station.SetFocusWindow(edit) +end + +function D.UpdateList(page, dwMapID) + local tInfoCache, aEnterMapLog = {}, {} + if MY_TeamTools.szStatRange == 'RAID' then + tInfoCache = INFO_CACHE.RAID + aEnterMapLog = ENTER_MAP_LOG.RAID + elseif MY_TeamTools.szStatRange == 'ROOM' then + tInfoCache = INFO_CACHE.ROOM + aEnterMapLog = ENTER_MAP_LOG.ROOM + end + local hDeathMsg = page:Lookup('Wnd_EnterMap/Scroll_Death_Info', '') + local me = X.GetClientPlayer() + local team = GetClientTeam() + local aRec = {} + local aEnterMapLog = X.Clone(aEnterMapLog) + for _, v in ipairs(aEnterMapLog) do + if not dwMapID or v.dwMapID == dwMapID then + if v.dwID == 'self' then + v.dwID = me.dwID + end + table.insert(aRec, v) + end + end + table.sort(aRec, function(a, b) return a.dwSwitchTime < b.dwSwitchTime end) + hDeathMsg:Clear() + for _, data in ipairs(aRec) do + local info = tInfoCache[data.dwID] + local map = X.GetMapInfo(data.dwMapID) + if map then + local aXml = {} + local t = TimeToDate(data.dwSwitchTime or data.dwTime) + table.insert(aXml, GetFormatText(_L[' * '] .. string.format('[%02d:%02d:%02d]', t.hour, t.minute, t.second), 10, 255, 255, 255, 16, 'this.OnItemLButtonClick = MY_TeamTools_EnterMap.OnAppendEdit')) + local r, g, b = X.GetForceColor(info.dwForceID) + table.insert(aXml, GetFormatText('[' .. data.szName ..']', 10, r, g, b, 16, 'this.OnItemLButtonClick = function() OnItemLinkDown(this) end', 'namelink')) + table.insert(aXml, GetFormatText(_L(' enter map %s', map.szName))) + if X.IsDungeonMap(data.dwMapID) then + if not X.IsEmpty(data.nCopyIndex) then + table.insert(aXml, GetFormatText(_L(', copy id is %s', data.nCopyIndex))) + end + if not X.IsEmpty(data.aMapCopy) then + table.insert(aXml, GetFormatText(_L(', copy cd is %s', table.concat(data.aMapCopy, ',')))) + end + end + table.insert(aXml, GetFormatText(_L['.'])) + table.insert(aXml, GetFormatText('\n')) + hDeathMsg:AppendItemFromString(table.concat(aXml)) + end + end + hDeathMsg:FormatAllItemPos() +end + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_TeamTools_EnterMap') + local wnd = frameTemp:Lookup('Wnd_EnterMap') + wnd:Lookup('Btn_All', 'Text_BtnAll'):SetText(_L['Show all']) + wnd:Lookup('Btn_Clear', 'Text_BtnClear'):SetText(_L['Clear record']) + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('Btn_All')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Btn_Clear')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Scroll_Player_List/ScrolBarl_Player_All_0')) + X.UI.AdaptComponentAppearance(wnd:Lookup('Scroll_Death_Info/ScrolBarl_Player_All_0_0')) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_TEAMTOOLS_ENTERMAP') + frame:RegisterEvent('ON_MY_MOSAICS_RESET') + frame:RegisterEvent('MY_TEAM_TOOLS__STAT_RANGE_CHANGE') + this.hEnterMap = frame:CreateItemData(SZ_INI, 'Handle_Item_EnterMap') +end + +function D.OnActivePage() + D.UpdatePage(this) +end + +function D.OnEvent(event) + if event == 'MY_TEAMTOOLS_ENTERMAP' then + D.UpdatePage(this) + elseif event == 'ON_MY_MOSAICS_RESET' then + D.UpdatePage(this) + elseif event == 'MY_TEAM_TOOLS__STAT_RANGE_CHANGE' then + D.UpdatePage(this) + end +end + +function D.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_All' then + if IsCtrlKeyDown() or IsShiftKeyDown() then + X.SendBgMsg(PLAYER_TALK_CHANNEL.RAID, 'MY_ENTER_MAP_REQ', nil, true) + X.SendBgMsg(PLAYER_TALK_CHANNEL.ROOM, 'MY_ENTER_MAP_REQ', nil, true) + else + RT_SELECT_MAP = nil + D.UpdatePage(this:GetParent():GetParent()) + end + elseif szName == 'Btn_Clear' then + X.Confirm(_L['Clear record'], D.ClearEnterMapLog) + end +end + +function D.OnItemLButtonClick() + local szName = this:GetName() + if szName == 'Handle_EnterMap' then + RT_SELECT_MAP = this.dwID + D.UpdatePage(this:GetParent():GetParent():GetParent():GetParent()) + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if szName == 'Handle_EnterMap' then + if this and this:Lookup('Image_Cover') and this:Lookup('Image_Cover'):IsValid() then + this:Lookup('Image_Cover'):Hide() + end + end + HideTip() +end + +-- Module exports +do +local settings = { + name = 'MY_TeamTools_EnterMap_Module', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + bStatRange = true, + }, + root = D, + }, + }, +} +MY_TeamTools.RegisterModule('EnterMap', _L['MY_TeamTools_EnterMap'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_TeamTools_EnterMap', + exports = { + { + preset = 'UIEvent', + fields = { + OnAppendEdit = D.OnAppendEdit, + }, + root = D, + }, + }, +} +MY_TeamTools_EnterMap = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_TeamTools_Summary.lua b/MY_TeamTools/src/MY_TeamTools_Summary.lua new file mode 100644 index 000000000..79884a8b4 --- /dev/null +++ b/MY_TeamTools/src/MY_TeamTools_Summary.lua @@ -0,0 +1,1308 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 团队工具 - 团队概况 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_TeamTools_Summary' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools_Summary' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local D = { + tAnchor = {}, + tDamage = {}, + tDeath = {}, +} +local SZ_INI = X.PACKET_INFO.ROOT .. 'MY_TeamTools/ui/MY_TeamTools_Summary.ini' +local MY_IsParty, MY_GetSkillName, MY_GetBuffName = X.IsTeammate, X.GetSkillName, X.GetBuffName + +local RT_EQUIP_TOTAL = { + 'MELEE_WEAPON', -- 轻剑 藏剑取 BIG_SWORD 重剑 + 'RANGE_WEAPON', -- 远程武器 + 'CHEST', -- 衣服 + 'HELM', -- 帽子 + 'AMULET', -- 项链 + 'LEFT_RING', -- 戒指 + 'RIGHT_RING', -- 戒指 + 'WAIST', -- 腰带 + 'PENDANT', -- 腰坠 + 'PANTS', -- 裤子 + 'BOOTS', -- 鞋子 + 'BANGLE', -- 护腕 +} + +local RT_SKILL_TYPE = { + [0] = 'PHYSICS_DAMAGE', + [1] = 'SOLAR_MAGIC_DAMAGE', + [2] = 'NEUTRAL_MAGIC_DAMAGE', + [3] = 'LUNAR_MAGIC_DAMAGE', + [4] = 'POISON_DAMAGE', + [5] = 'REFLECTIED_DAMAGE', + [6] = 'THERAPY', + [7] = 'STEAL_LIFE', + [8] = 'ABSORB_THERAPY', + [9] = 'ABSORB_DAMAGE', + [10] = 'SHIELD_DAMAGE', + [11] = 'PARRY_DAMAGE', + [12] = 'INSIGHT_DAMAGE', + [13] = 'EFFECTIVE_DAMAGE', + [14] = 'EFFECTIVE_THERAPY', + [15] = 'TRANSFER_LIFE', + [16] = 'TRANSFER_MANA', +} +-- 秘境评分 晚点在做吧 +-- local RT_DUNGEON_TOTAL = {} +local RT_SCORE = { + Equip = _L['Equip score'], + Buff = _L['Buff score'], + Food = _L['Food score'], + Enchant = _L['Enchant score'], + Special = _L['Special equip score'], +} + +local RT_EQUIP_SPECIAL = { + MELEE_WEAPON = true, + BIG_SWORD = true, + AMULET = true, + PENDANT = true +} + +local RT_FOOD_TYPE = { + [24] = true, + [17] = true, + [18] = true, + [19] = true, + [20] = true +} +-- 需要监控的BUFF +local RT_BUFF_ID = { + -- 常规职业BUFF + [362] = true, + [673] = true, + [112] = true, + [382] = true, + [2837] = true, + -- 红篮球 + [6329] = true, + [6330] = true, + -- 帮会菜盘 + [2564] = true, + [2563] = true, + -- 七秀扇子 + [3098] = true, + -- 缝针 / 凤凰谷 + [2313] = true, + [5970] = true, +} +local RT_GZ_BUFF_ID = 3219 -- 共战江湖 +-- default sort +local RT_SORT_MODE = 'DESC' +local RT_SORT_FIELD = 'nEquipScore' +local RT_MAP_ID = 0 +local RT_PLAYER_MAP_COPY_ID = {} +local RT_MAP_CD_PROGRESS = {} +local RT_GLOBAL_ID_TO_ID = {} +local RT_SELECT_PAGE = 0 +local RT_SELECT_KUNGFU +local RT_SELECT_DEATH +-- +local RT_SCORE_FULL = 30000 + +function D.UpdateDungeonInfo(hDungeon) + local me = X.GetClientPlayer() + local szText = Table_GetMapName(RT_MAP_ID) + if me.GetMapID() == RT_MAP_ID and X.IsDungeonMap(RT_MAP_ID) then + szText = szText .. '\n' .. 'ID:(' .. me.GetScene().nCopyIndex ..')' + else + local tCD = X.GetMapSaveCopy() + if tCD and tCD[RT_MAP_ID] then + szText = szText .. '\n' .. 'ID:(' .. tCD[RT_MAP_ID][1] ..')' + end + end + hDungeon:Lookup('Text_Dungeon'):SetText(szText) +end + +function D.GetPlayerView() + return Station.Lookup('Normal/PlayerView') +end + +-- 打开查看装备界面 +function D.OpenOtherCharacterPanel(page, dwID, dwServerID, szGlobalID) + local me = X.GetClientPlayer() + if dwID then + if dwID == me.dwID then + return + end + page.tViewInvite[dwID] = true + X.ViewOtherPlayerByID(dwID) + end + if dwServerID and szGlobalID then + if szGlobalID == me.GetGlobalID() then + return + end + page.tViewInvite[szGlobalID] = dwServerID + X.ViewOtherPlayerByGlobalID(dwServerID, szGlobalID) + end +end + +-- 分数计算 +function D.CountScore(tab, tScore) + tScore.Food = tScore.Food + #tab.tFood * 100 + tScore.Buff = tScore.Buff + #tab.tBuff * 20 + if tab.nEquipScore then + tScore.Equip = tScore.Equip + tab.nEquipScore + end + if tab.tTemporaryEnchant then + tScore.Enchant = tScore.Enchant + #tab.tTemporaryEnchant * 300 + end + if tab.tPermanentEnchant then + tScore.Enchant = tScore.Enchant + #tab.tPermanentEnchant * 100 + end + if tab.tEquip then + for k, v in ipairs(tab.tEquip) do + tScore.Special = tScore.Special + v.nLevel * 0.15 * v.nQuality + end + end +end +-- 排序计算 +function D.CalculateSort(tInfo) + local nCount = -2 + if RT_SORT_FIELD == 'tBossKill' then + if X.IsCDProgressMap(RT_MAP_ID) then + nCount = 0 + for _, p in ipairs(tInfo[RT_SORT_FIELD]) do + if p then + nCount = nCount + 100 + else + nCount = nCount + 1 + end + end + else + nCount = tInfo.nCopyID or math.huge + end + elseif tInfo[RT_SORT_FIELD] then + if type(tInfo[RT_SORT_FIELD]) == 'table' then + nCount = #tInfo[RT_SORT_FIELD] + else + nCount = tInfo[RT_SORT_FIELD] + end + end + if nCount == 0 and not tInfo.bOnline then + nCount = -2 + end + return nCount +end +function D.Sorter(a, b) + local nCountA = D.CalculateSort(a) + local nCountB = D.CalculateSort(b) + + if RT_SORT_MODE == 'ASC' then -- 升序 + return nCountA < nCountB + else + return nCountA > nCountB + end +end +-- 更新UI 没什么特殊情况 不要clear +function D.UpdateList(page) + local me = X.GetClientPlayer() + if not me then return end + local aTeam, tKungfu = D.GetTeamData(page), {} + local tScore = { + Equip = 0, + Buff = 0, + Food = 0, + Enchant = 0, + Special = 0, + } + table.sort(aTeam, D.Sorter) + + for k, v in ipairs(aTeam) do + -- 心法统计 + tKungfu[v.dwKungfuID] = tKungfu[v.dwKungfuID] or {} + table.insert(tKungfu[v.dwKungfuID], v) + D.CountScore(v, tScore) + if not RT_SELECT_KUNGFU or (RT_SELECT_KUNGFU and v.dwKungfuID == RT_SELECT_KUNGFU) then + local szName = 'P' .. (v.szGlobalID or v.dwID) + local h = page.hPlayerList:Lookup(szName) + if not h then + h = page.hPlayerList:AppendItemFromData(page.hItemDataPlayer) + h.bPlayerItem = true + end + h:SetUserData(k) + h:SetName(szName) + h.dwID = v.dwID + h.dwServerID = v.dwServerID + h.szGlobalID = v.szGlobalID + h.szName = v.szName + -- 心法名字 + if v.dwKungfuID and v.dwKungfuID ~= 0 then + local nIcon = select(2, MY_GetSkillName(v.dwKungfuID, 1)) + h:Lookup('Image_Icon'):FromIconID(nIcon) + else + h:Lookup('Image_Icon'):FromUITex(GetForceImage(v.dwForceID)) + end + h:Lookup('Text_Name'):SetText(v.szName) + h:Lookup('Text_Name'):SetFontColor(X.GetForceColor(v.dwForceID)) + -- 药品和BUFF + if not h['hHandle_Food'] then + h['hHandle_Food'] = { + self = h:Lookup('Handle_Food'), + Pool = X.UI.HandlePool(h:Lookup('Handle_Food'), 'w=29 h=29 eventid=784') + } + end + if not h['hHandle_Equip'] then + h['hHandle_Equip'] = { + self = h:Lookup('Handle_Equip'), + Pool = X.UI.HandlePool(h:Lookup('Handle_Equip'), 'w=29 h=29 eventid=784') + } + end + local hBuff = h:Lookup('Box_Buff') + local hBox = h:Lookup('Box_Grandpa') + if not v.bOnline then + h.hHandle_Equip.Pool:Clear() + h:Lookup('Text_Toofar1'):Show() + h:Lookup('Text_Toofar1'):SetText(g_tStrings.STR_GUILD_OFFLINE) + end + if not v.KPlayer then + h.hHandle_Food.Pool:Clear() + h:Lookup('Text_Toofar1'):Show() + if MY_TeamTools.szStatRange == 'ROOM' then + h:Lookup('Text_Toofar1'):SetText('-') + elseif v.bOnline then + h:Lookup('Text_Toofar1'):SetText(_L['Too far']) + end + hBuff:Hide() + hBox:Hide() + else + hBuff:Show() + hBox:Show() + h:Lookup('Text_Toofar1'):Hide() + -- 小药UI处理 + local handle_food = h.hHandle_Food.self + for kk, vv in ipairs(v.tFood) do + local szName = vv.dwID .. '_' .. vv.nLevel + local nIcon = select(2, MY_GetBuffName(vv.dwID, vv.nLevel)) + local box = handle_food:Lookup(szName) + if not box then + box = h.hHandle_Food.Pool:New() + end + box:SetName(szName) + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN, vv.dwID, vv.nLevel, vv.nEndFrame) + box:SetObjectIcon(nIcon) + box.OnItemRefreshTip = function() + local dwID, nLevel, nEndFrame = select(2, this:GetObject()) + local nTime = (nEndFrame - GetLogicFrameCount()) / 16 + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + X.OutputBuffTip({ x, y, w, h }, dwID, nLevel, nTime) + end + local nTime = (vv.nEndFrame - GetLogicFrameCount()) / 16 + if nTime < 480 then + box:SetAlpha(80) + else + box:SetAlpha(255) + end + box:Show() + end + for i = 0, handle_food:GetItemCount() - 1, 1 do + local item = handle_food:Lookup(i) + if item and not item.bFree then + local dwID, nLevel, nEndFrame = select(2, item:GetObject()) + if dwID and nLevel then + if not X.GetBuff(v.KPlayer, dwID, nLevel) then + h.hHandle_Food.Pool:Remove(item) + end + end + end + end + handle_food:FormatAllItemPos() + -- BUFF UI处理 + if v.tBuff and #v.tBuff > 0 then + hBuff:EnableObject(true) + hBuff:SetOverTextPosition(0, ITEM_POSITION.RIGHT_BOTTOM) + hBuff:SetOverTextFontScheme(1, 197) + hBuff:SetOverText(1, #v.tBuff) + hBuff.OnItemMouseEnter = function() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local xml = {} + for k, v in ipairs(v.tBuff) do + local nIcon = select(2, MY_GetBuffName(v.dwID, v.nLevel)) + local nTime = (v.nEndFrame - GetLogicFrameCount()) / 16 + local nAlpha = nTime < 600 and 80 or 255 + table.insert(xml, ' path="fromiconid" frame=' .. nIcon ..' alpha=' .. nAlpha .. ' w=30 h=30 ') + end + OutputTip(table.concat(xml), 250, { x, y, w, h }) + end + else + hBuff:SetOverText(1, '') + hBuff:EnableObject(false) + end + if v.bGrandpa then + hBox:EnableObject(true) + hBox.OnItemMouseEnter = function() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local kBuff = X.GetBuff(v.KPlayer, RT_GZ_BUFF_ID) + if kBuff then + X.OutputBuffTip({ x, y, w, h }, kBuff.dwID, kBuff.nLevel) + end + end + end + hBox:EnableObject(v.bGrandpa) + end + -- 药品:大附魔 + if v.tTemporaryEnchant and #v.tTemporaryEnchant > 0 then + local vv = v.tTemporaryEnchant[1] + local box = h:Lookup('Box_Enchant') + box:Show() + if vv.CommonEnchant then + box:SetObjectIcon(6216) + else + box:SetObjectIcon(7577) + end + box.OnItemRefreshTip = function() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local desc = '' + if vv.CommonEnchant then + desc = X.Table.GetCommonEnchantDesc(vv.dwTemporaryEnchantID) + else + -- ... 官方搞的太麻烦了 + local tEnchant = GetItemEnchantAttrib(vv.dwTemporaryEnchantID) + if tEnchant then + for kkk, vvv in pairs(tEnchant) do + if vvv.nID == ATTRIBUTE_TYPE.SKILL_EVENT_HANDLER then -- ATTRIBUTE_TYPE.SKILL_EVENT_HANDLER + local SkillEvent = X.GetGameTable('SkillEvent', true) + local skillEvent = SkillEvent and SkillEvent:Search(vvv.nValue1) + if skillEvent then + desc = desc .. FormatString(skillEvent.szDesc, vvv.nValue1, vvv.nValue2) + else + desc = desc .. 'text="unknown skill event id:'.. vvv.nValue1..'"' + end + elseif vvv.nID == ATTRIBUTE_TYPE.SET_EQUIPMENT_RECIPE then -- ATTRIBUTE_TYPE.SET_EQUIPMENT_RECIPE + local EquipmentRecipe = X.GetGameTable('EquipmentRecipe', true) + if EquipmentRecipe then + local tRecipeSkillAtrri = EquipmentRecipe:Search(vvv.nValue1, vvv.nValue2) + if tRecipeSkillAtrri then + desc = desc .. tRecipeSkillAtrri.szDesc + end + end + else + if Table_GetMagicAttributeInfo then + desc = desc .. FormatString(Table_GetMagicAttributeInfo(vvv.nID, true), vvv.nValue1, vvv.nValue2, 0, 0) + else + desc = GetFormatText('Enchant Attrib value ' .. vvv.nValue1 .. ' ', 113) + end + end + + end + end + end + if desc and #desc > 0 then + OutputTip(desc:gsub('font=%d+', 'font=113') .. GetFormatText(FormatString(g_tStrings.STR_ITEM_TEMP_ECHANT_LEFT_TIME ..'\n', GetTimeText(vv.nTemporaryEnchantLeftSeconds)), 102), 400, { x, y, w, h }) + end + end + if vv.nTemporaryEnchantLeftSeconds < 480 then + box:SetAlpha(80) + else + box:SetAlpha(255) + end + else + h:Lookup('Box_Enchant'):Hide() + end + -- 装备 + if v.tEquip and #v.tEquip > 0 then + local handle_equip = h.hHandle_Equip.self + for kk, vv in ipairs(v.tEquip) do + + local szName = tostring(vv.nUiId) + local box = handle_equip:Lookup(szName) + if not box then + box = h.hHandle_Equip.Pool:New() + X.UpdateItemBoxExtend(box, vv.nQuality) + end + box:SetName(szName) + box:SetObject(UI_OBJECT_OTER_PLAYER_ITEM, vv.nUiId, vv.dwBox, vv.dwX, v.dwID) + box:SetObjectIcon(vv.nIcon) + local item = GetItem(vv.dwID) + if item then + UpdataItemBoxObject(box, vv.dwBox, vv.dwX, item, nil, nil, v.dwID) + end + box.OnItemRefreshTip = function() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + if not GetItem(vv.dwID) then + D.ApplyRemotePlayerView(page, v.dwID, v.dwServerID, v.szGlobalID) + OutputItemTip(UI_OBJECT_ITEM_INFO, X.ENVIRONMENT.CURRENT_ITEM_VERSION, vv.dwTabType, vv.dwIndex, {x, y, w, h}) + else + OutputItemTip(UI_OBJECT_ITEM_ONLY_ID, vv.dwID, nil, nil, { x, y, w, h }, nil, nil, nil, nil, nil, v.dwID) + end + end + box:Show() + end + for i = 0, handle_equip:GetItemCount() - 1, 1 do + local item = handle_equip:Lookup(i) + if item and not item.bFree then + local nUiId, bDelete = item:GetName(), true + for kk ,vv in ipairs(v.tEquip) do + if tostring(vv.nUiId) == nUiId then + bDelete = false + break + end + end + if bDelete then + h.hHandle_Equip.Pool:Remove(item) + end + end + end + handle_equip:FormatAllItemPos() + end + -- 装备分 + local hScore = h:Lookup('Text_Score') + if v.nEquipScore then + hScore:SetText(v.nEquipScore) + else + if MY_TeamTools.szStatRange == 'ROOM' then + hScore:SetText('-') + elseif v.bOnline then + hScore:SetText(_L['Loading']) + else + hScore:SetText(g_tStrings.STR_GUILD_OFFLINE) + end + end + -- 秘境CD + if not h.hHandle_BossKills then + h.hHandle_BossKills = { + self = h:Lookup('Handle_BossKills'), + Pool = X.UI.HandlePool(h:Lookup('Handle_BossKills'), 'postype=8 eventid=784 w=16 h=14 name="Image_BossKilled" w=14 h=14 path="ui/Image/UITga/FBcdPanel01.UITex" frame=20name="Image_BossAlive" w=14 h=14 path="ui/Image/UITga/FBcdPanel01.UITex" frame=21') + } + end + local hCopyID = h:Lookup('Text_CopyID') + local hBossKills = h:Lookup('Handle_BossKills') + if X.IsCDProgressMap(RT_MAP_ID) then + for nIndex, bKill in ipairs(v.tBossKill) do + local szName = tostring(nIndex) + local hBossKill = hBossKills:Lookup(szName) + if not hBossKill then + hBossKill = h.hHandle_BossKills.Pool:New() + hBossKill:SetName(szName) + end + hBossKill:Lookup('Image_BossAlive'):SetVisible(not bKill) + hBossKill:Lookup('Image_BossKilled'):SetVisible(bKill) + hBossKill.OnItemRefreshTip = function() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local texts = {} + for i, boss in ipairs(X.GetMapCDProgressInfo(RT_MAP_ID)) do + table.insert(texts, boss.szName .. '\t' .. _L[v.tBossKill[i] and 'x' or 'r']) + end + OutputTip(GetFormatText(table.concat(texts, '\n')), 400, { x, y, w, h }) + end + hBossKill:Show() + end + for i = 0, hBossKills:GetItemCount() - 1, 1 do + local item = hBossKills:Lookup(i) + if item and not item.bFree then + if tonumber(item:GetName()) > #v.tBossKill then + h.hHandle_BossKills.Pool:Remove(item) + end + end + end + hBossKills:FormatAllItemPos() + hCopyID:Hide() + hBossKills:Show() + else + hCopyID:SetText(v.nCopyID == -1 and _L['None'] or v.nCopyID or _L['Unknown']) + hCopyID:Show() + hBossKills:Hide() + end + -- 战斗状态 + if v.nFightState == 1 then + h:Lookup('Image_Fight'):Show() + else + h:Lookup('Image_Fight'):Hide() + end + end + end + page.hPlayerList:FormatAllItemPos() + for i = page.hPlayerList:GetItemCount() - 1, 0, -1 do + local item = page.hPlayerList:Lookup(i) + if item and item:IsValid() then + if MY_TeamTools.szStatRange == 'RAID' then + if not X.IsTeammate(item.dwID) then + page.hPlayerList:RemoveItem(item) + page.hPlayerList:FormatAllItemPos() + end + elseif MY_TeamTools.szStatRange == 'ROOM' then + if not X.IsRoommate(item.szGlobalID) then + page.hPlayerList:RemoveItem(item) + page.hPlayerList:FormatAllItemPos() + end + end + end + end + -- 分数 + page.tScore = tScore + local nScore = 0 + for k, v in pairs(tScore) do + nScore = nScore + v + end + page.hTotalScore:SetText(math.floor(nScore)) + local nNum = #D.GetMemberList(true) + local nAvgScore = nScore / nNum + page.hProgress:Lookup('Image_Progress'):SetPercentage(nAvgScore / RT_SCORE_FULL) + page.hProgress:Lookup('Text_Progress'):SetText(_L('Team strength(%d/%d)', math.floor(nAvgScore), RT_SCORE_FULL)) + -- 心法统计 + for k, kungfu in pairs(X.CONSTANT.KUNGFU_LIST) do + local h = page.hKungfuList:Lookup(k - 1) + local img = h:Lookup('Image_Force') + local nCount = 0 + if tKungfu[kungfu.dwID] then + nCount = #tKungfu[kungfu.dwID] + end + local szName, nIcon = MY_GetSkillName(kungfu.dwID) + img:FromIconID(nIcon) + h:Lookup('Text_Num'):SetText(nCount) + if not tKungfu[kungfu.dwID] then + h:SetAlpha(60) + h.OnItemMouseEnter = nil + else + h:SetAlpha(255) + h.OnItemMouseEnter = function() + this:Lookup('Text_Num'):SetFontScheme(101) + local xml = {} + table.insert(xml, GetFormatText(szName .. g_tStrings.STR_COLON .. nCount .. g_tStrings.STR_PERSON ..'\n', 157)) + table.sort(tKungfu[kungfu.dwID], function(a, b) + local nCountA = a.nEquipScore or -1 + local nCountB = b.nEquipScore or -1 + return nCountA > nCountB + end) + for k, v in ipairs(tKungfu[kungfu.dwID]) do + if v.nEquipScore then + table.insert(xml, GetFormatText(v.szName .. g_tStrings.STR_COLON .. v.nEquipScore ..'\n', 106)) + else + table.insert(xml, GetFormatText(v.szName ..'\n', 106)) + end + end + local x, y = img:GetAbsPos() + local w, h = img:GetSize() + OutputTip(table.concat(xml), 400, { x, y, w, h }) + end + end + end +end + +local function CreateItemTable(item, dwBox, dwX) + return { + nIcon = X.GetItemIconByUIID(item.nUiId), + dwID = item.dwID, + nLevel = item.nLevel, + szName = X.GetItemNameByUIID(item.nUiId), + nUiId = item.nUiId, + nVersion = item.nVersion, + dwTabType = item.dwTabType, + dwIndex = item.dwIndex, + nQuality = item.nQuality, + dwBox = dwBox, + dwX = dwX + } +end + +function D.GetEquipCache(page, KPlayer) + if not KPlayer then + return + end + local me = X.GetClientPlayer() + local tInfo = { + tEquip = {}, + tPermanentEnchant = {}, + tTemporaryEnchant = {} + } + -- 装备 Output(X.GetInventoryItem(X.GetClientPlayer(),0,0).GetMagicAttrib()) + for _, equip in ipairs(RT_EQUIP_TOTAL) do + -- if #tInfo.tEquip >= 3 then break end + -- 藏剑只看重剑 + if KPlayer.dwForceID == 8 and X.CONSTANT.EQUIPMENT_INVENTORY[equip] == X.CONSTANT.EQUIPMENT_INVENTORY.MELEE_WEAPON then + equip = 'BIG_SWORD' + end + local dwBox, dwX = INVENTORY_INDEX.EQUIP, X.CONSTANT.EQUIPMENT_INVENTORY[equip] + local item = X.GetInventoryItem(KPlayer, dwBox, dwX) + if item then + if RT_EQUIP_SPECIAL[equip] then + if item.dwSkillID ~= 0 then + table.insert(tInfo.tEquip, CreateItemTable(item, dwBox, dwX)) + elseif equip == 'PENDANT' then + local desc = Table_GetItemDesc(item.nUiId) + if desc and (desc:find(_L['Use:']) or desc:find(_L['Use: ']) or desc:find('15 seconds')) then + table.insert(tInfo.tEquip, CreateItemTable(item, dwBox, dwX)) + end + -- elseif item.nQuality == 5 then -- 橙色装备 + -- table.insert(tInfo.tEquip, CreateItemTable(item)) + else + -- 黄字装备 + local aMagicAttrib = item.GetMagicAttrib() + for _, tAttrib in ipairs(aMagicAttrib) do + if tAttrib.nID == ATTRIBUTE_TYPE.SKILL_EVENT_HANDLER then + table.insert(tInfo.tEquip, CreateItemTable(item, dwBox, dwX)) + break + end + end + end + end + -- 永久的附魔 用于评分 + if item.dwPermanentEnchantID and item.dwPermanentEnchantID ~= 0 then + table.insert(tInfo.tPermanentEnchant, { + dwPermanentEnchantID = item.dwPermanentEnchantID, + }) + end + -- 大附魔 / 临时附魔 用于评分 + if item.dwTemporaryEnchantID and item.dwTemporaryEnchantID ~= 0 then + local dat = { + dwTemporaryEnchantID = item.dwTemporaryEnchantID, + nTemporaryEnchantLeftSeconds = item.GetTemporaryEnchantLeftSeconds() + } + if X.Table.GetCommonEnchantDesc(item.dwTemporaryEnchantID) then + dat.CommonEnchant = true + end + table.insert(tInfo.tTemporaryEnchant, dat) + end + end + end + -- 这些都是一次性的缓存数据 + page.tDataCache[KPlayer.dwID] = { + tEquip = tInfo.tEquip, + tPermanentEnchant = tInfo.tPermanentEnchant, + tTemporaryEnchant = tInfo.tTemporaryEnchant, + nEquipScore = KPlayer.GetTotalEquipScore() + } + page.tViewInvite[KPlayer.dwID] = nil + local szGlobalID = KPlayer.GetGlobalID() + if szGlobalID ~= '0' then + page.tViewInvite[szGlobalID] = nil + end + if X.IsEmpty(page.tViewInvite) then + if KPlayer.dwID ~= me.dwID then + FireUIEvent('MY_TEAM_TOOLS__SUMMARY__SUCCESS') -- 装备请求完毕 + end + else + local xID = next(page.tViewInvite) + if X.IsNumber(xID) then + X.PeekOtherPlayerByID(xID) + elseif X.IsString(xID) then + X.PeekOtherPlayerByGlobalID(page.tViewInvite[xID], xID) + end + end +end + +function D.ApplyRemotePlayerView(page, dwID, dwServerID, szGlobalID) + if dwID and not page.tViewInvite[dwID] then + page.tViewInvite[dwID] = true + X.PeekOtherPlayerByID(dwID) + elseif dwServerID and szGlobalID then + page.tViewInvite[szGlobalID] = dwServerID + X.PeekOtherPlayerByGlobalID(dwServerID, szGlobalID) + end +end + +function D.UpdateSelfData() + local dwMapID = RT_MAP_ID + local dwID = X.GetClientPlayerID() + local szGlobalID = X.GetClientPlayerGlobalID() + X.GetMapSaveCopy(function(tMapID) + local aCopyID = tMapID[dwMapID] + if not RT_PLAYER_MAP_COPY_ID[dwID] then + RT_PLAYER_MAP_COPY_ID[dwID] = {} + end + if not RT_PLAYER_MAP_COPY_ID[szGlobalID] then + RT_PLAYER_MAP_COPY_ID[szGlobalID] = {} + end + RT_PLAYER_MAP_COPY_ID[dwID][dwMapID] = X.IsTable(aCopyID) and aCopyID[1] or -1 + RT_PLAYER_MAP_COPY_ID[szGlobalID][dwMapID] = X.IsTable(aCopyID) and aCopyID[1] or -1 + FireUIEvent('MY_TEAM_TOOLS__SUMMARY__UPDATE') + end) + X.GetClientPlayerMapCDProgress(dwMapID, function(tProgress) + if not RT_MAP_CD_PROGRESS[szGlobalID] then + RT_MAP_CD_PROGRESS[szGlobalID] = {} + end + RT_MAP_CD_PROGRESS[szGlobalID][dwMapID] = tProgress + FireUIEvent('MY_TEAM_TOOLS__SUMMARY__UPDATE') + end) +end + +function D.RequestTeamData() + local me = X.GetClientPlayer() + if not me then + return + end + local aRequestID, aRefreshID = {}, {} + local bDungeonMap = X.IsDungeonMap(RT_MAP_ID) + local bCDProgressMap = X.IsCDProgressMap(RT_MAP_ID) + --[[#DEBUG BEGIN]] + if MY_TeamTools.szStatRange == 'RAID' and bCDProgressMap then + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Update team map progress.', X.DEBUG_LEVEL.LOG) + end + --[[#DEBUG END]] + local aMemberList = D.GetMemberList(true) + if MY_TeamTools.szStatRange == 'RAID' then + for _, tMember in ipairs(aMemberList) do + if bCDProgressMap then -- 秘境进度 + ApplyDungeonRoleProgress(RT_MAP_ID, tMember.dwID) -- 成功回调 UPDATE_DUNGEON_ROLE_PROGRESS(dwMapID, dwPlayerID) + elseif bDungeonMap then -- 秘境CDID + if not RT_PLAYER_MAP_COPY_ID[tMember.dwID] then + RT_PLAYER_MAP_COPY_ID[tMember.dwID] = {} + end + if RT_PLAYER_MAP_COPY_ID[tMember.dwID][RT_MAP_ID] then + table.insert(aRefreshID, tMember.dwID) + else + table.insert(aRequestID, tMember.dwID) + end + end + end + elseif MY_TeamTools.szStatRange == 'ROOM' then + for _, tMember in ipairs(aMemberList) do + if bDungeonMap then -- 秘境CDID + if not RT_PLAYER_MAP_COPY_ID[tMember.szGlobalID] then + RT_PLAYER_MAP_COPY_ID[tMember.szGlobalID] = {} + end + if not RT_MAP_CD_PROGRESS[tMember.szGlobalID] then + RT_MAP_CD_PROGRESS[tMember.szGlobalID] = {} + end + if RT_PLAYER_MAP_COPY_ID[tMember.szGlobalID][RT_MAP_ID] + and RT_MAP_CD_PROGRESS[tMember.szGlobalID][RT_MAP_ID] then + table.insert(aRefreshID, tMember.szGlobalID) + else + table.insert(aRequestID, tMember.szGlobalID) + end + end + end + end + if not X.IsEmpty(aRequestID) or not X.IsEmpty(aRefreshID) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'Request team map copy id.', X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + if #aRequestID == #aMemberList then + aRequestID = nil + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Fetch teammate\'s data failed, please unlock talk and reopen.']) + else + local nChannel = MY_TeamTools.szStatRange == 'RAID' + and PLAYER_TALK_CHANNEL.RAID + or PLAYER_TALK_CHANNEL.ROOM + X.SendBgMsg(nChannel, 'MY_TEAM_TOOLS__MAP_CD_REQ', {RT_MAP_ID, aRequestID, nil}) + end + end + -- 刷新自己的 + D.UpdateSelfData() +end + +-- 获取团队大部分情况 非缓存 +function D.GetTeamData(page) + local me = X.GetClientPlayer() + local team = GetClientTeam() + local aList = {} + local bIsInParty = X.IsClientPlayerInParty() + local bCDProgressMap = X.IsCDProgressMap(RT_MAP_ID) + local aProgressMapBoss = bCDProgressMap and X.GetMapCDProgressInfo(RT_MAP_ID) + local aRequestMapCopyID = {} + local aMemberList = D.GetMemberList() + for _, tMember in ipairs(aMemberList) do + local dwID = tMember.dwID + -- if not dwID and tMember.szGlobalID then + -- dwID = RT_GLOBAL_ID_TO_ID[tMember.szGlobalID] + -- end + local KPlayer = dwID and X.GetPlayer(dwID) + local tInfo = { + KPlayer = KPlayer, + szName = tMember.szName or _L['Loading...'], + dwID = dwID, -- ID + szGlobalID = tMember.szGlobalID, + dwServerID = tMember.dwServerID, + dwForceID = tMember.dwForceID, -- 门派ID + dwKungfuID = tMember.dwKungfuID, -- 内功 + -- tPermanentEnchant = {}, -- 附魔 + -- tTemporaryEnchant = {}, -- 临时附魔 + -- tEquip = {}, -- 特效装备 + tBuff = {}, -- 增益BUFF + tFood = {}, -- 小吃和附魔 + nEquipScore = tMember.nEquipScore, -- 装备分,仅 ROOM 下有值 + nCopyID = nil, -- 秘境ID + tBossKill = {}, -- 秘境进度 + nFightState = KPlayer and KPlayer.bFightState and 1 or 0, -- 战斗状态 + bOnline = true, + bGrandpa = false, -- 大爷 + } + if tMember.bOnline ~= nil then + tInfo.bOnline = tMember.bOnline + end + if KPlayer then + -- 小吃和buff + local nType + for _, buff in X.ipairs_c(X.GetBuffList(KPlayer)) do + nType = GetBuffInfo(buff.dwID, buff.nLevel, {}).nDetachType or 0 + if RT_FOOD_TYPE[nType] then + table.insert(tInfo.tFood, buff) + end + if RT_BUFF_ID[buff.dwID] then + table.insert(tInfo.tBuff, buff) + end + if buff.dwID == RT_GZ_BUFF_ID then -- grandpa + tInfo.bGrandpa = true + end + end + if me.dwID == KPlayer.dwID then + D.GetEquipCache(page, me) + end + end + -- 秘境进度 + if MY_TeamTools.szStatRange == 'RAID' then + if tInfo.bOnline and bCDProgressMap then + for i, boss in ipairs(aProgressMapBoss) do + tInfo.tBossKill[i] = GetDungeonRoleProgress(RT_MAP_ID, tMember.dwID, boss.dwProgressID) + end + end + tInfo.nCopyID = X.Get(RT_PLAYER_MAP_COPY_ID, {tMember.dwID, RT_MAP_ID}) + elseif MY_TeamTools.szStatRange == 'ROOM' then + if bCDProgressMap then + for i, boss in ipairs(aProgressMapBoss) do + tInfo.tBossKill[i] = X.Get(RT_MAP_CD_PROGRESS, {tMember.szGlobalID, RT_MAP_ID, boss.dwProgressID}, tMember.tMapCDProgress[boss.dwProgressID]) + end + end + tInfo.nCopyID = X.Get(RT_PLAYER_MAP_COPY_ID, {tMember.szGlobalID, RT_MAP_ID}) + end + setmetatable(tInfo, { __index = page.tDataCache[tMember.dwID] }) + table.insert(aList, tInfo) + end + return aList +end + +function D.ApplyTeamEquip(page) + if MY_TeamTools.szStatRange == 'RAID' then + local hView = D.GetPlayerView() + if hView and hView:IsVisible() then -- 查看装备的时候停止请求 + return + end + local team = GetClientTeam() + for _, tMember in ipairs(D.GetMemberList()) do + if tMember.dwID ~= X.GetClientPlayerID() then + local info = X.GetTeamMemberInfo(tMember.dwID) + if info.bOnline then + D.ApplyRemotePlayerView(page, tMember.dwID, tMember.dwServerID, tMember.szGlobalID) + end + end + end + end +end + +-- 获取团队成员列表 +function D.GetMemberList(bOnline) + local aList = {} + if MY_TeamTools.szStatRange == 'RAID' then + for _, dwID in ipairs(X.GetTeamMemberList()) do + local tMember = X.GetTeamMemberInfo(dwID) + if tMember and (not bOnline or tMember.bOnline) then + table.insert(aList, { + dwID = tMember.dwID, + szGlobalID = tMember.szGlobalID, + szName = tMember.szName, + dwForceID = tMember.dwForceID, + dwKungfuID = tMember.dwKungfuID, + bOnline = tMember.bOnline, + }) + end + end + elseif MY_TeamTools.szStatRange == 'ROOM' then + local tGlobalID2ID = {} + for _, dwID in ipairs(X.GetTeamMemberList()) do + local tMember = X.GetTeamMemberInfo(dwID) + if tMember and tMember.szGlobalID then + tGlobalID2ID[tMember.szGlobalID] = tMember.dwID + end + end + for _, szGlobalID in ipairs(X.GetRoomMemberList()) do + local tMember = X.GetRoomMemberInfo(szGlobalID) + local szServerName = tMember and X.GetServerNameByID(tMember.dwServerID) + if tMember and szServerName then + table.insert(aList, { + dwID = tGlobalID2ID[tMember.szGlobalID], + dwServerID = tMember.dwServerID, + szGlobalID = tMember.szGlobalID, + szName = tMember.szName .. g_tStrings.STR_CONNECT .. szServerName, + dwForceID = tMember.dwForceID, + dwKungfuID = tMember.dwKungfuID, + nEquipScore = tMember.nEquipScore, + tMapCDProgress = X.DecodeMapCDProgress(tMember.nMapCDProgress), + }) + end + end + end + return aList +end + +function D.SetMapByRoomInfo() + if MY_TeamTools.szStatRange ~= 'ROOM' then + return + end + local tInfo = X.GetRoomInfo() + if tInfo then + D.SetMapID(tInfo.nTargetMapID) + end +end + +function D.SetMapID(dwMapID) + if RT_MAP_ID == dwMapID then + return + end + RT_MAP_ID = dwMapID + FireUIEvent('MY_TEAM_TOOLS__SUMMARY__MAP_ID_CHANGE') +end + +X.RegisterEvent('LOADING_END', function() + D.SetMapID(X.GetClientPlayer().GetMapID()) +end) + +X.RegisterBgMsg('MY_TEAM_TOOLS__MAP_CD_RES', function(_, data, nChannel, dwID, szName, bIsSelf) + local szGlobalID, dwMapID, aCopyID, tProgress = data[1], data[2], data[3], data[4] + if not RT_PLAYER_MAP_COPY_ID[dwID] then + RT_PLAYER_MAP_COPY_ID[dwID] = {} + end + RT_PLAYER_MAP_COPY_ID[dwID][dwMapID] = X.IsTable(aCopyID) and aCopyID[1] or -1 + if not RT_PLAYER_MAP_COPY_ID[szGlobalID] then + RT_PLAYER_MAP_COPY_ID[szGlobalID] = {} + end + RT_PLAYER_MAP_COPY_ID[szGlobalID][dwMapID] = X.IsTable(aCopyID) and aCopyID[1] or -1 + if X.IsCDProgressMap(dwMapID) then + if not RT_MAP_CD_PROGRESS[szGlobalID] then + RT_MAP_CD_PROGRESS[szGlobalID] = {} + end + RT_MAP_CD_PROGRESS[szGlobalID][dwMapID] = X.IsTable(tProgress) and tProgress or nil + end + FireUIEvent('MY_TEAM_TOOLS__SUMMARY__UPDATE') +end) + +function D.OnInitPage() + local frameTemp = X.UI.OpenFrame(SZ_INI, 'MY_TeamTools_Summary') + local wnd = frameTemp:Lookup('Wnd_Summary') + wnd:ChangeRelation(this, true, true) + X.UI.CloseFrame(frameTemp) + X.UI.AdaptComponentAppearance(wnd:Lookup('Scroll_Player/ScrolBarl_Player_All')) + + local page = this + local frame = page:GetRoot() + frame:RegisterEvent('PEEK_OTHER_PLAYER') + frame:RegisterEvent('PARTY_ADD_MEMBER') + frame:RegisterEvent('PARTY_DISBAND') + frame:RegisterEvent('PARTY_DELETE_MEMBER') + frame:RegisterEvent('PARTY_SET_MEMBER_ONLINE_FLAG') + frame:RegisterEvent('ON_APPLY_PLAYER_SAVED_COPY_RESPOND') + frame:RegisterEvent('UPDATE_DUNGEON_ROLE_PROGRESS') + frame:RegisterEvent('LOADING_END') + frame:RegisterEvent('GLOBAL_ROOM_DETAIL_INFO') + -- 团长变更 重新请求标签 + frame:RegisterEvent('TEAM_AUTHORITY_CHANGED') + -- 自定义事件 + frame:RegisterEvent('MY_TEAM_TOOLS__STAT_RANGE_CHANGE') + frame:RegisterEvent('MY_TEAM_TOOLS__SUMMARY__UPDATE') + frame:RegisterEvent('MY_TEAM_TOOLS__SUMMARY__SUCCESS') + frame:RegisterEvent('MY_TEAM_TOOLS__SUMMARY__MAP_ID_CHANGE') + -- 重置心法选择 + RT_SELECT_KUNGFU = nil + local hPlayerList = page:Lookup('Wnd_Summary/Scroll_Player', '') + local hSummaryTotal = page:Lookup('Wnd_Summary', '') + page.hPlayerList = hPlayerList + page.hItemDataPlayer = frame:CreateItemData(SZ_INI, 'Handle_Item_Player') + + page.tScore = {} + -- 排序 + local hTitle = page:Lookup('Wnd_Summary', 'Handle_Player_BG') + for k, v in ipairs({'dwForceID', 'tFood', 'tBuff', 'tEquip', 'nEquipScore', 'tBossKill', 'nFightState'}) do + local txt = hTitle:Lookup('Text_Title_' .. k) + txt.nFont = txt:GetFontScheme() + txt.OnItemMouseEnter = function() + this:SetFontScheme(101) + end + txt.OnItemMouseLeave = function() + this:SetFontScheme(this.nFont) + end + txt.OnItemLButtonClick = function() + if v == RT_SORT_FIELD then + RT_SORT_MODE = RT_SORT_MODE == 'ASC' and 'DESC' or 'ASC' + else + RT_SORT_MODE = 'DESC' + end + RT_SORT_FIELD = v + D.UpdateList(page) -- set userdata + page.hPlayerList:Sort() + page.hPlayerList:FormatAllItemPos() + end + end + -- 装备分 + page.hTotalScore = page:Lookup('Wnd_Summary', 'Handle_Score/Text_TotalScore') + page.hProgress = page:Lookup('Wnd_Summary', 'Handle_Progress') + -- 秘境信息 + local hDungeon = page:Lookup('Wnd_Summary', 'Handle_Dungeon') + local hKungfu = page:Lookup('Wnd_Summary', 'Handle_Kungfu') + D.UpdateDungeonInfo(hDungeon) + local hKungfuList = page:Lookup('Wnd_Summary', 'Handle_Kungfu/Handle_Kungfu_List') + local hItemDataKungfu = frame:CreateItemData(SZ_INI, 'Handle_Kungfu_Item') + hKungfuList:Clear() + for k, kungfu in pairs(X.CONSTANT.KUNGFU_LIST) do + local h = hKungfuList:AppendItemFromData(hItemDataKungfu, kungfu.dwID) + local img = h:Lookup('Image_Force') + img:FromIconID(select(2, MY_GetSkillName(kungfu.dwID))) + h:Lookup('Text_Num'):SetText(0) + h.nFont = h:Lookup('Text_Num'):GetFontScheme() + h.OnItemMouseLeave = function() + HideTip() + if RT_SELECT_KUNGFU == tonumber(this:GetName()) then + this:Lookup('Text_Num'):SetFontScheme(101) + else + this:Lookup('Text_Num'):SetFontScheme(h.nFont) + end + end + h.OnItemLButtonClick = function() + if this:GetAlpha() ~= 255 then + return + end + page.hPlayerList:Clear() + if RT_SELECT_KUNGFU then + if RT_SELECT_KUNGFU == tonumber(this:GetName()) then + RT_SELECT_KUNGFU = nil + h:Lookup('Text_Num'):SetFontScheme(101) + return D.UpdateList(page) + else + local h = this:GetParent():Lookup(tostring(RT_SELECT_KUNGFU)) + h:Lookup('Text_Num'):SetFontScheme(h.nFont) + end + end + RT_SELECT_KUNGFU = tonumber(this:GetName()) + this:Lookup('Text_Num'):SetFontScheme(101) + D.UpdateList(page) + end + end + hKungfuList:FormatAllItemPos() + local nH = select(2, hKungfuList:GetAllItemSize()) + hKungfuList:SetH(nH) + hKungfu:SetH(nH + 10) + hDungeon:SetRelY(hKungfu:GetRelY() + nH + 10) + hSummaryTotal:FormatAllItemPos() + page.hKungfuList = hKungfuList + -- ui 临时变量 + page.tViewInvite = {} -- 请求装备队列 + page.tDataCache = {} -- 临时数据 + -- lang + page:Lookup('Wnd_Summary', 'Handle_Player_BG/Text_Title_3'):SetText(_L['BUFF']) + page:Lookup('Wnd_Summary', 'Handle_Player_BG/Text_Title_4'):SetText(_L['Equip']) + page:Lookup('Wnd_Summary', 'Handle_Player_BG/Text_Title_6'):SetText(_L['Dungeon CD']) + page:Lookup('Wnd_Summary', 'Handle_Player_BG/Text_Title_7'):SetText(_L['Fight']) +end + +function D.OnActivePage() + local hView = D.GetPlayerView() + if hView and hView:IsVisible() then + hView:Hide() + end + X.BreatheCall('MY_RaidTools_Draw', 1000, D.UpdateList, this) + X.BreatheCall('MY_RaidTools_RequestMemberEquip', 3000, D.ApplyTeamEquip, this) + X.BreatheCall('MY_RaidTools_RequestTeamData', 30000, D.RequestTeamData, this) +end + +function D.OnDeactivePage() + X.BreatheCall('MY_RaidTools_Draw', false) + X.BreatheCall('MY_RaidTools_RequestMemberEquip', false) + X.BreatheCall('MY_RaidTools_RequestTeamData', false) +end + +function D.OnEvent(szEvent) + if szEvent == 'MY_TEAM_TOOLS__SUMMARY__UPDATE' then + D.UpdateList(this) + elseif szEvent == 'UPDATE_DUNGEON_ROLE_PROGRESS' then + D.UpdateList(this) + elseif szEvent == 'PEEK_OTHER_PLAYER' then + local eState, dwID = arg0, arg1 + if eState == X.CONSTANT.PEEK_OTHER_PLAYER_RESPOND.SUCCESS then + local kPlayer = GetPlayer(dwID) + if this.tViewInvite[dwID] or this.tViewInvite[kPlayer.GetGlobalID()] then + RT_GLOBAL_ID_TO_ID[kPlayer.GetGlobalID()] = dwID + D.GetEquipCache(this, X.GetPlayer(dwID)) -- 抓取所有数据 + end + else + this.tViewInvite[dwID] = nil + end + elseif szEvent == 'PARTY_SET_MEMBER_ONLINE_FLAG' then + if arg2 == 0 then + this.tDataCache[arg1] = nil + end + elseif szEvent == 'PARTY_DELETE_MEMBER' then + local me = X.GetClientPlayer() + if me.dwID == arg1 then + this.tDataCache = {} + this.hPlayerList:Clear() + else + this.tDataCache[arg1] = nil + end + elseif szEvent == 'LOADING_END' or szEvent == 'PARTY_DISBAND' then + this.tDataCache = {} + this.hPlayerList:Clear() + -- 秘境信息 + local hDungeon = this:Lookup('Wnd_Summary', 'Handle_Dungeon') + D.UpdateDungeonInfo(hDungeon) + elseif szEvent == 'MY_TEAM_TOOLS__SUMMARY__MAP_ID_CHANGE' then + D.RequestTeamData() -- 地图变化刷新 + local hDungeon = this:Lookup('Wnd_Summary', 'Handle_Dungeon') + D.UpdateDungeonInfo(hDungeon) + elseif szEvent == 'ON_APPLY_PLAYER_SAVED_COPY_RESPOND' then + local hDungeon = this:Lookup('Wnd_Summary', 'Handle_Dungeon') + D.UpdateDungeonInfo(hDungeon) + elseif szEvent == 'MY_TEAM_TOOLS__SUMMARY__SUCCESS' then + if RT_SORT_FIELD == 'nEquipScore' then + D.UpdateList(this) + this.hPlayerList:Sort() + this.hPlayerList:FormatAllItemPos() + end + elseif szEvent == 'MY_TEAM_TOOLS__STAT_RANGE_CHANGE' then + D.SetMapByRoomInfo() + D.RequestTeamData() + D.UpdateList(this) + elseif szEvent == 'GLOBAL_ROOM_DETAIL_INFO' then + D.SetMapByRoomInfo() + end +end + +function D.OnLButtonClick() +end + +function D.OnItemMouseEnter() + local szName = this:GetName() + if this:GetType() == 'Box' then + this:SetObjectMouseOver(true) + elseif szName == 'Handle_Score' then + local img = this:Lookup('Image_Score') + img:SetFrame(23) + local nScore = this:Lookup('Text_TotalScore'):GetText() + local xml = {} + table.insert(xml, GetFormatText(g_tStrings.STR_SCORE .. g_tStrings.STR_COLON .. nScore ..'\n', 65)) + for k, v in pairs(this:GetParent():GetParent():GetParent().tScore) do + table.insert(xml, GetFormatText(RT_SCORE[k] .. g_tStrings.STR_COLON, 67)) + table.insert(xml, GetFormatText(v ..'\n', 44)) + end + local x, y = img:GetAbsPos() + local w, h = img:GetSize() + OutputTip(table.concat(xml), 400, { x, y, w, h }) + end +end + +function D.OnItemMouseLeave() + local szName = this:GetName() + if this:GetType() == 'Box' then + this:SetObjectMouseOver(false) + elseif szName == 'Handle_Score' then + this:Lookup('Image_Score'):SetFrame(22) + end + HideTip() +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Handle_Dungeon' then + if MY_TeamTools.szStatRange == 'ROOM' then + X.OutputAnnounceMessage(_L['Room stat map will follow system room dest, cannot be customized.']) + return + end + local menu = X.GetDungeonMenu({ + fnAction = function(p) + D.SetMapID(p.dwID) + end, + }) + menu.x, menu.y = Cursor.GetPos(true) + PopupMenu(menu) + elseif this.bPlayerItem then + if IsCtrlKeyDown() then + X.EditBox_AppendLinkPlayer(this.szName) + else + local dwID = this.dwID + local dwServerID = this.dwServerID + local szGlobalID = this.szGlobalID + D.OpenOtherCharacterPanel(this:GetParent():GetParent():GetParent():GetParent(), dwID, dwServerID, szGlobalID) + end + end +end + +function D.OnItemRButtonClick() + if not this.bPlayerItem then + return + end + local dwID = this.dwID + local dwServerID = this.dwServerID + local szGlobalID = this.szGlobalID + local me = X.GetClientPlayer() + if (dwID and dwID ~= me.dwID) or (szGlobalID and szGlobalID ~= me.GetGlobalID()) then + local page = this:GetParent():GetParent():GetParent():GetParent() + local menu = { + { szOption = this.szName, bDisable = true }, + { bDevide = true } + } + InsertPlayerCommonMenu(menu, dwID, this.szName) + menu[#menu] = { + szOption = g_tStrings.STR_LOOKUP, fnAction = function() + D.OpenOtherCharacterPanel(page, dwID, dwServerID, szGlobalID) + end + } + local t = {} + InsertTargetMenu(t, dwID) + for _, v in ipairs(t) do + if v.szOption == g_tStrings.LOOKUP_INFO or v.szOption == g_tStrings.STR_LOOKUP_MORE then + for _, vv in ipairs(v) do + if vv.szOption == g_tStrings.LOOKUP_NEW_TANLENT then + table.insert(menu, vv) + break + end + end + break + end + end + if MY_CharInfo and MY_CharInfo.ViewCharInfoToPlayer then + menu[#menu + 1] = { + szOption = g_tStrings.STR_LOOK .. g_tStrings.STR_EQUIP_ATTR, fnAction = function() + MY_CharInfo.ViewCharInfoToPlayer(dwID) + end + } + end + PopupMenu(menu) + end +end + +-- Module exports +do +local settings = { + name = 'MY_TeamTools_Summary_Module', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + bStatRange = true, + }, + root = D, + }, + }, +} +MY_TeamTools.RegisterModule('Summary', _L['MY_TeamTools_Summary'], X.CreateModule(settings)) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_WorldMark.lua b/MY_TeamTools/src/MY_WorldMark.lua new file mode 100644 index 000000000..a169e0c77 --- /dev/null +++ b/MY_TeamTools/src/MY_WorldMark.lua @@ -0,0 +1,186 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 世界标记增强 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @ref : Webster +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_WorldMark' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_TeamTools' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local WM_LIST = { + [20107] = { id = 1, col = { 255, 255, 255 } }, + [20108] = { id = 2, col = { 255, 128, 0 } }, + [20109] = { id = 3, col = { 0 , 0 , 255 } }, + [20110] = { id = 4, col = { 0 , 255, 0 } }, + [20111] = { id = 5, col = { 255, 0 , 0 } }, + [36781] = { id = 6, col = { 50 , 220, 255 } }, + [36782] = { id = 7, col = { 255, 100, 220 } }, + [36783] = { id = 8, col = { 255, 255, 0 } }, + [36784] = { id = 9, col = { 200, 40, 255 } }, + [36785] = { id = 10, col = { 30, 255, 180 } }, +} +local WM_POINT = {} + +local O = X.CreateUserSettingsModule('MY_WorldMark', _L['Raid'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_TeamTools'], + szDescription = X.MakeCaption({ + _L['MY_WorldMark'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.OnNpcEvent() + local npc = X.GetNpc(arg0) + if npc then + local mark = WM_LIST[npc.dwTemplateID] + if mark then + local tPoint = { npc.nX, npc.nY, npc.nZ } + local handle = X.UI.GetShadowHandle('Handle_World_Mark') + local szName = 'w_' .. mark.id + if handle:Lookup(szName) then + handle:RemoveItem(szName) + end + WM_POINT[mark.id] = tPoint + end + end +end + +function D.OnNpcLeave() + local npc = X.GetNpc(arg0) + if npc then + local mark = WM_LIST[npc.dwTemplateID] + if mark then + local tPoint = WM_POINT[mark.id] + if tPoint then + local handle = X.UI.GetShadowHandle('Handle_World_Mark') + local szName = 'w_' .. mark.id + local sha = handle:Lookup(szName) + if not sha then + handle:AppendItemFromString('name="' .. szName ..'"') + sha = handle:Lookup(szName) + end + D.Draw(tPoint, sha, mark.col) + end + end + end +end + +function D.OnCast(dwSkillID) + if dwSkillID == 4906 then + WM_POINT = {} + X.UI.GetShadowHandle('Handle_World_Mark'):Clear() + end +end + +function D.OnDoSkillCast() + D.OnCast(arg1) +end + +function D.OnLoadingEnd() + WM_POINT = {} + X.UI.GetShadowHandle('Handle_World_Mark'):Clear() +end + +function D.Draw(Point, sha, col) + local nRadius = 64 + local nFace = 128 + local dwRad1 = math.pi + local dwRad2 = 3 * math.pi + math.pi / 20 + local r, g, b = unpack(col) + local nX, nY, nZ = unpack(Point) + sha:SetTriangleFan(GEOMETRY_TYPE.TRIANGLE) + sha:SetD3DPT(D3DPT.TRIANGLEFAN) + sha:ClearTriangleFanPoint() + sha:AppendTriangleFan3DPoint(nX ,nY, nZ, r, g, b, 80) + sha:Show() + local sX, sZ = Scene_PlaneGameWorldPosToScene(nX, nY) + repeat + local sX_, sZ_ = Scene_PlaneGameWorldPosToScene(nX + math.cos(dwRad1) * nRadius, nY + math.sin(dwRad1) * nRadius) + sha:AppendTriangleFan3DPoint(nX ,nY, nZ, r, g, b, 80, { sX_ - sX, 0, sZ_ - sZ }) + dwRad1 = dwRad1 + math.pi / 16 + until dwRad1 > dwRad2 +end + +function D.GetEvent() + if O.bEnable and not X.IsRestricted('MY_WorldMark') then + return { + {'DO_SKILL_CAST', D.OnDoSkillCast}, + {'NPC_LEAVE_SCENE', D.OnNpcLeave}, + {'NPC_ENTER_SCENE', D.OnNpcEvent}, + {'LOADING_END', D.OnLoadingEnd}, + } + else + D.OnCast(4906) + return false + end +end + +function D.CheckEnable() + X.RegisterModuleEvent('MY_WorldMark', D.GetEvent()) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_WorldMark', + exports = { + { + fields = { + 'CheckEnable', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_WorldMark = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_WorldMark', function() + if arg0 and arg0 ~= 'MY_WorldMark' then + return + end + D.CheckEnable() +end) +X.RegisterUserSettingsInit('MY_WorldMark', D.CheckEnable) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_YunWorldMark.lua b/MY_TeamTools/src/MY_YunWorldMark.lua new file mode 100644 index 000000000..f19077f37 --- /dev/null +++ b/MY_TeamTools/src/MY_YunWorldMark.lua @@ -0,0 +1,227 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 云世界标记 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_YunWorldMark' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_YunWorldMark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local FRAME_NAME = 'MY_YunWorldMark' +local D = {} + +function D.OpenPanel(szModule) + local ui = X.UI.CreateFrame(FRAME_NAME, { + w = 760, + h = 520, + close = true, + resize = true, + minWidth = 760, + minHeight = 520, + text = X.PACKET_INFO.NAME .. _L.SPLIT_DOT .. _L[MODULE_NAME], + anchor = { s = 'CENTER', r = 'CENTER', x = 0, y = -100 }, + onSizeChange = function() + local ui = X.UI(this) + local nW, nH = ui:Size() + ui:Children('#Btn_Option'):Left(nW - 40) + ui:Children('#PageSet_All'):Size(nW, nH - 48) + D.PageSetModule.BroadcastPageEvent(this, 'OnResizePage') + end, + }) + ui:Append('WndPageSet', { name = 'PageSet_All', x = 0, y = 48, w = 760, h = 520 - 48 }) + ui:Append('WndButton', { + name = 'Btn_Option', + x = 760 - 40, y = 54, w = 20, h = 20, + buttonStyle = 'OPTION', + menu = function() + return { + { + szOption = _L['Get current mark data'], + fnAction = function() + X.UI.ClosePopupMenu() + MY_YunWorldMark_Subscribe.ShowSceneWorldMark() + end, + }, + { + szOption = _L['Restore world mark position'], + fnAction = function() + X.UI.ClosePopupMenu() + X.UI.GetUserInput({ + title = _L['Please input world mark json:'], + initialValue = '', + multiline = true, + maxLength = 99999, + fnAction = function(szText) + if X.IsEmpty(szText) then + return + end + local data = X.DecodeJSON(szText) + if not X.IsTable(data) then + X.OutputAnnounceMessage(_L('Decode %s failed!', _L['World mark'])) + return + end + D.ApplyWorldMark(data) + end, + }) + end, + }, + { + szOption = _L['Manage my online world mark'], + fnAction = function() + X.OpenBrowser('https://j3cx.com/world-mark/mine') + X.UI.ClosePopupMenu() + end, + }, + } + end, + }) + local frame = ui:Raw() + frame:BringToTop() + D.PageSetModule.DrawUI(frame) + D.PageSetModule.ActivePage(frame, szModule or 1, true) +end + +function D.ClosePanel() + X.UI.CloseFrame(FRAME_NAME) +end + +function D.IsPanelOpened() + return Station.Lookup('Normal/' .. FRAME_NAME) +end + +function D.TogglePanel() + if D.IsPanelOpened() then + D.ClosePanel() + else + D.OpenPanel() + end +end + +-- 注册子模块 +function D.RegisterModule(szKey, szName, tModule) + if not D.PageSetModule or not szName or not tModule then + return + end + D.PageSetModule.RegisterModule(szKey, szName, tModule) + if D.IsPanelOpened() then + D.ClosePanel() + D.OpenPanel() + end +end + +-------------------------------------------------------------------------------- +-- 世界标记应用 +-------------------------------------------------------------------------------- + +function D.ApplyWorldMark(aList) + if type(SetWorldMark) ~= 'function' then + X.OutputAnnounceMessage(_L['Failed.']) + return + end + if not X.IsTable(aList) then + X.OutputAnnounceMessage(_L('Decode %s failed!', _L['World mark'])) + return + end + + local nWillApply = 0 + for i, pt in ipairs(aList) do + if X.IsTable(pt) then + local nX = tonumber(pt.x) or 0 + local nY = tonumber(pt.y) or 0 + local nZ = tonumber(pt.z) or 0 + if not (nX == 0 and nY == 0 and nZ == 0) then + local nIndex = tonumber(pt.mark) or i + if nIndex > 0 then + nWillApply = nWillApply + 1 + end + end + end + end + + X.Confirm(_L('About to clear all current world marks and set %d new world marks, continue?', nWillApply), function() + SetWorldMark(0) + + local nApplied = 0 + for i, pt in ipairs(aList) do + if X.IsTable(pt) then + local nX = tonumber(pt.x) or 0 + local nY = tonumber(pt.y) or 0 + local nZ = tonumber(pt.z) or 0 + if not (nX == 0 and nY == 0 and nZ == 0) then + local nIndex = tonumber(pt.mark) or i + if nIndex > 0 then + SetWorldMark(nIndex, nX, nY, nZ) + nApplied = nApplied + 1 + end + end + end + end + + X.OutputAnnounceMessage(_L('Done, %s marks applied.', tostring(nApplied))) + end) +end + +function D.ApplyYunWorldMark(szURL) + if X.IsEmpty(szURL) then + return + end + if type(SetWorldMark) ~= 'function' then + X.OutputAnnounceMessage(_L['Failed.']) + return + end + + local LUA_CONFIG = { passphrase = false, crc = false, compress = false } + X.FetchLUAData(szURL, LUA_CONFIG) + :Then(function(data) + if not data then + X.OutputAnnounceMessage(_L('Decode %s failed!', _L['World mark'])) + return + end + D.ApplyWorldMark(data) + end) + :Catch(function(error) + X.OutputAnnounceMessage((error and error.message) or _L['Failed.']) + end) +end + +D.PageSetModule = X.UI.CreatePageSetModule(D, 'Wnd_Total/PageSet_All') + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark', + exports = { + { + preset = 'UIEvent', + fields = { + 'OpenPanel', + 'ClosePanel', + 'TogglePanel', + 'IsPanelOpened', + 'RegisterModule', + 'ApplyWorldMark', + 'ApplyYunWorldMark', + }, + root = D, + }, + }, +} +MY_YunWorldMark = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_YunWorldMark_Favorite.lua b/MY_TeamTools/src/MY_YunWorldMark_Favorite.lua new file mode 100644 index 000000000..4d3c5b69d --- /dev/null +++ b/MY_TeamTools/src/MY_YunWorldMark_Favorite.lua @@ -0,0 +1,432 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 云世界标记 - 收藏列表 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_YunWorldMark_Favorite' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_YunWorldMark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. PLUGIN_NAME .. '/ui/MY_YunWorldMark_Subscribe.ini' +local D = {} + +local USE_DISABLE_MS = 1000 +local USE_COLOR_ACTIVE = { 255, 255, 0 } +local USE_COLOR_DISABLED = { 128, 128, 128 } + +-------------------------------------------------------------------------------- +-- 收藏数据管理 +-------------------------------------------------------------------------------- + +function D.Load() + return X.LoadLUAData({'userdata/yun_world_mark/favorite.jx3dat', X.PATH_TYPE.GLOBAL}) or {} +end + +function D.Save(aFavorite) + X.SaveLUAData({'userdata/yun_world_mark/favorite.jx3dat', X.PATH_TYPE.GLOBAL}, aFavorite) + FireUIEvent('MY_YUN_WORLD_MARK__FAVORITE__LIST_UPDATE') +end + +function D.Add(info, dwMapID) + if not info or not info.key then + return + end + -- 如果没有传入地图ID,尝试获取当前地图 + if not dwMapID then + local me = X.GetClientPlayer() + if me then + dwMapID = me.GetMapID() or 0 + end + end + local aFavorite = D.Load() + -- 移除已存在的相同 key + for i, p in X.ipairs_r(aFavorite) do + if p.key == info.key then + table.remove(aFavorite, i) + end + end + -- 保存地图信息 + local rec = X.Clone(info) + rec.dwMapID = dwMapID or 0 + table.insert(aFavorite, rec) + D.Save(aFavorite) + X.OutputAnnounceMessage(_L['Added to favorites.']) +end + +function D.Remove(info) + if not info or not info.key then + return + end + X.Confirm(_L['Confirm?'], function() + local aFavorite = D.Load() + for i, p in X.ipairs_r(aFavorite) do + if p.key == info.key then + table.remove(aFavorite, i) + end + end + D.Save(aFavorite) + end) +end + +function D.IsFavorited(info) + if not info or not info.key then + return false + end + for _, p in ipairs(D.Load()) do + if p.key == info.key then + return true + end + end + return false +end + +-------------------------------------------------------------------------------- +-- 界面逻辑 +-------------------------------------------------------------------------------- + +function D.Search(page) + if not page or not page:IsValid() then + return + end + local ui = X.UI(page) + local szSearch = X.TrimString(ui:Fetch('WndEditBox_Search'):Text() or ''):lower() + local dwMapID = D.dwMapID or 0 + + local aFavorite = D.Load() + local aDataSource = {} + for _, rec in ipairs(aFavorite) do + local bMatchMap = (dwMapID == 0) or (rec.dwMapID == dwMapID) + local bMatchSearch = X.IsEmpty(szSearch) + or (rec.szName and rec.szName:lower():find(szSearch, 1, true)) + or (rec.szAuthor and rec.szAuthor:lower():find(szSearch, 1, true)) + or (rec.key and rec.key:lower():find(szSearch, 1, true)) + if bMatchMap and bMatchSearch then + table.insert(aDataSource, rec) + end + end + ui:Fetch('WndTable_List'):DataSource(aDataSource) +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + local me = X.GetClientPlayer() + if me then + D.dwMapID = me.GetMapID() or 0 + else + D.dwMapID = 0 + end + + local tMapName, aMapSource, tMapMenu = {}, {}, {} + table.insert(tMapMenu, { + szOption = _L['All maps'], + fnAction = function() + D.dwMapID = 0 + ui:Fetch('WndAutocomplete_Map'):Text('') + X.UI.ClosePopupMenu() + D.Search(page) + end, + }) + for _, group in ipairs(X.GetTypeGroupMap()) do + local tSub = { szOption = group.szGroup } + for _, info in ipairs(group.aMapInfo) do + table.insert(tSub, { + szOption = info.szName, + fnAction = function() + D.dwMapID = info.dwID + ui:Fetch('WndAutocomplete_Map'):Text(info.szName) + X.UI.ClosePopupMenu() + D.Search(page) + end, + }) + tMapName[info.dwID] = info.szName + table.insert(aMapSource, { text = info.szName, dwID = info.dwID }) + end + table.insert(tMapMenu, tSub) + end + local szCurrentMapName = tMapName[D.dwMapID] or '' + + local nX, nY = 20, 10 + local COMPONENT_H = 25 + + nX = nX + ui:Append('WndAutocomplete', { + name = 'WndAutocomplete_Map', + x = nX, + y = nY, + w = 250, + h = COMPONENT_H, + text = szCurrentMapName, + placeholder = _L['Current map'], + autocomplete = { + { + 'option', 'source', aMapSource, + }, + { + 'option', 'afterComplete', function(raw) + if raw and raw.dwID then + D.dwMapID = raw.dwID + else + D.dwMapID = 0 + end + end, + }, + }, + menu = function() return tMapMenu end, + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + nX = nX + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = nX, + y = nY, + w = 500, + h = COMPONENT_H, + placeholder = _L['Filter favorites'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + ui:Append('WndButton', { + name = 'Btn_Search', + x = nX, + y = nY, + w = 100, + h = COMPONENT_H, + text = _L['Search'], + onClick = function() + D.Search(page) + end, + }) + + ui:Append('WndTable', { + name = 'WndTable_List', + x = 20, + y = 50, + w = 960, + h = 560, + onRowHover = function(bIn, rec, nIndex, rect) + if not bIn then + HideTip() + return + end + local a = { + _L['Key'] .. ': ' .. tostring(rec and rec.key or ''), + _L['ID'] .. ': ' .. tostring(rec and rec.id or ''), + _L['Name'] .. ': ' .. tostring(rec and rec.szName or ''), + _L['Author'] .. ': ' .. tostring(rec and rec.szAuthor or ''), + _L['Update time'] .. ': ' .. tostring(rec and rec.dwUpdateTime or ''), + _L['About'] .. ': ' .. tostring(rec and rec.szAboutURL or ''), + } + local tipRect = nil + if X.IsTable(rect) then + tipRect = { rect.x or rect[1], rect.y or rect[2], rect.w or rect[3], rect.h or rect[4] } + end + X.OutputTip(tipRect, table.concat(a, '\n'), 106, X.UI.TIP_POSITION.RIGHT_LEFT, 450) + end, + onRowRClick = function(rec, nIndex) + if not rec then + return + end + local t = { + { + szOption = _L['Remove from favorites'], + fnAction = function() + D.Remove(rec) + end, + }, + } + PopupMenu(t) + end, + columns = { + { + key = 'szName', + title = _L['Name'], + alignHorizontal = 'left', + minWidth = 200, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'szAuthor', + title = _L['Author'], + alignHorizontal = 'center', + width = 150, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'dwUpdateTime', + title = _L('Update time'), + alignHorizontal = 'center', + width = 150, + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'use', + title = _L['Action'], + alignHorizontal = 'center', + width = 80, + render = function(_, record) + return GetFormatText(_L['Use'], 162, 255, 255, 0, 255, 'this.szURL = ' .. X.EncodeLUAData(record and record.szDataURL or ''), 'Text_Use') + end, + }, + }, + dataSource = {}, + }) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_YUN_WORLD_MARK__FAVORITE__LIST_UPDATE') + + D.Search(page) + D.OnResizePage() +end + +function D.OnActivePage() + D.Search(this) +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + -- 布局常量 + local nPadding = 20 + local nGap = 5 + local nMapW = 250 + local nBtnW = 100 + -- 搜索框动态宽度 + local nSearchW = nW - nPadding - nMapW - nGap - nGap - nBtnW - nPadding + if nSearchW < 100 then + nSearchW = 100 + end + ui:Fetch('WndEditBox_Search'):Size(nSearchW, 25) + -- 按钮位置 + ui:Fetch('Btn_Search'):Pos(nPadding + nMapW + nGap + nSearchW + nGap, 10) + -- 列表动态宽高 + ui:Fetch('WndTable_List'):Size(nW - 40, nH - 70) +end + +function D.OnEvent(event) + if event == 'MY_YUN_WORLD_MARK__FAVORITE__LIST_UPDATE' then + D.Search(this) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Text_Use' then + if not X.IsClientPlayerTeamMarker() then + X.OutputAnnounceMessage(_L['Only team marker can do this.']) + return + end + local szURL = this.szURL + if X.IsEmpty(szURL) then + return + end + MY_YunWorldMark.ApplyYunWorldMark(szURL) + + -- 防止重复点击:置灰并禁用 2 秒 + local nNow = GetTime and GetTime() or 0 + if this.__MY_UseDisabledUntil and this.__MY_UseDisabledUntil > nNow then + return + end + this.__MY_UseDisabledUntil = nNow + USE_DISABLE_MS + local el = this + if type(el.SetFontColor) == 'function' then + el:SetFontColor(unpack(USE_COLOR_DISABLED)) + end + local function RestoreUseButton() + if not el or (type(el.IsValid) == 'function' and not el:IsValid()) then + return + end + local nNow2 = GetTime and GetTime() or 0 + local nRemaining = (tonumber(el.__MY_UseDisabledUntil) or 0) - nNow2 + if nRemaining > 0 then + X.DelayCall(nRemaining, RestoreUseButton) + return + end + if type(el.SetFontColor) == 'function' then + el:SetFontColor(unpack(USE_COLOR_ACTIVE)) + end + end + X.DelayCall(USE_DISABLE_MS, RestoreUseButton) + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_Favorite', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + 'OnEvent', + 'OnItemLButtonClick', + }, + root = D, + }, + }, +} +MY_YunWorldMark.RegisterModule('Favorite', _L['Favorite list'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_Favorite', + exports = { + { + root = D, + fields = { + 'Load', + 'Save', + 'Add', + 'Remove', + 'IsFavorited', + }, + preset = 'UIEvent', + }, + }, +} +MY_YunWorldMark_Favorite = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_YunWorldMark_LocalData.lua b/MY_TeamTools/src/MY_YunWorldMark_LocalData.lua new file mode 100644 index 000000000..7370a8d3b --- /dev/null +++ b/MY_TeamTools/src/MY_YunWorldMark_LocalData.lua @@ -0,0 +1,628 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 云世界标记 - 本地数据 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_YunWorldMark_LocalData' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_YunWorldMark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. PLUGIN_NAME .. '/ui/MY_YunWorldMark_Subscribe.ini' +local D = {} + +-------------------------------------------------------------------------------- +-- 本地数据管理 +-------------------------------------------------------------------------------- + +function D.Load() + return X.LoadLUAData({'userdata/yun_world_mark/local_data.jx3dat', X.PATH_TYPE.GLOBAL}) or {} +end + +function D.Save(aLocalData) + X.SaveLUAData({'userdata/yun_world_mark/local_data.jx3dat', X.PATH_TYPE.GLOBAL}, aLocalData) + FireUIEvent('MY_YUN_WORLD_MARK__LOCAL_DATA__LIST_UPDATE') +end + +function D.GenerateKey() + return 'local_' .. tostring(GetTime()) .. '_' .. tostring(math.random(100000, 999999)) +end + +function D.Add(info, dwMapID) + if not info then + return + end + local aLocalData = D.Load() + -- 如果有key,移除已存在的相同 key + if info.key then + for i, p in X.ipairs_r(aLocalData) do + if p.key == info.key then + table.remove(aLocalData, i) + end + end + else + info.key = D.GenerateKey() + end + -- 保存地图信息 + local rec = X.Clone(info) + rec.dwMapID = dwMapID or 0 + rec.dwUpdateTime = GetCurrentTime() + table.insert(aLocalData, rec) + D.Save(aLocalData) + X.Alert(_L['Added to local data.']) +end + +function D.Update(info) + if not info or not info.key then + return + end + local aLocalData = D.Load() + for i, p in ipairs(aLocalData) do + if p.key == info.key then + info.dwUpdateTime = GetCurrentTime() + aLocalData[i] = X.Clone(info) + break + end + end + D.Save(aLocalData) + X.OutputAnnounceMessage(_L['Local data updated.']) +end + +function D.Remove(info) + if not info or not info.key then + return + end + X.Confirm(_L['Confirm?'], function() + local aLocalData = D.Load() + for i, p in X.ipairs_r(aLocalData) do + if p.key == info.key then + table.remove(aLocalData, i) + end + end + D.Save(aLocalData) + end) +end + +function D.IsInLocalData(info) + if not info or not info.key then + return false + end + for _, p in ipairs(D.Load()) do + if p.key == info.key then + return true + end + end + return false +end + +-- 格式化世界标记 JSON,与 ShowSceneWorldMark 保持一致 +function D.FormatWorldMarkJSON(aData) + if not X.IsTable(aData) or #aData == 0 then + return '' + end + local aText = { '[' } + for i, pt in ipairs(aData) do + local nX = tostring(tonumber(pt.x) or 0) + local nY = tostring(tonumber(pt.y) or 0) + local nZ = tostring(tonumber(pt.z) or 0) + local nMark = tostring(tonumber(pt.mark) or i) + local szLine = string.format('\t{ "x": %s, "y": %s, "z": %s, "mark": %s }', nX, nY, nZ, nMark) + if i < #aData then + szLine = szLine .. ',' + end + table.insert(aText, szLine) + end + table.insert(aText, ']') + return table.concat(aText, '\n') +end + +-------------------------------------------------------------------------------- +-- 数据编辑界面 +-------------------------------------------------------------------------------- + +function D.OpenEditPanel(rec) + local FRAME_NAME = 'MY_YunWorldMark_LocalData_Edit' + X.UI.CloseFrame(FRAME_NAME) + + local bEdit = rec and rec.key + local me = X.GetClientPlayer() + local dwDefaultMapID = (rec and rec.dwMapID) or (me and me.GetMapID()) or 0 + + local tMapName, aMapSource, tMapMenu = {}, {}, {} + for _, group in ipairs(X.GetTypeGroupMap()) do + local tSub = { szOption = group.szGroup } + for _, info in ipairs(group.aMapInfo) do + table.insert(tSub, { + szOption = info.szName, + fnAction = function() + D.nEditMapID = info.dwID + D.uiEditMap:Text(info.szName) + X.UI.ClosePopupMenu() + end, + }) + tMapName[info.dwID] = info.szName + table.insert(aMapSource, { text = info.szName, dwID = info.dwID }) + end + table.insert(tMapMenu, tSub) + end + + D.nEditMapID = dwDefaultMapID + + local ui = X.UI.CreateFrame(FRAME_NAME, { + w = 684, + h = 468, + close = true, + text = bEdit and _L['Edit local data'] or _L['Add local data'], + anchor = { s = 'CENTER', r = 'CENTER', x = 0, y = -100 }, + }) + + local nX, nY = 30, 60 + local nLabelW = 80 + local nInputW = 534 + local nLineH = 35 + + -- 数据地图 + ui:Append('Text', { x = nX, y = nY, w = nLabelW, h = 25, text = _L['Map'] .. ':' }) + D.uiEditMap = ui:Append('WndAutocomplete', { + name = 'WndAutocomplete_Map', + x = nX + nLabelW, + y = nY, + w = nInputW, + h = 25, + text = tMapName[dwDefaultMapID] or '', + placeholder = _L['Current map'], + autocomplete = { + { + 'option', 'source', aMapSource, + }, + { + 'option', 'afterComplete', function(raw) + if raw and raw.dwID then + D.nEditMapID = raw.dwID + end + end, + }, + }, + menu = function() return tMapMenu end, + }) + nY = nY + nLineH + + -- 数据标题 + ui:Append('Text', { x = nX, y = nY, w = nLabelW, h = 25, text = _L['Title'] .. ':' }) + local uiTitle = ui:Append('WndEditBox', { + name = 'WndEditBox_Title', + x = nX + nLabelW, + y = nY, + w = nInputW, + h = 25, + text = (rec and rec.szName) or '', + placeholder = _L['Data title'], + }) + nY = nY + nLineH + + -- 数据作者 + ui:Append('Text', { x = nX, y = nY, w = nLabelW, h = 25, text = _L['Author'] .. ':' }) + local uiAuthor = ui:Append('WndEditBox', { + name = 'WndEditBox_Author', + x = nX + nLabelW, + y = nY, + w = nInputW, + h = 25, + text = (rec and rec.szAuthor) or (me and me.szName) or '', + placeholder = _L['Data author'], + }) + nY = nY + nLineH + + -- 数据内容 + ui:Append('Text', { x = nX, y = nY, w = nLabelW, h = 25, text = _L['Content'] .. ':' }) + local uiContent = ui:Append('WndEditBox', { + name = 'WndEditBox_Content', + x = nX + nLabelW, + y = nY, + w = nInputW, + h = 250, + multiline = true, + text = (rec and rec.aData and D.FormatWorldMarkJSON(rec.aData)) or '', + placeholder = _L['World mark json data'], + }) + nY = nY + 260 + + -- 确认按钮 + ui:Append('WndButton', { + name = 'Btn_Confirm', + x = 292, + y = nY, + w = 100, + h = 30, + text = _L['Confirm'], + onClick = function() + local szTitle = uiTitle:Text() + local szAuthor = uiAuthor:Text() + local szContent = uiContent:Text() + + if X.IsEmpty(szTitle) then + X.OutputAnnounceMessage(_L['Please input title.']) + return + end + + local aData = nil + if not X.IsEmpty(szContent) then + aData = X.DecodeJSON(szContent) + if not X.IsTable(aData) then + X.OutputAnnounceMessage(_L('Decode %s failed!', _L['World mark'])) + return + end + end + + local info = { + key = (rec and rec.key) or nil, + szName = szTitle, + szAuthor = szAuthor, + aData = aData, + dwMapID = D.nEditMapID, + } + + if bEdit then + D.Update(info) + else + D.Add(info, D.nEditMapID) + end + + X.UI.CloseFrame(FRAME_NAME) + end, + }) +end + +-------------------------------------------------------------------------------- +-- 界面逻辑 +-------------------------------------------------------------------------------- + +function D.Search(page) + if not page or not page:IsValid() then + return + end + local ui = X.UI(page) + local szSearch = X.TrimString(ui:Fetch('WndEditBox_Search'):Text() or ''):lower() + local dwMapID = D.dwMapID or 0 + + local aLocalData = D.Load() + local aDataSource = {} + for _, rec in ipairs(aLocalData) do + local bMatchMap = (dwMapID == 0) or (rec.dwMapID == dwMapID) + local bMatchSearch = X.IsEmpty(szSearch) + or (rec.szName and rec.szName:lower():find(szSearch, 1, true)) + or (rec.szAuthor and rec.szAuthor:lower():find(szSearch, 1, true)) + or (rec.key and rec.key:lower():find(szSearch, 1, true)) + if bMatchMap and bMatchSearch then + table.insert(aDataSource, rec) + end + end + ui:Fetch('WndTable_List'):DataSource(aDataSource) +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + local me = X.GetClientPlayer() + if me then + D.dwMapID = me.GetMapID() or 0 + else + D.dwMapID = 0 + end + + local tMapName, aMapSource, tMapMenu = {}, {}, {} + table.insert(tMapMenu, { + szOption = _L['All maps'], + fnAction = function() + D.dwMapID = 0 + ui:Fetch('WndAutocomplete_Map'):Text('') + X.UI.ClosePopupMenu() + D.Search(page) + end, + }) + for _, group in ipairs(X.GetTypeGroupMap()) do + local tSub = { szOption = group.szGroup } + for _, info in ipairs(group.aMapInfo) do + table.insert(tSub, { + szOption = info.szName, + fnAction = function() + D.dwMapID = info.dwID + ui:Fetch('WndAutocomplete_Map'):Text(info.szName) + X.UI.ClosePopupMenu() + D.Search(page) + end, + }) + tMapName[info.dwID] = info.szName + table.insert(aMapSource, { text = info.szName, dwID = info.dwID }) + end + table.insert(tMapMenu, tSub) + end + local szCurrentMapName = tMapName[D.dwMapID] or '' + + local nX, nY = 20, 10 + local COMPONENT_H = 25 + + nX = nX + ui:Append('WndAutocomplete', { + name = 'WndAutocomplete_Map', + x = nX, + y = nY, + w = 250, + h = COMPONENT_H, + text = szCurrentMapName, + placeholder = _L['Current map'], + autocomplete = { + { + 'option', 'source', aMapSource, + }, + { + 'option', 'afterComplete', function(raw) + if raw and raw.dwID then + D.dwMapID = raw.dwID + else + D.dwMapID = 0 + end + end, + }, + }, + menu = function() return tMapMenu end, + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + nX = nX + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = nX, + y = nY, + w = 500, + h = COMPONENT_H, + placeholder = _L['Filter local data'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + name = 'Btn_Search', + x = nX, + y = nY, + w = 100, + h = COMPONENT_H, + text = _L['Search'], + onClick = function() + D.Search(page) + end, + }):Width() + 5 + + ui:Append('WndButton', { + name = 'Btn_Add', + x = nX, + y = nY, + w = 35, + h = COMPONENT_H, + text = '+', + onClick = function() + D.OpenEditPanel() + end, + }) + + ui:Append('WndTable', { + name = 'WndTable_List', + x = 20, + y = 50, + w = 960, + h = 560, + onRowHover = function(bIn, rec, nIndex, rect) + if not bIn then + HideTip() + return + end + local szUpdateTime = '' + if rec and rec.dwUpdateTime then + szUpdateTime = X.FormatRelativeTime(rec.dwUpdateTime) + end + local a = { + _L['Key'] .. ': ' .. tostring(rec and rec.key or ''), + _L['Name'] .. ': ' .. tostring(rec and rec.szName or ''), + _L['Author'] .. ': ' .. tostring(rec and rec.szAuthor or ''), + _L['Update time'] .. ': ' .. szUpdateTime, + } + local tipRect = nil + if X.IsTable(rect) then + tipRect = { rect.x or rect[1], rect.y or rect[2], rect.w or rect[3], rect.h or rect[4] } + end + X.OutputTip(tipRect, table.concat(a, '\n'), 106, X.UI.TIP_POSITION.RIGHT_LEFT, 450) + end, + onRowRClick = function(rec, nIndex) + if not rec then + return + end + local t = { + { + szOption = _L['Edit data'], + fnAction = function() + D.OpenEditPanel(rec) + end, + }, + { + szOption = _L['Delete data'], + fnAction = function() + D.Remove(rec) + end, + }, + } + PopupMenu(t) + end, + columns = { + { + key = 'szName', + title = _L['Name'], + alignHorizontal = 'left', + minWidth = 200, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'szAuthor', + title = _L['Author'], + alignHorizontal = 'center', + width = 150, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'dwUpdateTime', + title = _L['Update time'], + alignHorizontal = 'center', + width = 150, + render = function(value) + local szTime = '' + if value then + szTime = X.FormatRelativeTime(value) + end + return GetFormatText(' ' .. szTime, 162, 255, 255, 255) + end, + }, + { + key = 'use', + title = _L['Action'], + alignHorizontal = 'center', + width = 80, + render = function(_, record) + return GetFormatText(_L['Use'], 162, 255, 255, 0, 255, 'this.rec = ' .. X.EncodeLUAData(record), 'Text_Use_Local') + end, + }, + }, + dataSource = {}, + }) + + local frame = this:GetRoot() + frame:RegisterEvent('MY_YUN_WORLD_MARK__LOCAL_DATA__LIST_UPDATE') + + D.Search(page) + D.OnResizePage() +end + +function D.OnActivePage() + D.Search(this) +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + -- 布局常量 + local nPadding = 20 + local nGap = 5 + local nMapW = 250 + local nBtnW = 100 + local nAddW = 35 + -- 搜索框动态宽度 + local nSearchW = nW - nPadding - nMapW - nGap - nGap - nBtnW - nGap - nAddW - nPadding + if nSearchW < 100 then + nSearchW = 100 + end + ui:Fetch('WndEditBox_Search'):Size(nSearchW, 25) + -- 按钮位置 + ui:Fetch('Btn_Search'):Pos(nPadding + nMapW + nGap + nSearchW + nGap, 10) + ui:Fetch('Btn_Add'):Pos(nPadding + nMapW + nGap + nSearchW + nGap + nBtnW + nGap, 10) + -- 列表动态宽高 + ui:Fetch('WndTable_List'):Size(nW - 40, nH - 70) +end + +function D.OnEvent(event) + if event == 'MY_YUN_WORLD_MARK__LOCAL_DATA__LIST_UPDATE' then + D.Search(this) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Text_Use_Local' then + if not X.IsClientPlayerTeamMarker() then + X.OutputAnnounceMessage(_L['Only team marker can do this.']) + return + end + local rec = this.rec + if not rec or not rec.aData then + X.OutputAnnounceMessage(_L['No data.']) + return + end + -- 直接应用本地数据,不拉取远端 + MY_YunWorldMark.ApplyWorldMark(rec.aData) + end +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_LocalData', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + 'OnEvent', + 'OnItemLButtonClick', + }, + root = D, + }, + }, +} +MY_YunWorldMark.RegisterModule('LocalData', _L['Local data'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_LocalData', + exports = { + { + root = D, + fields = { + 'Load', + 'Save', + 'Add', + 'Update', + 'Remove', + 'IsInLocalData', + 'OpenEditPanel', + }, + preset = 'UIEvent', + }, + }, +} +MY_YunWorldMark_LocalData = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/src/MY_YunWorldMark_Subscribe.lua b/MY_TeamTools/src/MY_YunWorldMark_Subscribe.lua new file mode 100644 index 000000000..e679aa118 --- /dev/null +++ b/MY_TeamTools/src/MY_YunWorldMark_Subscribe.lua @@ -0,0 +1,575 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 云世界标记 - 数据订阅 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_TeamTools/MY_YunWorldMark_Subscribe' +local PLUGIN_NAME = 'MY_TeamTools' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_YunWorldMark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.1') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local INI_PATH = X.PACKET_INFO.ROOT .. PLUGIN_NAME .. '/ui/MY_YunWorldMark_Subscribe.ini' +local D = {} + +local USE_DISABLE_MS = 1000 +local USE_COLOR_ACTIVE = { 255, 255, 0 } +local USE_COLOR_DISABLED = { 128, 128, 128 } + +function D.ShowSceneWorldMark() + local tTemplateToIndex = {} + for _, info in ipairs((X.CONSTANT and X.CONSTANT.WORLD_MARK) or {}) do + if info and info.dwNpcTemplateID and info.nIndex then + tTemplateToIndex[info.dwNpcTemplateID] = info.nIndex + end + end + + local data = {} + for i = 1, 10 do + data[i] = { x = 0, y = 0, z = 0, mark = i } + end + + for _, npc in ipairs(X.GetNearNpc()) do + local nIndex = npc and tTemplateToIndex[npc.dwTemplateID] + if nIndex and nIndex >= 1 and nIndex <= 10 then + local nX = tonumber(npc.nX) or 0 + local nY = tonumber(npc.nY) or 0 + local nZ = tonumber(npc.nZ) or 0 + if not (nX == 0 and nY == 0 and nZ == 0) then + data[nIndex] = { x = nX, y = nY, z = nZ, mark = nIndex } + end + end + end + + -- 手动拼接可读的 JSON(同时保证能被 X.DecodeJSON 解析) + -- 约束:第一层列表项使用 \t + 换行;对象内部不再使用 \t。 + local aText = { '[', } + for i = 1, 10 do + local pt = data[i] or {} + local nX = tostring(tonumber(pt.x) or 0) + local nY = tostring(tonumber(pt.y) or 0) + local nZ = tostring(tonumber(pt.z) or 0) + local nMark = tostring(tonumber(pt.mark) or i) + local szLine = string.format('\t{ "x": %s, "y": %s, "z": %s, "mark": %s }', nX, nY, nZ, nMark) + if i < 10 then + szLine = szLine .. ',' + end + table.insert(aText, szLine) + end + table.insert(aText, ']') + local szText = table.concat(aText, '\n') + X.UI.OpenTextEditor(szText, { + w = 450, + h = 300, + title = _L['World mark'], + }) +end + +function D.Search(page, nPage) + if not page or not page:IsValid() then + return + end + local ui = X.UI(page) + + -- 防止并发搜索回调覆盖新结果 + D.nSearchToken = (tonumber(D.nSearchToken) or 0) + 1 + local nToken = D.nSearchToken + + nPage = tonumber(nPage) or 1 + if nPage < 1 then + nPage = 1 + end + + local szSearch = X.TrimString(ui:Fetch('WndEditBox_Search'):Text() or '') + local dwMapID = D.dwMapID or 0 + + local aAllList = nil + local tFeedRecord = nil + local nPending = 0 + local function fnToRecord(tInfo) + if not X.IsTable(tInfo) then + return nil + end + return { + id = tInfo.id, + key = tInfo.key, + szName = tInfo.name, + szAuthor = tInfo.author, + dwUpdateTime = tInfo.update, + szDataURL = tInfo.data_url, + szAboutURL = tInfo.about, + tRaw = tInfo, + } + end + local function fnFinalize() + if nToken ~= D.nSearchToken then + return + end + if nPending > 0 then + return + end + + local aDataSource = {} + local nFeedID = nil + if X.IsTable(tFeedRecord) and tFeedRecord.id then + nFeedID = tFeedRecord.id + table.insert(aDataSource, tFeedRecord) + end + for _, rec in ipairs(aAllList or {}) do + if not (nFeedID and rec and rec.id == nFeedID) then + table.insert(aDataSource, rec) + end + end + ui:Fetch('WndTable_List'):DataSource(aDataSource) + end + local function fnDoneOne() + nPending = nPending - 1 + fnFinalize() + end + + -- 1) 排行榜列表 + nPending = nPending + 1 + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/common-monitor/subscribe/all', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + T = 3, + map = dwMapID, + q = szSearch, + page = nPage, + pageSize = 100, + }, + success = function(szHTML) + if nToken ~= D.nSearchToken then + return + end + local res = X.DecodeJSON(szHTML) + if not X.IsTable(res) or not X.IsTable(res.data) then + X.OutputAnnounceMessage(_L['Fetch repo meta list failed.']) + aAllList = {} + fnDoneOne() + return + end + local a = {} + for _, info in ipairs(res.data) do + table.insert(a, fnToRecord(info)) + end + aAllList = a + fnDoneOne() + end, + error = function(html, status) + if nToken ~= D.nSearchToken then + return + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L[MODULE_NAME], 'ERROR Fetch list: ' .. X.EncodeLUAData(status) .. '\n' .. (X.ConvertToANSI(html) or ''), X.DEBUG_LEVEL.WARNING) + --[[#DEBUG END]] + X.OutputAnnounceMessage(_L['Fetch repo meta list failed.']) + aAllList = {} + fnDoneOne() + end, + }) + + -- 2) 精准匹配(不在排行榜也能查) + if not X.IsEmpty(szSearch) then + nPending = nPending + 1 + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/addon/common-monitor/subscribe/feed', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + T = 3, + map = dwMapID, + key = szSearch, + }, + success = function(szHTML) + if nToken ~= D.nSearchToken then + return + end + local res = X.DecodeJSON(szHTML) + -- 不存在:{"code":404,"msg":"数据不存在"} + if X.IsTable(res) and res.id then + tFeedRecord = fnToRecord(res) + else + tFeedRecord = nil + end + fnDoneOne() + end, + error = function(szHtml, szStatus) + if nToken ~= D.nSearchToken then + return + end + tFeedRecord = nil + fnDoneOne() + end, + }) + end + + fnFinalize() +end + +function D.OnInitPage() + local page = this + local ui = X.UI(page) + + local me = X.GetClientPlayer() + if me then + D.dwMapID = me.GetMapID() or 0 + else + D.dwMapID = 0 + end + + local tMapName, aMapSource, tMapMenu = {}, {}, {} + for _, group in ipairs(X.GetTypeGroupMap()) do + local tSub = { szOption = group.szGroup } + for _, info in ipairs(group.aMapInfo) do + table.insert(tSub, { + szOption = info.szName, + fnAction = function() + D.dwMapID = info.dwID + ui:Fetch('WndAutocomplete_Map'):Text(info.szName) + X.UI.ClosePopupMenu() + end, + }) + tMapName[info.dwID] = info.szName + table.insert(aMapSource, { text = info.szName, dwID = info.dwID }) + end + table.insert(tMapMenu, tSub) + end + local szCurrentMapName = tMapName[D.dwMapID] or '' + + local dwTargetType, dwTargetID = 0, 0 + if me then + dwTargetType, dwTargetID = X.GetCharacterTarget(me) + end + + local nX, nY = 20, 10 + local COMPONENT_H = 25 + + nX = nX + ui:Append('WndAutocomplete', { + name = 'WndAutocomplete_Map', + x = nX, + y = nY, + w = 250, + h = COMPONENT_H, + text = szCurrentMapName, + placeholder = _L['Current map'], + autocomplete = { + { + 'option', 'source', aMapSource, + }, + { + 'option', 'afterComplete', function(raw) + if raw and raw.dwID then + D.dwMapID = raw.dwID + end + end, + }, + }, + menu = function() return tMapMenu end, + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + nX = nX + ui:Append('WndEditBox', { + name = 'WndEditBox_Search', + x = nX, + y = nY, + w = 500, + h = COMPONENT_H, + text = dwTargetType == TARGET.NPC and X.GetNpcName(dwTargetID) or '', + placeholder = _L['Search'], + onSpecialKeyDown = function(_, szKey) + if szKey == 'Enter' then + D.Search(page) + return 1 + end + end, + }):Width() + 5 + + nX = nX + ui:Append('WndButton', { + name = 'Btn_Search', + x = nX, + y = nY, + w = 100, + h = COMPONENT_H, + text = _L['Search'], + onClick = function() + D.Search(page) + end, + }):Width() + 5 + + ui:Append('WndTable', { + name = 'WndTable_List', + x = 20, + y = 50, + w = 960, + h = 560, + onRowHover = function(bIn, rec, nIndex, rect) + if not bIn then + HideTip() + return + end + local a = { + _L['Key'] .. ': ' .. tostring(rec and rec.key or ''), + _L['ID'] .. ': ' .. tostring(rec and rec.id or ''), + _L['Name'] .. ': ' .. tostring(rec and rec.szName or ''), + _L['Author'] .. ': ' .. tostring(rec and rec.szAuthor or ''), + _L['Update time'] .. ': ' .. tostring(rec and rec.dwUpdateTime or ''), + _L['About'] .. ': ' .. tostring(rec and rec.szAboutURL or ''), + } + local tipRect = nil + if X.IsTable(rect) then + tipRect = { rect.x or rect[1], rect.y or rect[2], rect.w or rect[3], rect.h or rect[4] } + end + X.OutputTip(tipRect, table.concat(a, '\n'), 106, X.UI.TIP_POSITION.RIGHT_LEFT, 450) + end, + onRowRClick = function(rec, nIndex) + if not rec then + return + end + local t = { + { + szOption = MY_YunWorldMark_Favorite.IsFavorited(rec) and _L['Remove from favorites'] or _L['Add to favorites'], + fnAction = function() + if MY_YunWorldMark_Favorite.IsFavorited(rec) then + MY_YunWorldMark_Favorite.Remove(rec) + else + MY_YunWorldMark_Favorite.Add(rec, D.dwMapID) + end + end, + }, + { + szOption = _L['Add to local data'], + fnAction = function() + if not rec.szDataURL then + return + end + X.FetchLUAData(rec.szDataURL, { passphrase = false, crc = false, compress = false }) + :Then(function(aData) + if not X.IsTable(aData) then + X.OutputAnnounceMessage(_L('Decode %s failed!', _L['World mark'])) + return + end + -- 清洗数据,只保留 x, y, z, mark + local aCleanData = {} + for i, pt in ipairs(aData) do + aCleanData[i] = { + x = tonumber(pt.x) or 0, + y = tonumber(pt.y) or 0, + z = tonumber(pt.z) or 0, + mark = tonumber(pt.mark) or i, + } + end + MY_YunWorldMark_LocalData.Add({ + szName = rec.szName, + szAuthor = rec.szAuthor, + aData = aCleanData, + }, D.dwMapID) + end) + :Catch(function(error) + X.OutputAnnounceMessage((error and error.message) or _L['Failed.']) + end) + end, + }, + } + PopupMenu(t) + end, + columns = { + { + key = 'szName', + title = _L['Name'], + alignHorizontal = 'left', + minWidth = 200, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'szAuthor', + title = _L['Author'], + alignHorizontal = 'center', + width = 150, + overflow = 'hidden', + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'dwUpdateTime', + title = _L['Update time'], + alignHorizontal = 'center', + width = 150, + render = function(value) + return GetFormatText(' ' .. X.ReplaceSensitiveWord(tostring(value or '')), 162, 255, 255, 255) + end, + }, + { + key = 'use', + title = _L['Action'], + alignHorizontal = 'center', + width = 80, + render = function(_, record) + return GetFormatText(_L['Use'], 162, 255, 255, 0, 255, 'this.szURL = ' .. X.EncodeLUAData(record and record.szDataURL or ''), 'Text_Use') + end, + }, + }, + dataSource = {}, + }) + + D.Search(page, 1) + D.OnResizePage() +end + +function D.OnActivePage() +end + +function D.OnResizePage() + local page = this + local ui = X.UI(page) + local nW, nH = ui:Size() + -- 布局常量 + local nPadding = 20 + local nGap = 5 + local nMapW = 250 + local nBtnW = 100 + -- 搜索框动态宽度 + local nSearchW = nW - nPadding - nMapW - nGap - nGap - nBtnW - nPadding + if nSearchW < 100 then + nSearchW = 100 + end + ui:Fetch('WndEditBox_Search'):Size(nSearchW, 25) + -- 按钮位置 + ui:Fetch('Btn_Search'):Pos(nPadding + nMapW + nGap + nSearchW + nGap, 10) + -- 列表动态宽高 + ui:Fetch('WndTable_List'):Size(nW - 40, nH - 70) +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Text_Use' then + if not X.IsClientPlayerTeamMarker() then + X.OutputAnnounceMessage(_L['Only team marker can do this.']) + return + end + local szURL = this.szURL + if X.IsEmpty(szURL) then + return + end + MY_YunWorldMark.ApplyYunWorldMark(szURL) + + -- 防止重复点击:置灰并禁用 2 秒 + local nNow = GetTime and GetTime() or 0 + if this.__MY_UseDisabledUntil and this.__MY_UseDisabledUntil > nNow then + return + end + this.__MY_UseDisabledUntil = nNow + USE_DISABLE_MS + local el = this + if type(el.SetFontColor) == 'function' then + el:SetFontColor(unpack(USE_COLOR_DISABLED)) + end + local function RestoreUseButton() + if not el or (type(el.IsValid) == 'function' and not el:IsValid()) then + return + end + local nNow2 = GetTime and GetTime() or 0 + local nRemaining = (tonumber(el.__MY_UseDisabledUntil) or 0) - nNow2 + if nRemaining > 0 then + X.DelayCall(nRemaining, RestoreUseButton) + return + end + if type(el.SetFontColor) == 'function' then + el:SetFontColor(unpack(USE_COLOR_ACTIVE)) + end + end + X.DelayCall(USE_DISABLE_MS, RestoreUseButton) + end +end + +-------------------------------------------------------------------------------- +-- 目标头像菜单:副本内 NPC 右键快捷搜索 +-------------------------------------------------------------------------------- +do +local function GetNpcTargetMenu() + if not X.IsInDungeonMap() then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local dwType = X.GetCharacterTarget(me) + if dwType ~= TARGET.NPC then + return + end + return { + szOption = _L['Search MY cloud world mark'], + fnAction = function() + MY_YunWorldMark.OpenPanel() + end, + } +end +X.RegisterTargetAddonMenu('MY_YunWorldMark', GetNpcTargetMenu) +end + +-------------------------------------------------------------------------------- +-- 模块导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_Subscribe', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnInitPage', + 'OnActivePage', + 'OnResizePage', + 'OnDeactivePage', + 'OnItemLButtonClick', + }, + root = D, + }, + }, +} +MY_YunWorldMark.RegisterModule('Subscribe', _L['Data subscribe'], X.CreateModule(settings)) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunWorldMark_Subscribe', + exports = { + { + root = D, + fields = { + 'Search', + 'ShowSceneWorldMark', + }, + preset = 'UIEvent', + }, + }, +} +MY_YunWorldMark_Subscribe = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_TeamTools/ui/MY_EvokeRequest.ini b/MY_TeamTools/ui/MY_EvokeRequest.ini new file mode 100644 index 000000000..605279e70 --- /dev/null +++ b/MY_TeamTools/ui/MY_EvokeRequest.ini @@ -0,0 +1,51 @@ +[MY_EvokeRequest] +._WndType=WndFrame +._Parent=Normal2 +Left=80 +Top=80 +Width=515 +Height=350 +DragAreaWidth=470 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_EvokeRequest] +._WndType=WndWindow +._Parent=MY_EvokeRequest +Left=45 +Top=0 +Width=470 +Height=53 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_EvokeRequest +Left=0 +Top=0 +Width=470 +Height=53 +HandleType=0 +FirstItemPosType=0 +PosType=0 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=15 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=茗伊 +OrgText=1 +FontScheme=15 +FontColor= + diff --git a/MY_TeamTools/ui/MY_JBEventVote.ini b/MY_TeamTools/ui/MY_JBEventVote.ini new file mode 100644 index 000000000..9c510b1bd --- /dev/null +++ b/MY_TeamTools/ui/MY_JBEventVote.ini @@ -0,0 +1,318 @@ +[MY_JBEventVote] +._WndType=WndFrame +._Parent=Normal +Width=1096 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 + +[Btn_Close] +._WndType=WndButton +._Parent=MY_JBEventVote +Frame=0 +Left=1056 +Top=15 +$Tip=STR_CLOSE +OrgTip=0 +Width=30 +Height=30 +NormalGroup=43 +MouseOverGroup=44 +MouseDownGroup=45 +DisableGroup=42 +Image=ui\Image\UICommon\CommonPanel.UITex +DummyWnd=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Handle_Total] +._WndType=Handle +._Parent=MY_JBEventVote +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=1096 +Height=700 +EventID=528 + +[Image_Bg01L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=2 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=548 +Height=80 + +[Image_Bg01R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=2 +Alpha=255 +PosType=7 +ImageType=8 +Width=548 +Height=80 + +[Image_Bg02R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=67 +Alpha=255 +PosType=11 +Width=8 +Height=548 + +[Image_Bg02C] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=65 +Alpha=255 +PosType=2 +ImageType=0 +Width=1080 +Height=548 + +[Image_Bg02L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=66 +Alpha=255 +PosType=2 +Width=8 +Height=548 + +[Image_Bg03L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=5 +Alpha=255 +PosType=10 +Width=124 +Height=85 + +[Image_Bg03C] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=4 +Alpha=255 +PosType=7 +Width=964 +Height=85 + +[Image_Bg03R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=3 +Alpha=255 +PosType=7 +Width=8 +Height=85 + +[Text_Title] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=MY_JBEventRank +Left=0 +Top=10 +PosType=0 +FontScheme=2 +Width=1096 +Height=30 +HAlign=1 +VAlign=1 +EventID=256 +TipRichText=0 +OrgText=1 + +[Image_TabBg] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\ActivePopularize2.UITex +Frame=46 +Alpha=255 +Left=3 +Top=50 +PosType=0 +Width=1091 +Height=32 +ImageType=11 + +[Image_Icon] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=14 +Alpha=255 +Left=10 +Top=-10 +PosType=0 + +[Image_Break0] +._WndType=Image +._Parent=Handle_Total +Left=30 +Top=50 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Handle_Record_Stat] +._WndType=Handle +._Parent=Handle_Total +Left=20 +Top=620 +PosType=0 +HandleType=3 +HAlign=0 +VAlign=1 +RowSpacing=0 +EventID=256 + +[PageSet_All] +._WndType=WndPageSet +._Parent=MY_JBEventVote +Left=0 +Top=48 +Width=1096 +Height=665 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +PageCount=0 + +[Wnd_Search] +._WndType=WndWindow +._Parent=MY_JBEventVote +Left=827 +Top=53 +Width=235 +Height=25 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Search] +._WndType=Handle +._Parent=Wnd_Search +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=235 +Height=25 + +[Image_SearchBg] +._WndType=Image +._Parent=Handle_Search +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=48 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=232 +Height=25 +ImageType=10 + +[Image_Search] +._WndType=Image +._Parent=Handle_Search +Image=interface/MY/MY_!Base/img/UIComponents.UITex +Frame=4 +Alpha=180 +Left=202 +Top=-4 +PosType=0 +ImageType=0 + +[Edit_Search] +._WndType=WndEdit +._Parent=Wnd_Search +MaxLen=32 +SelectBgColorAlpha=255 +FocusBgColorAlpha=30 +RowSpacing=0 +FontSpacing=0 +Left=6 +Top=3 +Width=199 +Height=20 +Type=2 +SelectBgColor=gray4 +FocusBgColor=white +FontScheme=162 +SelFontScheme=162 +CaretFontScheme=162 +DummyWnd=0 +$Placeholder=搜索服务器、团队名称 +OrgPlaceholder=1 +PlaceholderAlpha=150 + +[Btn_Option] +._WndType=WndButton +._Parent=MY_JBEventVote +Left=1056 +Top=54 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=22 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 +LockShowAndHide=1 + diff --git a/MY_TeamTools/ui/MY_JBEventVote__Mod.ini b/MY_TeamTools/ui/MY_JBEventVote__Mod.ini new file mode 100644 index 000000000..ced757e16 --- /dev/null +++ b/MY_TeamTools/ui/MY_JBEventVote__Mod.ini @@ -0,0 +1,1028 @@ +[MY_JBEventVote__Mod] +._WndType=WndFrame +._Parent=Normal +Width=1096 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 + +[Btn_Close] +._WndType=WndButton +._Parent=MY_JBEventVote__Mod +Frame=0 +Left=1056 +Top=15 +$Tip=STR_CLOSE +OrgTip=0 +Width=30 +Height=30 +NormalGroup=43 +MouseOverGroup=44 +MouseDownGroup=45 +DisableGroup=42 +Image=ui\Image\UICommon\CommonPanel.UITex +DummyWnd=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + +[Handle_Total] +._WndType=Handle +._Parent=MY_JBEventVote__Mod +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=1096 +Height=700 +EventID=528 + +[Image_Bg01L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=2 +Alpha=255 +Left=0 +Top=0 +PosType=0 +Width=548 +Height=80 + +[Image_Bg01R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=2 +Alpha=255 +PosType=7 +ImageType=8 +Width=548 +Height=80 + +[Image_Bg02R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=67 +Alpha=255 +PosType=11 +Width=8 +Height=548 + +[Image_Bg02C] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=65 +Alpha=255 +PosType=2 +ImageType=0 +Width=1080 +Height=548 + +[Image_Bg02L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=66 +Alpha=255 +PosType=2 +Width=8 +Height=548 + +[Image_Bg03L] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=5 +Alpha=255 +PosType=10 +Width=124 +Height=85 + +[Image_Bg03C] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=4 +Alpha=255 +PosType=7 +Width=964 +Height=85 + +[Image_Bg03R] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=3 +Alpha=255 +PosType=7 +Width=8 +Height=85 + +[Text_Title] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=MY_JBEventRank +Left=0 +Top=10 +PosType=0 +FontScheme=2 +Width=1096 +Height=30 +HAlign=1 +VAlign=1 +EventID=256 +TipRichText=0 +OrgText=1 + +[Image_TabBg] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\ActivePopularize2.UITex +Frame=46 +Alpha=255 +Left=3 +Top=50 +PosType=0 +Width=1091 +Height=32 +ImageType=11 + +[Image_Icon] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=14 +Alpha=255 +Left=10 +Top=-10 +PosType=0 + +[Image_Break0] +._WndType=Image +._Parent=Handle_Total +Left=30 +Top=50 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Handle_Record_Stat] +._WndType=Handle +._Parent=Handle_Total +Left=20 +Top=620 +PosType=0 +HandleType=3 +HAlign=0 +VAlign=1 +RowSpacing=0 +EventID=256 + +[PageSet_All] +._WndType=WndPageSet +._Parent=MY_JBEventVote__Mod +Left=0 +Top=48 +Width=1096 +Height=665 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +PageCount=0 + +[WndCheck_Event] +._WndType=WndCheckBox +._Parent=PageSet_All +Left=30 +Top=2 +Width=120 +Height=28 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckEvent] +._WndType=Handle +._Parent=WndCheck_Event +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=768 +Width=1 +Height=1 + +[Image_CheckEventBreak] +._WndType=Image +._Parent=Handle_CheckEvent +Left=120 +Top=0 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Text_CheckEvent] +._WndType=Text +._Parent=Handle_CheckEvent +Left=0 +Top=1 +PosType=0 +Width=120 +Height=30 +MultiLine=0 +HAlign=1 +VAlign=1 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=EVENT +ShowAll=0 +AutoEtc=1 + +[Page_Event] +._WndType=WndPage +._Parent=PageSet_All +Left=0 +Top=32 +Width=1096 +Height=633 +DummyWnd=0 +Frame=0 + +[Wnd_Event] +._WndType=WndWindow +._Parent=Page_Event +Left=0 +Top=0 +Width=1096 +Height=633 +DummyWnd=0 +Frame=0 + +[WndScroll_Event] +._WndType=WndScroll +._Parent=Wnd_Event +Left=20 +Top=27 +Width=1071 +Height=574 +ScrollHandle= +ScrollContainer=WndContainer_List +VerScrollBar=Scroll_Event_All +ScrollButtonUp=Btn_Event_Up +ScrollButtonDown=Btn_Event_Down + +[Handle_Event] +._WndType=Handle +._Parent=WndScroll_Event +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Stat_BG_4] +._WndType=Image +._Parent=Handle_Event +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=1056 +Height=574 + +[Image_Stat_BG1_4] +._WndType=Image +._Parent=Handle_Event +Left=2 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=1052 +Height=544 + +[Image_Stat_Line1_0_4] +._WndType=Image +._Parent=Handle_Event +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=1050 +Height=3 + +[Handle_EventColumns] +._WndType=Handle +._Parent=Handle_Event +Left=2 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=1052 +Height=574 + +[Handle_EventColumn_Name] +._WndType=Handle +._Parent=Handle_EventColumns +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=150 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_EventColumn_Name_Break] +._WndType=Image +._Parent=Handle_EventColumn_Name +Left=150 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=570 + +[Handle_EventColumn_Name_Title] +._WndType=Handle +._Parent=Handle_EventColumn_Name +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=150 +Height=30 +PixelScroll=1 + +[Text_EventColumn_Name_Title] +._WndType=Text +._Parent=Handle_EventColumn_Name_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=NAME +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Image_EventColumn_Name_Asc] +._WndType=Image +._Parent=Handle_EventColumn_Name +Left=0 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 +LockShowAndHide=1 + +[Image_EventColumn_Name_Desc] +._WndType=Image +._Parent=Handle_EventColumn_Name +Left=0 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 +LockShowAndHide=1 + +[Handle_EventColumn_Server] +._WndType=Handle +._Parent=Handle_EventColumns +Left=150 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=150 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_EventColumn_Server_Break] +._WndType=Image +._Parent=Handle_EventColumn_Server +Left=150 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=570 + +[Handle_EventColumn_Server_Title] +._WndType=Handle +._Parent=Handle_EventColumn_Server +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=150 +Height=30 +PixelScroll=1 + +[Text_EventColumn_Server_Title] +._WndType=Text +._Parent=Handle_EventColumn_Server_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=SERVER +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Image_EventColumn_Server_Asc] +._WndType=Image +._Parent=Handle_EventColumn_Server +Left=0 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 +LockShowAndHide=1 + +[Image_EventColumn_Server_Desc] +._WndType=Image +._Parent=Handle_EventColumn_Server +Left=0 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 +LockShowAndHide=1 + +[Handle_EventColumn_Leader] +._WndType=Handle +._Parent=Handle_EventColumns +Left=300 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_EventColumn_Leader_Break] +._WndType=Image +._Parent=Handle_EventColumn_Leader +Left=150 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=570 + +[Handle_EventColumn_Leader_Title] +._WndType=Handle +._Parent=Handle_EventColumn_Leader +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=150 +Height=30 +PixelScroll=1 + +[Text_EventColumn_Leader_Title] +._WndType=Text +._Parent=Handle_EventColumn_Leader_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=150 +Height=30 +ShowAll=0 +AutoEtc=1 +$Text=LEADER + +[Image_EventColumn_Leader_Asc] +._WndType=Image +._Parent=Handle_EventColumn_Leader +Left=0 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 +LockShowAndHide=1 + +[Image_EventColumn_Leader_Desc] +._WndType=Image +._Parent=Handle_EventColumn_Leader +Left=0 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 +LockShowAndHide=1 + +[Handle_EventColumn_Slogan] +._WndType=Handle +._Parent=Handle_EventColumns +Left=450 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_EventColumn_Slogan_Break] +._WndType=Image +._Parent=Handle_EventColumn_Slogan +Left=300 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=570 + +[Handle_EventColumn_Slogan_Title] +._WndType=Handle +._Parent=Handle_EventColumn_Slogan +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=300 +Height=30 +PixelScroll=1 + +[Text_EventColumn_Slogan_Title] +._WndType=Text +._Parent=Handle_EventColumn_Slogan_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=SLOGAN +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=300 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Image_EventColumn_Slogan_Asc] +._WndType=Image +._Parent=Handle_EventColumn_Slogan +Left=0 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 +LockShowAndHide=1 + +[Image_EventColumn_Slogan_Desc] +._WndType=Image +._Parent=Handle_EventColumn_Slogan +Left=0 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 +LockShowAndHide=1 + +[Handle_EventColumn_Count] +._WndType=Handle +._Parent=Handle_EventColumns +Left=750 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_EventColumn_Count_Break] +._WndType=Image +._Parent=Handle_EventColumn_Count +Left=100 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=570 + +[Handle_EventColumn_Count_Title] +._WndType=Handle +._Parent=Handle_EventColumn_Count +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +PixelScroll=1 + +[Text_EventColumn_Count_Title] +._WndType=Text +._Parent=Handle_EventColumn_Count_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=COUNT +OrgText=1 +FontScheme=18 +HAlign=1 +VAlign=1 +Width=100 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Image_EventColumn_Count_Asc] +._WndType=Image +._Parent=Handle_EventColumn_Count +Left=0 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 +LockShowAndHide=1 + +[Image_EventColumn_Count_Desc] +._WndType=Image +._Parent=Handle_EventColumn_Count +Left=0 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 +LockShowAndHide=1 + +[WndContainer_List] +._WndType=WndContainer +._Parent=WndScroll_Event +Left=2 +Top=30 +Width=1052 +Height=544 +DrawStyle=1 +ContainerType=1 +BreatheWhenHide=0 + +[Wnd_Row] +._WndType=WndWindow +._Parent=WndContainer_List +Left=0 +Top=0 +Width=1052 +Height=32 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Row] +._WndType=Handle +._Parent=Wnd_Row +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=1052 +Height=32 +EventID=816 +Hover=Image_RowHover + +[Image_RowBg] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=75 +ImageType=0 +Width=1052 +Height=30 + +[Image_RowHover] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=89 +ImageType=0 +Width=1052 +Height=30 +LockShowAndHide=1 + +[Image_RowSpliter] +._WndType=Image +._Parent=Handle_Row +Left=0 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Width=1052 +Height=3 +Frame=65 + +[Text_ItemName] +._WndType=Text +._Parent=Handle_Row +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=150 +Height=30 +OrgText=1 +$Text=NAME +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +FontScheme=228 +FontColor= + +[Text_ItemServer] +._WndType=Text +._Parent=Handle_Row +Left=150 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=150 +Height=30 +OrgText=1 +$Text=SERVER +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +FontScheme=228 +FontColor= + +[Text_ItemLeader] +._WndType=Text +._Parent=Handle_Row +Left=300 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=150 +Height=30 +OrgText=1 +$Text=LEADER +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +FontScheme=228 +FontColor= + +[Text_ItemSlogan] +._WndType=Text +._Parent=Handle_Row +Left=450 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=300 +Height=30 +OrgText=1 +$Text=SLOGAN +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +FontScheme=228 +FontColor= + +[Text_ItemCount] +._WndType=Text +._Parent=Handle_Row +Left=750 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +$Text=COUNT +ShowAll=0 +AutoEtc=1 +HAlign=1 +VAlign=1 +FontScheme=228 +FontColor= +Width=100 +Height=30 + +[Btn_Event_Up] +._WndType=WndButton +._Parent=WndScroll_Event +Frame=34 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Event_Down] +._WndType=WndButton +._Parent=WndScroll_Event +Frame=38 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Event_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Event +StepCount=30 +PageStepCount=10 +Left=1051 +Top=30 +Width=20 +Height=542 +SlideBtn=Btn_Event_ListScroll +Type=1 +AutoHideSlideButton=0 + +[Btn_Event_ListScroll] +._WndType=WndButton +._Parent=Scroll_Event_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=190 + +[Btn_Option] +._WndType=WndButton +._Parent=MY_JBEventVote__Mod +Left=1056 +Top=54 +Width=22 +Height=22 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=22 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=57 +MouseOverGroup=58 +MouseDownGroup=59 +DisableGroup=56 +ShowTipType=0 +TipBgPath= +TipBgFrame=0 +TipBgAlpha=255 +Alpha=255 + diff --git a/MY_TeamTools/ui/MY_PartyRequest.ini b/MY_TeamTools/ui/MY_PartyRequest.ini new file mode 100644 index 000000000..bc69a1a1b --- /dev/null +++ b/MY_TeamTools/ui/MY_PartyRequest.ini @@ -0,0 +1,152 @@ +[MY_PartyRequest] +._WndType=WndFrame +._Parent=Normal2 +Left=80 +Top=80 +Width=515 +Height=350 +DragAreaWidth=470 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_PartyRequest] +._WndType=WndWindow +._Parent=MY_PartyRequest +Left=45 +Top=0 +Width=470 +Height=53 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_PartyRequest +Left=0 +Top=0 +Width=470 +Height=53 +HandleType=0 +FirstItemPosType=0 +PosType=0 + +[Image_Icon] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=5 +PosType=0 +Image=ui\image\TargetPanel\Target.UITex +Alpha=255 +Frame=49 +Width=40 +Height=40 + +[Text_Level] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=30 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=95 +OrgText=1 +FontScheme=215 +FontColor= + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +Left=43 +Top=15 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=茗伊 +OrgText=1 +FontScheme=15 +FontColor= + +[Handle_Status] +._WndType=Handle +._Parent=Handle_Item +Left=120 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 +HAlign=2 +VAlign=1 +Width=115 +Height=50 +IgnoreInvisibleChild=1 + +[Handle_Gongzhan] +._WndType=Handle +._Parent=Handle_Status +PosType=8 +HandleType=0 +FirstItemPosType=3 +Width=35 +Height=50 +VAlign=1 + +[Box_Gongzhan] +._WndType=Box +._Parent=Handle_Gongzhan +PosType=0 +IconID=2148 +Width=30 +Height=30 +Left=0 +Top=0 + +[Handle_Camp] +._WndType=Handle +._Parent=Handle_Status +PosType=8 +HandleType=0 +FirstItemPosType=3 +Width=30 +Height=50 + +[Image_Camp] +._WndType=Image +._Parent=Handle_Camp +PosType=8 +Image=ui\image\uicommon\CommonPanel2.UITex +Alpha=255 +Frame=7 +Width=30 +Height=30 + +[Handle_Mobile] +._WndType=Handle +._Parent=Handle_Status +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=35 +Height=50 +VAlign=1 + +[Image_MobileIcon] +._WndType=Image +._Parent=Handle_Mobile +Left=6 +Top=13 +PosType=0 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 +Frame=172 +Width=25 +Height=25 + diff --git a/MY_TeamTools/ui/MY_RideRequest.ini b/MY_TeamTools/ui/MY_RideRequest.ini new file mode 100644 index 000000000..ed5a086ea --- /dev/null +++ b/MY_TeamTools/ui/MY_RideRequest.ini @@ -0,0 +1,51 @@ +[MY_RideRequest] +._WndType=WndFrame +._Parent=Normal2 +Left=80 +Top=80 +Width=515 +Height=350 +DragAreaWidth=470 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_RideRequest] +._WndType=WndWindow +._Parent=MY_RideRequest +Left=45 +Top=0 +Width=470 +Height=53 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_RideRequest +Left=0 +Top=0 +Width=470 +Height=53 +HandleType=0 +FirstItemPosType=0 +PosType=0 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=15 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=茗伊 +OrgText=1 +FontScheme=15 +FontColor= + diff --git a/MY_TeamTools/ui/MY_RoomRequest.ini b/MY_TeamTools/ui/MY_RoomRequest.ini new file mode 100644 index 000000000..f7a0d085c --- /dev/null +++ b/MY_TeamTools/ui/MY_RoomRequest.ini @@ -0,0 +1,131 @@ +[MY_RoomRequest] +._WndType=WndFrame +._Parent=Normal2 +Left=80 +Top=80 +Width=515 +Height=350 +DragAreaWidth=470 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 +ViewMutexKey= + +[Wnd_RoomRequest] +._WndType=WndWindow +._Parent=MY_RoomRequest +Left=45 +Top=0 +Width=470 +Height=53 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_RoomRequest +Left=0 +Top=0 +Width=470 +Height=53 +HandleType=0 +FirstItemPosType=0 +PosType=0 + +[Image_Icon] +._WndType=Image +._Parent=Handle_Item +Left=0 +Top=5 +PosType=0 +Image=ui\image\TargetPanel\Target.UITex +Alpha=255 +Frame=49 +Width=40 +Height=40 + +[Text_Level] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=30 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=95 +OrgText=1 +FontScheme=215 +FontColor= + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +Left=43 +Top=15 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=茗伊 +OrgText=1 +FontScheme=15 +FontColor= + +[Handle_Status] +._WndType=Handle +._Parent=Handle_Item +Left=120 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 +HAlign=2 +VAlign=1 +Width=115 +Height=50 +IgnoreInvisibleChild=1 + +[Handle_Gongzhan] +._WndType=Handle +._Parent=Handle_Status +PosType=8 +HandleType=0 +FirstItemPosType=3 +Width=35 +Height=50 +VAlign=1 + +[Box_Gongzhan] +._WndType=Box +._Parent=Handle_Gongzhan +PosType=0 +IconID=2148 +Width=30 +Height=30 +Left=0 +Top=0 + +[Handle_Camp] +._WndType=Handle +._Parent=Handle_Status +PosType=8 +HandleType=0 +FirstItemPosType=3 +Width=30 +Height=50 + +[Image_Camp] +._WndType=Image +._Parent=Handle_Camp +PosType=8 +Image=ui\image\uicommon\CommonPanel2.UITex +Alpha=255 +Frame=7 +Width=30 +Height=30 + diff --git a/MY_TeamTools/ui/MY_SocialRequest.ini b/MY_TeamTools/ui/MY_SocialRequest.ini new file mode 100644 index 000000000..4e3ab4997 --- /dev/null +++ b/MY_TeamTools/ui/MY_SocialRequest.ini @@ -0,0 +1,51 @@ +[MY_SocialRequest] +._WndType=WndFrame +._Parent=Normal2 +Left=80 +Top=80 +Width=515 +Height=350 +DragAreaWidth=470 +DragAreaHeight=30 +IsCustomDragable=1 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_Request] +._WndType=WndWindow +._Parent=MY_SocialRequest +Left=45 +Top=0 +Width=470 +Height=53 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_Item] +._WndType=Handle +._Parent=Wnd_Request +Left=0 +Top=0 +Width=470 +Height=53 +HandleType=0 +FirstItemPosType=0 +PosType=0 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=15 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=茗伊 +OrgText=1 +FontScheme=15 +FontColor= + diff --git a/MY_TeamTools/ui/MY_TeamTools.Mod.ini b/MY_TeamTools/ui/MY_TeamTools.Mod.ini new file mode 100644 index 000000000..1ffab1c6f --- /dev/null +++ b/MY_TeamTools/ui/MY_TeamTools.Mod.ini @@ -0,0 +1,96 @@ +[MY_TeamToolsMod] +._WndType=WndFrame +._Parent=Normal +Width=1096 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=0 +Top=0 +DragAreaLeft=0 +DragAreaTop=0 + +[PageSet_Total] +._WndType=WndPageSet +._Parent=MY_TeamToolsMod +Left=0 +Top=0 +Width=0 +Height=0 +Page_0=Page_Default +CheckBox_0=WndCheck_Default +PageCount=1 + +[WndCheck_Default] +._WndType=WndCheckBox +._Parent=PageSet_Total +Left=30 +Top=2 +Width=120 +Height=28 +Frame=0 +UnCheckAndEnable=0 +CheckAndEnable=2 +UnCheckAndDisable=0 +CheckAndDisable=0 +UnCheckedAndEnableWhenMouseOver=1 +CheckedAndEnableWhenMouseOver=2 +CheckedAndDisableWhenMouseOver=0 +UnCheckedAndDisableWhenMouseOver=0 +Checking=0 +UnChecking=2 +Image=ui\Image\UICommon\ActivePopularize2.UITex + +[Handle_CheckDefault] +._WndType=Handle +._Parent=WndCheck_Default +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=768 +Width=1 +Height=1 + +[Image_CheckDefaultBreak] +._WndType=Image +._Parent=Handle_CheckDefault +Left=120 +Top=0 +PosType=0 +Image=ui\Image\UICommon\ActivePopularize2.UITex +Alpha=255 +Frame=44 + +[Text_CheckDefault] +._WndType=Text +._Parent=Handle_CheckDefault +Left=0 +Top=1 +PosType=0 +Width=120 +Height=30 +MultiLine=0 +HAlign=1 +VAlign=1 +FontScheme=162 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Page_Default] +._WndType=WndPage +._Parent=PageSet_Total +Left=0 +Top=32 +Width=1096 +Height=633 +DummyWnd=0 +Frame=0 + diff --git a/MY_TeamTools/ui/MY_TeamTools_Achievement.ini b/MY_TeamTools/ui/MY_TeamTools_Achievement.ini new file mode 100644 index 000000000..ad04f878b --- /dev/null +++ b/MY_TeamTools/ui/MY_TeamTools_Achievement.ini @@ -0,0 +1,318 @@ +[MY_TeamTools_Achievement] +._WndType=WndFrame +._Parent=Normal +Width=1096 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=1 +DummyWnd=1 +DisableBreath=1 +Left=20 +Top=20 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_Total] +._WndType=WndWindow +._Parent=MY_TeamTools_Achievement +Left=0 +Top=0 +Width=1096 +Height=633 +DummyWnd=0 +Frame=0 + +[WndScroll_Stat] +._WndType=WndScroll +._Parent=Wnd_Total +Left=20 +Top=70 +Width=1071 +Height=510 +ScrollHandle=Handle_List +ScrollContainer= +VerScrollBar=Scroll_Stat_All +ScrollButtonUp=Btn_Stat_Up +ScrollButtonDown=Btn_Stat_Down + +[Handle_Stat] +._WndType=Handle +._Parent=WndScroll_Stat +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_Stat_BG] +._WndType=Image +._Parent=Handle_Stat +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +ImageType=10 +Frame=50 +Width=1056 +Height=510 + +[Image_Stat_BG1] +._WndType=Image +._Parent=Handle_Stat +Left=2 +Top=30 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +ImageType=10 +Frame=74 +Width=1052 +Height=480 + +[Image_Stat_Line1_0] +._WndType=Image +._Parent=Handle_Stat +Left=3 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=1050 +Height=3 + +[Handle_StatColumns] +._WndType=Handle +._Parent=Handle_Stat +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=1056 +Height=510 + +[Handle_StatColumn] +._WndType=Handle +._Parent=Handle_StatColumns +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +EventID=277 +PixelScroll=0 + +[Image_Stat_Break] +._WndType=Image +._Parent=Handle_StatColumn +Left=0 +Top=2 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=180 +Frame=48 +ImageType=12 +Width=3 +Height=506 + +[Handle_Stat_Title] +._WndType=Handle +._Parent=Handle_StatColumn +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=100 +Height=30 +PixelScroll=1 + +[Text_Stat_Title] +._WndType=Text +._Parent=Handle_Stat_Title +Left=0 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=# +OrgText=1 +FontScheme=18 +HAlign=0 +VAlign=0 +Width=100 +Height=30 +ShowAll=0 +AutoEtc=1 + +[Image_Stat_Asc] +._WndType=Image +._Parent=Handle_StatColumn +Left=80 +Top=4 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=127 + +[Image_Stat_Desc] +._WndType=Image +._Parent=Handle_StatColumn +Left=80 +Top=6 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=131 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Stat +Left=0 +Top=30 +PosType=0 +HandleType=3 +Width=1056 +Height=480 +PixelScroll=1 +RowSpacing=0 + +[Handle_Row] +._WndType=Handle +._Parent=Handle_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=1056 +Height=30 +EventID=810 +Hover=Image_RowHover + +[Image_RowBg] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=75 +ImageType=0 +Width=1049 +Height=30 + +[Image_RowHover] +._WndType=Image +._Parent=Handle_Row +Left=3 +Top=0 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=110 +Frame=89 +ImageType=0 +Width=1049 +Height=30 +LockShowAndHide=1 + +[Image_RowSpliter] +._WndType=Image +._Parent=Handle_Row +Left=0 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Width=1056 +Height=3 +Frame=65 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_Row +Left=0 +Top=0 +PosType=0 +HandleType=0 +HAlign=0 +VAlign=0 +Width=100 +Height=30 +UnLoad=1 +FirstItemPosType=0 + +[Handle_ItemContent] +._WndType=Handle +._Parent=Handle_Item +PosType=8 +HandleType=3 +RowSpacing=0 + +[Btn_Stat_Up] +._WndType=WndButton +._Parent=WndScroll_Stat +Frame=34 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Btn_Stat_Down] +._WndType=WndButton +._Parent=WndScroll_Stat +Frame=38 +Left=0 +Top=0 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex +Alpha=255 + +[Scroll_Stat_All] +._WndType=WndNewScrollBar +._Parent=WndScroll_Stat +StepCount=30 +PageStepCount=10 +Left=1051 +Top=30 +Width=20 +Height=478 +SlideBtn=Btn_Stat_ListScroll +Type=1 +AutoHideSlideButton=0 + +[Btn_Stat_ListScroll] +._WndType=WndButton +._Parent=Scroll_Stat_All +Frame=30 +Left=4 +Top=0 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 +Alpha=190 + diff --git a/MY_TeamTools/ui/MY_TeamTools_DeathLog.ini b/MY_TeamTools/ui/MY_TeamTools_DeathLog.ini new file mode 100644 index 000000000..6e84acce7 --- /dev/null +++ b/MY_TeamTools/ui/MY_TeamTools_DeathLog.ini @@ -0,0 +1,531 @@ +[MY_TeamTools_DeathLog] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Wnd_DeathLog] +._WndType=WndWindow +._Parent=MY_TeamTools_DeathLog +Left=20 +Top=20 +Width=1056 +Height=580 +DummyWnd=0 +Frame=0 + +[Handle_Total_Death] +._WndType=Handle +._Parent=Wnd_DeathLog +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_DeathPlayer_BG] +._WndType=Handle +._Parent=Handle_Total_Death +Left=836 +Top=30 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_2_1] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +Frame=50 +ImageType=10 +Width=220 +Height=550 + +[Image_New_2_0_0_0] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=3 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=215 +Height=3 + +[Image_New_4_1_0] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=150 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=548 + +[Text_Title_1_0] +._WndType=Text +._Parent=Handle_DeathPlayer_BG +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_BF_NAME +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=150 +Height=30 +EventID=272 + +[Text_Title_1_0_0] +._WndType=Text +._Parent=Handle_DeathPlayer_BG +Left=150 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_HURT_DEGREE +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=70 +Height=30 +EventID=272 +TipRichText=0 + +[Image_New_0_1] +._WndType=Image +._Parent=Handle_Total_Death +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=100 +Frame=84 +Width=816 +Height=580 +ImageType=10 + +[Scroll_Player_List] +._WndType=WndScroll +._Parent=Wnd_DeathLog +Left=836 +Top=60 +Width=220 +Height=520 +ScrollHandle=Handle_DeathPlayer_List +ScrollContainer= +VerScrollBar=ScrolBarl_Player_All_0 +ScrollButtonUp=Btn_Player_Up_0 +ScrollButtonDown=Btn_Player_Down_0 +MousePenetrable=0 + +[Btn_Player_Up_0] +._WndType=WndButton +._Parent=Scroll_Player_List +Frame=34 +Left=0 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Player_Down_0] +._WndType=WndButton +._Parent=Scroll_Player_List +Frame=38 +Left=0 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[ScrolBarl_Player_All_0] +._WndType=WndNewScrollBar +._Parent=Scroll_Player_List +StepCount=30 +PageStepCount=10 +Left=205 +Top=0 +Width=20 +Height=518 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 + +[Btn_Player_Scroll_0] +._WndType=WndButton +._Parent=ScrolBarl_Player_All_0 +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Handle_DeathPlayer_List] +._WndType=Handle +._Parent=Scroll_Player_List +Left=0 +Top=0 +PosType=0 +HandleType=3 +Width=220 +Height=521 +PixelScroll=1 +ControlShow=1 +RowSpacing=0 +EventID=259 + +[Handle_Item_DeathPlayer] +._WndType=Handle +._Parent=Handle_DeathPlayer_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=220 +Height=29 +EventID=304 +TipRichText=0 +Hover=Image_Cover + +[Image_Line_1] +._WndType=Image +._Parent=Handle_Item_DeathPlayer +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=220 +Height=28 + +[Image_Line_0_1] +._WndType=Image +._Parent=Handle_Item_DeathPlayer +Left=1 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=216 +Height=2 + +[Image_DeathIcon] +._WndType=Image +._Parent=Handle_Item_DeathPlayer +Left=5 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Target.UITex +Alpha=255 +Width=27 +Height=27 +Frame=108 + +[Text_DeathName] +._WndType=Text +._Parent=Handle_Item_DeathPlayer +Left=35 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=十六夜红月 +FontScheme=41 +FontColor= +OrgText=1 +HAlign=0 +VAlign=1 +Width=120 +Height=29 +ShowAll=0 +MlAutoAdj=1 +AutoEtc=1 + +[Text_DeathCount] +._WndType=Text +._Parent=Handle_Item_DeathPlayer +Left=150 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=5 +FontScheme=41 +FontColor= +OrgText=1 +HAlign=1 +VAlign=1 +Width=70 +Height=29 +ShowAll=0 +MlAutoAdj=1 +AutoEtc=1 + +[Image_Select] +._WndType=Image +._Parent=Handle_Item_DeathPlayer +Left=0 +Top=1 +PosType=0 +Image=ui\Image\Common\CoverShadow.UITex +Frame=2 +Alpha=255 +Width=220 +Height=29 +ImageType=10 +LockShowAndHide=1 + +[Image_Cover] +._WndType=Image +._Parent=Handle_Item_DeathPlayer +Left=0 +Top=1 +PosType=0 +Image=ui\Image\Common\CoverShadow.UITex +Frame=1 +Alpha=255 +Width=220 +Height=29 +ImageType=10 +LockShowAndHide=1 + +[Scroll_Death_Info] +._WndType=WndScroll +._Parent=Wnd_DeathLog +Left=0 +Top=0 +Width=816 +Height=580 +ScrollHandle=Handle_Death_Msg +ScrollContainer= +VerScrollBar=ScrolBarl_Player_All_0_0 +ScrollButtonUp=Btn_Player_Up_0_0 +ScrollButtonDown=Btn_Player_Down_0_0 +MousePenetrable=0 + +[Btn_Player_Up_0_0] +._WndType=WndButton +._Parent=Scroll_Death_Info +Frame=34 +Left=0 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Player_Down_0_0] +._WndType=WndButton +._Parent=Scroll_Death_Info +Frame=38 +Left=0 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[ScrolBarl_Player_All_0_0] +._WndType=WndNewScrollBar +._Parent=Scroll_Death_Info +StepCount=30 +PageStepCount=10 +Left=801 +Top=0 +Width=20 +Height=580 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Player_Scroll_0_0] +._WndType=WndButton +._Parent=ScrolBarl_Player_All_0_0 +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Handle_Death_Msg] +._WndType=Handle +._Parent=Scroll_Death_Info +Left=5 +Top=5 +PosType=0 +HandleType=4 +RowSpacing=0 +Width=806 +Height=570 +PixelScroll=1 +ControlShow=1 + +[Btn_All] +._WndType=WndButton +._Parent=Wnd_DeathLog +Left=836 +Top=0 +Width=100 +Height=28 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\image\uicommon\logincommon.uitex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=54 +MouseOverGroup=55 +MouseDownGroup=56 +DisableGroup=60 + +[Handle_New_0_0] +._WndType=Handle +._Parent=Btn_All +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_BtnAll] +._WndType=Text +._Parent=Handle_New_0_0 +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_FRIENDBACK_05 +VAlign=1 +HAlign=1 +FontScheme=162 +FontColor= +Width=100 +Height=28 + +[Btn_Clear] +._WndType=WndButton +._Parent=Wnd_DeathLog +Left=956 +Top=0 +Width=100 +Height=28 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\image\uicommon\logincommon.uitex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=54 +MouseOverGroup=55 +MouseDownGroup=56 +DisableGroup=60 + +[Handle_New_0] +._WndType=Handle +._Parent=Btn_Clear +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_BtnClear] +._WndType=Text +._Parent=Handle_New_0 +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_GOLDTEAM_DELETE +VAlign=1 +HAlign=1 +FontScheme=162 +FontColor= +Width=100 +Height=28 + diff --git a/MY_TeamTools/ui/MY_TeamTools_EnterMap.ini b/MY_TeamTools/ui/MY_TeamTools_EnterMap.ini new file mode 100644 index 000000000..692525fde --- /dev/null +++ b/MY_TeamTools/ui/MY_TeamTools_EnterMap.ini @@ -0,0 +1,532 @@ +[MY_TeamTools_EnterMap] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Wnd_EnterMap] +._WndType=WndWindow +._Parent=MY_TeamTools_EnterMap +Left=20 +Top=20 +Width=1056 +Height=580 +DummyWnd=0 +Frame=0 + +[Handle_Total_Death] +._WndType=Handle +._Parent=Wnd_EnterMap +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_DeathPlayer_BG] +._WndType=Handle +._Parent=Handle_Total_Death +Left=836 +Top=30 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_2_1] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +Frame=50 +ImageType=10 +Width=220 +Height=550 + +[Image_New_2_0_0_0] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=3 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=215 +Height=3 + +[Image_New_4_1_0] +._WndType=Image +._Parent=Handle_DeathPlayer_BG +Left=150 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=548 + +[Text_Title_1_0] +._WndType=Text +._Parent=Handle_DeathPlayer_BG +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_MIDDLEMAP_MAPPAGETITLE +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=150 +Height=30 +EventID=272 + +[Text_Title_1_0_0] +._WndType=Text +._Parent=Handle_DeathPlayer_BG +Left=150 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_HURT_DEGREE +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=70 +Height=30 +EventID=272 +TipRichText=0 + +[Image_New_0_1] +._WndType=Image +._Parent=Handle_Total_Death +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=100 +Frame=84 +Width=816 +Height=580 +ImageType=10 + +[Scroll_Player_List] +._WndType=WndScroll +._Parent=Wnd_EnterMap +Left=836 +Top=60 +Width=220 +Height=520 +ScrollHandle=Handle_DeathPlayer_List +ScrollContainer= +VerScrollBar=ScrolBarl_Player_All_0 +ScrollButtonUp=Btn_Player_Up_0 +ScrollButtonDown=Btn_Player_Down_0 +MousePenetrable=0 + +[Btn_Player_Up_0] +._WndType=WndButton +._Parent=Scroll_Player_List +Frame=34 +Left=0 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Player_Down_0] +._WndType=WndButton +._Parent=Scroll_Player_List +Frame=38 +Left=0 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[ScrolBarl_Player_All_0] +._WndType=WndNewScrollBar +._Parent=Scroll_Player_List +StepCount=30 +PageStepCount=10 +Left=205 +Top=0 +Width=20 +Height=518 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 + +[Btn_Player_Scroll_0] +._WndType=WndButton +._Parent=ScrolBarl_Player_All_0 +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Handle_DeathPlayer_List] +._WndType=Handle +._Parent=Scroll_Player_List +Left=0 +Top=0 +PosType=0 +HandleType=3 +Width=220 +Height=521 +PixelScroll=1 +ControlShow=1 +RowSpacing=0 +EventID=259 + +[Handle_Item_EnterMap] +._WndType=Handle +._Parent=Handle_DeathPlayer_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=220 +Height=29 +EventID=304 +TipRichText=0 +Hover=Image_Cover + +[Image_Line_1] +._WndType=Image +._Parent=Handle_Item_EnterMap +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=220 +Height=28 + +[Image_Line_0_1] +._WndType=Image +._Parent=Handle_Item_EnterMap +Left=1 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=216 +Height=2 + +[Image_DeathIcon] +._WndType=Image +._Parent=Handle_Item_EnterMap +Left=5 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Target.UITex +Alpha=255 +Width=27 +Height=27 +Frame=108 +LockShowAndHide=1 + +[Text_DeathName] +._WndType=Text +._Parent=Handle_Item_EnterMap +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=十六夜红月 +FontScheme=41 +FontColor= +OrgText=1 +HAlign=1 +VAlign=1 +Width=155 +Height=29 +ShowAll=0 +MlAutoAdj=1 +AutoEtc=1 + +[Text_DeathCount] +._WndType=Text +._Parent=Handle_Item_EnterMap +Left=150 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=5 +FontScheme=41 +FontColor= +OrgText=1 +HAlign=1 +VAlign=1 +Width=70 +Height=29 +ShowAll=0 +MlAutoAdj=1 +AutoEtc=1 + +[Image_Cover] +._WndType=Image +._Parent=Handle_Item_EnterMap +Left=0 +Top=1 +PosType=0 +Image=ui\Image\Common\CoverShadow.UITex +Frame=1 +Alpha=255 +Width=220 +Height=29 +ImageType=10 +LockShowAndHide=1 + +[Image_Select] +._WndType=Image +._Parent=Handle_Item_EnterMap +Left=0 +Top=1 +PosType=0 +Image=ui\Image\Common\CoverShadow.UITex +Frame=2 +Alpha=255 +Width=220 +Height=29 +ImageType=10 +LockShowAndHide=1 + +[Scroll_Death_Info] +._WndType=WndScroll +._Parent=Wnd_EnterMap +Left=0 +Top=0 +Width=816 +Height=580 +ScrollHandle=Handle_Death_Msg +ScrollContainer= +VerScrollBar=ScrolBarl_Player_All_0_0 +ScrollButtonUp=Btn_Player_Up_0_0 +ScrollButtonDown=Btn_Player_Down_0_0 +MousePenetrable=0 + +[Btn_Player_Up_0_0] +._WndType=WndButton +._Parent=Scroll_Death_Info +Frame=34 +Left=0 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Player_Down_0_0] +._WndType=WndButton +._Parent=Scroll_Death_Info +Frame=38 +Left=0 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[ScrolBarl_Player_All_0_0] +._WndType=WndNewScrollBar +._Parent=Scroll_Death_Info +StepCount=30 +PageStepCount=10 +Left=801 +Top=0 +Width=20 +Height=580 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Player_Scroll_0_0] +._WndType=WndButton +._Parent=ScrolBarl_Player_All_0_0 +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Handle_Death_Msg] +._WndType=Handle +._Parent=Scroll_Death_Info +Left=5 +Top=5 +PosType=0 +HandleType=4 +RowSpacing=0 +Width=806 +Height=570 +PixelScroll=1 +ControlShow=1 + +[Btn_All] +._WndType=WndButton +._Parent=Wnd_EnterMap +Left=836 +Top=0 +Width=100 +Height=28 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\image\uicommon\logincommon.uitex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=54 +MouseOverGroup=55 +MouseDownGroup=56 +DisableGroup=60 + +[Handle_New_0_0] +._WndType=Handle +._Parent=Btn_All +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_BtnAll] +._WndType=Text +._Parent=Handle_New_0_0 +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_FRIENDBACK_05 +VAlign=1 +HAlign=1 +FontScheme=162 +FontColor= +Width=100 +Height=28 + +[Btn_Clear] +._WndType=WndButton +._Parent=Wnd_EnterMap +Left=956 +Top=0 +Width=100 +Height=28 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\image\uicommon\logincommon.uitex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=54 +MouseOverGroup=55 +MouseDownGroup=56 +DisableGroup=60 + +[Handle_New_0] +._WndType=Handle +._Parent=Btn_Clear +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Text_BtnClear] +._WndType=Text +._Parent=Handle_New_0 +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_GOLDTEAM_DELETE +VAlign=1 +HAlign=1 +FontScheme=162 +FontColor= +Width=100 +Height=28 + diff --git a/MY_TeamTools/ui/MY_TeamTools_Summary.ini b/MY_TeamTools/ui/MY_TeamTools_Summary.ini new file mode 100644 index 000000000..ab5894f66 --- /dev/null +++ b/MY_TeamTools/ui/MY_TeamTools_Summary.ini @@ -0,0 +1,993 @@ +[MY_TeamTools_Summary] +._WndType=WndFrame +._Parent=Normal +Width=1096 +Height=700 +IsCustomDragable=1 +DragAreaWidth=1000 +DragAreaHeight=50 +DisableBringToTop=0 +BreatheWhenHide=0 +Left=400 +Top=200 +DisableBreath=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Wnd_Summary] +._WndType=WndWindow +._Parent=MY_TeamTools_Summary +Left=20 +Top=20 +Width=1076 +Height=580 +DummyWnd=0 +Frame=0 + +[Handle_Total_Info] +._WndType=Handle +._Parent=Wnd_Summary +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Score] +._WndType=Handle +._Parent=Handle_Total_Info +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +EventID=768 + +[Image_New_0] +._WndType=Image +._Parent=Handle_Score +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=150 +Frame=85 +Width=260 +Height=205 +ImageType=10 + +[Image_Score] +._WndType=Image +._Parent=Handle_Score +Left=55 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel7.UITex +Alpha=255 +Width=150 +Height=150 +Frame=22 +ImageType=0 + +[Text_TotalScore] +._WndType=Text +._Parent=Handle_Score +Left=0 +Top=140 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=(づ ̄ 3 ̄)づ +Width=260 +Height=30 +OrgText=1 +FontScheme=200 +FontColor= +HAlign=1 +VAlign=1 + +[Handle_Progress] +._WndType=Handle +._Parent=Handle_Total_Info +Left=0 +Top=210 +PosType=0 +HandleType=0 +FirstItemPosType=0 +EventID=256 + +[Image_New_0_1_0] +._WndType=Image +._Parent=Handle_Progress +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=150 +Frame=85 +Width=260 +Height=27 +ImageType=10 + +[Image_Progress] +._WndType=Image +._Parent=Handle_Progress +Left=10 +Top=10 +PosType=0 +Image=ui\Image\UICommon\ScienceTreeNode.UITex +Alpha=255 +Width=240 +Height=7 +ImageType=1 +Frame=63 +ImagePercent=0.000 + +[Text_Progress] +._WndType=Text +._Parent=Handle_Progress +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Loading +Width=260 +Height=27 +HAlign=1 +VAlign=1 +FontScheme=15 +FontColor= +OrgText=1 + +[Handle_Kungfu] +._WndType=Handle +._Parent=Handle_Total_Info +Left=0 +Top=240 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Kungfu_List] +._WndType=Handle +._Parent=Handle_Kungfu +Left=5 +Top=5 +PosType=0 +HandleType=3 +RowSpacing=0 +Width=250 +Height=125 + +[Handle_Kungfu_Item] +._WndType=Handle +._Parent=Handle_Kungfu_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=50 +Height=25 +EventID=784 + +[Image_KungfuBG] +._WndType=Image +._Parent=Handle_Kungfu_Item +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\BigBtn.UITex +Alpha=255 +Frame=18 +ImageType=10 +Width=50 +Height=25 + +[Image_Force] +._WndType=Image +._Parent=Handle_Kungfu_Item +PosType=0 +Image=ui\Image\TargetPanel\Target.UITex +Alpha=255 +Frame=56 +Width=24 +Height=24 +Left=2 +Top=0 + +[Text_Num] +._WndType=Text +._Parent=Handle_Kungfu_Item +Left=27 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=51 +Width=20 +Height=25 +OrgText=1 +VAlign=1 +HAlign=1 +FontScheme=41 +FontColor= + +[Handle_Dungeon] +._WndType=Handle +._Parent=Handle_Total_Info +Left=0 +Top=400 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Hover=Image_New_1_0 +EventID=789 + +[Image_New_0_1_1] +._WndType=Image +._Parent=Handle_Dungeon +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Alpha=150 +Frame=85 +Width=260 +Height=50 +ImageType=10 + +[Text_Dungeon] +._WndType=Text +._Parent=Handle_Dungeon +Left=0 +Top=10 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=260 +Height=30 +OrgText=0 +HAlign=1 +VAlign=1 +FontScheme=65 +FontColor= +MultiLine=1 +CenterEachRow=1 + +[Image_New_1] +._WndType=Image +._Parent=Handle_Dungeon +Left=221 +Top=9 +PosType=0 +Image=ui\Image\UICommon\Yirong.UITex +Alpha=255 +Frame=11 +Width=29 +Height=29 + +[Image_New_1_0] +._WndType=Image +._Parent=Handle_Dungeon +Left=221 +Top=9 +PosType=0 +Image=ui\Image\UICommon\Yirong.UITex +Alpha=255 +Frame=12 +Width=29 +Height=29 +LockShowAndHide=1 + +[Image_New_1_1] +._WndType=Image +._Parent=Handle_Dungeon +Left=221 +Top=9 +PosType=0 +Image=ui\Image\UICommon\Yirong.UITex +Alpha=255 +Frame=13 +Width=29 +Height=29 +LockShowAndHide=1 + +[Handle_Player_BG] +._WndType=Handle +._Parent=Handle_Total_Info +Left=270 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Image_New_2] +._WndType=Image +._Parent=Handle_Player_BG +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=200 +Frame=50 +ImageType=10 +Width=786 +Height=580 + +[Image_New_2_0] +._WndType=Image +._Parent=Handle_Player_BG +Left=0 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=105 +Frame=74 +ImageType=10 +Width=786 +Height=551 + +[Image_New_2_0_0] +._WndType=Image +._Parent=Handle_Player_BG +Left=3 +Top=29 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=781 +Height=3 + +[Image_New_4_1] +._WndType=Image +._Parent=Handle_Player_BG +Left=150 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Image_New_4_2] +._WndType=Image +._Parent=Handle_Player_BG +Left=328 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Image_New_4_3] +._WndType=Image +._Parent=Handle_Player_BG +Left=474 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Image_New_4_4] +._WndType=Image +._Parent=Handle_Player_BG +Left=564 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Image_New_4_5] +._WndType=Image +._Parent=Handle_Player_BG +Left=629 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Image_New_4_6] +._WndType=Image +._Parent=Handle_Player_BG +Left=739 +Top=0 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=255 +Frame=48 +ImageType=12 +Width=3 +Height=578 + +[Text_Title_1] +._WndType=Text +._Parent=Handle_Player_BG +Left=0 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_BF_NAME +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=150 +Height=30 +EventID=272 + +[Text_Title_2] +._WndType=Text +._Parent=Handle_Player_BG +Left=155 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_YAOPIN +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=175 +Height=30 +EventID=272 + +[Text_Title_3] +._WndType=Text +._Parent=Handle_Player_BG +Left=330 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=BUFF +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=146 +Height=30 +EventID=272 +OrgText=1 + +[Text_Title_4] +._WndType=Text +._Parent=Handle_Player_BG +Left=476 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=装备 +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=90 +Height=30 +EventID=272 +OrgText=1 + +[Text_Title_5] +._WndType=Text +._Parent=Handle_Player_BG +Left=564 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_TEAMBUILD_21 +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=65 +Height=30 +EventID=272 + +[Text_Title_6] +._WndType=Text +._Parent=Handle_Player_BG +Left=630 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=秘境CD +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=112 +Height=30 +EventID=272 +OrgText=1 + +[Text_Title_7] +._WndType=Text +._Parent=Handle_Player_BG +Left=742 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=战斗 +FontScheme=41 +FontColor= +HAlign=1 +VAlign=1 +Width=40 +Height=30 +EventID=272 +OrgText=1 + +[Scroll_Player] +._WndType=WndScroll +._Parent=Wnd_Summary +Left=270 +Top=30 +Width=806 +Height=550 +ScrollHandle=Handle_Player_List +ScrollContainer= +VerScrollBar=ScrolBarl_Player_All +ScrollButtonUp=Btn_Player_Up +ScrollButtonDown=Btn_Player_Down +MousePenetrable=0 + +[Btn_Player_Up] +._WndType=WndButton +._Parent=Scroll_Player +Frame=34 +Left=784 +Top=5 +Width=0 +Height=0 +NormalGroup=47 +MouseOverGroup=48 +MouseDownGroup=49 +DisableGroup=50 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Btn_Player_Down] +._WndType=WndButton +._Parent=Scroll_Player +Frame=38 +Left=784 +Top=560 +Width=0 +Height=0 +NormalGroup=51 +MouseOverGroup=52 +MouseDownGroup=53 +DisableGroup=46 +Image=ui\Image\UICommon\CommonPanel.UITex + +[ScrolBarl_Player_All] +._WndType=WndNewScrollBar +._Parent=Scroll_Player +StepCount=30 +PageStepCount=10 +Left=786 +Top=0 +Width=20 +Height=548 +SlideBtn=Btn_GKP_Record_ListScroll +Type=1 +AutoHideSlideButton=0 +LockShowAndHide=1 + +[Btn_Player_Scroll] +._WndType=WndButton +._Parent=ScrolBarl_Player_All +Frame=30 +Left=0 +Top=0 +Alpha=150 +Width=14 +Height=89 +NormalGroup=31 +MouseOverGroup=32 +MouseDownGroup=33 +DisableGroup=34 +Image=ui\Image\UICommon\CommonPanel.UITex +LockShowAndHide=0 + +[Handle_Player_List] +._WndType=Handle +._Parent=Scroll_Player +Left=0 +Top=0 +PosType=0 +HandleType=3 +Width=786 +Height=551 +PixelScroll=1 +ControlShow=1 +RowSpacing=0 + +[Handle_Item_Player] +._WndType=Handle +._Parent=Handle_Player_List +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=786 +Height=29 +EventID=304 +$Tip=STR_MENTOR_EQUIPMENT +TipRichText=0 +ShowTipType=1 + +[Image_Line] +._WndType=Image +._Parent=Handle_Item_Player +Left=0 +Top=1 +PosType=0 +Image=ui\Image\button\ShopButton.UITex +Alpha=180 +Frame=75 +ImageType=10 +Width=786 +Height=28 + +[Image_Line_0] +._WndType=Image +._Parent=Handle_Item_Player +Left=1 +Top=28 +PosType=0 +Image=ui\Image\Minimap\MapMark.UITex +Alpha=115 +Frame=65 +ImageType=11 +Width=782 +Height=2 + +[Image_Icon] +._WndType=Image +._Parent=Handle_Item_Player +Left=5 +Top=0 +PosType=0 +Image=ui\Image\TargetPanel\Target.UITex +Alpha=255 +Width=27 +Height=27 +Frame=108 + +[Text_Name] +._WndType=Text +._Parent=Handle_Item_Player +Left=35 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=十六夜红月 +FontScheme=41 +FontColor= +OrgText=1 +HAlign=0 +VAlign=1 +Width=120 +Height=29 +ShowAll=0 +MlAutoAdj=1 +AutoEtc=1 + +[Handle_Food] +._WndType=Handle +._Parent=Handle_Item_Player +Left=155 +Top=0 +PosType=0 +HandleType=3 +Width=146 +Height=29 +RowSpacing=1 + +[Box_Enchant] +._WndType=Box +._Parent=Handle_Item_Player +Left=302 +Top=0 +PosType=0 +IconID=6216 +Width=29 +Height=29 +EventID=768 +LockShowAndHide=1 + +[Box_Buff] +._WndType=Box +._Parent=Handle_Item_Player +Left=370 +Top=0 +PosType=0 +IconID=2115 +Width=29 +Height=29 +EventID=768 + +[Box_Grandpa] +._WndType=Box +._Parent=Handle_Item_Player +Left=405 +Top=0 +PosType=0 +IconID=2148 +Width=29 +Height=29 +EventID=768 + +[Handle_Equip] +._WndType=Handle +._Parent=Handle_Item_Player +Left=476 +Top=0 +PosType=0 +HandleType=3 +Width=88 +Height=29 +RowSpacing=1 +PixelScroll=0 + +[Text_Score] +._WndType=Text +._Parent=Handle_Item_Player +Left=564 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=77 +OrgText=1 +Width=65 +Height=30 +HAlign=1 +VAlign=1 +TipRichText=0 +FontScheme=41 +FontColor= + +[Image_Fight] +._WndType=Image +._Parent=Handle_Item_Player +Left=748 +Top=0 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Width=28 +Height=28 +Frame=238 +$Tip=STR_TIP_FIGHTING +TipRichText=0 +ShowTipType=1 +EventID=256 + +[Text_Toofar1] +._WndType=Text +._Parent=Handle_Item_Player +Left=155 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=Loading +Width=175 +Height=29 +OrgText=1 +VAlign=1 +HAlign=1 +FontScheme=41 +FontColor= + +[Text_CopyID] +._WndType=Text +._Parent=Handle_Item_Player +Left=637 +Top=0 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=- +OrgText=1 +Width=96 +Height=30 +HAlign=1 +VAlign=1 +TipRichText=0 +FontScheme=41 +FontColor= + +[Handle_BossKills] +._WndType=Handle +._Parent=Handle_Item_Player +Left=635 +Top=7 +PosType=0 +HandleType=3 +HAlign=1 +VAlign=1 +Width=100 +Height=14 +RowSpacing=0 + +[Handle_BossKill] +._WndType=Handle +._Parent=Handle_BossKills +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=16 +Height=14 + +[Image_BossKilled] +._WndType=Image +._Parent=Handle_BossKill +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=20 +TipRichText=0 +Width=14 +Height=14 + +[Image_BossAlive] +._WndType=Image +._Parent=Handle_BossKill +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=21 +TipRichText=0 +Width=14 +Height=14 + +[Handle_BossKill_0] +._WndType=Handle +._Parent=Handle_BossKills +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=16 +Height=14 + +[Image_BossKilled_2] +._WndType=Image +._Parent=Handle_BossKill_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=20 +TipRichText=0 +Width=14 +Height=14 + +[Image_BossAlive_2] +._WndType=Image +._Parent=Handle_BossKill_0 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=21 +TipRichText=0 +Width=14 +Height=14 + +[Handle_BossKill_1] +._WndType=Handle +._Parent=Handle_BossKills +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=16 +Height=14 + +[Image_BossKilled_2_0] +._WndType=Image +._Parent=Handle_BossKill_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=20 +TipRichText=0 +Width=14 +Height=14 + +[Image_BossAlive_2_0] +._WndType=Image +._Parent=Handle_BossKill_1 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=21 +TipRichText=0 +Width=14 +Height=14 + +[Handle_BossKill_2] +._WndType=Handle +._Parent=Handle_BossKills +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=16 +Height=14 + +[Image_BossKilled_2_1] +._WndType=Image +._Parent=Handle_BossKill_2 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=20 +TipRichText=0 +Width=14 +Height=14 + +[Image_BossAlive_2_1] +._WndType=Image +._Parent=Handle_BossKill_2 +Left=0 +Top=0 +PosType=0 +Image=ui\Image\UITga\FBcdPanel01.UITex +Alpha=200 +Frame=21 +TipRichText=0 +Width=14 +Height=14 + diff --git a/MY_ThreatRank/data/style.jx3dat b/MY_ThreatRank/data/style.jx3dat new file mode 100644 index 000000000..c58668f7c --- /dev/null +++ b/MY_ThreatRank/data/style.jx3dat @@ -0,0 +1,58 @@ +-- 请注意 这个文件用于控制风格的图片和文字 +return { + { + -- FromUITex szImage, nFrame + -- [1] = > 0.01 + -- [2] = > 0.50 + -- [3] = > 0.80 + -- [4] = > 1.00 + -- [5] = me + -- [6] = name, value FontScheme + { "ui/Image/TargetPanel/Target.UITex", 73 }, + { "ui/Image/TargetPanel/Target.UITex", 87 }, + { "ui/Image/TargetPanel/Target.UITex", 38 }, + { "ui/Image/TargetPanel/Target.UITex", 40 }, + { "ui/Image/TargetPanel/Target.UITex", 37 }, + { 168, 15 } + }, + { + { "ui/Image/Common/Money.uitex", 210 }, + { "ui/Image/Common/Money.uitex", 207 }, + { "ui/Image/Common/Money.uitex", 203 }, + { "ui/Image/Common/Money.uitex", 26 }, + { "ui/Image/Common/Money.uitex", 208 }, + { 168, 15 } + }, + { + { "ui/Image/Common/Money.uitex", 217 }, + { "ui/Image/Common/Money.uitex", 214 }, + { "ui/Image/Common/Money.uitex", 216 }, + { "ui/Image/Common/Money.uitex", 215 }, + { "ui/Image/Common/Money.uitex", 213 }, + { 168, 15 } + }, + { + { "ui/Image/UICommon/RaidTotal.UITex", 59 }, + { "ui/Image/UICommon/RaidTotal.UITex", 58 }, + { "ui/Image/UICommon/RaidTotal.UITex", 60 }, + { "ui/Image/UICommon/RaidTotal.UITex", 54 }, + { "ui/Image/UICommon/RaidTotal.UITex", 57 }, + { 168, 15 } + }, + { + { "ui/Image/UICommon/ShopEntry.UITex", 5 }, + { "ui/Image/UICommon/ShopEntry.UITex", 2 }, + { "ui/Image/UICommon/ShopEntry.UITex", 3 }, + { "ui/Image/UICommon/ShopEntry.UITex", 1 }, + { "ui/Image/UICommon/ShopEntry.UITex", 0 }, + { 40, 15 } + }, + { + { "ui/Image/UICommon/Feedanimials.UITex", 19 }, + { "ui/Image/UICommon/Feedanimials.UITex", 19 }, + { "ui/Image/UICommon/Feedanimials.UITex", 15 }, + { "ui/Image/UICommon/Feedanimials.UITex", 14 }, + { "ui/Image/UICommon/Feedanimials.UITex", 18 }, + { 168, 15 } + }, +} diff --git a/MY_ThreatRank/info.ini b/MY_ThreatRank/info.ini new file mode 100644 index 000000000..2a6b16c41 --- /dev/null +++ b/MY_ThreatRank/info.ini @@ -0,0 +1,8 @@ +[MY_ThreatRank] +name=仇恨列表 +desc=漂亮,更准确的仇恨列表 +package=MY +dependence=MY_!Base +version=1.0 +default=1 +lua_0=src/MY_ThreatRank.lua diff --git a/MY_ThreatRank/info.ini.zh_TW b/MY_ThreatRank/info.ini.zh_TW new file mode 100644 index 000000000..42a0c3314 --- /dev/null +++ b/MY_ThreatRank/info.ini.zh_TW @@ -0,0 +1,8 @@ +[MY_ThreatRank] +name=浠囨仺鍒楄〃 +desc=婕備寒锛屾洿婧栫⒑鐨勪粐鎭ㄥ垪琛 +package=MY +dependence=MY_!Base +version=1.0 +default=1 +lua_0=src/MY_ThreatRank.lua diff --git a/MY_ThreatRank/lang/default.jx3dat b/MY_ThreatRank/lang/default.jx3dat new file mode 100644 index 000000000..a56470754 --- /dev/null +++ b/MY_ThreatRank/lang/default.jx3dat @@ -0,0 +1 @@ +return {} diff --git a/MY_ThreatRank/lang/zhcn.jx3dat b/MY_ThreatRank/lang/zhcn.jx3dat new file mode 100644 index 000000000..23ce2b6e9 --- /dev/null +++ b/MY_ThreatRank/lang/zhcn.jx3dat @@ -0,0 +1,21 @@ +return { + -- TS.lua -- + -- MY_ThreatRank + ['MY_ThreatRank'] = '仇恨统计', + ['Well done! %s in %d group first to attack %s!!'] = '%d小队的 %s 率先攻击了 %s!获取不一定准确,仅供参考!', + ['** You Threat more than %d, 120% is Out of Taunt! **'] = '** 你的仇恨超过了 %d% 达到 120% 则OT!**', + ['Enable ThreatScrutiny'] = '开启仇恨统计', + ['Only in the map type is Dungeon Enable plug-in'] = '只有地图类型是秘境时才启用', + ['Alert Setting'] = '报警设置', + ['OT Alert'] = '即将OT报警', + ['OT Alert Sound'] = '播放声音', + ['Style Setting'] = '风格设置', + ['Show percent'] = '显示百分比', + ['Top Target'] = '置顶目标', + ['Special Self'] = '自己的颜色特殊化显示', + ['Style Select'] = '风格选择', + ['Style %d'] = '风格 %d', + [' alpha'] = ' 透明度', + ['Tips'] = '小提示', + ['General'] = '常用', +} diff --git a/MY_ThreatRank/lang/zhtw.jx3dat b/MY_ThreatRank/lang/zhtw.jx3dat new file mode 100644 index 000000000..8e3ddbdaf --- /dev/null +++ b/MY_ThreatRank/lang/zhtw.jx3dat @@ -0,0 +1,21 @@ +return { + -- TS.lua -- + -- MY_ThreatRank + ['MY_ThreatRank'] = '浠囨仺绲辫▓', + ['Well done! %s in %d group first to attack %s!!'] = '%d灏忛殜鐨 %s 鐜囧厛鏀绘搳浜 %s锛佺嵅鍙栦笉涓瀹氬噯纰猴紝鍍呬緵鍙冭冿紒', + ['** You Threat more than %d, 120% is Out of Taunt! **'] = '** 浣犵殑浠囨仺瓒呴亷浜 %d锛 閬斿埌 120锛 鍓囷集锛达紒**', + ['Enable ThreatScrutiny'] = '闁嬪暉浠囨仺绲辫▓', + ['Only in the map type is Dungeon Enable plug-in'] = '鍙湁鍦板湒椤炲瀷鏄澧冩檪鎵嶅暉鐢', + ['Alert Setting'] = '鍫辫瑷疆', + ['OT Alert'] = '鍗冲皣OT鍫辫', + ['OT Alert Sound'] = '鎾斁鑱查煶', + ['Style Setting'] = '棰ㄦ牸瑷疆', + ['Show percent'] = '椤ず鐧惧垎姣', + ['Top Target'] = '缃爞鐩', + ['Special Self'] = '鑷繁鐨勯鑹茬壒娈婂寲椤ず', + ['Style Select'] = '棰ㄦ牸閬告搰', + ['Style %d'] = '棰ㄦ牸 %d', + [' alpha'] = ' 閫忔槑搴', + ['Tips'] = '灏忔彁绀', + ['General'] = '甯哥敤', +} diff --git a/MY_ThreatRank/src/MY_ThreatRank.lua b/MY_ThreatRank/src/MY_ThreatRank.lua new file mode 100644 index 000000000..0607f7280 --- /dev/null +++ b/MY_ThreatRank/src/MY_ThreatRank.lua @@ -0,0 +1,754 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 仇恨统计 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_ThreatRank/MY_ThreatRank' +local PLUGIN_NAME = 'MY_ThreatRank' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ThreatRank' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ThreatRank', _L['Target'], { + bEnable = { -- 开启 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Enable ThreatScrutiny'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bInDungeon = { -- 只有秘境内才开启 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Only in the map type is Dungeon Enable plug-in'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nBGAlpha = { -- 背景透明度 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + g_tStrings.STR_RAID_MENU_BG_ALPHA, + }), + xSchema = X.Schema.Number, + xDefaultValue = 30, + }, + nMaxBarCount = { -- 最大列表 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + g_tStrings.STR_SHOW_HATRE_COUNTS, + }), + xSchema = X.Schema.Number, + xDefaultValue = 7, + }, + bForceColor = { -- 根据门派着色 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + g_tStrings.STR_RAID_COLOR_NAME_SCHOOL, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bForceIcon = { -- 显示门派图标 团队时显示心法 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + g_tStrings.STR_SHOW_KUNGFU, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nOTAlertLevel = { -- OT提醒 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['OT Alert'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 1, + }, + bOTAlertSound = { -- OT 播放声音 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['OT Alert Sound'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSpecialSelf = { -- 特殊颜色显示自己 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Special Self'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTopTarget = { -- 置顶当前目标 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Top Target'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowPercent = { -- 是否为显示百分比模式 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Show percent'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tAnchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'TOPRIGHT', r = 'TOPRIGHT', x = -300, y = 300 }, + }, + nStyle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_ThreatRank'], + szDescription = X.MakeCaption({ + _L['Style Select'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 2, + }, +}) + +local TS = {} +local ipairs, pairs = ipairs, pairs +local MY_GetPlayer, MY_GetNpc, MY_IsPlayer, ApplyCharacterThreatRankList = X.GetPlayer, X.GetNpc, X.IsPlayer, ApplyCharacterThreatRankList +local MY_GetClientPlayer, GetClientTeam = X.GetClientPlayer, GetClientTeam +local MY_GetClientPlayerID, GetTime = UI_GetClientPlayerID, GetTime +local HATRED_COLLECT = g_tStrings.HATRED_COLLECT +local MY_GetForceColor = X.GetForceColor +local MY_GetBuff, MY_GetBuffName, MY_GetEndTime = X.GetBuff, X.GetBuffName, X.GetEndTime +local GetNpcIntensity = GetNpcIntensity +local GetTime = GetTime + +local TS_INIFILE = X.PACKET_INFO.ROOT .. 'MY_ThreatRank/ui/MY_ThreatRank.ini' + +local _TS = { + tStyle = LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_ThreatRank/data/style.jx3dat'), +} +local function IsEnabled() return O.bEnable end + +function TS.OnFrameCreate() + this:RegisterEvent('CHARACTER_THREAT_RANKLIST') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('TARGET_CHANGE') + this:RegisterEvent('FIGHT_HINT') + this:RegisterEvent('LOADING_END') + this.hItemData = this:CreateItemData(X.PACKET_INFO.ROOT .. 'MY_ThreatRank/ui/Handle_ThreatBar.ini', 'Handle_ThreatBar') + this.dwTargetID = 0 + this.nTime = 0 + this.bSelfTreatRank = 0 + this.bg = this:Lookup('', 'Image_Background') + this.bg:SetAlpha(255 * O.nBGAlpha / 100) + this.handle = this:Lookup('', 'Handle_List') + this.txt = this:Lookup('', 'Handle_TargetInfo'):Lookup('Text_Name') + this.CastBar = this:Lookup('', 'Handle_TargetInfo'):Lookup('Image_Cast_Bar') + this.Life = this:Lookup('', 'Handle_TargetInfo'):Lookup('Image_Life') + this:Lookup('', 'Text_Title'):SetText(g_tStrings.HATRED_COLLECT) + _TS.UpdateAnchor(this) + TS.OnEvent('TARGET_CHANGE') +end + +function TS.OnEvent(szEvent) + if szEvent == 'UI_SCALED' then + _TS.UpdateAnchor(this) + elseif szEvent == 'TARGET_CHANGE' then + local dwType, dwID = Target_GetTargetData() + local dwTargetID + -- check tar + if dwType == TARGET.NPC or MY_GetNpc(this.dwLockTargetID) then + if MY_GetNpc(this.dwLockTargetID) then + dwTargetID = this.dwLockTargetID + else + dwTargetID = dwID + end + elseif dwType == TARGET.PLAYER and MY_GetPlayer(dwID) then + local tdwType, tdwID = MY_GetPlayer(dwID).GetTarget() + if tdwType == TARGET.NPC then + dwTargetID = tdwID + end + end + -- so ... + if dwTargetID then + this.dwTargetID = dwTargetID + this:Show() + else + _TS.UnBreathe() + end + elseif szEvent == 'CHARACTER_THREAT_RANKLIST' then + if arg0 == this.dwTargetID then + _TS.UpdateThreatBars(arg1, arg2, arg0) + end + elseif szEvent == 'FIGHT_HINT' then + if not arg0 then + this.nTime = GetTime() + end + elseif szEvent == 'LOADING_END' then + this.dwTargetID = 0 + this.nTime = 0 + this.bSelfTreatRank = 0 + end +end + +function TS.OnFrameBreathe() + local p = MY_GetNpc(this.dwTargetID) + if p then + ApplyCharacterThreatRankList(this.dwTargetID) + local nType, dwSkillID, dwSkillLevel, fCastPercent = X.GetCharacterOTActionState(p) + local fCurrentLife, fMaxLife = X.GetCharacterLife(p) + if nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE then + this.CastBar:Show() + this.CastBar:SetPercentage(fCastPercent) + local szName = X.GetSkillName(dwSkillID, dwSkillLevel) + this.txt:SetText(szName) + else + local lifeper = fCurrentLife / fMaxLife + this.CastBar:Hide() + this.txt:SetText(X.GetNpcName(p.dwID) .. string.format(' (%0.1f%%)', lifeper * 100)) + this.Life:SetPercentage(lifeper) + end + + -- 无威胁提醒 + local buff = MY_GetBuff(MY_GetClientPlayer(), { + [917] = 0, + [4487] = 0, + [926] = 0, + [775] = 0, + [4101] = 0, + [8422] = 0 + }) + local hText = this:Lookup('', 'Text_Title') + local szText = hText.szText or '' + if buff then + local szName = MY_GetBuffName(buff.dwID, buff.nLevel) + hText:SetText(string.format('%s (%ds)', szName, math.floor(MY_GetEndTime(buff.nEndFrame))) .. szText) + hText:SetFontColor(0, 255, 0) + else + hText:SetText(HATRED_COLLECT .. szText) + hText:SetFontColor(255, 255, 255) + hText.bBuff = nil + end + + -- 开怪提醒 + if this.nTime >= 0 and GetTime() - this.nTime > 1000 * 7 and GetNpcIntensity(p) > 2 then + local me = MY_GetClientPlayer() + if not me.bFightState then return end + this.nTime = -1 + X.DelayCall(1000, function() + if not me.IsInParty() then return end + if p and p.dwDropTargetPlayerID and p.dwDropTargetPlayerID ~= 0 then + if IsParty(me.dwID, p.dwDropTargetPlayerID) or me.dwID == p.dwDropTargetPlayerID then + local team = GetClientTeam() + local szMember = team.GetClientTeamMemberName(p.dwDropTargetPlayerID) + local nGroup = team.GetMemberGroupIndex(p.dwDropTargetPlayerID) + 1 + local name = X.GetNpcName(p.dwID) + local oContent = {_L('Well done! %s in %d group first to attack %s!!', nGroup, szMember, name), r = 150, g = 250, b = 230} + local oTitle = {g_tStrings.HATRED_COLLECT, r = 150, g = 250, b = 230} + X.OutputSystemMessage(oTitle, oContent) + end + end + end) + end + else + this:Hide() + end +end + +function TS.OnLButtonClick() + local szName = this:GetName() + if szName == 'Btn_Setting' then + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_ThreatRank') + end +end + +function TS.OnCheckBoxCheck() + local szName = this:GetName() + if szName == 'CheckBox_ScrutinyLock' then + local dwType, dwID = Target_GetTargetData() + local frame = this:GetRoot() + frame.dwLockTargetID = frame.dwTargetID + end +end + +function TS.OnCheckBoxUncheck() + local szName = this:GetName() + if szName == 'CheckBox_ScrutinyLock' then + local dwType, dwID = Target_GetTargetData() + local frame = this:GetRoot() + frame.dwLockTargetID = 0 + if dwID then + frame.dwTargetID = dwID + else + _TS.UnBreathe() + end + end +end + +function TS.OnFrameDragEnd() + this:CorrectPos() + O.tAnchor = GetFrameAnchor(this) +end + +function _TS.GetFrame() + return Station.Lookup('Normal/MY_ThreatRank') +end + +function _TS.CheckOpen() + if O.bEnable then + if O.bInDungeon then + if X.IsInDungeonMap() then + _TS.OpenPanel() + else + _TS.ClosePanel() + end + else + _TS.OpenPanel() + end + else + _TS.ClosePanel() + end +end + +function _TS.OpenPanel() + local frame = _TS.GetFrame() + if not frame then + frame = X.UI.OpenFrame(TS_INIFILE, 'MY_ThreatRank') + local dwType = Target_GetTargetData() + if dwType ~= TARGET.NPC then + frame:Hide() + end + end + return frame +end + +function _TS.ClosePanel() + if _TS.GetFrame() then + X.UI.CloseFrame(_TS.GetFrame()) + end +end + +function _TS.UnBreathe() + local frame = _TS.GetFrame() + frame:Hide() + frame.dwTargetID = 0 + frame.handle:Clear() + frame.bg:SetSize(240, 55) + frame.txt:SetText(_L['Loading...']) + frame.Life:SetPercentage(0) + frame:Lookup('', 'Text_Title').szText = '' +end + +function _TS.UpdateAnchor(frame) + local a = O.tAnchor + frame:SetPoint(a.s, 0, 0, a.r, a.x, a.y) + this:CorrectPos() +end + +-- 有几个问题 +-- 1) 当前目标 结果反馈的是0仇恨 BUG了 fixed +-- 2) 反馈的目标是错误的 也BUG了 fixed +-- 3) 因为是异步 反馈时目标已经更新 也需要同时更新 fixed +-- 4) 反馈的列表中不存在当前目标 fixed +function _TS.UpdateThreatBars(tList, dwTargetID, dwApplyID) + local team = GetClientTeam() + local tThreat, tRank, tMyRank, nTopRank = {}, {}, {}, 1 + -- 修复arg2反馈不准 当前目标才修复 非当前目标也不准。。 + local dwType, dwID = Target_GetTargetData() + if dwID == dwApplyID and dwType == TARGET.NPC then + local p = MY_GetNpc(dwApplyID) + if p then + local _, tdwID = p.GetTarget() + if tdwID and tdwID ~= 0 and tdwID ~= dwTargetID and tList[tdwID] then -- 原来是0 搞半天。。 + dwTargetID = tdwID + end + end + end + -- 重构用于排序 + for k, v in pairs(tList) do + table.insert(tThreat, { id = k, val = v }) + end + table.sort(tThreat, function(a, b) return a.val > b.val end) -- 进行排序 + for k, v in ipairs(tThreat) do + v.sort = k + if v.id == MY_GetClientPlayerID() then + tMyRank = v + end + end + this.bg:SetH(55 + 24 * math.min(#tThreat, O.nMaxBarCount)) + this.handle:Clear() + local KGnpc = MY_GetNpc(dwApplyID) + if #tThreat > 0 and KGnpc then + this:Show() + if #tThreat >= 2 then + if O.bTopTarget and tList[dwTargetID] then + for k, v in ipairs(tThreat) do + if v.id == dwTargetID then + table.insert(tThreat, 1, table.remove(tThreat, k)) + break + end + end + end + end + + if tThreat[1].val ~= 0 then + nTopRank = tThreat[1].val + else + tThreat[1].val = nTopRank -- 修正一些无仇恨的技能,这样单人会显示0%,很不好看。 + end + + local dat = _TS.tStyle[O.nStyle] or _TS.tStyle[1] + local show = false + for k, v in ipairs(tThreat) do + if k > O.nMaxBarCount then break end + local dwMeID = MY_GetClientPlayerID() + if dwMeID == v.id then + if O.nOTAlertLevel > 0 and GetNpcIntensity(KGnpc) > 2 then + if this.bSelfTreatRank < O.nOTAlertLevel and v.val / nTopRank >= O.nOTAlertLevel then + X.OutputAnnounceMessage(_L('** You Threat more than %d, 120% is Out of Taunt! **', O.nOTAlertLevel * 100)) + if O.bOTAlertSound then + PlaySound(SOUND.UI_SOUND, _L['SOUND_nat_view2']) + end + end + end + this.bSelfTreatRank = v.val / nTopRank + show = true + elseif k == O.nMaxBarCount and not show and tList[MY_GetClientPlayerID()] then -- 始终显示自己的 + v = tMyRank + end + + local item = this.handle:AppendItemFromData(this.hItemData, k) + local nThreatPercentage, fDiff = 0, 0 + if O.bShowPercent then + if v.val ~= 0 then + fDiff = v.val / nTopRank + nThreatPercentage = fDiff * (100 / 120) + item:Lookup('Text_ThreatValue'):SetText(math.floor(100 * fDiff) .. '%') + else + item:Lookup('Text_ThreatValue'):SetText('0%') + end + else + item:Lookup('Text_ThreatValue'):SetText(v.val) + end + item:Lookup('Text_ThreatValue'):SetFontScheme(dat[6][2]) + + if v.id == dwTargetID then + if dwTargetID == MY_GetClientPlayerID() then + item:Lookup('Image_Target'):SetFrame(10) + end + item:Lookup('Image_Target'):Show() + end + + local r, g, b = 188, 188, 188 + local szName, dwForceID = _L['Loading...'], 0 + if MY_IsPlayer(v.id) then + local p = MY_GetPlayer(v.id) + if p then + dwForceID = p.dwForceID + szName = p.szName + else + if MY_Farbnamen and MY_Farbnamen.Get then + local data = MY_Farbnamen.Get(v.id) + if data then + szName = data.szName + dwForceID = data.dwForceID + end + end + end + if O.bForceColor and p then + r, g, b = MY_GetForceColor(p.dwForceID) + else + r, g, b = 255, 255, 255 + end + else + local p = MY_GetNpc(v.id) + if p then + szName = X.GetNpcName(p.dwID, { eShowEmployer = 'suffix' }) + if p.dwEmployer == dwMeID then + r, g, b = 230, 230, 230 + end + end + end + item:Lookup('Text_ThreatName'):SetText(v.sort .. '.' .. szName) + item:Lookup('Text_ThreatName'):SetFontScheme(dat[6][1]) + item:Lookup('Text_ThreatName'):SetFontColor(r, g, b) + if O.bForceIcon then + local info = X.IsTeammate(v.id) and MY_IsPlayer(v.id) and X.GetTeamMemberInfo(v.id) + if info then + item:Lookup('Image_Icon'):FromIconID(Table_GetSkillIconID(info.dwActualKungfuID, 1)) + elseif MY_IsPlayer(v.id) then + item:Lookup('Image_Icon'):FromUITex(GetForceImage(dwForceID)) + else + item:Lookup('Image_Icon'):FromUITex('ui/Image/TargetPanel/Target.uitex', 57) + end + item:Lookup('Text_ThreatName'):SetRelPos(21, 4) + item:FormatAllItemPos() + end + if fDiff > 1 then + item:Lookup('Image_Treat_Bar'):FromUITex(unpack(dat[4])) + item:Lookup('Text_ThreatName'):SetFontColor(255, 255, 255) --红色的 无论如何都显示白了 否则看不清 + elseif fDiff >= 0.80 then + item:Lookup('Image_Treat_Bar'):FromUITex(unpack(dat[3])) + elseif fDiff >= 0.50 then + item:Lookup('Image_Treat_Bar'):FromUITex(unpack(dat[2])) + elseif fDiff >= 0.01 then + item:Lookup('Image_Treat_Bar'):FromUITex(unpack(dat[1])) + end + if O.bSpecialSelf and v.id == MY_GetClientPlayerID() then + item:Lookup('Image_Treat_Bar'):FromUITex(unpack(dat[5])) + end + item:Lookup('Image_Treat_Bar'):SetPercentage(nThreatPercentage) + item:Show() + end + this.handle:FormatAllItemPos() + this.handle:SetSizeByAllItemSize() + -- else + -- this:Hide() + end +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ThreatRank', + exports = { + { + preset = 'UIEvent', + root = TS, + }, + }, +} +MY_ThreatRank = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- +do +local function GetMenu() + return { + szOption = g_tStrings.HATRED_COLLECT, + bCheck = true, bChecked = not not _TS.GetFrame(), + fnAction = function() + O.bInDungeon = false + if not _TS.GetFrame() then -- 这样才对嘛 按按钮应该强制开启和关闭 + O.bEnable = true + else + O.bEnable = false + end + _TS.CheckOpen() + end + } +end +X.RegisterAddonMenu(GetMenu) +end +X.RegisterEvent('LOADING_END', _TS.CheckOpen) +X.RegisterUserSettingsInit('MY_ThreatRank', _TS.CheckOpen) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- + +local PS = {} +function PS.OnPanelActive(frame) + local ui = X.UI(frame) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + + ui:Append('Text', { x = nX, y = nY, text = g_tStrings.HATRED_COLLECT, font = 27 }) + nX = nX + 10 + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 130, checked = O.bEnable, text = _L['Enable ThreatScrutiny'], + onCheck = function(bChecked) + O.bEnable = bChecked + _TS.CheckOpen() + end, + }) + nX = nX + 130 + + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 250, checked = O.bInDungeon, + enable = O.bEnable, + text = _L['Only in the map type is Dungeon Enable plug-in'], + onCheck = function(bChecked) + O.bInDungeon = bChecked + _TS.CheckOpen() + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Alert Setting'], font = 27, autoEnable = IsEnabled }) + nX = nX + 10 + nY = nY + 28 + ui:Append('WndCheckBox', { + x = nX, y = nY, checked = O.nOTAlertLevel == 1, text = _L['OT Alert'], + onCheck = function(bChecked) + if bChecked then -- 以后可以做% 暂时先不管 + O.nOTAlertLevel = 1 + else + O.nOTAlertLevel = 0 + end + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX, y = nY, checked = O.bOTAlertSound, text = _L['OT Alert Sound'], + onCheck = function(bChecked) + O.bOTAlertSound = bChecked + end, + autoEnable = function() return IsEnabled() and O.nOTAlertLevel == 1 end, + }) + nY = nY + 28 + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Style Setting'], font = 27, autoEnable = IsEnabled }) + nY = nY + 28 + + nX = nX + 10 + ui:Append('WndCheckBox', { + x = nX , y = nY, checked = O.bShowPercent, text = _L['Show percent'], + onCheck = function(bChecked) + O.bShowPercent = bChecked + end, + autoEnable = IsEnabled, + }) + + nY = nY + 28 + ui:Append('WndCheckBox', { + x = nX , y = nY, checked = O.bTopTarget, text = _L['Top Target'], + onCheck = function(bChecked) + O.bTopTarget = bChecked + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX , y = nY, checked = O.bForceColor, text = g_tStrings.STR_RAID_COLOR_NAME_SCHOOL, + onCheck = function(bChecked) + O.bForceColor = bChecked + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX , y = nY, checked = O.bForceIcon, text = g_tStrings.STR_SHOW_KUNGFU, + onCheck = function(bChecked) + O.bForceIcon = bChecked + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndCheckBox', { + x = nX , y = nY, w = 200, checked = O.bSpecialSelf, text = _L['Special Self'], + onCheck = function(bChecked) + O.bSpecialSelf = bChecked + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndComboBox', { + x = nX, y = nY, text = _L['Style Select'], + menu = function() + local t = {} + for k, v in ipairs(_TS.tStyle) do + table.insert(t, { + szOption = _L('Style %d', k), + bMCheck = true, + bChecked = O.nStyle == k, + fnAction = function() + O.nStyle = k + end, + }) + end + return t + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + ui:Append('WndComboBox', { + x = nX, y = nY, text = g_tStrings.STR_SHOW_HATRE_COUNTS, + menu = function() + local t = {} + for k, v in ipairs({2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 50}) do -- 其实服务器最大反馈不到50个 + table.insert(t, { + szOption = v, + bMCheck = true, + bChecked = O.nMaxBarCount == v, + fnAction = function() + O.nMaxBarCount = v + end, + }) + end + return t + end, + autoEnable = IsEnabled, + }) + nY = nY + 28 + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = g_tStrings.STR_RAID_MENU_BG_ALPHA, autoEnable = IsEnabled }) + nX = nX + 5 + nY = nY + 28 + ui:Append('WndSlider', { + x = nX, y = nY, text = '', + range = {0, 100}, + value = O.nBGAlpha, + onChange = function(nVal) + O.nBGAlpha = nVal + local frame = _TS.GetFrame() + if frame then + frame.bg:SetAlpha(255 * O.nBGAlpha / 100) + end + end, + autoEnable = IsEnabled, + }) +end +X.Panel.Register(_L['Target'], 'MY_ThreatRank', g_tStrings.HATRED_COLLECT, 632, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_ThreatRank/ui/Handle_ThreatBar.ini b/MY_ThreatRank/ui/Handle_ThreatBar.ini new file mode 100644 index 000000000..d0259708a --- /dev/null +++ b/MY_ThreatRank/ui/Handle_ThreatBar.ini @@ -0,0 +1,99 @@ +[Handle_ThreatBar] +._WndType=Handle +._Parent=Handle_List +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=240 +Height=24 +LockShowAndHide=1 + +[Image_Treat_Pad_A] +._WndType=Image +._Parent=Handle_ThreatBar +Image=ui\Image\TargetPanel\Target.UITex +Frame=81 +Alpha=100 +Left=0 +Top=0 +PosType=0 +Width=232 +Height=24 +ImageType=10 + +[Image_Treat_Pad_B] +._WndType=Image +._Parent=Handle_ThreatBar +Image=ui\Image\Common\Box.UITex +Frame=5 +Alpha=80 +Left=192 +Top=3 +PosType=0 +Width=38 +Height=19 +ImageType=10 + +[Image_Treat_Bar] +._WndType=Image +._Parent=Handle_ThreatBar +Alpha=255 +Left=3 +Top=3 +PosType=0 +Width=226 +Height=18 +ImageType=1 + +[Text_ThreatName] +._WndType=Text +._Parent=Handle_ThreatBar +Width=132 +Height=18 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=5 +Top=4 +PosType=0 +AutoEtc=1 +ShowAll=0 + +[Text_ThreatValue] +._WndType=Text +._Parent=Handle_ThreatBar +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=135 +Top=3 +PosType=0 +HAlign=2 +VAlign=1 +Width=60 +Height=19 + +[Image_Icon] +._WndType=Image +._Parent=Handle_ThreatBar +Alpha=255 +Left=2 +Top=2 +PosType=0 +Width=19 +Height=19 +ImageType=10 + +[Image_Target] +._WndType=Image +._Parent=Handle_ThreatBar +Alpha=255 +Image=ui\Image\Minimap\Minimap.uitex +Frame=1 +Left=199 +Top=1 +PosType=0 +ImageType=10 +LockShowAndHide=1 diff --git a/MY_ThreatRank/ui/MY_ThreatRank.ini b/MY_ThreatRank/ui/MY_ThreatRank.ini new file mode 100644 index 000000000..ad9d40770 --- /dev/null +++ b/MY_ThreatRank/ui/MY_ThreatRank.ini @@ -0,0 +1,185 @@ +[MY_ThreatRank] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=240 +Height=28 +DragAreaWidth=240 +DragAreaHeight=28 +IsCustomDragable=1 +DragAreaLeft=0 +DragAreaTop=0 + +[Handle_Total] +._WndType=Handle +._Parent=MY_ThreatRank +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 + +[Image_Background] +._WndType=Shadow +._Parent=Handle_Total +Alpha=80 +color=gray3 +Width=240 +Height=55 +Left=0 +Top=0 + +[Image_Title] +._WndType=Image +._Parent=Handle_Total +Image=ui\Image\Minimap\MapMark.UITex +Frame=77 +Alpha=210 +Left=0 +Top=0 +PosType=0 +ImageType=10 +Width=240 +Height=30 + +[Text_Title] +._WndType=Text +._Parent=Handle_Total +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=STR_THREAT_STAT_TITLE +OrgText=1 +Left=30 +Top=6 +PosType=0 +FontScheme=18 +VAlign=1 +Width=200 +Height=20 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +Left=4 +Top=50 +PosType=0 +Width=10 +Height=10 +HandleType=3 +PixelScroll=1 +ControlShow=1 + +[Handle_TargetInfo] +._WndType=Handle +._Parent=Handle_Total +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=30 +PosType=0 +Width=240 +Height=80 + +[Image_Life] +._WndType=Image +._Parent=Handle_TargetInfo +Image=ui\Image\Common\Money.uitex +Frame=210 +Alpha=100 +Left=5 +Top=0 +PosType=0 +Width=230 +Height=19 +ImageType=1 + +[Image_Cast_Bar] +._WndType=Image +._Parent=Handle_TargetInfo +Image=ui\Image\TargetPanel\Target.UITex +Frame=83 +Alpha=255 +Left=5 +Top=0 +PosType=0 +Width=230 +Height=19 +ImageType=1 +LockShowAndHide=1 + +[Text_Name] +._WndType=Text +._Parent=Handle_TargetInfo +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=9 +$Text=Loading... +OrgText=1 +PosType=0 +FontScheme=187 +HAlign=1 +VAlign=1 +Width=240 +Height=2 +AutoEtc=1 +ShowAll=0 + +[Btn_Setting] +._WndType=WndButton +._Parent=MY_ThreatRank +Left=10 +Top=8 +Width=17 +Height=15 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +$Tip=STR_TITLE_MESLINE_SETTINGS +OrgTip=0 +Trans=0 +Image=ui\Image\UICommon\CommonPanel2.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +NormalGroup=40 +MouseOverGroup=41 +MouseDownGroup=42 +DisableGroup=43 +ShowTipType=0 + +[CheckBox_ScrutinyLock] +._WndType=WndCheckBox +._Parent=MY_ThreatRank +Frame=0 +Left=207 +Top=2 +Width=26 +Height=30 +$Tip=STR_UISETING_LOCKTARGET +OrgTip=0 +UnCheckAndEnable=84 +CheckAndEnable=86 +UnCheckAndDisable=84 +CheckAndDisable=86 +UnCheckedAndEnableWhenMouseOver=85 +CheckedAndEnableWhenMouseOver=83 +CheckedAndDisableWhenMouseOver=83 +UnCheckedAndDisableWhenMouseOver=85 +Checking=83 +UnChecking=85 +Image=ui\Image\Minimap\Minimap.UITex +CheckedWhenCreate=0 + diff --git a/MY_Toolbox/data/dynamic_item/intl/10.jx3dat b/MY_Toolbox/data/dynamic_item/intl/10.jx3dat new file mode 100644 index 000000000..fb9ab511b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/10.jx3dat @@ -0,0 +1 @@ +return {{4,5,26777},{4,5,26768}} diff --git a/MY_Toolbox/data/dynamic_item/intl/101.jx3dat b/MY_Toolbox/data/dynamic_item/intl/101.jx3dat new file mode 100644 index 000000000..adb53c0ba --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/101.jx3dat @@ -0,0 +1 @@ +return {{4,5,23380},{}} diff --git a/MY_Toolbox/data/dynamic_item/intl/105.jx3dat b/MY_Toolbox/data/dynamic_item/intl/105.jx3dat new file mode 100644 index 000000000..4cc633aad --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/105.jx3dat @@ -0,0 +1 @@ +return {{4,5,17032}} diff --git a/MY_Toolbox/data/dynamic_item/intl/150.jx3dat b/MY_Toolbox/data/dynamic_item/intl/150.jx3dat new file mode 100644 index 000000000..8536e4cee --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/150.jx3dat @@ -0,0 +1 @@ +return {{4,5,29627}} diff --git a/MY_Toolbox/data/dynamic_item/intl/159.jx3dat b/MY_Toolbox/data/dynamic_item/intl/159.jx3dat new file mode 100644 index 000000000..59f409d6e --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/159.jx3dat @@ -0,0 +1 @@ +return {{4,5,29628},{4,5,27642},{4,5,27643},{4,5,27641}} diff --git a/MY_Toolbox/data/dynamic_item/intl/16.jx3dat b/MY_Toolbox/data/dynamic_item/intl/16.jx3dat new file mode 100644 index 000000000..29a164fe8 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/16.jx3dat @@ -0,0 +1 @@ +return {{4,5,29636}} diff --git a/MY_Toolbox/data/dynamic_item/intl/172.jx3dat b/MY_Toolbox/data/dynamic_item/intl/172.jx3dat new file mode 100644 index 000000000..b44ae8dd5 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/172.jx3dat @@ -0,0 +1 @@ +return {{4,5,20016}} diff --git a/MY_Toolbox/data/dynamic_item/intl/193.jx3dat b/MY_Toolbox/data/dynamic_item/intl/193.jx3dat new file mode 100644 index 000000000..6b07b4cfd --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/193.jx3dat @@ -0,0 +1 @@ +return {{4,5,28443}} diff --git a/MY_Toolbox/data/dynamic_item/intl/194.jx3dat b/MY_Toolbox/data/dynamic_item/intl/194.jx3dat new file mode 100644 index 000000000..4f3c4446b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/194.jx3dat @@ -0,0 +1 @@ +return {[16]={}} diff --git a/MY_Toolbox/data/dynamic_item/intl/216.jx3dat b/MY_Toolbox/data/dynamic_item/intl/216.jx3dat new file mode 100644 index 000000000..28524b42b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/216.jx3dat @@ -0,0 +1 @@ +return {{4,5,32655}} diff --git a/MY_Toolbox/data/dynamic_item/intl/22.jx3dat b/MY_Toolbox/data/dynamic_item/intl/22.jx3dat new file mode 100644 index 000000000..f96074d26 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/22.jx3dat @@ -0,0 +1 @@ +return {{4,5,28120},{}} diff --git a/MY_Toolbox/data/dynamic_item/intl/23.jx3dat b/MY_Toolbox/data/dynamic_item/intl/23.jx3dat new file mode 100644 index 000000000..f9923bb54 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/23.jx3dat @@ -0,0 +1 @@ +return {{4,5,26675},{4,5,28808},{},{},{},{},{},{},{},{},{},{},{},{},{},{}} diff --git a/MY_Toolbox/data/dynamic_item/intl/243.jx3dat b/MY_Toolbox/data/dynamic_item/intl/243.jx3dat new file mode 100644 index 000000000..a6af2b3a6 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/243.jx3dat @@ -0,0 +1 @@ +return {{4,5,30745}} diff --git a/MY_Toolbox/data/dynamic_item/intl/330.jx3dat b/MY_Toolbox/data/dynamic_item/intl/330.jx3dat new file mode 100644 index 000000000..ab20eb075 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/330.jx3dat @@ -0,0 +1 @@ +return {{4,5,30965}} diff --git a/MY_Toolbox/data/dynamic_item/intl/332.jx3dat b/MY_Toolbox/data/dynamic_item/intl/332.jx3dat new file mode 100644 index 000000000..fcfdb3fd4 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/332.jx3dat @@ -0,0 +1 @@ +return {{4,5,7843}} diff --git a/MY_Toolbox/data/dynamic_item/intl/411.jx3dat b/MY_Toolbox/data/dynamic_item/intl/411.jx3dat new file mode 100644 index 000000000..b98e4c181 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/411.jx3dat @@ -0,0 +1 @@ +return {{4,5,32577}} diff --git a/MY_Toolbox/data/dynamic_item/intl/421.jx3dat b/MY_Toolbox/data/dynamic_item/intl/421.jx3dat new file mode 100644 index 000000000..ec00f81a0 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/421.jx3dat @@ -0,0 +1 @@ +return {{4,5,33175},{4,5,34187},{4,5,33404},{4,5,34249},{4,5,33185},{4,5,34186},{4,5,33038},{4,5,33169},[11]={0,0,9},[13]={4,5,33188},[15]={4,5,33184},[10]={4,5,33167},[12]={4,5,33233},[14]={4,5,33183},[16]={4,5,33232},[9]={4,5,33047}} diff --git a/MY_Toolbox/data/dynamic_item/intl/427.jx3dat b/MY_Toolbox/data/dynamic_item/intl/427.jx3dat new file mode 100644 index 000000000..b76a5f2e0 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/427.jx3dat @@ -0,0 +1 @@ +return {{4,5,34545}} diff --git a/MY_Toolbox/data/dynamic_item/intl/49.jx3dat b/MY_Toolbox/data/dynamic_item/intl/49.jx3dat new file mode 100644 index 000000000..21c68147a --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/49.jx3dat @@ -0,0 +1 @@ +return {{4,5,26027}} diff --git a/MY_Toolbox/data/dynamic_item/intl/5.jx3dat b/MY_Toolbox/data/dynamic_item/intl/5.jx3dat new file mode 100644 index 000000000..5bd3e6d93 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/5.jx3dat @@ -0,0 +1 @@ +return {{4,5,21525},[11]={}} diff --git a/MY_Toolbox/data/dynamic_item/intl/6.jx3dat b/MY_Toolbox/data/dynamic_item/intl/6.jx3dat new file mode 100644 index 000000000..52c53068f --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/6.jx3dat @@ -0,0 +1 @@ +return {{4,5,32584},{4,5,34185},{0,0,9},{},[9]={4,5,30716}} diff --git a/MY_Toolbox/data/dynamic_item/intl/7.jx3dat b/MY_Toolbox/data/dynamic_item/intl/7.jx3dat new file mode 100644 index 000000000..9a75e81e9 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/intl/7.jx3dat @@ -0,0 +1 @@ +return {{4,5,29649},{4,5,17357},{4,5,4672},{4,5,4669}} diff --git a/MY_Toolbox/data/dynamic_item/remake/10.jx3dat b/MY_Toolbox/data/dynamic_item/remake/10.jx3dat new file mode 100644 index 000000000..fb9ab511b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/10.jx3dat @@ -0,0 +1 @@ +return {{4,5,26777},{4,5,26768}} diff --git a/MY_Toolbox/data/dynamic_item/remake/101.jx3dat b/MY_Toolbox/data/dynamic_item/remake/101.jx3dat new file mode 100644 index 000000000..adb53c0ba --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/101.jx3dat @@ -0,0 +1 @@ +return {{4,5,23380},{}} diff --git a/MY_Toolbox/data/dynamic_item/remake/105.jx3dat b/MY_Toolbox/data/dynamic_item/remake/105.jx3dat new file mode 100644 index 000000000..4cc633aad --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/105.jx3dat @@ -0,0 +1 @@ +return {{4,5,17032}} diff --git a/MY_Toolbox/data/dynamic_item/remake/150.jx3dat b/MY_Toolbox/data/dynamic_item/remake/150.jx3dat new file mode 100644 index 000000000..8536e4cee --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/150.jx3dat @@ -0,0 +1 @@ +return {{4,5,29627}} diff --git a/MY_Toolbox/data/dynamic_item/remake/159.jx3dat b/MY_Toolbox/data/dynamic_item/remake/159.jx3dat new file mode 100644 index 000000000..59f409d6e --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/159.jx3dat @@ -0,0 +1 @@ +return {{4,5,29628},{4,5,27642},{4,5,27643},{4,5,27641}} diff --git a/MY_Toolbox/data/dynamic_item/remake/16.jx3dat b/MY_Toolbox/data/dynamic_item/remake/16.jx3dat new file mode 100644 index 000000000..29a164fe8 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/16.jx3dat @@ -0,0 +1 @@ +return {{4,5,29636}} diff --git a/MY_Toolbox/data/dynamic_item/remake/172.jx3dat b/MY_Toolbox/data/dynamic_item/remake/172.jx3dat new file mode 100644 index 000000000..b44ae8dd5 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/172.jx3dat @@ -0,0 +1 @@ +return {{4,5,20016}} diff --git a/MY_Toolbox/data/dynamic_item/remake/193.jx3dat b/MY_Toolbox/data/dynamic_item/remake/193.jx3dat new file mode 100644 index 000000000..6b07b4cfd --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/193.jx3dat @@ -0,0 +1 @@ +return {{4,5,28443}} diff --git a/MY_Toolbox/data/dynamic_item/remake/194.jx3dat b/MY_Toolbox/data/dynamic_item/remake/194.jx3dat new file mode 100644 index 000000000..4f3c4446b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/194.jx3dat @@ -0,0 +1 @@ +return {[16]={}} diff --git a/MY_Toolbox/data/dynamic_item/remake/216.jx3dat b/MY_Toolbox/data/dynamic_item/remake/216.jx3dat new file mode 100644 index 000000000..28524b42b --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/216.jx3dat @@ -0,0 +1 @@ +return {{4,5,32655}} diff --git a/MY_Toolbox/data/dynamic_item/remake/22.jx3dat b/MY_Toolbox/data/dynamic_item/remake/22.jx3dat new file mode 100644 index 000000000..f96074d26 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/22.jx3dat @@ -0,0 +1 @@ +return {{4,5,28120},{}} diff --git a/MY_Toolbox/data/dynamic_item/remake/23.jx3dat b/MY_Toolbox/data/dynamic_item/remake/23.jx3dat new file mode 100644 index 000000000..f9923bb54 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/23.jx3dat @@ -0,0 +1 @@ +return {{4,5,26675},{4,5,28808},{},{},{},{},{},{},{},{},{},{},{},{},{},{}} diff --git a/MY_Toolbox/data/dynamic_item/remake/243.jx3dat b/MY_Toolbox/data/dynamic_item/remake/243.jx3dat new file mode 100644 index 000000000..a6af2b3a6 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/243.jx3dat @@ -0,0 +1 @@ +return {{4,5,30745}} diff --git a/MY_Toolbox/data/dynamic_item/remake/330.jx3dat b/MY_Toolbox/data/dynamic_item/remake/330.jx3dat new file mode 100644 index 000000000..ab20eb075 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/330.jx3dat @@ -0,0 +1 @@ +return {{4,5,30965}} diff --git a/MY_Toolbox/data/dynamic_item/remake/332.jx3dat b/MY_Toolbox/data/dynamic_item/remake/332.jx3dat new file mode 100644 index 000000000..fcfdb3fd4 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/332.jx3dat @@ -0,0 +1 @@ +return {{4,5,7843}} diff --git a/MY_Toolbox/data/dynamic_item/remake/411.jx3dat b/MY_Toolbox/data/dynamic_item/remake/411.jx3dat new file mode 100644 index 000000000..b98e4c181 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/411.jx3dat @@ -0,0 +1 @@ +return {{4,5,32577}} diff --git a/MY_Toolbox/data/dynamic_item/remake/421.jx3dat b/MY_Toolbox/data/dynamic_item/remake/421.jx3dat new file mode 100644 index 000000000..ec00f81a0 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/421.jx3dat @@ -0,0 +1 @@ +return {{4,5,33175},{4,5,34187},{4,5,33404},{4,5,34249},{4,5,33185},{4,5,34186},{4,5,33038},{4,5,33169},[11]={0,0,9},[13]={4,5,33188},[15]={4,5,33184},[10]={4,5,33167},[12]={4,5,33233},[14]={4,5,33183},[16]={4,5,33232},[9]={4,5,33047}} diff --git a/MY_Toolbox/data/dynamic_item/remake/427.jx3dat b/MY_Toolbox/data/dynamic_item/remake/427.jx3dat new file mode 100644 index 000000000..b76a5f2e0 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/427.jx3dat @@ -0,0 +1 @@ +return {{4,5,34545}} diff --git a/MY_Toolbox/data/dynamic_item/remake/49.jx3dat b/MY_Toolbox/data/dynamic_item/remake/49.jx3dat new file mode 100644 index 000000000..21c68147a --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/49.jx3dat @@ -0,0 +1 @@ +return {{4,5,26027}} diff --git a/MY_Toolbox/data/dynamic_item/remake/5.jx3dat b/MY_Toolbox/data/dynamic_item/remake/5.jx3dat new file mode 100644 index 000000000..5bd3e6d93 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/5.jx3dat @@ -0,0 +1 @@ +return {{4,5,21525},[11]={}} diff --git a/MY_Toolbox/data/dynamic_item/remake/6.jx3dat b/MY_Toolbox/data/dynamic_item/remake/6.jx3dat new file mode 100644 index 000000000..52c53068f --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/6.jx3dat @@ -0,0 +1 @@ +return {{4,5,32584},{4,5,34185},{0,0,9},{},[9]={4,5,30716}} diff --git a/MY_Toolbox/data/dynamic_item/remake/7.jx3dat b/MY_Toolbox/data/dynamic_item/remake/7.jx3dat new file mode 100644 index 000000000..9a75e81e9 --- /dev/null +++ b/MY_Toolbox/data/dynamic_item/remake/7.jx3dat @@ -0,0 +1 @@ +return {{4,5,29649},{4,5,17357},{4,5,4672},{4,5,4669}} diff --git a/MY_Toolbox/data/interact/zhcn.jx3dat b/MY_Toolbox/data/interact/zhcn.jx3dat new file mode 100644 index 000000000..681a112c7 --- /dev/null +++ b/MY_Toolbox/data/interact/zhcn.jx3dat @@ -0,0 +1,364 @@ +return { + ["帮会领地"] = { + ["帮会铁卫"] = { + ["这是帮主送来的红包,祝您新春快乐!"] = 1, + }, + }, + ["法王窟"] = { + ["献祭奴隶"] = { + ["法王窟已被攻陷,你们可以回家了!"] = 1, + }, + }, + ["长安"] = { + ["张子介"] = { + ["这是您要的仙崖石花!"] = 1, + ["这是您要的蒙顶石花!"] = 1, + ["这是您要的峨眉白芽!"] = 1, + ["这是您要的顾渚紫笋!"] = 1, + ["这是您要的西山白露!"] = 1, + }, + ["苏慧蓉"] = { + ["我想了解“燕丘之谜”。"] = 1, + ["敢问女侠,我如何才能打开龙门金蛋?"] = 1, + ["取次花丛懒回顾,半缘修道半缘君......"] = 1, + ["宝物稀有,试问谁不渴求呢?"] = 1, + ["多谢女侠指点,在感激不尽,不知有什么在下可以相助的吗?"] = 1, + ["运用内力轮番运功震击方可?"] = 1, + }, + ["赵茶"] = { + ["尽管发问"] = 1, + }, + ["白游鳞"] = { + ["白老大息怒息怒,小的再帮您去问问!"] = 1, + ["好说好说,黑老大应该会答应的!"] = 1, + ["小的帮你去问问!"] = 1, + ["白老大真的是深明大义啊!小的这就回去告诉老板娘。"] = 1, + }, + ["陈修仁"] = { + ["这是您要的仙崖石花!"] = 1, + ["这是您要的峨眉白芽!"] = 1, + ["这是您要的西山白露!"] = 1, + ["这是您要的顾渚紫笋!"] = 1, + ["这是您要的蒙顶石花!"] = 1, + }, + ["赵云睿"] = { + ["我准备好跟踪梁笑堂了!"] = 1, + }, + ["古清逻"] = { + ["这是您要的仙崖石花!"] = 1, + ["这是您要的西山白露!"] = 1, + ["这是您要的峨眉白芽!"] = 1, + ["这是您要的蒙顶石花!"] = 1, + ["这是您要的顾渚紫笋!"] = 1, + }, + ["黑腾风"] = { + ["这......小的帮您把话带回去!"] = 1, + ["这......十两银子也不少了,小的帮你回复白老大去!"] = 1, + ["这......"] = 1, + ["多谢黑老大。"] = 1, + }, + ["韩坤"] = { + ["这是您要的仙崖石花!"] = 1, + ["这是您要的蒙顶石花!"] = 1, + ["这是您要的峨眉白芽!"] = 1, + ["这是您要的顾渚紫笋!"] = 1, + ["这是您要的西山白露!"] = 1, + }, + ["易涧钱"] = { + ["这是您要的仙崖石花!"] = 1, + ["这是您要的顾渚紫笋!"] = 1, + ["这是您要的西山白露!"] = 1, + ["这是您要的蒙顶石花!"] = 1, + ["这是您要的峨眉白芽!"] = 1, + }, + }, + ["扬州"] = { + ["梵星禅师"] = { + ["多谢大师教诲"] = 1, + }, + ["琳琳"] = { + ["继续答题"] = 1, + [" 以上都是常见的被盗方式"] = 1, + [" 以上方式都可以"] = 1, + [" 立刻冻结帐号,并拨打客服电话"] = 1, + ["我要开始答题"] = 1, + [" 骗子,你以为这是私服呢!右键点他名字,举报他"] = 1, + [" 以上描述都正确"] = 1, + [" 以上都是常见的诈骗方式"] = 1, + }, + ["龙门金蛋"] = { + ["运功击裂金蛋宝箱"] = 1, + }, + }, + ["天地三才阵"] = { + ["范统"] = { + ["好,我答应你。"] = 1, + ["我该如何引他出来?"] = 1, + }, + }, + ["唐门密室"] = { + ["叶凡"] = { + ["前面好像有个人影!"] = 1, + }, + }, + ["英雄血战天策"] = { + ["天策探雷教官"] = { + ["确定."] = 1, + ["收我为徒吧,把之前那个弟子逐出师门."] = 1, + ["收我为徒吧!"] = 1, + }, + }, + ["马嵬驿"] = { + ["据点总管"] = { + ["我要进行据点贸易"] = 1, + }, + ["乞丐"] = { + ["给他一只烧饼。"] = 1, + }, + }, + ["瞿塘峡"] = { + ["小梦子"] = { + ["好啊,给你这个冰糖葫芦。"] = 1, + ["好的,再见。"] = 1, + }, + ["癫狂老头儿"] = { + ["请前辈助我一臂之力!"] = 1, + ["晚辈救您出去吧…"] = 1, + ["……那前辈可有方法能助我潜入刺探消息?"] = 1, + ["这位前辈为何被关押在此地?"] = 1, + }, + ["宫大肥"] = { + ["多谢。"] = 1, + ["好的,我这就去……"] = 1, + }, + ["张山石"] = { + ["……原来是贪官为恶!"] = 1, + ["……我也是偶然得知。"] = 1, + ["将军请说。"] = 1, + ["将军放心!我这就去。"] = 1, + ["……自古多有两难之事,将军欲报恩情又欲平不公之事,太过难为了……"] = 1, + ["多谢。"] = 1, + ["……莫非此人,乃是将军所杀?"] = 1, + ["将军请讲。"] = 1, + ["……这……"] = 1, + ["……果然是难以抉择……"] = 1, + ["……君子报仇,十年不晚!"] = 1, + ["原来如此……"] = 1, + ["这位将军何故叹息不止?"] = 1, + ["……这位“义士”难道是……"] = 1, + ["……如此身家,何故落草?"] = 1, + }, + ["宫威"] = { + ["一声号令,众人拜服,厉害!"] = 1, + ["威武雄壮!宫大将军统兵有方!"] = 1, + ["我对大将军您的景仰有如滔滔江水连绵不绝,又有如黄河泛滥一发不可收拾!"] = 1, + }, + ["贾一陀"] = { + ["烤鸡和烧鹅都来点?"] = 1, + ["……厉害,告辞。"] = 1, + ["知道了,我这就去找。"] = 1, + ["佛爷你是否需要些吃的东西?"] = 1, + ["这是刚烤好的香喷喷烤鸡和烧鹅。"] = 1, + ["多谢。"] = 1, + ["哦……这位高僧好饭量……"] = 1, + }, + ["宫关"] = { + ["大总管,我是来献贡的,请看这幅美人图。"] = 1, + }, + ["孟家奶奶"] = { + ["多谢老前辈……"] = 1, + }, + ["仇赛赛"] = { + ["婀娜多姿"] = 1, + ["三寸金莲"] = 1, + ["倾国倾城……"] = 1, + ["这是我刚绘制的画像。"] = 1, + ["我愿意给你画像。"] = 1, + ["多谢,告辞……"] = 1, + ["杨柳细腰"] = 1, + ["不画雀斑"] = 1, + ["好的。"] = 1, + ["雪白"] = 1, + ["瓜子脸"] = 1, + }, + ["孟庄元"] = { + ["多谢。"] = 1, + ["能否给我一块“鼠”字腰牌?"] = 1, + ["阁下莫非是位高人……"] = 1, + ["……果然是高人!"] = 1, + }, + ["吃饭的水贼"] = { + ["香喷喷的饭来了!"] = 1, + ["这可是上等的美酒哟,大爷您喝好!"] = 1, + ["色香味俱全,大爷您吃好!"] = 1, + ["这是您要的水!"] = 1, + }, + ["裘大嘴"] = { + ["的确十分可气……"] = 1, + ["好的。"] = 1, + ["偷梁换柱成功了。"] = 1, + ["维护军威,自然愿意。"] = 1, + ["多谢,告辞……"] = 1, + }, + }, + ["天子峰"] = { + ["阿甘二型"] = { + ["我要交换白棋。"] = 1, + }, + }, + ["枫华谷·战乱"] = { + ["狼牙军奴隶"] = { + [" 别怕,马上就能逃离这里了。"] = 1, + }, + }, + ["会战唐门"] = { + ["影"] = { + ["上缴霹雳弹。"] = 1, + ["上缴麻醉散。"] = 1, + }, + }, + ["成都"] = { + ["阿妮"] = { + ["你在看什么?"] = 1, + }, + ["姬黄泉"] = { + ["你在看什么?"] = 1, + }, + ["阿景"] = { + ["你在看什么?"] = 1, + }, + ["瑶瑶"] = { + ["你在看什么?"] = 1, + }, + }, + ["洛阳·战乱"] = { + ["狼牙军官"] = { + ["您要的肉来了"] = 1, + ["您要的饭来了"] = 1, + ["您要的菜来了"] = 1, + ["您要的酒来了"] = 1, + ["您要的汤来了"] = 1, + }, + ["被捕的工匠"] = { + ["别怕,我是来救你出去的。"] = 1, + }, + ["狼牙军士"] = { + ["您要的汤来了"] = 1, + ["您要的肉来了"] = 1, + ["您要的菜来了"] = 1, + ["您要的酒来了"] = 1, + }, + }, + ["英雄法王窟"] = { + ["挖掘苦力"] = { + ["法王窟已被攻陷,你们可以回家了!"] = 1, + }, + }, + ["血战天策"] = { + ["齐元龙"] = { + ["领取迷香!"] = 1, + }, + }, + ["太原"] = { + ["受惊吓的小孩子"] = { + ["别哭,我给你表演个吃糖葫芦。看好了!"] = 1, + ["别哭,我给你表演个吹口哨。看好了!"] = 1, + ["别怕,现在安全了。"] = 1, + }, + ["受伤的村民"] = { + ["别担心,现在已经安全了。"] = 1, + }, + ["丐帮弟子"] = { + ["兄弟,你辛苦啦。来来来,吃碗面吧。"] = 1, + }, + ["昏迷的丐帮弟子"] = { + ["喂药"] = 1, + ["泼水"] = 1, + }, + }, + ["英雄一线天"] = { + ["郭氏护卫统领"] = { + ["将士伤势如何?"] = 1, + ["去路已经被封堵"] = 1, + ["情况如何!"] = 1, + ["我等势拦截住敌军,确保贵妃安全通过一线天"] = 1, + }, + }, + ["南屏山"] = { + ["被抓住的村民"] = { + ["你现在可能行动?"] = 1, + ["无须多礼,我还有要事在身,所以希望你们能在回村的路上顺道护送那些惊慌四散的女子回家。"] = 1, + }, + ["被迷惑的村民"] = { + ["给村民服下解药"] = 1, + }, + ["恶人谷受伤弟子"] = { + ["伤势如何"] = 1, + }, + }, + ["英雄南诏皇宫"] = { + ["阁逻凤"] = { + ["南诏反唐,其王必诛之!!"] = 1, + }, + }, + ["风雨稻香村"] = { + ["莫雨"] = { + ["你们已经足够强大,我倒是想看看你们如何面对叛军统领!"] = 1, + }, + }, + ["华清宫回忆录"] = { + ["王三金"] = { + ["获取梨园服饰"] = 1, + }, + }, + ["长安·战乱"] = { + ["被抓的百姓"] = { + ["你没事吧,快点离开这里。小心一点,不要再被狼牙兵抓住了。"] = 1, + }, + ["被俘的义军"] = { + ["今后的战斗不能缺少你们,请多加珍重。胜败乃兵家常事,不要太放在心上,暂且休息吧。"] = 1, + }, + ["内城太监"] = { + ["正是。"] = 1, + }, + }, + ["昆仑"] = { + ["长乐坊村民"] = { + ["谷里派我来收税金。"] = 1, + ["算你小子有孝心。"] = 1, + }, + }, + ["长安城"] = { + ["丘秋"] = { + ["这个故事倒是第一次听说。"] = 1, + ["姑娘怎么了?"] = 1, + ["这桃是假的?"] = 1, + ["秦始皇果然手段不凡。"] = 1, + ["姑娘请继续。"] = 1, + ["恭喜恭喜。"] = 1, + ["后来呢?"] = 1, + ["方宇轩?好熟悉的名字。"] = 1, + ["就让在下帮你找信吧。"] = 1, + ["桃谷六仙?似乎很熟悉啊......"] = 1, + ["这也太离奇了吧!"] = 1, + }, + ["狼牙铁勒兵"] = { + ["天佑吾皇,大燕永昌!"] = 1, + ["听他们声音,两个大的,一个老的。"] = 1, + ["小的愿以人头担保,那些乞丐正在密谋劫法场一事!"] = 1, + ["大人,旁边有几个乞丐在说劫法场的事!"] = 1, + }, + ["司马雁"] = { + ["天下兴亡匹夫有责,某愿一死以报国恩。"] = 1, + ["唯有以强权压服豪强,以严刑峻法震慑作乱之徒,方能使天下太平。"] = 1, + ["李唐皇室乃真命天子,这江山还是得由李家来做。"] = 1, + }, + ["囚犯"] = { + ["你自由了! "] = 1, + }, + ["禅房看守"] = { + ["小的一定小心谨慎。"] = 1, + ["小的正是。"] = 1, + }, + }, +} diff --git a/MY_Toolbox/data/interact/zhtw.jx3dat b/MY_Toolbox/data/interact/zhtw.jx3dat new file mode 100644 index 000000000..6818a1892 --- /dev/null +++ b/MY_Toolbox/data/interact/zhtw.jx3dat @@ -0,0 +1,364 @@ +return { + ["骞渻闋樺湴"] = { + ["骞渻閻佃"] = { + ["閫欐槸骞富閫佷締鐨勭磪鍖咃紝绁濇偍鏂版槬蹇▊锛"] = 1, + }, + }, + ["娉曠帇绐"] = { + ["鐛荤キ濂撮毟"] = { + ["娉曠帇绐熷凡琚敾闄凤紝浣犲戝彲浠ュ洖瀹朵簡锛"] = 1, + }, + }, + ["闀峰畨"] = { + ["寮靛瓙浠"] = { + ["閫欐槸鎮ㄨ鐨勪粰宕栫煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮挋闋傜煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勫敞鐪夌櫧鑺斤紒"] = 1, + ["閫欐槸鎮ㄨ鐨勯¨娓氱传绛嶏紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮タ灞辩櫧闇诧紒"] = 1, + }, + ["铇囨収钃"] = { + ["鎴戞兂鐬В鈥滅嚂涓樹箣璎庘濄"] = 1, + ["鏁㈠晱濂充繝锛屾垜濡備綍鎵嶈兘鎵撻枊榫嶉杸閲戣泲锛"] = 1, + ["鍙栨鑺卞彚鎳跺洖椤э紝鍗婄罚淇亾鍗婄罚鍚......"] = 1, + ["瀵剁墿绋鏈夛紝瑭﹀晱瑾颁笉娓存眰鍛紵"] = 1, + ["澶氳瑵濂充繝鎸囬粸锛屽湪鎰熸縺涓嶇洝锛屼笉鐭ユ湁浠楹煎湪涓嬪彲浠ョ浉鍔╃殑鍡?"] = 1, + ["閬嬬敤鍏у姏杓暘閬嬪姛闇囨搳鏂瑰彲锛"] = 1, + }, + ["瓒欒尪"] = { + ["鍎樼鐧煎晱"] = 1, + }, + ["鐧芥父楸"] = { + ["鐧借佸ぇ鎭掓伅鎬掞紝灏忕殑鍐嶅公鎮ㄥ幓鍟忓晱锛"] = 1, + ["濂借濂借锛岄粦鑰佸ぇ鎳夎┎鏈冪瓟鎳夌殑锛"] = 1, + ["灏忕殑骞綘鍘诲晱鍟忥紒"] = 1, + ["鐧借佸ぇ鐪熺殑鏄繁鏄庡ぇ缇╁晩锛佸皬鐨勯欏氨鍥炲幓鍛婅ù鑰侀梿濞樸"] = 1, + }, + ["闄充慨浠"] = { + ["閫欐槸鎮ㄨ鐨勪粰宕栫煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勫敞鐪夌櫧鑺斤紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮タ灞辩櫧闇诧紒"] = 1, + ["閫欐槸鎮ㄨ鐨勯¨娓氱传绛嶏紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮挋闋傜煶鑺憋紒"] = 1, + }, + ["瓒欓洸鐫"] = { + ["鎴戞簴鍌欏ソ璺熻工姊佺瑧鍫備簡锛"] = 1, + }, + ["鍙ゆ竻閭"] = { + ["閫欐槸鎮ㄨ鐨勪粰宕栫煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮タ灞辩櫧闇诧紒"] = 1, + ["閫欐槸鎮ㄨ鐨勫敞鐪夌櫧鑺斤紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮挋闋傜煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勯¨娓氱传绛嶏紒"] = 1, + }, + ["榛戦ò棰"] = { + ["閫......灏忕殑骞偍鎶婅┍甯跺洖鍘伙紒"] = 1, + ["閫......鍗佸叐閵瀛愪篃涓嶅皯浜嗭紝灏忕殑骞綘鍥炶鐧借佸ぇ鍘伙紒"] = 1, + ["閫......"] = 1, + ["澶氳瑵榛戣佸ぇ銆"] = 1, + }, + ["闊撳潳"] = { + ["閫欐槸鎮ㄨ鐨勪粰宕栫煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮挋闋傜煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勫敞鐪夌櫧鑺斤紒"] = 1, + ["閫欐槸鎮ㄨ鐨勯¨娓氱传绛嶏紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮タ灞辩櫧闇诧紒"] = 1, + }, + ["鏄撴緱閷"] = { + ["閫欐槸鎮ㄨ鐨勪粰宕栫煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勯¨娓氱传绛嶏紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮タ灞辩櫧闇诧紒"] = 1, + ["閫欐槸鎮ㄨ鐨勮挋闋傜煶鑺憋紒"] = 1, + ["閫欐槸鎮ㄨ鐨勫敞鐪夌櫧鑺斤紒"] = 1, + }, + }, + ["鎻氬窞"] = { + ["姊垫槦绂斧"] = { + ["澶氳瑵澶у斧鏁欒"] = 1, + }, + ["鐞崇惓"] = { + ["绻肩簩绛旈"] = 1, + [" 浠ヤ笂閮芥槸甯歌鐨勮鐩滄柟寮"] = 1, + [" 浠ヤ笂鏂瑰紡閮藉彲浠"] = 1, + [" 绔嬪埢鍑嶇祼甯宠櫉锛屼甫鎾ユ墦瀹㈡湇闆昏┍"] = 1, + ["鎴戣闁嬪绛旈"] = 1, + [" 楱欏瓙锛屼綘浠ョ偤閫欐槸绉佹湇鍛紒鍙抽嵉榛炰粬鍚嶅瓧锛岃垑鍫变粬"] = 1, + [" 浠ヤ笂鎻忚堪閮芥纰"] = 1, + [" 浠ヤ笂閮芥槸甯歌鐨勮⿶楱欐柟寮"] = 1, + }, + ["榫嶉杸閲戣泲"] = { + ["閬嬪姛鎿婅閲戣泲瀵剁"] = 1, + }, + }, + ["澶╁湴涓夋墠闄"] = { + ["绡勭当"] = { + ["濂斤紝鎴戠瓟鎳変綘銆"] = 1, + ["鎴戣┎濡備綍寮曚粬鍑轰締锛"] = 1, + }, + }, + ["鍞愰杸瀵嗗"] = { + ["钁夊嚒"] = { + ["鍓嶉潰濂藉儚鏈夊嬩汉褰憋紒"] = 1, + }, + }, + ["鑻遍泟琛鎴板ぉ绛"] = { + ["澶╃瓥鎺㈤浄鏁欏畼"] = { + ["纰哄畾."] = 1, + ["鏀舵垜鐐哄緬鍚э紝鎶婁箣鍓嶉偅鍊嬪紵瀛愰愬嚭甯杸."] = 1, + ["鏀舵垜鐐哄緬鍚!"] = 1, + }, + }, + ["棣惮椹"] = { + ["鎿氶粸绺界"] = { + ["鎴戣閫茶鎿氶粸璨挎槗"] = 1, + }, + ["涔炰笎"] = { + ["绲︿粬涓闅荤噿椁呫"] = 1, + }, + }, + ["鐬垮宄"] = { + ["灏忓あ瀛"] = { + ["濂藉晩锛岀郸浣犻欏嬪啺绯栬懌铇嗐"] = 1, + ["濂界殑锛屽啀瑕嬨"] = 1, + }, + ["鐧茬媯鑰侀牠鍏"] = { + ["璜嬪墠杓╁姪鎴戜竴鑷備箣鍔涳紒"] = 1, + ["鏅氳缉鏁戞偍鍑哄幓鍚р"] = 1, + ["鈥︹﹂偅鍓嶈缉鍙湁鏂规硶鑳藉姪鎴戞經鍏ュ埡鎺㈡秷鎭紵"] = 1, + ["閫欎綅鍓嶈缉鐐轰綍琚棞鎶煎湪姝ゅ湴锛"] = 1, + }, + ["瀹ぇ鑲"] = { + ["澶氳瑵銆"] = 1, + ["濂界殑锛屾垜閫欏氨鍘烩︹"] = 1, + }, + ["寮靛北鐭"] = { + ["鈥︹﹀師渚嗘槸璨畼鐐烘儭锛"] = 1, + ["鈥︹︽垜涔熸槸鍋剁劧寰楃煡銆"] = 1, + ["灏囪粛璜嬭銆"] = 1, + ["灏囪粛鏀惧績锛佹垜閫欏氨鍘汇"] = 1, + ["鈥︹﹁嚜鍙ゅ鏈夊叐闆d箣浜嬶紝灏囪粛娆插牨鎭╂儏鍙堟骞充笉鍏箣浜嬶紝澶亷闆g偤浜嗏︹"] = 1, + ["澶氳瑵銆"] = 1, + ["鈥︹﹁帿闈炴浜猴紝涔冩槸灏囪粛鎵娈猴紵"] = 1, + ["灏囪粛璜嬭瑳銆"] = 1, + ["鈥︹﹂欌︹"] = 1, + ["鈥︹︽灉鐒舵槸闆d互鎶夋搰鈥︹"] = 1, + ["鈥︹﹀悰瀛愬牨浠囷紝鍗佸勾涓嶆櫄锛"] = 1, + ["鍘熶締濡傛鈥︹"] = 1, + ["閫欎綅灏囪粛浣曟晠鍢嗘伅涓嶆锛"] = 1, + ["鈥︹﹂欎綅鈥滅京澹濋洠閬撴槸鈥︹"] = 1, + ["鈥︹﹀姝よ韩瀹讹紝浣曟晠钀借崏锛"] = 1, + }, + ["瀹▉"] = { + ["涓鑱茶櫉浠わ紝鐪句汉鎷滄湇锛屽幉瀹筹紒"] = 1, + ["濞佹闆勫/锛佸澶у皣杌嶇当鍏垫湁鏂癸紒"] = 1, + ["鎴戝皪澶у皣杌嶆偍鐨勬櫙浠版湁濡傛粩婊旀睙姘撮g犊涓嶇禃锛屽張鏈夊榛冩渤娉涙揩涓鐧间笉鍙敹鎷撅紒"] = 1, + }, + ["璩堜竴闄"] = { + ["鐑ら洖鍜岀噿榈濋兘渚嗛粸锛"] = 1, + ["鈥︹﹀幉瀹筹紝鍛婅经銆"] = 1, + ["鐭ラ亾浜嗭紝鎴戦欏氨鍘绘壘銆"] = 1, + ["浣涚埡浣犳槸鍚﹂渶瑕佷簺鍚冪殑鏉辫タ锛"] = 1, + ["閫欐槸鍓涚儰濂界殑棣欏櫞鍣寸儰闆炲拰鐕掗禎銆"] = 1, + ["澶氳瑵銆"] = 1, + ["鍝︹︹﹂欎綅楂樺儳濂介/閲忊︹"] = 1, + }, + ["瀹棞"] = { + ["澶х附绠★紝鎴戞槸渚嗙嵒璨㈢殑锛岃珛鐪嬮欏箙缇庝汉鍦栥"] = 1, + }, + ["瀛熷濂跺ザ"] = { + ["澶氳瑵鑰佸墠杓┾︹"] = 1, + }, + ["浠囪辰璩"] = { + ["濠濞滃濮"] = 1, + ["涓夊閲戣摦"] = 1, + ["鍌惧湅鍌惧煄鈥︹"] = 1, + ["閫欐槸鎴戝墰绻=鐨勭暙鍍忋"] = 1, + ["鎴戦鎰忕郸浣犵暙鍍忋"] = 1, + ["澶氳瑵锛屽憡杈︹"] = 1, + ["妤婃煶绱拌叞"] = 1, + ["涓嶇暙闆鏂"] = 1, + ["濂界殑銆"] = 1, + ["闆櫧"] = 1, + ["鐡滃瓙鑷"] = 1, + }, + ["瀛熻帄鍏"] = { + ["澶氳瑵銆"] = 1, + ["鑳藉惁绲︽垜涓濉娾滈紶鈥濆瓧鑵扮墝锛"] = 1, + ["闁d笅鑾潪鏄綅楂樹汉鈥︹"] = 1, + ["鈥︹︽灉鐒舵槸楂樹汉锛"] = 1, + }, + ["鍚冮/鐨勬按璩"] = { + ["棣欏櫞鍣寸殑椋締浜嗭紒"] = 1, + ["閫欏彲鏄笂绛夌殑缇庨厭鍠诧紝澶х埡鎮ㄥ枬濂斤紒"] = 1, + ["鑹查鍛充勘鍏紝澶х埡鎮ㄥ悆濂斤紒"] = 1, + ["閫欐槸鎮ㄨ鐨勬按锛"] = 1, + }, + ["瑁樺ぇ鍢"] = { + ["鐨勭⒑鍗佸垎鍙埃鈥︹"] = 1, + ["濂界殑銆"] = 1, + ["鍋锋鎻涙煴鎴愬姛浜嗐"] = 1, + ["缍杌嶅▉锛岃嚜鐒堕鎰忋"] = 1, + ["澶氳瑵锛屽憡杈︹"] = 1, + }, + }, + ["澶╁瓙宄"] = { + ["闃跨敇浜屽瀷"] = { + ["鎴戣浜ゆ彌鐧芥銆"] = 1, + }, + }, + ["妤撹彲璋仿锋埌浜"] = { + ["鐙肩墮杌嶅ゴ闅"] = { + [" 鍒ユ曪紝棣笂灏辫兘閫冮洟閫欒!浜嗐"] = 1, + }, + }, + ["鏈冩埌鍞愰杸"] = { + ["褰"] = { + ["涓婄钩闇归潅褰堛"] = 1, + ["涓婄钩楹婚唹鏁c"] = 1, + }, + }, + ["鎴愰兘"] = { + ["闃垮Ξ"] = { + ["浣犲湪鐪嬩粈楹硷紵"] = 1, + }, + ["濮粌娉"] = { + ["浣犲湪鐪嬩粈楹硷紵"] = 1, + }, + ["闃挎櫙"] = { + ["浣犲湪鐪嬩粈楹硷紵"] = 1, + }, + ["鐟ょ懁"] = { + ["浣犲湪鐪嬩粈楹硷紵"] = 1, + }, + }, + ["娲涢櫧路鎴颁簜"] = { + ["鐙肩墮杌嶅畼"] = { + ["鎮ㄨ鐨勮倝渚嗕簡"] = 1, + ["鎮ㄨ鐨勯/渚嗕簡"] = 1, + ["鎮ㄨ鐨勮彍渚嗕簡"] = 1, + ["鎮ㄨ鐨勯厭渚嗕簡"] = 1, + ["鎮ㄨ鐨勬汞渚嗕簡"] = 1, + }, + ["琚崟鐨勫伐鍖"] = { + ["鍒ユ曪紝鎴戞槸渚嗘晳浣犲嚭鍘荤殑銆"] = 1, + }, + ["鐙肩墮杌嶅+"] = { + ["鎮ㄨ鐨勬汞渚嗕簡"] = 1, + ["鎮ㄨ鐨勮倝渚嗕簡"] = 1, + ["鎮ㄨ鐨勮彍渚嗕簡"] = 1, + ["鎮ㄨ鐨勯厭渚嗕簡"] = 1, + }, + }, + ["鑻遍泟娉曠帇绐"] = { + ["鎸栨帢鑻﹀姏"] = { + ["娉曠帇绐熷凡琚敾闄凤紝浣犲戝彲浠ュ洖瀹朵簡锛"] = 1, + }, + }, + ["琛鎴板ぉ绛"] = { + ["榻婂厓榫"] = { + ["闋樺彇杩烽锛"] = 1, + }, + }, + ["澶師"] = { + ["鍙楅鍤囩殑灏忓瀛"] = { + ["鍒ュ摥锛屾垜绲︿綘琛ㄦ紨鍊嬪悆绯栬懌铇嗐傜湅濂戒簡锛"] = 1, + ["鍒ュ摥锛屾垜绲︿綘琛ㄦ紨鍊嬪惞鍙e摠銆傜湅濂戒簡锛"] = 1, + ["鍒ユ曪紝鐝惧湪瀹夊叏浜嗐"] = 1, + }, + ["鍙楀偡鐨勬潙姘"] = { + ["鍒ユ摂蹇冿紝鐝惧湪宸茬稉瀹夊叏浜嗐"] = 1, + }, + ["涓愬公寮熷瓙"] = { + ["鍏勫紵锛屼綘杈涜嫤鍟︺備締渚嗕締锛屽悆纰楅潰鍚с"] = 1, + }, + ["鏄忚糠鐨勪笎骞紵瀛"] = { + ["鍠傝棩"] = 1, + ["娼戞按"] = 1, + }, + }, + ["鑻遍泟涓绶氬ぉ"] = { + ["閮皬璀疯绲遍牁"] = { + ["灏囧+鍌峰嫝濡備綍锛"] = 1, + ["鍘昏矾宸茬稉琚皝鍫"] = 1, + ["鎯呮硜濡備綍锛"] = 1, + ["鎴戠瓑鍕㈡敂鎴綇鏁佃粛锛岀⒑淇濊泊濡冨畨鍏ㄩ氶亷涓绶氬ぉ"] = 1, + }, + }, + ["鍗楀睆灞"] = { + ["琚姄浣忕殑鏉戞皯"] = { + ["浣犵従鍦ㄥ彲鑳借鍕曪紵"] = 1, + ["鐒¢爤澶氱Ξ锛屾垜閭勬湁瑕佷簨鍦ㄨ韩锛屾墍浠ュ笇鏈涗綘鍊戣兘鍦ㄥ洖鏉戠殑璺笂闋嗛亾璀烽侀偅浜涢鎱屽洓鏁g殑濂冲瓙鍥炲銆"] = 1, + }, + ["琚糠鎯戠殑鏉戞皯"] = { + ["绲︽潙姘戞湇涓嬭В钘"] = 1, + }, + ["鎯′汉璋峰彈鍌峰紵瀛"] = { + ["鍌峰嫝濡備綍"] = 1, + }, + }, + ["鑻遍泟鍗楄⿺鐨囧"] = { + ["闁i倧槌"] = { + ["鍗楄⿺鍙嶅攼锛屽叾鐜嬪繀瑾呬箣锛侊紒"] = 1, + }, + }, + ["棰ㄩ洦绋婚鏉"] = { + ["鑾洦"] = { + ["浣犲戝凡缍撹冻澶犲挤澶э紝鎴戝掓槸鎯崇湅鐪嬩綘鍊戝浣曢潰灏嶅彌杌嶇当闋橈紒"] = 1, + }, + }, + ["鑿竻瀹洖鎲堕寗"] = { + ["鐜嬩笁閲"] = { + ["鐛插彇姊ㄥ湌鏈嶉>"] = 1, + }, + }, + ["闀峰畨路鎴颁簜"] = { + ["琚姄鐨勭櫨濮"] = { + ["浣犳矑浜嬪惂锛屽揩榛為洟闁嬮欒!銆傚皬蹇冧竴榛烇紝涓嶈鍐嶈鐙肩墮鍏垫姄浣忎簡銆"] = 1, + }, + ["琚繕鐨勭京杌"] = { + ["浠婂緦鐨勬埌楝ヤ笉鑳界己灏戜綘鍊戯紝璜嬪鍔犵弽閲嶃傚嫕鏁椾箖鍏靛甯镐簨锛屼笉瑕佸お鏀惧湪蹇冧笂锛屾毇涓斾紤鎭惂銆"] = 1, + }, + ["鍏у煄澶洠"] = { + ["姝f槸銆"] = 1, + }, + }, + ["鏄嗕緰"] = { + ["闀锋▊鍧婃潙姘"] = { + ["璋烽噷娲炬垜渚嗘敹绋呴噾銆"] = 1, + ["绠椾綘灏忓瓙鏈夊瓭蹇冦"] = 1, + }, + }, + ["闀峰畨鍩"] = { + ["涓樼"] = { + ["閫欏嬫晠浜嬪掓槸绗竴娆¤伣瑾"] = 1, + ["濮戝鎬庨杭浜嗭紵"] = 1, + ["閫欐鏄亣鐨勶紵"] = 1, + ["绉﹀鐨囨灉鐒舵墜娈典笉鍑°"] = 1, + ["濮戝璜嬬辜绾屻"] = 1, + ["鎭枩鎭枩銆"] = 1, + ["寰屼締鍛紵"] = 1, + ["鏂瑰畤杌掞紵濂界啛鎮夌殑鍚嶅瓧銆"] = 1, + ["灏辫畵鍦ㄤ笅骞綘鎵句俊鍚с"] = 1, + ["妗冭胺鍏粰锛熶技涔庡緢鐔熸倝鍟......"] = 1, + ["閫欎篃澶洟濂囦簡鍚э紒"] = 1, + }, + ["鐙肩墮閻靛嫆鍏"] = { + ["澶╀綉鍚剧殗锛屽ぇ鐕曟案鏄岋紒"] = 1, + ["鑱戒粬鍊戣伈闊筹紝鍏╁嬪ぇ鐨勶紝涓鍊嬭佺殑銆"] = 1, + ["灏忕殑椤樹互浜洪牠鎿斾繚锛岄偅浜涗篂涓愭鍦ㄥ瘑璎鍔硶鍫翠竴浜嬶紒"] = 1, + ["澶т汉锛屾梺閭婃湁骞惧嬩篂涓愬湪瑾姭娉曞牬鐨勪簨锛"] = 1, + }, + ["鍙搁Μ闆"] = { + ["澶╀笅鑸堜骸鍖瑰か鏈夎铂锛屾煇椤樹竴姝讳互鍫卞湅鎭┿"] = 1, + ["鍞湁浠ュ挤娆婂鏈嶈豹寮凤紝浠ュ毚鍒戝郴娉曢渿鎳句綔浜備箣寰掞紝鏂硅兘浣垮ぉ涓嬪お骞炽"] = 1, + ["鏉庡攼鐨囧涔冪湡鍛藉ぉ瀛,閫欐睙灞遍倓鏄緱鐢辨潕瀹朵締鍋氥"] = 1, + }, + ["鍥氱姱"] = { + ["浣犺嚜鐢变簡锛 "] = 1, + }, + ["绂埧鐪嬪畧"] = { + ["灏忕殑涓瀹氬皬蹇冭鎱庛"] = 1, + ["灏忕殑姝f槸銆"] = 1, + }, + }, +} diff --git a/MY_Toolbox/data/taoguan/zhcn.jx3dat b/MY_Toolbox/data/taoguan/zhcn.jx3dat new file mode 100644 index 000000000..d9f800770 --- /dev/null +++ b/MY_Toolbox/data/taoguan/zhcn.jx3dat @@ -0,0 +1,32 @@ +return { + FILTER_ITEM = { + { szName = "鞭炮", bFilter = true }, -- X.GetItemInfoName(5, 6072) + { szName = "火树银花", bFilter = true }, -- X.GetItemInfoName(5, 6069) + { szName = "龙凤呈祥", bFilter = true }, -- X.GetItemInfoName(5, 6068) + { szName = "彩云逐月", bFilter = true }, -- X.GetItemInfoName(5, 6067) + { szName = "熠熠生辉", bFilter = true }, -- X.GetItemInfoName(5, 6076) + { szName = "焰火棒", bFilter = true }, -- X.GetItemInfoName(5, 6073) + { szName = "窜天猴", bFilter = true }, -- X.GetItemInfoName(5, 6070) + { szName = "彩云逐月", bFilter = true }, -- X.GetItemInfoName(5, 6077) + { szName = "剪纸:龙腾", bFilter = true }, -- X.GetItemInfoName(5, 8025, 1168) + { szName = "剪纸:凤舞", bFilter = true }, -- X.GetItemInfoName(5, 8025, 1170) + { szName = "元宝灯", bFilter = true }, -- X.GetItemInfoName(5, 6066) + { szName = "桃花灯", bFilter = true }, -- X.GetItemInfoName(5, 6067) + { szName = "年年有鱼灯", bFilter = true }, -- X.GetItemInfoName(5, 6024) + { szName = "桃木牌·马", bFilter = false }, -- X.GetItemInfoName(5, 6048) + { szName = "桃木牌·年", bFilter = true }, -- X.GetItemInfoName(5, 6049) + { szName = "桃木牌·吉", bFilter = true }, -- X.GetItemInfoName(5, 6050) + { szName = "桃木牌·祥", bFilter = true }, -- X.GetItemInfoName(5, 6051) + { szName = "图样:彩云逐月", bFilter = true }, -- X.GetItemInfoName(5, 6200) + { szName = "图样:熠熠生辉", bFilter = true }, -- X.GetItemInfoName(5, 6203) + { szName = "监本印文兑换券", bFilter = false }, -- X.GetItemInfoName(5, 6258) + { szName = "战魂佩", bFilter = false }, -- X.GetItemInfoName(5, 31599) + { szName = "豪侠贡", bFilter = false }, -- X.GetItemInfoName(5, 30692) + { szName = "年兽陶罐", bFilter = false }, -- X.GetItemInfoName(5, 20959) + { szName = "幸运香囊", bFilter = false }, -- X.GetItemInfoName(5, 6027) + { szName = "幸运锦囊", bFilter = false }, -- X.GetItemInfoName(5, 6030) + { szName = "如意香囊", bFilter = false }, -- X.GetItemInfoName(5, 6028) + { szName = "如意锦囊", bFilter = false }, -- X.GetItemInfoName(5, 6031) + { szName = "锁住的月光宝盒", bFilter = false }, -- X.GetItemInfoName(5, 6043) + }, +} diff --git a/MY_Toolbox/data/taoguan/zhtw.jx3dat b/MY_Toolbox/data/taoguan/zhtw.jx3dat new file mode 100644 index 000000000..2b3ed34a9 --- /dev/null +++ b/MY_Toolbox/data/taoguan/zhtw.jx3dat @@ -0,0 +1,32 @@ +return { + FILTER_ITEM = { + { szName = "闉偖", bFilter = true }, -- X.GetItemInfoName(5, 6072) + { szName = "鐏ü閵鑺", bFilter = true }, -- X.GetItemInfoName(5, 6069) + { szName = "榫嶉吵鍛堢ゥ", bFilter = true }, -- X.GetItemInfoName(5, 6068) + { szName = "褰╅洸閫愭湀", bFilter = true }, -- X.GetItemInfoName(5, 6067) + { szName = "鐔犵啝鐢熻紳", bFilter = true }, -- X.GetItemInfoName(5, 6076) + { szName = "鐒扮伀妫", bFilter = true }, -- X.GetItemInfoName(5, 6073) + { szName = "绔勫ぉ鐚", bFilter = true }, -- X.GetItemInfoName(5, 6070) + { szName = "褰╅洸閫愭湀", bFilter = true }, -- X.GetItemInfoName(5, 6077) + { szName = "鍓礄锛氶緧楱", bFilter = true }, -- X.GetItemInfoName(5, 8025, 1168) + { szName = "鍓礄锛氶吵鑸", bFilter = true }, -- X.GetItemInfoName(5, 8025, 1170) + { szName = "鍏冨鐕", bFilter = true }, -- X.GetItemInfoName(5, 6066) + { szName = "妗冭姳鐕", bFilter = true }, -- X.GetItemInfoName(5, 6067) + { szName = "骞村勾鏈夐瓪鐕", bFilter = true }, -- X.GetItemInfoName(5, 6024) + { szName = "妗冩湪鐗屄烽Μ", bFilter = false }, -- X.GetItemInfoName(5, 6048) + { szName = "妗冩湪鐗屄峰勾", bFilter = true }, -- X.GetItemInfoName(5, 6049) + { szName = "妗冩湪鐗屄峰悏", bFilter = true }, -- X.GetItemInfoName(5, 6050) + { szName = "妗冩湪鐗屄风ゥ", bFilter = true }, -- X.GetItemInfoName(5, 6051) + { szName = "鍦栨ǎ锛氬僵闆查愭湀", bFilter = true }, -- X.GetItemInfoName(5, 6200) + { szName = "鍦栨ǎ锛氱啝鐔犵敓杓", bFilter = true }, -- X.GetItemInfoName(5, 6203) + { szName = "鐩f湰鍗版枃鍏屾彌鍒", bFilter = false }, -- X.GetItemInfoName(5, 6258) + { szName = "鎴伴瓊浣", bFilter = false }, -- X.GetItemInfoName(5, 31599) + { szName = "璞繝璨", bFilter = false }, -- X.GetItemInfoName(5, 30692) + { szName = "骞寸嵏闄剁綈", bFilter = false }, -- X.GetItemInfoName(5, 20959) + { szName = "骞搁亱棣欏泭", bFilter = false }, -- X.GetItemInfoName(5, 6027) + { szName = "骞搁亱閷﹀泭", bFilter = false }, -- X.GetItemInfoName(5, 6030) + { szName = "濡傛剰棣欏泭", bFilter = false }, -- X.GetItemInfoName(5, 6028) + { szName = "濡傛剰閷﹀泭", bFilter = false }, -- X.GetItemInfoName(5, 6031) + { szName = "閹栦綇鐨勬湀鍏夊鐩", bFilter = false }, -- X.GetItemInfoName(5, 6043) + }, +} diff --git a/MY_Toolbox/img/MY_VisualSkill.Tga b/MY_Toolbox/img/MY_VisualSkill.Tga new file mode 100644 index 000000000..567d9cbf6 Binary files /dev/null and b/MY_Toolbox/img/MY_VisualSkill.Tga differ diff --git a/MY_Toolbox/img/MY_VisualSkill.UITex b/MY_Toolbox/img/MY_VisualSkill.UITex new file mode 100644 index 000000000..c4fda49e2 Binary files /dev/null and b/MY_Toolbox/img/MY_VisualSkill.UITex differ diff --git a/MY_Toolbox/img/MY_VisualSkill.txt b/MY_Toolbox/img/MY_VisualSkill.txt new file mode 100644 index 000000000..dfc40d3d3 --- /dev/null +++ b/MY_Toolbox/img/MY_VisualSkill.txt @@ -0,0 +1,4 @@ +Farme Left Top Width High File +0 96 0 15 52 C:\Users\root\Desktop\中.tga +1 113 0 75 52 C:\Users\root\Desktop\右.tga +2 0 0 94 52 C:\Users\root\Desktop\左.tga diff --git a/MY_Toolbox/info.ini b/MY_Toolbox/info.ini new file mode 100644 index 000000000..ff921bb2f --- /dev/null +++ b/MY_Toolbox/info.ini @@ -0,0 +1,44 @@ +[MY_Toolbox] +name=常用工具 +desc=各种易用的游戏辅助小功能集合 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_AchievementWiki.lua +lua_1=src/MY_PetWiki.lua +lua_2=src/MY_ItemWiki.lua +lua_3=src/MY_QuestWiki.lua +lua_4=src/MY_RideWiki.lua +lua_5=src/MY_ItemPrice.lua +lua_6=src/MY_PlayerRemark.lua +lua_7=src/MY_ArenaHelper.lua +lua_8=src/MY_AutoDialogue.lua +lua_9=src/MY_BigWarChecker.lua +lua_10=src/MY_DialogNameLink.lua +lua_11=src/MY_ExamTip.lua +lua_12=src/MY_FooterTip.lua +lua_13=src/MY_GongzhanCheck.lua +lua_14=src/MY_HideAnnounceBg.lua +lua_15=src/MY_InfoTip.lua +lua_16=src/MY_ItemInfoSearch.lua +lua_17=src/MY_JiugongHelper.lua +lua_18=src/MY_Memo.lua +lua_19=src/MY_MibaoHelper.lua +lua_20=src/MY_PlayerViewMagnifier.lua +lua_21=src/MY_ShenxingHelper.lua +lua_22=src/MY_VisualSkill.lua +lua_23=src/MY_Taoguan.lua +lua_24=src/MY_LockFrame.lua +lua_25=src/MY_AutoSell.lua +lua_26=src/MY_DynamicItem.lua +lua_27=src/MY_AutoMemorizeBook.lua +lua_28=src/MY_FriendTipLocation.lua +lua_29=src/MY_DynamicActionBarPos.lua +lua_30=src/MY_Domesticate.lua +lua_31=src/MY_YunMacro.lua +lua_32=src/MY_AutoDiamond.lua +lua_33=src/PS.lua +lua_34=src/MY_Love.lua +lua_35=src/MY_Love.PS.lua +lua_36=src/MY_Love.PV.lua +package=MY diff --git a/MY_Toolbox/info.ini.zh_TW b/MY_Toolbox/info.ini.zh_TW new file mode 100644 index 000000000..b0b15d68e --- /dev/null +++ b/MY_Toolbox/info.ini.zh_TW @@ -0,0 +1,44 @@ +[MY_Toolbox] +name=甯哥敤宸ュ叿 +desc=鍚勭ó鏄撶敤鐨勬父鎴茶紨鍔╁皬鍔熻兘闆嗗悎 +default=1 +version=1.0 +dependence=MY_!Base +lua_0=src/MY_AchievementWiki.lua +lua_1=src/MY_PetWiki.lua +lua_2=src/MY_ItemWiki.lua +lua_3=src/MY_QuestWiki.lua +lua_4=src/MY_RideWiki.lua +lua_5=src/MY_ItemPrice.lua +lua_6=src/MY_PlayerRemark.lua +lua_7=src/MY_ArenaHelper.lua +lua_8=src/MY_AutoDialogue.lua +lua_9=src/MY_BigWarChecker.lua +lua_10=src/MY_DialogNameLink.lua +lua_11=src/MY_ExamTip.lua +lua_12=src/MY_FooterTip.lua +lua_13=src/MY_GongzhanCheck.lua +lua_14=src/MY_HideAnnounceBg.lua +lua_15=src/MY_InfoTip.lua +lua_16=src/MY_ItemInfoSearch.lua +lua_17=src/MY_JiugongHelper.lua +lua_18=src/MY_Memo.lua +lua_19=src/MY_MibaoHelper.lua +lua_20=src/MY_PlayerViewMagnifier.lua +lua_21=src/MY_ShenxingHelper.lua +lua_22=src/MY_VisualSkill.lua +lua_23=src/MY_Taoguan.lua +lua_24=src/MY_LockFrame.lua +lua_25=src/MY_AutoSell.lua +lua_26=src/MY_DynamicItem.lua +lua_27=src/MY_AutoMemorizeBook.lua +lua_28=src/MY_FriendTipLocation.lua +lua_29=src/MY_DynamicActionBarPos.lua +lua_30=src/MY_Domesticate.lua +lua_31=src/MY_YunMacro.lua +lua_32=src/MY_AutoDiamond.lua +lua_33=src/PS.lua +lua_34=src/MY_Love.lua +lua_35=src/MY_Love.PS.lua +lua_36=src/MY_Love.PV.lua +package=MY diff --git a/MY_Toolbox/lang/zhcn.jx3dat b/MY_Toolbox/lang/zhcn.jx3dat new file mode 100644 index 000000000..be389a5fd --- /dev/null +++ b/MY_Toolbox/lang/zhcn.jx3dat @@ -0,0 +1,518 @@ +return { + -- MY_Toolbox.lua + ['MY_Toolbox'] = '常用工具', + ['MY_InfoTip'] = '信息显示', + + -- MY_FooterTip + ['MY_FooterTip'] = '帮会好友高亮', + ['Friend headtop tips'] = '附近好友高亮', + ['Friend headtop tips nav'] = '显示场景追踪点', + ['Friend headtop hide in dungeon'] = '秘境中隐藏', + ['Tong member headtop tips'] = '附近帮众高亮', + ['Tong member headtop tips nav'] = '显示场景追踪点', + ['Tong member headtop hide in dungeon'] = '秘境中隐藏', + + ['Check nearby gongzhan'] = '检测附近共战', + ['Detected [%s] has Gongzhan BUFF for %d second(s).'] = '检测到[%s]共战气劲剩余%d秒。', + + ['Infomation tips'] = '信息条(SHIFT+U移动位置)', + + ['Ping monitor' ] = '网络延迟', + ['GPS' ] = '当前位置', + ['FPS monitor' ] = '游戏帧数', + ['Target distance'] = '目标距离', + ['System time' ] = '系统时间', + ['Time machine' ] = '游戏速率', + ['Speedometer' ] = '角色速度', + ['Fight clock' ] = '战斗计时', + ['Lotus clock' ] = '藕和桂花', + ['Placeholder' ] = '空值文案', + ['Background' ] = '背景' , + ['Title' ] = '标题' , + ['Font' ] = '字体' , + ['Font Color' ] = '字体颜色', + + ['Ping: ' ] = '网络延迟:', + ['Location: ' ] = '当前位置:', + ['FPS: ' ] = 'FPS:', + ['Rate: ' ] = '服务器倍率:', + ['%d' ] = '%d', + ['No Target' ] = '没有目标', + ['Distance: ' ] = '目标距离:', + ['Speed: ' ] = '速度:', + ['%.2f f/s' ] = '%.2f 尺/秒', + ['%.1f Foot' ] = '%.1f尺', + ['Time: ' ] = '系统时间:', + ['%02d:%02d:%02d'] = '%02d:%02d:%02d', + ['Never Fight' ] = '打一架再说', + ['Fight Clock: ' ] = '战斗计时:', + ['%d:%02d:%02d' ] = '%d:%02d:%02d', + ['Lotus Clock: ' ] = '藕和桂花:', + ['%d:%d:%d' ] = '%d:%d:%d', + + ['GongZhan'] = '共战', + ['Scanning gongzhan: %d/%d'] = '正在扫描共战:%d/%d', + ['Detected [%s] has GongZhan buff for %s.'] = '检测到[%s]共战江湖气劲剩余%s。', + ['Nearby GongZhan Total Count: %d.'] = '附近共战数量:%d。', + ['------------------------------------'] = '————————————————————————', + ['send to ...'] = '发送到...', + + -- MY_VisualSkill + ['MY_VisualSkill'] = '历史招式', + ['Visual skill'] = '显示历史招式列表', + ['Penetrable UI'] = '界面穿透', + ['Display skills count'] = '显示格子数量', + ['Display %d skills.'] = '显示%d格。', + ['Ignore skill list'] = '配置隐藏招式', + ['Add'] = '添加', + ['Please input skill id'] = '请输入招式ID', + ['Invalid skill id'] = '不合法的招式ID', + + -- MY_ShenxingHelper + ['MY_ShenxingHelper'] = '神行保护', + ['Avoid blacking shenxing cd'] = '防止开阵导致神行千里失败', + ['Got zhenyan wen shenxing, your shengxing will be blacked.'] = '在神行千里运功过程中获得阵眼,神行会进入调息状态但角色仍然会停留在原地。', + ['Shenxing has been cancelled, cause you got the zhenyan.'] = '您获取到阵眼,为防止神行千里CD被黑,运功已自动打断。', + ['Shenxing to ancient maps'] = '盛唐故地神行千里', + ['Force open all map shenxing'] = '未知地图神行千里', + ['Shenxing can fly to undiscovered maps'] = '允许神行千里前往尚未探索过的地图、秘境', + + -- MY_JiugongHelper + ['MY_JiugongHelper'] = '其它', + ['The jiugong full sequence is: %s, blank is: %s.'] = '九宫图:%s,空缺:%s。', + ['Failed to calc.'] = '九宫图计算失败。', + + ['Memo (Role)'] = '随身便笺 (角色)', + ['Memo (Global)'] = '随身便笺 (公共)', + ['MY Memo (Role)'] = '茗伊随身便笺 (角色)', + ['MY Memo (Global)'] = '茗伊随身便笺 (公共)', + ['Font'] = '字体', + ['Player remark'] = '角色备注', + ['Create'] = '添加', + ['View player remark'] = '管理本本', + ['Edit player remark'] = '加入茗伊角色备注', + ['MY_PlayerRemark Edit'] = '编辑角色备注', + ['MY_Farbnamen not detected! Please check addon load!'] = '未能识别到依赖项[门派染色]子插件,请到插件加载界面检查插件安装状态!', + ['Server:'] = '服务器:', + ['Name:'] = '名称:', + ['Not found in local store'] = '本地角色数据库中未找到', + ['Remark:'] = '内容:', + ['Alert when group'] = 'TA进组时对话框警告我。', + ['Tip when group'] = 'TA进组时聊天栏提示我。', + ['sure'] = '确定', + ['cancel'] = '取消', + ['Tip: [%s] is in your team.\nRemark: %s'] = '提示:[%s]进入你所在的队伍。\n备注:%s', + ['Tip: [%s](Leader) is in your team.\nRemark: %s'] = '提示:[%s](团长)进入你所在的队伍。\n备注:%s', + ['Tip: [%s] is in your room.\nRemark: %s'] = '提示:[%s]进入你所在的房间。\n备注:%s', + ['Import'] = '导入', + ['Please input import data:'] = '请输入导入的数据:', + ['Server not match!'] = '服务器不匹配!', + ['Prefer old data or new data?'] = '冲突时使用原数据还是导入的新数据?', + ['Old data'] = '新数据', + ['New data'] = '原数据', + ['Decode data failed!'] = '解码数据失败!', + ['Export'] = '导出', + + ['Type to search, use comma to split.'] = '输入文字进行搜索,半角逗号分隔多个搜索项。\n如:皇竹草,甜象草', + + ['Exam tip'] = '科举助手', + ['Querying, please wait...'] = '查询中,请稍后……', + ['Local exam data matched.'] = '匹配到本地题库。', + ['No result found.'] = '没有搜索到匹配的结果。', + ['No result found, here\'s from open search engine:'] = '没有搜索到匹配的结果,以下数据来自开放搜索引擎:', + ['No result matched, here\'s similar answers:'] = '没有搜索到匹配的结果,以下为类似题目:', + ['Question: %s\nAnswer: %s'] = '问:%s\n答:%s', + ['Loading failed.'] = '加载失败。', + ['%s record(s) commited, %s record(s) accepted!'] = '已为您自动提交了%s条题库数据,其中%s条已被系统通过采纳!', + ['Congratulations you finished the exam, please visit Yangzhou next monday for result.'] = '恭喜你完成了会试,请于下周一前往扬州城帮会区前方的皇榜查阅成绩。', + + -- MY_AutoDialogue + ['MY_AutoDialogue'] = '其它', + ['Autochat' ] = '自动对话', + ['Common' ] = '通用', + ['Auto interact disabled due to SHIFT key pressed.'] = '你按住了Shift键,自动对话被禁用。', + ['Conversation with [%s]: %s' ] = '对话[%s]:%s', + ['Conversation with [%s] auto chose: %s' ] = '对话[%s]自动选择了:%s', + ['Echo when autochat' ] = '输出选择的选项', + ['Auto chat when only one selection' ] = '只有一个选项时自动选择', + ['Auto chat when only one space selection' ] = '只有一个空白选项时自动选择', + ['Disable when shift key pressed' ] = '按住SHIFT时禁用自动对话', + ['Close after auto chat' ] = '自动对话后关闭窗口', + ['Skip quest talk' ] = '精简接受任务剧情对话', + ['Left click to config autochat.\nRight click to edit global config.'] = '左键点击配置该对话框的自动对话\n右键点击配置全局自动对话设定', + + ['NAME_PATTERN_LIST'] = { + '它的主人是(.-)。', + }, + + -- MY_MibaoHelper + ['MY_MibaoHelper'] = '密保提示', + ['You have been loged in for 2min, you can unlock bag locker now.'] = '你已登入游戏两分钟,可以愉快的解除仓库锁啦!', + LOCK_TIP = {}, + + -- MY_BigWarChecker + ['MY_BigWarChecker'] = '大战提醒', + ['Warning: Bigwar has been finished but not handed yet!'] = '茗伊提示:大战还没交!', + ['This map is big war map and you did not accepted the quest, is that correct?'] = '提示:检测到角色没有接受当前地图秘境大战系列任务!', + + -- MY_ArenaHelper + ['MY_ArenaHelper'] = '名剑大会助手', + ['Auto restore team info in arena'] = '名剑大会中自动恢复上次组队信息', + ['Auto cancel hide player in arena'] = '名剑大会中自动取消屏蔽角色模型', + ['Auto cancel hide player in battlefield'] = '战场中自动取消屏蔽角色模型', + ['Auto cancel hide player in pubg'] = '绝境战场中自动取消屏蔽角色模型', + + ['Loop target between me and target'] = '循环选择自己和目标', + ['%%.1f/%d meter(s)'] = '%%.1f/%d 尺', + + ['Click to enable MY player view magnifier'] = '点击开启茗伊试衣间', + ['Click to disable MY player view magnifier'] = '点击关闭茗伊试衣间', + + ['Click for achievement wiki'] = '点击查看成就百科', + + ['MY_ItemInfoSearch'] = '物品搜索', + ['Please input item name or item index number'] = '请输入物品名称或物品ID', + ['Max display count %d, current %d.'] = '最大显示%d条,当前结果%d条。', + ['MY_ItemInfoSearch TIPS'] = { + '说明:', + '  1、在上方输入框输入您想要查询的物品名称,即可进行游戏内物品查询。', + '  2、该功能调用官方接口查询物品表,不涉及任何网络通信与数据存储。', + '  3、物品表每次更新都可能被修改,查询结果只代表查询时刻的即时状态。', + }, + + -- MY_HideAnnounceBg + ['MY_HideAnnounceBg'] = '其它', + ['Hide announce bg'] = '隐藏官方公告区背景', + + -- MY_Taoguan + ['MY_Taoguan'] = '年兽陶罐', + ['Auto taoguan: missing [%s]!'] = '陶罐助手:缺少[%s]!', + ['Auto taoguan: on.'] = '陶罐助手:开。', + ['Auto taoguan: off.'] = '陶罐助手:关。', + ['Current total score:(%d+)'] = '目前的总积分为:(%d+)', + ['Auto taoguan: reach limit!'] = '陶罐助手:已达设置上限!', + ['Auto taoguan: score clear!'] = '陶罐助手:积分换光清零!', + ['Auto taoguan: filter item [%s].'] = '陶罐助手:过滤 [%s]。', + ['Feature setting'] = '功能设置', + ['Stop simple broken can when score reaches'] = '停止砸罐子,当总分数达到', + ['Put can if needed?'] = '必要时自动放罐子?', + ['When no %s use %s?'] = '缺%s时使用%s?', + ['Use %s when score reaches'] = '使用%s,当分数达到', + ['Stop break when no item'] = '若缺停砸', + ['Pickup filters'] = '拾取过滤设置', + ['(Checked will not be picked up, if still pick please check system auto pick config)'] = '(打勾的不捡,若还捡请关系统以及其他插件自动拾取)', + ['Custom add'] = '添加自定义', + ['Please input custom name'] = '请输入自定义名称', + ['Start/stop break can'] = '开始/停止砸罐', + ['Restore default config'] = '恢复默认设置', + + -- MY_Love.lua -- + ['MY_Love'] = '剑侠情缘', + ['Singleton'] = '独闯江湖', + ['Hi, I seem to meet you somewhere ago'] = '嗨,我好像在哪儿见过你 #欣喜', + ['Some people fancy you.'] = '织纤云以为誓,填银河以为约,托飞星以传情,搭鹊桥以相聚。若是汝心正如我心,比翼双飞笑傲江湖!', + ['Other side terminate love you.'] = '我本将心向明月,奈何明月照沟渠,对方不再继续单恋你了。', + ['Some people fall in love with you.'] = '愿将良辰华年轻抛,谈笑拱手河山,淡看生死轮转,执手同观远山,江水流长,天涯海角时时相思相伴,与汝携手江湖!', + ['Other side gave up love you.'] = '还君明珠泪双垂,恨不相逢未嫁时,对方不再继续单恋你了。', + ['Blind love'] = '单恋', + ['Mutual love'] = '相恋', + ['sec'] = '秒', + ['%d min %d sec'] = '%d分钟%d秒', + ['%d hour %d min'] = '%d小时%d分钟', + ['%d day %d hour'] = '%d天%d小时', + ['%d year %d day'] = '%d年%d天', + ['Set lover is a sensitive action, please unlock to continue.'] = '解除安全锁后,方可设置情缘信息。', + ['Remove lover is a sensitive action, please unlock to continue.'] = '解除安全锁后,方可挥刀斩情丝。', + ['Fix lover is a sensitive action, please unlock to continue.'] = '解除安全锁后,方可修复情缘关系。', + ['From now on, my heart lover is [%s]'] = '#玫瑰 以碧落为念、黄泉为凭,愿与[%s]连理共枝、比翼齐飞,携手踏塞外江南、游万里河山,观日升月落,赏飞雪飘花!', + ['Sorry, I decided to just a swordman, bye my plugin lover'] = '皑如山上雪,皎若云间月。一别两宽,勿复相思。 #心碎', + ['A blade and cut, no longer meet with [%s].'] = '#心碎 [%s],从今以往,勿复相思,相思与君绝!', + ['Please enable sync common ui config first'] = '请先启用游戏界面同步设置,方可使用该功能。\n\n方法:前往【ESC-游戏设置-综合】确保【服务器同步设置】中的【界面常规设置】复选框处于勾选状态。', + ['Lover must online'] = '情缘必须在线', + ['Lover must be a online friend'] = '情缘必须是在线好友', + ['Inadequate conditions, requiring Lv2 friend'] = '单恋条件不足,要求二重好感', + ['Inadequate conditions, requiring Lv6 friend/party/4-feet distance'] = '相恋条件不足,要求六重好感/组队距离4尺内', + ['Inadequate conditions, requiring Lv6 friend/party/4-feet distance/%s'] = '相恋条件不足,要求六重好感/组队距离4尺内/揣1个%s', + ['Peer and you are at same server but current crossing sever, please set lover after exit crossing server.'] = '对方与您来自同一服务器,请退出跨服后再组队发起情缘请求。', + ['Love request has been sent to [%s], wait please'] = '已请求与 [%s] 结为相恋情缘,请等候回应', + ['Love can not run a red-light, wait for %s left.'] = '情缘不能闯红灯,再等待%s后再试。', + ['Are you sure to cut blind love with [%s]?'] = '你确定不再单恋 [%s] 了么?', + ['Congratulations, cut blind love finish.'] = '还君明珠泪双垂,恨不相逢未嫁时。', + ['Are you sure to cut mutual love with [%s]?'] = '你确定要斩断与 [%s] 的情缘么?', + ['Past five hundred times looking back only in exchange for a chance encounter this life, you really decided?'] = '前世五百次回眸才换来今生一次偶遇,你真的决定了?', + ['You do not really want to cut off love it, really sure?'] = '人生若只如初见,何事秋风悲画扇,真的确定吗?', + ['Congratulations, do not repeat the same mistakes ah.'] = '解怨释结,更莫相憎。一别两宽,各生欢喜。', + ['Repair feature only supports mutual love!'] = '修复功能只支持相恋情缘关系!', + ['Both sides must in a team to be repaired!'] = '双方必须组队在一起才能进行修复!', + ['Repair request has been sent, wait please.'] = '修复请求已发送给对方,请稍候。', + + ['Backup lover is a sensitive action, please unlock to continue.'] = '请先解锁后,方可备份情缘证。', + ['Backup lover succeed, file located at: %s.'] = '情缘证数据备份完成,数据文件位于:%s。', + ['Lover must in your team and online to do backup.'] = '必须与情缘组队并保持双方在线,方可进行备份操作。', + ['Backup request has been sent, wait please.'] = '情缘证备份请求已发送,请等待对方同意。', + ['Backup feature only supports mutual love!'] = '情缘证备份功能只支持相恋情缘关系!', + + ['[%s] want to backup lover relation with you, do you agree?'] = '[%s] 想要生成情缘证数据备份文件,是否允许?', + ['Peer is not your lover, please check, or do fix lover first.'] = '对方不是你的情缘,请确认对方情缘插件界面显示内容,如果对方显示为无情缘,您可以先尝试点击修复情缘按钮。', + ['[%s] want to restore lover relation with you, do you agree?'] = '[%s] 想要从情缘证数据备份文件恢复与你的情缘关系,是否允许?', + ['Restore lover is a sensitive action, please unlock to continue.'] = '请先解锁后,方可恢复情缘证。', + ['Restore lover succeed!'] = '恢复情缘证成功!', + ['Peer is not your lover in this backup, please check.'] = '对方不是你所选的情缘证的另一方,请检查角色名称与情缘证文件选项。', + + ['Error: file is not a valid lover backup!'] = '错误:所选的文件不是有效的情缘证备份!', + ['Send restore lover request to [%s]?'] = '立即发送情缘证恢复请求给 [%s] ?', + ['This file is not your lover backup, please check!'] = '所选文件不是您当前角色生成的情缘证,请检查情缘证文件选项!', + + ['[Restore]'] = '[恢复]', + ['Please input your lover\'s current name:'] = '请输入您选择的情缘证对方的当前角色名:', + ['Please select lover backup data file:'] = '请选择想要恢复的情缘证备份文件:', + + ['Do you want to mutual love with [%s]?'] = '确定要与 [%s] 情缘吗?', + ['Do you want to blind love with [%s]?'] = '确定要单恋 [%s] 吗?', + [''] = '<无合适人选>', + ['%s\'s lover'] = '%s的情缘', + ['...Loading...'] = '…载入中…', + ['...Unknown...'] = '…未知…', + ['%s\'s Love signature:'] = '%s的情缘宣言:', + ['If it is always loading, the target may not install plugin or turn on quiet mode, strongly recommend to query after team up.'] = '如果一直显示载入中,可能是对方没有安装插件或开启免打扰,强烈推荐组队后查询。', + ['This guy is very lazy, nothing left!'] = '这个家伙很懒,什么也没留下!', + ['Strike up her'] = '勾搭她', + ['Strike up him'] = '勾搭他', + ['[%s] is in fighting, no time for you.'] = '[%s] 正在战斗中,无暇搭理你。', + ['[%s] is not in your party, do you want to send a request for accessing data?'] = '[%s] 不在你的队伍中,是否向对方请求查看情缘信息?', + ['No peer lover data yet, you must request first.'] = '暂无对方情缘数据,请先请求获取对方情缘信息。', + ['Request lover data'] = '请求数据', + ['Warm tip: Your {$type} lover [{$name}] is happy in [{$map}].'] = '温馨提醒:你的{$type}情缘[{$name}]正在{$map}玩耍呢。', + ['Lover'] = '情缘', + ['Love signature:'] = '情缘宣言:', + [''] = '<不告诉你>', + ['[%s] want to see your lover info, OK?'] = '[%s] 好奇想看您的情缘信息,给个机会?', + ['[Mystery] quietly said:'] = '[神秘人]悄悄地说:', + ['[%s] want to mutual love with you, OK?'] = '[%s] 请求与您结为相恋情缘,您的意思呢?', + ['[%s] want to repair love relation with you, OK?'] = '[%s] 请求修复与您的情缘关系,是否立即修复?', + ['[%s] is already your lover, fix it now?'] = '[%s] 已经是你的相恋情缘啦,是否立即修复关系?', + ['Congratulations, love relation with [%s] has been fixed!'] = '恭喜,成功修复与 [%s] 的情缘关系!', + ['Unfortunately the other has lover, but you can still blind love him!'] = '很遗憾对方已有情缘,但你仍可以选择单恋对方!', + ['The other is already your lover!'] = '对方已经是您的相恋情缘啦!', + ['The other refused you without reason, but you can still blind love him!'] = '不知为何对方拒绝了你,但你仍可以选择单恋对方!', + ['Congratulations, success to attach love with [%s]!'] = '恭喜您,与 [%s] 结缘成功!', + ['[%s] disabled ui config sync, unable to read data.'] = '[%s] 禁用了界面常规设置同步,无法读取数据!', + ['Failed to attach love, light firework failed.'] = '烟花未能成功燃放,结缘失败。', + ['Warm tip: Your {$type} lover [{$name}] online, hurry doing needy doing.'] = '温馨提醒:你的{$type}情缘[{$name}]上线啦,该干嘛赶紧干嘛。', + ['Love tip: %s is online now'] = '情缘提示:%s上线了', + ['Warm tip: Your {$type} lover [{$name}] offline, hurry doing like doing.'] = '温馨提醒:你的{$type}情缘[{$name}]下线咧,想干嘛赶紧干嘛。', + ['Heart lover'] = '心动情缘', + ['No lover :-('] = '还木有情缘呢 :-(', + ['Mutual love friend Lv.6: '] = '相恋六重队友:', + ['- Select plz -'] = '- 请选择 -', + ['CROSS_SERVER_LOVER_TITLE'] = '跨服恋', + ['Select a firework'] = '选择燃放烟花', + ['(4-feets, with specific fireworks)'] = '(4尺内,背包内有所需烟花)', + ['Blind love friend Lv.2: '] = '单恋二重好友:', + ['(Online required, notify anonymous)'] = '(要在线,匿名通知对方)', + ['[Light firework]'] = '[燃放烟花]', + ['Light firework is a sensitive action, please unlock to continue.'] = '解除安全锁后,方可燃放烟花。', + ['Failed to light firework.'] = '燃放烟花失败!', + ['[Break love]'] = '[挥刀斩情丝]', + ['[Recovery]'] = '[修复]', + ['[Backup]'] = '[备份]', + ['Auto focus lover'] = '自动焦点情缘', + ['Non-love display'] = '无情缘显示字', + ['Non-love display: '] = '无情缘显示字:', + ['Enable quiet mode'] = '开启免打扰', + ['Quick to accost text'] = '快捷勾搭用语', + ['Quick to accost text: '] = '快捷勾搭用语:', + ['Love signature'] = '情缘个性宣言', + ['Love signature: '] = '情缘个性宣言:', + ['Enable player view panel hook'] = '在查看他人装备界面显示情缘选项卡', + ['Other view my lover without ask'] = '允许无需确认随意查看我的情缘信息', + ['Tips'] = '小提示', + ['1. You can break love one-sided.'] = '1. 情缘可以单方面删除,相恋情缘会通过密聊告知对方。', + ['2. Data was stored in official data segment.'] = '2. 情缘数据保存在官方提供的界面设置数据存储位上,任何第三方都无法知晓您的数据。', + ['3. Please do not enable config async, that may cause data lose.'] = '3. 由于官方界面设置一些原因,不停开关界面设置同步选项可能会导致情缘数据丢失。', + ['4. To recove lover data, please ask you lover click fix button.'] = '4. 如果您的情缘信息不慎丢失,您可邀请您的情缘点击该界面的修复按钮,修复关系。', + ['5. Lover must be toway friend, so delete friend will cause both side none-lover.'] = '5. 情缘要求必须是双向好友,任何一方删除对方好友后,双方都将转换为无情缘状态。', + ['6. Lover can see each other\'s location, delete friend can prevent this.'] = '6. 情缘可以互相看到对方角色所在地图,删除好友即可使对方恢复无情缘从而无法通过任何方式继续查看您的位置。', + ['7. Backup lover requires both online and teamed up, backup data can be used to restore data while server merge or player crossing server.'] = '7. 备份情缘证需要双方在线解锁同意后方可进行,备份后的情缘证可以在合服、转服后,组队恢复情缘信息。', + ['View love info'] = '查看情缘信息', + ['FIREWORK_TITLE_67291'] = '真橙之心', + ['FIREWORK_TITLE_156446'] = '同心人', + ['FIREWORK_TITLE_156413'] = '有福人', + ['FIREWORK_TITLE_157096'] = '恒心人', + ['FIREWORK_TITLE_157378'] = '知心人', + ['FIREWORK_TITLE_158339'] = '衷情人', + ['FIREWORK_TITLE_151303'] = '真心人', + ['FIREWORK_TITLE_151743'] = '千衷不渝', + ['FIREWORK_TITLE_152844'] = '心不释手', + ['FIREWORK_TITLE_153642'] = '万家灯火', + ['FIREWORK_TITLE_153641'] = '素月流天', + ['FIREWORK_TITLE_154319'] = '惜福人', + ['FIREWORK_TITLE_154320'] = '一心人', + ['FIREWORK_TITLE_159250'] = '倾心人', + ['FIREWORK_TITLE_160982'] = '海誓山盟', + ['FIREWORK_TITLE_160993'] = '相思人', + ['FIREWORK_TITLE_161367'] = '深情人', + ['FIREWORK_TITLE_161887'] = '称心人', + ['FIREWORK_TITLE_162307'] = '还愿人', + ['FIREWORK_TITLE_162308'] = '在吗?', + ['FIREWORK_TITLE_158577'] = '玲珑心', + + -- MY_AchievementWiki + ['MY_AchievementWiki'] = '成就百科', + ['Achievement wiki'] = '成就百科', + ['Click icon on achievemnt panel to view achievement wiki'] = '点击成就界面图标显示成就百科', + ['UI Width'] = '界面宽度', + ['UI Height'] = '界面高度', + + -- MY_QuestWiki + ['MY_QuestWiki'] = '任务百科', + ['Click for quest wiki'] = '点击查看任务百科', + ['Quest wiki'] = '任务百科', + ['Click help icon on quest panel to view quest wiki'] = '点击任务面板百科图标显示任务百科', + + -- MY_PetWiki + ['MY_PetWiki'] = '宠物百科', + ['Pet wiki'] = '宠物百科', + ['Click icon on pet panel to view pet wiki'] = '点击宠物秘鉴图标显示宠物百科', + + -- MY_RideWiki + ['MY_RideWiki'] = '坐骑百科', + ['Ride wiki'] = '坐骑百科', + ['Click icon on ride panel to view ride wiki'] = '点击坐骑图标显示坐骑百科', + + -- MY_ItemWiki + ['MY_ItemWiki'] = '物品百科', + ['Item wiki'] = '物品百科', + ['Hold SHIFT and r-click bag box to show item wiki'] = '按住SHIFT右键点击背包物品显示物品百科', + + -- MY_ItemPrice + ['MY_ItemPrice'] = '物品价格', + ['Item price'] = '物品价格', + ['Hold SHIFT and r-click bag box to show item price, share price when search auction.'] = '按住SHIFT右键点击背包物品显示物品价格,交易行搜索时分享搜索结果中的物品价格和数量。', + ['Check this will show price entry in bag item menu, and will share price when search auction, are you sure?'] = '勾选该选项后:\n1. 按住SHIFT右键点击背包物品将显示物品价格。\n2. 交易行搜索时将分享搜索结果中的物品价格和数量,不包含任何角色数据。\n\n确认要启用物品价格功能吗?', + ['Lookup flower price'] = '查询花价', + ['Lookup price'] = '查询价格', + + -- MY_LockFrame + ['MY_LockFrame'] = '界面锁定', + ['Lock frame position'] = '界面位置锁定', + ['Lock frame position list'] = '界面位置锁定窗口列表设置', + ['Enable (press ctrl+alt to temp unlock)'] = '启用(按住CTRL+ALT可临时解锁)', + ['MY_LockFrame has been temporary disabled.'] = '界面位置锁定已临时禁用', + ['MY_LockFrame has been enabled.'] = '界面位置锁定已重新启用', + ['LOCK_FRAME_JX_TargetList'] = '剑心·焦点列表', + ['LOCK_FRAME_MY_FocusUI'] = '茗伊·焦点列表', + ['LOCK_FRAME_WhoSeeMe'] = '谁在看我', + ['LOCK_FRAME_HatredPanel'] = '仇恨列表', + ['LOCK_FRAME_FightingStatistic'] = '伤害统计', + ['LOCK_FRAME_MY_ThreatRank'] = '茗伊·仇恨统计', + ['LOCK_FRAME_MY_Recount_UI'] = '茗伊·伤害统计', + ['LOCK_FRAME_QuestTraceList'] = '任务追踪', + ['LOCK_FRAME_Matrix'] = '阵法界面', + ['LOCK_FRAME_ChatPanel'] = '聊天面板', + ['LOCK_FRAME_DynamicActionBar'] = '动态技能栏', + ['LOCK_FRAME_ExteriorAction'] = '外装动作', + ['LOCK_FRAME_MentorMessage'] = '师徒提示', + ['LOCK_FRAME_JX_TeamCD'] = '剑心·团队技能监控', + ['LOCK_FRAME_JX_HeightMeter'] = '剑心·高度标线', + + -- MY_AutoSell + ['MY_AutoSell'] = '自动出售', + ['Auto sell items'] = '自动出售物品', + ['Auto sell when open shop'] = '打开商店后自动出售', + ['Auto sell by type'] = '按类型出售', + ['Sell grey items'] = '自动出售灰色物品', + ['Sell read white books'] = '自动出售已读白色书籍', + ['Sell read green books'] = '自动出售已读绿色书籍', + ['Sell read blue books'] = '自动出售已读蓝色书籍', + ['Auto sell by name'] = '按名称出售', + ['Protect specified items'] = '保护不被出售的物品', + ['* New *'] = '☆ 添加 ☆', + ['Name of item'] = '物品名称', + ['Remove'] = '删除', + ['Gray item'] = '灰色物品', + ['Specified'] = '指定', + ['Read white book'] = '已读白色书籍', + ['Read green book'] = '已读绿色书籍', + ['Read blue book'] = '已读蓝色书籍', + ['Confirm auto sell?'] = '是否需要售出以下物品?', + ['Some items may not be able to buy back once you sell it, and there is also a limit number rule by official, change auto sell rules in plugin if you want.'] = '请仔细确认即将出售的物品列表,物品一旦出售可能无法回购。如果您想要编辑出售规则,请打开茗伊插件集进入常用工具分页进行设置。', + ['Auto sell %s item: %s.'] = '售出%s物品:%s。', + + ['MY_DynamicItem'] = '动态物品栏', + ['MY Dynamic Item'] = '茗伊动态物品栏', + ['Dynamic item bar for different map'] = '在不同地图显示不同的物品列表', + ['Enable'] = '启用', + ['Show background'] = '显示背景', + ['Box number'] = '总格子数', + ['Box number: %d'] = '总格子数:%d', + ['Col number'] = '列数', + ['Col number: %d'] = '列数:%d', + ['Dynamic item %d'] = '动态物品栏 %s', + ['Only item can be draged in'] = '动态物品栏只能放入物品', + + ['MY_AutoMemorizeBook'] = '其它', + ['Auto memorize book'] = '自动阅读', + ['Press SHIFT for temporary disable'] = '打开界面时按住SHIFT键可临时禁用', + ['Auto memorize book has been disabled due to SHIFT key pressed.'] = '你按住了Shift键,自动阅读被禁用。', + + ['MY_FriendTipLocation'] = '其它', + ['Show all friend tip location'] = '社交界面显示双向二重好感度好友所在地', + ['(Different camp)'] = '(对立阵营)', + + ['MY_DynamicActionBarPos'] = '动态技能栏位置', + ['Restore dynamic action bar pos'] = '记住上次动态技能栏所在位置', + + -- MY_Domesticate.lua + ['MY_Domesticate'] = '驯养助手', + ['measure (%d+) point'] = '饱食度(%d+)点', + ['Your domesticate %s is growth up!'] = '你驯养的“%s”已可收获!', + ['No enough %s to feed %s!'] = '没有足够的[%s]用于驯养[%s]!', + ['Auto feed'] = '自动喂食', + ['Auto feed domesticate cancelled.'] = '自动喂食已取消。', + ['Set domesticate auto feed %s to %s succeed, will auto feed when hunger point reach %d.'] = '设置自动使用[%s]喂食[%s]成功,将在饱食度减少%d点时喂食。', + ['Set domesticate auto feed %s to %s failed.'] = '设置自动使用[%s]喂食[%s]失败。', + ['Your domesticate %s is hungery!'] = '你驯养的“%s”已饥肠辘辘!', + ['Your domesticate %s available measure is %d point!'] = '你驯养的“%s”待喂养饱食度已达到%d点!', + ['Domesticate feed alert'] = '驯养提醒', + ['Alert when measure is empty'] = '当驯养饱食度为空时提醒', + ['Alert when measure'] = '驯养可喂养饱食度提醒方式设置', + ['Alert when measure larger than %d'] = '当驯养可喂养饱食度高于%d点时提醒', + ['AutoFeedCubTabType'] = '自动喂食目标类型', + ['AutoFeedCubTabIndex'] = '自动喂食目标下标', + ['AutoFeedFoodTabType'] = '自动喂食物品类型', + ['AutoFeedFoodTabIndex'] = '自动喂食物品下标', + ['AutoFeedFoodMeasure'] = '自动喂食方式数据', + + -- MY_YunMacro.lua + ['MY_YunMacro'] = '云端宏', + ['Sync yun macro'] = '同步云端宏', + ['Show yun macro details'] = '显示详情', + ['Macro update failed...'] = '同步云端宏失败...', + ['ERR: Info content is illegal!'] = '错误:内容解析失败!', + ['Macro update started, please keep panel opened and wait.'] = '开始更新宏,请保持当前界面开启、不要切换宏并等待结果。', + ['Macro update succeed, please click save button.'] = '宏数据更新成功,请点击宏界面的“确定”或“应用”按钮使该宏生效。', + ['Top yun macro'] = '云端宏排名', + ['Cloud macro'] = '云端宏', + ['Click icon on macro panel to view macro wiki'] = '在宏界面显示云端宏按钮', + ['Got it'] = '好的', + ['Please input macro name first.'] = '请先输入宏名称。', + + ['MY_RoleStatistics'] = '角色统计', + + ['MY_DialogNameLink'] = '其它', + + -- MY_AutoDiamond.lua + ['MY_AutoDiamond'] = '精炼合成', + ['Show batch refine diamond in casting panel'] = '在精炼界面显示按当前配方重复合成选项', + ['Will continue produce until counter reaches or casting failed.'] = '填写次数,将在合成五行石时,重复当前配方,直到填写的次数归零、或者合成操作异常。', + ['Total: %d, success: %d (%.2f%%), failure: %d (%.2f%%)'] = '总:%d 成功:%d (%.2f%%) 失败:%d (%.2f%%)', + ['Restore bag failed, material may not enough.'] = '摆放原材料失败,原材料可能不足。', + ['Produce failed, action not exist.'] = '操作失败,无法正确捕获合成动作。', + ['Casting failed, auto cast stopped.'] = '合成失败,重复合成停止。', + ['Produce diamond as last formula for'] = '按当前配方重复合成', + ['times'] = '次', + ['DIAMOND_REGEX'] = '五行石((.-)级)', + ['Stop'] = '终止', + ['Casting panel closed, produce stopped.'] = '精炼面板已关闭,重复精炼停止。', +} diff --git a/MY_Toolbox/lang/zhtw.jx3dat b/MY_Toolbox/lang/zhtw.jx3dat new file mode 100644 index 000000000..3086b757c --- /dev/null +++ b/MY_Toolbox/lang/zhtw.jx3dat @@ -0,0 +1,518 @@ +return { + -- MY_Toolbox.lua + ['MY_Toolbox'] = '甯哥敤宸ュ叿', + ['MY_InfoTip'] = '淇℃伅椤ず', + + -- MY_FooterTip + ['MY_FooterTip'] = '骞渻濂藉弸楂樹寒', + ['Friend headtop tips'] = '闄勮繎濂藉弸楂樹寒', + ['Friend headtop tips nav'] = '椤ず鍫存櫙杩借工榛', + ['Friend headtop hide in dungeon'] = '绉樺涓毐钘', + ['Tong member headtop tips'] = '闄勮繎骞溇楂樹寒', + ['Tong member headtop tips nav'] = '椤ず鍫存櫙杩借工榛', + ['Tong member headtop hide in dungeon'] = '绉樺涓毐钘', + + ['Check nearby gongzhan'] = '妾㈡脯闄勮繎鍏辨埌', + ['Detected [%s] has Gongzhan BUFF for %d second(s).'] = '妾㈡脯鍒癧%s]鍏辨埌姘e媮鍓╅%d绉掋', + + ['Infomation tips'] = '淇℃伅姊濓紙SHIFT+U绉诲嫊浣嶇疆锛', + + ['Ping monitor' ] = '缍茶矾寤堕伈', + ['GPS' ] = '鐣跺墠浣嶇疆', + ['FPS monitor' ] = '娓告埐骞鏁', + ['Target distance'] = '鐩璺濋洟', + ['System time' ] = '绯荤当鏅傞枔', + ['Time machine' ] = '娓告埐閫熺巼', + ['Speedometer' ] = '瑙掕壊閫熷害', + ['Fight clock' ] = '鎴伴瑷堟檪', + ['Lotus clock' ] = '钘曞拰妗傝姳', + ['Placeholder' ] = '绌哄兼枃妗', + ['Background' ] = '鑳屾櫙' , + ['Title' ] = '妯欓' , + ['Font' ] = '瀛楅珨' , + ['Font Color' ] = '瀛楅珨椤忚壊', + + ['Ping: ' ] = '缍茶矾寤堕伈锛', + ['Location: ' ] = '鐣跺墠浣嶇疆锛', + ['FPS: ' ] = 'FPS锛', + ['Rate: ' ] = '浼烘湇鍣ㄥ嶇巼锛', + ['%d' ] = '%d', + ['No Target' ] = '娌掓湁鐩', + ['Distance: ' ] = '鐩璺濋洟锛', + ['Speed: ' ] = '閫熷害锛', + ['%.2f f/s' ] = '%.2f 灏/绉', + ['%.1f Foot' ] = '%.1f灏', + ['Time: ' ] = '绯荤当鏅傞枔锛', + ['%02d:%02d:%02d'] = '%02d:%02d:%02d', + ['Never Fight' ] = '鎵撲竴鏋跺啀瑾', + ['Fight Clock: ' ] = '鎴伴瑷堟檪锛', + ['%d:%02d:%02d' ] = '%d:%02d:%02d', + ['Lotus Clock: ' ] = '钘曞拰妗傝姳锛', + ['%d:%d:%d' ] = '%d:%d:%d', + + ['GongZhan'] = '鍏辨埌', + ['Scanning gongzhan: %d/%d'] = '姝e湪鎺冩弿鍏辨埌锛%d/%d', + ['Detected [%s] has GongZhan buff for %s.'] = '妾㈡脯鍒癧%s]鍏辨埌姹熸箹姘e媮鍓╅%s銆', + ['Nearby GongZhan Total Count: %d.'] = '闄勮繎鍏辨埌鏁搁噺锛%d銆', + ['------------------------------------'] = '鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺', + ['send to ...'] = '鐧奸佸埌...', + + -- MY_VisualSkill + ['MY_VisualSkill'] = '姝峰彶鎷涘紡', + ['Visual skill'] = '椤ず姝峰彶鎷涘紡鍒楄〃', + ['Penetrable UI'] = '鐣岄潰绌块', + ['Display skills count'] = '椤ず鏍煎瓙鏁搁噺', + ['Display %d skills.'] = '椤ず%d鏍笺', + ['Ignore skill list'] = '閰嶇疆闅辫棌鎷涘紡', + ['Add'] = '娣诲姞', + ['Please input skill id'] = '璜嬭几鍏ユ嫑寮廔D', + ['Invalid skill id'] = '涓嶅悎娉曠殑鎷涘紡ID', + + -- MY_ShenxingHelper + ['MY_ShenxingHelper'] = '绁炶淇濊', + ['Avoid blacking shenxing cd'] = '闃叉闁嬮櫍灏庤嚧绁炶鍗冮噷澶辨晽', + ['Got zhenyan wen shenxing, your shengxing will be blacked.'] = '鍦ㄧ琛屽崈閲岄亱鍔熼亷绋嬩腑鐛插緱闄g溂锛岀琛屾渻閫插叆瑾挎伅鐙鎱嬩絾瑙掕壊浠嶇劧鏈冨仠鐣欏湪鍘熷湴銆', + ['Shenxing has been cancelled, cause you got the zhenyan.'] = '鎮ㄧ嵅鍙栧埌闄g溂锛岀偤闃叉绁炶鍗冮噷CD琚粦锛岄亱鍔熷凡鑷嫊鎵撴柗銆', + ['Shenxing to ancient maps'] = '鐩涘攼鏁呭湴绁炶鍗冮噷', + ['Force open all map shenxing'] = '鏈煡鍦板湒绁炶鍗冮噷', + ['Shenxing can fly to undiscovered maps'] = '鍏佽ū绁炶鍗冮噷鍓嶅線灏氭湭鎺㈢储閬庣殑鍦板湒銆佺澧', + + -- MY_JiugongHelper + ['MY_JiugongHelper'] = '鍏跺畠', + ['The jiugong full sequence is: %s, blank is: %s.'] = '涔濆鍦栵細%s锛岀┖缂猴細%s銆', + ['Failed to calc.'] = '涔濆鍦栬▓绠楀け鏁椼', + + ['Memo (Role)'] = '闅ㄨ韩渚跨畫 (瑙掕壊)', + ['Memo (Global)'] = '闅ㄨ韩渚跨畫 (鍏叡)', + ['MY Memo (Role)'] = '鑼椾紛闅ㄨ韩渚跨畫 (瑙掕壊)', + ['MY Memo (Global)'] = '鑼椾紛闅ㄨ韩渚跨畫 (鍏叡)', + ['Font'] = '瀛楅珨', + ['Player remark'] = '瑙掕壊鍌欐敞', + ['Create'] = '娣诲姞', + ['View player remark'] = '绠$悊鏈湰', + ['Edit player remark'] = '鍔犲叆鑼椾紛瑙掕壊鍌欐敞', + ['MY_PlayerRemark Edit'] = '绶ㄨ集瑙掕壊鍌欐敞', + ['MY_Farbnamen not detected! Please check addon load!'] = '鏈兘璀樺垾鍒颁緷璩撮爡[闁娲炬煋鑹瞉瀛愭彃浠讹紝璜嬪埌鎻掍欢杓夊叆鐣岄潰妾㈡煡鎻掍欢瀹夎鐙鎱嬶紒', + ['Server:'] = '浼烘湇鍣細', + ['Name:'] = '鍚嶇ū锛', + ['Not found in local store'] = '鏈湴瑙掕壊璩囨枡搴腑鏈壘鍒', + ['Remark:'] = '鍏у锛', + ['Alert when group'] = 'TA閫茬祫鏅傚皪瑭辨璀﹀憡鎴戙', + ['Tip when group'] = 'TA閫茬祫鏅傝亰澶╂瑒鎻愮ず鎴戙', + ['sure'] = '纰哄畾', + ['cancel'] = '鍙栨秷', + ['Tip: [%s] is in your team.\nRemark: %s'] = '鎻愮ず锛歔%s]閫插叆浣犳墍鍦ㄧ殑闅婁紞銆俓n鍌欒ɑ锛%s', + ['Tip: [%s](Leader) is in your team.\nRemark: %s'] = '鎻愮ず锛歔%s]锛堝湗闀凤級閫插叆浣犳墍鍦ㄧ殑闅婁紞銆俓n鍌欒ɑ锛%s', + ['Tip: [%s] is in your room.\nRemark: %s'] = '鎻愮ず锛歔%s]閫插叆浣犳墍鍦ㄧ殑鎴块枔銆俓n鍌欒ɑ锛%s', + ['Import'] = '灏庡叆', + ['Please input import data:'] = '璜嬭几鍏ュ皫鍏ョ殑鏁告摎锛', + ['Server not match!'] = '浼烘湇鍣ㄤ笉鍖归厤锛', + ['Prefer old data or new data?'] = '琛濈獊鏅備娇鐢ㄥ師鏁告摎閭勬槸灏庡叆鐨勬柊鏁告摎锛', + ['Old data'] = '鏂版暩鎿', + ['New data'] = '鍘熸暩鎿', + ['Decode data failed!'] = '瑙g⒓鏁告摎澶辨晽锛', + ['Export'] = '灏庡嚭', + + ['Type to search, use comma to split.'] = '杓稿叆鏂囧瓧閫茶鎼滅储锛屽崐褰㈤楄櫉鍒嗛殧澶氬嬫悳绱㈤爡銆俓n濡傦細鐨囩鑽,鐢滆薄鑽', + + ['Exam tip'] = '绉戣垑鍔╂墜', + ['Querying, please wait...'] = '鏌ヨ涓紝璜嬬◢寰屸︹', + ['Local exam data matched.'] = '鍖归厤鍒版湰鍦伴搴', + ['No result found.'] = '娌掓湁鎼滅储鍒板尮閰嶇殑绲愭灉銆', + ['No result found, here\'s from open search engine:'] = '娌掓湁鎼滅储鍒板尮閰嶇殑绲愭灉锛屼互涓嬫暩鎿氫締鑷枊鏀炬悳绱㈠紩鎿庯細', + ['No result matched, here\'s similar answers:'] = '娌掓湁鎼滅储鍒板尮閰嶇殑绲愭灉锛屼互涓嬬偤椤炰技椤岀洰锛', + ['Question: %s\nAnswer: %s'] = '鍟忥細%s\n绛旓細%s', + ['Loading failed.'] = '杓夊叆澶辨晽銆', + ['%s record(s) commited, %s record(s) accepted!'] = '宸茬偤鎮ㄨ嚜鍕曟彁浜や簡%s姊濋搴暩鎿氾紝鍏朵腑%s姊濆凡琚郴绲遍氶亷鎺$磵锛', + ['Congratulations you finished the exam, please visit Yangzhou next monday for result.'] = '鎭枩浣犲畬鎴愪簡鏈冭│锛岃珛鏂间笅鍛ㄤ竴鍓嶅線鎻氬窞鍩庡公鏈冨崁鍓嶆柟鐨勭殗姒滄煡闁辨垚绺俱', + + -- MY_AutoDialogue + ['MY_AutoDialogue'] = '鍏跺畠', + ['Autochat' ] = '鑷嫊灏嶈┍', + ['Common' ] = '閫氱敤', + ['Auto interact disabled due to SHIFT key pressed.'] = '浣犳寜浣忎簡Shift閸碉紝鑷嫊灏嶈┍琚鐢ㄣ', + ['Conversation with [%s]: %s' ] = '灏嶈┍[%s]锛%s', + ['Conversation with [%s] auto chose: %s' ] = '灏嶈┍[%s]鑷嫊閬告搰浜嗭細%s', + ['Echo when autochat' ] = '杓稿嚭閬告搰鐨勯伕闋', + ['Auto chat when only one selection' ] = '鍙湁涓鍊嬮伕闋呮檪鑷嫊閬告搰', + ['Auto chat when only one space selection' ] = '鍙湁涓鍊嬬┖鐧介伕闋呮檪鑷嫊閬告搰', + ['Disable when shift key pressed' ] = '鎸変綇SHIFT鏅傜鐢ㄨ嚜鍕曞皪瑭', + ['Close after auto chat' ] = '鑷嫊灏嶈┍寰岄棞闁夌獥鍙', + ['Skip quest talk' ] = '绮剧啊鎺ュ彈浠诲嫏鍔囨儏灏嶈┍', + ['Left click to config autochat.\nRight click to edit global config.'] = '宸﹂嵉榛炴搳閰嶇疆瑭插皪瑭辨鐨勮嚜鍕曞皪瑭盶n鍙抽嵉榛炴搳閰嶇疆鍏ㄥ眬鑷嫊灏嶈┍瑷畾', + + ['NAME_PATTERN_LIST'] = { + '瀹冪殑涓讳汉鏄(.-)銆', + }, + + -- MY_MibaoHelper + ['MY_MibaoHelper'] = '瀵嗕繚鎻愮ず', + ['You have been loged in for 2min, you can unlock bag locker now.'] = '浣犲凡鐧诲叆娓告埐鍏╁垎閻橈紝鍙互鎰夊揩鐨勮В闄ゅ夊韩閹栧暒锛', + LOCK_TIP = {}, + + -- MY_BigWarChecker + ['MY_BigWarChecker'] = '澶ф埌鎻愰啋', + ['Warning: Bigwar has been finished but not handed yet!'] = '鑼椾紛鎻愮ず锛氬ぇ鎴伴倓娌掍氦锛', + ['This map is big war map and you did not accepted the quest, is that correct?'] = '鎻愮ず锛氭娓埌瑙掕壊娌掓湁鎺ュ彈鐣跺墠鍦板湒绉樺澶ф埌绯诲垪浠诲嫏锛', + + -- MY_ArenaHelper + ['MY_ArenaHelper'] = '鍚嶅妽澶ф渻鍔╂墜', + ['Auto restore team info in arena'] = '鍚嶅妽澶ф渻涓嚜鍕曟仮瑕嗕笂娆$祫闅婁俊鎭', + ['Auto cancel hide player in arena'] = '鍚嶅妽澶ф渻涓嚜鍕曞彇娑堝睆钄借鑹叉ā鍨', + ['Auto cancel hide player in battlefield'] = '鎴板牬涓嚜鍕曞彇娑堝睆钄借鑹叉ā鍨', + ['Auto cancel hide player in pubg'] = '绲曞鎴板牬涓嚜鍕曞彇娑堝睆钄借鑹叉ā鍨', + + ['Loop target between me and target'] = '寰挵閬告搰鑷繁鍜岀洰妯', + ['%%.1f/%d meter(s)'] = '%%.1f/%d 灏', + + ['Click to enable MY player view magnifier'] = '榛炴搳闁嬪暉鑼椾紛瑭﹁。闁', + ['Click to disable MY player view magnifier'] = '榛炴搳闂滈枆鑼椾紛瑭﹁。闁', + + ['Click for achievement wiki'] = '榛炴搳鏌ョ湅鎴愬氨鐧剧', + + ['MY_ItemInfoSearch'] = '鐗╁搧鎼滅储', + ['Please input item name or item index number'] = '璜嬭几鍏ョ墿鍝佸悕绋辨垨鐗╁搧ID', + ['Max display count %d, current %d.'] = '鏈澶ч’绀%d姊濓紝鐣跺墠绲愭灉%d姊濄', + ['MY_ItemInfoSearch TIPS'] = { + '瑾槑锛', + '銆銆1銆佸湪涓婃柟杓稿叆妗嗚几鍏ユ偍鎯宠鏌ヨ鐨勭墿鍝佸悕绋憋紝鍗冲彲閫茶娓告埐鍏х墿鍝佹煡瑭€', + '銆銆2銆佽┎鍔熻兘瑾跨敤瀹樻柟浠嬮潰鏌ヨ鐗╁搧琛紝涓嶆秹鍙婁换浣曠恫璺氫俊鑸囨暩鎿氬瓨鍎层', + '銆銆3銆佺墿鍝佽〃姣忔鏇存柊閮藉彲鑳借淇敼锛屾煡瑭㈢祼鏋滃彧浠h〃鏌ヨ鏅傚埢鐨勫嵆鏅傜媭鎱嬨', + }, + + -- MY_HideAnnounceBg + ['MY_HideAnnounceBg'] = '鍏跺畠', + ['Hide announce bg'] = '闅辫棌瀹樻柟鍏憡鍗鑳屾櫙', + + -- MY_Taoguan + ['MY_Taoguan'] = '骞寸嵏闄剁綈', + ['Auto taoguan: missing [%s]!'] = '闄剁綈鍔╂墜锛氱己灏慬%s]锛', + ['Auto taoguan: on.'] = '闄剁綈鍔╂墜锛氶枊銆', + ['Auto taoguan: off.'] = '闄剁綈鍔╂墜锛氶棞銆', + ['Current total score:(%d+)'] = '鐩墠鐨勭附绌嶅垎鐐猴細(%d+)', + ['Auto taoguan: reach limit!'] = '闄剁綈鍔╂墜锛氬凡閬旇ō缃笂闄愶紒', + ['Auto taoguan: score clear!'] = '闄剁綈鍔╂墜锛氱⿳鍒嗘彌鍏夋竻闆讹紒', + ['Auto taoguan: filter item [%s].'] = '闄剁綈鍔╂墜锛氶亷婵 [%s]銆', + ['Feature setting'] = '鍔熻兘瑷疆', + ['Stop simple broken can when score reaches'] = '鍋滄鐮哥綈瀛愶紝鐣剁附鍒嗘暩閬斿埌', + ['Put can if needed?'] = '蹇呰鏅傝嚜鍕曟斁缃愬瓙锛', + ['When no %s use %s?'] = '缂%s鏅備娇鐢%s锛', + ['Use %s when score reaches'] = '浣跨敤%s锛岀暥鍒嗘暩閬斿埌', + ['Stop break when no item'] = '鑻ョ己鍋滅牳', + ['Pickup filters'] = '鎷惧彇閬庢烤瑷疆', + ['(Checked will not be picked up, if still pick please check system auto pick config)'] = '锛堟墦鍕剧殑涓嶆捒锛岃嫢閭勬捒璜嬮棞淇傜当浠ュ強鍏朵粬鎻掍欢鑷嫊鎷惧彇锛', + ['Custom add'] = '娣诲姞鑷畾缇', + ['Please input custom name'] = '璜嬭几鍏ヨ嚜瀹氱京鍚嶇ū', + ['Start/stop break can'] = '闁嬪/鍋滄鐮哥綈', + ['Restore default config'] = '鎭㈠京榛樿獚瑷疆', + + -- MY_Love.lua -- + ['MY_Love'] = '鍔嶄繝鎯呯罚', + ['Singleton'] = '鐛ㄩ棖姹熸箹', + ['Hi, I seem to meet you somewhere ago'] = '鍡紝鎴戝ソ鍍忓湪鍝厭瑕嬮亷浣 #娆e枩', + ['Some people fancy you.'] = '绻旂簴闆蹭互鐐鸿獡锛屽~閵娌充互鐐虹磩锛屾墭椋涙槦浠ュ偝鎯咃紝鎼挡姗嬩互鐩歌仛銆傝嫢鏄睗蹇冩濡傛垜蹇冿紝姣旂考闆欓绗戝偛姹熸箹锛', + ['Other side terminate love you.'] = '鎴戞湰灏囧績鍚戞槑鏈堬紝濂堜綍鏄庢湀鐓ф簼娓狅紝灏嶆柟涓嶅啀绻肩簩鍠垁浣犱簡銆', + ['Some people fall in love with you.'] = '椤樺皣鑹景鑿勾杓曟媼锛岃珖绗戞嫳鎵嬫渤灞憋紝娣$湅鐢熸杓綁锛屽煼鎵嬪悓瑙閬犲北锛屾睙姘存祦闀凤紝澶╂动娴疯鏅傛檪鐩告濈浉浼达紝鑸囨睗鏀滄墜姹熸箹锛', + ['Other side gave up love you.'] = '閭勫悰鏄庣彔娣氶洐鍨傦紝鎭ㄤ笉鐩搁㈡湭瀚佹檪锛屽皪鏂逛笉鍐嶇辜绾屽柈鎴浣犱簡銆', + ['Blind love'] = '鍠垁', + ['Mutual love'] = '鐩告垁', + ['sec'] = '绉', + ['%d min %d sec'] = '%d鍒嗛悩%d绉', + ['%d hour %d min'] = '%d灏忔檪%d鍒嗛悩', + ['%d day %d hour'] = '%d澶%d灏忔檪', + ['%d year %d day'] = '%d骞%d澶', + ['Set lover is a sensitive action, please unlock to continue.'] = '瑙i櫎瀹夊叏閹栧緦锛屾柟鍙ō缃儏绶d俊鎭', + ['Remove lover is a sensitive action, please unlock to continue.'] = '瑙i櫎瀹夊叏閹栧緦锛屾柟鍙彯鍒鏂儏绲层', + ['Fix lover is a sensitive action, please unlock to continue.'] = '瑙i櫎瀹夊叏閹栧緦锛屾柟鍙慨瑜囨儏绶i棞淇傘', + ['From now on, my heart lover is [%s]'] = '#鐜懓 浠ョⅶ钀界偤蹇点侀粌娉夌偤鎲戯紝椤樿垏[%s]閫g悊鍏辨灊銆佹瘮缈奸綂椋涳紝鏀滄墜韪忓澶栨睙鍗椼佹父钀噷娌冲北锛岃鏃ュ崌鏈堣惤锛岃碁椋涢洩椋勮姳锛', + ['Sorry, I decided to just a swordman, bye my plugin lover'] = '鐨氬灞变笂闆紝鐨庤嫢闆查枔鏈堛備竴鍒ュ叐瀵紝鍕垮京鐩告濄 #蹇冪', + ['A blade and cut, no longer meet with [%s].'] = '#蹇冪 [%s]锛屽緸浠婁互寰锛屽嬁寰╃浉鎬濓紝鐩告濊垏鍚涚禃锛', + ['Please enable sync common ui config first'] = '璜嬪厛鍟熺敤娓告埐鐣岄潰鍚屾瑷疆锛屾柟鍙娇鐢ㄨ┎鍔熻兘銆俓n\n鏂规硶锛氬墠寰銆怑SC-娓告埐瑷疆-缍滃悎銆戠⒑淇濄愪己鏈嶅櫒鍚屾瑷疆銆戜腑鐨勩愮晫闈㈠父瑕忚ō缃戣閬告铏曟柤鍕鹃伕鐙鎱嬨', + ['Lover must online'] = '鎯呯罚蹇呴爤鍦ㄧ窔', + ['Lover must be a online friend'] = '鎯呯罚蹇呴爤鏄湪绶氬ソ鍙', + ['Inadequate conditions, requiring Lv2 friend'] = '鍠垁姊濅欢涓嶈冻锛岃姹備簩閲嶅ソ鎰', + ['Inadequate conditions, requiring Lv6 friend/party/4-feet distance'] = '鐩告垁姊濅欢涓嶈冻锛岃姹傚叚閲嶅ソ鎰/绲勯殜璺濋洟4灏哄収', + ['Inadequate conditions, requiring Lv6 friend/party/4-feet distance/%s'] = '鐩告垁姊濅欢涓嶈冻锛岃姹傚叚閲嶅ソ鎰/绲勯殜璺濋洟4灏哄収/鎻1鍊%s', + ['Peer and you are at same server but current crossing sever, please set lover after exit crossing server.'] = '灏嶆柟鑸囨偍渚嗚嚜鍚屼竴浼烘湇鍣紝璜嬮鍑鸿法鏈嶅緦鍐嶇祫闅婄櫦璧锋儏绶h珛姹傘', + ['Love request has been sent to [%s], wait please'] = '宸茶珛姹傝垏 [%s] 绲愮偤鐩告垁鎯呯罚锛岃珛绛夊欏洖鎳', + ['Love can not run a red-light, wait for %s left.'] = '鎯呯罚涓嶈兘闂栫磪鐕堬紝鍐嶇瓑寰%s寰屽啀瑭︺', + ['Are you sure to cut blind love with [%s]?'] = '浣犵⒑瀹氫笉鍐嶅柈鎴 [%s] 浜嗛航锛', + ['Congratulations, cut blind love finish.'] = '閭勫悰鏄庣彔娣氶洐鍨傦紝鎭ㄤ笉鐩搁㈡湭瀚佹檪銆', + ['Are you sure to cut mutual love with [%s]?'] = '浣犵⒑瀹氳鏂柗鑸 [%s] 鐨勬儏绶i航锛', + ['Past five hundred times looking back only in exchange for a chance encounter this life, you really decided?'] = '鍓嶄笘浜旂櫨娆″洖鐪告墠鎻涗締浠婄敓涓娆″伓閬囷紝浣犵湡鐨勬焙瀹氫簡锛', + ['You do not really want to cut off love it, really sure?'] = '浜虹敓鑻ュ彧濡傚垵瑕嬶紝浣曚簨绉嬮ⅷ鎮茬暙鎵囷紝鐪熺殑纰哄畾鍡庯紵', + ['Congratulations, do not repeat the same mistakes ah.'] = '瑙fㄩ噵绲愶紝鏇磋帿鐩告啂銆備竴鍒ュ叐瀵紝鍚勭敓姝″枩銆', + ['Repair feature only supports mutual love!'] = '淇鍔熻兘鍙敮鎸佺浉鎴鎯呯罚闂滀總锛', + ['Both sides must in a team to be repaired!'] = '闆欐柟蹇呴爤绲勯殜鍦ㄤ竴璧锋墠鑳介茶淇锛', + ['Repair request has been sent, wait please.'] = '淇璜嬫眰宸茬櫦閫佺郸灏嶆柟锛岃珛绋嶅欍', + + ['Backup lover is a sensitive action, please unlock to continue.'] = '璜嬪厛瑙i帠寰岋紝鏂瑰彲鍌欎唤鎯呯罚璀夈', + ['Backup lover succeed, file located at: %s.'] = '鎯呯罚璀夋暩鎿氬倷浠藉畬鎴愶紝鏁告摎鏂囦欢浣嶆柤锛%s銆', + ['Lover must in your team and online to do backup.'] = '蹇呴爤鑸囨儏绶g祫闅婁甫淇濇寔闆欐柟鍦ㄧ窔锛屾柟鍙茶鍌欎唤鎿嶄綔銆', + ['Backup request has been sent, wait please.'] = '鎯呯罚璀夊倷浠借珛姹傚凡鐧奸侊紝璜嬬瓑寰呭皪鏂瑰悓鎰忋', + ['Backup feature only supports mutual love!'] = '鎯呯罚璀夊倷浠藉姛鑳藉彧鏀寔鐩告垁鎯呯罚闂滀總锛', + + ['[%s] want to backup lover relation with you, do you agree?'] = '[%s] 鎯宠鐢熸垚鎯呯罚璀夋暩鎿氬倷浠芥枃浠讹紝鏄惁鍏佽ū锛', + ['Peer is not your lover, please check, or do fix lover first.'] = '灏嶆柟涓嶆槸浣犵殑鎯呯罚锛岃珛纰鸿獚灏嶆柟鎯呯罚鎻掍欢鐣岄潰椤ず鍏у锛屽鏋滃皪鏂归’绀虹偤鐒℃儏绶o紝鎮ㄥ彲浠ュ厛鍢楄│榛炴搳淇鎯呯罚鎸夐垥銆', + ['[%s] want to restore lover relation with you, do you agree?'] = '[%s] 鎯宠寰炴儏绶h瓑鏁告摎鍌欎唤鏂囦欢鎭㈠京鑸囦綘鐨勬儏绶i棞淇傦紝鏄惁鍏佽ū锛', + ['Restore lover is a sensitive action, please unlock to continue.'] = '璜嬪厛瑙i帠寰岋紝鏂瑰彲鎭㈠京鎯呯罚璀夈', + ['Restore lover succeed!'] = '鎭㈠京鎯呯罚璀夋垚鍔燂紒', + ['Peer is not your lover in this backup, please check.'] = '灏嶆柟涓嶆槸浣犳墍閬哥殑鎯呯罚璀夌殑鍙︿竴鏂癸紝璜嬫鏌ヨ鑹插悕绋辫垏鎯呯罚璀夋枃浠堕伕闋呫', + + ['Error: file is not a valid lover backup!'] = '閷锛氭墍閬哥殑鏂囦欢涓嶆槸鏈夋晥鐨勬儏绶h瓑鍌欎唤锛', + ['Send restore lover request to [%s]?'] = '绔嬪嵆鐧奸佹儏绶h瓑鎭㈠京璜嬫眰绲 [%s] 锛', + ['This file is not your lover backup, please check!'] = '鎵閬告枃浠朵笉鏄偍鐣跺墠瑙掕壊鐢熸垚鐨勬儏绶h瓑锛岃珛妾㈡煡鎯呯罚璀夋枃浠堕伕闋咃紒', + + ['[Restore]'] = '[鎭㈠京]', + ['Please input your lover\'s current name:'] = '璜嬭几鍏ユ偍閬告搰鐨勬儏绶h瓑灏嶆柟鐨勭暥鍓嶈鑹插悕锛', + ['Please select lover backup data file:'] = '璜嬮伕鎿囨兂瑕佹仮寰╃殑鎯呯罚璀夊倷浠芥枃浠讹細', + + ['Do you want to mutual love with [%s]?'] = '纰哄畾瑕佽垏 [%s] 鎯呯罚鍡庯紵', + ['Do you want to blind love with [%s]?'] = '纰哄畾瑕佸柈鎴 [%s] 鍡庯紵', + [''] = '<鐒″悎閬╀汉閬>', + ['%s\'s lover'] = '%s鐨勬儏绶', + ['...Loading...'] = '鈥﹁級鍏ヤ腑鈥', + ['...Unknown...'] = '鈥︽湭鐭モ', + ['%s\'s Love signature:'] = '%s鐨勬儏绶e瑷锛', + ['If it is always loading, the target may not install plugin or turn on quiet mode, strongly recommend to query after team up.'] = '濡傛灉涓鐩撮’绀鸿級鍏ヤ腑锛屽彲鑳芥槸灏嶆柟娌掓湁瀹夎鎻掍欢鎴栭枊鍟熷厤鎵撴摼锛屽挤鐑堟帹钖︾祫闅婂緦鏌ヨ銆', + ['This guy is very lazy, nothing left!'] = '閫欏嬪浼欏緢鎳讹紝浠楹间篃娌掔暀涓嬶紒', + ['Strike up her'] = '鍕炬惌濂', + ['Strike up him'] = '鍕炬惌浠', + ['[%s] is in fighting, no time for you.'] = '[%s] 姝e湪鎴伴涓紝鐒℃殗鎼悊浣犮', + ['[%s] is not in your party, do you want to send a request for accessing data?'] = '[%s] 涓嶅湪浣犵殑闅婁紞涓紝鏄惁鍚戝皪鏂硅珛姹傛煡鐪嬫儏绶d俊鎭紵', + ['No peer lover data yet, you must request first.'] = '鏆劇灏嶆柟鎯呯罚鏁告摎锛岃珛鍏堣珛姹傜嵅鍙栧皪鏂规儏绶d俊鎭', + ['Request lover data'] = '璜嬫眰鏁告摎', + ['Warm tip: Your {$type} lover [{$name}] is happy in [{$map}].'] = '婧Θ鎻愰啋锛氫綘鐨剓$type}鎯呯罚[{$name}]姝e湪{$map}鐜╄嶅憿銆', + ['Lover'] = '鎯呯罚', + ['Love signature:'] = '鎯呯罚瀹h█锛', + [''] = '<涓嶅憡瑷翠綘>', + ['[%s] want to see your lover info, OK?'] = '[%s] 濂藉鎯崇湅鎮ㄧ殑鎯呯罚淇℃伅锛岀郸鍊嬫鏈冿紵', + ['[Mystery] quietly said:'] = '[绁炵浜篯鎮勬倓鍦拌锛', + ['[%s] want to mutual love with you, OK?'] = '[%s] 璜嬫眰鑸囨偍绲愮偤鐩告垁鎯呯罚锛屾偍鐨勬剰鎬濆憿锛', + ['[%s] want to repair love relation with you, OK?'] = '[%s] 璜嬫眰淇鑸囨偍鐨勬儏绶i棞淇傦紝鏄惁绔嬪嵆淇锛', + ['[%s] is already your lover, fix it now?'] = '[%s] 宸茬稉鏄綘鐨勭浉鎴鎯呯罚鍟︼紝鏄惁绔嬪嵆淇闂滀總锛', + ['Congratulations, love relation with [%s] has been fixed!'] = '鎭枩锛屾垚鍔熶慨瑜囪垏 [%s] 鐨勬儏绶i棞淇傦紒', + ['Unfortunately the other has lover, but you can still blind love him!'] = '寰堥伜鎲惧皪鏂瑰凡鏈夋儏绶o紝浣嗕綘浠嶅彲浠ラ伕鎿囧柈鎴灏嶆柟锛', + ['The other is already your lover!'] = '灏嶆柟宸茬稉鏄偍鐨勭浉鎴鎯呯罚鍟︼紒', + ['The other refused you without reason, but you can still blind love him!'] = '涓嶇煡鐐轰綍灏嶆柟鎷掔禃浜嗕綘锛屼絾浣犱粛鍙互閬告搰鍠垁灏嶆柟锛', + ['Congratulations, success to attach love with [%s]!'] = '鎭枩鎮紝鑸 [%s] 绲愮罚鎴愬姛锛', + ['[%s] disabled ui config sync, unable to read data.'] = '[%s] 绂佺敤浜嗙晫闈㈠父瑕忚ō缃悓姝ワ紝鐒℃硶璁鍙栨暩鎿氾紒', + ['Failed to attach love, light firework failed.'] = '鐓欒姳鏈兘鎴愬姛鐕冩斁锛岀祼绶eけ鏁椼', + ['Warm tip: Your {$type} lover [{$name}] online, hurry doing needy doing.'] = '婧Θ鎻愰啋锛氫綘鐨剓$type}鎯呯罚[{$name}]涓婄窔鍟︼紝瑭插构鍢涜稌绶婂构鍢涖', + ['Love tip: %s is online now'] = '鎯呯罚鎻愮ず锛%s涓婄窔浜', + ['Warm tip: Your {$type} lover [{$name}] offline, hurry doing like doing.'] = '婧Θ鎻愰啋锛氫綘鐨剓$type}鎯呯罚[{$name}]涓嬬窔鍜э紝鎯冲构鍢涜稌绶婂构鍢涖', + ['Heart lover'] = '蹇冨嫊鎯呯罚', + ['No lover :-('] = '閭勬湪鏈夋儏绶e憿 :-(', + ['Mutual love friend Lv.6: '] = '鐩告垁鍏噸闅婂弸锛', + ['- Select plz -'] = '- 璜嬮伕鎿 -', + ['CROSS_SERVER_LOVER_TITLE'] = '璺ㄦ湇鎴', + ['Select a firework'] = '閬告搰鐕冩斁鐓欒姳', + ['(4-feets, with specific fireworks)'] = '锛4灏哄収锛岃儗鍖呭収鏈夋墍闇鐓欒姳锛', + ['Blind love friend Lv.2: '] = '鍠垁浜岄噸濂藉弸锛', + ['(Online required, notify anonymous)'] = '锛堣鍦ㄧ窔锛屽尶鍚嶉氱煡灏嶆柟锛', + ['[Light firework]'] = '[鐕冩斁鐓欒姳]', + ['Light firework is a sensitive action, please unlock to continue.'] = '瑙i櫎瀹夊叏閹栧緦锛屾柟鍙噧鏀剧厵鑺便', + ['Failed to light firework.'] = '鐕冩斁鐓欒姳澶辨晽锛', + ['[Break love]'] = '[鎻垁鏂儏绲瞉', + ['[Recovery]'] = '[淇]', + ['[Backup]'] = '[鍌欎唤]', + ['Auto focus lover'] = '鑷嫊鐒﹂粸鎯呯罚', + ['Non-love display'] = '鐒℃儏绶i’绀哄瓧', + ['Non-love display: '] = '鐒℃儏绶i’绀哄瓧锛', + ['Enable quiet mode'] = '闁嬪暉鍏嶆墦鎿', + ['Quick to accost text'] = '蹇嵎鍕炬惌鐢ㄨ獮', + ['Quick to accost text: '] = '蹇嵎鍕炬惌鐢ㄨ獮锛', + ['Love signature'] = '鎯呯罚鍊嬫у瑷', + ['Love signature: '] = '鎯呯罚鍊嬫у瑷锛', + ['Enable player view panel hook'] = '鍦ㄦ煡鐪嬩粬浜鸿鍌欑晫闈㈤’绀烘儏绶i伕闋呭崱', + ['Other view my lover without ask'] = '鍏佽ū鐒¢渶纰鸿獚闅ㄦ剰鏌ョ湅鎴戠殑鎯呯罚淇℃伅', + ['Tips'] = '灏忔彁绀', + ['1. You can break love one-sided.'] = '1. 鎯呯罚鍙互鍠柟闈㈠埅闄わ紝鐩告垁鎯呯罚鏈冮氶亷瀵嗚亰鍛婄煡灏嶆柟銆', + ['2. Data was stored in official data segment.'] = '2. 鎯呯罚鏁告摎淇濆瓨鍦ㄥ畼鏂规彁渚涚殑鐣岄潰瑷疆鏁告摎瀛樺劜浣嶄笂锛屼换浣曠涓夋柟閮界劇娉曠煡鏇夋偍鐨勬暩鎿氥', + ['3. Please do not enable config async, that may cause data lose.'] = '3. 鐢辨柤瀹樻柟鐣岄潰瑷疆涓浜涘師鍥狅紝涓嶅仠闁嬮棞鐣岄潰瑷疆鍚屾閬搁爡鍙兘鏈冨皫鑷存儏绶f暩鎿氫笩澶便', + ['4. To recove lover data, please ask you lover click fix button.'] = '4. 濡傛灉鎮ㄧ殑鎯呯罚淇℃伅涓嶆厧涓熷け锛屾偍鍙個璜嬫偍鐨勬儏绶i粸鎿婅┎鐣岄潰鐨勪慨瑜囨寜閳曪紝淇闂滀總銆', + ['5. Lover must be toway friend, so delete friend will cause both side none-lover.'] = '5. 鎯呯罚瑕佹眰蹇呴爤鏄洐鍚戝ソ鍙嬶紝浠讳綍涓鏂瑰埅闄ゅ皪鏂瑰ソ鍙嬪緦锛岄洐鏂归兘灏囪綁鎻涚偤鐒℃儏绶g媭鎱嬨', + ['6. Lover can see each other\'s location, delete friend can prevent this.'] = '6. 鎯呯罚鍙互浜掔浉鐪嬪埌灏嶆柟瑙掕壊鎵鍦ㄥ湴鍦栵紝鍒櫎濂藉弸鍗冲彲浣垮皪鏂规仮寰╃劇鎯呯罚寰炶岀劇娉曢氶亷浠讳綍鏂瑰紡绻肩簩鏌ョ湅鎮ㄧ殑浣嶇疆銆', + ['7. Backup lover requires both online and teamed up, backup data can be used to restore data while server merge or player crossing server.'] = '7. 鍌欎唤鎯呯罚璀夐渶瑕侀洐鏂瑰湪绶氳В閹栧悓鎰忓緦鏂瑰彲閫茶锛屽倷浠藉緦鐨勬儏绶h瓑鍙互鍦ㄥ悎鏈嶃佽綁鏈嶅緦锛岀祫闅婃仮寰╂儏绶d俊鎭', + ['View love info'] = '鏌ョ湅鎯呯罚淇℃伅', + ['FIREWORK_TITLE_67291'] = '鐪熸涔嬪績', + ['FIREWORK_TITLE_156446'] = '鍚屽績浜', + ['FIREWORK_TITLE_156413'] = '鏈夌浜', + ['FIREWORK_TITLE_157096'] = '鎭嗗績浜', + ['FIREWORK_TITLE_157378'] = '鐭ュ績浜', + ['FIREWORK_TITLE_158339'] = '琛锋儏浜', + ['FIREWORK_TITLE_151303'] = '鐪熷績浜', + ['FIREWORK_TITLE_151743'] = '鍗冭》涓嶆笣', + ['FIREWORK_TITLE_152844'] = '蹇冧笉閲嬫墜', + ['FIREWORK_TITLE_153642'] = '钀鐕堢伀', + ['FIREWORK_TITLE_153641'] = '绱犳湀娴佸ぉ', + ['FIREWORK_TITLE_154319'] = '鎯滅浜', + ['FIREWORK_TITLE_154320'] = '涓蹇冧汉', + ['FIREWORK_TITLE_159250'] = '鍌惧績浜', + ['FIREWORK_TITLE_160982'] = '娴疯獡灞辩洘', + ['FIREWORK_TITLE_160993'] = '鐩告濅汉', + ['FIREWORK_TITLE_161367'] = '娣辨儏浜', + ['FIREWORK_TITLE_161887'] = '绋卞績浜', + ['FIREWORK_TITLE_162307'] = '閭勯浜', + ['FIREWORK_TITLE_162308'] = '鍦ㄥ棊锛', + ['FIREWORK_TITLE_158577'] = '鐜茬搹蹇', + + -- MY_AchievementWiki + ['MY_AchievementWiki'] = '鎴愬氨鐧剧', + ['Achievement wiki'] = '鎴愬氨鐧剧', + ['Click icon on achievemnt panel to view achievement wiki'] = '榛炴搳鎴愬氨鐣岄潰鍦栨椤ず鎴愬氨鐧剧', + ['UI Width'] = '鐣岄潰瀵害', + ['UI Height'] = '鐣岄潰楂樺害', + + -- MY_QuestWiki + ['MY_QuestWiki'] = '浠诲嫏鐧剧', + ['Click for quest wiki'] = '榛炴搳鏌ョ湅浠诲嫏鐧剧', + ['Quest wiki'] = '浠诲嫏鐧剧', + ['Click help icon on quest panel to view quest wiki'] = '榛炴搳浠诲嫏闈㈡澘鐧剧鍦栨椤ず浠诲嫏鐧剧', + + -- MY_PetWiki + ['MY_PetWiki'] = '瀵电墿鐧剧', + ['Pet wiki'] = '瀵电墿鐧剧', + ['Click icon on pet panel to view pet wiki'] = '榛炴搳瀵电墿绉橀憭鍦栨椤ず瀵电墿鐧剧', + + -- MY_RideWiki + ['MY_RideWiki'] = '鍧愰◣鐧剧', + ['Ride wiki'] = '鍧愰◣鐧剧', + ['Click icon on ride panel to view ride wiki'] = '榛炴搳鍧愰◣鍦栨椤ず鍧愰◣鐧剧', + + -- MY_ItemWiki + ['MY_ItemWiki'] = '鐗╁搧鐧剧', + ['Item wiki'] = '鐗╁搧鐧剧', + ['Hold SHIFT and r-click bag box to show item wiki'] = '鎸変綇SHIFT鍙抽嵉榛炴搳鑳屽寘鐗╁搧椤ず鐗╁搧鐧剧', + + -- MY_ItemPrice + ['MY_ItemPrice'] = '鐗╁搧鍍规牸', + ['Item price'] = '鐗╁搧鍍规牸', + ['Hold SHIFT and r-click bag box to show item price, share price when search auction.'] = '鎸変綇SHIFT鍙抽嵉榛炴搳鑳屽寘鐗╁搧椤ず鐗╁搧鍍规牸锛屼氦鏄撹鎼滅储鏅傚垎浜悳绱㈢祼鏋滀腑鐨勭墿鍝佸児鏍煎拰鏁搁噺銆', + ['Check this will show price entry in bag item menu, and will share price when search auction, are you sure?'] = '鍕鹃伕瑭查伕闋呭緦锛歕n1. 鎸変綇SHIFT鍙抽嵉榛炴搳鑳屽寘鐗╁搧灏囬’绀虹墿鍝佸児鏍笺俓n2. 浜ゆ槗琛屾悳绱㈡檪灏囧垎浜悳绱㈢祼鏋滀腑鐨勭墿鍝佸児鏍煎拰鏁搁噺锛屼笉鍖呭惈浠讳綍瑙掕壊鏁告摎銆俓n\n纰鸿獚瑕佸暉鐢ㄧ墿鍝佸児鏍煎姛鑳藉棊锛', + ['Lookup flower price'] = '鏌ヨ鑺卞児', + ['Lookup price'] = '鏌ヨ鍍规牸', + + -- MY_LockFrame + ['MY_LockFrame'] = '鐣岄潰閹栧畾', + ['Lock frame position'] = '鐣岄潰浣嶇疆閹栧畾', + ['Lock frame position list'] = '鐣岄潰浣嶇疆閹栧畾绐楀彛鍒楄〃瑷疆', + ['Enable (press ctrl+alt to temp unlock)'] = '鍟熺敤锛堟寜浣廋TRL+ALT鍙嚚鏅傝В閹栵級', + ['MY_LockFrame has been temporary disabled.'] = '鐣岄潰浣嶇疆閹栧畾宸茶嚚鏅傜鐢', + ['MY_LockFrame has been enabled.'] = '鐣岄潰浣嶇疆閹栧畾宸查噸鏂板暉鐢', + ['LOCK_FRAME_JX_TargetList'] = '鍔嶅績路鐒﹂粸鍒楄〃', + ['LOCK_FRAME_MY_FocusUI'] = '鑼椾紛路鐒﹂粸鍒楄〃', + ['LOCK_FRAME_WhoSeeMe'] = '瑾板湪鐪嬫垜', + ['LOCK_FRAME_HatredPanel'] = '浠囨仺鍒楄〃', + ['LOCK_FRAME_FightingStatistic'] = '鍌峰绲辫▓', + ['LOCK_FRAME_MY_ThreatRank'] = '鑼椾紛路浠囨仺绲辫▓', + ['LOCK_FRAME_MY_Recount_UI'] = '鑼椾紛路鍌峰绲辫▓', + ['LOCK_FRAME_QuestTraceList'] = '浠诲嫏杩借工', + ['LOCK_FRAME_Matrix'] = '闄f硶鐣岄潰', + ['LOCK_FRAME_ChatPanel'] = '鑱婂ぉ闈㈡澘', + ['LOCK_FRAME_DynamicActionBar'] = '鍕曟厠鎶鑳芥瑒', + ['LOCK_FRAME_ExteriorAction'] = '澶栬鍕曚綔', + ['LOCK_FRAME_MentorMessage'] = '甯緬鎻愮ず', + ['LOCK_FRAME_JX_TeamCD'] = '鍔嶅績路鍦橀殜鎶鑳界洠鎺', + ['LOCK_FRAME_JX_HeightMeter'] = '鍔嶅績路楂樺害妯欑窔', + + -- MY_AutoSell + ['MY_AutoSell'] = '鑷嫊鍑哄敭', + ['Auto sell items'] = '鑷嫊鍑哄敭鐗╁搧', + ['Auto sell when open shop'] = '鎵撻枊鍟嗗簵寰岃嚜鍕曞嚭鍞', + ['Auto sell by type'] = '鎸夐鍨嬪嚭鍞', + ['Sell grey items'] = '鑷嫊鍑哄敭鐏拌壊鐗╁搧', + ['Sell read white books'] = '鑷嫊鍑哄敭宸茶畝鐧借壊鏇哥睄', + ['Sell read green books'] = '鑷嫊鍑哄敭宸茶畝缍犺壊鏇哥睄', + ['Sell read blue books'] = '鑷嫊鍑哄敭宸茶畝钘嶈壊鏇哥睄', + ['Auto sell by name'] = '鎸夊悕绋卞嚭鍞', + ['Protect specified items'] = '淇濊涓嶈鍑哄敭鐨勭墿鍝', + ['* New *'] = '鈽 娣诲姞 鈽', + ['Name of item'] = '鐗╁搧鍚嶇ū', + ['Remove'] = '鍒櫎', + ['Gray item'] = '鐏拌壊鐗╁搧', + ['Specified'] = '鎸囧畾', + ['Read white book'] = '宸茶畝鐧借壊鏇哥睄', + ['Read green book'] = '宸茶畝缍犺壊鏇哥睄', + ['Read blue book'] = '宸茶畝钘嶈壊鏇哥睄', + ['Confirm auto sell?'] = '鏄惁闇瑕佸敭鍑轰互涓嬬墿鍝侊紵', + ['Some items may not be able to buy back once you sell it, and there is also a limit number rule by official, change auto sell rules in plugin if you want.'] = '璜嬩粩绱扮⒑瑾嶅嵆灏囧嚭鍞殑鐗╁搧鍒楄〃锛岀墿鍝佷竴鏃﹀嚭鍞彲鑳界劇娉曞洖璩笺傚鏋滄偍鎯宠绶ㄨ集鍑哄敭瑕忓墖锛岃珛鎵撻枊鑼椾紛鎻掍欢闆嗛插叆甯哥敤宸ュ叿鍒嗛爜閫茶瑷疆銆', + ['Auto sell %s item: %s.'] = '鍞嚭%s鐗╁搧锛%s銆', + + ['MY_DynamicItem'] = '鍕曟厠鐗╁搧娆', + ['MY Dynamic Item'] = '鑼椾紛鍕曟厠鐗╁搧娆', + ['Dynamic item bar for different map'] = '鍦ㄤ笉鍚屽湴鍦栭’绀轰笉鍚岀殑鐗╁搧鍒楄〃', + ['Enable'] = '鍟熺敤', + ['Show background'] = '椤ず鑳屾櫙', + ['Box number'] = '绺芥牸瀛愭暩', + ['Box number: %d'] = '绺芥牸瀛愭暩锛%d', + ['Col number'] = '鍒楁暩', + ['Col number: %d'] = '鍒楁暩锛%d', + ['Dynamic item %d'] = '鍕曟厠鐗╁搧娆 %s', + ['Only item can be draged in'] = '鍕曟厠鐗╁搧娆勫彧鑳芥斁鍏ョ墿鍝', + + ['MY_AutoMemorizeBook'] = '鍏跺畠', + ['Auto memorize book'] = '鑷嫊闁辫畝', + ['Press SHIFT for temporary disable'] = '鎵撻枊鐣岄潰鏅傛寜浣廠HIFT閸靛彲鑷ㄦ檪绂佺敤', + ['Auto memorize book has been disabled due to SHIFT key pressed.'] = '浣犳寜浣忎簡Shift閸碉紝鑷嫊闁辫畝琚鐢ㄣ', + + ['MY_FriendTipLocation'] = '鍏跺畠', + ['Show all friend tip location'] = '绀句氦鐣岄潰椤ず闆欏悜浜岄噸濂芥劅搴﹀ソ鍙嬫墍鍦ㄥ湴', + ['(Different camp)'] = '锛堝皪绔嬮櫍鐕燂級', + + ['MY_DynamicActionBarPos'] = '鍕曟厠鎶鑳芥瑒浣嶇疆', + ['Restore dynamic action bar pos'] = '瑷樹綇涓婃鍕曟厠鎶鑳芥瑒鎵鍦ㄤ綅缃', + + -- MY_Domesticate.lua + ['MY_Domesticate'] = '棣撮鍔╂墜', + ['measure (%d+) point'] = '椋介搴(%d+)榛', + ['Your domesticate %s is growth up!'] = '浣犻Υ椁婄殑鈥%s鈥濆凡鍙敹绌紒', + ['No enough %s to feed %s!'] = '娌掓湁瓒冲鐨刐%s]鐢ㄦ柤棣撮[%s]锛', + ['Auto feed'] = '鑷嫊鍠傞', + ['Auto feed domesticate cancelled.'] = '鑷嫊鍠傞宸插彇娑堛', + ['Set domesticate auto feed %s to %s succeed, will auto feed when hunger point reach %d.'] = '瑷疆鑷嫊浣跨敤[%s]鍠傞[%s]鎴愬姛锛屽皣鍦ㄩ=椋熷害娓涘皯%d榛炴檪鍠傞銆', + ['Set domesticate auto feed %s to %s failed.'] = '瑷疆鑷嫊浣跨敤[%s]鍠傞[%s]澶辨晽銆', + ['Your domesticate %s is hungery!'] = '浣犻Υ椁婄殑鈥%s鈥濆凡椋㈣吀杞嗚絾锛', + ['Your domesticate %s available measure is %d point!'] = '浣犻Υ椁婄殑鈥%s鈥濆緟鍠傞椋介搴﹀凡閬斿埌%d榛烇紒', + ['Domesticate feed alert'] = '棣撮鎻愰啋', + ['Alert when measure is empty'] = '鐣堕Υ椁婇=椋熷害鐐虹┖鏅傛彁閱', + ['Alert when measure'] = '棣撮鍙杺椁婇=椋熷害鎻愰啋鏂瑰紡瑷疆', + ['Alert when measure larger than %d'] = '鐣堕Υ椁婂彲鍠傞椋介搴﹂珮鏂%d榛炴檪鎻愰啋', + ['AutoFeedCubTabType'] = '鑷嫊鍠傞鐩椤炲瀷', + ['AutoFeedCubTabIndex'] = '鑷嫊鍠傞鐩涓嬫', + ['AutoFeedFoodTabType'] = '鑷嫊鍠傞鐗╁搧椤炲瀷', + ['AutoFeedFoodTabIndex'] = '鑷嫊鍠傞鐗╁搧涓嬫', + ['AutoFeedFoodMeasure'] = '鑷嫊鍠傞鏂瑰紡鏁告摎', + + -- MY_YunMacro.lua + ['MY_YunMacro'] = '闆茬瀹', + ['Sync yun macro'] = '鍚屾闆茬瀹', + ['Show yun macro details'] = '椤ず瑭虫儏', + ['Macro update failed...'] = '鍚屾闆茬瀹忓け鏁...', + ['ERR: Info content is illegal!'] = '閷锛氬収瀹硅В鏋愬け鏁楋紒', + ['Macro update started, please keep panel opened and wait.'] = '闁嬪鏇存柊瀹忥紝璜嬩繚鎸佺暥鍓嶇晫闈㈤枊鍟熴佷笉瑕佸垏鎻涘畯涓︾瓑寰呯祼鏋溿', + ['Macro update succeed, please click save button.'] = '瀹忔暩鎿氭洿鏂版垚鍔燂紝璜嬮粸鎿婂畯鐣岄潰鐨勨滅⒑瀹氣濇垨鈥滄噳鐢ㄢ濇寜閳曚娇瑭插畯鐢熸晥銆', + ['Top yun macro'] = '闆茬瀹忔帓鍚', + ['Cloud macro'] = '闆茬瀹', + ['Click icon on macro panel to view macro wiki'] = '鍦ㄥ畯鐣岄潰椤ず闆茬瀹忔寜閳', + ['Got it'] = '濂界殑', + ['Please input macro name first.'] = '璜嬪厛杓稿叆瀹忓悕绋便', + + ['MY_RoleStatistics'] = '瑙掕壊绲辫▓', + + ['MY_DialogNameLink'] = '鍏跺畠', + + -- MY_AutoDiamond.lua + ['MY_AutoDiamond'] = '绮剧厜鍚堟垚', + ['Show batch refine diamond in casting panel'] = '鍦ㄧ簿鐓夌晫闈㈤’绀烘寜鐣跺墠閰嶆柟閲嶈鍚堟垚閬搁爡', + ['Will continue produce until counter reaches or casting failed.'] = '濉娆℃暩锛屽皣鍦ㄥ悎鎴愪簲琛岀煶鏅傦紝閲嶈鐣跺墠閰嶆柟锛岀洿鍒板~瀵殑娆℃暩姝搁浂銆佹垨鑰呭悎鎴愭搷浣滅暟甯搞', + ['Total: %d, success: %d (%.2f%%), failure: %d (%.2f%%)'] = '绺斤細%d銆鎴愬姛锛%d (%.2f%%)銆澶辨晽锛%d (%.2f%%)', + ['Restore bag failed, material may not enough.'] = '鎿烘斁鍘熸潗鏂欏け鏁楋紝鍘熸潗鏂欏彲鑳戒笉瓒炽', + ['Produce failed, action not exist.'] = '鎿嶄綔澶辨晽锛岀劇娉曟纰烘崟鐛插悎鎴愬嫊浣溿', + ['Casting failed, auto cast stopped.'] = '鍚堟垚澶辨晽锛岄噸瑕嗗悎鎴愬仠姝€', + ['Produce diamond as last formula for'] = '鎸夌暥鍓嶉厤鏂归噸瑕嗗悎鎴', + ['times'] = '娆', + ['DIAMOND_REGEX'] = '浜旇鐭筹紙(.-)绱氾級', + ['Stop'] = '绲傛', + ['Casting panel closed, produce stopped.'] = '绮剧厜闈㈡澘宸查棞闁夛紝閲嶈绮剧厜鍋滄銆', +} diff --git a/MY_Toolbox/src/MY_AchievementWiki.lua b/MY_Toolbox/src/MY_AchievementWiki.lua new file mode 100644 index 000000000..ff8f4b588 --- /dev/null +++ b/MY_Toolbox/src/MY_AchievementWiki.lua @@ -0,0 +1,229 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 成就查询 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_AchievementWiki' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_AchievementWiki', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AchievementWiki'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AchievementWiki'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 850, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AchievementWiki'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 610, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwAchievement) + local achi = X.GetAchievement(dwAchievement) + if not achi then + return + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/wiki/' .. dwAchievement .. '?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + player = X.GetClientPlayerName(), + })) + local szKey = 'AchievementWiki_' .. dwAchievement + local szTitle = achi.szName .. ' - ' .. achi.szDesc + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.OnAchieveItemMouseEnter() + if O.bEnable then + this:SetObjectMouseOver(true) + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local xml = {} + table.insert(xml, GetFormatText(_L['Click for achievement wiki'], 41)) + if IsCtrlKeyDown() then + local h = this:GetParent() + local t = {} + for k, v in pairs(h) do + if k ~= '___id' and k ~= '___type' then + table.insert(t, k .. ': ' .. X.EncodeLUAData(v, ' ')) + end + end + table.insert(xml, GetFormatText('\n\n' .. g_tStrings.DEBUG_INFO_ITEM_TIP .. '\n', 102)) + table.insert(xml, GetFormatText(table.concat(t, '\n'), 102)) + end + OutputTip(table.concat(xml), 300, { x, y, w, h }) + end +end + +function D.OnAchieveItemMouseLeave() + if O.bEnable then + this:SetObjectMouseOver(false) + HideTip() + end +end + +function D.OnAchieveItemLButtonClick() + local name = this:GetName() + if name == 'Box_AchiBox' and O.bEnable then + D.Open(this:GetParent().dwAchievement) + end +end + +function D.OnAchieveAppendItem(res, hList) + local hItem = res[1] + if not hItem then + return + end + local boxAchi = hItem:Lookup('Box_AchiBox') or hItem:Lookup('Box_AchiBoxShort') + local txtName = hItem:Lookup('Text_AchiName') + local txtDescribe = hItem:Lookup('Text_AchiDescribe') + if not boxAchi or not txtName or not txtDescribe then + return + end + boxAchi:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + boxAchi:RegisterEvent(ITEM_EVENT.MOUSEENTERLEAVE) + UnhookTableFunc(boxAchi, 'OnItemMouseEnter', D.OnAchieveItemMouseEnter) + UnhookTableFunc(boxAchi, 'OnItemMouseLeave', D.OnAchieveItemMouseLeave) + UnhookTableFunc(boxAchi, 'OnItemLButtonClick', D.OnAchieveItemLButtonClick) + HookTableFunc(boxAchi, 'OnItemMouseEnter', D.OnAchieveItemMouseEnter) + HookTableFunc(boxAchi, 'OnItemMouseLeave', D.OnAchieveItemMouseLeave) + HookTableFunc(boxAchi, 'OnItemLButtonClick', D.OnAchieveItemLButtonClick) +end + +function D.HookAchieveHandle(h) + if not h then + return + end + for i = 0, h:GetItemCount() - 1 do + D.OnAchieveAppendItem({h:Lookup(i)}, h) + end + HookTableFunc(h, 'AppendItemFromData', D.OnAchieveAppendItem, { bAfterOrigin = true, bPassReturn = true }) +end + +function D.HookAchieveFrame(frame) + D.HookAchieveHandle(frame:Lookup('PageSet_Achievement/Page_Achievement/WndScroll_AShow', '')) + D.HookAchieveHandle(frame:Lookup('PageSet_Achievement/Page_TopRecord/WndScroll_TRShow', '')) + D.HookAchieveHandle(frame:Lookup('PageSet_Achievement/Page_Summary/WndContainer_AchiPanel/PageSet_Achi/Page_Chi/PageSet_RecentAchi/Page_Scene', '')) + D.HookAchieveHandle(frame:Lookup('PageSet_Achievement/Page_Summary/WndContainer_AchiPanel/PageSet_Achi/Page_Chi/PageSet_RecentAchi/Page_AlmostFinish', '')) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Achievement wiki'], + tip = { + render = _L['Click icon on achievemnt panel to view achievement wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_AchievementWiki.bEnable, + onCheck = function(bChecked) + MY_AchievementWiki.bEnable = bChecked + end, + }):Width() + 5 + return nX, nY +end + + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_AchievementWiki', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, +} +MY_AchievementWiki = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterInit('MY_AchievementWiki', function() + local frame = Station.Lookup('Normal/AchievementPanel') + if not frame then + return + end + D.HookAchieveFrame(frame) +end) + +X.RegisterFrameCreate('AchievementPanel', 'MY_AchievementWiki', function(name, frame) + D.HookAchieveFrame(frame) +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ArenaHelper.lua b/MY_Toolbox/src/MY_ArenaHelper.lua new file mode 100644 index 000000000..1435baef1 --- /dev/null +++ b/MY_Toolbox/src/MY_ArenaHelper.lua @@ -0,0 +1,216 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 名剑大会自动切换团队频道 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ArenaHelper' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ArenaHelper.bAutoShowModel', { remake = true }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ArenaHelper', _L['General'], { + bRestoreAuthorityInfo = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ArenaHelper'], + _L['Auto restore team info in arena'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoShowModel = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ArenaHelper'], + _L['Auto cancel hide player in arena'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + szRestriction = 'MY_ArenaHelper.bAutoShowModel', + }, + bAutoShowModelBattlefield = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ArenaHelper'], + _L['Auto cancel hide player in battlefield'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoShowModelPubg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ArenaHelper'], + _L['Auto cancel hide player in pubg'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +-- auto restore team authourity info in arena +do local l_tTeamInfo, l_bConfigEnd +X.RegisterEvent('ARENA_START', function() l_bConfigEnd = true end) +X.RegisterEvent('LOADING_ENDING', function() l_bConfigEnd = false end) +X.RegisterEvent('PARTY_DELETE_MEMBER', function() l_bConfigEnd = false end) +local function RestoreTeam() + local me, team = X.GetClientPlayer(), GetClientTeam() + if not l_tTeamInfo + or not O.bRestoreAuthorityInfo + or not X.IsClientPlayerTeamLeader() + or not me.IsInParty() or not X.IsInArenaMap() then + return + end + X.SetTeamInfo(l_tTeamInfo) +end +X.RegisterEvent('PARTY_ADD_MEMBER', RestoreTeam) + +local function SaveTeam() + local me, team = X.GetClientPlayer(), GetClientTeam() + if not me.IsInParty() or not X.IsInArenaMap() or l_bConfigEnd then + return + end + l_tTeamInfo = X.GetTeamInfo() +end +X.RegisterEvent({'TEAM_AUTHORITY_CHANGED', 'PARTY_SET_FORMATION_LEADER', 'TEAM_CHANGE_MEMBER_GROUP'}, SaveTeam) +end + +-- 进入JJC自动显示所有人物 +do +local l_bShowNpc, l_bShowPlayer, l_bShowPartyOverride +X.RegisterEvent('LOADING_END', 'MY_ArenaHelper_ShowTargetModel', function() + if not O.bAutoShowModel and not O.bAutoShowModelBattlefield and not O.bAutoShowModelPubg then + return + end + local bHasValue = X.IsBoolean(l_bShowNpc) and X.IsBoolean(l_bShowPlayer) and X.IsBoolean(l_bShowPartyOverride) + if (X.IsInArenaMap() and O.bAutoShowModel and not X.IsRestricted('MY_ArenaHelper.bAutoShowModel')) + or (X.IsInBattlefieldMap() and O.bAutoShowModelBattlefield) + or (X.IsInPubgMap() and O.bAutoShowModelPubg) then + if not bHasValue then + l_bShowNpc = X.GetNpcVisibility() + l_bShowPlayer, l_bShowPartyOverride = X.GetPlayerVisibility() + X.SetNpcVisibility(true) + X.SetPlayerVisibility(true, true) + end + elseif bHasValue then + X.SetNpcVisibility(l_bShowNpc) + X.SetPlayerVisibility(l_bShowPlayer, l_bShowPartyOverride) + l_bShowNpc, l_bShowPlayer, l_bShowPartyOverride = nil, nil, nil + end +end) +X.RegisterReload('MY_ArenaHelper_ShowTargetModel', function() + local bHasValue = X.IsBoolean(l_bShowNpc) and X.IsBoolean(l_bShowPlayer) and X.IsBoolean(l_bShowPartyOverride) + if not bHasValue then + return + end + X.SetNpcVisibility(l_bShowNpc) + X.SetPlayerVisibility(l_bShowPlayer, l_bShowPartyOverride) +end) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + -- 名剑大会自动恢复队伍信息 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto restore team info in arena'], + checked = MY_ArenaHelper.bRestoreAuthorityInfo, + onCheck = function(bChecked) + MY_ArenaHelper.bRestoreAuthorityInfo = bChecked + end, + }):Width() + 5 + + -- 名剑大会自动取消屏蔽 + if not X.IsRestricted('MY_ArenaHelper.bAutoShowModel') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto cancel hide player in arena'], + checked = MY_ArenaHelper.bAutoShowModel, + onCheck = function(bChecked) + MY_ArenaHelper.bAutoShowModel = bChecked + end, + }):Width() + 5 + end + + nY = nY + nLH + nX = nPaddingX + + -- 战场自动取消屏蔽 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto cancel hide player in battlefield'], + checked = MY_ArenaHelper.bAutoShowModelBattlefield, + onCheck = function(bChecked) + MY_ArenaHelper.bAutoShowModelBattlefield = bChecked + end, + }):Width() + 5 + + -- 自动取消屏蔽 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto cancel hide player in pubg'], + checked = MY_ArenaHelper.bAutoShowModelPubg, + onCheck = function(bChecked) + MY_ArenaHelper.bAutoShowModelPubg = bChecked + end, + }):Width() + 5 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ArenaHelper', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bRestoreAuthorityInfo', + 'bAutoShowModel', + 'bAutoShowModelBattlefield', + 'bAutoShowModelPubg', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bRestoreAuthorityInfo', + 'bAutoShowModel', + 'bAutoShowModelBattlefield', + 'bAutoShowModelPubg', + }, + root = O, + }, + }, +} +MY_ArenaHelper = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_AutoDialogue.lua b/MY_Toolbox/src/MY_AutoDialogue.lua new file mode 100644 index 000000000..853a96cab --- /dev/null +++ b/MY_Toolbox/src/MY_AutoDialogue.lua @@ -0,0 +1,596 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动对话(for 台服) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_AutoDialogue' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_AutoDialogue', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- +local DIALOGUE +local CURRENT_WINDOW +local CURRENT_CONTENTS + +local O = X.CreateUserSettingsModule('MY_AutoDialogue', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Enable'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bEchoOn = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Echo when autochat'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoClose = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Close after auto chat'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bEnableShift = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Disable when shift key pressed'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAutoSelectSg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Auto chat when only one selection'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoSelectSp = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Auto chat when only one space selection'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSkipQuestTalk = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDialogue'], + _L['Skip quest talk'], + }), + szRestriction = 'MY_AutoDialogue', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +--------------------------------------------------------------------------- +-- 数据存储 +--------------------------------------------------------------------------- +function D.LoadData() + DIALOGUE = X.LoadLUAData({'config/auto_dialogue.jx3dat', X.PATH_TYPE.GLOBAL}) + or X.LoadLUAData(X.PACKET_INFO.ROOT .. 'MY_Toolbox/data/auto_dialogue/{$lang}.jx3dat') + or {} +end + +function D.SaveData() + if not DIALOGUE then + return + end + X.SaveLUAData({'config/auto_dialogue.jx3dat', X.PATH_TYPE.GLOBAL}, DIALOGUE) +end + +function D.EnableDialogueData(szMap, szName, szContext, szKey) + X.Set(DIALOGUE, {szMap, szName, szContext, szKey}, 1) + D.SaveData() + D.AutoDialogue() +end + +function D.DisableDialogueData(szMap, szName, szContext, szKey) + if X.Get(DIALOGUE, {szMap, szName, szContext, szKey}) then + X.Set(DIALOGUE, {szMap, szName, szContext, szKey}, 0) + end + D.SaveData() +end + +function D.RemoveDialogueData(szMap, szName, szContext, szKey) + if X.Get(DIALOGUE, {szMap, szName, szContext, szKey}) then + X.Set(DIALOGUE, {szMap, szName, szContext, szKey}, nil) + end + if X.IsEmpty(X.Get(DIALOGUE, {szMap, szName, szContext})) then + X.Set(DIALOGUE, {szMap, szName, szContext}, nil) + end + if X.IsEmpty(X.Get(DIALOGUE, {szMap, szName})) then + X.Set(DIALOGUE, {szMap, szName}, nil) + end + if X.IsEmpty(X.Get(DIALOGUE, {szMap})) then + X.Set(DIALOGUE, {szMap}, nil) + end + D.SaveData() +end + +--------------------------------------------------------------------------- +-- 自动对话核心逻辑 +--------------------------------------------------------------------------- +do +-- 将服务器返回的对话Info解析为内容和交互选项 +function D.DecodeDialogInfo(aInfo, dwTarType, dwTarID) + local szName, szMap = _L['Common'], _L['Common'] + if dwTarID ~= X.GetClientPlayerID() then + szName = X.GetTargetName(dwTarType, dwTarID, { eShowID = 'never' }) or _L['Common'] + if dwTarType ~= TARGET.ITEM then + szMap = Table_GetMapName(X.GetClientPlayer().GetMapID()) + end + end + local dialog = { szMap = szMap, szName = szName, szContext = '', aOptions = {} } + -- 分析交互选项和文字内容 + for _, v in ipairs(aInfo) do + if v.name == '$' -- 选项 + or v.name == 'W' then -- 需要确认的选项 + local szImage, nImageFrame + if v.name == 'T' then + for iconid in string.gmatch(v.context, '%$ (%d+)') do + szImage = 'fromiconid' + nImageFrame = iconid + end + end + table.insert(dialog.aOptions, { dwID = tonumber(v.attribute.id) or 0, szContext = v.context }) + elseif v.name == 'T' then -- 图片 + local szImage, nImageFrame + for iconid in string.gmatch(v.context, '%$ (%d+)') do + szImage = 'fromiconid' + nImageFrame = iconid + end + table.insert(dialog.aOptions, { dwID = tonumber(v.attribute.id) or 0, szContext = v.context, szImage = szImage, nImageFrame = nImageFrame }) + elseif v.name == 'M' then -- 商店 + table.insert(dialog.aOptions, { szContext = v.context }) + elseif v.name == 'Q' then -- 任务对话 + local dwQuestId = tonumber(v.attribute.questid) + local tQuestInfo = Table_GetQuestStringInfo(dwQuestId) + if tQuestInfo then + local eQuestState, nLevel = GetQuestState(dwQuestId, dwTarType, dwTarID) + if eQuestState == QUEST_STATE_YELLOW_QUESTION + or eQuestState == QUEST_STATE_BLUE_QUESTION + or eQuestState == QUEST_STATE_HIDE + or eQuestState == QUEST_STATE_YELLOW_EXCLAMATION + or eQuestState == QUEST_STATE_BLUE_EXCLAMATION + or eQuestState == QUEST_STATE_WHITE_QUESTION + or eQuestState == QUEST_STATE_DUN_DIA then + table.insert(dialog.aOptions, { szContext = tQuestInfo.szName }) + end + end + elseif v.name == 'F' then -- 字体 + dialog.szContext = dialog.szContext .. v.attribute.text + elseif v.name == 'text' then -- 文本 + dialog.szContext = dialog.szContext .. v.context + elseif v.name == 'MT' then -- 交通 + table.insert(dialog.aOptions, { szContext = v.context }) + elseif v.name == 'U' then -- 跨地图交通 + table.insert(dialog.aOptions, { szContext = v.context }) + end + end + return dialog +end + +function D.ProcessDialogInfo(frame, aInfo, dwTarType, dwTarID, dwIndex) + local dialog = D.DecodeDialogInfo(aInfo, dwTarType, dwTarID) + if not (dialog.szMap and dialog.szName and dwIndex and aInfo) then + return + end + local option, nRepeat + local tChat = X.Get(DIALOGUE, {dialog.szMap, dialog.szName, dialog.szContext}) + if tChat then + for i, p in ipairs(dialog.aOptions) do + if p.dwID and tChat[p.szContext] and tChat[p.szContext] > 0 then + option = p + nRepeat = tChat[p.szContext] + break + end + end + end + if not X.IsInDungeonMap() then + if not option and O.bAutoSelectSp and #dialog.aOptions == 1 and dialog.aOptions[1].szContext == '' then + option = dialog.aOptions[1] + nRepeat = 1 + end + if not option and O.bAutoSelectSg and #dialog.aOptions == 1 then + option = dialog.aOptions[1] + nRepeat = 1 + end + end + if option and option.dwID then + if O.bAutoClose then + frame:Hide() + Station.Show() + rlcmd('dialogue with npc 0') + end + for i = 1, nRepeat do + X.GetClientPlayer().WindowSelect(dwIndex, option.dwID) + end + if O.bEchoOn then + X.OutputSystemMessage(_L('Conversation with [%s]: %s', dialog.szName, dialog.szContext:gsub('%s', ''))) + if option.szContext and option.szContext ~= '' then + X.OutputSystemMessage(_L('Conversation with [%s] auto chose: %s', dialog.szName, option.szContext)) + end + end + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('AUTO_CHAT', 'WindowSelect ' .. dwIndex .. ',' .. option.dwID .. 'x' .. nRepeat, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + return true + end +end + +function D.AutoDialogue() + -- Output(CURRENT_CONTENTS, CURRENT_WINDOW) + if not DIALOGUE then + D.LoadData() + end + if O.bEnableShift and IsShiftKeyDown() then + X.OutputSystemMessage(_L['Auto interact disabled due to SHIFT key pressed.']) + return + end + local frame = Station.Lookup('Normal/DialoguePanel') + if frame and frame:IsVisible() then + return D.ProcessDialogInfo(frame, frame.aInfo, frame.dwTargetType, frame.dwTargetId, frame.dwIndex) + end + local frame = Station.Lookup('Lowest2/PlotDialoguePanel') + if frame and frame:IsVisible() then + return D.ProcessDialogInfo(frame, frame.aInfo, frame.dwTargetType, frame.dwTargetId, frame.dwIndex) + end +end + +local function onOpenWindow() + CURRENT_WINDOW = arg0 + CURRENT_CONTENTS = arg1 + if not O.bEnable or X.IsRestricted('MY_AutoDialogue') then + return + end + X.DelayCall('MY_AutoDialogue__AutoDialogue', D.AutoDialogue) +end +X.RegisterEvent('OPEN_WINDOW', 'MY_AutoDialogue', onOpenWindow) +end + +--------------------------------------------------------------------------- +-- 精简任务对话核心逻辑 +--------------------------------------------------------------------------- +do +local function UnhookSkipQuestTalk() + local frame = Station.Lookup('Lowest2/QuestAcceptPanel') + if not frame or not frame.__SkipQuestHackEl then + return 0 + end + frame.__SkipQuestEl = nil + frame.__SkipQuestHackEl:Destroy() + frame.__SkipQuestHackEl = nil +end +X.RegisterReload('MY_AutoDialogue#SkipQuestTalk', UnhookSkipQuestTalk) + +local function HookSkipQuestTalk() + local frame = Station.Lookup('Lowest2/QuestAcceptPanel') + if not frame then + return 0 + end + if O.bSkipQuestTalk then + if not frame.__SkipQuestHackEl then + local w, h = Station.GetClientSize() + frame.__SkipQuestEl = frame:Lookup('Btn_Skip') + frame.__SkipQuestHackEl = X.UI(frame):Append('WndWindow', { + name = 'Btn_Skip', + x = 0, y = 0, w = w, h = h, + }):Raw() + end + if frame.dwShowIndex == 1 and X.IsTable(frame.tQuestRpg) then + local nCount = 2 + while frame.tQuestRpg['szText' .. nCount] and frame.tQuestRpg[nCount] ~= '' do + nCount = nCount + 1 + end + frame.dwShowIndex = nCount - 1 + end + frame.__SkipQuestHackEl:SetVisible(frame.__SkipQuestEl:IsVisible() and frame.tQuestRpg and frame.tQuestRpg.szText2 and frame.tQuestRpg.szText2 ~= '') + else + UnhookSkipQuestTalk() + end +end + +local function onInit() + X.BreatheCall('MY_AutoDialogue#SkipQuestTalk', HookSkipQuestTalk) +end +X.RegisterInit('MY_AutoDialogue#SkipQuestTalk', onInit) + +local function onFrameCreate() + X.BreatheCall('MY_AutoDialogue#SkipQuestTalk', HookSkipQuestTalk) +end +X.RegisterFrameCreate('QuestAcceptPanel', 'MY_AutoDialogue#SkipQuestTalk', onFrameCreate) +end + +--------------------------------------------------------------------------- +-- 设置按钮入口 +--------------------------------------------------------------------------- +function D.GetDialogueMenu(aInfo, dwTargetType, dwTargetID, dwIndex) + if not aInfo then + return + end + local dialog = D.DecodeDialogInfo(aInfo, dwTargetType, dwTargetID) + if not dialog.szName or not dialog.szMap then + return + end + -- 显示标题 + local szCaption = dialog.szName + if dialog.szContext ~= '' then + szCaption = szCaption .. '(' .. X.StringSubW(dialog.szContext:gsub('%s', ''), 1, 8) + if X.StringLenW(dialog.szContext) > 8 then + szCaption = szCaption .. '...' + end + szCaption = szCaption .. ')' + end + if IsCtrlKeyDown() then + szCaption = '(' .. dwIndex .. ') ' .. szCaption + end + -- 计算选项列表 + local tOption, aOption = {}, {} + for i, option in ipairs(dialog.aOptions) do -- 面板上的对话 + if option.dwID then + table.insert(aOption, option) + tOption[option.szContext] = true + end + end + local aList = X.Get(DIALOGUE, {dialog.szMap, dialog.szName, dialog.szContext}) -- 保存的自动对话 + if aList then + for szContext, nCount in pairs(aList) do + if not tOption[szContext] then + table.insert(aOption, { szContext = szContext }) + tOption[szContext] = true + end + end + end + -- 数据转菜单项 + local menu = {{ szOption = szCaption, bDisable = true }, { bDevide = true }} + for _, option in ipairs(aOption) do + local szCaption = option.szContext + if IsCtrlKeyDown() and option.dwID then + szCaption = '(' .. option.dwID .. ') ' .. szCaption + end + local menuSub = { szOption = szCaption, r = 255, g = 255, b = 255 } + local nRepeat = X.Get(DIALOGUE, {dialog.szMap, dialog.szName, dialog.szContext, option.szContext}) + if nRepeat then + menuSub.szIcon = 'ui/Image/UICommon/Feedanimials.UITex' + menuSub.nFrame = 86 + menuSub.nMouseOverFrame = 87 + menuSub.szLayer = 'ICON_RIGHT' + menuSub.fnClickIcon = function() + D.RemoveDialogueData(dialog.szMap, dialog.szName, dialog.szContext, option.szContext) + X.UI.ClosePopupMenu() + end + end + if nRepeat and nRepeat > 0 then + menuSub.r, menuSub.g, menuSub.b = 255, 0, 255 + menuSub.fnAction = function() + D.DisableDialogueData(dialog.szMap, dialog.szName, dialog.szContext, option.szContext) + X.UI.ClosePopupMenu() + end + else + menuSub.r, menuSub.g, menuSub.b = 255, 255, 255 + menuSub.fnAction = function() + D.EnableDialogueData(dialog.szMap, dialog.szName, dialog.szContext, option.szContext) + X.UI.ClosePopupMenu() + end + end + if option.szImage then + menuSub.szIcon = option.szImage + menuSub.nFrame = option.nImageFrame + menuSub.szLayer = 'ICON_RIGHT' + end + table.insert(menu, menuSub) + end + return menu +end + +do +local ENTRY_LIST = { + { + name = 'DialoguePanel', root = 'Normal/DialoguePanel', x = 53, y = 4, + keys = { info = 'aInfo', tartype = 'dwTargetType', tarid = 'dwTargetId', winidx = 'dwIndex'}, + }, + { + name = 'PlotDialoguePanel', root = 'Lowest2/PlotDialoguePanel', + ref = 'WndScroll_Options', point = 'TOPRIGHT', x = -50, y = 10, plot = true, + keys = { info = 'aInfo', tartype = 'dwTargetType', tarid = 'dwTargetId', winidx = 'dwIndex'}, + }, + { + name = 'QuestAcceptPanel', root = 'Lowest2/QuestAcceptPanel', + ref = 'Btn_Accept', point = 'TOPRIGHT', x = -30, y = 10, plot = true, + keys = { info = 'aInfo', tartype = 'dwTargetType', tarid = 'dwTargetID', winidx = 'dwIndex'}, + }, +} +function D.CreateEntry() + if X.IsRestricted('MY_AutoDialogue') then + return + end + for _, p in ipairs(ENTRY_LIST) do + local frame = Station.Lookup(p.root) + if frame and (not p.el or not p.el:IsValid()) then + local wnd = frame + if p.path then + wnd = frame:Lookup(p.path) + end + p.el = X.UI(wnd):Append('WndButton', { + name = 'WndButton_AutoChat', + text = _L['Autochat'], + tip = { + render = _L['Left click to config autochat.\nRight click to edit global config.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + menuLClick = function() + return D.GetDialogueMenu(frame[p.keys.info], frame[p.keys.tartype], frame[p.keys.tarid], frame[p.keys.winidx]) + end, + menuRClick = D.GetConfigMenu, + }):Raw() + end + end + D.UpdateEntryPos() +end +for _, p in ipairs(ENTRY_LIST) do + X.RegisterFrameCreate(p.name, 'MY_AutoDialogue#ENTRY', D.CreateEntry) +end +X.RegisterInit('MY_AutoDialogue', D.CreateEntry) + +function D.UpdateEntryPos() + if X.IsRestricted('MY_AutoDialogue') then + return + end + for _, p in ipairs(ENTRY_LIST) do + local frame = Station.Lookup(p.root) + if frame and p.el and p.el:IsValid() then + local wnd = frame + if p.path then + wnd = frame:Lookup(p.path) + end + local ref = frame + if p.ref then + ref = frame:Lookup(p.ref) + end + local x = p.x + (ref:GetAbsX() - frame:GetAbsX()) + local y = p.y + (ref:GetAbsY() - frame:GetAbsY()) + local point = p.point or 'TOPLEFT' + if point:find('RIGHT') then + x = x + ref:GetW() + end + if point:find('BOTTOM') then + y = y + ref:GetH() + end + p.el:SetRelPos(x, y) + end + end +end +X.RegisterEvent('UI_SCALED', 'MY_AutoDialogue#ENTRY', D.UpdateEntryPos) + +function D.RemoveEntry() + for i, p in ipairs(ENTRY_LIST) do + if p.el and p.el:IsValid() then + p.el:Destroy() + end + p.el = nil + end +end +X.RegisterReload('MY_AutoDialogue#ENTRY', D.RemoveEntry) + +local function onOpenWindow() + if X.IsRestricted('MY_AutoDialogue') then + return + end + D.CreateEntry() +end +X.RegisterEvent('OPEN_WINDOW', 'MY_AutoDialogue#ENTRY', onOpenWindow) + +X.RegisterEvent('MY_RESTRICTION', 'MY_AutoDialogue#ENTRY', function() + if arg0 and arg0 ~= 'MY_AutoDialogue' then + return + end + if X.IsRestricted('MY_AutoDialogue') then + D.RemoveEntry() + else + D.CreateEntry() + end +end) +end + +--------------------------------------------------------------------------- +-- 头像设置菜单 +--------------------------------------------------------------------------- +function D.GetConfigMenu() + return { + szOption = _L['Autochat'], { + szOption = _L['Enable'], + bCheck = true, bChecked = O.bEnable, + fnAction = function() + O.bEnable = not O.bEnable + end + }, { + szOption = _L['Echo when autochat'], + bCheck = true, bChecked = O.bEchoOn, + fnAction = function() + O.bEchoOn = not O.bEchoOn + end + }, { + szOption = _L['Auto chat when only one selection'], + bCheck = true, bChecked = O.bAutoSelectSg, + fnAction = function() + O.bAutoSelectSg = not O.bAutoSelectSg + end + }, { + szOption = _L['Auto chat when only one space selection'], + bCheck = true, bChecked = O.bAutoSelectSp, + fnAction = function() + O.bAutoSelectSp = not O.bAutoSelectSp + end + }, { + szOption = _L['Disable when shift key pressed'], + bCheck = true, bChecked = O.bEnableShift, + fnAction = function() + O.bEnableShift = not O.bEnableShift + end + }, { + szOption = _L['Close after auto chat'], + bCheck = true, bChecked = O.bAutoClose, + fnAction = function() + O.bAutoClose = not O.bAutoClose + end + }, { + szOption = _L['Skip quest talk'], + bCheck = true, bChecked = O.bSkipQuestTalk, + fnAction = function() + O.bSkipQuestTalk = not O.bSkipQuestTalk + end + }, + } +end + +X.RegisterAddonMenu('MY_AutoDialogue', function() + if X.IsRestricted('MY_AutoDialogue') then + return + end + return D.GetConfigMenu() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_AutoDiamond.lua b/MY_Toolbox/src/MY_AutoDiamond.lua new file mode 100644 index 000000000..4e22f1961 --- /dev/null +++ b/MY_Toolbox/src/MY_AutoDiamond.lua @@ -0,0 +1,512 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动按上次配方合石头 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_AutoDiamond' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +--------------------------------------------------------------------- +-- 本地函数和变量 +--------------------------------------------------------------------- +local D = { + nAutoCount = 0, + nCompleteCount = 0, + nSuccessCount = 0, +} + +local O = X.CreateUserSettingsModule('MY_AutoDiamond', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoDiamond'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) + +-- 获取五行石数据 +function D.GetDiamondData(dwBox, dwX) + if not dwX then + dwBox, dwX = select(2, dwBox:GetObjectData()) + end + local d, item = {}, X.GetInventoryItem(X.GetClientPlayer(), dwBox, dwX) + d.dwBox, d.dwX = dwBox, dwX + if item then + d.level = string.match(item.szName, _L['DIAMOND_REGEX']) + d.id, d.bind, d.num, d.detail = item.nUiId, item.bBind, item.nStackNum, item.nDetail + d.dwTabType, d.dwIndex = item.dwTabType, item.dwIndex + end + return d +end + +-- 获取精炼面板元素 +function D.LookupCastingPanel(szPath, szSubPath) + local frame = Station.SearchFrame('CastingPanel') + if not frame then + return + end + if szSubPath then + return frame:Lookup(szPath, szSubPath) + end + if szPath then + return frame:Lookup(szPath) + end + return frame +end + +-- 保存五行石精炼方案 +function D.SaveDiamondFormula() + local t = {} + local box = D.LookupCastingPanel('PageSet_All/Page_Refine', 'Handle_BoxItem/Box_Refine') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'Handle_BoxItem/Box_Refine') + local hList = D.LookupCastingPanel('PageSet_All/Page_Refine', 'Handle_RefineExpend') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'Handle_RefineExpend') + if not box or not hList then + return + end + table.insert(t, D.GetDiamondData(box)) + for i = 1, 16 do + local box = hList:Lookup('Box_RefineExpend_' .. i) + if box:IsObjectEnable() and box:GetObjectData() ~= -1 then + table.insert(t, D.GetDiamondData(box)) + end + end + D.dFormula = t +end + +-- 扫描背包石头及空位信息(存在 buggy cache) +function D.LoadBagDiamond() + local t = {} + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local d = D.GetDiamondData(dwBox, dwX) + if not d.id or d.level then + for _, v in ipairs(D.dFormula) do + if v.dwBox == dwBox and v.dwX == dwX then + d = nil + end + end + if d then + table.insert(t, d) + end + end + end + end + D.tBagCache = t +end + +-- 还原背包格子里的石头,失败返回 false,成功返回 true +function D.RestoreBagDiamond(d) + local me = X.GetClientPlayer() + local tBag = D.tBagCache + -- move box item + local item = X.GetInventoryItem(me, d.dwBox, d.dwX) + -- to stack + if item then + for k, v in ipairs(tBag) do + if v.id == item.nUiId and v.bind == item.bBind and (v.num + item.nStackNum) <= item.nMaxStackNum then + v.num = v.num + item.nStackNum + me.ExchangeItem(d.dwBox, d.dwX, v.dwBox, v.dwX) + item = nil + break + end + end + end + -- to empty + if item then + for k, v in ipairs(tBag) do + if not v.id then + local v2 = D.GetDiamondData(d.dwBox, d.dwX) + v2.dwBox, v2.dwX = v.dwBox, v.dwX + tBag[k] = v2 + me.ExchangeItem(d.dwBox, d.dwX, v.dwBox, v.dwX) + item = nil + break + end + end + end + -- no freebox + if item then + return false + end + -- group bag by type/bind: same type, same bind, ... others + local tBag2, nLeft = {}, d.num + for _, v in ipairs(tBag) do + if v.level == d.level and (v.bind == d.bind or v.bind == false) then + local vt = nil + for _, vv in ipairs(tBag2) do + if vv.bind == v.bind then + vt = vv + break + end + end + if not vt then + vt = { num = 0, bind = v.bind } + local vk = #tBag2 + 1 + if vk > 1 then + if v.bind ~= d.bind then + vk = 2 + else + vk = 1 + end + end + table.insert(tBag2, vk, vt) + end + vt.num = vt.num + v.num + table.insert(vt, v) + end + end + -- select diamond1 (same type) + for _, v in ipairs(tBag2) do + if v.num >= nLeft then + for _, vv in ipairs(v) do + if vv.num >= nLeft then + me.ExchangeItem(vv.dwBox, vv.dwX, d.dwBox, d.dwX, nLeft) + vv.num = vv.num - nLeft + break + elseif vv.num > 0 then + me.ExchangeItem(vv.dwBox, vv.dwX, d.dwBox, d.dwX, vv.num) + nLeft = nLeft - vv.num + vv.num = 0 + end + end + return true + end + end + return false +end + +-- 停止重复合成 +function D.StopProduce() + local box = D.LookupCastingPanel('PageSet_All/Page_Refine', 'Handle_BoxItem/Box_Refine') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'Handle_BoxItem/Box_Refine') + if box then + box:ClearObject() + end + D.dFormula = nil + D.tBagCache = nil +end + +-- 触发重复合成 +function D.ProduceDiamond() + if not D.fnProduceAction then + D.StopProduce() + X.OutputSystemAnnounceMessage(_L['Produce failed, action not exist.'], X.CONSTANT.MSG_THEME.ERROR) + return + end + D.bAwaitDuang = true + D.fnProduceAction() +end + +-- 从系统面板抓取合成函数 +function D.GetCastingAction() + local fnAction = X.GetMessageBoxButtonAction('CastingPanelConfirm', 1) + if fnAction then + D.fnProduceAction = fnAction + D.SaveDiamondFormula() + end +end + +-- 更新计数器 +function D.UpdateDashboard() + local edit = D.LookupCastingPanel('PageSet_All/Page_Refine/WndWindow_MYDiamond/WndEditBox_MYDiamond') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine/WndWindow_MYDiamond/WndEditBox_MYDiamond') + if edit then + X.UI(edit):Text(D.nAutoCount, WNDEVENT_FIRETYPE.PREVENT) + end + local txt = D.LookupCastingPanel('PageSet_All/Page_Refine/WndWindow_MYDiamond', 'Text_Result') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine/WndWindow_MYDiamond', 'Text_Result') + if txt then + X.UI(txt):Text( + D.nCompleteCount > 0 + and _L( + 'Total: %d, success: %d (%.2f%%), failure: %d (%.2f%%)', + D.nCompleteCount, + D.nSuccessCount, (D.nSuccessCount / D.nCompleteCount) * 100, + D.nCompleteCount - D.nSuccessCount, (1 - D.nSuccessCount / D.nCompleteCount) * 100 + ) + or '' + ) + end +end + +-- 自动摆五行石材料,开始下一轮合成 +function D.DoAutoDiamond() + local box = D.LookupCastingPanel('PageSet_All/Page_Refine', 'Handle_BoxItem/Box_Refine') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'Handle_BoxItem/Box_Refine') + if not box then + D.dFormula = nil + end + if not D.dFormula then + return + end + -- 更新计数器 + D.nAutoCount = math.max(D.nAutoCount - 1, 0) + D.bUpdateInfo = true + -- 移除加锁(延迟一帧) + X.DelayCall(50, function() + if not box:IsValid() then + D.StopProduce() + X.OutputSystemAnnounceMessage(_L['Casting panel closed, produce stopped.'], X.CONSTANT.MSG_THEME.ERROR) + return + end + local dwBox, dwX = select(2, box:GetObjectData()) + RemoveUILockItem('CastingPanel:' .. dwBox .. ',' .. dwX) + box:SetObject(UI_OBJECT_NOT_NEED_KNOWN, 0) + box:SetObjectIcon(3388 - X.GetClientPlayer().nGender) + end) + -- 重新放入配方(延迟8帧执行,确保 unlock) + X.DelayCall(200, function() + if not box:IsValid() then + D.StopProduce() + X.OutputSystemAnnounceMessage(_L['Casting panel closed, produce stopped.'], X.CONSTANT.MSG_THEME.ERROR) + return + end + if D.nAutoCount <= 0 then + D.StopProduce() + box:Clear() + return + end + D.LoadBagDiamond() + for _, v in ipairs(D.dFormula) do + if not D.RestoreBagDiamond(v) then + D.StopProduce() + X.OutputSystemAnnounceMessage(_L['Restore bag failed, material may not enough.'], X.CONSTANT.MSG_THEME.ERROR) + return + end + end + D.ProduceDiamond() + end) +end + +-- 隐藏结果特效 +function D.HideDuang() + local sfxSuccess = D.LookupCastingPanel('PageSet_All/Page_Refine', 'SFX_CommonRefineSuccess') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'SFX_CommonRefineSuccess') + local sfxFailure = D.LookupCastingPanel('PageSet_All/Page_Refine', 'SFX_CommonRefineFailure') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'SFX_CommonRefineFailure') + if not sfxSuccess or not sfxFailure then + return + end + sfxSuccess:Hide() + sfxFailure:Hide() +end + +-- 精炼结果显示 +function D.PlayDuang(bSuccess) + local sfx + if bSuccess then + sfx = D.LookupCastingPanel('PageSet_All/Page_Refine', 'SFX_CommonRefineSuccess') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'SFX_CommonRefineSuccess') + PlaySound(SOUND.UI_SOUND, g_sound.ElementalStoneSuccess) + else + sfx = D.LookupCastingPanel('PageSet_All/Page_Refine', 'SFX_CommonRefineFailure') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine', 'SFX_CommonRefineFailure') + PlaySound(SOUND.UI_SOUND, g_sound.ElementalStoneFailed) + end + if not sfx then + return + end + sfx:Hide() + sfx:Show() + sfx:Play() +end + +------------------------------------- +-- 设置界面 +------------------------------------- +function D.CheckInjection(bRemove) + local page = D.LookupCastingPanel('PageSet_All/Page_Refine') + or D.LookupCastingPanel('PageSet_All/Page_DiamondRefine') + if not page then + return + end + X.UI(page) + :Fetch('WndWindow_MYDiamond') + :Remove() + if not bRemove and D.bReady and O.bEnable then + local ui = X.UI(page):Append('WndWindow', { name = 'WndWindow_MYDiamond', y = 383, h = 24 }) + local nX, nY = 0, 2 + nX = nX + ui:Append('Text', { + name = 'Text_MYDiamond', + x = nX, y = nY, w = 'auto', h = 20, + color = { 255, 128, 0 }, alpha = 192, + text = _L['Produce diamond as last formula for'], + }):Width() + 5 + nX = nX + ui:Append('WndEditBox', { + name = 'WndEditBox_MYDiamond', + text = D.nAutoCount, + x = nX, y = nY - 2, w = 50, h = 20, alpha = 192, + editType = X.UI.EDIT_TYPE.NUMBER, + onChange = function(szText) + D.nAutoCount = tonumber(szText) or 0 + end, + tip = { + render = _L['Will continue produce until counter reaches or casting failed.'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + nX = nX + ui:Append('Text', { + name = 'Text_MYDiamond2', + x = nX, y = nY, w = 'auto', h = 20, + color = { 255, 128, 0 }, alpha = 192, + text = _L['times'], + }):Width() + 5 + nX = nX + ui:Append('WndButtonBox', { + name = 'WndButton_MYDiamond', + x = nX, y = nY, w = 50, h = 20, + buttonStyle = 'FLAT', + text = _L['Stop'], + onClick = function() + D.dFormula = nil + end, + autoEnable = function() return D.dFormula and D.nAutoCount > 0 end, + }):Width() + 5 + ui:Append('Text', { name = 'Text_Result', x = 0, y = 22, w = nX, h = 22, alpha = 192, alignHorizontal = 1 }) + ui:Width(nX) + ui:Left((380 - nX) / 2) + D.UpdateDashboard() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show batch refine diamond in casting panel'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.CheckInjection() + end, + }):Width() + 5 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_AutoDiamond', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.CheckInjection, + }, + root = O, + }, + }, +} +MY_AutoDiamond = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterFrameCreate('CastingPanel', 'MY_AutoDiamond', function() D.CheckInjection() end) +X.RegisterUserSettingsInit('MY_AutoDiamond', function() + D.bReady = true + D.CheckInjection() +end) +X.RegisterInit('MY_AutoDiamond', function() D.CheckInjection() end) +X.RegisterReload('MY_AutoDiamond', function() D.CheckInjection(true) end) + +X.RegisterEvent('DIAMON_UPDATE', 'MY_AutoDiamond', function() + -- 没有等待说明不在重复合成中,重置计数器 + if not D.bAwaitDuang then + D.nCompleteCount = 0 + D.nSuccessCount = 0 + D.bUpdateInfo = true + end + -- 分析本次结果 + local bSuccess = false + local nResult = arg0 + if nResult == DIAMOND_RESULT_CODE.SUCCESS then + local d = D.dFormula and D.dFormula[1] + if d and d.detail and d.detail > 0 then + local KItem = X.GetInventoryItem(X.GetClientPlayer(), d.dwBox, d.dwX) + if KItem then + if KItem.nDetail > d.detail then + bSuccess = true + D.nSuccessCount = D.nSuccessCount + 1 + end + end + end + D.nCompleteCount = D.nCompleteCount + 1 + D.bUpdateInfo = true + end + -- 播放结果动画 + if D.bAwaitDuang then + D.HideDuang() + if bSuccess then + X.DelayCall(1, function() + D.HideDuang() + D.PlayDuang(true) + OutputMessage('MSG_ANNOUNCE_YELLOW', g_tStrings.tFEProduce.SUCCEED) + end) + else + X.DelayCall(1, function() + D.HideDuang() + D.PlayDuang(false) + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.tFEProduce.FAILED) + end) + end + D.bAwaitDuang = false + end + -- 触发下一次合成 + if D.dFormula then + if D.nAutoCount <= 0 then + D.StopProduce() + elseif arg0 ~= DIAMOND_RESULT_CODE.SUCCESS then + D.StopProduce() + X.OutputSystemAnnounceMessage(_L['Casting failed, auto cast stopped.'], X.CONSTANT.MSG_THEME.ERROR) + else + D.DoAutoDiamond() + end + end + -- 更新计数器渲染 + if D.bUpdateInfo then + D.UpdateDashboard() + end +end) +X.RegisterEvent('ON_MESSAGE_BOX_OPEN', 'MY_AutoDiamond', D.GetCastingAction) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_AutoMemorizeBook.lua b/MY_Toolbox/src/MY_AutoMemorizeBook.lua new file mode 100644 index 000000000..6f4d71768 --- /dev/null +++ b/MY_Toolbox/src/MY_AutoMemorizeBook.lua @@ -0,0 +1,102 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动阅读书籍 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_AutoMemorizeBook' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_AutoMemorizeBook' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_AutoMemorizeBook', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_AutoMemorizeBook', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoMemorizeBook'], + _L['Enable'], + }), + szRestriction = 'MY_AutoMemorizeBook', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.Hook() + local frame = Station.Lookup('Normal/CraftReaderPanel') + if not frame or frame:Lookup('MY_AutoMemorizeBook') then + return + end + X.UI(frame):Append('WndCheckBox', { + name = 'MY_AutoMemorizeBook', + x = 50, y = 482, + text = _L['Auto memorize book'], + checked = O.bEnable, + onCheck = function() O.bEnable = not O.bEnable end, + }) +end + +function D.Unhook() + X.UI('Normal/CraftReaderPanel/MY_AutoMemorizeBook'):Remove() +end + +function D.CheckEnable() + if X.IsRestricted('MY_AutoMemorizeBook') then + D.Unhook() + X.RegisterFrameCreate('CraftReaderPanel', 'MY_AutoMemorizeBook', false) + X.RegisterEvent('OPEN_BOOK', 'MY_AutoMemorizeBook', false) + X.RegisterEvent('OPEN_BOOK_NOTIFY', 'MY_AutoMemorizeBook', false) + else + D.Hook() + X.RegisterFrameCreate('CraftReaderPanel', 'MY_AutoMemorizeBook', D.Hook) + if O.bEnable then + X.RegisterEvent({'OPEN_BOOK', 'OPEN_BOOK_NOTIFY'}, 'MY_AutoMemorizeBook', function(event) + if IsShiftKeyDown() then + return X.OutputSystemAnnounceMessage(_L['Auto memorize book has been disabled due to SHIFT key pressed.']) + end + local me = X.GetClientPlayer() + if not me then + return + end + local nBookID, nSegmentID, nItemID, nRecipeID = arg0, arg1, arg2, arg3 + local dwTargetType = event == 'OPEN_BOOK_NOTIFY' and arg4 or nil + if X.IS_REMAKE and not dwTargetType then + dwTargetType = TARGET.ITEM + end + if me.IsBookMemorized(nBookID, nSegmentID) then + return + end + me.CastProfessionSkill(8, nRecipeID, dwTargetType, nItemID) + end) + end + end +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_AutoMemorizeBook', D.CheckEnable) +X.RegisterReload('MY_AutoMemorizeBook', D.Unhook) +X.RegisterEvent('MY_RESTRICTION', 'MY_AutoMemorizeBook', function() + if arg0 and arg0 ~= 'MY_AutoMemorizeBook' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_AutoSell.lua b/MY_Toolbox/src/MY_AutoSell.lua new file mode 100644 index 000000000..ab8d4bd62 --- /dev/null +++ b/MY_Toolbox/src/MY_AutoSell.lua @@ -0,0 +1,415 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动售出物品 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_AutoSell' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_AutoSell', _L['General'], { + bEnable = { -- 打开商店后自动售出总开关, + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Auto sell when open shop'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSellGray = { -- 自动出售灰色物品, + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Sell grey items'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bSellWhiteBook = { -- 自动出售已读白书, + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Sell read white books'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSellGreenBook = { -- 自动出售已读绿书, + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Sell read green books'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bSellBlueBook = { -- 自动出售已读蓝书, + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Sell read blue books'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tSellItem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Auto sell by name'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = { + [X.GetItemInfoName(5, 2863)] = true, -- 银叶子 + [X.GetItemInfoName(5, 2864)] = true, -- 真银叶子 + [X.GetItemInfoName(5, 2865)] = true, -- 大片真银叶子 + [X.GetItemInfoName(5, 2866)] = true, -- 金粉末 + [X.GetItemInfoName(5, 2867)] = true, -- 金叶子 + [X.GetItemInfoName(5, 2868)] = true, -- 大片金叶子 + [X.GetItemInfoName(5, 11682)] = true, -- 金条 + [X.GetItemInfoName(5, 11683)] = true, -- 金块 + [X.GetItemInfoName(5, 11640)] = true, -- 金砖 + [X.GetItemInfoName(5, 17130)] = true, -- 银叶子·试炼之地 + [X.GetItemInfoName(5, 22974)] = true, -- 破碎的金玄玉 + }, + }, + tProtectItem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_AutoSell'], + _L['Protect specified items'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = { + [X.GetItemInfoName(5, 789)] = true, -- 真丝肚兜 + [X.GetItemInfoName(5, 797)] = true, -- 春宫图册 + }, + }, +}) +local D = {} + +RegisterCustomData('MY_AutoSell.tSellItem') +RegisterCustomData('MY_AutoSell.tProtectItem') + +function D.SellItem(nNpcID, nShopID, dwBox, dwX, nCount, szReason, szName, nUiId) + local me = X.GetClientPlayer() + local item = X.GetInventoryItem(me, dwBox, dwX) + if not item or item.nUiId ~= nUiId then + return + end + SellItem(nNpcID, nShopID, dwBox, dwX, nCount) + X.OutputSystemMessage(_L('Auto sell %s item: %s.', szReason, szName)) +end + +-- 自动售出物品 +function D.AutoSellItem(nNpcID, nShopID, bIgnoreGray) + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) then + return + end + local me = X.GetClientPlayer() + local aSell = {} + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local item = X.GetInventoryItem(me, dwBox, dwX) + if item and item.bCanTrade then + local bSell, szReason = false, '' + local szName = X.GetItemName(item.dwID) + if not O.tProtectItem[szName] then + if item.nQuality == 0 and O.bSellGray and not bIgnoreGray then + bSell = true + szReason = _L['Gray item'] + end + if not bSell and O.tSellItem[szName] then + bSell = true + szReason = _L['Specified'] + end + if not bSell and item.nGenre == ITEM_GENRE.BOOK and me.IsBookMemorized(X.RecipeToSegmentID(item.nBookID)) then + if O.bSellWhiteBook and item.nQuality == 1 then + bSell = true + szReason = _L['Read white book'] + elseif O.bSellGreenBook and item.nQuality == 2 then + bSell = true + szReason = _L['Read green book'] + elseif O.bSellBlueBook and item.nQuality == 3 then + bSell = true + szReason = _L['Read blue book'] + end + end + end + if bSell then + local nCount = 1 + if item.nGenre == ITEM_GENRE.EQUIPMENT and item.nSub == EQUIPMENT_SUB.ARROW then --远程武器 + nCount = item.nCurrentDurability + elseif item.bCanStack then + nCount = item.nStackNum + end + local r, g, b = GetItemFontColorByQuality(item.nQuality) + local sell = { + nNpcID = nNpcID, nShopID = nShopID, dwBox = dwBox, dwX = dwX, nCount = nCount, + szReason = szReason, szName = szName, nUiId = item.nUiId, r = r, g = g, b = b, + } + table.insert(aSell, sell) + end + end + end + end + table.sort(aSell, function(a, b) + if a.szReason == b.szReason then + return a.nUiId > b.nUiId + end + return a.szReason > b.szReason + end) + if #aSell > 0 then + local aXML, szReason = {} + table.insert(aXML, GetFormatText(_L['Confirm auto sell?'])) + table.insert(aXML, X.CONSTANT.XML_LINE_BREAKER) + for _, v in ipairs(aSell) do + if v.szReason ~= szReason then + table.insert(aXML, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXML, GetFormatText(v.szReason .. g_tStrings.STR_CHINESE_MAOHAO)) + szReason = v.szReason + end + table.insert(aXML, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXML, GetFormatText(g_tStrings.STR_TWO_CHINESE_SPACE .. '['.. v.szName ..']', 166, v.r, v.g, v.b)) + table.insert(aXML, GetFormatText(' x' .. v.nCount)) + end + table.insert(aXML, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXML, X.CONSTANT.XML_LINE_BREAKER) + table.insert(aXML, GetFormatText(_L['Some items may not be able to buy back once you sell it, and there is also a limit number rule by official, change auto sell rules in plugin if you want.'])) + local nW, nH = Station.GetClientSize() + local tMsg = { + x = nW / 2, y = nH / 3, + szName = 'MY_AutoSell__Confirm', + szMessage = table.concat(aXML), + bRichText = true, + szAlignment = 'CENTER', + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + for _, v in ipairs(aSell) do + D.SellItem(v.nNpcID, v.nShopID, v.dwBox, v.dwX, v.nCount, v.szReason, v.szName, v.nUiId) + end + end, + }, { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + } + MessageBox(tMsg) + end +end + +function D.CheckEnable() + if O.bEnable then + X.RegisterEvent('SHOP_OPENSHOP', 'MY_AutoSell', function() + local chk = Station.Lookup('Normal/ShopPanel/CheckBox_AutoSell') + local bIgnoreGray = chk and chk:IsCheckBoxChecked() or false + D.AutoSellItem(arg4, arg0, bIgnoreGray) + end) + else + X.RegisterEvent('SHOP_OPENSHOP', 'MY_AutoSell', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Auto sell items'], + checked = O.bEnable, + onCheck = function(bChecked) + O.bEnable = bChecked + D.CheckEnable() + end, + tip = { + render = _L['Auto sell when open shop'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + + -- 按类型出售 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 'auto', h = 24, + text = _L['Auto sell by type'], + menu = function() + local m0 = { + { + szOption = _L['Sell grey items'], + bCheck = true, bChecked = O.bSellGray, + fnAction = function(d, b) O.bSellGray = b end, + }, + { + szOption = _L['Sell read white books'], + bCheck = true, bChecked = O.bSellWhiteBook, + fnAction = function(d, b) O.bSellWhiteBook = b end, + }, + { + szOption = _L['Sell read green books'], bCheck = true, bChecked = O.bSellGreenBook, + fnAction = function(d, b) O.bSellGreenBook = b end, + }, + { + szOption = _L['Sell read blue books'], bCheck = true, bChecked = O.bSellBlueBook, + fnAction = function(d, b) O.bSellBlueBook = b end, + }, + } + return m0 + end, + autoEnable = function() return O.bEnable end, + }):Width() + 5 + + -- 按名称出售 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 'auto', h = 24, + text = _L['Auto sell by name'], + menu = function() + local m1 = { + { + szOption = _L['* New *'], + fnAction = function() + GetUserInput(_L['Name of item'], function(szText) + local szText = string.gsub(szText, '^%s*%[?(.-)%]?%s*$', '%1') + if szText ~= '' then + O.tSellItem[szText] = true + O.tSellItem = O.tSellItem + end + end) + end + }, + { bDevide = true }, + } + local m2 = { bInline = true, nMaxHeight = 550 } + for k, v in pairs(O.tSellItem) do + table.insert(m2, { + szOption = k, bCheck = true, bChecked = v, fnAction = function(d, b) O.tSellItem[k] = b end, + { + szOption = _L['Remove'], + fnAction = function() + O.tSellItem[k] = nil + O.tSellItem = O.tSellItem + for i, v in ipairs(m2) do + if v.szOption == k then + table.remove(m2, i) + break + end + end + return 0 + end, + }, + }) + end + table.insert(m1, m2) + return m1 + end, + autoEnable = function() return O.bEnable end, + }):Width() + 5 + + -- 保护不被出售的物品 + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, w = 'auto', h = 24, + text = _L['Protect specified items'], + menu = function() + local m1 = { + { + szOption = _L['* New *'], + fnAction = function() + GetUserInput(_L['Name of item'], function(szText) + local szText = string.gsub(szText, '^%s*%[?(.-)%]?%s*$', '%1') + if szText ~= '' then + O.tProtectItem[szText] = true + O.tProtectItem = O.tProtectItem + end + end) + end + }, + { bDevide = true }, + } + local m2 = { bInline = true, nMaxHeight = 550 } + for k, v in pairs(O.tProtectItem) do + table.insert(m2, { + szOption = k, bCheck = true, bChecked = v, fnAction = function(d, b) O.tProtectItem[k] = b end, + { + szOption = _L['Remove'], + fnAction = function() + O.tProtectItem[k] = nil + O.tProtectItem = O.tProtectItem + for i, v in ipairs(m2) do + if v.szOption == k then + table.remove(m2, i) + break + end + end + return 0 + end, + }, + }) + end + table.insert(m1, m2) + return m1 + end, + autoEnable = function() return O.bEnable end, + }):Width() + 5 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_AutoSell', + exports = { + { + fields = { + 'tSellItem', + 'tProtectItem', + 'OnPanelActivePartial', + }, + root = D, + }, + }, + imports = { + { + fields = { + 'tSellItem', + 'tProtectItem', + }, + root = D, + }, + }, +} +MY_AutoSell = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_AutoSell', function() + for _, k in ipairs({'tSellItem', 'tProtectItem'}) do + if D[k] then + X.SafeCall(X.Set, O, k, D[k]) + D[k] = nil + end + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_BigWarChecker.lua b/MY_Toolbox/src/MY_BigWarChecker.lua new file mode 100644 index 000000000..afe17779a --- /dev/null +++ b/MY_Toolbox/src/MY_BigWarChecker.lua @@ -0,0 +1,241 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 大战没交 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_BigWarChecker' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_BigWarChecker', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_BigWarChecker'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local function IsBigWarFinishable(me) + for _, aQuestInfo in ipairs(X.GetActivityQuest('DAILY_BIG_WAR')) do + local info = me.GetQuestTraceInfo(aQuestInfo[1]) + if info then + local finished = false + if info.finish then + finished = true + elseif not X.IsEmpty(info.quest_state) then + finished = true + for _, state in ipairs(info.quest_state) do + if state.need ~= state.have then + finished = false + end + end + end + if finished then + return true + end + end + end +end + +-- 大战没交 +X.RegisterFrameCreate('ExitPanel', 'BIG_WAR_CHECK', function(name, frame) + local me = X.GetClientPlayer() + if me then + local ui = X.UI(frame) + if IsBigWarFinishable(me) then + OutputWarningMessage('MSG_WARNING_RED', _L['Warning: Bigwar has been finished but not handed yet!']) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + if ui:Children('#Text_MY_Tip'):Count() == 0 then + ui:Append('Text', { name = 'Text_MY_Tip', y = ui:Height(), w = ui:Width(), color = {255, 255, 0}, font = 199, alignHorizontal = 1}) + end + ui:Children('#Text_MY_Tip'):Text(_L['Warning: Bigwar has been finished but not handed yet!']) + local nTick = GetTime() + local el = ui:Children('#Text_MY_Tip')[1] + local SCALE_ANIMATE_TIME, SHAKE_ANIMATE_TIME = 200, 200 + X.RenderCall(function() + if not X.IsElement(el) then + return 0 + end + local nTime = GetTime() - nTick + if nTime >= SCALE_ANIMATE_TIME then + el:SetFontScale(1) + ui:Children('#Text_MY_Tip'):Shake(10, 10, 10, SHAKE_ANIMATE_TIME) + return 0 + end + el:SetFontScale((1 - nTime / SCALE_ANIMATE_TIME) * 6 + 1) + end) + else + ui:Children('#Text_MY_Tip'):Remove() + end + end +end) +X.RegisterFrameCreate('OptionPanel', 'BIG_WAR_CHECK', function(name, frame) + local me = X.GetClientPlayer() + if me then + local ui = X.UI(frame) + if IsBigWarFinishable(me) then + if ui:Children('#Text_MY_Tip'):Count() == 0 then + ui:Append('Text', { name = 'Text_MY_Tip', y = -20, w = ui:Width(), color = {255, 255, 0}, font = 199, alignHorizontal = 1}) + end + ui:Children('#Text_MY_Tip') + :Text(_L['Warning: Bigwar has been finished but not handed yet!']) + :Shake(10, 10, 10, 1000) + else + ui:Children('#Text_MY_Tip'):Remove() + end + end +end) + +local TASK_STATE = { + ACCEPTABLE = 1, + ACCEPTED = 2, + FINISHABLE = 3, + FINISHED = 4, + UNACCEPTABLE = 5, + UNKNOWN = 6, +} +local function GetTaskState(me, dwQuestID, dwNpcTemplateID) + -- 获取身上任务状态 -1: 任务id非法 0: 任务不存在 1: 任务正在进行中 2: 任务完成但还没有交 3: 任务已完成 + local nState = me.GetQuestPhase(dwQuestID) + if nState == 1 then + return TASK_STATE.ACCEPTED + end + if nState == 2 then + return TASK_STATE.FINISHABLE + end + if nState == 3 then + return TASK_STATE.FINISHED + end + -- 获取任务状态 + if me.GetQuestState(dwQuestID) == QUEST_STATE.FINISHED then + return TASK_STATE.FINISHED + end + -- 获取是否可接 + local eCanAccept = me.CanAcceptQuest(dwQuestID, dwNpcTemplateID) + if eCanAccept == QUEST_RESULT.SUCCESS then + return TASK_STATE.ACCEPTABLE + end + if eCanAccept == QUEST_RESULT.ALREADY_ACCEPTED then + return TASK_STATE.ACCEPTED + end + if eCanAccept == QUEST_RESULT.FINISHED_MAX_COUNT then + return TASK_STATE.FINISHED + end + -- local KQuestInfo = GetQuestInfo(dwQuestID) + -- if KQuestInfo.bRepeat then -- 可重复任务没到达上限一定可接(有时候地图不对会误判不可接受) + -- return TASK_STATE.ACCEPTABLE + -- end + -- if eCanAccept == QUEST_RESULT.FAILED then + -- return TASK_STATE.UNACCEPTABLE + -- end + return TASK_STATE.UNKNOWN +end + +X.RegisterEvent('LOADING_END', 'MY_BigWarChecker', function() + if X.IS_REMAKE then + return + end + local me = X.GetClientPlayer() + local dwMapID = me.GetMapID() + -- 分析大战本状态数据 + local aQuestInfo = {} + for _, v in ipairs(X.GetActivityQuest('DAILY_BIG_WAR')) do + local tMap = {} + local szPos = Table_GetQuestPosInfo(v[1], 'quest_state', 1) + local szMaps = szPos and szPos:match('N ([%d|]+),') + if szMaps then + for _, szMap in ipairs(X.SplitString(szMaps, '|')) do + local dwMap = szMap and tonumber(szMap) + if dwMap then + tMap[dwMap] = true + end + end + end + table.insert(aQuestInfo, { + dwQuestID = v[1], + dwNpcTemplateID = v[2], + tMap = tMap, + eState = GetTaskState(me, v[1], v[2]), + }) + end + -- 分析一些不需要提示的情况 + for _, v in ipairs(aQuestInfo) do + -- 如果完成了大战直接返回 + if v.eState == TASK_STATE.FINISHED or v.eState == TASK_STATE.FINISHABLE then + return + end + -- 如果有可接的大战但是不在这个地图则返回 + if v.eState == TASK_STATE.ACCEPTABLE and not v.tMap[dwMapID] then + return + end + end + -- 否则如果没接当前地图大战就报警 + for _, v in ipairs(aQuestInfo) do + if v.tMap[dwMapID] and v.eState ~= TASK_STATE.ACCEPTED and v.eState ~= TASK_STATE.FINISHED then + local function fnAction() + OutputWarningMessage('MSG_WARNING_RED', _L['This map is big war map and you did not accepted the quest, is that correct?']) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + X.DelayCall(10000, fnAction) + fnAction() + return + end + end +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_BigWarChecker', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_BigWarChecker = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_DialogNameLink.lua b/MY_Toolbox/src/MY_DialogNameLink.lua new file mode 100644 index 000000000..bb5cd84fc --- /dev/null +++ b/MY_Toolbox/src/MY_DialogNameLink.lua @@ -0,0 +1,134 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 玩家名字变成link方便组队 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_DialogNameLink' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_DialogNameLink', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DialogNameLink'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.Apply() + if D.bReady and O.bEnable then + X.RegisterEvent('OPEN_WINDOW', 'NAMELINKER', function(event) + local h + for _, p in ipairs({ + {'Normal/DialoguePanel', '', 'Handle_Message'}, + {'Lowest2/PlotDialoguePanel', 'Wnd_Dialogue', 'Handle_Dialogue'}, + }) do + local frame = Station.Lookup(p[1]) + if frame and frame:IsVisible() then + h = frame:Lookup(p[2], p[3]) + if h then + break + end + end + end + if not h then + return + end + for i = 0, h:GetItemCount() - 1 do + local hItem = h:Lookup(i) + if hItem:GetType() == 'Text' then + local szText = hItem:GetText() + for _, szPattern in ipairs(_L.NAME_PATTERN_LIST) do + local _, _, szName = szText:find(szPattern) + if szName then + local nPos1, nPos2 = szText:find(szName) + h:InsertItemFromString(i, true, GetFormatText(szText:sub(nPos2 + 1), hItem:GetFontScheme())) + h:InsertItemFromString(i, true, GetFormatText('[' .. szText:sub(nPos1, nPos2) .. ']', nil, nil, nil, nil, nil, nil, 'namelink')) + local txtName = h:Lookup(i + 1) + X.RenderChatLink(txtName) + if MY_Farbnamen and MY_Farbnamen.Render then + MY_Farbnamen.Render(txtName, { bColor = false }) + end + hItem:SetText(szText:sub(1, nPos1 - 1)) + hItem:SetFontColor(0, 0, 0) + hItem:AutoSize() + break + end + end + end + end + h:FormatAllItemPos() + end) + else + X.RegisterEvent('OPEN_WINDOW', 'NAMELINKER', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_DialogNameLink', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.Apply, + }, + root = O, + }, + }, +} +MY_DialogNameLink = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_DialogNameLink', function() + D.bReady = true + D.Apply() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Domesticate.lua b/MY_Toolbox/src/MY_Domesticate.lua new file mode 100644 index 000000000..473bca5ef --- /dev/null +++ b/MY_Toolbox/src/MY_Domesticate.lua @@ -0,0 +1,379 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 驯养饥饿报警 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Domesticate' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_Domesticate', _L['General'], { + bAlert = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['Domesticate feed alert'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nAlertNum = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['Alert when measure'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 100, + }, + dwAutoFeedCubTabType = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['AutoFeedCubTabType'], + }), + xSchema = X.Schema.Optional(X.Schema.Number), + xDefaultValue = nil, + }, + dwAutoFeedCubTabIndex = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['AutoFeedCubTabIndex'], + }), + xSchema = X.Schema.Optional(X.Schema.Number), + xDefaultValue = nil, + }, + dwAutoFeedFoodTabType = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['AutoFeedFoodTabType'], + }), + xSchema = X.Schema.Optional(X.Schema.Number), + xDefaultValue = nil, + }, + dwAutoFeedFoodTabIndex = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['AutoFeedFoodTabIndex'], + }), + xSchema = X.Schema.Optional(X.Schema.Number), + xDefaultValue = nil, + }, + nAutoFeedFoodMeasure = { + ePathType = X.PATH_TYPE.ROLE, + eDefaultLocationOverride = X.CONSTANT.USER_SETTINGS_LOCATION_OVERRIDE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_Domesticate'], + _L['AutoFeedFoodMeasure'], + }), + xSchema = X.Schema.Optional(X.Schema.Number), + xDefaultValue = nil, + }, +}) +local D = {} + +function D.SetAutoFeed(dwAutoFeedCubTabType, dwAutoFeedCubTabIndex, dwAutoFeedFoodTabType, dwAutoFeedFoodTabIndex) + local bValid + if dwAutoFeedFoodTabType and dwAutoFeedFoodTabIndex then + local food = GetItemInfo(dwAutoFeedFoodTabType, dwAutoFeedFoodTabIndex) + if food then + local szText = MY.GetPureText(GetItemInfoTip(X.ENVIRONMENT.CURRENT_ITEM_VERSION, dwAutoFeedFoodTabType, dwAutoFeedFoodTabIndex), 'LUA') or '' + local szVal = szText:match(_L['measure (%d+) point']) + local nAutoFeedFoodMeasure = szVal and tonumber(szVal) + if nAutoFeedFoodMeasure then + O.dwAutoFeedCubTabType = dwAutoFeedCubTabType + O.dwAutoFeedCubTabIndex = dwAutoFeedCubTabIndex + O.dwAutoFeedFoodTabType = dwAutoFeedFoodTabType + O.dwAutoFeedFoodTabIndex = dwAutoFeedFoodTabIndex + O.nAutoFeedFoodMeasure = nAutoFeedFoodMeasure + bValid = true + end + end + end + if not bValid then + O.dwAutoFeedCubTabType = nil + O.dwAutoFeedCubTabIndex = nil + O.dwAutoFeedFoodTabType = nil + O.dwAutoFeedFoodTabIndex = nil + O.nAutoFeedFoodMeasure = nil + end + D.CheckAutoFeedEnable() +end + +function D.IsAutoFeedValid(me) + if not O.dwAutoFeedCubTabType or not O.dwAutoFeedCubTabIndex + or not O.dwAutoFeedFoodTabType or not O.dwAutoFeedFoodTabIndex + or not O.nAutoFeedFoodMeasure then + return false + end + local domesticate = me.GetDomesticate() + if not domesticate + or domesticate.dwCubTabType ~= O.dwAutoFeedCubTabType + or domesticate.dwCubTabIndex ~= O.dwAutoFeedCubTabIndex + or domesticate.nGrowthLevel == domesticate.nMaxGrowthLevel then + return false + end + return true +end + +function D.HookDomesticatePanel() + local btn = Station.Lookup('Normal/DomesticatePanel/Wnd_Satiation/Btn_Feed') + local box = Station.Lookup('Normal/DomesticatePanel/Wnd_Satiation', 'Box_Feed') + if btn and box then + btn.OnRButtonClick = function() + local me = X.GetClientPlayer() + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local menu = { + x = x, + y = y + h, + nMinWidth = w, + { + szOption = _L['Auto feed'], + bCheck = true, bChecked = D.IsAutoFeedValid(me), + fnAction = function() + if D.IsAutoFeedValid(me) then + D.SetAutoFeed() + X.OutputSystemAnnounceMessage(_L['Auto feed domesticate cancelled.']) + else + local domesticate = X.GetClientPlayer().GetDomesticate() + local dwCubTabType, dwCubTabIndex = domesticate.dwCubTabType, domesticate.dwCubTabIndex + local dwFoodTabType, dwFoodTabIndex = select(5, box:GetObjectData()) + if not domesticate then + return + end + D.SetAutoFeed(dwCubTabType, dwCubTabIndex, dwFoodTabType, dwFoodTabIndex) + + local szFoodName = X.GetItemInfoName(dwFoodTabType, dwFoodTabIndex) + local szDomesticateName = X.GetItemInfoName(dwCubTabType, dwCubTabIndex) + if D.IsAutoFeedValid(me) then + X.OutputSystemAnnounceMessage(_L('Set domesticate auto feed %s to %s succeed, will auto feed when hunger point reach %d.', + szFoodName, + szDomesticateName, + O.nAutoFeedFoodMeasure)) + else + X.OutputSystemAnnounceMessage(_L('Set domesticate auto feed %s to %s failed.', szFoodName, szDomesticateName)) + end + end + end, + }, + } + X.UI.PopupMenu(menu) + end + end +end + +function D.UnHookDomesticatePanel() + local btn = Station.Lookup('Normal/DomesticatePanel/Wnd_Satiation/Btn_Feed') + if btn then + btn.OnRButtonClick = nil + end +end + +function D.CheckAutoFeedEnable() + if D.bReady then + X.BreatheCall('MY_Domesticate__AutoFeed', 30000, function() + local me = X.GetClientPlayer() + if not me then + return + end + if me.bFightState then + return + end + if not D.IsAutoFeedValid(me) then + return 0 + end + local domesticate = me.GetDomesticate() + if not domesticate or domesticate.dwCubTabType == 0 then + return + end + if domesticate.nGrowthLevel >= domesticate.nMaxGrowthLevel then + local szDomesticate = X.GetItemInfoName(domesticate.dwCubTabType, domesticate.dwCubTabIndex) + X.OutputSystemAnnounceMessage(_L('Your domesticate %s is growth up!', szDomesticate)) + return + end + local nMeasure = domesticate.nMaxFullMeasure - domesticate.nFullMeasure + local nRound = math.floor(nMeasure / O.nAutoFeedFoodMeasure) + local bFeed = false + if nRound == 0 and domesticate.nFullMeasure == 0 then + nRound = 1 + end + for _ = 1, nRound do + X.IterInventoryItem(X.CONSTANT.INVENTORY_TYPE.PACKAGE, function(kItem, dwBox, dwX) + if kItem.dwTabType == O.dwAutoFeedFoodTabType and kItem.dwIndex == O.dwAutoFeedFoodTabIndex then + domesticate.Feed(dwBox, dwX) + bFeed = true + return 0 + end + end) + end + if nRound > 0 and not bFeed then + local szFood = X.GetItemInfoName(O.dwAutoFeedFoodTabType, O.dwAutoFeedFoodTabIndex) + local szDomesticate = X.GetItemInfoName(O.dwAutoFeedCubTabType, O.dwAutoFeedCubTabIndex) + X.OutputSystemAnnounceMessage(_L('No enough %s to feed %s!', szFood, szDomesticate)) + end + end) + else + X.BreatheCall('MY_Domesticate__AutoFeed', false) + end +end + +function D.CheckAlertEnable() + if D.bReady and O.bAlert then + X.BreatheCall('MY_Domesticate__Alert', 60000, function() + local me = X.GetClientPlayer() + if not me then + return + end + if me.bFightState then + return + end + local domesticate = me.GetDomesticate() + if not domesticate or domesticate.dwCubTabType == 0 then + return + end + if domesticate.nGrowthLevel >= domesticate.nMaxGrowthLevel then + local szDomesticate = X.GetItemInfoName(domesticate.dwCubTabType, domesticate.dwCubTabIndex) + OutputWarningMessage('MSG_WARNING_YELLOW', _L('Your domesticate %s is growth up!', szDomesticate)) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + return + end + if O.nAlertNum == 0 then + if domesticate.nFullMeasure == 0 and domesticate.nGrowthLevel < domesticate.nMaxGrowthLevel then + local szDomesticate = X.GetItemInfoName(domesticate.dwCubTabType, domesticate.dwCubTabIndex) + OutputWarningMessage('MSG_WARNING_YELLOW', _L('Your domesticate %s is hungery!', szDomesticate)) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + else + local nMeasure = domesticate.nMaxFullMeasure - domesticate.nFullMeasure + if nMeasure >= O.nAlertNum and domesticate.nGrowthLevel < domesticate.nMaxGrowthLevel then + local szDomesticate = X.GetItemInfoName(domesticate.dwCubTabType, domesticate.dwCubTabIndex) + OutputWarningMessage('MSG_WARNING_YELLOW', _L('Your domesticate %s available measure is %d point!', szDomesticate, nMeasure)) + PlaySound(SOUND.UI_SOUND, g_sound.CloseAuction) + end + end + end) + else + X.BreatheCall('MY_Domesticate__Alert', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Domesticate feed alert'], + checked = O.bAlert, + onCheck = function(bChecked) + MY_Domesticate.bAlert = bChecked + end, + }):Width() + 5 + ui:Append('WndSlider', { + x = nX, y = nY, w = 130, + value = O.nAlertNum, + range = {0, 1000}, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(val) + if val == 0 then + return _L['Alert when measure is empty'] + end + return _L('Alert when measure larger than %d', val) + end, + onChange = function(val) + O.nAlertNum = val + end, + autoEnable = function() return MY_Domesticate.bAlert end, + }) + nX = nPaddingX + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Domesticate', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bAlert', + 'nAlertNum', + 'dwAutoFeedCubTabType', + 'dwAutoFeedCubTabIndex', + 'dwAutoFeedFoodTabType', + 'dwAutoFeedFoodTabIndex', + 'nAutoFeedFoodMeasure', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bAlert', + 'nAlertNum', + 'dwAutoFeedCubTabType', + 'dwAutoFeedCubTabIndex', + 'dwAutoFeedFoodTabType', + 'dwAutoFeedFoodTabIndex', + 'nAutoFeedFoodMeasure', + }, + triggers = { + bAlert = D.CheckAlertEnable, + }, + root = O, + }, + }, +} +MY_Domesticate = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_Domesticate', function() + D.bReady = true + D.CheckAutoFeedEnable() + D.CheckAlertEnable() +end) +X.RegisterFrameCreate('DomesticatePanel', 'MY_Domesticate', D.HookDomesticatePanel) +X.RegisterReload('MY_Domesticate', D.UnHookDomesticatePanel) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_DynamicActionBarPos.lua b/MY_Toolbox/src/MY_DynamicActionBarPos.lua new file mode 100644 index 000000000..249c297ae --- /dev/null +++ b/MY_Toolbox/src/MY_DynamicActionBarPos.lua @@ -0,0 +1,240 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 记住动态技能栏上次位置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_DynamicActionBarPos' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_DynamicActionBarPos' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_DynamicActionBarPos', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicActionBarPos'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tAnchors = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicActionBarPos'], + _L['UI Anchor'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.FrameAnchor), + xDefaultValue = {}, + }, +}) +local D = {} + +local HOOK_FRAME_NAME = { + 'DynamicActionBar', -- 各种动态技能栏 + 'IdentityDynActBar', -- 身份开启栏 +} + +local REMPOS_FRAME_TYPE = X.FlipObjectKV({ + 'DynamicMutualBar', + 'DynamicActionBar2', -- 右下角特殊技能栏 + -- 'DynamicPetBar', -- 御兽技能栏 + -- 'DynamicCarrierBar', -- 射箭塔技能栏 + -- 'DashBoard', + 'IdentityDynActBar', +}) + +function D.UpdateAnchor(szName) + local frame = X.UI.LookupFrame(szName) + if not frame then + return + end + local szType = D.GetFrameType(frame) + if not szType or not REMPOS_FRAME_TYPE[szType] then + return + end + local an = O.tAnchors[szType] + if not an then + return + end + if frame.__MY_SetPoint then + frame:__MY_SetPoint(an.s, 0, 0, an.r, an.x, an.y) + else + frame:SetPoint(an.s, 0, 0, an.r, an.x, an.y) + end + frame:CorrectPos() +end + +function D.SaveAnchor(szName) + local frame = X.UI.LookupFrame(szName) + if not frame then + return + end + local szType = D.GetFrameType(frame) + if not szType or not REMPOS_FRAME_TYPE[szType] then + return + end + O.tAnchors[szType] = GetFrameAnchor(frame, 'TOP_LEFT') + O.tAnchors = O.tAnchors +end + +function D.GetFrameType(frame) + if frame:GetName() == 'DynamicActionBar' then + local el = frame:Lookup('Wnd_Left', 'Image_Leftbg') + if el then + local szImage, nFrame = el:GetImagePath() + if szImage:lower() == 'ui\\image\\jianghu\\jianghu06.uitex' and nFrame == 1 then + return 'DynamicActionBar2' + end + end + if frame:Lookup('Wnd_Left', 'Handle_Pet/Box_Pet') then + return 'DynamicPetBar' + end + end + return frame:GetName() +end + +function D.Hook(szName) + local function OnFrameCreate(frame) + if not frame then + return + end + local szType = D.GetFrameType(frame) + if not REMPOS_FRAME_TYPE[szType] then + return + end + if not frame.__MY_OnFrameDragEnd then + frame.__MY_OnFrameDragEnd = frame.OnFrameDragEnd + frame.OnFrameDragEnd = function() + D.SaveAnchor(szName) + end + end + if not frame.__MY_SetPoint then + frame.__MY_SetPoint = frame.SetPoint + frame.SetPoint = function(...) + if X.IsEmpty(O.tAnchors[szType]) then + frame.__MY_SetPoint(...) + end + end + end + end + X.RegisterFrameCreate(szName, 'MY_DynamicActionBarPos', function() + OnFrameCreate(arg0) + D.UpdateAnchor(szName) + end) + X.RegisterFrameCreate('UI_SCALED', 'MY_DynamicActionBarPos__' .. szName, function() + D.UpdateAnchor(szName) + end) + X.RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE', 'MY_DynamicActionBarPos__' .. szName, function() + D.SaveAnchor(szName) + end) + OnFrameCreate(X.UI.LookupFrame(szName)) +end + +function D.Unhook(szName) + local frame = X.UI.LookupFrame(szName) + if frame then + if frame.__MY_OnFrameDragEnd then + frame.OnFrameDragEnd = frame.__MY_OnFrameDragEnd + frame.__MY_OnFrameDragEnd = nil + end + if frame.__MY_SetPoint then + frame.SetPoint = frame.__MY_SetPoint + frame.__MY_SetPoint = nil + end + end + X.RegisterFrameCreate(szName, 'MY_DynamicActionBarPos', false) + X.RegisterFrameCreate('UI_SCALED', 'MY_DynamicActionBarPos__' .. szName, false) + X.RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE', 'MY_DynamicActionBarPos__' .. szName, false) +end + +function D.CheckEnable() + for _, szName in ipairs(HOOK_FRAME_NAME) do + if D.bReady and O.bEnable then + D.Hook(szName) + else + D.Unhook(szName) + end + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 130, + text = _L['Restore dynamic action bar pos'], + checked = MY_DynamicActionBarPos.bEnable, + onCheck = function() + MY_DynamicActionBarPos.bEnable = not MY_DynamicActionBarPos.bEnable + end, + }):AutoWidth() + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_DynamicActionBarPos', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'tAnchors', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'tAnchors', + }, + triggers = { + bEnable = D.CheckEnable, + }, + root = O, + }, + }, +} +MY_DynamicActionBarPos = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_DynamicActionBarPos', function() + D.bReady = true + D.CheckEnable() +end) + +X.RegisterReload('MY_DynamicActionBarPos', function() + for _, szName in ipairs(HOOK_FRAME_NAME) do + D.Unhook(szName) + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_DynamicItem.lua b/MY_Toolbox/src/MY_DynamicItem.lua new file mode 100644 index 000000000..9cf79ebf4 --- /dev/null +++ b/MY_Toolbox/src/MY_DynamicItem.lua @@ -0,0 +1,618 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 大战没交 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_DynamicItem' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_DynamicItem' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local SZ_INI = PLUGIN_ROOT .. '/ui/MY_DynamicItem.ini' + +local O = X.CreateUserSettingsModule('MY_DynamicItem', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicItem'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicItem'], + _L['Show background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nNum = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicItem'], + _L['Box number'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 16, + }, + nCol = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicItem'], + _L['Col number'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 16, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_DynamicItem'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { s = 'BOTTOMCENTER', r = 'BOTTOMCENTER', x = 26, y = -226 }, + }, +}) +local D = { + aList = {}, +} + +local MAP_MERGE = setmetatable({ + [296] = 297, -- 龙门绝境 + [410] = 297, -- 沧溟绝境 + [421] = 421, -- 浪客行·悬棺裂谷 + [422] = 421, -- 浪客行·桑珠草原 + [423] = 421, -- 浪客行·东水寨 + [424] = 421, -- 浪客行·湘竹溪 + [425] = 421, -- 浪客行·荒魂镇 + [433] = 421, -- 浪客行·有间客栈 + [434] = 421, -- 浪客行·绥梦山 + [435] = 421, -- 浪客行·华清宫 + [436] = 421, -- 浪客行·枫阳村 + [437] = 421, -- 浪客行·荒雪路 + [438] = 421, -- 浪客行·古祭坛 + [439] = 421, -- 浪客行·雾荧洞 + [440] = 421, -- 浪客行·阴风峡 + [441] = 421, -- 浪客行·翡翠瑶池 + [442] = 421, -- 浪客行·胡杨林道 + [443] = 421, -- 浪客行·浮景峰 + [461] = 421, -- 浪客行·落樱林 +}, {__index = X.CONSTANT.MAP_MERGE}) + +function D.GetMapID() + local dwMapID = X.GetClientPlayer().GetMapID() + return MAP_MERGE[dwMapID] or dwMapID +end + +function D.SaveMapConfig() + X.SaveLUAData( + {'userdata/dynamic_item/' .. D.GetMapID() .. '.jx3dat', X.PATH_TYPE.GLOBAL}, + D.aList, + { encoder = 'luatext', passphrase = false, crc = false }) +end + +function D.LoadMapConfig() + D.aList = X.LoadLUAData( + {'userdata/dynamic_item/' .. D.GetMapID() .. '.jx3dat', X.PATH_TYPE.GLOBAL}, + { passphrase = false }) + or X.LoadLUAData(PLUGIN_ROOT .. '/data/dynamic_item/{$branch}/' .. D.GetMapID() .. '.jx3dat') + or {} +end + +function D.GetFrame() + return Station.Lookup('Lowest/' .. MODULE_NAME) +end + +function D.CheckEnable() + if not X.GetClientPlayer() then + return + end + if D.bReady and O.bEnable then + X.UI.OpenFrame(SZ_INI, MODULE_NAME) + else + X.UI.CloseFrame(MODULE_NAME) + end +end + +function D.Reinit() + X.UI.CloseFrame(MODULE_NAME) + D.CheckEnable() +end + +function D.UpdateAnchor(frame) + local an = O.anchor + frame:SetPoint(an.s, 0, 0, an.r, an.x, an.y) +end + +function D.InitList(frame) + local nItemW = 0 + local hTotal = frame:Lookup('', '') + -- 列表 + local hList = hTotal:Lookup('Handle_List') + hList:Clear() + for i = 1, O.nNum do + local hItem = hList:AppendItemFromIni(SZ_INI, 'Handle_Item') + local box = hItem:Lookup('Box_Item') + box.nIndex = i + box.__bDrag = true + box.__tType = X.KvpToObject({ + { UI_OBJECT.ITEM , true }, + { UI_OBJECT.ITEM_INFO, true }, + { UI_OBJECT.TOY , true }, + }) + box.__szTypeErrorMsg = _L['Only item can be draged in'] + -- bind events + UpdateBoxObject(box, UI_OBJECT.MONEY, 0) + box.__OnItemLButtonDragEnd = box.OnItemLButtonDragEnd + nItemW = hItem:GetW() + end + hList:SetW(nItemW * O.nCol) + hList:FormatAllItemPos() + hList:SetSizeByAllItemSize() + local nListW, nListH = hList:GetSize() + -- 左右分隔符 + local hSplits = hTotal:Lookup('Handle_Splits') + hSplits:Clear() + for _ = 1, math.ceil(O.nNum / O.nCol) do + local hSplit = hSplits:AppendItemFromIni(SZ_INI, 'Handle_Split') + hSplit:SetW(nListW + hList:GetRelX() * 2) + hSplit:Lookup('Image_SplitR'):SetRelX(nListW + hList:GetRelX()) + hSplit:FormatAllItemPos() + end + hSplits:FormatAllItemPos() + hSplits:SetSizeByAllItemSize() + local nSplitsW, nSplitsH = hSplits:GetSize() + -- 界面大小 + hTotal:SetSize(nSplitsW, nSplitsH) + frame:SetSize(nSplitsW, nSplitsH) +end + +function D.UpdateCDText(txt, nTime) + if txt.nTime == nTime then + return + end + local nSec, szTime, nR, nG, nB = math.floor(nTime / X.ENVIRONMENT.GAME_FPS) + if nSec == 0 then + szTime, nR, nG, nB = '', 255, 255, 255 + else + local nH = math.floor(nSec / 3600) + local nM = math.floor(nSec / 60) % 60 + local nS = nSec % 60 + if nH > 0 then + if nM > 0 or nS > 0 then + nH = nH + 1 + end + szTime = nH ..'h' + nR, nG, nB = 255, 255, 255 + elseif nM > 0 then + if nS > 0 then + nM = nM + 1 + end + szTime = nM ..'m' + nR, nG, nB = 255, 255, 0 + elseif nS >= 0 then + if nS < 5 then + if not txt.nSpark or txt.nSpark >= 7 then + txt.nSpark = 0 + txt.bSpark = not txt.bSpark + end + if txt.bSpark then + nR, nG, nB = 255, 255, 255 + else + nR, nG, nB = 255, 0, 0 + end + txt.nSpark = txt.nSpark + 1 + else + nR, nG, nB = 255, 255, 0 + end + szTime = nS + end + end + txt:SetText(szTime) + txt:SetFontColor(nR, nG, nB) + txt.nTime = nTime +end + +function D.UpdateListCD(frame) + local me = X.GetClientPlayer() + if not me then + return + end + local bShowCD = X.GetNumberBit(GetUserPreferences(4380, 'c'), 2) == 1 + local hList = frame:Lookup('', 'Handle_List') + for i = 1, O.nNum do + local hItem = hList:Lookup(i - 1) + local box = hItem:Lookup('Box_Item') + local data, nTime = D.aList[i], 0 + if data then + if data[1] == UI_OBJECT.ITEM_INFO then + nTime = UpdataItemCDProgress(me, box, 0, data[2], data[3]) or 0 + elseif data[1] == UI_OBJECT.ITEM then + nTime = UpdataItemCDProgress(me, box, data[2], data[3]) or 0 + elseif data[1] == UI_OBJECT.TOY then + local toy = Table_GetToyBox(data[2]) + if toy then + local bCool, szType, nLeft, nInterval, nTotal = X.GetSkillCDProgress(me, toy.nSkillID, toy.nSkillLevel) + if bCool and nLeft > 0 then + box:SetObjectCoolDown(true) + box:SetCoolDownPercentage(1 - nLeft / nTotal) + else + box:SetObjectCoolDown(false) + end + nTime = nLeft + end + end + end + D.UpdateCDText(hItem:Lookup('Text_CD'), bShowCD and nTime or 0) + end +end + +function D.UpdateList(frame) + local hList = frame:Lookup('', 'Handle_List') + for i = 1, O.nNum do + local hItem = hList:Lookup(i - 1) + local box = hItem:Lookup('Box_Item') + local data = D.aList[i] + box.__OnItemClick = nil + if data then + if data[1] == UI_OBJECT.ITEM_INFO then + local nAmount = X.GetInventoryItemAmount(X.CONSTANT.INVENTORY_TYPE.PACKAGE, data[2], data[3], data[4]) + UpdateBoxObject(box, UI_OBJECT.ITEM_INFO, nil, data[2], data[3], data[4] or nAmount) + box:EnableObject(nAmount > 0) + elseif data[1] == UI_OBJECT.ITEM then + UpdateBoxObject(box, UI_OBJECT.ITEM, data[2], data[3]) + elseif data[1] == UI_OBJECT.TOY then + UpdateBoxObject(box, UI_OBJECT.TOY, data[2], false) + box.__OnItemClick = box.OnItemRButtonClick + else + UpdateBoxObject(box, UI_OBJECT.NONE) + end + else + UpdateBoxObject(box, UI_OBJECT.NONE) + end + box.OnItemLButtonClick = nil + box.OnItemRButtonClick = nil + box.OnItemLButtonDrag = nil + box.OnItemLButtonDragEnd = nil + end + D.UpdateListCD(frame) + D.UpdateItemVisible(frame) +end + +function D.ParseBoxItem(box) + local me = X.GetClientPlayer() + local data, tItem = {box:GetObject()} + if data[1] == UI_OBJECT.ITEM then + local KItem = X.GetInventoryItem(me, data[3], data[4]) + if KItem then + if data[3] == 0 then -- 玩家身上的装备 + tItem = {UI_OBJECT.ITEM, data[3], data[4]} + else + if KItem.nGenre == ITEM_GENRE.BOOK then + tItem = {UI_OBJECT.ITEM_INFO, KItem.dwTabType, KItem.dwIndex, KItem.nBookID} + else + tItem = {UI_OBJECT.ITEM_INFO, KItem.dwTabType, KItem.dwIndex} + end + end + end + elseif data[1] == UI_OBJECT.ITEM_INFO then + local KItemInfo = GetItemInfo(data[4], data[5]) + if KItemInfo then + if KItemInfo.nGenre == ITEM_GENRE.BOOK then + tItem = {UI_OBJECT.ITEM_INFO, data[4], data[5], data[7]} + else + tItem = {UI_OBJECT.ITEM_INFO, data[4], data[5]} + end + end + elseif data[1] == UI_OBJECT.TOY then + tItem = {UI_OBJECT.TOY, data[2]} + end + D.aList[box.nIndex] = tItem or {} +end + +function D.UpdateHotKey(frame) + local hList = frame:Lookup('', 'Handle_List') + for i = 1, O.nNum do + local nKey, bShift, bCtrl, bAlt = Hotkey.Get(MODULE_NAME .. '_' .. i) + hList:Lookup(i - 1):Lookup('Text_HotKey'):SetText(GetKeyShow(nKey, bShift, bCtrl, bAlt, true)) + end +end + +function D.UpdateItemVisible(frame) + local hList = frame:Lookup('', 'Handle_List') + local bShowItem = O.bShowBg or not Hand_IsEmpty() + for i = 1, O.nNum do + local hItem = hList:Lookup(i - 1) + hItem:SetVisible(bShowItem or not hItem:Lookup('Box_Item'):IsEmpty()) + end +end + +function D.UpdateBgVisible(frame) + local hList = frame:Lookup('', 'Handle_List') + local bShowBg = O.bShowBg or not Hand_IsEmpty() + for i = 1, O.nNum do + hList:Lookup(i - 1):Lookup('Image_ItemBg'):SetVisible(bShowBg) + end + frame:Lookup('', 'Handle_Splits'):SetVisible(bShowBg) + frame:SetDummyWnd(Hand_IsEmpty()) + D.UpdateItemVisible(frame) +end + +function D.OnFrameCreate() + D.LoadMapConfig() + D.InitList(this) + D.UpdateList(this) + D.UpdateHotKey(this) + D.UpdateAnchor(this) + D.UpdateBgVisible(this) + D.UpdateItemVisible(this) + + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('LOADING_ENDING') + this:RegisterEvent('EQUIP_ITEM_UPDATE') + this:RegisterEvent('BAG_ITEM_UPDATE') + this:RegisterEvent('HAND_PICK_OBJECT') + this:RegisterEvent('HAND_CLEAR_OBJECT') + this:RegisterEvent('HOT_KEY_RELOADED') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') +end + +function D.OnFrameBreathe() + D.UpdateListCD(this) +end + +function D.OnEvent(event) + if event == 'LOADING_ENDING' then + D.LoadMapConfig() + D.UpdateList(this) + elseif event == 'EQUIP_ITEM_UPDATE' or event == 'BAG_ITEM_UPDATE' then + D.UpdateList(this) + elseif event == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif event == 'HAND_PICK_OBJECT' then + D.UpdateBgVisible(this) + D.UpdateItemVisible(this) + elseif event == 'HAND_CLEAR_OBJECT' then + D.UpdateBgVisible(this) + D.UpdateItemVisible(this) + elseif event == 'HOT_KEY_RELOADED' then + D.UpdateHotKey(this) + elseif event == 'ON_ENTER_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L[MODULE_NAME]) + elseif event == 'ON_LEAVE_CUSTOM_UI_MODE' then + O.anchor = GetFrameAnchor(this) + UpdateCustomModeWindow(this, _L[MODULE_NAME]) + end +end + +function D.OnItemLButtonClick() + local name = this:GetName() + if name == 'Box_Item' then + if this.bIgnoreClick or this.bDisableClick then + return + end + if Hand_IsEmpty() then + local data = {this:GetObject()} + if data[1] == UI_OBJECT.ITEM_INFO then + local dwTabType, dwIndex, nBookID = data[4], data[5], data[7] + local dwBox, dwX = X.GetInventoryItemPos(X.CONSTANT.INVENTORY_TYPE.PACKAGE, dwTabType, dwIndex, nBookID) + if dwBox then + X.UseInventoryItem(dwBox, dwX) + end + elseif data[1] == UI_OBJECT.ITEM then + local dwBox, dwX = data[3], data[4] + X.UseInventoryItem(dwBox, dwX) + elseif this.__OnItemClick then + this.__OnItemClick() + end + else + X.ExecuteWithThis(this, D.OnItemLButtonDragEnd) + end + end +end + +function D.OnItemRButtonClick() + local name = this:GetName() + if name == 'Box_Item' then + D.OnItemLButtonClick() + end +end + +function D.OnItemLButtonDrag() + local name = this:GetName() + if name == 'Box_Item' then + this.bIgnoreClick = true + this.bDisableClick = true + this:SetObjectPressed(0) + if Hand_IsEmpty() and not this:IsEmpty() then + if IsCursorInExclusiveMode() then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.SRT_ERROR_CANCEL_CURSOR_STATE) + elseif X.GetNumberBit(GetUserPreferences(2145, 'c'), 8) == 1 and not IsShiftKeyDown() then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.SRT_ERROR_LOCK_ACTIONBAR_WHEN_DRAG) + else + Hand_Pick(this) + UpdateBoxObject(this, UI_OBJECT.NONE) + D.ParseBoxItem(this) + D.SaveMapConfig() + end + end + end +end + +function D.OnItemLButtonDragEnd() + local name = this:GetName() + if name == 'Box_Item' then + local wnd = Station.GetMouseOverWindow() + if not wnd or wnd:GetRoot() ~= this:GetRoot() then + return + end + if not this:IsEmpty() and X.GetNumberBit(GetUserPreferences(2145, 'c'), 8) == 1 and not IsShiftKeyDown() then + OutputMessage('MSG_ANNOUNCE_RED', g_tStrings.SRT_ERROR_LOCK_ACTIONBAR_WHEN_DRAG) + else + this.__OnItemLButtonDragEnd() + D.ParseBoxItem(this) + D.SaveMapConfig() + D.UpdateList(this:GetRoot()) + end + this.bIgnoreClick = nil + this.bDisableClick = nil + end +end + +for i = 1, 32 do + Hotkey.AddBinding( + MODULE_NAME .. '_' .. i, + _L('Dynamic item %d', i), + i == 1 and _L['MY Dynamic Item'] or '', + function() + local frame = D.GetFrame() + local hItem = frame and frame:Lookup('', 'Handle_List'):Lookup(i - 1) + if not hItem then + return + end + hItem:Lookup('Box_Item'):SetObjectPressed(1) + end, + function() + local frame = D.GetFrame() + local hItem = frame and frame:Lookup('', 'Handle_List'):Lookup(i - 1) + if not hItem then + return + end + hItem:Lookup('Box_Item'):SetObjectPressed(0) + X.ExecuteWithThis(hItem:Lookup('Box_Item'), D.OnItemLButtonClick) + end) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L[MODULE_NAME], + checked = MY_DynamicItem.bEnable, + onCheck = function(bChecked) + MY_DynamicItem.bEnable = bChecked + end, + tip = { + render = _L['Dynamic item bar for different map'], + position = X.UI.TIP_POSITION.TOP_BOTTOM, + }, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Show background'], + checked = MY_DynamicItem.bShowBg, + onCheck = function(bChecked) + MY_DynamicItem.bShowBg = bChecked + end, + autoEnable = function() return MY_DynamicItem.bEnable end, + }):Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, h = 25, w = 250, + range = {1, 32}, value = MY_DynamicItem.nNum, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(v) return _L('Box number: %d', v) end, + onChange = function(nVal) + X.DelayCall(function() MY_DynamicItem.nNum = nVal end) + end, + autoEnable = function() return MY_DynamicItem.bEnable end, + }):Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, h = 25, w = 250, + range = {1, 32}, value = MY_DynamicItem.nCol, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, + textFormatter = function(v) return _L('Col number: %d', v) end, + onChange = function(nVal) + X.DelayCall(function() MY_DynamicItem.nCol = nVal end) + end, + autoEnable = function() return MY_DynamicItem.bEnable end, + }):Width() + 5 + + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_DynamicItem', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'bShowBg', + 'nNum', + 'nCol', + 'anchor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bShowBg', + 'nNum', + 'nCol', + 'anchor', + }, + triggers = { + bEnable = D.CheckEnable, + bShowBg = D.Reinit, + nNum = D.Reinit, + nCol = D.Reinit, + anchor = D.Reinit, + }, + root = O, + }, + }, +} +MY_DynamicItem = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit(MODULE_NAME, function() + D.bReady = true + D.CheckEnable() +end) + +X.RegisterInit(MODULE_NAME, function() + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ExamTip.lua b/MY_Toolbox/src/MY_ExamTip.lua new file mode 100644 index 000000000..65f06b0d3 --- /dev/null +++ b/MY_Toolbox/src/MY_ExamTip.lua @@ -0,0 +1,290 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 科举助手 (台服用) +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ExamTip' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ExamTip', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- +local LOCAL_DATA_CACHE -- 本地题库 +local INPUT_DATA_CACHE = {} -- 玩家答题缓存 +local REMOTE_DATA_CACHE = {} -- 从服务器获取到的数据缓存 +local LAST_REMOTE_QUERY -- 最后一次网络查询的题目(防止重查) +local D = {} + +local function DisplayMessage(szText) + X.OutputSystemMessage(_L['Exam tip'], szText) +end + +local function IsCurrentQuestion(szQues) + local frame = Station.Lookup('Normal/ExaminationPanel') + if not frame then + return + end + return frame:Lookup('', 'Handle_ExamContents'):Lookup(0):GetText() == szQues +end + +local function ResolveAnswer(szAnsw) + local frame = Station.Lookup('Normal/ExaminationPanel') + if not frame then + return + end + for i = 1, 4 do + frame:Lookup('Wnd_Type1/CheckBox_T1No' .. i, 'Text_T1No' .. i):SetFontColor(0, 0, 0) + end + if szAnsw then + for i = 1, 4 do + if frame:Lookup('Wnd_Type1/CheckBox_T1No' .. i, 'Text_T1No' .. i):GetText() == szAnsw then + frame:Lookup('Wnd_Type1/CheckBox_T1No' .. i, 'Text_T1No' .. i):SetFontColor(255, 255, 0) + frame:Lookup('Wnd_Type1/CheckBox_T1No' .. i):Check(true) + return true + end + end + end + return false +end + +local function QueryData(szQues) + if LAST_REMOTE_QUERY == szQues then + return + end + LAST_REMOTE_QUERY = szQues + ResolveAnswer() + DisplayMessage(_L['Querying, please wait...']) + + if not LOCAL_DATA_CACHE then + LOCAL_DATA_CACHE = X.LoadLUAData({'config/examtip.jx3dat', X.PATH_TYPE.GLOBAL}, { passphrase = false }) + or X.LoadLUAData({'config/examtip.jx3dat', X.PATH_TYPE.GLOBAL}) + or {} + end + if LOCAL_DATA_CACHE[szQues] then + for _, szAnsw in ipairs(LOCAL_DATA_CACHE[szQues]) do + if ResolveAnswer(szAnsw) then + return DisplayMessage(_L['Local exam data matched.']) + end + end + end + + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/exam?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + search = szQues, + })), + success = function(html, status) + local res = X.DecodeJSON(html) + if not res then + return + end + if X.IsTable(res.data) and #res.data > 0 then + local qas = {} + for _, rec in ipairs(res.data) do + local question = X.Get(rec, {'title'}) + local options = X.Get(rec, {'options'}) + local answers = X.Get(rec, {'answers'}) + if X.IsString(question) and X.IsString(answers) then + options = X.DecodeJSON(options or '') + answers = X.DecodeJSON(answers or '') + if X.IsTable(answers) and X.IsNumber(answers[1]) and X.IsTable(options) and X.IsString(options[answers[1] + 1]) then + table.insert(qas, { question = question, answer = options[answers[1] + 1] }) + end + end + end + + for _, qa in ipairs(qas) do + if IsCurrentQuestion(qa.question) and ResolveAnswer(qa.answer) then + REMOTE_DATA_CACHE[qa.question] = qa.answer + return + end + end + + local szText = _L['No result matched, here\'s similar answers:'] + for _, qa in ipairs(qas) do + szText = szText .. '\n' .. _L('Question: %s\nAnswer: %s', qa.question, qa.answer) + end + DisplayMessage(szText) + else + if X.IsString(res.more) then + DisplayMessage(_L['No result found, here\'s from open search engine:'] .. '\n' .. res.more) + else + DisplayMessage(_L['No result found.']) + end + end + end, + error = function(html, status, connected) + DisplayMessage(_L['Loading failed.']) + end, + timeout = 10000, + }) +end + +function D.SubmitData(tExamData, bAllRight) + if X.IsDebugServer() or not MY_Serendipity.bEnable then + return + end + local data = {} + for szQues, aBody in pairs(tExamData) do + if not REMOTE_DATA_CACHE[szQues] then + table.insert(aBody, 1, szQues) + table.insert(data, X.ConvertToUTF8(aBody)) + end + end + if #data == 0 then + return + end + X.Ajax({ + url = MY_RSS.PUSH_BASE_URL .. '/api/exam/uploads', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + data = X.EncodeJSON(data), + perfect = bAllRight and 1 or 0, + }, + signature = X.SECRET['J3CX::EXAM_UPLOADS'], + success = function(html, status) + local res = X.DecodeJSON(html) + if X.IsRestricted('MY_ExamTip') or not res then + return + end + X.OutputSystemMessage(_L['Exam tip'], _L('%s record(s) commited, %s record(s) accepted!', res.received, res.accepted)) + end, + }) +end + +function D.GatherDataFromPanel() + local frame = Station.Lookup('Normal/ExaminationPanel') + if not (frame and frame:IsVisible()) then + return + end + local txtQues = frame:Lookup('', 'Handle_ExamContents'):Lookup(0) + if not txtQues then + return + end + local szQues, aBody = txtQues:GetText() + -- 单选 + if not aBody then + local wnd = frame:Lookup('Wnd_Type1') + if wnd and wnd:IsVisible() then + local aChoise, aChoosed = {}, {} + for i = 1, 4 do + local chk = wnd:Lookup('CheckBox_T1No' .. i) + if chk and chk:IsVisible() then + if chk:IsCheckBoxChecked() then + table.insert(aChoosed, #aChoise) + end + table.insert(aChoise, chk:Lookup('', 'Text_T1No' .. i):GetText()) + end + end + aBody = { 1, aChoise, aChoosed } + end + end + -- 多选 + if not aBody then + local wnd = frame:Lookup('Wnd_Type2') + if wnd and wnd:IsVisible() then + local aChoise, aChoosed = {}, {} + for i = 1, 4 do + local chk = wnd:Lookup('CheckBox_T2No' .. i) + if chk and chk:IsVisible() then + if chk:IsCheckBoxChecked() then + table.insert(aChoosed, #aChoise) + end + table.insert(aChoise, chk:Lookup('Text_T2No' .. i):GetText()) + end + end + aBody = { 2, aChoise, aChoosed } + end + end + -- 问答题 + if not aBody then + local wnd = frame:Lookup('Wnd_Type3') + if wnd and wnd:IsVisible() then + local edt = wnd:Lookup('Edit_Anwer') + aBody = { 3, edt and edt:GetText() or '' } + end + end + -- 看图单选 + if not aBody then + local wnd = frame:Lookup('Wnd_Type4') + if wnd and wnd:IsVisible() then + local aChoise, aChoosed = {}, {} + for i = 1, 4 do + local chk = wnd:Lookup('CheckBox_T4No' .. i) + if chk and chk:IsVisible() then + if chk:IsCheckBoxChecked() then + table.insert(aChoosed, #aChoise) + end + table.insert(aChoise, chk:Lookup('Text_T4No' .. i):GetText()) + end + end + aBody = { 4, aChoise, aChoosed } + end + end + return szQues, aBody +end + +do +local l_nExamPrintRemainSpace = 0 +local function OnFrameBreathe() + local szQues, aBody = D.GatherDataFromPanel() + if not X.IsRestricted('MY_ExamTip') then + QueryData(szQues) + end + if szQues and aBody then + INPUT_DATA_CACHE[szQues] = aBody + end + l_nExamPrintRemainSpace = X.GetClientPlayer().GetExamPrintRemainSpace() +end + +X.RegisterFrameCreate('ExaminationPanel', 'EXAM_TIP', function(name, frame) + frame.OnFrameBreathe = OnFrameBreathe +end) + +X.RegisterEvent('LOOT_ITEM', 'MY_EXAMTIP', function() + if X.IsEmpty(INPUT_DATA_CACHE) then + return + end + local item = GetItem(arg1) + if item and item.nUiId == 65814 then + local nBeforeExamPrintRemainSpace = l_nExamPrintRemainSpace + local tExamData = X.Clone(INPUT_DATA_CACHE) + INPUT_DATA_CACHE = {} + X.DelayCall(2000, function() + local bAllRight = nBeforeExamPrintRemainSpace - X.GetClientPlayer().GetExamPrintRemainSpace() == 100 + D.SubmitData(tExamData, bAllRight) + end) + end +end) +end + +X.RegisterEvent('OPEN_WINDOW', 'MY_EXAMTIP', function() + if X.IsEmpty(INPUT_DATA_CACHE) then + return + end + if X.StringFindW(arg1, _L['Congratulations you finished the exam, please visit Yangzhou next monday for result.']) then + local tExamData = X.Clone(INPUT_DATA_CACHE) + INPUT_DATA_CACHE = {} + D.SubmitData(tExamData, false) + end +end) + +X.RegisterReload('MY_ExamTip', function() + X.UI.CloseFrame('ExaminationPanel') +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_FooterTip.lua b/MY_Toolbox/src/MY_FooterTip.lua new file mode 100644 index 000000000..245e1b4b7 --- /dev/null +++ b/MY_Toolbox/src/MY_FooterTip.lua @@ -0,0 +1,409 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 好友、帮会成员脚下姓名显示 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_FooterTip' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_FooterTip', _L['General'], { + bFriend = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Friend headtop tips'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFriendNav = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Friend headtop tips nav'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bFriendDungeonHide = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Friend headtop hide in dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bTongMember = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Tong member headtop tips'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTongMemberNav = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Tong member headtop tips nav'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bTongMemberDungeonHide = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FooterTip'], + _L['Tong member headtop hide in dungeon'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.Apply() + -- 好友高亮 + if Navigator_Remove then + Navigator_Remove('MY_FRIEND_TIP') + end + if D.bReady and O.bFriend and not X.IsInShieldedMap() and (not O.bFriendDungeonHide or not X.IsInDungeonMap()) then + local hShaList = X.UI.GetShadowHandle('MY_FriendHeadTip') + if not hShaList.freeShadows then + hShaList.freeShadows = {} + end + hShaList:Show() + local function OnPlayerEnter(dwID) + local tar = X.GetPlayer(dwID) + local me = X.GetClientPlayer() + if not tar or not me + or X.IsCharacterIsolated(tar) ~= X.IsCharacterIsolated(me) then + return + end + local szGlobalID = X.GetPlayerGlobalID(tar) + local tFellowship = szGlobalID + and X.GetFellowshipInfo(szGlobalID) + or X.GetFellowshipInfo(dwID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei then + if O.bFriendNav and Navigator_SetID then + Navigator_SetID('MY_FRIEND_TIP.' .. dwID, TARGET.PLAYER, dwID, tFei.szName) + else + local sha = hShaList:Lookup(tostring(dwID)) + if not sha then + hShaList:AppendItemFromString('name="' .. dwID .. '"') + sha = hShaList:Lookup(tostring(dwID)) + end + local r, g, b, a = 255,255,255,255 + local szTip = '>> ' .. tFei.szName .. ' <<' + sha:ClearTriangleFanPoint() + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:AppendCharacterID(dwID, false, r, g, b, a, 0, 40, szTip, 0, 1) + sha:Show() + end + end + end + local function OnPlayerLeave(dwID) + if not D.bReady then + X.DelayCall(500, function() OnPlayerLeave(dwID) end) + return + end + if O.bFriendNav and Navigator_Remove then + Navigator_Remove('MY_FRIEND_TIP.' .. dwID) + else + local sha = hShaList:Lookup(tostring(dwID)) + if sha then + sha:Hide() + table.insert(hShaList.freeShadows, sha) + end + end + end + local function RescanNearby() + for _, p in ipairs(X.GetNearPlayer()) do + OnPlayerEnter(p.dwID) + end + end + RescanNearby() + X.RegisterEvent('ON_ISOLATED', 'MY_FRIEND_TIP', function(event) + -- dwCharacterID, nIsolated + local me = X.GetClientPlayer() + if arg0 == X.GetClientPlayerID() then + for _, p in ipairs(X.GetNearPlayer()) do + if X.IsCharacterIsolated(p) == X.IsCharacterIsolated(me) then + OnPlayerEnter(p.dwID) + else + OnPlayerLeave(p.dwID) + end + end + else + local tar = X.GetPlayer(arg0) + if tar then + if X.IsCharacterIsolated(tar) == X.IsCharacterIsolated(me) then + OnPlayerEnter(arg0) + else + OnPlayerLeave(arg0) + end + end + end + end) + X.RegisterEvent('PLAYER_ENTER_SCENE', 'MY_FRIEND_TIP', function(event) OnPlayerEnter(arg0) end) + X.RegisterEvent('PLAYER_LEAVE_SCENE', 'MY_FRIEND_TIP', function(event) OnPlayerLeave(arg0) end) + X.RegisterEvent('DELETE_FELLOWSHIP', 'MY_FRIEND_TIP', function(event) RescanNearby() end) + X.RegisterEvent('PLAYER_FELLOWSHIP_UPDATE', 'MY_FRIEND_TIP', function(event) RescanNearby() end) + X.RegisterEvent('PLAYER_FELLOWSHIP_CHANGE', 'MY_FRIEND_TIP', function(event) RescanNearby() end) + else + X.RegisterEvent('ON_ISOLATED', 'MY_FRIEND_TIP', false) + X.RegisterEvent('PLAYER_ENTER_SCENE', 'MY_FRIEND_TIP', false) + X.RegisterEvent('PLAYER_LEAVE_SCENE', 'MY_FRIEND_TIP', false) + X.RegisterEvent('DELETE_FELLOWSHIP', 'MY_FRIEND_TIP', false) + X.RegisterEvent('PLAYER_FELLOWSHIP_UPDATE', 'MY_FRIEND_TIP', false) + X.RegisterEvent('PLAYER_FELLOWSHIP_CHANGE', 'MY_FRIEND_TIP', false) + X.UI.GetShadowHandle('MY_FriendHeadTip'):Hide() + end + -- 帮会成员高亮 + if Navigator_Remove then + Navigator_Remove('MY_GUILDMEMBER_TIP') + end + if D.bReady and O.bTongMember and not X.IsInShieldedMap() and (not O.bTongMemberDungeonHide or not X.IsInDungeonMap()) then + local hShaList = X.UI.GetShadowHandle('MY_TongMemberHeadTip') + if not hShaList.freeShadows then + hShaList.freeShadows = {} + end + hShaList:Show() + local function OnPlayerEnter(dwID, nRetryCount) + nRetryCount = nRetryCount or 0 + if not D.bReady then + X.DelayCall(500, function() OnPlayerEnter(dwID, nRetryCount) end) + return + end + if nRetryCount > 5 then + return + end + local tar = X.GetPlayer(dwID) + local me = X.GetClientPlayer() + if not tar or not me + or me.dwTongID == 0 + or me.dwID == tar.dwID + or tar.dwTongID ~= me.dwTongID + or X.IsCharacterIsolated(tar) ~= X.IsCharacterIsolated(me) then + return + end + if tar.szName == '' then + X.DelayCall(500, function() OnPlayerEnter(dwID, nRetryCount + 1) end) + return + end + if O.bTongMemberNav and Navigator_SetID then + Navigator_SetID('MY_GUILDMEMBER_TIP.' .. dwID, TARGET.PLAYER, dwID, tar.szName) + else + local sha = hShaList:Lookup(tostring(dwID)) + if not sha then + hShaList:AppendItemFromString('name="' .. dwID .. '"') + sha = hShaList:Lookup(tostring(dwID)) + end + local r, g, b, a = 255,255,255,255 + local szTip = '> ' .. tar.szName .. ' <' + sha:ClearTriangleFanPoint() + sha:SetTriangleFan(GEOMETRY_TYPE.TEXT) + sha:AppendCharacterID(dwID, false, r, g, b, a, 0, 40, szTip, 0, 1) + sha:Show() + end + end + local function OnPlayerLeave(dwID) + if not D.bReady then + X.DelayCall(500, function() OnPlayerLeave(dwID) end) + return + end + if O.bTongMemberNav and Navigator_Remove then + Navigator_Remove('MY_GUILDMEMBER_TIP.' .. dwID) + else + local sha = hShaList:IsValid() and hShaList:Lookup(tostring(dwID)) + if sha then + sha:Hide() + table.insert(hShaList.freeShadows, sha) + end + end + end + for _, p in ipairs(X.GetNearPlayer()) do + OnPlayerEnter(p.dwID) + end + X.RegisterEvent('ON_ISOLATED', 'MY_GUILDMEMBER_TIP', function(event) + -- dwCharacterID, nIsolated + local me = X.GetClientPlayer() + if arg0 == X.GetClientPlayerID() then + for _, p in ipairs(X.GetNearPlayer()) do + if X.IsCharacterIsolated(p) == X.IsCharacterIsolated(me) then + OnPlayerEnter(p.dwID) + else + OnPlayerLeave(p.dwID) + end + end + else + local tar = X.GetPlayer(arg0) + if tar then + if X.IsCharacterIsolated(tar) == X.IsCharacterIsolated(me) then + OnPlayerEnter(arg0) + else + OnPlayerLeave(arg0) + end + end + end + end) + X.RegisterEvent('PLAYER_ENTER_SCENE', 'MY_GUILDMEMBER_TIP', function(event) OnPlayerEnter(arg0) end) + X.RegisterEvent('PLAYER_LEAVE_SCENE', 'MY_GUILDMEMBER_TIP', function(event) OnPlayerLeave(arg0) end) + else + X.RegisterEvent('ON_ISOLATED', 'MY_GUILDMEMBER_TIP', false) + X.RegisterEvent('PLAYER_ENTER_SCENE', 'MY_GUILDMEMBER_TIP', false) + X.RegisterEvent('PLAYER_LEAVE_SCENE', 'MY_GUILDMEMBER_TIP', false) + X.UI.GetShadowHandle('MY_TongMemberHeadTip'):Hide() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + -- 好友高亮 + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Friend headtop tips'], + checked = MY_FooterTip.bFriend, + onCheck = function(bCheck) + MY_FooterTip.bFriend = not MY_FooterTip.bFriend + end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Friend headtop hide in dungeon'], + checked = MY_FooterTip.bFriendDungeonHide, + onCheck = function(bCheck) + MY_FooterTip.bFriendDungeonHide = not MY_FooterTip.bFriendDungeonHide + end, + autoEnable = function() return MY_FooterTip.bFriend end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Friend headtop tips nav'], + checked = MY_FooterTip.bFriendNav, + onCheck = function(bCheck) + MY_FooterTip.bFriendNav = not MY_FooterTip.bFriendNav + end, + autoEnable = function() return MY_FooterTip.bFriend end, + }):Width() + 5 + nY = nY + nLH + + -- 帮会高亮 + nX = nPaddingX + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Tong member headtop tips'], + checked = MY_FooterTip.bTongMember, + onCheck = function(bCheck) + MY_FooterTip.bTongMember = not MY_FooterTip.bTongMember + end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Tong member headtop hide in dungeon'], + checked = MY_FooterTip.bTongMemberDungeonHide, + onCheck = function(bCheck) + MY_FooterTip.bTongMemberDungeonHide = not MY_FooterTip.bTongMemberDungeonHide + end, + autoEnable = function() return MY_FooterTip.bTongMember end, + }):Width() + 5 + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Tong member headtop tips nav'], + checked = MY_FooterTip.bTongMemberNav, + onCheck = function(bCheck) + MY_FooterTip.bTongMemberNav = not MY_FooterTip.bTongMemberNav + end, + autoEnable = function() return MY_FooterTip.bTongMember end, + }):Width() + 5 + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_FooterTip', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bFriend', + 'bFriendNav', + 'bFriendDungeonHide', + 'bTongMember', + 'bTongMemberNav', + 'bTongMemberDungeonHide', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bFriend', + 'bFriendNav', + 'bFriendDungeonHide', + 'bTongMember', + 'bTongMemberNav', + 'bTongMemberDungeonHide', + }, + triggers = { + bFriend = D.Apply, + bFriendNav = D.Apply, + bFriendDungeonHide = D.Apply, + bTongMember = D.Apply, + bTongMemberNav = D.Apply, + bTongMemberDungeonHide = D.Apply, + }, + root = O, + }, + }, +} +MY_FooterTip = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_FooterTip', function() + D.bReady = true + D.Apply() +end) +X.RegisterUserSettingsRelease('MY_FooterTip', function() + D.bReady = false +end) +X.RegisterEvent('LOADING_ENDING', 'MY_FooterTip', D.Apply) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_FriendTipLocation.lua b/MY_Toolbox/src/MY_FriendTipLocation.lua new file mode 100644 index 000000000..aba310cba --- /dev/null +++ b/MY_Toolbox/src/MY_FriendTipLocation.lua @@ -0,0 +1,151 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 好友界面显示所有好友位置 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_FriendTipLocation' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_FriendTipLocation' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_FriendTipLocation', { ['*'] = false }) +X.RegisterRestriction('MY_FriendTipLocation.LV2', { ['*'] = true }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_FriendTipLocation', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_FriendTipLocation'], + _L['Enable'], + }), + szRestriction = 'MY_FriendTipLocation', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.Hook() + local frame = Station.Lookup('Normal/FriendTip') + if not frame then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + local txtName = frame:Lookup('', 'Text_Name') + local txtTitle = frame:Lookup('Wnd_Friend', 'Text_WhereT') + local txtLocation = frame:Lookup('Wnd_Friend', 'Text_Where') + if not (txtName and txtTitle and txtLocation) then + return + end + if not txtLocation.__MY_SetText then + txtLocation.__MY_SetText = txtLocation.SetText + txtLocation.SetText = function(_, szText) + local tFellowship = txtName and X.GetFellowshipInfo(txtName:GetText()) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei and ((X.IsFellowshipTwoWay(tFellowship.xID) and tFellowship.nAttraction >= 200) or not X.IsRestricted('MY_FriendTipLocation.LV2')) then + szText = Table_GetMapName(X.GetFellowshipMapID(tFellowship.xID)) + if (me.nCamp == CAMP.EVIL and tFei.nCamp == CAMP.GOOD) + or (me.nCamp == CAMP.GOOD and tFei.nCamp == CAMP.EVIL) then + szText = szText .. _L['(Different camp)'] + end + end + txtLocation:__MY_SetText(szText) + end + end +end + +function D.Unhook() + X.UI.CloseFrame('FriendTip') +end + +function D.CheckEnable() + if D.bReady and O.bEnable and not X.IsRestricted('MY_FriendTipLocation') then + D.Hook() + X.RegisterFrameCreate('FriendTip', 'MY_FriendTipLocation', D.Hook) + else + D.Unhook() + X.RegisterFrameCreate('FriendTip', 'MY_FriendTipLocation', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + if not X.IsRestricted('MY_FriendTipLocation') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Show all friend tip location'], + checked = MY_FriendTipLocation.bEnable, + onCheck = function(bChecked) + MY_FriendTipLocation.bEnable = bChecked + end, + }):AutoWidth():Width() + 5 + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_FriendTipLocation', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.CheckEnable, + }, + root = O, + }, + }, +} +MY_FriendTipLocation = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_FriendTipLocation', function() + D.bReady = true + D.CheckEnable() +end) +X.RegisterReload('MY_FriendTipLocation', D.Unhook) +X.RegisterEvent('MY_RESTRICTION', 'MY_FriendTipLocation', function() + if arg0 and arg0 ~= 'MY_FriendTipLocation' then + return + end + D.CheckEnable() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_GongzhanCheck.lua b/MY_Toolbox/src/MY_GongzhanCheck.lua new file mode 100644 index 000000000..b61833908 --- /dev/null +++ b/MY_Toolbox/src/MY_GongzhanCheck.lua @@ -0,0 +1,151 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 检测附近共战 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_GongzhanCheck' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = {} +local O = { + nGongzhanPublishChannel = PLAYER_TALK_CHANNEL.LOCAL_SYS, +} + +local tChannels = { + { nChannel = PLAYER_TALK_CHANNEL.LOCAL_SYS, szName = _L['PTC_LOCAL_SYS_CHANNEL'], rgb = GetMsgFontColor('MSG_SYS' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.TEAM , szName = _L['PTC_TEAM_CHANNEL' ], rgb = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.RAID , szName = _L['PTC_RAID_CHANNEL' ], rgb = GetMsgFontColor('MSG_TEAM' , true) }, + { nChannel = PLAYER_TALK_CHANNEL.TONG , szName = _L['PTC_TONG_CHANNEL' ], rgb = GetMsgFontColor('MSG_GUILD' , true) }, +} +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + ui:Append('WndButton', { + x = nW - 130, y = 30, + text = _L['Check nearby gongzhan'], + onLClick = function() + if X.BreatheCall('MY_GongzhanCheck') then + X.BreatheCall('MY_GongzhanCheck', false) + else + -- 逻辑:两次遍历附近的人 第一次同步数据 第二次输出数据 + local me = X.GetClientPlayer() + local nChannel = O.nGongzhanPublishChannel or PLAYER_TALK_CHANNEL.LOCAL_SYS + local dwTarType, dwTarID = X.GetCharacterTarget(me) + local aPendingID = X.GetNearPlayerID() -- 等待扫描的玩家 + local aProcessID = X.Clone(aPendingID) -- 等待输出的玩家 + local aGongZhan = {} -- 扫描到的共战数据 + local nCount, nIndex = #aPendingID, 1 + local function Echo(nIndex, nCount) + X.OutputAnnounceMessage(_L('Scanning gongzhan: %d/%d', nIndex, nCount)) + end + X.RenderCall('MY_GongzhanCheck', function() + local bTermial, bStep + if nIndex <= nCount then -- 获取下一个有效的扫描目标 + local dwID = aPendingID[nIndex] + local tar = X.GetPlayer(dwID) + while not tar and nIndex <= nCount do + Echo(nIndex, nCount * 2 + 1) + nIndex = nIndex + 1 + dwID = aPendingID[nIndex] + tar = X.GetPlayer(dwID) + end + if tar then + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + if dwType ~= TARGET.PLAYER or dwID ~= tar.dwID then -- 设置目标同步BUFF数据 + X.SetClientPlayerTarget(TARGET.PLAYER, tar.dwID) + else + Echo(nIndex, nCount * 2 + 1) + nIndex = nIndex + 1 + end + end + elseif nIndex <= nCount * 2 then -- 获取下一个有效的输出目标 + local dwID = aProcessID[nIndex - nCount] + local tar = X.GetPlayer(dwID) + while not tar and nIndex <= nCount * 2 do + Echo(nIndex, nCount * 2 + 1) + nIndex = nIndex + 1 + dwID = aProcessID[nIndex - nCount] + tar = X.GetPlayer(dwID) + end + if tar then + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + if dwType ~= TARGET.PLAYER or dwID ~= tar.dwID then -- 先设置目标才能获取BUFF数据 + X.SetClientPlayerTarget(TARGET.PLAYER, tar.dwID) + else + -- 检测是否有共战 + for _, buff in X.ipairs_c(X.GetBuffList(tar)) do + if (not buff.bCanCancel) and string.find(Table_GetBuffName(buff.dwID, buff.nLevel), _L['GongZhan']) ~= nil then + local info = Table_GetBuff(buff.dwID, buff.nLevel) + if info and info.bShow ~= 0 then + table.insert(aGongZhan, { szName = tar.szName, nTime = (buff.nEndFrame - GetLogicFrameCount()) / 16 }) + end + end + end + Echo(nIndex, nCount * 2 + 1) + nIndex = nIndex + 1 + end + end + else + Echo(nIndex, nCount * 2 + 1) + X.SendChat(nChannel, _L['------------------------------------']) + for _, r in ipairs(aGongZhan) do + X.SendChat(nChannel, _L('Detected [%s] has GongZhan buff for %s.', r.szName, X.FormatDuration(r.nTime, 'CHINESE'))) + end + X.SendChat(nChannel, _L('Nearby GongZhan Total Count: %d.', #aGongZhan)) + X.SendChat(nChannel, _L['------------------------------------']) + X.SetClientPlayerTarget(dwTarType, dwTarID) + return 0 + end + end) + end + end, + menuRClick = function() + local t = { { szOption = _L['send to ...'], bDisable = true }, { bDevide = true } } + for _, tChannel in ipairs(tChannels) do + table.insert( t, { + szOption = tChannel.szName, + rgb = tChannel.rgb, + bCheck = true, bMCheck = true, bChecked = O.nGongzhanPublishChannel == tChannel.nChannel, + fnAction = function() + O.nGongzhanPublishChannel = tChannel.nChannel + end + } ) + end + return t + end, + }) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_GongzhanCheck', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_GongzhanCheck = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_HideAnnounceBg.lua b/MY_Toolbox/src/MY_HideAnnounceBg.lua new file mode 100644 index 000000000..93461a463 --- /dev/null +++ b/MY_Toolbox/src/MY_HideAnnounceBg.lua @@ -0,0 +1,104 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 隐藏公告栏背景 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_HideAnnounceBg' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_HideAnnounceBg', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_HideAnnounceBg'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.Apply() + if D.bReady and O.bEnable then + local h = Station.Lookup('Topmost2/GMAnnouncePanel', 'Handle_MsgBg') + if h then + h:Hide() + end + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Hide announce bg'], + checked = MY_HideAnnounceBg.bEnable, + onCheck = function(bChecked) + MY_HideAnnounceBg.bEnable = bChecked + end, + }):AutoWidth():Width() + 5 + -- x, y = X, y + 25 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_HideAnnounceBg', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.Apply, + }, + root = O, + }, + }, +} +MY_HideAnnounceBg = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_HideAnnounceBg', function() + D.bReady = true + D.Apply() +end) +X.RegisterFrameCreate('GMAnnouncePanel', 'MY_HideAnnounceBg', D.Apply) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_InfoTip.lua b/MY_Toolbox/src/MY_InfoTip.lua new file mode 100644 index 000000000..301bd6763 --- /dev/null +++ b/MY_Toolbox/src/MY_InfoTip.lua @@ -0,0 +1,927 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 信息条显示 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_InfoTip' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_InfoTip' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local CONFIG_FILE_PATH = {'config/infotip.jx3dat', X.PATH_TYPE.ROLE} +local INFO_TIP_LIST = { + -- 网络延迟 + { + id = 'Ping', + i18n = { + name = _L['Ping monitor'], prefix = _L['Ping: '], content = '%d', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__Ping', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 95, 255, 95 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 48, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Ping monitor'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -133, y = -111, s = 'BOTTOMCENTER', r = 'BOTTOMCENTER' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = {}, + GetFormatString = function(data) + return string.format(data.cache.formatString, GetPingValue() / 2) + end, + }, + -- 倍速显示(显示服务器有多卡……) + { + id = 'TimeMachine', + i18n = { + name = _L['Time machine'], prefix = _L['Rate: '], content = 'x%.2f', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__TimeMachine', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 31, 255, 31 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Time machine'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -276, y = -111, s = 'BOTTOMCENTER', r = 'BOTTOMCENTER' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = { + tTimeMachineRec = {}, + nTimeMachineLFC = GetLogicFrameCount(), + }, + GetFormatString = function(data) + local s = 1 + if data.cache.nTimeMachineLFC ~= GetLogicFrameCount() then + local tm = data.cache.tTimeMachineRec[X.ENVIRONMENT.GAME_FPS] or {} + tm.frame = GetLogicFrameCount() + tm.tick = GetTickCount() + for i = X.ENVIRONMENT.GAME_FPS, 1, -1 do + data.cache.tTimeMachineRec[i] = data.cache.tTimeMachineRec[i - 1] + end + data.cache.tTimeMachineRec[1] = tm + data.cache.nTimeMachineLFC = GetLogicFrameCount() + end + local tm = data.cache.tTimeMachineRec[X.ENVIRONMENT.GAME_FPS] + if tm then + s = 1000 * (GetLogicFrameCount() - tm.frame) / X.ENVIRONMENT.GAME_FPS / (GetTickCount() - tm.tick) + end + return string.format(data.cache.formatString, s) + end, + }, + -- 目标距离 + { + id = 'Distance', + i18n = { + name = _L['Target distance'], prefix = _L['Distance: '], content = _L['%.1f Foot'], + }, + config = X.CreateUserSettingsModule('MY_InfoTip__Distance', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bPlaceholder = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Placeholder'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 255, 0 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 209, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Target distance'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 203, y = -106, s = 'CENTER', r = 'CENTER' }, + }, + }), + options = { + bPlaceholder = true, + }, + cache = {}, + GetFormatString = function(data) + local me = X.GetClientPlayer() + local p = X.GetTargetHandle(X.GetCharacterTarget(me)) + local s = data.config.bPlaceholder and _L['No Target'] or '' + if me and p then + s = string.format(data.cache.formatString, X.GetCharacterDistance(me, p)) + end + return s + end, + }, + -- 系统时间 + { + id = 'SysTime', + i18n = { + name = _L['System time'], prefix = _L['Time: '], content = '%02d:%02d:%02d', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__SysTime', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 255, 255 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['System time'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 285, y = -18, s = 'BOTTOMLEFT', r = 'BOTTOMLEFT' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = {}, + GetFormatString = function(data) + local tDateTime = TimeToDate(GetCurrentTime()) + return string.format(data.cache.formatString, tDateTime.hour, tDateTime.minute, tDateTime.second) + end, + }, + -- 战斗计时 + { + id = 'FightTime', + i18n = { + name = _L['Fight clock'], prefix = _L['Fight Clock: '], content = '', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__FightTime', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bPlaceholder = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Placeholder'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 0, 128 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 199, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Fight clock'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = 353, y = -117, s = 'BOTTOMCENTER', r = 'BOTTOMCENTER' }, + }, + }), + options = { + bPlaceholder = true, + }, + cache = {}, + GetFormatString = function(data) + if X.GetFightUUID() or X.GetLastFightUUID() then + return data.cache.formatString .. X.GetFightTime('H:mm:ss') + end + return data.config.bPlaceholder and _L['Never Fight'] or '' + end, + }, + -- 莲花和藕倒计时 + { + id = 'LotusTime', + i18n = { + name = _L['Lotus clock'], prefix = _L['Lotus Clock: '], content = '%d:%d:%d', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__LotusTime', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 255, 255 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Lotus clock'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -290, y = -38, s = 'BOTTOMRIGHT', r = 'BOTTOMRIGHT' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = {}, + GetFormatString = function(data) + local nTotal = 6 * 60 * 60 - GetLogicFrameCount() / 16 % (6 * 60 * 60) + return string.format(data.cache.formatString, math.floor(nTotal / (60 * 60)), math.floor(nTotal / 60 % 60), math.floor(nTotal % 60)) + end, + }, + -- 角色坐标 + { + id = 'GPS', + i18n = { + name = _L['GPS'], prefix = _L['Location: '], content = '[%d]%d,%d,%d', + }, + config = X.CreateUserSettingsModule('MY_InfoTip__GPS', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 255, 255 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['GPS'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -21, y = 250, s = 'TOPRIGHT', r = 'TOPRIGHT' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = {}, + GetFormatString = function(data) + local player, text = X.GetClientPlayer(), '' + if player then + text = string.format(data.cache.formatString, player.GetMapID(), player.nX, player.nY, player.nZ) + end + return text + end, + }, + -- 角色速度 + { + id = 'Speedometer', + i18n = { + name = _L['Speedometer'], prefix = _L['Speed: '], content = _L['%.2f f/s'], + }, + config = X.CreateUserSettingsModule('MY_InfoTip__Speedometer', _L['System'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowBg = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['Background'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bShowTitle = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['Title'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + rgb = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['Font Color'], + }), + xSchema = X.Schema.Tuple(X.Schema.Number, X.Schema.Number, X.Schema.Number), + xDefaultValue = { 255, 255, 255 }, + }, + nFont = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['Font'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 0, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_InfoTip'], + szDescription = X.MakeCaption({ + _L['MY_InfoTip'], + _L['Speedometer'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = { x = -10, y = 210, s = 'TOPRIGHT', r = 'TOPRIGHT' }, + }, + }), + options = { + bPlaceholder = false, + }, + cache = { + tSpeedometerRec = {}, + nSpeedometerLFC = GetLogicFrameCount(), + }, + GetFormatString = function(data) + local s = 0 + local me = X.GetClientPlayer() + if me and data.cache.nSpeedometerLFC ~= GetLogicFrameCount() then + local sm = data.cache.tSpeedometerRec[X.ENVIRONMENT.GAME_FPS] or {} + sm.framecount = GetLogicFrameCount() + sm.x, sm.y, sm.z = me.nX, me.nY, me.nZ + for i = X.ENVIRONMENT.GAME_FPS, 1, -1 do + data.cache.tSpeedometerRec[i] = data.cache.tSpeedometerRec[i - 1] + end + data.cache.tSpeedometerRec[1] = sm + data.cache.nSpeedometerLFC = GetLogicFrameCount() + end + local sm = data.cache.tSpeedometerRec[X.ENVIRONMENT.GAME_FPS] + if sm and me then + s = math.sqrt(math.pow(me.nX - sm.x, 2) + math.pow(me.nY - sm.y, 2) + math.pow((me.nZ - sm.z) / 8, 2)) / 64 + / (GetLogicFrameCount() - sm.framecount) * X.ENVIRONMENT.GAME_FPS + end + return string.format(data.cache.formatString, s) + end + }, +} +local D = {} + +-- 显示信息条 +function D.ReinitUI() + for _, data in ipairs(INFO_TIP_LIST) do + local ui = X.UI('Normal/MY_InfoTip_' .. data.id) + if data.config.bEnable then + if ui:Count() == 0 then + ui = X.UI.CreateFrame('MY_InfoTip_' .. data.id, { theme = X.UI.FRAME_THEME.EMPTY }) + :Size(220,30) + :Event( + 'UI_SCALED', + function() + X.UI(this):Anchor(data.config.anchor) + end) + :CustomLayout(data.i18n.name) + :CustomLayout(function(bEnter, anchor) + if bEnter then + X.UI(this):BringToTop() + else + data.config.anchor = anchor + end + end) + :Drag(0, 0, 0, 0) + :Drag(false) + :Penetrable(true) + ui:Append('Image', { + name = 'Image_Default', + w = 220, h = 30, + alpha = 180, + image = 'UI/Image/UICommon/Commonpanel.UITex', imageFrame = 86, + }) + local txt = ui:Append('Text', { + name = 'Text_Default', + w = 220, h = 30, + text = data.i18n.name, + font = 2, alignVertical = 1, alignHorizontal = 1, + }) + ui:Breathe(function() txt:Text(data.GetFormatString(data)) end) + end + data.cache.formatString = data.config.bShowTitle + and data.i18n.prefix .. data.i18n.content + or data.i18n.content + ui:Fetch('Image_Default'):Visible(data.config.bShowBg) + ui:Fetch('Text_Default') + :Font(data.config.nFont or 0) + :Color(data.config.rgb or { 255, 255, 255 }) + ui:Anchor(data.config.anchor) + else + ui:Remove() + end + end +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('CUSTOM_UI_MODE_SET_DEFAULT', function() + for _, v in ipairs(INFO_TIP_LIST) do + v.config('reset', {'anchor'}) + end + D.ReinitUI() +end) + +X.RegisterUserSettingsInit('MY_InfoTip', function() + D.ReinitUI() +end) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- + +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nX, nY = 45, 40 + + ui:Append('Text', { + name = 'Text_InfoTip', + x = nX, y = nY, w = 350, + text = _L['Infomation tips'], + color = {255, 255, 0}, + }) + nY = nY + 5 + + for _, data in ipairs(INFO_TIP_LIST) do + nX, nY = 60, nY + 30 + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_InfoTip_' .. data.id, + x = nX, y = nY, w = 250, + text = data.i18n.name, + checked = data.config.bEnable or false, + onCheck = function(bChecked) + data.config.bEnable = bChecked + D.ReinitUI() + end, + }) + nX = nX + 220 + + if data.options.bPlaceholder then + ui:Append('WndCheckBox', { + name = 'WndCheckBox_InfoTipPlaceholder_' .. data.id, + x = nX, y = nY, w = 100, + text = _L['Placeholder'], + checked = data.config.bPlaceholder or false, + onCheck = function(bChecked) + data.config.bPlaceholder = bChecked + D.ReinitUI() + end, + }) + end + nX = nX + 100 + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_InfoTipTitle_' .. data.id, + x = nX, y = nY, w = 60, + text = _L['Title'], + checked = data.config.bShowTitle or false, + onCheck = function(bChecked) + data.config.bShowTitle = bChecked + D.ReinitUI() + end, + }) + nX = nX + 70 + + ui:Append('WndCheckBox', { + name = 'WndCheckBox_InfoTipBg_' .. data.id, + x = nX, y = nY, w = 60, + text = _L['Background'], + checked = data.config.bShowBg or false, + onCheck = function(bChecked) + data.config.bShowBg = bChecked + D.ReinitUI() + end, + }) + nX = nX + 70 + + nX = nX + ui:Append('WndButton', { + name = 'WndButton_InfoTipFont_' .. data.id, + x = nX, y = nY, h = 24, + text = _L['Font'], + onClick = function() + X.UI.OpenFontPicker(function(f) + data.config.nFont = f + D.ReinitUI() + end) + end, + }):Width() + 5 + + ui:Append('Shadow', { + name = 'Shadow_InfoTipColor_' .. data.id, + x = nX, y = nY, w = 24, h = 24, + color = data.config.rgb or {255, 255, 255}, + onClick = function() + local el = this + X.UI.OpenColorPicker(function(r, g, b) + X.UI(el):Color(r, g, b) + data.config.rgb = { r, g, b } + D.ReinitUI() + end) + end, + }) + end +end +X.Panel.Register(_L['System'], 'MY_InfoTip', _L['MY_InfoTip'], 'ui/Image/UICommon/ActivePopularize2.UITex|22', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ItemInfoSearch.lua b/MY_Toolbox/src/MY_ItemInfoSearch.lua new file mode 100644 index 000000000..e75a1c95d --- /dev/null +++ b/MY_Toolbox/src/MY_ItemInfoSearch.lua @@ -0,0 +1,305 @@ +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ItemInfoSearch' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_ItemInfoSearch' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------------- +X.RegisterRestriction('MY_ItemInfoSearch', { ['*'] = false, exp = true }) +-------------------------------------------------------------------------------- +local CACHE = {} +local ITEM_TYPE_MAX, BOOK_SEGMENT_COUNT, SEARCH_STEP_COUNT +local SEARCH, RESULT, MAX_DISP = '', {}, 500 +local D = {} + +function D.Init() + if not ITEM_TYPE_MAX then + ITEM_TYPE_MAX = {} + local dwTabType = 1 + while 1 do + local nMaxL = 100 -- 折半查找左端数值 + local nMaxR = 3000 -- 折半查找右端数值 + local item = GetItemInfo(dwTabType, nMaxL) + if item then + if not ITEM_TYPE_MAX[dwTabType] then + local bMaxL = GetItemInfo(dwTabType, nMaxL) -- 折半查找左端结果 + local bMaxR = GetItemInfo(dwTabType, nMaxR) -- 折半查找右端结果 + local nCount, nMaxCount = 0, 1000 -- 折半次数统计 1000次折半查找还没找到多半是BUG了 判断上限防止死循环 + while true do + if nMaxL < 1 then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ItemInfoSearch'], 'ERROR CALC ITEM_TYPE_MAX: ' .. dwTabType .. ' (TOO SMALL)', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + break + elseif bMaxL and bMaxR then + nMaxR = nMaxR * 2 + bMaxR = GetItemInfo(dwTabType, nMaxR) + elseif not bMaxL and not bMaxR then + nMaxL = math.floor(nMaxL / 2) + bMaxL = GetItemInfo(dwTabType, nMaxL) + else + if bMaxL and not bMaxR then + if nMaxL + 1 == nMaxR then + ITEM_TYPE_MAX[dwTabType] = nMaxL + break + else + local nCur = math.floor(nMaxR - (nMaxR - nMaxL) / 2) + local bCur = GetItemInfo(dwTabType, nCur) + if bCur then + nMaxL = nCur + else + nMaxR = nCur + end + end + elseif not bMaxL and bMaxR then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ItemInfoSearch'], 'ERROR CALC ITEM_TYPE_MAX: ' .. dwTabType .. ' (NOT EXIST)', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + break + end + end + if nCount >= nMaxCount then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(_L['MY_ItemInfoSearch'], 'ERROR CALC ITEM_TYPE_MAX: ' .. dwTabType .. ' (OVERFLOW)', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + break + end + nCount = nCount + 1 + end + end + elseif dwTabType > 20 then + break + end + dwTabType = dwTabType + 1 + end + -- 总查找步数 用于进度条 + local BookSegment = X.GetGameTable('BookSegment', true) + BOOK_SEGMENT_COUNT = BookSegment and BookSegment:GetRowCount() or 0 + SEARCH_STEP_COUNT = 0 + for _, nMaxIndex in pairs(ITEM_TYPE_MAX) do + SEARCH_STEP_COUNT = SEARCH_STEP_COUNT + nMaxIndex + end + SEARCH_STEP_COUNT = SEARCH_STEP_COUNT + BOOK_SEGMENT_COUNT + end +end + +function D.StopSearch() + X.BreatheCall('MY_ItemInfoSearch', false) +end + +function D.DoRawSearch(szSearch, fnProgress, fnCallback) + local aResult = {} + if szSearch == '' then + fnCallback(aResult) + return + end + local dwID = tonumber(szSearch) + -- 构建分段搜索步骤 + local dwTabType, dwIndex, nRound = next(ITEM_TYPE_MAX), 1, 0 + local function SearchStep() + nRound = nRound + 1 + if dwTabType then + local itemInfo = GetItemInfo(dwTabType, dwIndex) + if itemInfo and ( + dwIndex == dwID + or (itemInfo.nGenre ~= ITEM_GENRE.BOOK and X.StringFindW(X.GetItemNameByItemInfo(itemInfo), szSearch)) + or X.StringFindW(itemInfo.szName, szSearch) + ) then + table.insert(aResult, { + dwTabType = dwTabType, + dwIndex = dwIndex, + itemInfo = itemInfo, + }) + if #aResult >= MAX_DISP then + return true + end + end + if dwIndex < ITEM_TYPE_MAX[dwTabType] then + dwIndex = dwIndex + 1 + else + dwTabType = next(ITEM_TYPE_MAX, dwTabType) + dwIndex = 1 + end + else + local BookSegment = X.GetGameTable('BookSegment', true) + local row = BookSegment and BookSegment:GetRow(dwIndex) + local dwRecipeID = row and X.SegmentToRecipeID(row.dwBookID, row.dwSegmentID) + if dwRecipeID and X.RecipeToSegmentID(dwRecipeID) then + local itemInfo = GetItemInfo(5, row.dwBookItemIndex) + if itemInfo and ( + dwID == itemInfo.dwID or dwID == dwRecipeID + or dwID == row.dwBookID or dwID == row.dwSegmentID + or X.StringFindW(X.GetItemNameByItemInfo(itemInfo, dwRecipeID), szSearch) + ) then + table.insert(aResult, { + dwTabType = 5, + dwIndex = row.dwBookItemIndex, + itemInfo = itemInfo, + dwRecipeID = dwRecipeID, + }) + if #aResult >= MAX_DISP then + return true + end + end + end + if dwIndex < BOOK_SEGMENT_COUNT then + dwIndex = dwIndex + 1 + else + return true + end + end + end + local function SearchBreathe() + local nTime = GetTime() + while GetTime() - nTime < 50 do + for _ = 1, 100 do + if SearchStep() then + fnCallback(aResult) + D.StopSearch() + return + end + end + fnProgress(nRound / SEARCH_STEP_COUNT) + end + end + X.BreatheCall('MY_ItemInfoSearch', SearchBreathe) +end + +function D.Search(szSearch, fnProgress, fnCallback) + -- 搜索缓存 + for _, v in ipairs(CACHE) do + if v.szSearch == szSearch then + fnCallback(v.aResult) + return + end + end + -- 计算结果 + D.DoRawSearch(szSearch, fnProgress, function(aResult) + if #CACHE > 20 then + table.remove(CACHE, 1) + end + table.insert(CACHE, { szSearch = szSearch, aResult = aResult }) + fnCallback(aResult) + end) +end + +local PS = { nPriority = 4, szRestriction = 'MY_ItemInfoSearch' } + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 0, 0 + local nX, nY = nPaddingX, nPaddingY + local nW, nH = ui:Size() + + local list, muProgress + local function UpdateList() + list:ListBox('clear') + if X.IsEmpty(SEARCH) then + for i, s in ipairs(_L['MY_ItemInfoSearch TIPS']) do + list:ListBox('insert', { id = 'TIP' .. i, text = s, r = 255, g = 255, b = 0 }) + end + else + for _, item in ipairs(RESULT) do + local opt = { + id = item, + text = ' [' .. X.GetItemNameByItemInfo(item.itemInfo, item.dwRecipeID) .. '] - ' .. item.itemInfo.szName, + data = item, + } + opt.r, opt.g, opt.b = GetItemFontColorByQuality(item.itemInfo.nQuality, false) + list:ListBox('insert', opt) + end + list:ListBox('insert', { id = 'count', text = _L('Max display count %d, current %d.', MAX_DISP, #RESULT), r = 100, g = 100, b = 100 }) + end + end + + nY = nY + ui:Append('WndEditBox', { + x = nX, y = nY, w = nW - nX, h = 25, + text = SEARCH, + placeholder = _L['Please input item name or item index number'], + onChange = function(szSearch) + X.DelayCall('MY_ItemInfoSearch', 200, function() + D.Search(szSearch, + function(fPer) + muProgress:Width(nW * fPer) + end, + function(aResult) + muProgress:Width(nW) + SEARCH = szSearch + RESULT = aResult + UpdateList() + end) + end) + end, + }):Height() + + muProgress = ui:Append('Image', { + name = 'Image_Progress', + x = nX, y = nY, + w = nW, h = 4, + image = 'ui/Image/UICommon/RaidTotal.UITex|45', + }) + nY = nY + 4 + + list = ui:Append('WndListBox', { + x = nX, y = nY, w = nW - nX, h = nH - nY, + listBox = { + { + 'onhover', + function(id, text, data) + if id == 'count' or (X.IsString(id) and id:sub(1, 3) == 'TIP') then + return false + end + if IsCtrlKeyDown() and IsShiftKeyDown() then + X.OutputTip(this, X.EncodeLUAData(data, ' ')) + elseif data and (data.itemInfo.nGenre ~= ITEM_GENRE.BOOK or data.dwRecipeID) then + X.OutputItemInfoTip(data.dwTabType, data.dwIndex, data.dwRecipeID) + else + HideTip() + end + end, + function(id, text, data) + if id == 'count' then + return false + end + HideTip() + end + }, + { + 'onlclick', + function(id, text, data) + if data then + if IsCtrlKeyDown() then + X.InsertChatInput('iteminfo', data.dwTabType, data.dwIndex, data.dwRecipeID) + elseif IsAltKeyDown() then + Addon_ExteriorViewByItemInfo(data.dwTabType, data.dwIndex) + end + end + return false + end + }, + { + 'onrclick', + function(id, text, data) + return false + end + }, + }, + }) + + D.Init() + UpdateList() +end + +function PS.OnPanelDeactive() + D.StopSearch() +end + +X.Panel.Register(_L['General'], 'MY_ItemInfoSearch', _L['MY_ItemInfoSearch'], 'ui/Image/UICommon/ActivePopularize2.UITex|30', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ItemPrice.lua b/MY_Toolbox/src/MY_ItemPrice.lua new file mode 100644 index 000000000..c14899828 --- /dev/null +++ b/MY_Toolbox/src/MY_ItemPrice.lua @@ -0,0 +1,368 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 物品价格查询 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ItemPrice' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ItemPrice', { ['*'] = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ItemPrice', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemPrice'], + _L['Enable'], + }), + szRestriction = 'MY_ItemPrice', + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemPrice'], + _L['UI Width'], + }), + szRestriction = 'MY_ItemPrice', + xSchema = X.Schema.Number, + xDefaultValue = 480, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemPrice'], + _L['UI Height'], + }), + szRestriction = 'MY_ItemPrice', + xSchema = X.Schema.Number, + xDefaultValue = 640, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwTabType, dwTabIndex, nBookID) + if nBookID < 0 then + nBookID = nil + end + local szName = X.GetItemInfoName(dwTabType, dwTabIndex, nBookID) + if not szName then + return + end + local me = X.GetClientPlayer() + local line = X.GetHLLineInfo({ dwMapID = me.GetMapID(), nCopyIndex = me.GetScene().nCopyIndex }) + local aPath = {dwTabType, dwTabIndex} + if nBookID then + table.insert(aPath, nBookID) + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/item/' .. table.concat(aPath, '/') .. '/price?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + server = line and line.szCenterName or X.GetServerOriginName(), + player = X.GetClientPlayerName(), + item = szName, + })) + local szKey = 'ItemPrice_' .. table.concat(aPath, '_') + local szTitle = szName + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + if not X.IsRestricted('MY_ItemPrice') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Item price'], + checked = MY_ItemPrice.bEnable, + onCheck = function(bChecked) + if bChecked then + local ui = X.UI(this) + X.Confirm(_L['Check this will show price entry in bag item menu, and will share price when search auction, are you sure?'], function() + MY_ItemPrice.bEnable = bChecked + ui:Check(true, WNDEVENT_FIRETYPE.PREVENT) + end) + ui:Check(false, WNDEVENT_FIRETYPE.PREVENT) + else + MY_ItemPrice.bEnable = bChecked + end + end, + tip = { + render = _L['Hold SHIFT and r-click bag box to show item price, share price when search auction.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):Width() + 5 + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ItemPrice', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, +} +MY_ItemPrice = X.CreateModule(settings) +end + +Box_AppendAddonMenu({function(box) + if not X.IsElement(box) or box:GetType() ~= 'Box' or not O.bEnable then + return + end + local _, dwBox, dwX = box:GetObjectData() + if not dwBox or not dwX then + return + end + local item = X.GetInventoryItem(X.GetClientPlayer(), dwBox, dwX) + if not item then + return + end + local dwTabType = item.dwTabType + local dwTabIndex = item.dwIndex + local nBookID = item.nGenre == ITEM_GENRE.BOOK and item.nBookID or -1 + local menu = {} + if not item.bBind then + table.insert(menu, { + szOption = _L['Lookup price'], + fnAction = function() D.Open(dwTabType, dwTabIndex, nBookID) end, + }) + elseif X.CONSTANT.FLOWERS_UIID[item.nUiId] then + table.insert(menu, { + szOption = _L['Lookup flower price'], + fnAction = function() D.Open(dwTabType, dwTabIndex, nBookID) end, + }) + end + return menu +end}) + +local function GetItemKey(it) + if it.nGenre == ITEM_GENRE.BOOK then + return X.NumberBaseN(it.dwTabType, 32) .. '_' + .. X.NumberBaseN(it.dwIndex, 32) .. '_' + .. X.NumberBaseN(it.nBookID, 32) + end + return X.NumberBaseN(it.dwTabType, 32) .. '_' .. X.NumberBaseN(it.dwIndex, 32) +end +local PRICE_TYPE = X.KvpToObject({ + { X.CONSTANT.AUCTION_ITEM_LIST_TYPE.NORMAL_LOOK_UP, 'n' }, + { X.CONSTANT.AUCTION_ITEM_LIST_TYPE.PRICE_LOOK_UP , 'p' }, + { X.CONSTANT.AUCTION_ITEM_LIST_TYPE.DETAIL_LOOK_UP, 'd' }, +}) +X.RegisterEvent('AUCTION_LOOKUP_RESPOND', function() + if not O.bEnable then + return + end + if arg0 ~= AUCTION_RESPOND_CODE.SUCCEED then + return + end + local szPriceType = PRICE_TYPE[arg1] + if szPriceType then + -- 获取数据 + local AuctionClient = GetAuctionClient() + local nInfoCount, aInfo = AuctionClient.GetLookupResult(arg1) + local dwBaseID = math.huge + local tItemGroup = {} + -- AuctionClient.GetLookupResult + -- + -- ## CLASSIC ## + -- { + -- BidderName = "", + -- BuyItNowPrice = { nGold = 0, nSilver = 3, nCopper = 0 }, + -- CanBid = 1, + -- CRC = -1544935104, + -- ID = 11612492, + -- Item = "KGItem:000001D4B0EC0BB0", + -- LeftTime = 36277, + -- Price = { nGold = 0, nSilver = 3, nCopper = 0 }, + -- SellerName = "白玉糖", + -- } + -- + -- ## REMAKE ## + -- { + -- CRC = 1459347857, + -- ID = 741069789, + -- Item = "KGItem:00000234A2D47170", + -- LastDurationTime = 48, + -- LeftTime = 1556, + -- Price = { nGold = 0, nSilver = 1, nCopper = 0 }, + -- SellerName = "奶糖睡不醒", + -- SellerNum = 14, + -- StackNum = 4318, + -- } + for _, info in ipairs(aInfo) do + local szKey = GetItemKey(info.Item) + local nID = info.ID or 0 + if nID < 0 then + nID = nID + 0xffffffff + end + local tPrice = info.BuyItNowPrice or info.Price + local nPrice = tPrice.nGold * 10000 + tPrice.nSilver * 100 + tPrice.nCopper + local nCount = info.StackNum or X.IIf(info.Item.bCanStack, info.Item.nStackNum, 1) or 1 + if not tItemGroup[szKey] then + tItemGroup[szKey] = {} + end + table.insert(tItemGroup[szKey], { + dwID = nID, + nCount = nCount, + nPrice = nPrice, + }) + dwBaseID = math.min(dwBaseID, nID) + end + if X.IsHugeNumber(dwBaseID) then + return + end + local aData = {} + -- 重组数据 + for szKey, aItemInfo in pairs(tItemGroup) do + -- 价格升序 + table.sort(aItemInfo, function(a, b) + return a.nPrice < b.nPrice + end) + -- 价格序列化 + local aPrice = {} + for i, v in ipairs(aItemInfo) do + -- 压缩数据长度,仅第一个为32进制价格,后面的为与前一个的价格差 + if i == 1 then + aPrice[i] = X.NumberBaseN(v.nPrice, 32) + else + aPrice[i] = X.NumberBaseN(v.nPrice - aItemInfo[i - 1].nPrice, 32) + end + aPrice[i] = aPrice[i] .. '_' .. X.NumberBaseN(v.nCount, 32) .. '_' .. X.NumberBaseN(v.dwID - dwBaseID, 32) + end + table.insert(aData, szKey .. '-' .. table.concat(aPrice, '-')) + end + local data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + r = X.GetRegionOriginName(), + s = X.GetServerOriginName(), + t = GetCurrentTime(), + d = table.concat(aData, '~'), -- Price data + dt = szPriceType, -- Price type + ib = X.NumberBaseN(dwBaseID, 32), + } + -- 延迟一帧 否则系统还没更新界面数据 + X.DelayCall(function() + local bValid = false + -- CLASSIC + if not bValid then + bValid = true + local frame = Station.SearchFrame('AuctionPanel') + -- 保证第一页 + local txtPage = frame and frame:Lookup('PageSet_Totle/Page_Business/Wnd_Result2', 'Text_Page') + if not txtPage or txtPage:GetText():find('1-', nil, true) ~= 1 then + bValid = false + end + -- 保证一口价升序 + local imgPriceUp = frame and frame:Lookup('PageSet_Totle/Page_Business/Wnd_Result2/CheckBox_Price', 'Image_PriceNameUp') + if not imgPriceUp or not imgPriceUp:IsVisible() then + bValid = false + end + end + -- REMAKE + if not bValid then + bValid = true + -- 总搜索页 + if szPriceType == 'n' then + local frame = Station.SearchFrame('AuctionPanel') + -- 保证第一页 + local txtPage = frame and frame:Lookup('TradingPage_Totle/Page_Business/Wnd_Result/Wnd_MN_Item/Edit_PageNumb') + if not txtPage or txtPage:GetText() ~= '1' then + bValid = false + end + -- 保证一口价升序 + local imgPriceUp = frame and frame:Lookup('TradingPage_Totle/Page_Business/Wnd_Result/CheckBox_LowestPrice', 'Image_LowestPriceUp') + if not imgPriceUp or not imgPriceUp:IsVisible() then + bValid = false + end + elseif szPriceType == 'p' then + local frame = Station.SearchFrame('TradingPanels') + -- 保证第一页 + local txtPage = frame and frame:Lookup('Wnd_subject/Wnd_List/Wnd_MN_Item', 'Text_MNumberItem') + if not txtPage or txtPage:GetText():find('1/', nil, true) ~= 1 then + bValid = false + end + -- 保证一口价升序 + local imgPriceUp = frame and frame:Lookup('Wnd_subject/Wnd_List/CheckBox_LowestPrice', 'Image_LowestPriceUp') + if not imgPriceUp or not imgPriceUp:IsVisible() then + bValid = false + end + elseif szPriceType == 'd' then + local frame = Station.SearchFrame('TradingSellers') + -- 保证第一页 + local txtPage = frame and frame:Lookup('Wnd_List/Wnd_MN_Item/Edit_PageNumb') + if not txtPage or txtPage:GetText() ~= '1' then + bValid = false + end + -- 保证一口价升序 + local imgPriceUp = frame and frame:Lookup('Wnd_List/CheckBox_LowestPrice', 'Image_LowestPriceUp') + if not imgPriceUp or not imgPriceUp:IsVisible() then + bValid = false + end + end + end + if not bValid then + return + end + X.Ajax({ url = MY_RSS.PUSH_BASE_URL .. '/api/item/price', data = data, signature = X.SECRET['J3CX::ITEM_PRICE'] }) + end) + end +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ItemWiki.lua b/MY_Toolbox/src/MY_ItemWiki.lua new file mode 100644 index 000000000..0ddcb522b --- /dev/null +++ b/MY_Toolbox/src/MY_ItemWiki.lua @@ -0,0 +1,162 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 物品百科查询 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ItemWiki' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ItemWiki', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemWiki'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemWiki'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 850, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ItemWiki'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 610, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwTabType, dwTabIndex, nBookID) + if nBookID < 0 then + nBookID = nil + end + local szName = X.GetItemInfoName(dwTabType, dwTabIndex, nBookID) + if not szName then + return + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/item/' .. table.concat({dwTabType, dwTabIndex, nBookID}, '/') .. '?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + player = X.GetClientPlayerName(), + })) + local szKey = 'ItemWiki_' .. table.concat({dwTabType, dwTabIndex, nBookID}, '_') + local szTitle = szName + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Item wiki'], + checked = MY_ItemWiki.bEnable, + onCheck = function(bChecked) + MY_ItemWiki.bEnable = bChecked + end, + tip = { + render = _L['Hold SHIFT and r-click bag box to show item wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ItemWiki', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, +} +MY_ItemWiki = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- +Box_AppendAddonMenu({function(box) + if not X.IsElement(box) or box:GetType() ~= 'Box' or not O.bEnable then + return + end + local _, dwBox, dwX = box:GetObjectData() + if not dwBox or not dwX then + return + end + local item = X.GetInventoryItem(X.GetClientPlayer(), dwBox, dwX) + if not item then + return + end + local dwTabType = item.dwTabType + local dwTabIndex = item.dwIndex + local nBookID = item.nGenre == ITEM_GENRE.BOOK and item.nBookID or -1 + return {{ szOption = _L['Item wiki'], fnAction = function() D.Open(dwTabType, dwTabIndex, nBookID) end }} +end}) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_JiugongHelper.lua b/MY_Toolbox/src/MY_JiugongHelper.lua new file mode 100644 index 000000000..d99268acd --- /dev/null +++ b/MY_Toolbox/src/MY_JiugongHelper.lua @@ -0,0 +1,163 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 试炼之地九宫助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_JiugongHelper' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_JiugongHelper', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_JiugongHelper', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_JiugongHelper'], + _L['Enable'], + }), + szRestriction = 'MY_JiugongHelper', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.Apply() + if D.bReady then + X.RegisterEvent('OPEN_WINDOW', 'JIUGONG_HELPER', function(event) + if X.IsRestricted('MY_JiugongHelper') then + return + end + -- 确定当前对话对象是醉逍遥(18707) + local target = GetTargetHandle(X.GetClientPlayer().GetTarget()) + if target and target.dwTemplateID ~= 18707 then + return + end + local szText = arg1 + -- 匹配字符串 + string.gsub(szText, '<(T%d+)><(T%d+)><(T%d+)>.+<(T%d+)><(T%d+)><(T%d+)>.+<(T%d+)><(T%d+)><(T%d+)>', function(n1,n2,n3,n4,n5,n6,n7,n8,n9) + local tNumList = { + T1925 = 1, T1927 = 2, T1929 = 3, + T1930 = 4, T1932 = 5, T1934 = 6, + T1936 = 7, T1922 = 8, T1923 = 9, + T1940 = false, + } + local tDefaultSolution = { + {8,1,6,3,5,7,4,9,2}, + {6,1,8,7,5,3,2,9,4}, + {4,9,2,3,5,7,8,1,6}, + {2,9,4,7,5,3,6,1,8}, + {6,7,2,1,5,9,8,3,4}, + {8,3,4,1,5,9,6,7,2}, + {2,7,6,9,5,1,4,3,8}, + {4,3,8,9,5,1,2,7,6}, + } + + n1,n2,n3,n4,n5,n6,n7,n8,n9 = tNumList[n1],tNumList[n2],tNumList[n3],tNumList[n4],tNumList[n5],tNumList[n6],tNumList[n7],tNumList[n8],tNumList[n9] + local tQuestion = {n1,n2,n3,n4,n5,n6,n7,n8,n9} + local tSolution + for _, solution in ipairs(tDefaultSolution) do + local bNotMatch = false + for i, v in ipairs(solution) do + if tQuestion[i] and tQuestion[i] ~= v then + bNotMatch = true + break + end + end + if not bNotMatch then + tSolution = solution + break + end + end + local szText + if tSolution then + local szSequence = '' + for i, v in ipairs(tQuestion) do + szSequence = szSequence .. NumberToChinese(tSolution[i]) + if not tQuestion[i] then + szSequence = szSequence + end + szSequence = szSequence .. ' ' + end + local szBlank = '' + for i, v in ipairs(tQuestion) do + if not tQuestion[i] then + szBlank = szBlank .. NumberToChinese(tSolution[i]) .. ' ' + end + end + szText = _L('The jiugong full sequence is: %s, blank is: %s.', szSequence, szBlank) + else + szText = _L['Failed to calc.'] + end + X.OutputSystemMessage(szText) + OutputWarningMessage('MSG_WARNING_RED', szText, 10) + end) + end) + else + X.RegisterEvent('OPEN_WINDOW', 'JIUGONG_HELPER', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_JiugongHelper', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.Apply, + }, + root = O, + }, + }, +} +MY_JiugongHelper = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_JiugongHelper', function() + D.bReady = true + D.Apply() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_LockFrame.lua b/MY_Toolbox/src/MY_LockFrame.lua new file mode 100644 index 000000000..90bde9e63 --- /dev/null +++ b/MY_Toolbox/src/MY_LockFrame.lua @@ -0,0 +1,271 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 试炼之地九宫助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_LockFrame' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_LockFrame' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_LockFrame', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_LockFrame'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + tEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_LockFrame'], + _L['Lock frame position list'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = { + ['JX_TargetList'] = true, + ['MY_FocusUI'] = true, + ['WhoSeeMe'] = true, + ['HatredPanel'] = true, + ['FightingStatistic'] = true, + ['MY_ThreatRank'] = true, + ['MY_Recount_UI'] = true, + ['LR_AS_FP'] = true, + ['QuestTraceList'] = true, + ['ChatPanel'] = true, + ['DynamicActionBar'] = true, + ['ExteriorAction'] = true, + ['MentorMessage'] = true, + ['JX_TeamCD'] = true, + ['JX_HeightMeter'] = true, + ['Matrix'] = true, + }, + }, +}) +local D = { + bTempDisable = false, + tLockList = { + 'WhoSeeMe', + 'HatredPanel', + 'FightingStatistic', + 'QuestTraceList', + 'ChatPanel', + 'Matrix', + 'ExteriorAction', + 'MentorMessage', + 'DynamicActionBar', + 'JX_TeamCD', + 'JX_HeightMeter', + 'JX_TargetList', + 'MY_FocusUI', + 'MY_ThreatRank', + 'MY_Recount_UI', + }, + tLockID = (function() + local t = { + ['JX_TargetList'] = 'JX_TargetList', -- 剑心·焦点列表 [Normal/JX_TargetList] + ['MY_FocusUI'] = 'MY_FocusUI', -- 茗伊·焦点列表 [Normal/MY_FocusUI] + ['WhoSeeMe'] = 'WhoSeeMe', -- 谁在看我 [Normal/WhoSeeMe] + ['HatredPanel'] = 'HatredPanel', -- 仇恨列表 [Normal/HatredPanel] + ['FightingStatistic'] = 'FightingStatistic', -- 伤害统计 [Normal/FightingStatistic] + ['MY_ThreatRank'] = 'MY_ThreatRank', -- 茗伊·仇恨统计 [Normal/MY_ThreatRank] + ['MY_Recount_UI'] = 'MY_Recount_UI', -- 茗伊·伤害统计 [Normal/MY_Recount_UI] + ['QuestTraceList'] = 'QuestTraceList', -- 任务追踪 [Normal/QuestTraceList] + ['Matrix'] = 'Matrix', -- 阵法界面 [Normal/Matrix] + ['DynamicActionBar'] = 'DynamicActionBar', -- 动态技能栏 [Lowest1/DynamicActionBar] + ['ExteriorAction'] = 'ExteriorAction', -- 外装动作 [Normal/ExteriorAction] + ['MentorMessage'] = 'MentorMessage', -- 师徒提示 [Normal/MentorMessage] + ['JX_TeamCD'] = 'JX_TeamCD', -- 剑心·团队技能监控 [Normal/JX_TeamCD] + ['JX_HeightMeter'] = 'JX_HeightMeter', -- 剑心·高度标线 [Normal/JX_HeightMeter] + } + for _, k in X.pairs_c(X.CONSTANT.CHAT_PANEL_INDEX_LIST) do + t['ChatPanel' .. k] = 'ChatPanel' .. k -- 聊天面板 [Lowest2/ChatPanel1] + end + return t + end)(), +} + +local HOOKED_UI = setmetatable({}, { __mode = 'k' }) +local UI_DRAGABLE = setmetatable({}, { __mode = 'k' }) +local function EnableDrag(frame, bEnable) + UI_DRAGABLE[frame] = bEnable +end +local function IsDragable(frame) + return UI_DRAGABLE[frame] or false +end +function D.LockFrame(frame) + if not HOOKED_UI[frame] then + HOOKED_UI[frame] = true + UI_DRAGABLE[frame] = frame:IsDragable() + frame:EnableDrag(false) + HookTableFunc(frame, 'EnableDrag', EnableDrag, { bDisableOrigin = true }) + HookTableFunc(frame, 'IsDragable', IsDragable, { bDisableOrigin = true, bHookReturn = true }) + end +end +function D.UnlockFrame(frame) + if HOOKED_UI[frame] then + UnhookTableFunc(frame, 'EnableDrag', EnableDrag) + UnhookTableFunc(frame, 'IsDragable', IsDragable) + frame:EnableDrag(UI_DRAGABLE[frame]) + HOOKED_UI[frame] = nil + UI_DRAGABLE[frame] = nil + end +end + +function D.IsFrameLock(frame) + if not D.bReady or not O.bEnable or D.bTempDisable or not frame then + return false + end + local szLock = D.tLockID[frame:GetName()] + return szLock and O.tEnable[szLock] ~= false +end + +function D.CheckFrame(frame) + local bLock = D.IsFrameLock(frame) + if bLock then + D.LockFrame(frame) + else + D.UnlockFrame(frame) + end +end + +function D.CheckAllFrame() + for _, szLayer in ipairs({'Lowest', 'Lowest1', 'Lowest2', 'Normal', 'Normal1', 'Normal2', 'Topmost', 'Topmost1', 'Topmost2'})do + local frmIter = Station.Lookup(szLayer) + if frmIter then + frmIter = frmIter:GetFirstChild() + end + while frmIter do + local bLock = D.IsFrameLock(frmIter) + if bLock then + D.LockFrame(frmIter) + else + D.UnlockFrame(frmIter) + end + frmIter = frmIter:GetNext() + end + end + if D.bReady and O.bEnable then + X.RegisterEvent('ON_FRAME_CREATE', 'MY_LockFrame', function() + D.CheckFrame(arg0) + end) + X.RegisterSpecialKeyEvent('*', 'MY_LockFrame', function() + if IsCtrlKeyDown() and (IsShiftKeyDown() or IsAltKeyDown()) then + if not D.bTempDisable then + X.OutputAnnounceMessage(_L['MY_LockFrame has been temporary disabled.']) + D.bTempDisable = true + D.CheckAllFrame() + end + else + if D.bTempDisable then + X.OutputAnnounceMessage(_L['MY_LockFrame has been enabled.']) + D.bTempDisable = false + D.CheckAllFrame() + end + end + end) + else + X.RegisterEvent('ON_FRAME_CREATE', 'MY_LockFrame', false) + X.RegisterSpecialKeyEvent('*', 'MY_LockFrame', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + ui:Append('WndComboBox', { + x = nW - 140, y = 65, + text = _L['Lock frame position'], + menu = function() + local t = { + { + szOption = _L['Enable (press ctrl+alt to temp unlock)'], + bCheck = true, bChecked = MY_LockFrame.bEnable, + fnAction = function(_, b) + MY_LockFrame.bEnable = b + D.CheckAllFrame() + end, + }, X.CONSTANT.MENU_DIVIDER, + } + for _, k in ipairs(D.tLockList) do + table.insert(t, { + szOption = _L['LOCK_FRAME_' .. k], + bCheck = true, bChecked = MY_LockFrame.tEnable[k] ~= false, + fnAction = function(_, b) + MY_LockFrame.tEnable[k] = b + MY_LockFrame.tEnable = MY_LockFrame.tEnable + end, + fnDisable = function() + return not MY_LockFrame.bEnable + end, + }) + end + return t + end, + }) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_LockFrame', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'tEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'tEnable', + }, + triggers = { + bEnable = D.CheckAllFrame, + tEnable = D.CheckAllFrame, + }, + root = O, + }, + }, +} +MY_LockFrame = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_LockFrame', function() + D.bReady = true + D.CheckAllFrame() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Love.PS.lua b/MY_Toolbox/src/MY_Love.PS.lua new file mode 100644 index 000000000..6281de511 --- /dev/null +++ b/MY_Toolbox/src/MY_Love.PS.lua @@ -0,0 +1,282 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 剑侠情缘设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Love.PS' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Love' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + GetLover = MY_Love.GetLover, + SetLover = MY_Love.SetLover, + FixLover = MY_Love.FixLover, + RequestBackupLover = MY_Love.RequestBackupLover, + RestoreLover = MY_Love.RestoreLover, + RemoveLover = MY_Love.RemoveLover, + FormatLoverString = MY_Love.FormatLoverString, +} +local O = { + bPanelActive = false, +} + +-- refresh ps +function D.RefreshPS() + if O.bPanelActive and X.Panel.IsOpened() then + X.Panel.SwitchTab('MY_Love', true) + end +end +X.RegisterEvent('MY_LOVE_UPDATE', 'MY_Love__PS', D.RefreshPS) + +------------------------------------- +-- 设置界面 +------------------------------------- +local PS = { IsRestricted = MY_Love.IsShielded } + +-- 获取可情缘好友列表 +function D.GetLoverMenu(nType) + local m0 = {} + X.IterFellowshipInfo(function(tFellowship) + if not X.IsFellowshipTwoWay(tFellowship.xID) then + return + end + local tFei = X.GetFellowshipEntryInfo(tFellowship.xID) + if not tFei then + return + end + if nType == 0 and tFellowship.nAttraction < MY_Love.nLoveAttraction then + return + end + if nType == 1 and tFellowship.nAttraction < MY_Love.nDoubleLoveAttraction then + return + end + table.insert(m0, { + szOption = tFei.szName, + fnDisable = function() return not X.IsFellowshipOnline(tFellowship.xID) end, + fnAction = function() + D.SetLover(tFellowship.xID, nType) + X.UI.ClosePopupMenu() + end + }) + end) + if #m0 == 0 then + table.insert(m0, { szOption = _L[''] }) + end + return m0 +end + +-- init +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nPaddingX, nPaddingY = 20, 10 + local nX, nY = nPaddingX, nPaddingY + local lover = D.GetLover() + + ui:Append('Text', { text = _L['Heart lover'], x = nPaddingX, y = nY, font = 27 }) + -- lover info + nY = nY + 36 + if not X.CanUseOnlineRemoteStorage() then + nX = nPaddingX + 10 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX, h = 120, + text = _L['Please enable sync common ui config first'], + font = 19, r = 255, g = 255, b = 0, multiline = true, + }):AutoHeight():Height() + 25 + nY = nY + ui:Append('WndButton', { + x = (nW - 100) / 2, y = nY, w = 100, h = 30, + text = _L['Refresh'], + onClick = function() + D.RefreshPS() + end, + }):Height() + 20 + else + if not lover or not lover.xID or lover.xID == 0 or lover.xID == '0' then + nX = nPaddingX + 10 + nX = ui:Append('Text', { text = _L['No lover :-('], font = 19, x = nX, y = nY }):Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { + text = _L['[Restore]'], x = nX + 10, y = nY, + onClick = function() + local szFilePath = GetOpenFileName( + _L['Please select lover backup data file:'], + 'JX3 Lover File(*.lover.jx3dat)\0*.jx3dat\0JX3 File(*.jx3dat)\0*.jx3dat\0All Files(*.*)\0*.*\0\0', + X.FormatPath({ 'export/lover_backup/', X.PATH_TYPE.GLOBAL }) + ) + if szFilePath == '' then + return + end + D.RestoreLover(szFilePath) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + -- create lover + nX = nPaddingX + 10 + nY = nY + 36 + nX = ui:Append('Text', { text = _L['Mutual love friend Lv.6: '], x = nX, y = nY }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndComboBox', { + x = nX + 5, y = nY, w = 200, h = 25, + text = _L['- Select plz -'], + menu = function() return D.GetLoverMenu(1) end, + }):Pos('BOTTOMRIGHT') + ui:Append('Text', { text = _L['(4-feets, with specific fireworks)'], x = nX + 5, y = nY }) + nX = nPaddingX + 10 + nY = nY + 28 + nX = ui:Append('Text', { text = _L['Blind love friend Lv.2: '], x = nX, y = nY }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndComboBox', { + x = nX + 5, y = nY, w = 200, h = 25, + text = _L['- Select plz -'], + menu = function() return D.GetLoverMenu(0) end, + }):Pos('BOTTOMRIGHT') + ui:Append('Text', { text = _L['(Online required, notify anonymous)'], x = nX + 5, y = nY }) + else + -- sync social data + X.UI.OpenFrame('SocialPanel') + X.UI.CloseFrame('SocialPanel') + -- show lover + nX = nPaddingX + 10 + nX = ui:Append('Text', { text = lover.szName, font = 19, x = nX, y = nY, r = 255, g = 128, b = 255 }):AutoWidth():Pos('BOTTOMRIGHT') + local map = lover.bOnline and X.GetMapInfo(lover.dwMapID) + if not X.IsEmpty(lover.szLoverTitle) then + nX = ui:Append('Text', { text = '<' .. lover.szLoverTitle .. '>', x = nX, y = nY, font = 80, r = 255, g = 128, b = 255 }):AutoWidth():Pos('BOTTOMRIGHT') + end + if lover.bOnline then + ui:Append('Text', { text = '(' .. g_tStrings.STR_GUILD_ONLINE .. ': ' .. (map and map.szName or '#' .. lover.dwMapID) .. ')', font = 80, x = nX + 10, y = nY }) + else + ui:Append('Text', { text = '(' .. g_tStrings.STR_GUILD_OFFLINE .. ')', font = 62, x = nX + 10, y = nY }) + end + nX = nPaddingX + 10 + nY = nY + 36 + nX = ui:Append('Text', { text = D.FormatLoverString('{$type}{$time}', lover), font = 2, x = nX, y = nY }):AutoWidth():Pos('BOTTOMRIGHT') + if lover.nLoverType == 1 then + nX = ui:Append('Text', { + x = nX + 10, y = nY, + text = _L['[Light firework]'], + onClick = function() + D.SetLover(lover.xID, -1) + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + end + nX = ui:Append('Text', { text = _L['[Break love]'], x = nX + 10, y = nY, onClick = D.RemoveLover }):AutoWidth():Pos('BOTTOMRIGHT') + if lover.nLoverType == 1 then + nX = ui:Append('Text', { text = _L['[Recovery]'], x = nX + 10, y = nY, onClick = D.FixLover }):AutoWidth():Pos('BOTTOMRIGHT') + nX = ui:Append('Text', { text = _L['[Backup]'], x = nX + 10, y = nY, onClick = D.RequestBackupLover }):AutoWidth():Pos('BOTTOMRIGHT') + end + ui:Append('WndCheckBox', { + x = nX + 10, y = nY + 2, + text = _L['Auto focus lover'], + checked = MY_Love.bAutoFocus, + onCheck = function(bChecked) + MY_Love.bAutoFocus = bChecked + end, + }) + nY = nY + 10 + end + -- local setting + nX = nPaddingX + 10 + nY = nY + 28 + nX = ui:Append('Text', { text = _L['Non-love display: '], x = nX, y = nY }):Pos('BOTTOMRIGHT') + nX = ui:Append('WndEditBox', { + x = nX + 5, y = nY, w = 198, h = 25, + limit = 20, text = MY_Love.szNone, + onChange = function(szText) MY_Love.szNone = szText end, + }):Pos('BOTTOMRIGHT') + ui:Append('WndCheckBox', { + x = nX + 5, y = nY, + text = _L['Enable quiet mode'], + checked = MY_Love.bQuiet, + onCheck = function(bChecked) MY_Love.bQuiet = bChecked end, + }) + -- jabber + nX = nPaddingX + 10 + nY = nY + 28 + nX = ui:Append('Text', { text = _L['Quick to accost text: '], x = nX, y = nY }):Pos('BOTTOMRIGHT') + ui:Append('WndEditBox', { + x = nX + 5, y = nY, w = 340, h = 25, + limit = 128, text = MY_Love.szJabber, + onChange = function(szText) MY_Love.szJabber = szText end, + }) + -- signature + nX = nPaddingX + 10 + nY = nY + 36 + nX = ui:Append('Text', { text = _L['Love signature: '], x = nX, y = nY, font = 27 }):Pos('BOTTOMRIGHT') + ui:Append('WndEditBox', { + x = nX + 5, y = nY, w = 340, h = 48, + limit = 42, multi = true, + text = MY_Love.szSign, + onChange = function(szText) + MY_Love.szSign = X.ReplaceSensitiveWord(szText) + end, + }) + nY = nY + 54 + end + ui:Append('WndCheckBox', { + x = nX + 5, y = nY, w = 200, + text = _L['Enable player view panel hook'], + checked = MY_Love.bHookPlayerView, + onCheck = function(bChecked) MY_Love.bHookPlayerView = bChecked end, + }):AutoWidth() + nY = nY + 25 + ui:Append('WndCheckBox', { + x = nX + 5, y = nY, w = 200, + text = _L['Other view my lover without ask'], + checked = MY_Love.bAutoReplyLover, + onCheck = function(bChecked) MY_Love.bAutoReplyLover = bChecked end, + }):AutoWidth() + + -- tips + nY = nY + 10 + ui:Append('Text', { text = _L['Tips'], x = nPaddingX, y = nY, font = 27 }) + nX = nPaddingX + 10 + nY = nY + 35 + + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['1. You can break love one-sided.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['2. Data was stored in official data segment.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['3. Please do not enable config async, that may cause data lose.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['4. To recove lover data, please ask you lover click fix button.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['5. Lover must be toway friend, so delete friend will cause both side none-lover.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['6. Lover can see each other\'s location, delete friend can prevent this.'], + }):AutoHeight():Height() + 1 + nY = nY + ui:Append('Text', { + x = nX, y = nY, w = nW - nX * 2, multiline = true, alignVertical = 0, + text = _L['7. Backup lover requires both online and teamed up, backup data can be used to restore data while server merge or player crossing server.'], + }):AutoHeight():Height() + 1 + O.bPanelActive = true +end + +-- deinit +function PS.OnPanelDeactive() + O.bPanelActive = false +end + +X.Panel.Register(_L['Target'], 'MY_Love', _L['MY_Love'], 329, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Love.PV.lua b/MY_Toolbox/src/MY_Love.PV.lua new file mode 100644 index 000000000..e491b5579 --- /dev/null +++ b/MY_Toolbox/src/MY_Love.PV.lua @@ -0,0 +1,410 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 剑侠情缘设置界面 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Love.PV' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Love' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local D = { + FormatLoverString = MY_Love.FormatLoverString, + GetPlayerInfo = MY_Love.GetPlayerInfo, + RequestOtherLover = MY_Love.RequestOtherLover, + GetOtherLover = MY_Love.GetOtherLover, +} +local O = { + tActiveLove = {}, + tName2ID = {}, +} + +function D.CanSeeLovePage(dwPlayerID, szPlayerName) + if MY_Love.IsShielded() then + return false + end + if X.IS_CLASSIC and IsRemotePlayer(dwPlayerID) then + return false + end + return true +end + +-- 请求别人情缘数据 +function D.PvRequestOtherLover(frame) + local nX, nY = frame:GetAbsPos() + local nW, nH = frame:GetSize() + local pageset = frame:Lookup('Page_Main') + return D.RequestOtherLover(pageset.dwPlayerID, nX + nW / 2, nY + nH / 3, function() return not Station.Lookup('Normal/PlayerView/Page_Main') end) +end + +-- 更新情缘面板信息 +function D.UpdatePage() + local p = Station.Lookup('Normal/PlayerView/Page_Main/Page_Love') + if not p then + return + end + local tar = D.GetPlayerInfo(p:GetParent().dwPlayerID) + if not tar then + return p:GetRoot():Hide() + end + local h, t = p:Lookup('', ''), D.GetOtherLover(tar.szName) + local bNoData, xID, szName, dwAvatar, szSign, dwForceID, nRoleType, nLoverType, nLoverTime, szLoverTitle = not t + if t then + xID = t.xID + szName = t.szName + dwAvatar = t.dwAvatar + szSign = t.szSign + dwForceID = t.dwForceID + nRoleType = t.nRoleType + nLoverType = t.nLoverType + nLoverTime = t.nLoverTime + szLoverTitle = t.szLoverTitle + end + h:Lookup('Text_LTitle'):SetText(_L('%s\'s lover', tar.szName)) + -- lover + local txt = h:Lookup('Text_Lover') + if bNoData then + txt:SetText(_L['...Unknown...']) + else + txt:SetText(szName or _L['...Loading...']) + end + txt.szPlayer = szName + -- lover title + local ttl = h:Lookup('Text_LoverTitle') + if bNoData or X.IsEmpty(szLoverTitle) then + ttl:SetText('') + else + ttl:SetFontColor(255, 128, 255) + ttl:SetText('<' .. szLoverTitle .. '>') + end + -- lover info + local inf = h:Lookup('Text_LoverInfo') + if nLoverType and nLoverTime and nLoverTime > 0 then + inf:SetText(D.FormatLoverString('{$type} {$time}', { nLoverType = nLoverType, nLoverTime = nLoverTime })) + else + inf:SetText('') + end + -- avatar + local szFile, nFrame, bAnimate = X.GetPlayerAvatar(dwForceID, nRoleType, dwAvatar) + local img, ani = h:Lookup('Image_Lover'), h:Lookup('Animate_Lover') + if xID == 0 or xID == '0' or X.IsEmpty(szFile) then + img:Hide() + ani:Hide() + txt:SetRelPos(42, 92) + txt:SetSize(300, 25) + txt:SetHAlign(1) + else + if bAnimate then + ani:SetAnimate(szFile, nFrame) + --ani:SetAnimateType(ANIMATE.FLIP_HORIZONTAL) + ani:Show() + img:Hide() + else + if nFrame < 0 then + img:FromTextureFile(szFile) + else + img:FromUITex(szFile, nFrame) + end + if nFrame == -2 then + img:SetImageType(IMAGE.NORMAL) + else + img:SetImageType(IMAGE.FLIP_HORIZONTAL) + end + ani:Hide() + img:Show() + end + if bNoData or X.IsEmpty(szLoverTitle) then + txt:SetRelPos(130, 92) + inf:SetRelPos(130, 115) + else + txt:SetRelPos(130, 82) + ttl:SetRelPos(130, 105) + inf:SetRelPos(130, 128) + end + txt:SetSize(200, 25) + txt:SetHAlign(0) + end + ani.szPlayer = szName + img.szPlayer = szName + -- sign title + h:Lookup('Text_SignTTL'):SetText(bNoData and '' or _L('%s\'s Love signature:', tar.szName)) + -- sign + if bNoData then + szSign = _L['No peer lover data yet, you must request first.'] + elseif not szSign then + szSign = _L['If it is always loading, the target may not install plugin or turn on quiet mode, strongly recommend to query after team up.'] + elseif szSign == '' then + szSign = _L['This guy is very lazy, nothing left!'] + end + h:Lookup('Text_Sign'):SetText(szSign) + -- btn + local txt = p:Lookup('Btn_LoveYou'):Lookup('', 'Text_LoveYou') + if bNoData then + txt:SetText(_L['Request lover data']) + elseif tar.nGender == 2 then + txt:SetText(_L['Strike up her']) + else + txt:SetText(_L['Strike up him']) + end + h:FormatAllItemPos() +end +X.RegisterEvent('MY_LOVE_OTHER_UPDATE', D.UpdatePage) + +function D.GetPlayerViewTargetBaseInfo() + local mPage = Station.Lookup('Normal/PlayerView/Page_Main') + local txtName = mPage and mPage:Lookup('Page_Battle', 'Text_PlayerName') + if not txtName then + txtName = Station.Lookup('Normal/PersonalCard_ShowData/Wnd_Card/Wnd_Information', 'Handle_Player/Text_Name') + end + if not txtName then + return + end + local szName = txtName:GetText() + local dwID = O.tName2ID[szName] + local hWnd = Station.Lookup('Normal/PersonalCard_ShowData/Wnd_Card') + if hWnd and hWnd.szGlobalID then + local kTarget = MY_Love.GetNearbyPlayerByXID(hWnd.szGlobalID) + if kTarget then + szName = kTarget.szName + dwID = O.tName2ID[szName] or dwID + end + local tFellowship = X.GetFellowshipInfo(hWnd.szGlobalID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei then + szName = tFei.szName + dwID = O.tName2ID[szName] or dwID + end + end + return dwID, szName +end + +-- 查看别人装备、情缘 +function D.HookPlayerViewPanel() + local mPage = Station.Lookup('Normal/PlayerView/Page_Main') + local dwID, szName = D.GetPlayerViewTargetBaseInfo() + if not dwID or not szName then + return + end + -- 常驻时钟监听角色名刷新 防止过快获取错误信息 + X.BreatheCall('MY_Love__PV__HookPlayerViewPanel', function() + local dwCurrentID, szCurrentName = D.GetPlayerViewTargetBaseInfo() + if dwCurrentID and szCurrentName then + if dwCurrentID ~= dwID or szCurrentName ~= szName then + D.HookPlayerViewPanel() + end + return + end + X.BreatheCall('MY_Love__PV__HookPlayerViewPanel', false) + end, 200) + local bHook = MY_Love.bHookPlayerView and dwID and D.CanSeeLovePage(dwID, szName) + -- attach page + if bHook then + if not mPage.bMYLoved then + local frame = X.UI.OpenFrame(PLUGIN_ROOT .. '\\ui\\MY_Love.ini', 'MY_Love_TempFrame') + local pageset = frame:Lookup('Page_Main') + local checkbox = pageset:Lookup('CheckBox_Love') + local page = pageset:Lookup('Page_Love') + -- 计算checkbox的X值 + local chk = mPage:GetFirstChild() + local aX, nW, nY = {}, 78, 510 + while chk do + if chk:GetType() == 'WndCheckBox' then + table.insert(aX, chk:GetRelX()) + nW = chk:GetW() + nY = chk:GetRelY() + end + chk = chk:GetNext() + end + table.sort(aX, function(a, b) return b < a end) + local nX = #aX > 1 and (aX[1] - aX[2] + aX[1]) or 270 + checkbox:ChangeRelation(mPage, true, true) + page:ChangeRelation(mPage, true, true) + X.UI.CloseFrame(frame) + checkbox:SetRelPos(nX, nY) + checkbox:SetW(nW) + checkbox:Lookup('', 'Text_LoveCaptical'):SetW(nW) + if X.UI.IS_GLASSMORPHISM then + page:SetH(500) + page:Lookup('', 'Handle_ClassicBg'):Hide() + page:Lookup('', 'Image_LIcon'):Hide() + page:Lookup('', 'Text_LTitle'):SetRelY(3) + X.UI.AdaptComponentAppearance(page:Lookup('Btn_LoveYou')) + end + -- 计算page的X值 + local nX = 0 + local hPageBattle = mPage:Lookup('Wnd_PageBattle', '') + if hPageBattle then + nX = hPageBattle:GetRelX() + end + page:SetRelPos(nX, 0) + mPage:AddPage(page, checkbox) + checkbox:Show() + mPage.bMYLoved = true + -- events + mPage.OnActivePage = function() + if this:GetActivePage():GetName() == 'Page_Love' then + D.UpdatePage() + D.PvRequestOtherLover(this:GetRoot()) + end + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) + return X.UI.FormatUIEventMask(true, true) + end + page:Lookup('Btn_LoveYou').OnLButtonClick = function() + local mp = this:GetParent():GetParent() + if D.GetOtherLover(mp.szPlayerName) then + local tar = D.GetPlayerInfo(mp.dwPlayerID) + if tar then + X.SendChat(tar.szName, MY_Love.szJabber) + end + else + D.PvRequestOtherLover(this:GetRoot()) + end + end + page:Lookup('Btn_LoveYou').OnRButtonClick = function() + local mp = this:GetParent():GetParent() + local tar = D.GetPlayerInfo(mp.dwPlayerID) + if tar then + local m0, me = {}, X.GetClientPlayer() + InsertInviteTeamMenu(m0, tar.szName) + if me.IsInParty() and me.dwID == GetClientTeam().GetAuthorityInfo(TEAM_AUTHORITY_TYPE.MARK) then + InsertMarkMenu(m0, tar.dwID) + end + if me.IsInParty() and me.IsPlayerInMyParty(tar.dwID) then + InsertTeammateLeaderMenu(m0, tar.dwID) + end + if #m0 > 0 then + table.insert(m0, { bDevide = true }) + end + InsertPlayerCommonMenu(m0, tar.dwID, tar.szName) + PopupMenu(m0) + end + end + page:Lookup('', 'Image_Lover').OnItemRButtonDown = function() + if this.szPlayer then + local m0 = {} + InsertPlayerCommonMenu(m0, 0, this.szPlayer) + PopupMenu(m0) + end + end + page:Lookup('', 'Text_Lover').OnItemRButtonDown = page:Lookup('', 'Image_Lover').OnItemRButtonDown + page:Lookup('', 'Animate_Lover').OnItemRButtonDown = page:Lookup('', 'Image_Lover').OnItemRButtonDown + page:Lookup('', 'Text_LTitle'):SetText(_L['Lover']) + page:Lookup('', 'Text_SignTTL'):SetText(_L['Love signature:']) + page:Lookup('', 'Text_Lover'):SetFontColor(255, 128, 255) + checkbox:Lookup('', 'Text_LoveCaptical'):SetText(_L['Lover']) + end + -- update page + mPage.dwPlayerID = dwID + mPage.szPlayerName = szName + -- active page + if O.tActiveLove[dwID] then + O.tActiveLove[dwID] = nil + mPage:ActivePage('Page_Love') + end + elseif not bHook and mPage.bMYLoved then + local frame = X.UI.OpenFrame(PLUGIN_ROOT .. '\\ui\\MY_Love.ini', 'MY_Love') + local pageset = frame:Lookup('Page_Main') + local checkbox = mPage:Lookup('CheckBox_Love') + local page = mPage:Lookup('Page_Love') + pageset:AddPage(page, checkbox) + checkbox:ChangeRelation(pageset, true, true) + page:ChangeRelation(pageset, true, true) + X.UI.CloseFrame(frame) + mPage.dwPlayerID = nil + mPage.szPlayerName = nil + mPage.bMYLoved = nil + end +end + +function D.CheckHookPlayerViewPanel() + D.HookPlayerViewPanel() + X.DelayCall(500, D.HookPlayerViewPanel) + X.DelayCall(1000, D.HookPlayerViewPanel) + X.DelayCall(2000, D.HookPlayerViewPanel) +end + +function D.OnPeekOtherPlayer() + local nResult, dwPlayerID = arg0, arg1 + if nResult ~= 1 then + return + end + local tar = X.GetPlayer(dwPlayerID) + if not tar then + return + end + if not D.CanSeeLovePage(dwPlayerID, tar.szName) then + return + end + if X.IS_REMAKE then + local szGlobalID = tar.GetGlobalID() + local tFei = X.GetFellowshipEntryInfo(szGlobalID) + if tFei then + O.tName2ID[tFei.szName] = dwPlayerID + else + O.tName2ID[tar.szName] = dwPlayerID + end + else + O.tName2ID[tar.szName] = dwPlayerID + end + D.CheckHookPlayerViewPanel() +end +X.RegisterEvent('PEEK_OTHER_PLAYER', 'MY_Love__PV', D.OnPeekOtherPlayer) +X.RegisterFrameCreate('PlayerView', 'MY_Love__PV', D.CheckHookPlayerViewPanel) +X.RegisterFrameCreate('PersonalCard_ShowData', 'MY_Love__PV', D.CheckHookPlayerViewPanel) + +X.RegisterEvent('PLAYER_LEAVE_SCENE', function() + if arg0 == UI_GetClientPlayerID() then + O.tName2ID = {} + end +end) + +function D.OnActiveLoveChange() + O.tActiveLove[arg0] = arg1 and true or nil +end +X.RegisterEvent('MY_LOVE_PV_ACTIVE_CHANGE', D.OnActiveLoveChange) + +function D.OnPVHookChange() + D.CheckHookPlayerViewPanel() +end +X.RegisterEvent('MY_LOVE_PV_HOOK', D.OnPVHookChange) + +-- view other lover by dwID +function D.PeekOther(dwID) + MY_Love.bHookPlayerView = true + O.tActiveLove[dwID] = true + X.ViewOtherPlayerByID(dwID) +end + +-- add target menu +do +local function onMenu(dwTarType, dwTarID) + if MY_Love.IsShielded() then + return + end + if dwTarType ~= TARGET.PLAYER or dwTarID == X.GetClientPlayerID() or IsRemotePlayer(dwTarID) then + return + end + return {{ + szOption = _L['View love info'], + fnAction = function() D.PeekOther(dwTarID) end + }} +end +X.RegisterTargetAddonMenu('MY_Love', onMenu) +end + +-- close player view when reload +X.RegisterReload('MY_Love', function() X.UI.CloseFrame('PlayerView') end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Love.lua b/MY_Toolbox/src/MY_Love.lua new file mode 100644 index 000000000..a08e10f36 --- /dev/null +++ b/MY_Toolbox/src/MY_Love.lua @@ -0,0 +1,1433 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 剑侠情缘 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Love' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Love' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local NO_LOVER = { + xID = X.IS_REMAKE and '0' or 0, -- 情缘 ID + dwID = 0, -- 情缘 ID + szName = '', -- 情缘名字 + szTitle = '', -- 我的结缘称号 + nSendItem = 0, -- 结缘时送对方的东西 + nReceiveItem = 0, -- 结缘时对方送的东西 + dwAvatar = 0, -- 情缘头像 + dwForceID = 0, -- 门派 + nRoleType = 0, -- 情缘体型(0:无情缘) + nLoverType = 0, -- 情缘类型(单向:0,双向:1) + nLoverTime = 0, -- 情缘开始时间(单位:秒) + szLoverTitle = '', -- 对方结缘称号 + dwMapID = 0, -- 所在地图 + bOnline = false, -- 是否在线 +} + +local O = X.CreateUserSettingsModule('MY_Love', _L['Target'], { + bQuiet = { -- 免打扰(拒绝其它人的查看请求) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Enable quiet mode'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + szNone = { -- 没情缘时显示的字 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Non-love display'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['Singleton'], + }, + szJabber = { -- 搭讪用语 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Quick to accost text'], + }), + xSchema = X.Schema.String, + xDefaultValue = _L['Hi, I seem to meet you somewhere ago'], + }, + szSign = { -- 情缘宣言(个性签名) + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Love signature'], + }), + xSchema = X.Schema.String, + xDefaultValue = '', + }, + bAutoFocus = { -- 自动焦点 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Auto focus lover'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bHookPlayerView = { -- 在查看装备界面上显示情缘 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Enable player view panel hook'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bAutoReplyLover = { -- 无需确认即可查看我的情缘 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Love'], + szDescription = X.MakeCaption({ + _L['Other view my lover without ask'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = X.LazyLoadingTable({ + -- 导出常量 + nLoveAttraction = 200, + nDoubleLoveAttraction = 800, + nMinBreakLoveTime = 3600, + -- 本地变量 + aAutoSay = { -- 神秘表白语(单数:表白,双数:取消单恋通知) + _L['Some people fancy you.'], + _L['Other side terminate love you.'], + _L['Some people fall in love with you.'], + _L['Other side gave up love you.'], + }, + lover = X.Clone(NO_LOVER), + tOtherLover = {}, -- 查看的情缘数据(跨服下聊天频道对方ID为实际ID;查看装备对方ID为临时ID,所以KEY必须为对方角色名称) + tViewer = {}, -- 等候查看您的玩家列表 + aLoverItem = { -- 可用于结缘的烟花信息 + { nItem = 1, szTitle = _L['FIREWORK_TITLE_67291'], aUIID = {67291, 151179, 160465, 163486} }, -- 真橙之心 + { nItem = 2, szTitle = _L['FIREWORK_TITLE_151303'], aUIID = {151303, 160961, 161078} }, -- 无间长情 真心人 + { nItem = 3, szTitle = _L['FIREWORK_TITLE_151743'], aUIID = {151743, 160964, 161079} }, -- 千衷不渝 + { nItem = 4, szTitle = _L['FIREWORK_TITLE_152844'], aUIID = {152844, 160962} }, -- 心不释手 + { nItem = 5, szTitle = _L['FIREWORK_TITLE_154319'], aUIID = {154319, 160965} }, -- 鸿福齐天 惜福人 + { nItem = 6, szTitle = _L['FIREWORK_TITLE_154320'], aUIID = {154320, 160968} }, -- 情人心 一心人 + { nItem = 7, szTitle = _L['FIREWORK_TITLE_153641'], aUIID = {153641, 156447, 160963} }, -- 素月流天 + { nItem = 8, szTitle = _L['FIREWORK_TITLE_153642'], aUIID = {153642, 160966} }, -- 万家灯火 + { nItem = 9, szTitle = _L['FIREWORK_TITLE_156413'], aUIID = {156413, 160970} }, -- 冰荷逢春 有福人 + { nItem = 10, szTitle = _L['FIREWORK_TITLE_156446'], aUIID = {154313, 156446, 160967} }, -- 荷渡鸾桥 同心人 + { nItem = 11, szTitle = _L['FIREWORK_TITLE_157096'], aUIID = {157096, 160969} }, -- 莲心并蒂 恒心人 + { nItem = 12, szTitle = _L['FIREWORK_TITLE_157378'], aUIID = {157378, 160971} }, -- 素心竹月 知心人 + { nItem = 13, szTitle = _L['FIREWORK_TITLE_158339'], aUIID = {158339, 160972} }, -- 流光绮梦 衷情人 + { nItem = 14, szTitle = _L['FIREWORK_TITLE_159250'], aUIID = {159250, 160974} }, -- 莲心问情 倾心人 + { nItem = 15, szTitle = _L['FIREWORK_TITLE_160982'], aUIID = {68338, 160982} }, -- 海誓山盟 + { nItem = 16, szTitle = _L['FIREWORK_TITLE_160993'], aUIID = {160993, 163339} }, -- 鹊桥引仙 相思人 + { nItem = 17, szTitle = _L['FIREWORK_TITLE_161367'], aUIID = {161367, 163340} }, -- 金缕诉情 深情人 + { nItem = 18, szTitle = _L['FIREWORK_TITLE_161887'], aUIID = {161887, 163341} }, -- 蝶梦剪窗 称心人 + { nItem = 19, szTitle = _L['FIREWORK_TITLE_162307'], aUIID = {162307, 163435} }, -- 花语相思 还愿人 + { nItem = 20, szTitle = _L['FIREWORK_TITLE_162308'], aUIID = {162308, 163427} }, -- 在吗 + { nItem = 21, szTitle = _L['FIREWORK_TITLE_158577'], aUIID = {158577, 160973} }, -- 金鸾喻情 玲珑心 + -- { nItem = 63, szTitle = X.GetItemNameByUIID(65625), aUIID = {65625} }, -- 测试用 焰火棒 + }, + tLoverItem = {}, + nPendingItem = 0, -- 请求结缘烟花nItem序号缓存 + aRawStorageData = nil, -- 防止被恢复界面配置篡改 +}, { + PW = function() return X.SECRET['FILE::LOVE_BACKUP_PW'] end, +}) +for _, p in ipairs(D.aLoverItem) do + assert(not D.tLoverItem[p.nItem], 'MY_Love item index conflict: ' .. p.nItem) + D.tLoverItem[p.nItem] = p +end + +X.RegisterRemoteStorage( + 'MY_Love', 32, 15 * 8, + function(aBit) + -- 转 Byte 表 + local aByte = {} + for i = 1, #aBit, 8 do + local nByte = 0 + for j = 1, 8 do + nByte = nByte * 2 + aBit[(i - 1) + j] + end + table.insert(aByte, nByte) + end + --------------- + -- Version 2 -- + --------------- + local nCrc = 7 + -- 1 crc + for i = 1, #aByte do + nCrc = X.NumberBitXor(nCrc, aByte[i]) + end + if nCrc == 0 then + local dwIDH, dwIDL, xID, nTime, nType, nSendItem, nReceiveItem = 0, 0, nil, 0, 0, 0, 0 + -- 2 - 5 dwIDH + for i = 5, 2, -1 do + dwIDH = X.NumberBitShl(dwIDH, 8) + dwIDH = X.NumberBitOr(dwIDH, aByte[i]) + end + -- 6 - 9 dwIDL + for i = 9, 6, -1 do + dwIDL = X.NumberBitShl(dwIDL, 8) + dwIDL = X.NumberBitOr(dwIDL, aByte[i]) + end + local tBit = X.Number2Bitmap(dwIDL) + for i = #tBit + 1, 32 do + tBit[i] = 0 + end + local tBitH = X.Number2Bitmap(dwIDH) + for i, nBit in ipairs(tBitH) do + tBit[i + 32] = nBit + end + xID = X.Bitmap2NumericString(tBit) + -- 10 - 13 nTime + for i = 13, 10, -1 do + nTime = X.NumberBitShl(nTime, 8) + nTime = X.NumberBitOr(nTime, aByte[i]) + end + -- 14 (nType << 4) | ((nSendItem >> 2) & 0xf) + nType = X.NumberBitShr(aByte[14], 4) + nSendItem = X.NumberBitShl(X.NumberBitAnd(aByte[14], 0xf), 2) + -- 15 (nSendItem & 0x3) << 6 | (nReceiveItem & 0x3f) + nSendItem = X.NumberBitOr(nSendItem, X.NumberBitShr(aByte[15], 6)) + nReceiveItem = X.NumberBitAnd(aByte[15], 0x3f) + return xID, nTime, nType, nSendItem, nReceiveItem + end + --------------- + -- Version 1 -- + --------------- + -- 1 crc + local nCrc = 6 + for i = 1, 11 do + nCrc = X.NumberBitXor(nCrc, aByte[i]) + end + if nCrc == 0 then + local dwID, nTime, nType, nSendItem, nReceiveItem = 0, 0, 0, 0, 0 + -- 2 - 5 dwID + for i = 5, 2, -1 do + dwID = X.NumberBitShl(dwID, 8) + dwID = X.NumberBitOr(dwID, aByte[i]) + end + -- 6 - 9 nTime + for i = 9, 6, -1 do + nTime = X.NumberBitShl(nTime, 8) + nTime = X.NumberBitOr(nTime, aByte[i]) + end + -- 10 (nType << 4) | ((nSendItem >> 2) & 0xf) + nType = X.NumberBitShr(aByte[10], 4) + nSendItem = X.NumberBitShl(X.NumberBitAnd(aByte[10], 0xf), 2) + -- 11 (nSendItem & 0x3) << 6 | (nReceiveItem & 0x3f) + nSendItem = X.NumberBitOr(nSendItem, X.NumberBitShr(aByte[11], 6)) + nReceiveItem = X.NumberBitAnd(aByte[11], 0x3f) + return dwID, nTime, nType, nSendItem, nReceiveItem + end + return NO_LOVER.xID, NO_LOVER.nLoverTime, NO_LOVER.nLoverType, NO_LOVER.nSendItem, NO_LOVER.nReceiveItem + end, + function(...) + local xID, nTime, nType, nSendItem, nReceiveItem = ... + if X.IsString(xID) then + assert(not xID:find('[^0-9]'), 'Value of xID out of 64bit unsigned int string range!') + else + assert(xID >= 0 and xID <= 0xffffffff, 'Value of xID out of 32bit unsigned int range!') + end + assert(nTime >= 0 and nTime <= 0xffffffff, 'Value of nTime out of 32bit unsigned int range!') + assert(nType >= 0 and nType <= 0xf, 'Value of nType out of range 4bit unsigned int range!') + assert(nSendItem >= 0 and nSendItem <= 0x3f, 'Value of nSendItem out of 6bit unsigned int range!') + assert(nReceiveItem >= 0 and nReceiveItem <= 0x3f, 'Value of nReceiveItem out of 6bit unsigned int range!') + -- 输出日志 + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'MY_Love SetRemoteStorage current: ' .. X.EncodeLUAData({X.GetRemoteStorage('MY_Love')}), X.DEBUG_LEVEL.LOG) + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'MY_Love SetRemoteStorage new: ' .. X.EncodeLUAData({...}), X.DEBUG_LEVEL.LOG) + -- 生成 Byte 表 + local aByte = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + if X.IsString(xID) then + --------------- + -- Version 2 -- + --------------- + local nCrc = 7 + local dwIDH, dwIDL = 0, 0 + local tIDBit = X.NumericString2Bitmap(xID) + local tIDHBit, tIDLBit = {}, {} + for i = 1, 32 do + tIDLBit[i] = tIDBit[i] + end + for i = 33, 64 do + tIDHBit[i - 32] = tIDBit[i] + end + dwIDH = X.Bitmap2Number(tIDHBit) + dwIDL = X.Bitmap2Number(tIDLBit) + -- 2 - 5 dwIDH + for i = 2, 5 do + aByte[i] = X.NumberBitAnd(dwIDH, 0xff) + dwIDH = X.NumberBitShr(dwIDH, 8) + end + -- 6 - 9 dwIDL + for i = 6, 9 do + aByte[i] = X.NumberBitAnd(dwIDL, 0xff) + dwIDL = X.NumberBitShr(dwIDL, 8) + end + -- 10 - 13 nTime + for i = 10, 13 do + aByte[i] = X.NumberBitAnd(nTime, 0xff) + nTime = X.NumberBitShr(nTime, 8) + end + -- 14 (nType << 4) | ((nSendItem >> 2) & 0xf) + aByte[14] = X.NumberBitOr(X.NumberBitShl(nType, 4), X.NumberBitAnd(X.NumberBitShr(nSendItem, 2), 0xf)) + -- 15 (nSendItem & 0x3) << 6 | (nReceiveItem & 0x3f) + aByte[15] = X.NumberBitOr(X.NumberBitShl(X.NumberBitAnd(nSendItem, 0x3), 6), X.NumberBitAnd(nReceiveItem, 0x3f)) + -- 1 crc + for i = 2, #aByte do + nCrc = X.NumberBitXor(nCrc, aByte[i]) + end + aByte[1] = nCrc + else + --------------- + -- Version 1 -- + --------------- + local nCrc = 6 + local dwID = xID + -- 2 - 5 dwID + for i = 2, 5 do + aByte[i] = X.NumberBitAnd(dwID, 0xff) + dwID = X.NumberBitShr(dwID, 8) + end + -- 6 - 9 nTime + for i = 6, 9 do + aByte[i] = X.NumberBitAnd(nTime, 0xff) + nTime = X.NumberBitShr(nTime, 8) + end + -- 10 (nType << 4) | ((nSendItem >> 2) & 0xf) + aByte[10] = X.NumberBitOr(X.NumberBitShl(nType, 4), X.NumberBitAnd(X.NumberBitShr(nSendItem, 2), 0xf)) + -- 11 (nSendItem & 0x3) << 6 | (nReceiveItem & 0x3f) + aByte[11] = X.NumberBitOr(X.NumberBitShl(X.NumberBitAnd(nSendItem, 0x3), 6), X.NumberBitAnd(nReceiveItem, 0x3f)) + -- 1 crc + for i = 2, #aByte do + nCrc = X.NumberBitXor(nCrc, aByte[i]) + end + aByte[1] = nCrc + end + -- 转 Bit 表 + local aBit = {} + for _, nByte in ipairs(aByte) do + local aByteBit = { 0, 0, 0, 0, 0, 0, 0, 0 } + for i = 8, 1, -1 do + aByteBit[i] = math.mod(nByte, 2) + nByte = math.floor(nByte / 2) + end + for _, v in ipairs(aByteBit) do + table.insert(aBit, v) + end + end + return aBit + end) + +--[[ +剑侠情缘 +======== +1. 每个角色只允许有一个情缘,情缘必须是好友 +2. 爱要坦荡荡,情缘信息无法隐藏(队友可直接查看,其它人则等您确认) +3. 建立双向情缘,要求六重好友组队并在5尺内,背包中要有真橙之心,并选其为目标,再点插件确认 +4. 单向情缘,可以选择一个 3重好感以上的在线好友,对方会收到匿名通知 +5. 情缘可以随时单向解除,但会密聊通知对方(单向情缘若不在线则不通知) +6. 若删除情缘好友则自动解除情缘关系 + + +心动情缘: + XXXXXXXXX (198大号字 ...) [斩情丝] + 类型:单恋/双向 时长:X天X小时X分钟X秒 + + 与六重队友结连理:[___________] (距离4尺内,带一个真橙之心) + 单恋某个三重好友:[___________] (要求在线,匿名通知对方) + 没情缘时显示什么:[___________] [**] 开启免打扰模式 + + 情缘宣言: [________________________________________________________] + 搭讪用语: [________________________________________________________] + +小提示: + 1. 仅安装本插件的玩家才能相互看见设置 + 2. 情缘可以单方面删除,双向情缘会通过密聊告知对方 + 3. 非队友查看情缘时目会弹出确认框(可开启免打扰屏蔽) +--]] + +--------------------------------------------------------------------- +-- 本地函数和变量 +--------------------------------------------------------------------- + +local BACKUP_DATA_SCHEMA = X.Schema.Record({ + szName = X.Schema.String, + szUUID = X.Schema.String, + szLoverName = X.Schema.String, + szLoverUUID = X.Schema.String, + nLoverType = X.Schema.Number, + nLoverTime = X.Schema.Number, + nSendItem = X.Schema.Number, + nReceiveItem = X.Schema.Number, +}) + +-- 功能屏蔽 +function D.IsShielded() + return false +end + +-- 获取同步范围内指定名字的角色对象 +function D.GetNearbyPlayerByName(szName) + for _, p in ipairs(X.GetNearPlayer()) do + if p.szName == szName then + return p + end + end +end + +-- 获取同步范围内指定 xID 的角色对象 +function D.GetNearbyPlayerByXID(xID) + for _, p in ipairs(X.GetNearPlayer()) do + if p.dwID == xID or X.GetPlayerGlobalID(p.dwID) == xID then + return p + end + end +end + +-- 判断好友和自己是否为跨服好友 +function D.IsCrossingServerFellowship(tFellowship, tFei) + local dwSelfServerID = X.GetClientPlayerServerID() + local dwPeerServerID = tFei.dwServerID + return dwSelfServerID ~= dwPeerServerID +end + +-- 获取背包指定ID物品列表 +function D.GetBagItemPos(aUIID) + local me = X.GetClientPlayer() + for _, dwBox in ipairs(X.GetInventoryBoxList(X.CONSTANT.INVENTORY_TYPE.PACKAGE)) do + for dwX = 0, X.GetInventoryBoxSize(dwBox) - 1 do + local it = X.GetInventoryItem(me, dwBox, dwX) + if it then + for _, nUIID in ipairs(aUIID) do + if it.nUiId == nUIID then + return dwBox, dwX + end + end + end + end + end +end + +-- 根据背包坐标获取物品及数量 +function D.GetBagItemNum(dwBox, dwX) + local item = X.GetInventoryItem(X.GetClientPlayer(), dwBox, dwX) + if not item then + return 0 + elseif not item.bCanStack then + return 1 + else + return item.nStackNum + end +end + +-- 是否可结双向好友 +function D.IsValidDoubleLoveFellowship(tFellowship) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei then + local me = X.GetClientPlayer() + local kTarget = D.GetNearbyPlayerByName(tFei.szName) + if tFellowship.nAttraction >= D.nDoubleLoveAttraction and kTarget and X.IsTeammate(kTarget.dwID) and X.GetCharacterDistance(me, kTarget) <= 4 then + return true + end + end + return false +end + +-- 是否可结双向好友,并返回真橙之心的位置 +function D.GetDoubleLoveItem(tFellowship, aUIID) + if D.IsValidDoubleLoveFellowship(tFellowship) then + return D.GetBagItemPos(aUIID) + end +end + +function D.UseDoubleLoveItem(tFellowship, aUIID, fnCallback) + local dwBox, dwX = D.GetDoubleLoveItem(tFellowship, aUIID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + local kTarget = tFei and D.GetNearbyPlayerByName(tFei.szName) + if tFei and kTarget and dwBox then + local nNum = D.GetBagItemNum(dwBox, dwX) + SetTarget(TARGET.PLAYER, kTarget.dwID) + X.UseInventoryItem(dwBox, dwX) + local nFinishTime = GetTime() + 500 + X.BreatheCall(function() + local me = X.GetClientPlayer() + if not me then + return 0 + end + local nType = X.GetCharacterOTActionState(me) + if nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_ITEM_SKILL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE then -- otActionItemSkill + nFinishTime = GetTime() + 500 + elseif GetTime() > nFinishTime then + fnCallback(D.GetBagItemNum(dwBox, dwX) ~= nNum) + return 0 + end + end) + end +end + +function D.CreateFireworkSelect(fnCallback) + local nCol = 3 -- 按钮列数 + local nMargin = 30 -- 左右边距 + local nLineHeight = 40 -- 行高 + local nItemWidth = 100 -- 按钮宽度 + local nItemHeight = 30 -- 按钮高度 + local nItemPadding = 10 -- 按钮间距 + local ui = X.UI.CreateFrame('MY_Love_SetLover', { + w = nItemWidth * nCol + nMargin * 2 + nItemPadding * (nCol - 1), + h = 50 + math.ceil(#D.aLoverItem / nCol) * nLineHeight + 30, + text = _L['Select a firework'], + }) + local nX, nY = nMargin, 50 + for i, p in ipairs(D.aLoverItem) do + ui:Append('WndButton', { + x = nX, y = nY + (nLineHeight - nItemHeight) / 2, w = nItemWidth, h = nItemHeight, + text = X.GetItemNameByUIID(p.aUIID[1]), + enable = not not D.GetBagItemPos(p.aUIID), + onClick = function() fnCallback(p) end, + tip = { + render = p.szTitle, + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + }) + if i % nCol == 0 then + nX = nMargin + nY = nY + nLineHeight + else + nX = nX + nItemWidth + nItemPadding + end + end +end + +-- 加入校验和确保数据不被篡改(0-255) +function D.EncodeString(szData) + local nCrc = 0 + for i = 1, string.len(szData) do + nCrc = (nCrc + string.byte(szData, i)) % 255 + end + return string.format('%02x', nCrc) .. szData +end + +-- 获取情缘信息(成功返回数据 + rawInfo,失败 nil) +function D.GetLover() + if MY_Love.IsShielded() then + return + end + local me = X.GetClientPlayer() + if not me or not X.CanUseOnlineRemoteStorage() then + return + end + local xLoverID, nLoverTime, nLoverType, nSendItem, nReceiveItem = X.GetRemoteStorage('MY_Love') + -- 没有情缘 + if xLoverID == 0 or xLoverID == '0' then + return + end + local lover, bSyncing = nil, false + X.IterFellowshipInfo(function(tFellowship) + -- 获取当前好友基础信息 + local tFei = X.GetFellowshipEntryInfo(tFellowship.xID) + -- 获取失败则跳过 + if not tFei then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'MY_Love GetFellowshipEntryInfo ' .. tFellowship.xID .. ' failed.', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + bSyncing = true + return + end + -- 不是情缘则跳过 + if tFei.dwID ~= xLoverID and tFellowship.xID ~= xLoverID then + return + end + -- 遍历到情缘,获取基础信息并返回 + local tCard = X.GetFellowshipCardInfo(tFellowship.xID) + if not tCard then + bSyncing = true + X.ApplyFellowshipCard(tFellowship.xID) + end + if X.IsFellowshipTwoWay(tFellowship.xID) then + local szTitle = '' + if D.tLoverItem[D.lover.nSendItem] and D.tLoverItem[D.lover.nSendItem].szTitle then + szTitle = D.tLoverItem[D.lover.nSendItem].szTitle + elseif D.IsCrossingServerFellowship(tFellowship, tFei) then + szTitle = _L.CROSS_SERVER_LOVER_TITLE + end + local szLoverTitle = '' + if D.tLoverItem[D.lover.nReceiveItem] and D.tLoverItem[D.lover.nReceiveItem].szTitle then + szLoverTitle = D.tLoverItem[D.lover.nReceiveItem].szTitle + elseif D.IsCrossingServerFellowship(tFellowship, tFei) then + szLoverTitle = _L.CROSS_SERVER_LOVER_TITLE + end + lover = { + xID = tFellowship.xID, + dwID = tFei.dwPlayerID, + szName = tFei.szName, + szTitle = szTitle, + nSendItem = nSendItem, + nReceiveItem = nReceiveItem, + nLoverType = nLoverType, + nLoverTime = nLoverTime, + szLoverTitle = szLoverTitle, + dwAvatar = tFei.dwMiniAvatarID, + dwForceID = tFei.dwForceID, + nRoleType = tFei.nRoleType, + dwMapID = X.GetFellowshipMapID(tFellowship.xID) or 0, + bOnline = X.IsFellowshipOnline(tFellowship.xID), + } + return 0 + end + end) + return lover, bSyncing +end + +-- 转换好友信息为情缘信息 +function D.UpdateLocalLover() + if MY_Love.IsShielded() then + return + end + local lover, bSyncing = D.GetLover() + if bSyncing then + X.DelayCall(1000, function() + D.UpdateLocalLover() + end) + elseif lover and X.IS_REMAKE then + -- 情缘版本迁移 V1 => V2 + local xLoverID = X.GetRemoteStorage('MY_Love') + if X.IsNumber(xLoverID) and xLoverID ~= 0 and lover.xID ~= 0 and lover.xID ~= '0' then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'MY_Love migrate v1 to v2: ' .. xLoverID .. ' => ' .. X.EncodeLUAData(lover), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.SaveLover(lover.nLoverTime, lover.xID, lover.nLoverType, lover.nSendItem, lover.nReceiveItem) + end + end + if lover and X.IsString(lover.xID) then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage(X.PACKET_INFO.NAME_SPACE, 'MY_Love auto backup: ' .. X.EncodeLUAData(lover), X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + D.BackupLover(lover.szName, lover.xID, true) + end + if not lover then + lover = NO_LOVER + end + local bDiff = false + for k, _ in pairs(NO_LOVER) do + if D.lover[k] ~= lover[k] then + D.lover[k] = lover[k] + bDiff = true + end + end + if bDiff then + FireUIEvent('MY_LOVE_UPDATE') + end +end + +function D.Init() + local K = string.char(75, 69) + local k = string.char(80, 87) + if X.IsString(D[k]) then + D[k] = X[K](D[k] .. string.char(77, 89)) + end + D.bReady = true +end + +function D.FormatTimeCounter(nSec) + if nSec <= 60 then + return nSec .. _L['sec'] + elseif nSec < 3600 then -- X分钟X秒 + return _L('%d min %d sec', nSec / 60, nSec % 60) + elseif nSec < 86400 then -- X小时X分钟 + return _L('%d hour %d min', nSec / 3600, (nSec % 3600) / 60) + elseif nSec < 31536000 then -- X天X小时 + return _L('%d day %d hour', nSec / 86400, (nSec % 86400) / 3600) + else -- X年X天 + return _L('%d year %d day', nSec / 31536000, (nSec % 31536000) / 86400) + end +end + +-- 获取情缘字符串 +function D.FormatLoverString(szPatt, lover) + if X.StringFindW(szPatt, '{$type}') then + if lover.nLoverType == 1 then + szPatt = X.StringReplaceW(szPatt, '{$type}', _L['Mutual love']) + else + szPatt = X.StringReplaceW(szPatt, '{$type}', _L['Blind love']) + end + end + if X.StringFindW(szPatt, '{$time}') then + szPatt = X.StringReplaceW(szPatt, '{$time}', D.FormatTimeCounter(GetCurrentTime() - lover.nLoverTime)) + end + if X.StringFindW(szPatt, '{$name}') then + szPatt = X.StringReplaceW(szPatt, '{$name}', lover.szName) + end + if X.StringFindW(szPatt, '{$map}') then + szPatt = X.StringReplaceW(szPatt, '{$map}', Table_GetMapName(lover.dwMapID)) + end + return szPatt +end + +-- 保存情缘 +function D.SaveLover(nLoverTime, xLoverID, nLoverType, nSendItem, nReceiveItem) + -- 设为无情缘时除dwID外其他改为1用于区别未设置 + if xLoverID == 0 or xLoverID == '0' then + nLoverTime, nLoverType, nSendItem, nReceiveItem = 1, 1, 1, 1 + end + X.SetRemoteStorage('MY_Love', xLoverID, nLoverTime, nLoverType, nSendItem, nReceiveItem) + D.UpdateProtectData() + D.UpdateLocalLover() +end + +-- 设置情缘 +function D.SetLover(xID, nType) + if not X.CanUseOnlineRemoteStorage() then + return X.Alert(_L['Please enable sync common ui config first']) + end + local tFellowship = X.GetFellowshipInfo(xID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if not tFellowship or not tFei or not X.IsFellowshipOnline(tFellowship.xID) then + if nType == -1 then + return X.Alert(_L['Lover must online']) + end + return X.Alert(_L['Lover must be a online friend']) + end + if nType == -1 then + -- 重复放烟花刷新称号 + if xID == D.lover.xID then + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.OutputSystemAnnounceMessage(_L['Light firework is a sensitive action, please unlock to continue.']) + end + D.CreateFireworkSelect(function(p) + D.UseDoubleLoveItem(tFellowship, p.aUIID, function(bSuccess) + if bSuccess then + D.SaveLover(D.lover.nLoverTime, D.lover.xID, D.lover.nLoverType, p.nItem, D.lover.nReceiveItem) + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE_FIREWORK', p.nItem}) + X.UI.CloseFrame('MY_Love_SetLover') + else + X.OutputSystemAnnounceMessage(_L['Failed to light firework.']) + end + end) + end) + end + elseif nType == 0 then + -- 设置成为情缘(在线好友) + -- 单向情缘(简单) + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.OutputSystemAnnounceMessage(_L['Set lover is a sensitive action, please unlock to continue.']) + end + if not tFellowship or not X.IsFellowshipOnline(tFellowship.xID) then + return X.Alert(_L['Lover must be a online friend']) + end + X.Confirm(_L('Do you want to blind love with [%s]?', tFei.szName), function() + if not tFellowship or not X.IsFellowshipOnline(tFellowship.xID) then + return X.Alert(_L['Lover must be a online friend']) + end + if tFellowship.nAttraction < MY_Love.nLoveAttraction then + return X.Alert(_L['Inadequate conditions, requiring Lv2 friend']) + end + D.SaveLover(GetCurrentTime(), xID, nType, 0, 0) + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE0'}) + end) + else + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.OutputSystemAnnounceMessage(_L['Set lover is a sensitive action, please unlock to continue.']) + end + if not tFellowship or not X.IsFellowshipOnline(tFellowship.xID) then + return X.Alert(_L['Lover must be a online friend']) + end + -- 设置成为情缘(在线好友) + local _, szSelfServerName = X.DisassemblePlayerGlobalName(GetClientPlayer().szName, false) + if szSelfServerName then + -- 跨服 + if D.IsCrossingServerFellowship(tFellowship, tFei) then + if not D.IsValidDoubleLoveFellowship(tFellowship) then + return X.Alert(_L['Inadequate conditions, requiring Lv6 friend/party/4-feet distance']) + end + X.Confirm(_L('Do you want to mutual love with [%s]?', tFei.szName), function() + if not D.IsValidDoubleLoveFellowship(tFellowship) then + return X.Alert(_L['Inadequate conditions, requiring Lv6 friend/party/4-feet distance']) + end + D.nPendingItem = 0 + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE_ASK'}) + X.OutputSystemAnnounceMessage(_L('Love request has been sent to [%s], wait please', tFei.szName)) + end) + else + X.Alert(_L['Peer and you are at same server but current crossing sever, please set lover after exit crossing server.']) + end + else + -- 同服双向情缘(在线,组队一起,并且在4尺内,发起方带有一个指定烟花) + D.CreateFireworkSelect(function(p) + if not tFellowship or not X.IsFellowshipOnline(tFellowship.xID) then + return X.Alert(_L['Lover must be a online friend']) + end + if not D.GetDoubleLoveItem(tFellowship, p.aUIID) then + return X.Alert(_L('Inadequate conditions, requiring Lv6 friend/party/4-feet distance/%s', p.szTitle)) + end + X.Confirm(_L('Do you want to mutual love with [%s]?', tFei.szName), function() + if not D.GetDoubleLoveItem(tFellowship, p.aUIID) then + return X.Alert(_L('Inadequate conditions, requiring Lv6 friend/party/4-feet distance/%s', p.szTitle)) + end + D.nPendingItem = p.nItem + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE_ASK'}) + X.OutputSystemAnnounceMessage(_L('Love request has been sent to [%s], wait please', tFei.szName)) + end) + end) + end + end +end + +-- 删除情缘 +function D.RemoveLover() + if not X.CanUseOnlineRemoteStorage() then + return X.Alert(_L['Please enable sync common ui config first']) + end + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.OutputSystemAnnounceMessage(_L['Remove lover is a sensitive action, please unlock to continue.']) + end + local lover = X.Clone(D.lover) + if lover.xID ~= 0 and lover.xID ~= '0' then + local nTime = GetCurrentTime() - lover.nLoverTime + if nTime < D.nMinBreakLoveTime then + return X.Alert(_L('Love can not run a red-light, wait for %s left.', D.FormatTimeCounter(3600 - nTime))) + end + -- 取消情缘 + if lover.nLoverType == 0 then -- 单向 + X.Confirm(_L('Are you sure to cut blind love with [%s]?', lover.szName), function() + -- 单向只通知在线的 + local tFellowship = X.GetFellowshipInfo(lover.xID) + if tFellowship and X.IsFellowshipOnline(tFellowship.xID) then + X.SendBgMsg(lover.szName, 'MY_LOVE', {'REMOVE0'}) + end + D.SaveLover(0, NO_LOVER.xID, 0, 0, 0) + X.OutputSystemMessage(_L['Congratulations, cut blind love finish.']) + end) + elseif lover.nLoverType == 1 then -- 双向 + X.Confirm(_L('Are you sure to cut mutual love with [%s]?', lover.szName), function() + X.DelayCall(50, function() + X.Confirm(_L['Past five hundred times looking back only in exchange for a chance encounter this life, you really decided?'], function() + X.DelayCall(50, function() + X.Confirm(_L['You do not really want to cut off love it, really sure?'], function() + -- 双向则密聊提醒 + X.SendChat(lover.szName, _L['Sorry, I decided to just a swordman, bye my plugin lover']) + D.SaveLover(0, NO_LOVER.xID, 0, 0, 0) + -- X.SendChat(PLAYER_TALK_CHANNEL.TONG, _L('A blade and cut, no longer meet with [%s].', lover.szName)) + X.OutputSystemMessage(_L['Congratulations, do not repeat the same mistakes ah.']) + end) + end) + end) + end) + end) + end + end +end + +-- 修复双向情缘 +function D.FixLover() + if D.lover.nLoverType ~= 1 then + return X.Alert(_L['Repair feature only supports mutual love!']) + end + local kTarget = D.GetNearbyPlayerByXID(D.lover.xID) + if not kTarget or not X.IsTeammate(kTarget.dwID) then + return X.Alert(_L['Both sides must in a team to be repaired!']) + end + X.SendBgMsg(D.lover.szName, 'MY_LOVE', {'FIX1', { + D.lover.nLoverTime, + D.lover.nSendItem, + D.lover.nReceiveItem, + }}) + X.OutputSystemAnnounceMessage(_L['Repair request has been sent, wait please.']) +end + +-- 获取查看目标 +function D.GetPlayerInfo(dwID) + local kTarget, tPlayerInfo = X.GetPlayer(dwID), nil + if kTarget then + tPlayerInfo = { + dwID = kTarget.dwID, + szName = kTarget.szName, + nGender = kTarget.nGender, + } + -- 远程查看跨服好友需要手动补充后缀 + if X.IS_REMAKE then + local szGlobalID = kTarget.GetGlobalID() + local tFei = X.GetFellowshipEntryInfo(szGlobalID) + if tFei then + tPlayerInfo.szName = tFei.szName + end + end + else + local tFellowship = X.GetFellowshipInfo(dwID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + if tFei then + tPlayerInfo = { + dwID = dwID, + szName = tFei.szName, + nGender = X.IIf(tFei.nRoleType == 2 or tFei.nRoleType == 4 or tFei.nRoleType == 6, 2, 1), + } + end + end + return tPlayerInfo +end + +-- 后台请求别人的情缘数据 +function D.RequestOtherLover(dwID, nX, nY, fnAutoClose) + local tPlayerInfo = D.GetPlayerInfo(dwID) + if not tPlayerInfo then + return + end + local me = X.GetClientPlayer() + local szName = tPlayerInfo.szName + if nX == true or X.IsTeammate(dwID) or X.IsAuthorPlayer(me.dwID) then + if not D.tOtherLover[szName] then + D.tOtherLover[szName] = {} + end + if tPlayerInfo.bFightState and not X.IsTeammate(dwID) then + FireUIEvent('MY_LOVE_OTHER_UPDATE', szName) + FireUIEvent('MY_LOVE_PV_ACTIVE_CHANGE', dwID, false) + return X.OutputSystemAnnounceMessage(_L('[%s] is in fighting, no time for you.', szName)) + end + -- 先清除缓存 + D.tOtherLover[szName] = {} + FireUIEvent('MY_LOVE_OTHER_UPDATE', szName) + -- 再刷新 + X.SendBgMsg(szName, 'MY_LOVE', {'VIEW', X.IsAuthorPlayer(me.dwID) and 'Author' or 'Player'}) + else + local tMsg = { + x = nX, y = nY, + szName = 'MY_Love_Confirm', + szMessage = _L('[%s] is not in your party, do you want to send a request for accessing data?', szName), + szAlignment = 'CENTER', + fnAutoClose = fnAutoClose, + { + szOption = g_tStrings.STR_HOTKEY_SURE, + fnAction = function() + D.RequestOtherLover(dwID, true) + end, + }, { szOption = g_tStrings.STR_HOTKEY_CANCEL }, + } + MessageBox(tMsg) + end +end + +function D.GetOtherLover(szName) + return D.tOtherLover[szName] +end + +function D.RequestBackupLover() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + return X.OutputSystemAnnounceMessage(_L['Backup lover is a sensitive action, please unlock to continue.']) + end + local lover = X.Clone(D.lover) + if lover.nLoverType == 1 then -- 双向 + local kTarget = D.GetNearbyPlayerByXID(lover.xID) + local info = kTarget and X.GetTeamMemberInfo(kTarget.dwID) + if not info or not info.bOnline then + X.OutputSystemAnnounceMessage(_L['Lover must in your team and online to do backup.']) + else + X.SendBgMsg(lover.szName, 'MY_LOVE', {'BACKUP'}) + X.OutputSystemAnnounceMessage(_L['Backup request has been sent, wait please.']) + end + else + X.OutputSystemAnnounceMessage(_L['Backup feature only supports mutual love!']) + end +end + +function D.BackupLover(szLoverName, szLoverUUID, bAutoBackup) + if not X.CanUseOnlineRemoteStorage() then + if not bAutoBackup then + X.Alert(_L['Please enable sync common ui config first']) + end + return + end + local lover = X.Clone(D.lover) + if szLoverName == lover.szName and szLoverUUID then + local szPath = X.FormatPath( + { + 'export/lover_backup/' + .. X.GetClientPlayerName() .. '_' .. X.GetClientPlayerGlobalID() .. '-' + .. szLoverName .. '_' .. szLoverUUID + .. ( + bAutoBackup + and '' + or ('-' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + ) + .. '.lover.jx3dat', + X.PATH_TYPE.ROLE + }) + X.SaveLUAData( + szPath, + { + szName = X.GetClientPlayerName(), + szUUID = X.GetClientPlayerGlobalID(), + szLoverName = szLoverName, + szLoverUUID = szLoverUUID, + nLoverType = lover.nLoverType, + nLoverTime = lover.nLoverTime, + nSendItem = lover.nSendItem, + nReceiveItem = lover.nReceiveItem, + }, + { passphrase = D.PW } + ) + if not bAutoBackup then + local szFullPath = X.GetAbsolutePath(szPath) + X.Alert(_L('Backup lover succeed, file located at: %s.', szFullPath)) + X.OutputSystemMessage(_L('Backup lover succeed, file located at: %s.', szFullPath)) + end + end +end + +function D.RestoreLover(szFilePath) + local data = X.LoadLUAData(szFilePath, { passphrase = D.PW }) + local errs = X.Schema.CheckSchema(data, BACKUP_DATA_SCHEMA) + if errs then + return X.Alert(_L['Error: file is not a valid lover backup!']) + end + if data.szUUID == X.GetClientPlayerGlobalID() then + GetUserInput(_L['Please input your lover\'s current name:'], function(szLoverName) + szLoverName = X.StringReplaceW(X.StringReplaceW(X.TrimString(szLoverName), '[', ''), ']', '') + X.Confirm( + _L('Send restore lover request to [%s]?', szLoverName), + function() + X.SendBgMsg(szLoverName, 'MY_LOVE', {'RESTORE', data}) + end + ) + end, nil, nil, nil, data.szLoverName) + else + X.Alert(_L['This file is not your lover backup, please check!']) + end +end + +------------------------------------- +-- 事件处理 +------------------------------------- +-- 好友数据更新,随时检查情缘变化(删除好友改备注等) +do +local function OnFellowshipUpdate() + if MY_Love.IsShielded() then + return + end + -- 上线提示 + local lover = D.GetLover() + if lover and lover.bOnline and lover.dwMapID ~= 0 + and (D.lover.xID ~= lover.xID or D.lover.bOnline ~= lover.bOnline) then + D.OutputLoverMsg(D.FormatLoverString(_L('Warm tip: Your {$type} lover [{$name}] is happy in [{$map}].'), lover)) + end + -- 载入情缘 + D.UpdateLocalLover() +end +X.RegisterEvent('LOADING_ENDING', 'MY_Love', OnFellowshipUpdate) +X.RegisterEvent('PLAYER_FELLOWSHIP_UPDATE', 'MY_Love', OnFellowshipUpdate) +X.RegisterEvent('FELLOWSHIP_CARD_CHANGE', 'MY_Love', OnFellowshipUpdate) +X.RegisterEvent('UPDATE_FELLOWSHIP_CARD', 'MY_Love', OnFellowshipUpdate) +end + +-- 回复情缘信息 +function D.ReplyLove(bCancel) + local szName, szNameSuffix = D.lover.szName, '' + if bCancel then + szName = _L[''] + elseif D.lover.xID == 0 or D.lover.xID == '0' then + szName = '<' .. O.szNone .. '>' + else + -- 计算情缘名字后的服务器后缀 + if not X.StringFindW(szName, g_tStrings.STR_CONNECT) then + local tFellowship = X.GetFellowshipInfo(D.lover.xID) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + local szServerName = tFei and X.GetServerNameByID(tFei.dwServerID) + if szServerName then + szNameSuffix = g_tStrings.STR_CONNECT .. szServerName + end + end + end + for dwTalkerID, szTalkerName in pairs(D.tViewer) do + local szLoverName = szName + -- 如果请求来源是跨服,则回复名字也携带跨服后缀 + if X.StringFindW(szTalkerName, g_tStrings.STR_CONNECT) then + szLoverName = szLoverName .. szNameSuffix + end + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'REPLY', { + D.lover.xID, + szLoverName, + D.lover.dwAvatar or 0, + O.szSign, + D.lover.dwForceID or 0, + D.lover.nRoleType or 0, + D.lover.nLoverType, + D.lover.nLoverTime, + D.lover.szLoverTitle, + }}) + end + D.tViewer = {} +end + +-- 后台同步 +do +local function OnBgTalk(_, aData, nChannel, dwTalkerID, szTalkerName, bSelf) + if MY_Love.IsShielded() then + return + end + if bSelf then + return + end + if not X.CanUseOnlineRemoteStorage() then + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'DATA_NOT_SYNC'}) + return + end + local kTarget = D.GetNearbyPlayerByName(szTalkerName) + local tFellowship = X.GetFellowshipInfo(dwTalkerID) or X.GetFellowshipInfo(szTalkerName) + local tFei = tFellowship and X.GetFellowshipEntryInfo(tFellowship.xID) + local szKey, data = aData[1], aData[2] + if szKey == 'VIEW' then + if X.IsTeammate(dwTalkerID) or data == 'Author' or O.bAutoReplyLover then + D.tViewer[dwTalkerID] = szTalkerName + D.ReplyLove() + elseif not X.GetClientPlayer().bFightState and not O.bQuiet then + D.tViewer[dwTalkerID] = szTalkerName + X.Confirm( + _L('[%s] want to see your lover info, OK?', szTalkerName), + function() D.ReplyLove() end, + function() D.ReplyLove(true) end + ) + end + elseif szKey == 'LOVE0' or szKey == 'REMOVE0' then + local i = X.Random(1, math.floor(table.getn(D.aAutoSay)/2)) * 2 + if szKey == 'LOVE0' then + i = i - 1 + end + OutputMessage('MSG_WHISPER', _L['[Mystery] quietly said:'] .. D.aAutoSay[i] .. '\n') + PlaySound(SOUND.UI_SOUND,g_sound.Whisper) + elseif szKey == 'LOVE_ASK' then + if not tFellowship or not kTarget then + return + end + if D.lover.xID == tFellowship.xID and D.lover.nLoverType == 1 then + -- 已是情缘发起修复 + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'FIX2', { + D.lover.nLoverTime, + D.lover.nSendItem, + D.lover.nReceiveItem, + }}) + elseif D.lover.xID ~= 0 and D.lover.xID ~= '0' and (D.lover.xID ~= tFellowship.xID or D.lover.nLoverType == 1) then + -- 已有情缘直接拒绝 + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'LOVE_ANS_EXISTS'}) + else + -- 询问意见 + X.Confirm(_L('[%s] want to mutual love with you, OK?', szTalkerName), function() + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'LOVE_ANS_YES'}) + end, function() + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'LOVE_ANS_NO'}) + end) + end + elseif szKey == 'FIX1' or szKey == 'FIX2' then + if not tFellowship or not kTarget then + return + end + if D.lover.xID == 0 or D.lover.xID == '0' or (D.lover.xID == tFellowship.xID and D.lover.nLoverType ~= 1) then + if tFellowship then + local szText = szKey == 'FIX1' + and _L('[%s] want to repair love relation with you, OK?', szTalkerName) + or _L('[%s] is already your lover, fix it now?', szTalkerName) + X.Confirm(szText, function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Fix lover is a sensitive action, please unlock to continue.']) + return false + end + X.UI.CloseFrame('MY_Love_SetLover') + D.SaveLover(tonumber(data[1]), tFellowship.xID, 1, data[3], data[2]) + X.SendChat(PLAYER_TALK_CHANNEL.TONG, _L('From now on, my heart lover is [%s]', szTalkerName)) + X.OutputSystemAnnounceMessage(_L('Congratulations, love relation with [%s] has been fixed!', szTalkerName)) + end) + end + elseif szKey == 'FIX1' then + if D.lover.xID == tFellowship.xID then + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'LOVE_ANS_ALREADY'}) + else + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'LOVE_ANS_EXISTS'}) + end + end + elseif szKey == 'LOVE_ANS_EXISTS' then + local szMsg = _L['Unfortunately the other has lover, but you can still blind love him!'] + X.OutputSystemMessage(szMsg) + X.Alert(szMsg) + elseif szKey == 'LOVE_ANS_ALREADY' then + local szMsg = _L['The other is already your lover!'] + X.OutputSystemMessage(szMsg) + X.Alert(szMsg) + elseif szKey == 'LOVE_ANS_NO' then + local szMsg = _L['The other refused you without reason, but you can still blind love him!'] + X.OutputSystemMessage(szMsg) + X.Alert(szMsg) + elseif szKey == 'LOVE_ANS_YES' then + if not tFellowship or not tFei then + return + end + local nItem = D.nPendingItem + if nItem == 0 then + D.SaveLover(GetCurrentTime(), tFellowship.xID, 1, nItem, 0) + X.SendChat(PLAYER_TALK_CHANNEL.TONG, _L('From now on, my heart lover is [%s]', szTalkerName)) + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE_ANS_CONF', nItem}) + X.OutputSystemAnnounceMessage(_L('Congratulations, success to attach love with [%s]!', tFei.szName)) + else + local aUIID = nItem and D.tLoverItem[nItem] and D.tLoverItem[nItem].aUIID + if X.IsEmpty(aUIID) then + return + end + D.UseDoubleLoveItem(tFellowship, aUIID, function(bSuccess) + if bSuccess then + D.SaveLover(GetCurrentTime(), tFellowship.xID, 1, nItem, 0) + X.SendChat(PLAYER_TALK_CHANNEL.TONG, _L('From now on, my heart lover is [%s]', szTalkerName)) + X.SendBgMsg(tFei.szName, 'MY_LOVE', {'LOVE_ANS_CONF', nItem}) + X.OutputSystemAnnounceMessage(_L('Congratulations, success to attach love with [%s]!', tFei.szName)) + X.UI.CloseFrame('MY_Love_SetLover') + else + X.OutputSystemAnnounceMessage(_L['Failed to attach love, light firework failed.']) + end + end) + end + elseif szKey == 'LOVE_ANS_CONF' then + if tFei then + D.SaveLover(GetCurrentTime(), tFellowship.xID, 1, 0, data) + X.SendChat(PLAYER_TALK_CHANNEL.TONG, _L('From now on, my heart lover is [%s]', szTalkerName)) + X.OutputSystemAnnounceMessage(_L('Congratulations, success to attach love with [%s]!', tFei.szName)) + end + elseif szKey == 'LOVE_FIREWORK' then + if tFellowship and D.lover.xID == tFellowship.xID then + D.SaveLover(D.lover.nLoverTime, tFellowship.xID, D.lover.nLoverType, D.lover.nSendItem, data) + end + elseif szKey == 'REPLY' then + D.tOtherLover[szTalkerName] = { + xID = data[1] or 0, + szName = data[2] or '', + dwAvatar = tonumber(data[3]) or 0, + szSign = data[4] or '', + dwForceID = tonumber(data[5]), + nRoleType = tonumber(data[6]) or 1, + nLoverType = tonumber(data[7]) or 0, + nLoverTime = tonumber(data[8]) or 0, + szLoverTitle = data[9] or '', + } + FireUIEvent('MY_LOVE_OTHER_UPDATE', szTalkerName) + elseif szKey == 'BACKUP' then + if not tFellowship then + return + end + if D.lover.xID == tFellowship.xID then + X.Confirm(_L('[%s] want to backup lover relation with you, do you agree?', szTalkerName), function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Backup lover is a sensitive action, please unlock to continue.']) + return false + end + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'BACKUP_ANS', X.GetClientPlayerGlobalID()}) + end) + else + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'BACKUP_ANS_NOT_LOVER'}) + end + elseif szKey == 'BACKUP_ANS' then + D.BackupLover(szTalkerName, data) + elseif szKey == 'BACKUP_ANS_NOT_LOVER' then + X.Alert(_L['Peer is not your lover, please check, or do fix lover first.']) + elseif szKey == 'RESTORE' then + if data.szLoverUUID == X.GetClientPlayerGlobalID() then + X.Confirm(_L('[%s] want to restore lover relation with you, do you agree?', szTalkerName), function() + if X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.EQUIP) or X.IsSafeLocked(SAFE_LOCK_EFFECT_TYPE.TALK) then + X.OutputSystemAnnounceMessage(_L['Restore lover is a sensitive action, please unlock to continue.']) + return false + end + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'RESTORE_AGREE', data}) + end) + else + X.SendBgMsg(szTalkerName, 'MY_LOVE', {'RESTORE_NOT_ME', data}) + end + elseif szKey == 'RESTORE_AGREE' then + if X.GetClientPlayerGlobalID() == data.szUUID and not X.Schema.CheckSchema(data, BACKUP_DATA_SCHEMA) and tFellowship then + D.SaveLover(data.nLoverTime, tFellowship.xID, data.nLoverType, data.nSendItem, data.nReceiveItem) + X.Alert(_L['Restore lover succeed!']) + end + elseif szKey == 'RESTORE_NOT_ME' then + X.Alert(_L['Peer is not your lover in this backup, please check.']) + elseif szKey == 'DATA_NOT_SYNC' then + X.Alert(_L('[%s] disabled ui config sync, unable to read data.', szTalkerName)) + end +end +X.RegisterBgMsg('MY_LOVE', OnBgTalk) +end + +-- 情缘名字链接通知 +function D.OutputLoverMsg(szMsg) + X.SendChat(PLAYER_TALK_CHANNEL.LOCAL_SYS, szMsg) +end + +-- 上线,下线通知:bOnLine, szName, bFoe +do +local function OnPlayerFellowshipLogin() + if MY_Love.IsShielded() then + return + end + local bLoad, szName, bFoe = arg0, arg1, arg2 + if not bFoe and szName == D.lover.szName and D.lover.szName ~= '' then + if bLoad then + X.UI.CreateFloatText(_L('Love tip: %s is online now', D.lover.szName), 1500, { + nFont = 19, + fScale = 2.5, + nR = 255, + nG = 0, + nB = 255, + nOffsetY = 100, + tKeyFrame = { + [0] = { + nOffsetY = 200, + nAlpha = 0, + fScale = 0.2, + }, + [0.08] = { + nOffsetY = 0, + nAlpha = 255, + fScale = 1, + }, + [0.7] = {}, + [1] = { + nAlpha = 0, + }, + }, + }) + PlaySound(SOUND.UI_SOUND, g_sound.LevelUp) + D.OutputLoverMsg(D.FormatLoverString(_L('Warm tip: Your {$type} lover [{$name}] online, hurry doing needy doing.'), D.lover)) + else + D.OutputLoverMsg(D.FormatLoverString(_L('Warm tip: Your {$type} lover [{$name}] offline, hurry doing like doing.'), D.lover)) + end + if not Station.Lookup('Normal/SocialPanel') then + X.UI.OpenFrame('SocialPanel') + X.UI.CloseFrame('SocialPanel') + end + end +end +X.RegisterEvent('PLAYER_FELLOWSHIP_LOGIN', 'MY_Love', OnPlayerFellowshipLogin) +end + +-- player enter +do +local function OnPlayerEnterScene() + local kTarget = X.GetPlayer(arg0) + if D.bReady and O.bAutoFocus and kTarget and kTarget.szName == D.lover.szName + and MY_Focus and MY_Focus.SetFocusID and not X.IsInArenaMap() then + MY_Focus.SetFocusID(TARGET.PLAYER, arg0) + end +end +X.RegisterEvent('MY_PLAYER_ENTER_SCENE', 'MY_Love', OnPlayerEnterScene) +end + +-- on init +do +local function OnInit() + D.Init() + D.UpdateLocalLover() +end +X.RegisterInit('MY_Love', OnInit) +end + +-- protect data +do +function D.UpdateProtectData() + D.aRawStorageData = X.RawGetRemoteStorage('MY_Love') +end +local function onSyncUserPreferencesEnd() + if D.aRawStorageData then + X.RawSetRemoteStorage('MY_Love', D.aRawStorageData) + else + D.UpdateProtectData() + end +end +X.RegisterEvent('SYNC_USER_PREFERENCES_END', 'MY_Love', onSyncUserPreferencesEnd) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Love', + exports = { + { + fields = { + 'nLoveAttraction', + 'nDoubleLoveAttraction', + 'nMinBreakLoveTime', + 'IsShielded', + 'GetNearbyPlayerByName', + 'GetNearbyPlayerByXID', + 'GetLover', + 'SetLover', + 'FixLover', + 'RequestBackupLover', + 'BackupLover', + 'RestoreLover', + 'RemoveLover', + 'FormatLoverString', + 'GetPlayerInfo', + 'RequestOtherLover', + 'GetOtherLover', + }, + root = D, + }, + { + fields = { + 'bQuiet', + 'szNone', + 'szJabber', + 'szSign', + 'bAutoFocus', + 'bHookPlayerView', + 'bAutoReplyLover', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bQuiet', + 'szNone', + 'szJabber', + 'szSign', + 'bAutoFocus', + 'bHookPlayerView', + 'bAutoReplyLover', + }, + triggers = { + bAutoFocus = function(_, bAutoFocus) + if bAutoFocus and D.lover.xID ~= 0 and D.lover.xID ~= '0' and MY_Focus and MY_Focus.SetFocusID then + local kTarget = D.GetNearbyPlayerByName(D.lover.szName) + if kTarget then + MY_Focus.SetFocusID(TARGET.PLAYER, kTarget.dwID) + end + elseif not bAutoFocus and D.lover.xID ~= 0 and D.lover.xID ~= '0' and MY_Focus and MY_Focus.RemoveFocusID then + local kTarget = D.GetNearbyPlayerByName(D.lover.szName) + if kTarget then + MY_Focus.RemoveFocusID(TARGET.PLAYER, kTarget.dwID) + end + end + end, + bHookPlayerView = function(_, bHookPlayerView) + FireUIEvent('MY_LOVE_PV_HOOK', bHookPlayerView) + end, + }, + root = O, + }, + }, +} +MY_Love = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Memo.lua b/MY_Toolbox/src/MY_Memo.lua new file mode 100644 index 000000000..947af5aea --- /dev/null +++ b/MY_Toolbox/src/MY_Memo.lua @@ -0,0 +1,216 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 随身便笺 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Memo' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local ROLE_MEMO = { + bEnable = false, + nWidth = 200, + nHeight = 200, + szContent = '', + nFont = 0, + anchor = { s = 'TOPRIGHT', r = 'TOPRIGHT', x = -310, y = 135 }, +} +local GLOBAL_MEMO = { + bEnable = false, + nWidth = 200, + nHeight = 200, + szContent = '', + nFont = 0, + anchor = { s = 'TOPRIGHT', r = 'TOPRIGHT', x = -310, y = 335 }, +} +local D = {} + +function D.Reload(bGlobal) + local CFG_O = bGlobal and GLOBAL_MEMO or ROLE_MEMO + local CFG = setmetatable({}, { + __index = CFG_O, + __newindex = function(t, k, v) + CFG_O[k] = v + X.DelayCall('MY_Memo_SaveConfig', D.SaveConfig) + end, + }) + local NAME = bGlobal and 'MY_MemoGlobal' or 'MY_MemoRole' + local TITLE = bGlobal and _L['MY Memo (Global)'] or _L['MY Memo (Role)'] + X.UI('Normal/' .. NAME):Remove() + if CFG.bEnable then + X.UI.CreateFrame(NAME, { + theme = X.UI.FRAME_THEME.SIMPLE, alpha = 140, + maximize = true, minimize = true, resize = true, + minWidth = 180, minHeight = 100, + onSizeChange = function() + local ui = X.UI(this) + CFG.nWidth = ui:Width() + CFG.anchor = ui:Anchor() + CFG.nHeight = ui:Height() + local nW, nH = ui:ContainerSize() + ui:Children('#WndEditBox_Memo'):Size(nW, nH) + end, + onFrameVisualStateChange = function() + local ui = X.UI(this) + local nW, nH = ui:ContainerSize() + ui:Children('#WndEditBox_Memo'):Size(nW, nH) + end, + w = CFG.nWidth, h = CFG.nHeight, text = TITLE, + draggable = true, dragArea = {0, 0, CFG.nWidth, 30}, + anchor = CFG.anchor, + events = {{ 'UI_SCALED', function() X.UI(this):Anchor(CFG.anchor) end }}, + uiEvents = {{ 'OnFrameDragEnd', function() CFG.anchor = X.UI('Normal/' .. NAME):Anchor() end }}, + }):Append('WndEditBox', { + name = 'WndEditBox_Memo', + x = 0, y = 0, w = CFG.nWidth, h = CFG.nHeight - 30, + text = CFG.szContent, multiline = true, + font = CFG.nFont, + onChange = function(text) CFG.szContent = text end, + }) + end +end + +function D.LoadConfig() + local CFG = X.LoadLUAData({'config/memo.jx3dat', X.PATH_TYPE.GLOBAL}) + if CFG then + for k, v in pairs(CFG) do + GLOBAL_MEMO[k] = v + end + end + + local CFG = X.LoadLUAData({'config/memo.jx3dat', X.PATH_TYPE.ROLE}) + if CFG then + for k, v in pairs(CFG) do + ROLE_MEMO[k] = v + end + ROLE_MEMO.bEnableGlobal = nil + GLOBAL_MEMO.bEnable = CFG.bEnableGlobal + end +end + +function D.SaveConfig() + local CFG = {} + for k, v in pairs(ROLE_MEMO) do + CFG[k] = v + end + CFG.bEnableGlobal = GLOBAL_MEMO.bEnable + X.SaveLUAData({'config/memo.jx3dat', X.PATH_TYPE.ROLE}, CFG) + + local CFG = {} + for k, v in pairs(GLOBAL_MEMO) do + CFG[k] = v + end + CFG.bEnable = nil + X.SaveLUAData({'config/memo.jx3dat', X.PATH_TYPE.GLOBAL}, CFG) +end + +function D.IsEnable(bGlobal) + if bGlobal then + return GLOBAL_MEMO.bEnable + end + return ROLE_MEMO.bEnable +end + +function D.Toggle(bGlobal, bEnable) + (bGlobal and GLOBAL_MEMO or ROLE_MEMO).bEnable = bEnable + D.SaveConfig() + D.Reload(bGlobal) +end + +function D.GetFont(bGlobal) + if bGlobal then + return GLOBAL_MEMO.nFont + end + return ROLE_MEMO.nFont +end + +function D.SetFont(bGlobal, nFont) + (bGlobal and GLOBAL_MEMO or ROLE_MEMO).nFont = nFont + D.SaveConfig() + D.Reload(bGlobal) +end + +do +local function onInit() + D.LoadConfig() + D.Reload(true) + D.Reload(false) +end +X.RegisterInit('MY_Memo', onInit) +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, h = 24, + text = _L['Memo (Role)'], + checked = D.IsEnable(false), + onCheck = function(bChecked) + D.Toggle(false, bChecked) + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, h = 24, + text = _L['Font'], + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + D.SetFont(false, nFont) + end) + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, h = 24, + text = _L['Memo (Global)'], + checked = D.IsEnable(true), + onCheck = function(bChecked) + D.Toggle(true, bChecked) + end, + }):AutoWidth():Width() + 5 + + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, h = 24, + text = _L['Font'], + buttonStyle = 'FLAT', + onClick = function() + X.UI.OpenFontPicker(function(nFont) + D.SetFont(true, nFont) + end) + end, + }):AutoWidth():Width() + 5 + nY = nY + nLH + nX = nPaddingX + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_Memo', + exports = { + { + fields = { + OnPanelActivePartial = D.OnPanelActivePartial, + }, + }, + }, +} +MY_Memo = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_MibaoHelper.lua b/MY_Toolbox/src/MY_MibaoHelper.lua new file mode 100644 index 000000000..7b3b38905 --- /dev/null +++ b/MY_Toolbox/src/MY_MibaoHelper.lua @@ -0,0 +1,94 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 密码锁解锁提醒 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_MibaoHelper' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_MibaoHelper', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_MibaoHelper'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +function D.OnInit() + -- 刚进游戏好像获取不到锁状态 20秒之后再说吧 + X.DelayCall('MY_LOCK_TIP_DELAY', 20000, function() + if not X.IsPhoneLock() and X.GetClientPlayer() then -- 手机密保还提示个鸡 + local state, nResetTime = Lock_State() + if state == 'PASSWORD_LOCK' then + X.DelayCall('MY_LOCK_TIP', 100000, function() + local state, nResetTime = Lock_State() + if state == 'PASSWORD_LOCK' then + local szGlobalID = X.GetClientPlayerGlobalID() + local szText = szGlobalID and _L.LOCK_TIP[szGlobalID] or _L['You have been loged in for 2min, you can unlock bag locker now.'] + X.OutputSystemMessage(szText) + OutputWarningMessage('MSG_REWARD_GREEN', szText, 10) + end + end) + end + end + end) +end +X.RegisterInit('MY_MibaoHelper', D.OnInit) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_MibaoHelper', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + root = O, + }, + }, +} +MY_MibaoHelper = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_PetWiki.lua b/MY_Toolbox/src/MY_PetWiki.lua new file mode 100644 index 000000000..ded43e7f2 --- /dev/null +++ b/MY_Toolbox/src/MY_PetWiki.lua @@ -0,0 +1,291 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 宠物百科 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_PetWiki' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_PetWiki', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_PetWiki'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_PetWiki'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 850, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_PetWiki'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 610, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwPetIndex) + local tPet = Table_GetFellowPet(dwPetIndex) + if not tPet then + return + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/pet/' .. dwPetIndex .. '?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + player = X.GetClientPlayerName(), + })) + local szKey = 'PetsWiki_' .. dwPetIndex + local szTitle = tPet.szName .. ' - ' .. X.XMLGetPureText(tPet.szDesc) + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.HookPetFrame(frame) + ---------------- + -- 怀旧版 + ---------------- + local hMyPets = frame:Lookup('PageSet_All/Page_MyPet/WndScroll_myPets', '') + if hMyPets then + local function OnPetItemLButtonClick() + if O.bEnable and this.tPet and not IsCtrlKeyDown() and not IsAltKeyDown() and this:IsObjectSelected() then + D.Open(this.tPet.dwPetIndex) + return + end + return X.UI.FormatUIEventMask(false, true) + end + X.UI.HookHandleAppend(hMyPets, function(_, hMyPet) + local hPets = hMyPet:Lookup('Handle_petsBox') + X.DelayCall(function() + if not hPets:IsValid() then + return + end + X.UI.HookHandleAppend(hPets, function(_, hPet) + X.DelayCall(function() + if not hPet:IsValid() then + return + end + local box = hPet:Lookup('Box_petItem') + X.SetMemberFunctionHook( + box, + 'OnItemLButtonClick', + 'MY_PetWiki', + OnPetItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + box:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end) + end) + end) + end) + end + + ---------------- + -- 重制版 + ---------------- + local hMedalPets = frame:Lookup('PageSet_All/Page_MedalCollected/Wnd_MedalCollect', 'Handle_MedalPets') + if hMedalPets then + local function OnPetItemLButtonClick() + if O.bEnable and this.tPet and not IsCtrlKeyDown() and not IsAltKeyDown() and this:IsObjectSelected() then + D.Open(this.tPet.dwPetIndex) + return + end + return X.UI.FormatUIEventMask(false, true) + end + for nNum = 1, 10 do + local hMedal = hMedalPets:Lookup('Handle_MedalPet_' .. nNum) + if hMedal then + for nIndex = 1, nNum do + local boxPet = hMedal:Lookup('Box_MedalPet_' .. nNum .. '_' .. nIndex) + if boxPet then + X.SetMemberFunctionHook( + boxPet, + 'OnItemLButtonClick', + 'MY_PetWiki', + OnPetItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + boxPet:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end + end + end + end + end + + local hPreferList = frame:Lookup('PageSet_All/Page_MyPet/WndScroll_Pets/WndContainer_Pets/Wnd_Prefer', '') + if hPreferList then + local function OnPetItemLButtonClick() + if O.bEnable and this:GetParent().tPet and not IsCtrlKeyDown() and not IsAltKeyDown() and this:IsObjectSelected() then + D.Open(this:GetParent().tPet.dwPetIndex) + return + end + return X.UI.FormatUIEventMask(false, true) + end + for i = 0, hPreferList:GetItemCount() - 1 do + local hBox = hPreferList:Lookup(i):Lookup('Box_Prefer') + X.SetMemberFunctionHook( + hBox, + 'OnItemLButtonClick', + 'MY_PetWiki', + OnPetItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + hBox:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end + end + + local hPets = frame:Lookup('PageSet_All/Page_MyPet/WndScroll_Pets/WndContainer_Pets/Wnd_Pets', '') + if hPets then + local function OnPetItemLButtonClick() + if O.bEnable and this.tPet and not IsCtrlKeyDown() and not IsAltKeyDown() and this:IsObjectSelected() then + D.Open(this.tPet.dwPetIndex) + return + end + return X.UI.FormatUIEventMask(false, true) + end + X.UI.HookHandleAppend(hPets, function(_, hGroup) + local hList = hGroup and hGroup:Lookup((hGroup:GetName():gsub('Handle_Pets', 'Handle_List'))) + if not hList then + return + end + X.UI.HookHandleAppend(hList, function(_, hItem) + X.DelayCall(function() + local boxPet = hItem:IsValid() and hItem:Lookup('Box_PetItem') + if not boxPet then + return + end + X.SetMemberFunctionHook( + boxPet, + 'OnItemLButtonClick', + 'MY_PetWiki', + OnPetItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + boxPet:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end) + end) + end) + local hList = hPets:Lookup('Handle_ListAcquired') + if hList then + X.UI.HookHandleAppend(hList, function(_, hItem) + X.DelayCall(function() + local boxPet = hItem:IsValid() and hItem:Lookup('Box_PetItem') + if not boxPet then + return + end + X.SetMemberFunctionHook( + boxPet, + 'OnItemLButtonClick', + 'MY_PetWiki', + OnPetItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + boxPet:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end) + end) + end + end +end + +X.RegisterInit('MY_PetWiki', function() + local frame = Station.Lookup('Normal/NewPet') + if not frame then + return + end + D.HookPetFrame(frame) +end) + +X.RegisterFrameCreate('NewPet', 'MY_PetWiki', function(name, frame) + D.HookPetFrame(frame) +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Pet wiki'], + tip = { + render = _L['Click icon on pet panel to view pet wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_PetWiki.bEnable, + onCheck = function(bChecked) + MY_PetWiki.bEnable = bChecked + end, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_PetWiki', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, +} +MY_PetWiki = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_PlayerRemark.lua b/MY_Toolbox/src/MY_PlayerRemark.lua new file mode 100644 index 000000000..e8795737f --- /dev/null +++ b/MY_Toolbox/src/MY_PlayerRemark.lua @@ -0,0 +1,579 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 角色备注 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_PlayerRemark' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_PlayerRemark' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_PlayerRemark.Export', { ['*'] = true, intl = false }) +-------------------------------------------------------------------------- +local D = {} +local DB_ERR_COUNT, DB_MAX_ERR_COUNT = 0, 5 +local DB, DBP_W, DBP_DN, DBP_DG, DBP_R, DBP_RI, DBP_RN, DBP_RGI + +local function InitDB() + if DB then + return true + end + if DB_ERR_COUNT > DB_MAX_ERR_COUNT then + return false + end + CPath.MakeDir(X.FormatPath({'userdata/player_remark/', X.PATH_TYPE.GLOBAL})) + DB = X.SQLiteConnect(_L['MY_PlayerRemark'], {'userdata/player_remark/player_remark.v4.db', X.PATH_TYPE.GLOBAL}) + if not DB then + local szMsg = _L['Cannot connect to database!!!'] + if DB_ERR_COUNT > 0 then + szMsg = szMsg .. _L(' Retry time: %d', DB_ERR_COUNT) + end + DB_ERR_COUNT = DB_ERR_COUNT + 1 + X.OutputSystemMessage(_L['MY_PlayerRemark'], szMsg, X.CONSTANT.MSG_THEME.ERROR) + return false + end + X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS Info ( + key NVARCHAR(128) NOT NULL, + value NVARCHAR(4096) NOT NULL, + PRIMARY KEY (key) + ) + ]]) + X.SQLiteExecute(DB, [[INSERT INTO Info (key, value) VALUES ('version', '3')]]) + X.SQLiteExecute(DB, [[ + CREATE TABLE IF NOT EXISTS PlayerRemark ( + server NVARCHAR(10) NOT NULL, + id INTEGER NOT NULL, + name NVARCHAR(20) NOT NULL, + guid NVARCHAR(20) NOT NULL, + remark NVARCHAR(255) NOT NULL, + extra TEXT NOT NULL, + PRIMARY KEY (guid) + ) + ]]) + X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS player_info_server_id_idx ON PlayerRemark(server, id)') + X.SQLiteExecute(DB, 'CREATE INDEX IF NOT EXISTS player_info_server_name_idx ON PlayerRemark(server, name)') + DBP_W = X.SQLitePrepare(DB, 'REPLACE INTO PlayerRemark (server, id, name, guid, remark, extra) VALUES (?, ?, ?, ?, ?, ?)') + DBP_DN = X.SQLitePrepare(DB, 'DELETE FROM PlayerRemark WHERE server = ? AND name = ?') + DBP_DG = X.SQLitePrepare(DB, 'DELETE FROM PlayerRemark WHERE guid = ?') + DBP_R = X.SQLitePrepare(DB, 'SELECT server as szServerName, id as dwID, name as szName, guid as szGUID, remark as szRemark, extra as szExtra FROM PlayerRemark') + DBP_RI = X.SQLitePrepare(DB, 'SELECT server as szServerName, id as dwID, name as szName, guid as szGUID, remark as szRemark, extra as szExtra FROM PlayerRemark WHERE server = ? AND id = ?') + DBP_RN = X.SQLitePrepare(DB, 'SELECT server as szServerName, id as dwID, name as szName, guid as szGUID, remark as szRemark, extra as szExtra FROM PlayerRemark WHERE server = ? AND name = ?') + DBP_RGI = X.SQLitePrepare(DB, 'SELECT server as szServerName, id as dwID, name as szName, guid as szGUID, remark as szRemark, extra as szExtra FROM PlayerRemark WHERE guid = ?') + + return true +end +InitDB() + +local function ReleaseDB() + if not DB then + return + end + DB:Release() +end + +function D.IsGUID(szGUID) + if X.IsGlobalID(szGUID) then + return true + end + return X.IsString(szGUID) and string.match(szGUID, "^G#.+#%d+$") ~= nil +end + +function D.GetPlayerGUID(szServer, dwID, szGUID) + if D.IsGUID(szGUID) then + return szGUID + end + return 'G#' .. szServer .. '#' .. dwID +end + +function D.Migrate() + if not X.GetClientPlayer() then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_PlayerRemark.Migrate', 'Client player not exist! Cannot migrate!', X.DEBUG_LEVEL.ERROR) + --[[#DEBUG END]] + return + end + local szFilePathV2 = X.FormatPath({'config/anmerkungen.jx3dat', X.PATH_TYPE.SERVER}) + local szFilePathV3 = X.FormatPath({'userdata/player_remark/player_remark.v3.db', X.PATH_TYPE.GLOBAL}) + if not IsLocalFileExist(szFilePathV2) and not IsLocalFileExist(szFilePathV3) then + return + end + local szServerName = X.GetServerOriginName() + if IsLocalFileExist(szFilePathV2) then + local data = X.LoadLUAData(szFilePathV2) + if data then + for _, v in pairs(data.data or {}) do + X.SQLitePrepareExecute( + DBP_W, + AnsiToUTF8(szServerName), + v.dwID, + AnsiToUTF8(v.szName), + AnsiToUTF8(D.GetPlayerGUID(szServerName, v.dwID, '')), + AnsiToUTF8(v.szContent), + X.EncodeLUAData({ + bTipWhenGroup = v.bTipWhenGroup, + bAlertWhenGroup = v.bAlertWhenGroup, + }) + ) + end + end + CPath.Move(szFilePathV2, szFilePathV2 .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + if IsLocalFileExist(szFilePathV3) then + local db = SQLite3_Open(szFilePathV3) + if db then + local aInfo = X.SQLiteGetAllANSI(db, 'SELECT * FROM PlayerRemark') or {} + for _, p in ipairs(aInfo) do + local tExtra = X.DecodeLUAData(p.extra) or {} + local bTipWhenGroup = tExtra.bTipWhenGroup + local bAlertWhenGroup = tExtra.bAlertWhenGroup + D.Set(p.server, p.id, p.name, p.guid, p.remark, bTipWhenGroup, bAlertWhenGroup) + end + db:Release() + end + CPath.Move(szFilePathV3, szFilePathV3 .. '.bak' .. X.FormatTime(GetCurrentTime(), '%yyyy%MM%dd%hh%mm%ss')) + end + FireUIEvent('MY_PLAYER_REMARK_UPDATE') +end + +function D.GetAll() + if not InitDB() then + return + end + return X.SQLitePrepareGetAllANSI(DBP_R) +end + +---通过角色、ID或角色唯一ID获取信息,获取角色的记录 +---@param xKey string | number @角色名、角色ID或角色唯一ID,其中通过ID只能获取当前服务器角色记录或跨服玩家角色记录,通过角色名或角色唯一ID可以获取其他服务器角色记录 +---@return table | nil @获取成功返回记录,否则返回空 +function D.Get(xKey) + if not InitDB() then + return + end + local tInfo + if X.IsNumber(xKey) then + local szServer = X.GetServerOriginName() + tInfo = X.SQLitePrepareGetOneANSI(DBP_RI, szServer, xKey) + elseif D.IsGUID(xKey) then + tInfo = X.SQLitePrepareGetOneANSI(DBP_RGI, xKey) + elseif X.IsString(xKey) then + local szName, szServer = X.DisassemblePlayerGlobalName(xKey, true) + xKey = X.AssemblePlayerGlobalName(szName, szServer) + tInfo = X.SQLitePrepareGetOneANSI(DBP_RN, szServer, szName) + end + if tInfo then + local tExtra = X.DecodeLUAData(tInfo.szExtra) or {} + tInfo.szExtra = nil + tInfo.bTipWhenGroup = tExtra.bTipWhenGroup + tInfo.bAlertWhenGroup = tExtra.bAlertWhenGroup + end + return tInfo +end + +-- 设置一个玩家的记录 +function D.Set(szServerName, dwID, szName, szGUID, szRemark, bTipWhenGroup, bAlertWhenGroup) + local szGUID = D.GetPlayerGUID(szServerName, dwID, szGUID) + X.SQLitePrepareExecuteANSI( + DBP_W, + szServerName, + dwID, + szName, + szGUID, + szRemark, + X.EncodeLUAData({ + bTipWhenGroup = bTipWhenGroup, + bAlertWhenGroup = bAlertWhenGroup, + }) + ) + FireUIEvent('MY_PLAYER_REMARK_UPDATE') +end + +---删除一个玩家的记录 +function D.Delete(szServerName, szName, szGUID) + if szServerName and szName then + X.SQLitePrepareExecuteANSI(DBP_DN, szServerName, szName) + end + if szGUID then + X.SQLitePrepareExecuteANSI(DBP_DG, szGUID) + end + FireUIEvent('MY_PLAYER_REMARK_UPDATE') +end + +-- 当有玩家进队时 +function D.CheckPartyPlayer(dwID) + local bLeader = X.IsPlayerTeamLeader(dwID) + local tMember = X.GetTeamMemberInfo(dwID) + local tPlayer = D.Get(tMember.szGlobalID or tMember.szName) + if tPlayer then + if tPlayer.bAlertWhenGroup then + MessageBox({ + szName = 'MY_PlayerRemark_' .. tPlayer.dwID, + szMessage = bLeader + and _L('Tip: [%s](Leader) is in your team.\nRemark: %s', tPlayer.szName, tPlayer.szRemark) + or _L('Tip: [%s] is in your team.\nRemark: %s', tPlayer.szName, tPlayer.szRemark), + {szOption = g_tStrings.STR_HOTKEY_SURE, fnAction = function() end}, + }) + end + if tPlayer.bTipWhenGroup then + X.OutputSystemMessage(_L('Tip: [%s] is in your team.\nRemark: %s', tPlayer.szName, tPlayer.szRemark)) + end + end +end + +-- 当有玩家进房间时 +function D.CheckRoomPlayer(szGlobalID) + local tMember = X.GetRoomMemberInfo(szGlobalID) + local szServerName = tMember and X.GetServerNameByID(tMember.dwServerID) + local tPlayer = (tMember and D.Get(tMember.szGlobalID)) + or (szServerName and D.Get(X.AssemblePlayerGlobalName(tMember.szName, szServerName))) + if tPlayer then + if tPlayer.bAlertWhenGroup then + MessageBox({ + szName = 'MY_PlayerRemark_' .. tPlayer.dwID, + szMessage = _L('Tip: [%s] is in your room.\nRemark: %s', tPlayer.szName, tPlayer.szRemark), + {szOption = g_tStrings.STR_HOTKEY_SURE, fnAction = function() end}, + }) + end + if tPlayer.bTipWhenGroup then + X.OutputSystemMessage(_L('Tip: [%s] is in your team.\nRemark: %s', tPlayer.szName, tPlayer.szRemark)) + end + end +end + +-- 打开一个玩家的记录编辑器 +function D.OpenPlayerRemarkEditPanel(szServerName, dwID, szName, szGlobalID) + if not MY_Farbnamen then + return X.Alert(_L['MY_Farbnamen not detected! Please check addon load!']) + end + local szRemark, bTipWhenGroup, bAlertWhenGroup = '', false, false + local szGUID = D.GetPlayerGUID(szServerName, dwID, szGlobalID) + do + local tInfo + if not tInfo and D.IsGUID(szGUID) then + tInfo = D.Get(szGUID) + end + if not tInfo then + tInfo = D.Get(X.AssemblePlayerGlobalName(szName, szServerName)) + end + if not tInfo and not IsRemotePlayer(dwID) then + tInfo = D.Get(dwID) + end + if tInfo then + -- szServerName = tInfo.szServerName + dwID = X.IIf(IsRemotePlayer(dwID), tInfo.dwID, dwID) + szGUID = tInfo.szGUID + szRemark = tInfo.szRemark + bTipWhenGroup = tInfo.bTipWhenGroup + bAlertWhenGroup = tInfo.bAlertWhenGroup + end + end + if not dwID or IsRemotePlayer(dwID) then + dwID = 0 + end + + local nW, nH = 400, 360 + local nPaddingX, nPaddingY = 35, 50 + local nX, nY = nPaddingX, nPaddingY + local nRightW = 250 + + local ui = X.UI.CreateFrame('MY_PlayerRemark_Edit_' .. GetStringCRC(szServerName) .. '_' .. dwID, { + w = nW, h = nH, anchor = 'CENTER', + text = _L['MY_PlayerRemark Edit'], + }) + + ui:Remove(function() + X.RegisterEsc('MY_PlayerRemark_Edit_' .. GetStringCRC(szServerName) .. '_' .. dwID, false) + PlaySound(SOUND.UI_SOUND, g_sound.CloseFrame) + end) + + ui:Append('Text', { x = nX, y = nY, text = _L['Server:'] }) + nX = nX + 80 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nRightW, h = 25, + multiline = false, enable = false, color = {200,200,200}, + text = szServerName, + }) + nY = nY + 30 + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Name:'] }) + nX = nX + 80 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nRightW, h = 25, + multiline = false, enable = false, color = {200,200,200}, + text = szName, + }) + nY = nY + 30 + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['ID:'] }) + nX = nX + 80 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nRightW, h = 25, + text = dwID, + multiline = false, enable = false, color = {200,200,200}, + }) + nY = nY + 30 + + if X.IsDebugging() then + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['GUID:'] }) + nX = nX + 80 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nRightW, h = 25, + text = szGUID, + multiline = false, enable = false, color = {200,200,200}, + }) + nY = nY + 30 + end + + nX = nPaddingX + ui:Append('Text', { x = nX, y = nY, text = _L['Remark:'] }) + nX = nX + 80 + ui:Append('WndEditBox', { + x = nX, y = nY, w = nRightW, h = 80, + multiline = true, text = szRemark, + onChange = function (szText) + szRemark = szText + end, + }) + nY = nY + 90 + + nX = nPaddingX + nX = nX + 80 - 2 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = nRightW, + text = _L['Alert when group'], + checked = bAlertWhenGroup, + onCheck = function(bChecked) + bAlertWhenGroup = bChecked + end, + }) + nY = nY + 20 + + nX = nPaddingX + nX = nX + 80 - 2 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = nRightW, + text = _L['Tip when group'], + checked = bTipWhenGroup, + onCheck = function(bChecked) + bTipWhenGroup = bChecked + end, + }) + nY = nY + 30 + + nX = nPaddingX + nX = nX + 80 - 2 + nX = nX + ui:Append('WndButton', { + name = 'WndButton_Submit', + x = nX, y = nY, h = 30, minWidth = nRightW / 3, + text = _L['sure'], + onClick = function() + D.Set( + szServerName, + dwID, + szName, + szGUID, + szRemark, + bTipWhenGroup, + bAlertWhenGroup + ) + ui:Remove() + end, + }):Width() + 3 + nX = nX + ui:Append('WndButton', { + x = nX, y = nY, h = 30, minWidth = nRightW / 3, + text = _L['cancel'], + onClick = function() ui:Remove() end, + }):Width() + 3 + nX = nX + ui:Append('Text', { + x = nX, y = nY - 3, h = 30 + 3, minWidth = nRightW / 3, alpha = 200, + alignHorizontal = 1, alignVertical = 1, + text = _L['Delete'], color = {255,0,0}, + onHover = function(bIn) X.UI(this):Alpha((bIn and 255) or 200) end, + onClick = function() + D.Delete( + szServerName, + szName, + szGUID + ) + ui:Remove() + end, + }):Width() + 3 + + -- init + X.RegisterEsc( + 'MY_PlayerRemark_Edit_' .. GetStringCRC(szServerName) .. '_' .. (dwID or 0), + function() + return ui and ui:Count() > 0 + end, + function() + ui:Remove() + return true + end + ) + Station.SetFocusWindow(ui[1]) + ui:Children('#WndEditBox_Name'):Change() + PlaySound(SOUND.UI_SOUND, g_sound.OpenFrame) +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_PlayerRemark', + exports = { + { + fields = { + 'Get', + OpenEditPanel = D.OpenPlayerRemarkEditPanel, + }, + root = D, + }, + }, +} +MY_PlayerRemark = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterTargetAddonMenu('MY_PlayerRemark', function() + local me = X.GetClientPlayer() + local dwType, dwID = X.GetCharacterTarget(me) + if dwType == TARGET.PLAYER then + local kPlayer = X.GetTargetHandle(dwType, dwID) + local tInfo = MY_Farbnamen and MY_Farbnamen.Get(kPlayer.szName) + if not tInfo then + return + end + return { + szOption = _L['Edit player remark'], + fnAction = function() + local szName, szServerName = X.DisassemblePlayerGlobalName(kPlayer.szName, true) + D.OpenPlayerRemarkEditPanel(szServerName, tInfo.dwID, szName, tInfo.szGlobalID) + end + } + end +end) + +X.RegisterChatPlayerAddonMenu('MY_PlayerRemark', function(szName) + local tInfo = MY_Farbnamen and MY_Farbnamen.Get(szName) + if not tInfo then + return + end + return { + { + szOption = _L['Edit player remark'], + fnAction = function() + local szName, szServerName = X.DisassemblePlayerGlobalName(szName, true) + D.OpenPlayerRemarkEditPanel(szServerName, tInfo.dwID, szName, tInfo.szGlobalID) + end, + }, + } +end) + +X.RegisterAddonMenu('MY_PlayerRemark', { + szOption = _L['View player remark'], + fnAction = function() + X.Panel.Show() + X.Panel.Focus() + X.Panel.SwitchTab('MY_PlayerRemark') + end, +}) + +X.RegisterEvent('PARTY_ADD_MEMBER', function() + D.CheckPartyPlayer(arg1) +end) +-- X.RegisterEvent('PARTY_SYNC_MEMBER_DATA', OnPartyAddMember) + +-- 当进队时 +X.RegisterEvent('PARTY_UPDATE_BASE_INFO', 'MY_PlayerRemark', function() + local team = GetClientTeam() + if not team then + return + end + for _, dwID in ipairs(team.GetTeamMemberList()) do + D.CheckPartyPlayer(dwID) + end +end) + +X.RegisterEvent('JOIN_GLOBAL_ROOM', 'MY_PlayerRemark', function() + X.DelayCall(2000, function() + for _, szGlobalID in ipairs(X.GetRoomMemberList()) do + D.CheckRoomPlayer(szGlobalID) + end + end) +end) + +X.RegisterEvent('GLOBAL_ROOM_MEMBER_CHANGE', 'MY_PlayerRemark', function() + local szGlobalID = arg1 + local bJoin = arg2 + local szName = arg3 + local dwSeverID = arg4 + if not bJoin then + return + end + local szServerName = X.GetServerNameByID(dwSeverID) + if not szServerName then + return + end + D.CheckRoomPlayer(szGlobalID) +end) + +X.RegisterEvent('MY_PLAYER_REMARK_UPDATE', 'MY_PlayerRemark', function() + if X.Panel.GetCurrentTabID() == 'MY_PlayerRemark' then + X.Panel.SwitchTab('MY_PlayerRemark', true) + end +end) + +X.RegisterInit('MY_PlayerRemark', function() + D.Migrate() +end) + +X.RegisterExit('MY_PlayerRemark', ReleaseDB) + +-------------------------------------------------------------------------------- +-- 界面注册 +-------------------------------------------------------------------------------- +local PS = {} +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nW, nH = ui:Size() + local nX, nY = 0, 0 + + local list = ui:Append('WndListBox', { + x = nX, y = nY, + w = nW, h = nH, + listBox = {{ + 'onlclick', + function(szID, szText, data, bSelected) + D.OpenPlayerRemarkEditPanel(data.szServerName, data.dwID, data.szName, data.szGUID) + return false + end, + }}, + }) + for _, tInfo in ipairs(D.GetAll()) do + list:ListBox('insert', { + id = X.AssemblePlayerGlobalName(tInfo.szName, tInfo.szServerName), + text = _L('[%s] %s', X.AssemblePlayerGlobalName(tInfo.szName, tInfo.szServerName), tInfo.szRemark), + data = tInfo, + }) + end +end +X.Panel.Register(_L['Target'], 'MY_PlayerRemark', _L['Player remark'], 'ui/Image/button/ShopButton.UITex|12', PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_PlayerViewMagnifier.lua b/MY_Toolbox/src/MY_PlayerViewMagnifier.lua new file mode 100644 index 000000000..308eab8ab --- /dev/null +++ b/MY_Toolbox/src/MY_PlayerViewMagnifier.lua @@ -0,0 +1,106 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 试衣间 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_PlayerViewMagnifier' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local function onFrameCreate() + local config + if arg0:GetName() == 'PlayerView' then + config = X.UI.IS_GLASSMORPHISM + and { x = 30, y = 3, w = 25, h = 25 } + or { x = 35, y = 8, w = 30, h = 30 } + elseif arg0:GetName() == 'ExteriorView' then + config = X.UI.IS_GLASSMORPHISM + and { x = 15, y = 3, w = 25, h = 25 } + or { x = 20, y = 15, w = 40, h = 40 } + end + if config then + local frame, ui, nOriX, nOriY, nOriW, nOriH = arg0, X.UI(arg0), 0, 0, 0, 0 + local function Fullscreen() + local nCurrentW, nCurrentH = ui:Size() + local nClientW, nClientH = Station.GetClientSize() + local fCoefficient = math.min(nClientW / nCurrentW, nClientH / nCurrentH) + local fAbsCoefficient = nCurrentW / nOriW * fCoefficient + frame:EnableDrag(true) + frame:SetDragArea(0, 0, frame:GetW(), 50 * fAbsCoefficient) + frame:Scale(fCoefficient, fCoefficient) + ui:Find('.Text'):FontScale(fAbsCoefficient) + frame:SetPoint('CENTER', 0, 0, 'CENTER', 0, 0) + end + ui:AppendFromIni(PLUGIN_ROOT .. '/ui/Btn_MagnifierUp.ini', 'Btn_MagnifierUp', { + name = 'Btn_MY_MagnifierUp', + x = config.x, y = config.y, w = config.w, h = config.h, + onClick = function() + nOriX, nOriY = ui:Pos() + nOriW, nOriH = ui:Size() + Fullscreen() + ui:Children('#Btn_MY_MagnifierUp'):Hide() + ui:Children('#Btn_MY_MagnifierDown'):Show() + end, + tip = _L['Click to enable MY player view magnifier'], + }) + ui:AppendFromIni(X.PACKET_INFO.ROOT .. 'MY_Toolbox/ui/Btn_MagnifierDown.ini', 'Btn_MagnifierDown', { + name = 'Btn_MY_MagnifierDown', + x = config.x, y = config.y, w = config.w, h = config.h, visible = false, + onClick = function() + local nCW, nCH = ui:Size() + local fCoefficient = nOriW / nCW + frame:Scale(fCoefficient, fCoefficient) + ui:Pos(nOriX, nOriY) + ui:Find('.Text'):FontScale(1) + ui:Children('#Btn_MY_MagnifierUp'):Show() + ui:Children('#Btn_MY_MagnifierDown'):Hide() + nOriX, nOriY, nOriW, nOriH = nil + end, + tip = _L['Click to disable MY player view magnifier'], + }) + if X.UI.IS_GLASSMORPHISM then + X.UI.SetButtonUITex( + ui:Children('#Btn_MY_MagnifierUp'):Raw(), + 'ui\\Image\\UItimate\\UICommon\\Button2.UITex', + 37, + 38, + 39, + 40 + ) + X.UI.SetButtonUITex( + ui:Children('#Btn_MY_MagnifierDown'):Raw(), + 'ui\\Image\\UItimate\\UICommon\\Button2.UITex', + 41, + 42, + 43, + 44 + ) + end + X.RegisterEvent('UI_SCALED', 'MY_PlayerViewMagnifier' .. arg0:GetName(), function() + if not frame or not frame:IsValid() then + return 0 + end + if X.IsEmpty(nOriX) or X.IsEmpty(nOriY) or X.IsEmpty(nOriW) or X.IsEmpty(nOriH) then + return + end + Fullscreen() + end) + end +end +X.RegisterFrameCreate('PlayerView', 'MY_PlayerViewMagnifier', onFrameCreate) +X.RegisterFrameCreate('ExteriorView', 'MY_PlayerViewMagnifier', onFrameCreate) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_QuestWiki.lua b/MY_Toolbox/src/MY_QuestWiki.lua new file mode 100644 index 000000000..f11b93501 --- /dev/null +++ b/MY_Toolbox/src/MY_QuestWiki.lua @@ -0,0 +1,274 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 任务百科 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_QuestWiki' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_QuestWiki', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_QuestWiki'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_QuestWiki'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 850, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_QuestWiki'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 610, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwQuest) + local quest = Table_GetQuestStringInfo(dwQuest) + if not quest then + return + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/quest/' .. dwQuest .. '?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + player = X.GetClientPlayerName(), + })) + local szKey = 'QuestWiki_' .. dwQuest + local szTitle = quest.szName + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.OnHookPointMouseEnter() + this:SetFrame(37) + local x, y = this:GetAbsPos() + local w, h = this:GetSize() + local xml = {} + table.insert(xml, GetFormatText(_L['Click for quest wiki'], 41)) + if IsCtrlKeyDown() then + local h = this:GetRoot() + local t = {} + for k, v in pairs(h) do + if k ~= '___id' and k ~= '___type' and not X.IsFunction(v) then + table.insert(t, k .. ': ' .. X.EncodeLUAData(v, ' ')) + end + end + table.insert(xml, GetFormatText('\n\n' .. g_tStrings.DEBUG_INFO_ITEM_TIP .. '\n', 102)) + table.insert(xml, GetFormatText(table.concat(t, '\n'), 102)) + end + OutputTip(table.concat(xml), 300, { x, y, w, h }) +end + +function D.OnHookPointMouseLeave() + this:SetFrame(36) + HideTip() +end + +function D.OnHookPointLButtonClick() + local frame = this:GetRoot() + D.Open(frame.dwQuest or frame.dwQuestID) +end + +function D.GetQuestPanelHookPoint() + local frame = Station.SearchFrame('QuestPanel') + if not frame then + return + end + local h = frame:Lookup('', 'Handle_TraceInfo') + if not h then + return + end + return h, h:Lookup('MY_QuestWiki'), frame:Lookup('Btn_Raider') +end + +function D.HookQuestPanel() + local h, img, btn = D.GetQuestPanelHookPoint() + if not h or img then + return + end + if btn then + btn:SetRelX(569) + end + h:AppendItemFromString('w=25 h=25 x=302 y=3 alpha=200 name="MY_QuestWiki" eventid=789 path="ui/Image/button/FrendNPartyButton.UITex" frame=36') + h:FormatAllItemPos() + img = h:Lookup('MY_QuestWiki') + img.OnItemMouseEnter = D.OnHookPointMouseEnter + img.OnItemMouseLeave = D.OnHookPointMouseLeave + img.OnItemLButtonClick = D.OnHookPointLButtonClick +end + +function D.UnhookQuestPanel() + local h, img, btn = D.GetQuestPanelHookPoint() + if not h or not img then + return + end + if btn then + btn:SetRelX(604) + end + h:RemoveItem(img) +end + +function D.GetNewQuestPanelHookPoint() + local frame = Station.SearchFrame('NewQuestPanel') + if not frame then + return + end + local h = frame:Lookup('Wnd_Quest', 'Handle_TraceInfo') + if not h then + return + end + return h, h:Lookup('MY_QuestWiki') +end + +function D.HookNewQuestPanel() + local h, img = D.GetNewQuestPanelHookPoint() + if not h or img then + return + end + h:AppendItemFromString('w=30 h=30 x=455 alpha=180 name="MY_QuestWiki" eventid=789 path="ui/Image/button/FrendNPartyButton.UITex" frame=36') + h:FormatAllItemPos() + img = h:Lookup('MY_QuestWiki') + img.OnItemMouseEnter = D.OnHookPointMouseEnter + img.OnItemMouseLeave = D.OnHookPointMouseLeave + img.OnItemLButtonClick = D.OnHookPointLButtonClick +end + +function D.UnhookNewQuestPanel() + local h, img = D.GetNewQuestPanelHookPoint() + if not h or not img then + return + end + h:RemoveItem(img) +end + +function D.CheckHook() + if O.bEnable then + D.HookQuestPanel() + D.HookNewQuestPanel() + else + D.UnhookQuestPanel() + D.UnhookNewQuestPanel() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Quest wiki'], + tip = { + render = _L['Click help icon on quest panel to view quest wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_QuestWiki.bEnable, + onCheck = function(bChecked) + MY_QuestWiki.bEnable = bChecked + end, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_QuestWiki', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + triggers = { + bEnable = D.CheckHook, + }, + root = O, + }, + }, +} +MY_QuestWiki = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterInit('MY_QuestWiki', function() + D.CheckHook() +end) + +X.RegisterReload('MY_QuestWiki', function() + D.UnhookQuestPanel() + D.UnhookNewQuestPanel() +end) + +X.RegisterFrameCreate('QuestPanel', 'MY_QuestWiki', function(name, frame) + D.CheckHook() +end) + +X.RegisterFrameCreate('NewQuestPanel', 'MY_QuestWiki', function(name, frame) + D.CheckHook() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_RideWiki.lua b/MY_Toolbox/src/MY_RideWiki.lua new file mode 100644 index 000000000..e6795deee --- /dev/null +++ b/MY_Toolbox/src/MY_RideWiki.lua @@ -0,0 +1,265 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 宠物百科 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_RideWiki' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_RideWiki', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_RideWiki'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nW = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_RideWiki'], + _L['UI Width'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 850, + }, + nH = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_RideWiki'], + _L['UI Height'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 610, + }, +}) +local D = {} + +function D.OnWebSizeChange() + if X.UI(this):FrameVisualState() == X.UI.FRAME_VISUAL_STATE.NORMAL then + O.nW, O.nH = this:GetSize() + end +end + +function D.Open(dwTabType, dwTabIndex) + local item = GetItemInfo(dwTabType, dwTabIndex) + if not item then + return + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/ride/' .. dwTabType .. '/' .. dwTabIndex .. '?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + player = X.GetClientPlayerName(), + })) + local szKey = 'RideWiki_' .. dwTabType .. '_' .. dwTabIndex + local szTitle = item.szName + szKey = X.UI.OpenBrowser(szURL, { + key = szKey, + title = szTitle, + w = O.nW, h = O.nH, + readonly = true, + }) + X.UI(X.UI.LookupBrowser(szKey)):Size(D.OnWebSizeChange) +end + +function D.HookPlayerViewFrame(frame) + ---------------- + -- 怀旧版 + ---------------- + + ---------------- + -- 重制版 + ---------------- + local box = frame:Lookup('Page_Main/Page_Ride', 'Box_RideBox') + if box then + local function OnRideItemLButtonClick() + if O.bEnable and not IsCtrlKeyDown() and not IsAltKeyDown() then + local _, _, dwBox, dwBoxIndex, dwPlayerID = this:GetObject() + local tar = X.GetPlayer(dwPlayerID) + if tar then + local item = X.GetInventoryItem(tar, dwBox, dwBoxIndex) + if item then + D.Open(item.dwTabType, item.dwIndex) + end + end + return + end + return X.UI.FormatUIEventMask(false, true) + end + X.SetMemberFunctionHook( + box, + 'OnItemLButtonClick', + 'MY_RideWiki', + OnRideItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + box:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end +end + +X.RegisterInit('MY_RideWiki', function() + local frame = Station.Lookup('Normal/PlayerView') + if not frame then + return + end + D.HookPlayerViewFrame(frame) +end) + +X.RegisterFrameCreate('PlayerView', 'MY_RideWiki', function(name, frame) + D.HookPlayerViewFrame(frame) +end) + +function D.HookHorsePanel(frame) + ---------------- + -- 怀旧版 + ---------------- + + ---------------- + -- 重制版 + ---------------- + local hList = frame:Lookup('PageSet_All/Page_Horse/WndScroll_Horse', '') + if hList then + local function OnRideItemLButtonClick() + if O.bEnable and not IsCtrlKeyDown() and not IsAltKeyDown() then + local _, _, dwBox, dwBoxIndex = this:GetObject() + local tar = X.GetClientPlayer() + if tar then + local item = X.GetInventoryItem(tar, dwBox, dwBoxIndex) + if item then + D.Open(item.dwTabType, item.dwIndex) + end + end + return + end + return X.UI.FormatUIEventMask(false, true) + end + X.UI.HookHandleAppend(hList, function(_, hItem) + local box = hItem:Lookup('Box_Horse') + if box then + X.SetMemberFunctionHook( + box, + 'OnItemLButtonClick', + 'MY_RideWiki', + OnRideItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + box:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end + end) + end + + local hList = frame:Lookup('PageSet_All/Page_Qiqu/WndScroll_Qiqu', '') + if hList then + local function OnRideItemLButtonClick() + if O.bEnable and not IsCtrlKeyDown() and not IsAltKeyDown() then + local _, _, dwBox, dwBoxIndex = this:GetObject() + local tar = X.GetClientPlayer() + if tar then + local item = X.GetInventoryItem(tar, dwBox, dwBoxIndex) + if item then + D.Open(item.dwTabType, item.dwIndex) + end + end + return + end + return X.UI.FormatUIEventMask(false, true) + end + X.UI.HookHandleAppend(hList, function(_, hItem) + local box = hItem:Lookup('Box_Qiqu') + if box then + X.SetMemberFunctionHook( + box, + 'OnItemLButtonClick', + 'MY_RideWiki', + OnRideItemLButtonClick, + { bAfterOrigin = true, bPassReturn = true, bHookReturn = true }) + box:RegisterEvent(ITEM_EVENT.LBUTTONCLICK) + end + end) + end +end + +X.RegisterInit('MY_RideWiki', function() + local frame = Station.Lookup('Normal/HorsePanel') + if not frame then + return + end + D.HookHorsePanel(frame) +end) + +X.RegisterFrameCreate('HorsePanel', 'MY_RideWiki', function(name, frame) + D.HookHorsePanel(frame) +end) + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Ride wiki'], + tip = { + render = _L['Click icon on ride panel to view ride wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_RideWiki.bEnable, + onCheck = function(bChecked) + MY_RideWiki.bEnable = bChecked + end, + }):Width() + 5 + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_RideWiki', + exports = { + { + fields = { + 'Open', + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'nW', + 'nH', + }, + root = O, + }, + }, +} +MY_RideWiki = X.CreateModule(settings) +end + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_ShenxingHelper.lua b/MY_Toolbox/src/MY_ShenxingHelper.lua new file mode 100644 index 000000000..a931b3572 --- /dev/null +++ b/MY_Toolbox/src/MY_ShenxingHelper.lua @@ -0,0 +1,386 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 神行千里助手 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_ShenxingHelper' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_ShenxingHelper.AncientMap', { ['*'] = true, intl = false }) +X.RegisterRestriction('MY_ShenxingHelper.OpenAllMap', { ['*'] = true, intl = false }) +X.RegisterRestriction('MY_ShenxingHelper.AvoidBlackCD', { ['*'] = false, remake = true }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_ShenxingHelper', _L['General'], { + bAncientMap = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ShenxingHelper'], + _L['Shenxing to ancient maps'], + }), + szRestriction = 'MY_ShenxingHelper.AncientMap', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bOpenAllMap = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ShenxingHelper'], + _L['Force open all map shenxing'], + }), + szRestriction = 'MY_ShenxingHelper.OpenAllMap', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bAvoidBlackCD = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_ShenxingHelper'], + _L['Avoid blacking shenxing cd'], + }), + szRestriction = 'MY_ShenxingHelper.AvoidBlackCD', + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, +}) +local D = {} + +local NONWAR_DATA = { + { id = 8, x = 70, y = 5 }, -- 洛阳 + { id = 11, x = 170, y = -160 }, -- 天策 + { id = 12, x = -150, y = 110 }, -- 枫华 + { id = 15, x = -450, y = 65 }, -- 长安 + { id = 26, x = -20, y = 90 }, -- 荻花宫 + { id = 32, x = 50, y = 45 }, -- 小战宝 +} + +-------------------------------------------------------------------------- +-- 【台服用】老地图神行 +-------------------------------------------------------------------------- +function D.HookNonwarMap() + local h = Station.Lookup('Topmost1/WorldMap/Wnd_All', 'Handle_CopyBtn') + if not h or h.__MY_NonwarData then + return + end + local me = X.GetClientPlayer() + if not me then + return + end + for i = 0, h:GetItemCount() - 1 do + local m = h:Lookup(i) + if m and m.mapid == 160 then + local _w, _ = m:GetSize() + local fS = m.w / _w + for _, v in ipairs(NONWAR_DATA) do + local bOpen = me.GetMapVisitFlag(v.id) + local szFile, nFrame = 'ui/Image/MiddleMap/MapWindow.UITex', 41 + if bOpen then + nFrame = 98 + end + h:AppendItemFromString('name="mynw_' .. v.id .. '" path='..EncodeComponentsString(szFile)..' frame='..nFrame..' eventid=341') + local img = h:Lookup(h:GetItemCount() - 1) + img.bMYNonwar = true + img.bEnable = bOpen + img.bSelect = bOpen and v.id ~= 26 and v.id ~= 32 + img.x = m.x + v.x + img.y = m.y + v.y + img.w, img.h = m.w, m.h + img.id, img.mapid = v.id, v.id + img.middlemapindex = 0 + img.name = Table_GetMapName(img.mapid) + img.city = img.name + img.button = m.button + img.copy = true + img.OnItemMouseEnter = function() + img:SetAlpha(255) + return X.UI.FormatUIEventMask(true, true) + end + img.OnItemMouseLeave = function() + img:SetAlpha(200) + return X.UI.FormatUIEventMask(true, true) + end + img:SetAlpha(200) + img:SetSize(img.w / fS, img.h / fS) + img:SetRelPos(img.x / fS - (img.w / fS / 2), img.y / fS - (img.h / fS / 2)) + end + h:FormatAllItemPos() + break + end + end + h.__MY_NonwarData = true +end + +function D.UnhookNonwarMap() + local h = Station.Lookup('Topmost1/WorldMap/Wnd_All', 'Handle_CopyBtn') + if not h or not h.__MY_NonwarData then + return + end + for i = h:GetItemCount() - 1, 0, -1 do + local m = h:Lookup(i) + if m.bMYNonwar then + h:RemoveItem(m) + end + end + h.__MY_NonwarData = nil +end + +function D.CheckNonwarMapEnable() + if D.bReady and O.bAncientMap and not X.IsRestricted('MY_ShenxingHelper') then + D.HookNonwarMap() + else + D.UnhookNonwarMap() + end +end +X.RegisterFrameCreate('WorldMap', 'MY_ShenxingHelper__NonwarMap', D.CheckNonwarMapEnable) + +-------------------------------------------------------------------------- +-- 【台服用】强开所有地图 +-------------------------------------------------------------------------- +function D.HookOpenAllMap() + local h = Station.Lookup('Topmost1/WorldMap/Wnd_All', '') + if not h then + return + end + local me = X.GetClientPlayer() + local dwCurrMapID = me and me.GetScene().dwMapID + for _, szHandleName in ipairs({ 'Handle_CityBtn', 'Handle_CopyBtn' }) do + local hList = h:Lookup(szHandleName) + if hList then + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + if hItem.dwMYMapID == nil then + hItem.dwMYMapID = hItem.mapid + end + if hItem.bMYEnable == nil then + hItem.bMYEnable = hItem.bEnable + end + if hItem.mapid == 1 or dwCurrMapID == hItem.mapid then + hItem.mapid = tostring(hItem.mapid) + else + hItem.mapid = tonumber(hItem.mapid) or hItem.mapid + end + hItem.bEnable = true + end + end + end +end + +function D.UnhookOpenAllMap() + local h = Station.Lookup('Topmost1/WorldMap/Wnd_All', '') + if not h then + return + end + for _, szHandleName in ipairs({ 'Handle_CityBtn', 'Handle_CopyBtn' }) do + local hList = h:Lookup(szHandleName) + if hList then + for i = 0, hList:GetItemCount() - 1 do + local hItem = hList:Lookup(i) + if hItem.dwMYMapID ~= nil then + hItem.mapid = hItem.dwMYMapID + hItem.dwMYMapID = nil + end + if hItem.bMYEnable ~= nil then + hItem.bEnable = hItem.bMYEnable + hItem.bMYEnable = nil + end + end + end + end +end + +function D.CheckOpenAllMapEnable() + if D.bReady and O.bOpenAllMap and not X.IsRestricted('MY_ShenxingHelper') then + X.RegisterEvent({ + 'LOADING_END', + 'UPDATE_ROAD_TRACK_FORCE', + 'UPDATE_ROUTE_NODE_OPEN_LIST', + 'ON_MAP_VISIT_FLAG_CHANGED', + 'SYNC_ROLE_DATA_END', + 'PLAYER_LEVEL_UPDATE', + }, 'MY_AutoMemorizeBook', D.HookOpenAllMap) + X.DelayCall('MY_ShenxingHelper__HookOpenAllMap', 200, D.HookOpenAllMap) + D.HookOpenAllMap() + else + X.RegisterEvent({ + 'LOADING_END', + 'UPDATE_ROAD_TRACK_FORCE', + 'UPDATE_ROUTE_NODE_OPEN_LIST', + 'ON_MAP_VISIT_FLAG_CHANGED', + 'SYNC_ROLE_DATA_END', + 'PLAYER_LEVEL_UPDATE', + }, 'MY_ShenxingHelper__OpenAllMap', false) + X.DelayCall('MY_ShenxingHelper__HookOpenAllMap', false) + D.UnhookOpenAllMap() + end +end +X.RegisterFrameCreate('WorldMap', 'MY_ShenxingHelper__OpenAllMap', D.CheckOpenAllMapEnable) + +-------------------------------------------------------------------------- +-- 防止神行CD被黑 +-------------------------------------------------------------------------- +function D.CheckAvoidBlackShenxingEnable() + if D.bReady and O.bAvoidBlackCD and not X.IsRestricted('MY_ShenxingHelper.AvoidBlackCD') then + X.RegisterEvent('DO_SKILL_CAST', 'MY_AvoidBlackShenxingCD', function() + local dwID, dwSkillID, dwSkillLevel = arg0, arg1, arg2 + if not(X.GetClientPlayerID() == dwID and + Table_IsSkillFormationCaster(dwSkillID, dwSkillLevel)) then + return + end + local player = X.GetClientPlayer() + if not player then + return + end + + local nType, dwSkillID, dwSkillLevel, fProgress = X.GetCharacterOTActionState(player) + if not (( + nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_PREPARE + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ACTION_SKILL_CHANNEL + or nType == X.CONSTANT.CHARACTER_OTACTION_TYPE.ANCIENT_ACTION_PREPARE + ) and dwSkillID == 3691) then + return + end + X.OutputSystemMessage(_L['Shenxing has been cancelled, cause you got the zhenyan.']) + player.StopCurrentAction() + end) + else + X.RegisterEvent('DO_SKILL_CAST', 'MY_AvoidBlackShenxingCD') + end +end + +-------------------------------------------------------------------------- +-- 模块事件监听 +-------------------------------------------------------------------------- +function D.CheckEnable() + D.CheckNonwarMapEnable() + D.CheckOpenAllMapEnable() + D.CheckAvoidBlackShenxingEnable() +end + +function D.RemoveHook() + D.UnhookNonwarMap() + D.UnhookOpenAllMap() +end + +-------------------------------------------------------------------------- +-- 设置界面 +-------------------------------------------------------------------------- +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + if not X.IsRestricted('MY_ShenxingHelper.AvoidBlackCD') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Avoid blacking shenxing cd'], + tip = { + render = _L['Got zhenyan wen shenxing, your shengxing will be blacked.'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_ShenxingHelper.bAvoidBlackCD, + onCheck = function(bChecked) + MY_ShenxingHelper.bAvoidBlackCD = bChecked + end, + }):Width() + 5 + end + + if not X.IsRestricted('MY_ShenxingHelper.AncientMap') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Shenxing to ancient maps'], + checked = MY_ShenxingHelper.bAncientMap, + onCheck = function(bChecked) + MY_ShenxingHelper.bAncientMap = bChecked + end, + }):Width() + 5 + end + + if not X.IsRestricted('MY_ShenxingHelper.OpenAllMap') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Force open all map shenxing'], + tip = { + render = _L['Shenxing can fly to undiscovered maps'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_ShenxingHelper.bOpenAllMap, + onCheck = function(bChecked) + MY_ShenxingHelper.bOpenAllMap = bChecked + end, + }):Width() + 5 + end + + nX = nPaddingX + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_ShenxingHelper', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bAncientMap', + 'bOpenAllMap', + 'bAvoidBlackCD', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bAncientMap', + 'bOpenAllMap', + 'bAvoidBlackCD', + }, + triggers = { + bAncientMap = D.CheckNonwarMapEnable, + bOpenAllMap = D.CheckOpenAllMapEnable, + bAvoidBlackCD = D.CheckAvoidBlackShenxingEnable, + }, + root = O, + }, + }, +} +MY_ShenxingHelper = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterEvent('MY_RESTRICTION', 'MY_ShenxingHelper', function() + if arg0 and arg0 ~= 'MY_ShenxingHelper' then + return + end + D.CheckEnable() +end) +X.RegisterUserSettingsInit('MY_ShenxingHelper', function() + D.bReady = true + D.CheckEnable() +end) +X.RegisterReload('MY_ShenxingHelper', D.RemoveHook) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_Taoguan.lua b/MY_Toolbox/src/MY_Taoguan.lua new file mode 100644 index 000000000..1f4d273cd --- /dev/null +++ b/MY_Toolbox/src/MY_Taoguan.lua @@ -0,0 +1,653 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 自动砸年兽陶罐 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_Taoguan' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Taoguan' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +-- 幸运香囊 -- 下一次有一点五倍几率砸中年兽陶罐 +-- 幸运锦囊 -- 下一次砸年兽陶罐失败则保留两点五成积分 +-- 如意香囊 -- 下一次有两点五倍几率砸中年兽陶罐 +-- 如意锦囊 -- 下一次砸年兽陶罐失败则保留一半积分 +-- 寄忧谷 -- 下一次有五倍几率砸中年兽陶罐 +-- 醉生 -- 下一次砸年兽陶罐失败则不损失积分 + +local TAOGUAN = X.GetItemNameByUIID(74224) -- 年兽陶罐 +local XIAOJINCHUI = X.GetItemNameByUIID(65611) -- 小金锤 +local XIAOYINCHUI = X.GetItemNameByUIID(65609) -- 小银锤 +local MEILIANGYUQIAN = X.GetItemNameByUIID(65589) -- 梅良玉签 +local XINGYUNXIANGNANG = X.GetItemNameByUIID(65578) -- 幸运香囊 +local XINGYUNJINNANG = X.GetItemNameByUIID(65581) -- 幸运锦囊 +local RUYIXIANGNANG = X.GetItemNameByUIID(65579) -- 如意香囊 +local RUYIJINNANG = X.GetItemNameByUIID(65582) -- 如意锦囊 +local JIYOUGU = X.GetItemNameByUIID(65580) -- 寄忧谷 +local ZUISHENG = X.GetItemNameByUIID(65583) -- 醉生 + +local FILTER_ITEM = {} +do + local data = X.LoadLUAData(PLUGIN_ROOT .. '/data/taoguan/{$lang}.jx3dat') + if X.IsTable(data.FILTER_ITEM) then + FILTER_ITEM = data.FILTER_ITEM + end +end +local FILTER_ITEM_DEFAULT = {} +for _, p in ipairs(FILTER_ITEM) do + FILTER_ITEM_DEFAULT[p.szName] = p.bFilter +end + +local O = X.CreateUserSettingsModule('MY_Taoguan', _L['Target'], { + nPausePoint = { -- 停砸分数线 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop simple broken can when score reaches'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 327680, + }, + bUseTaoguan = { -- 必要时使用背包的陶罐 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Put can if needed?'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + bNoYinchuiUseJinchui = { -- 没小银锤时使用小金锤 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('When no %s use %s?', XIAOYINCHUI, XIAOJINCHUI), + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nUseXiaojinchui = { -- 优先使用小金锤的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', XIAOJINCHUI), + }), + xSchema = X.Schema.Number, + xDefaultValue = 320, + }, + bPauseNoXiaojinchui = { -- 缺少小金锤时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. XIAOJINCHUI, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nUseXingyunXiangnang = { -- 开始吃幸运香囊的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', XINGYUNXIANGNANG), + }), + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + bPauseNoXingyunXiangnang = { -- 缺少幸运香囊时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. XINGYUNXIANGNANG, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nUseXingyunJinnang = { -- 开始吃幸运锦囊的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', XINGYUNJINNANG), + }), + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + bPauseNoXingyunJinnang = { -- 缺少幸运锦囊时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. XINGYUNJINNANG, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nUseRuyiXiangnang = { -- 开始吃如意香囊的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', RUYIXIANGNANG), + }), + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + bPauseNoRuyiXiangnang = { -- 缺少如意香囊时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. RUYIXIANGNANG, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nUseRuyiJinnang = { -- 开始吃如意锦囊的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', RUYIJINNANG), + }), + xSchema = X.Schema.Number, + xDefaultValue = 80, + }, + bPauseNoRuyiJinnang = { -- 缺少如意锦囊时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. RUYIJINNANG, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + nUseJiyougu = { -- 开始吃寄忧谷的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', JIYOUGU), + }), + xSchema = X.Schema.Number, + xDefaultValue = 1280, + }, + bPauseNoJiyougu = { -- 缺少寄忧谷时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. JIYOUGU, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nUseZuisheng = { -- 开始吃醉生的分数 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L('Use %s when score reaches', ZUISHENG), + }), + xSchema = X.Schema.Number, + xDefaultValue = 1280, + }, + bPauseNoZuisheng = { -- 缺少醉生时停砸 + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Stop break when no item'] .. ZUISHENG, + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + tFilterItem = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Taoguan'], + szDescription = X.MakeCaption({ + _L['Pickup filters'], + }), + xSchema = X.Schema.Map(X.Schema.String, X.Schema.Boolean), + xDefaultValue = FILTER_ITEM_DEFAULT, + }, +}) + +--------------------------------------------------------------------- +-- 本地函数和变量 +--------------------------------------------------------------------- +local ITEM_CD = 1 * X.ENVIRONMENT.GAME_FPS + 8 -- 吃药CD +local HAMMER_CD = 5 * X.ENVIRONMENT.GAME_FPS + 8 -- 锤子CD +local MAX_POINT_POW = 16 -- 分数最高倍数(2^n) + +local D = { + bEnable = false, -- 启用状态 + bWaitPoint = false, -- 等待分数刷新 防止错吃药品 + nPoint = 0, -- 当前总分数 + nUseItemLFC = 0, -- 上次吃药的逻辑帧 + nUseHammerLFC = 0, -- 上次用锤子的逻辑帧 + dwDoodadID = 0, -- 自动拾取过滤的交互物件ID + aUseItemPS = { -- 设置界面的物品使用条件 + { szName = XIAOJINCHUI, szID = 'Xiaojinchui' }, + { szName = XINGYUNXIANGNANG, szID = 'XingyunXiangnang' }, + { szName = XINGYUNJINNANG, szID = 'XingyunJinnang' }, + { szName = RUYIXIANGNANG, szID = 'RuyiXiangnang' }, + { szName = RUYIJINNANG, szID = 'RuyiJinnang' }, + { szName = JIYOUGU, szID = 'Jiyougu' }, + { szName = ZUISHENG, szID = 'Zuisheng' }, + }, + aUseItemOrder = { -- 状态转移函数中物品与BUFF判断逻辑 + { + { szName = JIYOUGU, szID = 'Jiyougu', dwBuffID = 1660, nBuffLevel = 3 }, + { szName = RUYIXIANGNANG, szID = 'RuyiXiangnang', dwBuffID = 1660, nBuffLevel = 2 }, + { szName = XINGYUNXIANGNANG, szID = 'XingyunXiangnang', dwBuffID = 1660, nBuffLevel = 1 }, + }, + { + { szName = ZUISHENG, szID = 'Zuisheng', dwBuffID = 1661, nBuffLevel = 3 }, + { szName = RUYIJINNANG, szID = 'RuyiJinnang', dwBuffID = 1661, nBuffLevel = 2 }, + { szName = XINGYUNJINNANG, szID = 'XingyunJinnang', dwBuffID = 1661, nBuffLevel = 1 }, + }, + }, +} + +-- 使用背包物品 +function D.UseBagItem(szName, bWarn) + local me = X.GetClientPlayer() + for i = 1, 6 do + for j = 0, me.GetBoxSize(i) - 1 do + local it = GetPlayerItem(me, i, j) + if it and it.szName == szName then + --[[#DEBUG BEGIN]] + X.OutputDebugMessage('MY_Taoguan', 'UseItem: ' .. i .. ',' .. j .. ' ' .. szName, X.DEBUG_LEVEL.LOG) + --[[#DEBUG END]] + OnUseItem(i, j) + return true + end + end + end + if bWarn then + X.OutputSystemAnnounceMessage(_L('Auto taoguan: missing [%s]!', szName)) + end +end + +-- 砸罐子状态机转移函数 +function D.BreakCanStateTransfer() + local me = X.GetClientPlayer() + if not me or not D.bEnable then + return + end + local nLFC = GetLogicFrameCount() + -- 确认掉砸金蛋确认框 + X.DoMessageBox('PlayerMessageBoxCommon') + -- 吃药还在CD则等待 + if nLFC - D.nUseItemLFC < ITEM_CD then + return + end + -- 检查吃药BUFF满足情况 + for _, aItem in ipairs(D.aUseItemOrder) do + -- 每个分组优先级顺序处理 + for _, item in ipairs(aItem) do + -- 符合吃药分数条件 + if D.nPoint >= O['nUse' .. item.szID] then + -- 如果已经有BUFF,即吃过药了,则跳出循环 + if X.GetBuff(me, item.dwBuffID, item.nBuffLevel) then + break + end + -- 否则尝试吃药 + if D.UseBagItem(item.szName, O['bPauseNo' .. item.szID]) then + D.nUseItemLFC = nLFC + -- 吃成功了,等待下次状态机转移函数调用 + return + end + if O['bPauseNo' .. item.szID] then + -- 吃失败了,暂停砸罐子 + D.Stop() + return + end + end + end + end + -- 锤子还在CD则等待 + if nLFC - D.nUseHammerLFC < HAMMER_CD then + return + end + -- 寻找能砸的陶罐 + local npcTaoguan + for _, npc in ipairs(X.GetNearNpc()) do + if npc and npc.dwTemplateID == 6820 then + if X.GetCharacterDistance(me, npc) < 4 then + npcTaoguan = npc + break + end + end + end + -- 没有能砸的陶罐考虑自己放一个 + if not npcTaoguan and O.bUseTaoguan then + if D.UseBagItem(TAOGUAN) then + D.nUseItemLFC = nLFC + end + end + -- 还是没有找到罐子则等待 + if not npcTaoguan then + return + end + -- 找到罐子了,设为目标 + X.SetClientPlayerTarget(TARGET.NPC, npcTaoguan.dwID) + -- 需要用小金锤,砸他丫的 + if D.nPoint >= O.nUseXiaojinchui then + if D.UseBagItem(XIAOJINCHUI, O.bPauseNoXiaojinchui) then + -- 砸成功了,等锤子CD + D.nUseHammerLFC = nLFC + D.bWaitPoint = true + return + end + if O.bPauseNoXiaojinchui then + -- 砸失败了,暂停砸罐子 + D.Stop() + return + end + end + -- 需要用小银锤,砸他丫的 + if D.UseBagItem(XIAOYINCHUI) then + -- 砸成功了,等锤子CD + D.nUseHammerLFC = nLFC + D.bWaitPoint = true + return + end + -- 没有小银锤时使用小金锤? + if O.bNoYinchuiUseJinchui and D.UseBagItem(XIAOJINCHUI) then + -- 砸成功了,等锤子CD + D.nUseHammerLFC = nLFC + return + end + -- 没有金锤也没有银锤,凉了呀 + D.UseBagItem(XIAOYINCHUI, true) + D.Stop() +end + +------------------------------------- +-- 事件处理 +------------------------------------- +function D.MonitorZP(szChannel, szMsg) + local _, _, nP = string.find(szMsg, _L['Current total score:(%d+)']) + if nP then + D.nPoint = tonumber(nP) + if D.nPoint >= O.nPausePoint then + D.Stop() + D.bReachLimit = true + X.OutputSystemAnnounceMessage(_L['Auto taoguan: reach limit!']) + end + D.bWaitPoint = false + D.nUseHammerLFC = GetLogicFrameCount() + end +end + +function D.OnLootItem() + if arg0 == X.GetClientPlayer().dwID and arg2 > 2 and GetItem(arg1).szName == MEILIANGYUQIAN then + D.nPoint = 0 + D.bWaitPoint = false + if D.bEnable then + X.OutputSystemAnnounceMessage(_L['Auto taoguan: score clear!']) + end + end +end + +function D.OnDoodadEnter() + if D.bEnable or D.bReachLimit then + local me = X.GetClientPlayer() + local d = X.GetDoodad(arg0) + if me and d and d.szName == TAOGUAN and d.CanDialog(me) + and X.GetCharacterDistance(me, d) < 4.1 + then + D.dwDoodadID = arg0 + X.DelayCall(520, function() + X.InteractDoodad(D.dwDoodadID) + end) + end + end +end + +function D.OnOpenDoodad() + if D.bEnable or D.bReachLimit then + local d = X.GetDoodad(D.dwDoodadID) + if d and d.szName == TAOGUAN then + local nQ, nM = 1, X.GetDoodadLootMoney(D.dwDoodadID) + if nM > 0 then + LootMoney(d.dwID) + end + for i = 1, 32 do + local it, bRoll, bDist = X.GetDoodadLootItem(D.dwDoodadID, i) + if not it then + break + end + local szName = GetItemNameByItem(it) + if it.nQuality >= nQ and not bRoll and not bDist + and not O.tFilterItem[szName] + then + LootItem(d.dwID, it.dwID) + else + X.OutputSystemAnnounceMessage(_L('Auto taoguan: filter item [%s].', szName)) + end + end + local hL = Station.Lookup('Normal/LootList', 'Handle_LootList') + if hL then + hL:Clear() + end + end + D.bReachLimit = nil + end +end + +-- 砸罐子开始(注册事件) +function D.Start() + if D.bEnable then + return + end + D.bEnable = true + D.bWaitPoint = false + X.RegisterMsgMonitor('MSG_SYS', 'MY_Taoguan', D.MonitorZP) + X.BreatheCall('MY_Taoguan', D.BreakCanStateTransfer) + X.RegisterEvent('LOOT_ITEM', 'MY_Taoguan', D.OnLootItem) + X.RegisterEvent('DOODAD_ENTER_SCENE', 'MY_Taoguan', D.OnDoodadEnter) + X.RegisterEvent('HELP_EVENT', 'MY_Taoguan', function() + if arg0 == 'OnOpenpanel' and arg1 == 'LOOT' + and D.bEnable and D.dwDoodadID ~= 0 + then + D.OnOpenDoodad() + D.dwDoodadID = 0 + end + end) + X.OutputSystemAnnounceMessage(_L['Auto taoguan: on.']) +end + +-- 砸罐子关闭(注销事件) +function D.Stop() + if not D.bEnable then + return + end + D.bEnable = false + X.RegisterMsgMonitor('MSG_SYS', 'MY_Taoguan', false) + X.BreatheCall('MY_Taoguan', false) + X.RegisterEvent('NPC_ENTER_SCENE', 'MY_Taoguan', false) + -- X.RegisterEvent('LOOT_ITEM', 'MY_Taoguan', false) -- 积分清零监听不可注销,否则下次启动会错误判定 + X.RegisterEvent('DOODAD_ENTER_SCENE', 'MY_Taoguan', false) + X.RegisterEvent('HELP_EVENT', 'MY_Taoguan', false) + X.OutputSystemAnnounceMessage(_L['Auto taoguan: off.']) +end + +-- 砸罐子开关 +function D.Switch() + if D.bEnable then + D.Stop() + else + D.Start() + end +end + +------------------------------------- +-- 设置界面 +------------------------------------- +local PS = {} + +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 20, 20 + local nX, nY = nPaddingX, nPaddingY + + ui:Append('Text', { text = _L['Feature setting'], x = nX, y = nY, font = 27 }) + + -- 分数达到多少停砸 + nX = nPaddingX + 10 + nY = nY + 28 + nX = ui:Append('Text', { text = _L['Stop simple broken can when score reaches'], x = nX, y = nY }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndComboBox', { + x = nX, y = nY, w = 100, h = 25, + text = O.nPausePoint, + menu = function() + local ui = X.UI(this) + local m0 = {} + for i = 2, MAX_POINT_POW do + local v = 10 * 2 ^ i + table.insert(m0, { szOption = tostring(v), fnAction = function() + O.nPausePoint = v + ui:Text(tostring(v)) + end }) + end + return m0 + end, + }):Pos('BOTTOMRIGHT') + 10 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L['Put can if needed?'], + checked = O.bUseTaoguan, + onCheck = function(bChecked) O.bUseTaoguan = bChecked end, + }):AutoWidth() + + -- 没有小银锤时使用小金锤 + -- nX = X + 10 + nY = nY + 28 + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 200, + text = _L('When no %s use %s?', XIAOYINCHUI, XIAOJINCHUI), + checked = O.bNoYinchuiUseJinchui, + onCheck = function(bChecked) O.bNoYinchuiUseJinchui = bChecked end, + }):AutoWidth() + + -- 各种东西使用分数和缺少停砸 + local nMaxItemNameLen = 0 + for _, p in ipairs(D.aUseItemPS) do + nMaxItemNameLen = math.max(nMaxItemNameLen, X.StringLenW(p.szName)) + end + for _, p in ipairs(D.aUseItemPS) do + nX = nPaddingX + 10 + nY = nY + 28 + nX = ui:Append('Text', { + x = nX, y = nY, + text = _L('Use %s when score reaches', p.szName .. string.rep(g_tStrings.STR_ONE_CHINESE_SPACE, nMaxItemNameLen - X.StringLenW(p.szName))), + }):AutoWidth():Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndComboBox', { + x = nX, y = nY, w = 100, h = 25, + text = O['nUse' .. p.szID], + menu = function() + local ui = X.UI(this) + local m0 = {} + for i = 2, MAX_POINT_POW - 1 do + local v = 10 * 2 ^ i + table.insert(m0, { szOption = tostring(v), fnAction = function() + O['nUse' .. p.szID] = v + ui:Text(tostring(v)) + end }) + end + return m0 + end, + }):Pos('BOTTOMRIGHT') + 10 + nX = ui:Append('WndCheckBox', { + x = nX, y = nY, + text = _L['Stop break when no item'], + checked = O['bPauseNo' .. p.szID], + onCheck = function(bChecked) + O['bPauseNo' .. p.szID] = bChecked + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + end + + -- 拾取过滤 + nX = nPaddingX + 10 + nY = nY + 38 + nX = ui:Append('WndComboBox', { + x = nX, y = nY, w = 150, + text = _L['Pickup filters'], + menu = function() + local m0 = {} + for _, p in ipairs(FILTER_ITEM) do + table.insert(m0, { + szOption = p.szName, + bCheck = true, bChecked = O.tFilterItem[p.szName], + fnAction = function(d, b) + O.tFilterItem[p.szName] = b + O.tFilterItem = O.tFilterItem + end, + }) + end + for k, v in pairs(O.tFilterItem) do + if FILTER_ITEM_DEFAULT[k] == nil then + table.insert(m0, { + szOption = k, + bCheck = true, bChecked = v, + fnAction = function(d, b) + O.tFilterItem[k] = b + O.tFilterItem = O.tFilterItem + end, + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + O.tFilterItem[k] = nil + O.tFilterItem = O.tFilterItem + X.UI.ClosePopupMenu() + end, + }) + end + end + if #m0 > 0 then + table.insert(m0, X.CONSTANT.MENU_DIVIDER) + end + table.insert(m0, { + szOption = _L['Custom add'], + fnAction = function() + local function fnConfirm(szText) + O.tFilterItem[szText] = true + O.tFilterItem = O.tFilterItem + end + GetUserInput(_L['Please input custom name'], fnConfirm, nil, nil, nil, '', 20) + end, + }) + return m0 + end, + }):AutoWidth():Pos('BOTTOMRIGHT') + 10 + ui:Append('Text', { x = nX, y = nY, text = _L['(Checked will not be picked up, if still pick please check system auto pick config)'] }) + + -- 控制按钮 + nX = nPaddingX + 10 + nY = nY + 36 + nX = ui:Append('WndButton', { + x = nX, y = nY, w = 130, h = 30, + text = _L['Start/stop break can'], + onClick = D.Switch, + }):Pos('BOTTOMRIGHT') + 5 + nX = ui:Append('WndButton', { + x = nX, y = nY, w = 130, h = 30, + text = _L['Restore default config'], + onClick = function() + O('reset') + X.Panel.SwitchTab('MY_Taoguan', true) + end, + }):Pos('BOTTOMRIGHT') +end +X.Panel.Register(_L['Target'], 'MY_Taoguan', _L[MODULE_NAME], 119, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_VisualSkill.lua b/MY_Toolbox/src/MY_VisualSkill.lua new file mode 100644 index 000000000..12db3e909 --- /dev/null +++ b/MY_Toolbox/src/MY_VisualSkill.lua @@ -0,0 +1,501 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 技能显示 - 战斗可视化 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_VisualSkill' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- +local INI_PATH = X.PACKET_INFO.ROOT .. 'MY_Toolbox/ui/MY_VisualSkill.ini' +local DEFAULT_ANCHOR = { x = 0, y = -220, s = 'BOTTOMCENTER', r = 'BOTTOMCENTER' } +local O = X.CreateUserSettingsModule('MY_VisualSkill', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_VisualSkill'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, + bPenetrable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_VisualSkill'], + _L['Penetrable UI'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = true, + }, + nVisualSkillBoxCount = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_VisualSkill'], + _L['Display skills count'], + }), + xSchema = X.Schema.Number, + xDefaultValue = 5, + }, + anchor = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_VisualSkill'], + _L['UI Anchor'], + }), + xSchema = X.Schema.FrameAnchor, + xDefaultValue = X.Clone(DEFAULT_ANCHOR), + }, + aIgnoreSkill = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_VisualSkill'], + _L['Ignore skill list'], + }), + xSchema = X.Schema.Collection(X.Schema.Number), + xDefaultValue = { + 10 , -- (10) 横扫千军 横扫千军 + 11 , -- (11) 普通攻击-棍攻击 六合棍 + 12 , -- (12) 普通攻击-枪攻击 梅花枪法 + 13 , -- (13) 普通攻击-剑攻击 三柴剑法 + 14 , -- (14) 普通攻击-拳套攻击 长拳 + 15 , -- (15) 普通攻击-双兵攻击 连环双刀 + 16 , -- (16) 普通攻击-笔攻击 判官笔法 + 1795 , -- (1795) 普通攻击-重剑攻击 四季剑法 + 2183 , -- (2183) 普通攻击-虫笛攻击 大荒笛法 + 3121 , -- (3121) 普通攻击-弓攻击 罡风镖法 + 4326 , -- (4326) 普通攻击-双刀攻击 大漠刀法 + 13039, -- (13039) 普通攻击_盾刀攻击 卷雪刀 + 14063, -- (14063) 普通攻击_琴攻击 五音六律 + 16010, -- (16010) 普通攻击_傲霜刀攻击 霜风刀法 + 19712, -- (19712) 普通攻击_蓬莱伞攻击 飘遥伞击 + 22126, -- (22126) 普通攻击-碎风刃 碎风刃 + 31636, -- (31636) 普通攻击-云刀 云刀 + 38034, -- (38034) 普通攻击-云合扇法 云合扇法 + 17 , -- (17) 江湖-防身武艺-打坐 打坐 + 18 , -- (18) 踏云 踏云 + }, + }, +}) +local D = { + tIgnoreSkill = {}, +} + +local BOX_WIDTH = 46 +local BOX_ANIMATION_TIME = 300 +local BOX_SLIDEOUT_DISTANCE = 200 + +-- local FORMATION_SKILL = { +-- [230 ] = true, -- (230) 万花伤害阵法施放 七绝逍遥阵 +-- [347 ] = true, -- (347) 纯阳气宗阵法施放 九宫八卦阵 +-- [526 ] = true, -- (526) 七秀治疗阵法施放 花月凌风阵 +-- [662 ] = true, -- (662) 天策防御阵法释放 九襄地玄阵 +-- [740 ] = true, -- (740) 少林防御阵法施放 金刚伏魔阵 +-- [745 ] = true, -- (745) 少林攻击阵法施放 天鼓雷音阵 +-- [754 ] = true, -- (754) 天策攻击阵法释放 卫公折冲阵 +-- [778 ] = true, -- (778) 纯阳剑宗阵法施放 北斗七星阵 +-- [781 ] = true, -- (781) 七秀伤害阵法施放 九音惊弦阵 +-- [1020 ] = true, -- (1020) 万花治疗阵法施放 落星惊鸿阵 +-- [1866 ] = true, -- (1866) 藏剑阵法释放 依山观澜阵 +-- [2481 ] = true, -- (2481) 五毒治疗阵法施放 妙手织天阵 +-- [2487 ] = true, -- (2487) 五毒攻击阵法施放 万蛊噬心阵 +-- [3216 ] = true, -- (3216) 唐门外功阵法施放 流星赶月阵 +-- [3217 ] = true, -- (3217) 唐门内功阵法施放 千机百变阵 +-- [4674 ] = true, -- (4674) 明教攻击阵法施放 炎威破魔阵 +-- [4687 ] = true, -- (4687) 明教防御阵法施放 无量光明阵 +-- [5311 ] = true, -- (5311) 丐帮攻击阵法释放 降龙伏虎阵 +-- [13228] = true, -- (13228) 临川列山阵释放 临川列山阵 +-- [13275] = true, -- (13275) 锋凌横绝阵施放 锋凌横绝阵 +-- } + +function D.UpdateUserSettings() + D.tIgnoreSkill = {} + for _, v in ipairs(O.aIgnoreSkill) do + D.tIgnoreSkill[v] = true + end +end + +function D.UpdateAnchor(frame) + local anchor = O.anchor + frame:SetPoint(anchor.s, 0, 0, anchor.r, anchor.x, anchor.y) + frame:CorrectPos() +end + +function D.UpdateAnimation(frame, fPercentage) + local hList = frame:Lookup('', 'Handle_Boxes') + local nCount = hList:GetItemCount() + local nSlideLRelX = 0 - BOX_SLIDEOUT_DISTANCE + local nSlideRRelX = hList:GetW() + BOX_SLIDEOUT_DISTANCE + -- [0, O.nVisualSkillBoxCount] 最终显示的BOX + -- [O.nVisualSkillBoxCount - 1, nCount - 1] 用作动画的渐隐BOX + for i = 0, nCount - 1 do + local hItem = hList:LogicLookup(i) + if not hItem.nStartX then + hItem.nStartX = hItem:GetRelX() + end + local nDstRelX = i < O.nVisualSkillBoxCount + and hList:GetW() - BOX_WIDTH * (i + 1) -- 列表BOX计算排列位置 + or ((fPercentage == 1 or hItem.nStartX > hList:GetW() - BOX_WIDTH) + and (nSlideRRelX + BOX_WIDTH * (nCount - i + 1)) -- 未参与动画或动画结束的BOX终点为右侧 + or (nSlideLRelX - BOX_WIDTH * (i - O.nVisualSkillBoxCount))) -- 参与动画的BOX终点为左侧 + local nRelX = hItem.nStartX + (nDstRelX - hItem.nStartX) * ( + hItem.nStartX > hList:GetW() - BOX_WIDTH + and math.min(fPercentage / 0.4, 1) -- 动画BOX先行运动发起碰撞 + or math.max((fPercentage - 0.4) / 0.6, 0) -- 列表BOX延迟碰撞 + ) + if hItem.nStartX > hList:GetW() - BOX_WIDTH then -- 右侧进场BOX播放碰撞动画 + if fPercentage < 0.7 and (not hItem.nHitTime or GetTime() - hItem.nHitTime > BOX_ANIMATION_TIME) then + hItem:Lookup('Animate_Hit'):Replay() + hItem.nHitTime = GetTime() + end + end + local nAlpha = (nRelX >= 0 and nRelX <= hList:GetW() - BOX_WIDTH) + and 255 + or (1 - math.min(math.abs(nRelX < 0 and nRelX or (hList:GetW() - BOX_WIDTH - nRelX)) / BOX_SLIDEOUT_DISTANCE, 1)) * 255 + hItem:SetRelX(nRelX) + hItem:SetAlpha(nAlpha) + end + hList:FormatAllItemPos() +end + +function D.StartAnimation(frame, nStep) + local hList = frame:Lookup('', 'Handle_Boxes') + if nStep then + hList.nIndexBase = (hList.nIndexBase - nStep) % hList:GetItemCount() + end + local nCount = hList:GetItemCount() + for i = 0, nCount - 1 do + local hItem = hList:Lookup(i) + hItem.nStartX = hItem:GetRelX() + end + frame.nTickStart = GetTickCount() +end + +-- 绘制正确数量的列表 +function D.CorrectBoxCount(frame) + local hList = frame:Lookup('', 'Handle_Boxes') + local nBoxCount = O.nVisualSkillBoxCount * 2 + local nBoxCountOffset = nBoxCount - hList:GetItemCount() + if nBoxCountOffset == 0 then + return + end + if nBoxCountOffset > 0 then + for i = 1, nBoxCountOffset do + hList:AppendItemFromIni(INI_PATH, 'Handle_Box'):Lookup('Box_Skill'):Hide() + for i = hList:GetItemCount() - 1, hList.nIndexBase + 1 do + hList:ExchangeItemIndex(i, i - 1) + end + end + elseif nBoxCountOffset < 0 then + for i = nBoxCountOffset, -1 do + hList:LogicRemoveItem(0) + hList.nIndexBase = hList.nIndexBase % hList:GetItemCount() + end + end + local nBoxesW = BOX_WIDTH * O.nVisualSkillBoxCount + frame:Lookup('', 'Handle_Bg/Image_Bg_11'):SetW(nBoxesW) + frame:Lookup('', 'Handle_Bg'):FormatAllItemPos() + frame:Lookup('', ''):FormatAllItemPos() + frame:SetW(nBoxesW + 169) + hList:SetW(nBoxesW) + hList.nCount = nBoxCount + D.UpdateAnimation(frame, 1) +end + +function D.UpdatePenetrable(frame) + frame:SetMousePenetrable(O.bPenetrable) +end + +function D.OnSkillCast(frame, dwSkillID, dwSkillLevel) + -- 获取技能信息 + local szSkillName, dwIconID = X.GetSkillName(dwSkillID, dwSkillLevel) + if dwSkillID == 4097 then -- 骑乘 + dwIconID = 1899 + end + -- 无名技能屏蔽 + if not szSkillName or szSkillName == '' then + return + end + -- 普攻屏蔽 + if D.tIgnoreSkill[dwSkillID] then + return + end + -- 特殊图标技能屏蔽 + if dwIconID == 1817 --[[闭阵]] or dwIconID == 533 --[[打坐]] or dwIconID == 0 --[[子技能]] or dwIconID == 13 --[[子技能]] then + return + end + -- 阵法释放技能屏蔽 + if Table_IsSkillFormation(dwSkillID, dwSkillLevel) or Table_IsSkillFormationCaster(dwSkillID, dwSkillLevel) then + return + end + -- 渲染界面触发动画 + local box = frame:Lookup('', 'Handle_Boxes') + :LogicLookup(-1):Lookup('Box_Skill') + box:SetObject(UI_OBJECT_SKILL, dwSkillID, dwSkillLevel) + box:SetObjectIcon(dwIconID) + box:Show() + D.StartAnimation(frame, 1) +end + +function D.OnFrameCreate() + local hList = this:Lookup('', 'Handle_Boxes') + hList.LogicLookup = function(el, i) + return el:Lookup((i + el.nIndexBase) % el.nCount) + end + hList.LogicRemoveItem = function(el, i) + return el:RemoveItem((i + el.nIndexBase) % el.nCount) + end + hList.nIndexBase = 0 + hList.nCount = 0 + D.CorrectBoxCount(this) + D.UpdatePenetrable(this) + this:RegisterEvent('RENDER_FRAME_UPDATE') + this:RegisterEvent('UI_SCALED') + this:RegisterEvent('DO_SKILL_CAST') + this:RegisterEvent('DO_SKILL_CHANNEL_PROGRESS') + this:RegisterEvent('ON_ENTER_CUSTOM_UI_MODE') + this:RegisterEvent('ON_LEAVE_CUSTOM_UI_MODE') + this:RegisterEvent('CUSTOM_UI_MODE_SET_DEFAULT') + D.OnEvent('UI_SCALED') +end + +function D.OnItemMouseEnter() + local name = this:GetName() + if name == 'Box_Skill' then + local dwSkillID, dwSkillLevel = this:GetObjectData() + X.OutputSkillTip(this, dwSkillID, dwSkillLevel) + this:SetObjectMouseOver(true) + end +end + +function D.OnItemMouseLeave() + local name = this:GetName() + if name == 'Box_Skill' then + X.HideTip() + this:SetObjectMouseOver(false) + end +end + +function D.OnEvent(event) + if event == 'RENDER_FRAME_UPDATE' then + if not this.nTickStart then + return + end + local nTickDuring = GetTickCount() - this.nTickStart + if nTickDuring > 600 then + this.nTickStart = nil + end + D.UpdateAnimation(this, math.min(math.max(nTickDuring / BOX_ANIMATION_TIME, 0), 1)) + elseif event == 'UI_SCALED' then + D.UpdateAnchor(this) + elseif event == 'DO_SKILL_CAST' then + local dwID, dwSkillID, dwSkillLevel = arg0, arg1, arg2 + if dwID == X.GetControlPlayer().dwID then + D.OnSkillCast(this, dwSkillID, dwSkillLevel) + end + elseif event == 'DO_SKILL_CHANNEL_PROGRESS' then + local dwID, dwSkillID, dwSkillLevel = arg3, arg1, arg2 + if dwID == X.GetControlPlayer().dwID then + D.OnSkillCast(this, dwSkillID, dwSkillLevel) + end + elseif event == 'ON_ENTER_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['Visual skill'], O.bPenetrable) + elseif event == 'ON_LEAVE_CUSTOM_UI_MODE' then + UpdateCustomModeWindow(this, _L['Visual skill'], O.bPenetrable) + MY_VisualSkill.anchor = GetFrameAnchor(this) + elseif event == 'CUSTOM_UI_MODE_SET_DEFAULT' then + MY_VisualSkill.anchor = X.Clone(DEFAULT_ANCHOR) + D.UpdateAnchor(this) + end +end + +function D.Open() + X.UI.OpenFrame(INI_PATH, 'MY_VisualSkill') +end + +function D.GetFrame() + return Station.Lookup('Normal/MY_VisualSkill') +end + +function D.Close() + X.UI.CloseFrame('MY_VisualSkill') +end + +function D.Reload() + if D.bReady and O.bEnable then + local frame = D.GetFrame() + if frame then + D.CorrectBoxCount(frame) + D.UpdatePenetrable(frame) + else + D.Open() + end + else + D.Close() + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Visual skill'], + checked = MY_VisualSkill.bEnable, + onCheck = function(bChecked) + MY_VisualSkill.bEnable = bChecked + end, + }):Width() + 5 + + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Penetrable UI'], + checked = MY_VisualSkill.bPenetrable, + onCheck = function(bChecked) + MY_VisualSkill.bPenetrable = bChecked + end, + }):Width() + 5 + + nX = nX + ui:Append('WndSlider', { + x = nX, y = nY, + sliderStyle = X.UI.SLIDER_STYLE.SHOW_VALUE, range = {1, 32}, + value = MY_VisualSkill.nVisualSkillBoxCount, + text = _L('Display %d skills.', MY_VisualSkill.nVisualSkillBoxCount), + textFormatter = function(val) return _L('Display %d skills.', val) end, + onChange = function(val) + MY_VisualSkill.nVisualSkillBoxCount = val + end, + }):Width() + 5 + + nX = nX + ui:Append('WndComboBox', { + x = nX, y = nY, h = 24, + text = _L['Ignore skill list'], + menu = function() + local menu = {} + for nIndex, dwSkillID in ipairs(O.aIgnoreSkill) do + table.insert(menu, { + szOption = dwSkillID .. ' - ' .. (X.GetSkillName(dwSkillID) or '?'), + szIcon = 'ui/Image/UICommon/CommonPanel2.UITex', + nFrame = 49, + nMouseOverFrame = 51, + nIconWidth = 17, + nIconHeight = 17, + szLayer = 'ICON_RIGHTMOST', + fnClickIcon = function() + local aIgnoreSkill = {} + for i, v in ipairs(O.aIgnoreSkill) do + if not (i == nIndex and v == dwSkillID) then + table.insert(aIgnoreSkill, v) + end + end + O.aIgnoreSkill = aIgnoreSkill + D.UpdateUserSettings() + X.UI.ClosePopupMenu() + end, + }) + end + if #menu > 0 then + table.insert(menu, X.CONSTANT.MENU_DIVIDER) + end + table.insert(menu, { + szOption = _L['Add'], + fnAction = function () + GetUserInput(_L['Please input skill id'], function(szID) + local dwID = tonumber(szID) + if dwID then + local aIgnoreSkill = {} + for i, v in ipairs(O.aIgnoreSkill) do + if v == dwID then + return + end + table.insert(aIgnoreSkill, v) + end + table.insert(aIgnoreSkill, dwID) + O.aIgnoreSkill = aIgnoreSkill + D.UpdateUserSettings() + else + X.OutputSystemAnnounceMessage(_L['Invalid skill id']) + end + end, nil, nil, nil, '') + end, + }) + return menu + end, + }):Width() + 5 + + + nX = nPaddingX + nY = nY + nLH + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_VisualSkill', + exports = { + { + preset = 'UIEvent', + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + 'bPenetrable', + 'nVisualSkillBoxCount', + 'anchor', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + 'bPenetrable', + 'nVisualSkillBoxCount', + 'anchor', + }, + triggers = { + bEnable = D.Reload, + bPenetrable = D.Reload, + nVisualSkillBoxCount = D.Reload, + }, + root = O, + }, + }, +} +MY_VisualSkill = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_VisualSkill', function() + D.bReady = true + D.UpdateUserSettings() + D.Reload() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/MY_YunMacro.lua b/MY_Toolbox/src/MY_YunMacro.lua new file mode 100644 index 000000000..b11ff249f --- /dev/null +++ b/MY_Toolbox/src/MY_YunMacro.lua @@ -0,0 +1,246 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 云端宏 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/MY_YunMacro' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +X.RegisterRestriction('MY_YunMacro', { ['*'] = false }) +-------------------------------------------------------------------------- + +local O = X.CreateUserSettingsModule('MY_YunMacro', _L['General'], { + bEnable = { + ePathType = X.PATH_TYPE.ROLE, + szLabel = _L['MY_Toolbox'], + szDescription = X.MakeCaption({ + _L['MY_YunMacro'], + _L['Enable'], + }), + xSchema = X.Schema.Boolean, + xDefaultValue = false, + }, +}) +local D = {} + +function D.Hook() + local frame = Station.SearchFrame('MacroSettingPanel') + if not frame then + return + end + local edtName = frame:Lookup('Edit_Name') + local imgNameBg = frame:Lookup('', 'Image_NameBg') + local edtDesc = frame:Lookup('Edit_Desc') + local edtMacro = frame:Lookup('Edit_Content') + local btnNew = frame:Lookup('Btn_New') + local hIconList = frame:Lookup('', 'Handle_Icon') + local nX = edtName:GetRelX() + edtName:GetW() + 10 + local nY = edtName:GetRelY() - 4 + local nH = edtName:GetH() + if imgNameBg then + nY = imgNameBg:GetRelY() + nH = imgNameBg:GetH() + end + nX = nX + X.UI(frame):Append('WndButton', { + name = 'Btn_YunMacro_Update', + x = nX, y = nY, + w = 'auto', h = nH, + text = _L['Sync yun macro'], + onClick = function() + local szName = X.TrimString(edtName:GetText()) + if X.IsEmpty(szName) then + return X.Alert(_L['Please input macro name first.']) + end + X.Alert('MY_YunMacro', _L['Macro update started, please keep panel opened and wait.'], nil, _L['Got it']) + X.Ajax({ + url = MY_RSS.PULL_BASE_URL .. '/api/macro/query', + data = { + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + name = szName, + }, + success = function(szHTML) + local res, err = X.DecodeJSON(szHTML) + if res then + if res.msg then + return X.Alert('MY_YunMacro', res.msg) + end + local bValid, szErrID, nLine, szErrMsg = X.IsMacroValid(res.data) + if bValid then + res.desc = X.ReplaceSensitiveWord(res.desc) + else + res, err = false, szErrMsg + end + end + if not res then + return X.Alert('MY_YunMacro', _L['ERR: Info content is illegal!'] .. '\n\n' .. err, nil, _L['Got it']) + end + if res.icon then + for i = 0, hIconList:GetItemCount() - 1 do + local h = hIconList:Lookup(i) + if h:GetType() == 'Handle' then + h = h:Lookup('Box_Icon') + end + h:SetObjectInUse(false) + end + local box = hIconList:Lookup(0) + if box:GetType() == 'Handle' then + box = box:Lookup('Box_Icon') + end + box:SetObjectInUse(true) + box:SetObjectIcon(res.icon) + box.nIconID = res.icon + hIconList.nIconID = res.icon + end + edtDesc:SetText(res.desc) + edtDesc:SetCaretPos(0) + edtMacro:SetText(res.data) + edtMacro:SetCaretPos(0) + X.Alert('MY_YunMacro', _L['Macro update succeed, please click save button.'], nil, _L['Got it']) + end, + error = function() + X.Alert('MY_YunMacro', _L['Macro update failed...'], nil, _L['Got it']) + end, + }) + end, + }):Width() + X.UI(frame):Append('WndButton', { + name = 'Btn_YunMacro_Details', + x = nX, y = nY, + w = 'auto', h = nH, + text = _L['Show yun macro details'], + onClick = function() + local szName = X.TrimString(edtName:GetText()) + if X.IsEmpty(szName) then + return X.Alert(_L['Please input macro name first.']) + end + local szURL = MY_RSS.PAGE_BASE_URL .. '/macro/details?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + name = szName, + })) + X.UI.OpenBrowser(szURL, { key = 'MY_YunMacro_' .. GetStringCRC(szName), layer = 'Topmost', readonly = true }) + end, + }) + X.UI(frame):Append('WndButton', { + name = 'Btn_YunMacro_Tops', + x = edtMacro:GetRelX(), y = btnNew:GetRelY(), + w = btnNew:GetW(), h = btnNew:GetH(), + text = _L['Top yun macro'], + onClick = function() + local szURL = MY_RSS.PAGE_BASE_URL .. '/macro/tops?' + .. X.EncodeQuerystring(X.ConvertToUTF8({ + l = X.ENVIRONMENT.GAME_LANG, + L = X.ENVIRONMENT.GAME_EDITION, + kungfu = tostring(UI_GetPlayerMountKungfuID()), + })) + X.OpenBrowser(szURL) + end, + }) +end + +function D.Unhook() + local frame = Station.SearchFrame('MacroSettingPanel') + if not frame then + return + end + for _, s in ipairs({ + 'Btn_YunMacro_Update', + 'Btn_YunMacro_Details', + 'Btn_YunMacro_Tops', + }) do + local el = frame:Lookup(s) + if el then + el:Destroy() + end + end +end + +function D.Apply() + if D.bReady and O.bEnable then + D.Hook() + X.RegisterFrameCreate('MacroSettingPanel', 'MY_YunMacro', D.Hook) + X.RegisterReload('MY_YunMacro', D.Unhook) + else + D.Unhook() + X.RegisterFrameCreate('MacroSettingPanel', 'MY_YunMacro', false) + X.RegisterReload('MY_YunMacro', false) + end +end + +function D.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY) + if not X.IsRestricted('MY_YunMacro') then + nX = nX + ui:Append('WndCheckBox', { + x = nX, y = nY, w = 'auto', + text = _L['Cloud macro'], + tip = { + render = _L['Click icon on macro panel to view macro wiki'], + position = X.UI.TIP_POSITION.BOTTOM_TOP, + }, + checked = MY_YunMacro.bEnable, + onCheck = function(bChecked) + MY_YunMacro.bEnable = bChecked + end, + }):Width() + 5 + end + return nX, nY +end + +-------------------------------------------------------------------------------- +-- 全局导出 +-------------------------------------------------------------------------------- +do +local settings = { + name = 'MY_YunMacro', + exports = { + { + fields = { + 'OnPanelActivePartial', + }, + root = D, + }, + { + fields = { + 'bEnable', + }, + root = O, + }, + }, + imports = { + { + fields = { + 'bEnable', + }, + triggers = { + bEnable = D.Apply, + }, + root = O, + }, + }, +} +MY_YunMacro = X.CreateModule(settings) +end + +-------------------------------------------------------------------------------- +-- 事件注册 +-------------------------------------------------------------------------------- + +X.RegisterUserSettingsInit('MY_YunMacro', function() + D.bReady = true + D.Apply() +end) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/src/PS.lua b/MY_Toolbox/src/PS.lua new file mode 100644 index 000000000..a4e737b97 --- /dev/null +++ b/MY_Toolbox/src/PS.lua @@ -0,0 +1,96 @@ +-------------------------------------------------------------------------------- +-- This file is part of the JX3 Mingyi Plugin. +-- @link : https://jx3.zhaiyiming.com/ +-- @desc : 常用工具 +-- @author : 茗伊 @双梦镇 @追风蹑影 +-- @modifier : Emil Zhai (root@zhaiyiming.com) +-- @copyright: Emil Zhai +-------------------------------------------------------------------------------- +local X = MY +-------------------------------------------------------------------------------- +local MODULE_PATH = 'MY_Toolbox/PS' +local PLUGIN_NAME = 'MY_Toolbox' +local PLUGIN_ROOT = X.PACKET_INFO.ROOT .. PLUGIN_NAME +local MODULE_NAME = 'MY_Toolbox' +local _L = X.LoadLangPack(PLUGIN_ROOT .. '/lang/') +-------------------------------------------------------------------------- +if not X.AssertVersion(MODULE_NAME, _L[MODULE_NAME], '^29.0.0') then + return +end +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'START')--[[#DEBUG END]] +-------------------------------------------------------------------------- + +do +local TARGET_TYPE, TARGET_ID +local function onHotKey() + if TARGET_TYPE then + X.SetClientPlayerTarget(TARGET_TYPE, TARGET_ID) + TARGET_TYPE, TARGET_ID = nil + else + local me = X.GetClientPlayer() + TARGET_TYPE, TARGET_ID = X.GetCharacterTarget(me) + X.SetClientPlayerTarget(TARGET.PLAYER, X.GetClientPlayerID()) + end +end +X.RegisterHotKey('MY_AutoLoopMeAndTarget', _L['Loop target between me and target'], onHotKey) +end + +local PS = { nPriority = 0 } +function PS.OnPanelActive(wnd) + local ui = X.UI(wnd) + local nPaddingX, nPaddingY = 25, 25 + local nW, nH = ui:Size() + local nX, nY = nPaddingX, nPaddingY + local nLH = 28 + + -- 目标 + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, h = 'auto', text = _L['Target'], color = {255, 255, 0} }):Height() + 5 + nX = nX + 10 + nX, nY = MY_FooterTip.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + -- 战斗 + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, h = 'auto', text = _L['Battle'], color = {255, 255, 0} }):Height() + 5 + nX = nX + 10 + nX, nY = MY_VisualSkill.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_DynamicActionBarPos.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_ArenaHelper.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = nPaddingX + 10, nY + nLH + nX, nY = MY_ShenxingHelper.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + -- 其他 + nX = nPaddingX + nY = nY + ui:Append('Text', { x = nX, y = nY, h = 'auto', text = _L['Others'], color = {255, 255, 0} }):Height() + 5 + nX = nX + 10 + nX, nY = MY_AchievementWiki.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_PetWiki.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_QuestWiki.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_RideWiki.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_ItemWiki.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_ItemPrice.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_YunMacro.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + nX, nY = nPaddingX + 10, nY + nLH + nX, nY = MY_AutoDiamond.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + + nX, nY = nPaddingX + 10, nY + nLH + nX, nY = MY_HideAnnounceBg.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = MY_FriendTipLocation.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + nX, nY = nPaddingX + 10, nY + nLH + nX, nY = MY_Domesticate.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + nX, nY = MY_Memo.OnPanelActivePartial(ui, nPaddingX + 10, nPaddingY, nW, nH, nX, nY, nLH) + + nX, nY = MY_AutoSell.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + nX, nY = nPaddingX + 10, nY + nLH + nX, nY = MY_DynamicItem.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + + -- 右侧浮动 + MY_GongzhanCheck.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) + MY_LockFrame.OnPanelActivePartial(ui, nPaddingX, nPaddingY, nW, nH, nX, nY, nLH) +end +X.Panel.Register(_L['General'], 'MY_Toolbox', _L['MY_Toolbox'], 134, PS) + +--[[#DEBUG BEGIN]]X.ReportModuleLoading(MODULE_PATH, 'FINISH')--[[#DEBUG END]] diff --git a/MY_Toolbox/ui/Btn_MagnifierDown.ini b/MY_Toolbox/ui/Btn_MagnifierDown.ini new file mode 100644 index 000000000..1a73569d0 --- /dev/null +++ b/MY_Toolbox/ui/Btn_MagnifierDown.ini @@ -0,0 +1,43 @@ +[Frame_MagnifierDown] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Btn_MagnifierDown] +._WndType=WndButton +._Parent=Frame_MagnifierDown +Left=0 +Top=0 +Width=40 +Height=40 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\Button_Interface.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=4 +MouseOverGroup=5 +MouseDownGroup=6 +DisableGroup=7 +ShowTipType=0 + diff --git a/MY_Toolbox/ui/Btn_MagnifierUp.ini b/MY_Toolbox/ui/Btn_MagnifierUp.ini new file mode 100644 index 000000000..1b896c858 --- /dev/null +++ b/MY_Toolbox/ui/Btn_MagnifierUp.ini @@ -0,0 +1,42 @@ +[Frame_MagnifierUp] +._WndType=WndFrame +._Parent=Normal +Left=0 +Top=0 +Width=0 +Height=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 + +[Btn_MagnifierUp] +._WndType=WndButton +._Parent=Frame_MagnifierUp +Left=0 +Top=0 +Width=40 +Height=40 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Trans=0 +Image=ui\Image\button\Button_Interface.UITex +Frame=-1 +GrayColor=0 +Up=0 +Down=0 +DisableFrame=-1 +NoOverSound=0 +Over=1 +OverFrame=0 +CheckBox=0 +CheckOver=0 +SendHoldMsg=0 +$Tip=Tip +NormalGroup=0 +MouseOverGroup=1 +MouseDownGroup=2 +DisableGroup=3 + diff --git a/MY_Toolbox/ui/MY_DynamicItem.ini b/MY_Toolbox/ui/MY_DynamicItem.ini new file mode 100644 index 000000000..699826ceb --- /dev/null +++ b/MY_Toolbox/ui/MY_DynamicItem.ini @@ -0,0 +1,251 @@ +[MY_DynamicItem] +._WndType=WndFrame +._Parent=Lowest +Left=100 +Top=100 +Width=1024 +Height=48 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaRight=0 +DragAreaBottom=0 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +ScriptFile=UI\Config\Default\ActionBar.lua +MinWidth=0 +MinHeight=0 +MaxWidth=0 +MaxHeight=0 +DragAreaWidth=0 +DragAreaHeight=0 +DisableBringToTop=0 +DummyWnd=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_DynamicItem +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=1024 +Height=48 + +[Handle_Splits] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=3 +Width=48 +Height=48 +RowSpacing=0 + +[Handle_Split] +._WndType=Handle +._Parent=Handle_Splits +PosType=8 +HandleType=0 +FirstItemPosType=0 +Width=48 +Height=48 + +[Image_SplitL] +._WndType=Image +._Parent=Handle_Split +Left=0 +Top=0 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=145 +Width=2 +Height=48 +ImageType=0 + +[Image_SplitR] +._WndType=Image +._Parent=Handle_Split +Left=48 +Top=0 +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=145 +Width=2 +Height=48 +ImageType=8 + +[Handle_List] +._WndType=Handle +._Parent=Handle_Total +Left=2 +Top=0 +PosType=0 +HandleType=3 +Width=1024 +Height=48 +RowSpacing=0 + +[Handle_Item] +._WndType=Handle +._Parent=Handle_List +PosType=8 +HandleType=0 +Width=46 +Height=48 +FirstItemPosType=0 + +[Image_ItemBg] +._WndType=Image +._Parent=Handle_Item +PosType=0 +Image=ui\Image\Minimap\Minimap.UITex +Alpha=255 +Frame=135 +Width=46 +Height=48 +Left=0 +Top=0 + +[Box_Item] +._WndType=Box +._Parent=Handle_Item +PosType=0 +IconID=169 +Width=44 +Height=44 +Left=1 +Top=1 +EventID=525119 + +[Text_Num] +._WndType=Text +._Parent=Handle_Item +Left=0 +Top=31 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +$Text=3 +Width=46 +Height=16 +OrgText=1 +FontScheme=16 +HAlign=2 +VAlign=1 +LockShowAndHide=1 + +[Image_NumBg] +._WndType=Image +._Parent=Handle_Item +Left=11 +Top=31 +PosType=0 +Image=ui\Image\UICommon\RankingPanel.UITex +Alpha=255 +Frame=15 +Width=36 +Height=16 +ImageType=8 +LockShowAndHide=1 + +[Text_HotKey] +._WndType=Text +._Parent=Handle_Item +Left=1 +Top=2 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +FontScheme=15 +$Text=S+E +Width=46 +Height=18 +AutoEtc=1 +ShowAll=0 + +[Text_CD] +._WndType=Text +._Parent=Handle_Item +Left=1 +Top=1 +PosType=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Width=44 +Height=44 +HAlign=1 +VAlign=1 +OrgText=1 +FontScheme=23 +$Text=5m + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_DynamicItem +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 + diff --git a/MY_Toolbox/ui/MY_Love.ini b/MY_Toolbox/ui/MY_Love.ini new file mode 100644 index 000000000..f6e99b970 --- /dev/null +++ b/MY_Toolbox/ui/MY_Love.ini @@ -0,0 +1,409 @@ +[MY_Love] +._WndType=WndFrame +._Parent=Normal +Left=30 +Top=169 +Width=384 +Height=554 +MinWidth=0 +MinHeight=0 +MaxWidth=0 +MaxHeight=0 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaRight=310 +DragAreaBottom=30 +AnimateStartPosX=0 +AnimateStartPosY=0 +AnimateEndPosX=0 +AnimateEndPosY=0 +AnimateTimeSpace=0 +AnimateMoveSpeed=0 +ScriptFile= +IsCustomDragable=0 +DragAreaWidth=0 +DragAreaHeight=0 +DummyWnd=1 + +[Page_Main] +._WndType=WndPageSet +._Parent=MY_Love +Left=0 +Top=0 +Width=100 +Height=150 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=1 +Frame=0 +PageCount=1 +Page_0=Page_Love +CheckBox_0=CheckBox_Love + +[CheckBox_Love] +._WndType=WndCheckBox +._Parent=Page_Main +Frame=1 +Left=270 +Top=510 +Width=78 +Height=25 +UnCheckAndEnable=12 +CheckAndEnable=11 +UnCheckAndDisable=14 +CheckAndDisable=11 +UnCheckedAndEnableWhenMouseOver=13 +CheckedAndEnableWhenMouseOver=11 +CheckedAndDisableWhenMouseOver=11 +UnCheckedAndDisableWhenMouseOver=14 +Checking=12 +UnChecking=12 +$Tip= +Image=ui\Image\UICommon\CommonPanel.UITex +UncheckFont=18 +CheckFont=18 +MouseOverFont=18 +MouseDownFont=18 +DisableFont=161 + +[Handle_CLove] +._WndType=Handle +._Parent=CheckBox_Love +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=78 +Height=25 + +[Text_LoveCaptical] +._WndType=Text +._Parent=Handle_CLove +$Text= +OrgText=1 +Left=0 +Top=0 +PosType=0 +Width=78 +Height=25 +MultiLine=0 +HAlign=1 +VAlign=1 +FontScheme=18 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Page_Love] +._WndType=WndPage +._Parent=Page_Main +Left=0 +Top=0 +Width=384 +Height=512 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +Frame=0 +Image= + +[Handle_PageLove] +._WndType=Handle +._Parent=Page_Love +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=381 +Height=517 + +[Handle_ClassicBg] +._WndType=Handle +._Parent=Handle_PageLove +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 +Width=381 +Height=517 + +[Image_LBg1] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=1 +Alpha=255 +Left=0 +Top=5 +PosType=0 + +[Image_LBg2] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=1 +Alpha=255 +PosType=7 +ImageType=8 + +[Image_LBg3] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=66 +Alpha=255 +Left=0 +Top=75 +PosType=0 + +[Image_LBg4] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=65 +Alpha=255 +PosType=7 +Width=365 +Height=357 + +[Image_LBg5] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=67 +Alpha=255 +PosType=8 + +[Image_LBg6] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=3 +Alpha=255 +PosType=11 + +[Image_LBg7] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=4 +Alpha=255 +PosType=1 +Width=249 +Height=85 + +[Image_LBg8] +._WndType=Image +._Parent=Handle_ClassicBg +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=5 +Alpha=255 +PosType=1 + +[Text_LTitle] +._WndType=Text +._Parent=Handle_PageLove +RowSpacing=0 +$Text= +OrgText=1 +Left=45 +Top=10 +PosType=0 +FontScheme=2 +Width=290 +Height=30 +HAlign=1 +VAlign=1 +FontSpacing=0 +Alpha=255 + +[Image_LIcon] +._WndType=Image +._Parent=Handle_PageLove +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=14 +Alpha=255 +Left=5 +Top=0 +PosType=0 +ImagePercent=1.000 + +[Image_LoveBg] +._WndType=Image +._Parent=Handle_PageLove +Image=ui\Image\UICommon\CommonPanel.UITex +Frame=45 +Alpha=255 +Left=10 +Top=191 +PosType=0 +Width=360 +Height=5 +ImagePercent=1.000 + +[Image_Lover] +._WndType=Image +._Parent=Handle_PageLove +Image= +PosType=0 +Left=40 +Top=75 +Alpha=255 +Width=74 +Height=80 +EventID=258 +TipRichText=0 +ImageType=8 +LockShowAndHide=1 + +[Animate_Lover] +._WndType=Animate +._Parent=Handle_PageLove +Left=40 +Top=75 +PosType=0 +Image= +Group=-1 +LoopCount=-1 +Width=75 +Height=84 +EventID=258 +LockShowAndHide=1 + +[Text_Lover] +._WndType=Text +._Parent=Handle_PageLove +$Text= +OrgText=1 +Top=92 +Left=130 +PosType=0 +Width=200 +Height=25 +MultiLine=0 +HAlign=0 +VAlign=1 +FontScheme=200 +RowSpacing=0 +FontSpacing=0 +EventID=258 +Alpha=255 + +[Text_LoverTitle] +._WndType=Text +._Parent=Handle_PageLove +$Text= +OrgText=1 +Top=122 +Left=130 +PosType=0 +Width=200 +Height=25 +MultiLine=0 +HAlign=0 +VAlign=1 +FontScheme=80 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Text_LoverInfo] +._WndType=Text +._Parent=Handle_PageLove +$Text= +OrgText=1 +Top=122 +Left=130 +PosType=0 +Width=200 +Height=25 +MultiLine=0 +HAlign=0 +VAlign=1 +FontScheme=2 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Text_SignTTL] +._WndType=Text +._Parent=Handle_PageLove +$Text= +OrgText=1 +Left=42 +Top=210 +PosType=0 +Width=300 +Height=25 +MultiLine=0 +HAlign=0 +VAlign=1 +FontScheme=187 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Text_Sign] +._WndType=Text +._Parent=Handle_PageLove +$Text= +OrgText=1 +Left=42 +Top=245 +PosType=0 +Width=300 +Height=80 +MultiLine=1 +HAlign=0 +VAlign=0 +FontScheme=0 +RowSpacing=0 +FontSpacing=0 +Alpha=255 + +[Btn_LoveYou] +._WndType=WndButton +._Parent=Page_Love +Frame=4 +Left=142 +Top=380 +Width=100 +Height=26 +NormalGroup=25 +MouseOverGroup=26 +MouseDownGroup=27 +DisableGroup=28 +Image=ui\Image\UICommon\CommonPanel.UITex + +[Handle_Btn_LoveYou] +._WndType=Handle +._Parent=Btn_LoveYou +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=26 + +[Text_LoveYou] +._WndType=Text +._Parent=Handle_Btn_LoveYou +RowSpacing=0 +FontSpacing=0 +Alpha=255 +OrgText=1 +Left=0 +Top=0 +PosType=0 +Width=100 +Height=26 +HAlign=1 +VAlign=1 +FontScheme=162 + diff --git a/MY_Toolbox/ui/MY_VisualSkill.ini b/MY_Toolbox/ui/MY_VisualSkill.ini new file mode 100644 index 000000000..55cd40f91 --- /dev/null +++ b/MY_Toolbox/ui/MY_VisualSkill.ini @@ -0,0 +1,195 @@ +[MY_VisualSkill] +._WndType=WndFrame +._Parent=Normal +Left=400 +Top=400 +Width=231 +Height=53 +DragAreaLeft=0 +DragAreaTop=0 +DragAreaWidth=0 +DragAreaHeight=0 +BreatheWhenHide=0 +ShowWhenHideUI=0 +MousePenetrable=1 +RenderEvent=1 + +[Handle_Total] +._WndType=Handle +._Parent=MY_VisualSkill +Left=0 +Top=0 +PosType=0 +HandleType=0 +FirstItemPosType=0 + +[Handle_Bg] +._WndType=Handle +._Parent=Handle_Total +Left=0 +Top=0 +PosType=0 +HandleType=3 +RowSpacing=0 + +[Image_Bg_10] +._WndType=Image +._Parent=Handle_Bg +PosType=8 +Image=interface\MY\MY_Toolbox\img\MY_VisualSkill.UITex +Alpha=190 +Frame=2 +Width=94 +Height=52 + +[Image_Bg_11] +._WndType=Image +._Parent=Handle_Bg +PosType=8 +Image=interface\MY\MY_Toolbox\img\MY_VisualSkill.UITex +Alpha=190 +Frame=0 +Width=21 +Height=52 + +[Image_Bg_12] +._WndType=Image +._Parent=Handle_Bg +PosType=8 +Image=interface\MY\MY_Toolbox\img\MY_VisualSkill.UITex +Alpha=190 +Frame=1 +Width=75 +Height=52 + +[Handle_Boxes] +._WndType=Handle +._Parent=Handle_Total +Left=95 +Top=0 +PosType=0 +HandleType=0 +Width=55 +Height=53 +FirstItemPosType=0 + +[Handle_Box] +._WndType=Handle +._Parent=Handle_Boxes +PosType=0 +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +Width=53 +Height=53 +UnLoad=1 + +[Image_BoxBg] +._WndType=Image +._Parent=Handle_Box +PosType=0 +Image=ui\image\lootpanel\lootpanel.uitex +Alpha=255 +Frame=13 +Width=40 +Height=40 +Left=4 +Top=7 + +[Box_Skill] +._WndType=Box +._Parent=Handle_Box +Left=4 +Top=7 +PosType=0 +IconID=13 +Width=38 +Height=38 +EventID=277 + +[Image_Box] +._WndType=Image +._Parent=Handle_Box +PosType=0 +Image=ui\Image\UICommon\Skills.UITex +Alpha=255 +Frame=15 +Width=53 +Height=53 +Left=0 +Top=0 +LockShowAndHide=1 + +[Animate_Hit] +._WndType=Animate +._Parent=Handle_Box +Left=-27 +Top=-48 +PosType=0 +Image=ui\Image\UICommon\skills2.UITex +Group=0 +LoopCount=1 +ShowAniOnCreate=0 +Alpha=255 + +[Wnd_CustomMode] +._WndType=WndWindow +._Parent=MY_VisualSkill +Left=0 +Top=0 +Width=0 +Height=0 +Moveable=0 +FollowMove=0,0 +FollowSize=0,0 +DummyWnd=0 +LockShowAndHide=1 + +[Handle_CustomMode] +._WndType=Handle +._Parent=Wnd_CustomMode +HandleType=0 +FirstItemPosType=0 +Left=0 +Top=0 +PosType=0 +EventID=256 + +[Image_CMNormal] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=158 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Image_CMOver] +._WndType=Image +._Parent=Handle_CustomMode +Image=ui\Image\Minimap\Minimap.UITex +Frame=157 +Alpha=255 +Left=0 +Top=0 +PosType=0 +ImageType=10 +LockShowAndHide=1 + +[Text_CMName] +._WndType=Text +._Parent=Handle_CustomMode +RowSpacing=0 +FontSpacing=0 +Alpha=255 +Left=0 +Top=0 +PosType=0 +HAlign=1 +VAlign=1 +FontScheme=16 + diff --git a/README.md b/README.md index da8d73237..75ce2c7fb 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,65 @@ -# 璇存槑 +# 鑼椾紛鎻掍欢闆 -璇ラ」鐩负鎻掍欢鑴氭墜鏋堕」鐩紝鍙揩閫熷惎鍔ㄦ柊鐨勬彃浠堕泦锛屼互鍙婄淮鎶ゅ熀纭鍏叡浠g爜銆 +> 杩欐槸鍦ㄥ浗浜уぇ鍨3D缃戞父銆婂墤缃3銆嬩腑浣跨敤鐨勮緟鍔╂彃浠讹紝閬靛惊绠鍗曞疄鐢ㄥ師鍒欙紝渚ч噸浜 PVE 骞朵笖鍏ㄩ儴寮婧愬厤璐广 +[![Build Status](https://app.travis-ci.com/tinymins/MY.svg?token=yQdYwdSeW1cRn46LTYo4&branch=master)](https://app.travis-ci.com/github/tinymins/MY) + +## 鎹愬姪 + + + +![Donate](https://cdn.jsdelivr.net/gh/tinymins/donate@master/combine.jpg) + +## 閾炬帴 + +* [绉戜妇鍔╂墜 - 鍋氭渶鍏ㄦ渶鍑嗙‘鐨勫墤涓夌涓炬煡璇㈠埄鍣╙(https://j3cx.com/exam/) +* [濂囬亣鏌ヨ - 鍏虫敞鎮ㄨ韩杈规鍦ㄥ彂鐢熺殑涓鍒囧閬囦簨浠禲(https://j3cx.com/serendipity/) +* [寮鏈嶈褰 - 鏌ヨ鍚勬湇鍔″櫒缁存姢瀹屾垚寮鏈嶆椂闂碷(https://j3cx.com/onlinetime/) +* [瑙掕壊瀛楀簱 - 瀹屾暣鍙敤鐨勮鑹插悕瀛楀簱](https://j3cx.com/char.txt) + +## 涓嬭浇 + +* 瀹夎鏂规硶锛氬湪瑙掕壊鐧婚檰椤碉紝渚濇鐐瑰嚮`鎻掍欢绠$悊`,`鎻掍欢涓嬭浇`锛岀劧鍚庣偣鍑籤涓嬭浇`鎸夐挳涓嬭浇鍚勭粍浠躲 +* 瀹樻柟缃戠珯锛 +* 鏇存柊鏃ュ織锛 +* 寤鸿&BUG鎶ュ憡锛歔闂鍙嶉](https://zhaiyiming.com/feedback) [銆愪竴鍚嶅畢銆傘慮(https://zhaiyiming.com/archives/jx3-my.html) [銆愬井鍗氱暀瑷銆慮(https://weibo.com/zymah) + +## 涓昏鍔熻兘 + +* 鑱婂ぉ杈呭姪锛氬揩閫熷垏鎹㈤閬撳拰鎵╁睍鏄剧ず缁勯槦鑱婂ぉ娉℃场銆 +* 鍠婅瘽杈呭姪锛氬悓鏃跺湪澶氫釜棰戦亾鍠婅瘽锛岃皟渚冮槦鍙嬨 +* 鑱婂ぉ鐩戞帶锛氱洃鎺ф寚瀹氳鍒欐寚瀹氶閬撶殑鑱婂ぉ缁撴灉銆 +* 鑱屼笟鏌撹壊锛氳亰澶╂爮鐜╁鑱屼笟鏌撹壊鍜屽熀鏈俊鎭樉绀恒 +* 鐐规暟鐩戞帶锛氬绉嶆柟寮忕粺璁$帺瀹禦OLL鐐规暟鎹 +* 鎴浘鍔╂墜锛氭彁渚涘绉嶆牸寮忓拰鍘嬬缉鐜囩殑鎴浘宸ュ叿銆 +* 鎵佸钩琛鏉★細绠娲佹槑浜嗙殑澶撮《琛鏉★紝鏀寔璇绘潯鏄剧ず銆 +* 甯哥敤宸ュ叿锛氱郴缁熶俊鎭潯锛屾妧鑳藉彲瑙嗗寲锛屽叡鎴樻鏌ワ紝浠撳簱鑳屽寘鎼滅储绛夊姛鑳姐 +* 蹇熺櫥鍑猴細蹇熻繑鍥炵櫥闄嗛〉锛岃劚鎴樺悗绉掗绛夊姛鑳姐 + +## wiki & 鏂囨。 + +* [濡備綍鍒犻櫎涓嶅繀瑕佺殑鍔熻兘妯″潡](https://github.com/tinymins/JX3MY/wiki/%E5%88%A0%E9%99%A4%E6%8C%87%E5%AE%9A%E7%9A%84%E5%8A%9F%E8%83%BD%E6%A8%A1%E5%9D%97) +* [鏇村](https://github.com/tinymins/JX3MY/wiki/_pages) + +## 瀹夎&浣跨敤 + +* 瑙e帇涓嬭浇鐨 `zip` 鍒 _JX3娓告垙鐩綍_ 涓嬬殑 `bin/zhcn/interface` 鐩綍 +* 灏忛鍙湪鎻掍欢绠$悊鐣岄潰鐪嬪埌榛樿鎵撳嬀鐨勨滆寳浼婃彃浠堕泦鈥濓紝淇濇寔鎵撳嬀杩涘叆娓告垙 +* 杩涘叆娓告垙鍚庡湪鐜╁澶村儚鑿滃崟鎴栧伐鍏风鑿滃崟鍙互鐪嬪埌鑼椾紛鎻掍欢闆嗙殑閫夐」锛岀偣鍑诲彲浠ュ仛鎻掍欢璁剧疆 +* ESC 杩涘叆蹇嵎閿缃紝鏈変竴涓垎缁勨滆寳浼婃彃浠堕泦鈥濓紝鍙缁嗚缃浉鍏冲揩鎹烽敭 + +## 鍏跺畠 + +* 鏈彃浠跺紑婧愬厤璐癸紝鏈汉鍑轰簬鍏磋叮鍜屾湅鍙嬮渶姹傚埗浣滐紝浣滆呭井鍗 [@鑼椾紛](http://weibo.com/zymah)銆乕闂鍙嶉](https://zhaiyiming.com/feedback)銆 +* 鏈彃浠堕伒寰畝鍗曞疄鐢ㄥ師鍒欙紝瀹屽叏閬靛畧鐧藉悕鍗旳PI锛屾敹闆嗛儴鍒嗙帺瀹惰鑹插叕寮淇℃伅濡傜帺瀹禝D锛岃鑹蹭綋鍨嬶紝甯細鍚嶇О锛岃澶囧垎鏁扮瓑鍏紑闈炴晱鎰熶俊鎭仛鐜╁鍋忓ソ鏁版嵁缁熻銆 +* 瀹夎浣跨敤瑙嗕负 _鍚屾剰浠ヤ笂鍐呭_ 銆 ## 缁存姢 ### 鏂伴棬娲 -* 鍥㈤槦闈㈡澘蹇冩硶绠鍖栨枃瀛 `Boilerplate_!Base\lang\lib\zhcn.jx3dat` `KUNGFU_TYPE_LABEL_ABBR` -* 鍏ㄥ眬闂ㄦ淳閰嶈壊 `Boilerplate_!Base\src\lib\Constant.lua` `FORCE_BACKGROUND_COLOR` `FORCE_FOREGROUND_COLOR` -* 鍏ㄥ眬闂ㄦ淳蹇冩硶鏋氫妇 `Boilerplate_!Base\src\lib\Constant.lua` `FORCE_TYPE` `KUNGFU_TYPE` `KUNGFU_LIST` +* 鍥㈤槦闈㈡澘蹇冩硶绠鍖栨枃瀛 `MY_!Base\lang\lib\zhcn.jx3dat` `KUNGFU_TYPE_LABEL_ABBR` +* 鍏ㄥ眬闂ㄦ淳閰嶈壊 `MY_!Base\src\lib\Constant.lua` `FORCE_BACKGROUND_COLOR` `FORCE_FOREGROUND_COLOR` +* 鍏ㄥ眬闂ㄦ淳蹇冩硶鏋氫妇 `MY_!Base\src\lib\Constant.lua` `FORCE_TYPE` `KUNGFU_TYPE` `KUNGFU_LIST` ## 绗笁鏂逛緷璧栦笌璁稿彲璇 diff --git a/package.ini b/package.ini index ed3c32c9b..65d2f9297 100644 --- a/package.ini +++ b/package.ini @@ -1,3 +1,3 @@ [Package] -name=Boilerplate插件集 -desc=侧重于 Boilerplate 的实用插件集 +name=茗伊插件集 +desc=侧重于 PVE 的实用插件集 diff --git a/package.ini.zh_TW b/package.ini.zh_TW index f81966910..addaaee38 100644 --- a/package.ini.zh_TW +++ b/package.ini.zh_TW @@ -1,3 +1,3 @@ [Package] -name=Boilerplate鎻掍欢闆 -desc=鍋撮噸鏂 Boilerplate 鐨勫鐢ㄦ彃浠堕泦 +name=鑼椾紛鎻掍欢闆 +desc=鍋撮噸鏂 PVE 鐨勫鐢ㄦ彃浠堕泦