Greasy Fork is available in English.

【雀魂】最近大铳

最近大铳插件,让最近大和区域显示最近大铳

// ==UserScript==
// @name         【雀魂】最近大铳
// @namespace    https://paulzzh.tech/
// @supportURL   https://github.com/paulzzh/Majsoul-Chong
// @version      2.2.0
// @description  最近大铳插件,让最近大和区域显示最近大铳
// @author       Paulzzh
// @license      MIT
// @match        *://majsoul.com/1/
// @match        *://www.majsoul.com/1/
// @match        *://game.maj-soul.com/1/
// @match        *://game.mahjongsoul.com/*
// @match        *://mahjongsoul.game.yo-star.com/
// @grant        none
// @icon         https://img.paulzzh.com/other/majsoul/zjdc.png
// ==/UserScript==

(function() {
    'use strict';
    window.paulzzh_plugin_zjdc = {};
    paulzzh_plugin_zjdc.enable = true; //插件效果总开关
    
    //==================================
    //
    //        最近大铳 插件配置
    //
    //大铳大和切换延迟(毫秒)
    paulzzh_plugin_zjdc.display_showtime = 3000;
    
    //插件注入成功后是否展示提示框
    paulzzh_plugin_zjdc.show_welcome = true;
    
    //是否展示最近大铳最近大和
    paulzzh_plugin_zjdc.show_zjdc = true;
    
    //是否上报对局牌谱
    paulzzh_plugin_zjdc.push_record = true;
    
    
    
    
    //以下内容请不要修改
    paulzzh_plugin_zjdc.version = "2.2.0";
    paulzzh_plugin_zjdc.readme = "【最近大铳】插件 权限申请\n版本:"+paulzzh_plugin_zjdc.version+"\n\n本插件会收集您和他人的account_id,昵称,对局日期,和(铳)牌信息等信息。\n会储存您和他人的account_id,和(铳)牌信息等信息。\n为了实现插件的基础功能,这些数据是必须的。\n他们会被上传到第三方服务器 "+paulzzh_plugin_zjdc.server+"\n本插件与雀魂官方无任何联系,放铳数据均来自安装此插件的用户主动上传。\n\n温馨提示:第一次使用没有放铳数据是无法显示的,建议您先铳个大的再在个人信息页查看~\n演示视频:av65372237(b站)\n开源地址:https://github.com/paulzzh/Majsoul-Chong\n\n此提示只会显示一次,确定后将不再提示。\n\n\n2.0.0更新:全新2.0.0版本发布,兼容国服日服美服,兼容铜/银/金/玉/王座/友人/比赛/休闲普通/宝牌狂热/明牌配牌/龙之目玉等三麻/四麻/活动场,其中除金玉王比赛之外的房间依靠用户上报/好友推送"
    //最近大铳 数据交换服务器   一般情况下不需要修改。
    //为了确认用户身份,会收集您和他人的account_id,昵称,对局日期,和(铳)牌信息等信息;会储存您和他人的account_id,和(铳)牌信息等信息。
    paulzzh_plugin_zjdc.server = "https://majsoul.paulzzh.com/api/v2/zjdc?version="+paulzzh_plugin_zjdc.version;
    //==================================
    
    
    //切换大铳大和
    paulzzh_plugin_zjdc.display = function() {
        var vui=paulzzh_plugin_zjdc.display_vui;
        var datas = paulzzh_plugin_zjdc.display_data;
        var data=datas[paulzzh_plugin_zjdc.display_which%datas.length];
        vui.me.getChildAt(0).getChildAt(0).text = data.text;
        vui.me.getChildAt(0).getChildAt(0).color = data.color;
        vui.me.getChildAt(0).getChildAt(0).font = data.font;
        vui._showDaHe(data.data.hands, data.data.ming, data.data.hupai);
        vui._setTitle(data.data.title_id);
        paulzzh_plugin_zjdc.display_which +=1;
    };
    paulzzh_plugin_zjdc.display_inv = [];
    
    paulzzh_plugin_zjdc.display_clear = function(vui){
        vui.me.getChildAt(0).getChildAt(0).text = "最近大和";
        vui.me.getChildAt(0).getChildAt(0).color = "#e8af71";
        vui.me.getChildAt(0).getChildAt(0).font = "fengyu";
        var l=paulzzh_plugin_zjdc.display_inv.length;
        for(var i=0; i<l ; i++){
            clearInterval(paulzzh_plugin_zjdc.display_inv.shift());
        }
        paulzzh_plugin_zjdc.display_which = 0;
    }
    
    //网络请求,铳牌获取
    paulzzh_plugin_zjdc.query = function(vui,account_id,which,t) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200 && account_id==paulzzh_plugin_zjdc.account_id && which==paulzzh_plugin_zjdc.which) {
                try {
                    paulzzh_plugin_zjdc.display_clear(vui);
                    var ret = JSON.parse(xhr.responseText);
                    if (ret.code == 200) {
                        var data = []
                        if (ret.data_c){
                            data.push({"text":"最近大铳","color":"#ff4e4e","font":"fengyu","data":ret.data_c});
                        };
                        if (ret.data_z){
                            //雀魂fengyu字体没有"炸"这个字。。没办法只能换字体
                            data.push({"text":"最近炸庄","color":"#c1c630","font":"SimHei","data":ret.data_z});
                        };
                        if (t.statistic_data){
                            for (var a = 0; a < t.statistic_data.length; a++) {
                                var r = t.statistic_data[a];
                                if (which==String(r.mahjong_category)+String(r.game_category)){
                                    data.push({"text":"最近大和","color":"#e8af71","font":"fengyu","data":r.statistic.highest_hu});
                                    break
                                }
                            }
                        };
                        paulzzh_plugin_zjdc.display_data=data;
                        paulzzh_plugin_zjdc.display_vui=vui;
                        paulzzh_plugin_zjdc.display_inv.push(setInterval(paulzzh_plugin_zjdc.display,paulzzh_plugin_zjdc.display_showtime));
                    }
                } catch(error) {
                    console.log("[最近大铳]" + error.message)
                }
            }
        };
        xhr.open("post", paulzzh_plugin_zjdc.server, true);
        xhr.setRequestHeader("Content-Type", "application/json");
        var tosend={"action":"query","self_id":GameMgr.Inst.account_id,"target_id":account_id,"type":which};
        console.log(tosend);
        xhr.send(JSON.stringify(tosend));
    };
    
    //网络请求,对局记录
    paulzzh_plugin_zjdc.push = function(uuid) {
        if (paulzzh_plugin_zjdc.enable && GameMgr.Inst.ingame && uuid.length==43){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var ret = JSON.parse(xhr.responseText);
                    console.log(ret.message)
                }
            };
            xhr.open("post", paulzzh_plugin_zjdc.server, true);
            xhr.setRequestHeader("Content-Type", "application/json");
            var tosend={"action":"push","self_id":GameMgr.Inst.account_id,"uuid":uuid,"area":GameMgr.client_language};
            console.log(tosend);
            xhr.send(JSON.stringify(tosend));
        }
    };
    
    //对于雀魂的hack
    paulzzh_plugin_zjdc.hook = function() {
        try {
            //需要注入的东西,要在游戏加载完后修改
            if (uiscript.UI_PlayerInfo.Inst && uiscript.UI_OtherPlayerInfo.Inst && uiscript.UI_PlayerInfo.Inst.show && uiscript.UI_OtherPlayerInfo.Inst.show && uiscript.UI_PlayerInfo.Inst.detail_data.blocks[1].show && uiscript.UI_OtherPlayerInfo.Inst.detail_data.blocks[1].show && game.Scene_MJ.Inst.GameEnd) {
                console.log("[最近大铳]游戏已登录");
                try {
                    //自己详情页
                    paulzzh_plugin_zjdc.funcpds = uiscript.UI_PlayerInfo.Inst.detail_data.blocks[1].show;
                    uiscript.UI_PlayerInfo.Inst.detail_data.blocks[1].show = function(t, e, n, a) {
                        
                        var w = String(e)+String(n);
                        var vui = uiscript.UI_PlayerInfo.Inst.detail_data.blocks[1];
                        var account_id = GameMgr.Inst.account_id;
                        
                        paulzzh_plugin_zjdc.display_clear(vui);
                        
                        //xhr异步问题,为了验证一下选项卡是否更改
                        paulzzh_plugin_zjdc.which=w;
                        paulzzh_plugin_zjdc.account_id=account_id;
                        
                        if(paulzzh_plugin_zjdc.enable && paulzzh_plugin_zjdc.show_zjdc && a==1){
                            paulzzh_plugin_zjdc.query(vui,account_id,w,t);
                        }
                        paulzzh_plugin_zjdc.funcpds.apply(this, [t, e, n, a])
                    };
                    //别人详情页
                    paulzzh_plugin_zjdc.funcopds = uiscript.UI_OtherPlayerInfo.Inst.detail_data.blocks[1].show;
                    uiscript.UI_OtherPlayerInfo.Inst.detail_data.blocks[1].show = function(t, e, n, a) {
                        
                        var w = String(e)+String(n);
                        var vui = uiscript.UI_OtherPlayerInfo.Inst.detail_data.blocks[1];
                        var account_id = uiscript.UI_OtherPlayerInfo.Inst.account_id;
                        
                        paulzzh_plugin_zjdc.display_clear(vui);
                        
                        //xhr异步问题,为了验证一下选项卡是否更改
                        paulzzh_plugin_zjdc.which=w;
                        paulzzh_plugin_zjdc.account_id=account_id;
                        
                        if(paulzzh_plugin_zjdc.enable && paulzzh_plugin_zjdc.show_zjdc && a==1){
                            paulzzh_plugin_zjdc.query(vui,account_id,w,t);
                        }
                        paulzzh_plugin_zjdc.funcopds.apply(this, [t, e, n, a])
                    };
                    //对局结束了
                    paulzzh_plugin_zjdc.GameEnd = game.Scene_MJ.Inst.GameEnd;
                    game.Scene_MJ.Inst.GameEnd = function() {
                        if(paulzzh_plugin_zjdc.enable && paulzzh_plugin_zjdc.push_record){
                            paulzzh_plugin_zjdc.push(GameMgr.Inst.mj_game_uuid);
                        }
                        paulzzh_plugin_zjdc.GameEnd.apply(this)
                    };
                    clearInterval(paulzzh_plugin_zjdc.inv);
                    console.log("[最近大铳]插件已成功注入!");
                    if(paulzzh_plugin_zjdc.enable && paulzzh_plugin_zjdc.show_welcome){
                        uiscript.UI_LightTips.Inst.show("【最近大铳】插件 已成功注入!");
                    }
                    if(localStorage.getItem("paulzzh_plugin_zjdc_xieyi") != paulzzh_plugin_zjdc.version){
                    uiscript.UI_InfoLite.Inst.show(paulzzh_plugin_zjdc.readme);
                    localStorage.setItem("paulzzh_plugin_zjdc_xieyi",paulzzh_plugin_zjdc.version);
                    }
                } catch(error) {
                    console.log("[最近大铳]插件注入失败" + error.message)
                }
            } else {
                console.log("[最近大铳]游戏未加载完毕")
            }
        } catch(error) {
            console.log("[最近大铳]插件注入失败" + error.message)
        }
    };
    
    //检测雀魂加载状态
    paulzzh_plugin_zjdc.inv = setInterval(paulzzh_plugin_zjdc.hook,3000)
})();