ffLogs

显示gcd和能力技间隔是否正常

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name ffLogs
// @version 1.0
// @description 显示gcd和能力技间隔是否正常
// @match https://*.fflogs.com/reports/*
// @namespace 
// ==/UserScript==
(function() {
   var showSkillGap = function(){
       if(!(/type=casts/.test(location.href) && /view=events/.test(location.href) &&  /source=/.test(location.href) && !/hostility=1/.test(location.href))) return;
       let table = document.getElementsByClassName("summary-table events-table events-grid-view dataTable no-footer dtr-inline")[0];
       if(!table) return;
       let head = table.tHead.rows[0];
       if(head.cells.length != 5) return;
       let cell0 = head.cells[0];
       let cell1 = head.insertCell(1);
       cell1.outerHTML = cell0.outerHTML;
       //cell1.innerHTML = cell0.innerHTML;

       let body = table.tBodies[0];

       let casts = [];
       for(var  i = 0; i < body.rows.length; i++){
           let row = body.rows[i];
           //if(row.cells[2].innerText.indexOf("Canceled") != -1) {continue};//断读条的跳过

           casts[i] = {'time' : time2Ms(row.cells[0].innerHTML),
                       'gcd' : !row.cells[2].classList.contains('indented-cell'),
                       'beginCast' : row.cells[1].innerHTML == "起始施法" || row.cells[1].innerHTML == "Begin Cast",
                       'gcdTime' : 0
                       //,'interrupt' : row.cells[2].innerText.indexOf("Canceled") != -1
                      };
           if(casts[i].beginCast == true){
               casts[i].gcdTime = parseFloat(row.cells[2].querySelector(".event-minor-details").innerText)*1000 + 100 -50;//100是读条税,-50是波动容错
           }

           let newCell = row.insertCell(1);
           let result = getCastGap(casts,i);

           newCell.outerHTML = `<td class="main-table-number" style="${result.showTip?"color:red":""}" tabindex="0">${result.gap}</td>`;

       }
    }

   function getCastGap(casts,i){
       let thisCast = casts[i];
       for(var last = i -1 ; last >=0; last--){
           if(thisCast.gcd == true){
               if(casts[last].gcd == true){
                   if(casts[last].beginCast == false && last -1 >= 0 && casts[last -1].beginCast == true){
                       let gap = thisCast.time - casts[last-1].time; //上一个是读条技能以开始读条时间为gcd开始时间
                       let showTip = gap < casts[last-1].gcdTime; //判断gcd时间是否正常
                       if(showTip){
                           return {"gap":gap,"showTip":true};
                       }else{
                           return {"gap":gap,"showTip":false};
                       }
                   }else{//该技能GCD,上一个瞬发gcd
                       return {"gap":thisCast.time - casts[last].time,"showTip":false};
                   }
               }
           }else{//该技能能力技
               return {"gap":thisCast.time - casts[last].time,"showTip":thisCast.time - casts[last].time < 560};//判断能力技间隔
           }
       }
       return {"gap":0,"showTip":false};
   }

   function time2Ms(time){
       let minus = 1;
       if(time.length == 10 && time.startsWith("-")){
           time = time.substring(1);
           minus = -1;
       }
       if(time.length != 9) return;
       return minus*(parseInt(time.substring(0,2))*60*1000 + parseInt(time.substring(3,5))*1000 + parseInt(time.substring(6,9)));
   }

    setInterval(showSkillGap,500);


})();