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);


})();