van.mz.playerAdvanced (skill coloring, H1/L2 stars, radar, 2D, scout, XML) revived for current MZ + mzcopilot match-page player values & team total
// ==UserScript== // @name mzcopilot // @namespace mzcopilot // @version 4.28.2-mzc12 // @license MIT // @description van.mz.playerAdvanced (skill coloring, H1/L2 stars, radar, 2D, scout, XML) revived for current MZ + mzcopilot match-page player values & team total // @author van + mzcopilot // @match https://www.managerzone.com/* // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_setClipboard // @grant GM_xmlhttpRequest // @connect www.x2x.fun // @connect sgj.x2x.fun // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/pako.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/dexie.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/js/md5.min.js // @require https://unpkg.com/vple/base64js.min.js // @require https://unpkg.com/vple/vple.min.js // @require https://unpkg.com/vple/echarts.min.js // (No @updateURL/@downloadURL on purpose — this is our own fork; van's update URL // would clobber it back to the broken dead-CDN version. Add our own host URL here // later if we want auto-update.) // ==/UserScript== var vanGmMzModel = { language: { zh: { Name: "中文", GetPlayersHtml: "获取球员页面HTML", GetPlayersHtml2: "获取球员页面HTML(不用缓存)", Clear: "清空缓存", Save: "保存", Setting: "设置", Test: "测试", SettingTitle: "点击可对语言和XML导出进行设置", Language: "语言", XmlMode: "战术导出模式", XmlMode1: "顺序选择球员", XmlMode2: "根据位置选择球员(需提交数据到后台)", TacConf: "位置系数设置", AutoRun: "自动着色", AutoRun0: "仅打开页面时自动执行一次", AutoRun1: "随系统刷新自动着色(如果浏览器变卡请关闭此选项)", Pay: "如果你觉得好用,可通过打赏支持作者。", NotSureEx: "挂牌后属性可能有变动,不确定转会市场显示是否是真实属性,请自行甄别。<br/>属性变动时间", NotSure: "属性不确定", ManualColorTitle: "点击可手动着色 快捷键:ALT + A", ManualColor: "手动着色", Jijing: "比赛集锦", dongzuo: "球员动作", Copyxml1: "复制主队战术", Copyxml2: "复制客队战术", CopyXml: "数据已复制到剪切板", CopyXmlMsg: "战术已复制到剪切板", CopyXmlMsgError: "战术复制失败", BA_NORMAL: "BA_NORMAL", BA_WALL: "站人墙", BA_HOLD: "抱着球", BA_DOWN: "倒地", BA_HOLD_THROWIN: "界外球准备", BA_THROWIN: "界外球", BA_LEFT_FOOT_SHOT_FWD: "射门/长传(L)", BA_LEFT_FOOT_SHOT_BACK: "BA_LEFT_FOOT_SHOT_BACK", BA_LEFT_FOOT_SHOT_RIGHT: "BA_LEFT_FOOT_SHOT_RIGHT", BA_LEFT_FOOT_SHOT_LEFT: "BA_LEFT_FOOT_SHOT_LEFT", BA_RIGHT_FOOT_SHOT_FWD: "射门/长传(R)", BA_RIGHT_FOOT_SHOT_BACK: "BA_RIGHT_FOOT_SHOT_BACK", BA_RIGHT_FOOT_SHOT_RIGHT: "BA_RIGHT_FOOT_SHOT_RIGHT", BA_RIGHT_FOOT_SHOT_LEFT: "BA_RIGHT_FOOT_SHOT_LEFT", BA_LEFT_FOOT_PASS_FWD: "短传(L)", BA_LEFT_FOOT_PASS_BACK: "BA_LEFT_FOOT_PASS_BACK", BA_LEFT_FOOT_PASS_RIGHT: "BA_LEFT_FOOT_PASS_RIGHT", BA_LEFT_FOOT_PASS_LEFT: "BA_LEFT_FOOT_PASS_LEFT", BA_RIGHT_FOOT_PASS_FWD: "短传(R)", BA_RIGHT_FOOT_PASS_BACK: "BA_RIGHT_FOOT_PASS_BACK", BA_RIGHT_FOOT_PASS_RIGHT: "BA_RIGHT_FOOT_PASS_RIGHT", BA_RIGHT_FOOT_PASS_LEFT: "BA_RIGHT_FOOT_PASS_LEFT", BA_PICK_UP_BALL: "捡起球", BA_DROP_BALL: "放下球", BA_HEADER: "争顶", BA_TRIP: "丢失球权", BA_CELEBRATE: "庆祝进球", BA_GK_READY: "准备扑救", BA_GK_ACRO_LEFT: "ACRO(L)", BA_GK_ACRO_LEFT_HOLD: "ACRO_HOLD(L)", BA_GK_ACRO_RIGHT: "ACRO(R)", BA_GK_ACRO_RIGHT_HOLD: "ACRO_HOLD(R)", BA_GK_SIDESTEP_LEFT: "移动(L)", BA_GK_SIDESTEP_RIGHT: "移动(R)", BA_GK_KICK: "BA_GK_KICK", BA_GK_THROW_BALL: "BA_GK_THROW_BALL", BA_GK_STRETCH_LEFT: "BA_GK_STRETCH_LEFT", BA_GK_STRETCH_LEFT_HOLD: "BA_GK_STRETCH_LEFT_HOLD", BA_GK_STRETCH_RIGHT: "BA_GK_STRETCH_RIGHT", BA_GK_STRETCH_RIGHT_HOLD: "BA_GK_STRETCH_RIGHT_HOLD", BA_BALL_OWNER: "控球", BA_TACKLE: "上抢", BA_SLIDING_TACKLE: "BA_SLIDING_TACKLE", BA_SLIDING_TACKLE_STAND: "BA_SLIDING_TACKLE_STAND", BA_MAX: "BA_MAX", BA_MY_1001: "头球攻门(L)", BA_MY_1002: "头球攻门(R)", BA_MY_1003: "卸下球", BA_MY_1011: "上抢(成功)", BA_MY_1012: "上抢(失败)", Unknown: "未知" , training_pos: "无教练", training_camp: "进营", training_coach: "有教练", training_ycc: "调整", training_itc: "强化", training_neg: "掉球", training_unit: "格", training_unknown: "未知训练类型", training_ball_day: "离下一次涨球训练天数", training_part: "分段训练效率", training_total: "进度", training_avg: "平均", training_now: "当前训练进度", SkillsAnalysisTitle: "点击可手动着色和分析训练效率 快捷键:ALT + S", SkillsAnalysis: "训练效率分析" , sug_T0: "首选:", sug_T1: "次选:", sug_T2: "可尝试:", sug_T3: "默认:", Pos9: "后卫", Pos7: "门将", Pos10: "边锋", Pos5: "前锋", Pos4: "中场", Pos56: "中锋", Pos21: "后腰", Pos22: "边卫", Pos23: "前腰", PosScores: "位置评分", Scores: "评分", sug_Loser: "关键属性容易早死,尽早交换或开除。", sug_PRI: "训练顺序:", attrName1: "速度", attrName2: "耐力", attrName3: "意识", attrName4: "传球", attrName5: "射门", attrName6: "头球", attrName7: "守门", attrName8: "控球", attrName9: "抢断", attrName10: "传中", attrName11: "定位" , scoutReport: "球探报告" , now: "当前", future: "可达", max: "最大可能" } , en: { Name: "English", GetPlayersHtml: "Get players page", GetPlayersHtml2: "Get players page(No cache)", Clear: "Clear Cache", Save: "Save", Setting: "Setting", Test: "Test", SettingTitle: "Click setting language", Language: "Language", XmlMode: "Tactical Export Model", XmlMode1: "Sequential selection", XmlMode2: "Choose by location(need submit data to server)", TacConf: "Tactical Coefficient Setting", AutoRun: "Auto Colorable", AutoRun0: "By page loaded(Once)", AutoRun1: "By MZ Refresh", Pay: "Support the author.", NotSureEx: "Skills may change after entering the transfer market.<br/>Change time ", NotSure: "Uncertain skill", ManualColorTitle: "Click the Colorable Skill. Shortcut key : ALT + A", ManualColor: "Colorable Skill", Jijing: "Events", dongzuo: "PlayerStatus", Copyxml1: "CopyXML(home)", Copyxml2: "CopyXML(away)", CopyXml: "The data has been copied to the clipboard!", CopyXmlMsg: "The tactic was copied to the Clipboard!", CopyXmlMsgError: "Copy error!", BA_NORMAL: "Normal", BA_WALL: "Wall", BA_HOLD: "Hold", BA_DOWN: "Down", BA_HOLD_THROWIN: "HoldThrowin", BA_THROWIN: "Throwin", BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)", BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)", BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)", BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)", BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)", BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)", BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)", BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)", BA_LEFT_FOOT_PASS_FWD: "FootPass(L)", BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)", BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)", BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)", BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)", BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)", BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)", BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)", BA_PICK_UP_BALL: "PickUpBall", BA_DROP_BALL: "DropBall", BA_HEADER: "Header", BA_TRIP: "Trip", BA_CELEBRATE: "Celebrate", BA_GK_READY: "GkReady", BA_GK_ACRO_LEFT: "GkAcroLeft", BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold", BA_GK_ACRO_RIGHT: "GkAcroRight", BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold", BA_GK_SIDESTEP_LEFT: "GkSidestepLeft", BA_GK_SIDESTEP_RIGHT: "GkSidestepRight", BA_GK_KICK: "GkKick", BA_GK_THROW_BALL: "GkThrowBall", BA_GK_STRETCH_LEFT: "GkStretchLeft", BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold", BA_GK_STRETCH_RIGHT: "GkStretchRight", BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold", BA_BALL_OWNER: "BallOwner", BA_TACKLE: "Tackle", BA_SLIDING_TACKLE: "SlidingTackle", BA_SLIDING_TACKLE_STAND: "SlidingTackleStand", BA_MAX: "Max", BA_MY_1001: "HeadGoal(L)", BA_MY_1002: "HeadGoal(R)", BA_MY_1003: "StopTheBall", BA_MY_1011: "Tackle(Success)", BA_MY_1012: "Tackle(Fail)", Unknown: "Unknown" , training_pos: "No coach", training_camp: "CAMP", training_coach: "Coach", training_ycc: "Ycc", training_itc: "Itc", training_neg: "Neg", training_unit: "↑", training_unknown: "Unknown training", training_ball_day: "Next ball days", training_part: "Training efficiency", training_total: "Total", training_avg: "Avg", training_now: "Now", SkillsAnalysisTitle: "Colorable Skill and Analysis of Training Efficiency Shortcut key :ALT + S", SkillsAnalysis: "Colorable By Graphs" , sug_T0: "First plan:", sug_T1: "Second plan:", sug_T2: "May try:", sug_T3: "Default:", Pos9: "CB", Pos7: "GK", Pos10: "WF", Pos5: "ST", Pos4: "MF", Pos56: "CF", Pos21: "DM", Pos22: "WB", Pos23: "AMF", PosScores: "Tactics score", Scores: "Scores", sug_Loser: "Key skills too low.Exchange or dismiss as soon as possible.", sug_PRI: "Training order:", attrName1: "Speed", attrName2: "Stamina", attrName3: "Play Intelligence", attrName4: "Passing", attrName5: "Shooting", attrName6: "Heading", attrName7: "Keeping", attrName8: "Ball Control", attrName9: "Tackling", attrName10: "Aerial Passing", attrName11: "Set Plays" , scoutReport: "Scout Report", now: "now", future: "attainable", max: "max" } , es: { Name: "Español", GetPlayersHtml: "Página de jugadores", GetPlayersHtml2: "Página de jugadores(sin caché)", Clear: "Vaciar el caché", Save: "Guardar", Setting: "Ajustes", Test: "Test", SettingTitle: "Haga clic en configuración Idioma", Language: "Idioma", XmlMode: "Tactical Export Model", XmlMode1: "Secuencia de selección", XmlMode2: "Elegir por locación (necesita suministrar datos al servidor)", TacConf: "Tactical Coefficient Setting", AutoRun: "Auto Coloreable", AutoRun0: "Por página cargada (sólo una vez)", AutoRun1: "Por recargar MZ", Pay: "Apoya al autor.", NotSureEx: "Las skills pueden cambiar después de ingresar al mercado. <br/> Cambiar hora ", NotSure: "Skill incierta", ManualColorTitle: "Haga clic en la skill para colorear. Acceso directo: ALT + A", ManualColor: "Color de la skill", Jijing: "Eventos", dongzuo: "PlayerStatus", Copyxml1: "CopiarXML(local)", Copyxml2: "CopiarXML(visitante)", CopyXml: "Los datos se han copiado al portapapeles", CopyXmlMsg: "La táctica fue copiada al portapapeles", CopyXmlMsgError: "¡Error al copiar!", BA_NORMAL: "Normal", BA_WALL: "Wall", BA_HOLD: "Hold", BA_DOWN: "Down", BA_HOLD_THROWIN: "HoldThrowin", BA_THROWIN: "Throwin", BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)", BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)", BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)", BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)", BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)", BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)", BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)", BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)", BA_LEFT_FOOT_PASS_FWD: "FootPass(L)", BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)", BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)", BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)", BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)", BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)", BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)", BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)", BA_PICK_UP_BALL: "Toma la pelota", BA_DROP_BALL: "Tira la pelota al césped", BA_HEADER: "Cabezazo", BA_TRIP: "Trip", BA_CELEBRATE: "Celebración", BA_GK_READY: "Arquero preparado", BA_GK_ACRO_LEFT: "GkAcroLeft", BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold", BA_GK_ACRO_RIGHT: "GkAcroRight", BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold", BA_GK_SIDESTEP_LEFT: "Arquero da un paso a la izquierda", BA_GK_SIDESTEP_RIGHT: "Arquero da un paso a la derecha", BA_GK_KICK: "Arquero da una patada", BA_GK_THROW_BALL: "GkThrowBall", BA_GK_STRETCH_LEFT: "GkStretchLeft", BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold", BA_GK_STRETCH_RIGHT: "GkStretchRight", BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold", BA_BALL_OWNER: "Con la pelota en los pies", BA_TACKLE: "Entrada", BA_SLIDING_TACKLE: "Barrida", BA_SLIDING_TACKLE_STAND: "SlidingTackleStand", BA_MAX: "Max", BA_MY_1001: "HeadGoal(L)", BA_MY_1002: "HeadGoal(R)", BA_MY_1003: "Frena la pelota", BA_MY_1011: "Entrada(acertada)", BA_MY_1012: "Entrada(fallida)", Unknown: "Desconocido" , training_pos: "Sin entrenador", training_camp: "CAMP", training_coach: "Coach", training_ycc: "YCC", training_itc: "ITC", training_neg: "Neg", training_unit: "↑", training_unknown: "Entrenamiento desconocido", training_ball_day: "Días para ganar una pelotita", training_part: "Eficacia de entrenamiento", training_total: "Total", training_avg: "Avg", training_now: "Ahora", SkillsAnalysisTitle: "Skills y análisis de eficacia de entrenamiento coloreables al presionar: ALT + S", SkillsAnalysis: "Coloreable por gráficos" , sug_T0: "Primera opción:", sug_T1: "Segunda opción:", sug_T2: "Podrías intentar:", sug_T3: "Predeterminado:", Pos9: "Centro defensor", Pos7: "Arquero", Pos10: "Delantero lateral", Pos5: "Segundo delantero", Pos4: "Centrocampista", Pos56: "Miediocampista/Anchor", Pos21: "DM", Pos22: "WB", Pos23: "AMF", PosScores: "Puntuación táctica", Scores: "Puntuación", sug_Loser: "Habilidades clave demasiado bajas. Intercambialo lo más antes posible.", sug_PRI: "Orden de entrenamiento:", attrName1: "Velocidad", attrName2: "Resistencia", attrName3: "Inteligencia", attrName4: "Pases", attrName5: "Remates", attrName6: "Cabezazos", attrName7: "Atajando", attrName8: "Control de balón", attrName9: "Entradas", attrName10: "Pases Largos", attrName11: "Balón Parado" , scoutReport: "REPORTE DE SCOUTEO", now: "ahora", future: "realizable", max: "máximo" } , br: { Name: "Português", GetPlayersHtml: "Página de jogadores", GetPlayersHtml2: "Página de jugadores(sem cache)", Clear: "Esvaziar o cache", Save: "Salvar", Setting: "Configurações", Test: "Teste", SettingTitle: "Clique para configurar linguagem", Language: "Linguagem", XmlMode: "Exportar Modelo Tático", XmlMode1: "Seleção Sequencial", XmlMode2: "Escolha localização (precisa submeter dados ao servidor)", TacConf: "Configuração de Coeficiente Tático", AutoRun: "Auto Colorir", AutoRun0: "Por página carregada(Uma vez)", AutoRun1: "Recarregada do MZ", Pay: "Apoie o autor.", NotSureEx: "Habilidades podem mudar depois de entrar no mercado de transferências.<br/>Hora da mudança ", NotSure: "Habilidade incerta", ManualColorTitle: "Clique na habilidade colorida. Tecla de atalho: ALT + A", ManualColor: "Habilidade colorida", Jijing: "Eventos", dongzuo: "Status do jogador", Copyxml1: "Copiar XML(mandante)", Copyxml2: "Copiar XML(visitante)", CopyXml: "Os dados foram copiados para a área de transferência!", CopyXmlMsg: "A tática foi copiada para a área de transferências!", CopyXmlMsgError: "Erro na cópia!", BA_NORMAL: "Normal", BA_WALL: "Wall", BA_HOLD: "Hold", BA_DOWN: "Down", BA_HOLD_THROWIN: "HoldThrowin", BA_THROWIN: "Throwin", BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)", BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)", BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)", BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)", BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)", BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)", BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)", BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)", BA_LEFT_FOOT_PASS_FWD: "FootPass(L)", BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)", BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)", BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)", BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)", BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)", BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)", BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)", BA_PICK_UP_BALL: "Pega a bola", BA_DROP_BALL: "Deixa a bola", BA_HEADER: "Cabeceio", BA_TRIP: "Trip", BA_CELEBRATE: "Celebração", BA_GK_READY: "Goleiro pronto", BA_GK_ACRO_LEFT: "GkAcroLeft", BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold", BA_GK_ACRO_RIGHT: "GkAcroRight", BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold", BA_GK_SIDESTEP_LEFT: "Goleiro dá passo à esquerda", BA_GK_SIDESTEP_RIGHT: "Goleiro dá passo à direita", BA_GK_KICK: "Goleiro chuta", BA_GK_THROW_BALL: "GkThrowBall", BA_GK_STRETCH_LEFT: "GkStretchLeft", BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold", BA_GK_STRETCH_RIGHT: "GkStretchRight", BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold", BA_BALL_OWNER: "Com a bola nos pés", BA_TACKLE: "Desarme", BA_SLIDING_TACKLE: "Carrinho", BA_SLIDING_TACKLE_STAND: "SlidingTackleStand", BA_MAX: "Max", BA_MY_1001: "HeadGoal(L)", BA_MY_1002: "HeadGoal(R)", BA_MY_1003: "Pára a bola", BA_MY_1011: "Desarme(Sucesso)", BA_MY_1012: "Desarme(Falha)", Unknown: "Desconhecido" , training_pos: "Sem treinador", training_camp: "CAMP", training_coach: "Coach", training_ycc: "Ycc", training_itc: "Itc", training_neg: "Neg", training_unit: "↑", training_unknown: "Treinamento desconhecido", training_ball_day: "Dias para ganhar bola", training_part: "Eficiência de treinamento", training_total: "Total", training_avg: "Avg", training_now: "Agora", SkillsAnalysisTitle: "Tecla de atalho de Habilidades coloridas e Análise de Eficiência de treinamento: ALT + S", SkillsAnalysis: "Colorir por gráficos" , sug_T0: "Primeira opção:", sug_T1: "Segunda opção:", sug_T2: "Pode tentar:", sug_T3: "Padrão:", Pos9: "Zagueiro central", Pos7: "Goleiro", Pos10: "Ponta", Pos5: "Segundo atacante", Pos4: "Meia Central", Pos56: "Meio-campo/Volante", Pos21: "DM", Pos22: "WB", Pos23: "AMF", PosScores: "Pontuação tática", Scores: "Pontuação", sug_Loser: "Habilidades principais muito baixas. Troque ou dispense o mais breve possível.", sug_PRI: "Ordem de treinamento:", attrName1: "Velocidade", attrName2: "Resistência", attrName3: "Inteligência", attrName4: "Passe Curto", attrName5: "Chute", attrName6: "Cabeceio", attrName7: "Defesa a Gol", attrName8: "Controle de Bola", attrName9: "Desarme", attrName10: "Passe Longo", attrName11: "Bola Parada" , scoutReport: "Relatório de Observador", now: "agora", future: "realizável", max: "máximo" } } , scoutLocList: { "9": { "Prop": { "1": 0, "2": 0, "9": 1, "10": 2, "8": 2, "3": 2, "4": 2, "6": 2 }, "Order": [1, 2, 9, 10, 8, 3, 4, 6], "CampKey": "9" }, "7": { "Prop": { "2": 0, "7": 1, "3": 1, "1": 1, "10": 2, "11": 2, "8": 2 }, "Order": [2, 7, 3, 1, 10, 11, 8], "CampKey": "7" }, "10": { "Prop": { "1": 0, "2": 0, "10": 1, "8": 1, "9": 2, "4": 2, "5": 2, "6": 2 }, "Order": [1, 2, 10, 8, 9, 4, 5, 6], "CampKey": "10" }, "5": { "Prop": { "1": 0, "2": 0, "5": 1, "8": 1, "6": 1, "3": 2, "4": 2, "10": 2, "9": 2 }, "Order": [1, 2, 5, 8, 6, 3, 4, 10, 9], "CampKey": "5" }, "4": { "Prop": { "1": 0, "2": 0, "4": 1, "8": 1, "3": 1, "10": 2, "9": 2, "5": 2, "6": 2 }, "Order": [1, 2, 4, 8, 3, 10, 9, 5, 6], "CampKey": "4" }, "5,6": { "Prop": { "2": 0, "1": 0, "5": 1, "6": 1, "8": 1, "3": 2, "4": 2, "10": 2, "9": 2 }, "Order": [2, 1, 5, 8, 6, 3, 4, 10, 9], "CampKey": "56" } } , OKeys: ["9", "7", "10", "5", "4", "5,6"] , CTable: function () { //key value this.data = {}; //keys this.keys = new Array(); this.addData = function (key, value) { if (this.data[key] == undefined) { this.keys.push(key); this.keys.sort(function (a, b) { return a - b; }); } this.data[key] = value; }; this.getVal = function (i) { if (this.data[i] == undefined) { // } else { return this.data[i]; } }; this.GetX = function (i) { let rv = this.getVal(i); rv = Math.floor(rv * 214 / 1000) - 3; return rv; }; this.GetY = function (i) { let rv = this.getVal(i); rv = Math.floor(rv * 328 / 1000) - 1; return rv; }; } , mzcamp: function () { this.data = {}; this.name = null; this.keys = new Array(); this.index = 0; this.add = function (begin, end) { if (end > begin + 2937600000) { end = begin + 2937600000; } if (this.data[begin] == undefined) { this.keys.push(begin); this.keys.sort(function (a, b) { return a - b; }); } this.data[begin] = { begin: begin, end: end }; }; this.getItem = function (begin) { return this.data[begin]; }; this.resetIndex = function () { this.index = 0; }; this.inYTC = function (x) { while (this.index < this.keys.length) { let item = this.data[this.keys[this.index]]; if (x < item.begin) { return false; } else if (x <= item.end) { if (/\d/.test(item.name)) { return false; } return true; } if (x > item.end) { this.index++; } } return false; }; } , playerTrainingBySkill: function () { //涨球时间 this.ballDay = 0; //训练统计 this.stat = new vanGmMzModel.trainingStat(); //当前球数 this.skill = 0; //最后一次训练 this.lt = 0; } , trainingStat: function () { //所有 不包含掉球 this.all = new vanGmMzModel.trainingDay(); ////普通训练 无教练 //this.pos = new vanGmMzModel.trainingDay(); ////强化营 //this.itc = new vanGmMzModel.trainingDay(); ////调整营 //this.ycc = new vanGmMzModel.trainingDay(); ////掉球 //this.neg = new vanGmMzModel.trainingDay(); ////理疗 //this.physio = new vanGmMzModel.trainingDay(); ////有教练 //this.coach = new vanGmMzModel.trainingDay(); ////训练营 //this.camp = new vanGmMzModel.trainingDay(); //对某类型加1 this.add = function (type, tn) { if (!this[type]) { this[type] = new vanGmMzModel.trainingDay(); } this[type][tn] += 1; }; this.getSum = function (canOver100) { let ret = 0; if (this.neg) { ret = this.all.getSum() - this.neg.getSum(); } else { ret = this.all.getSum(); } if (!canOver100) { if (ret >= 100) { ret = 99.99; } } return ret; }; this.getAvg = function () { //let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1); //ret = parseFloat(ret).toFixed(1); //return ret; if (this.neg) { return -this.neg.getAvg(); } else { return this.all.getAvg(); } }; this.getTnText = function (now_language) { let str = ""; if (this.pos) { str += " " + now_language.training_pos + this.pos.getTnText(now_language); } if (this.camp) { str += " " + now_language.training_camp + this.camp.getTnText(now_language); } if (this.coach) { str += " " + now_language.training_coach + this.coach.getTnText(now_language); } if (this.ycc) { str += " " + now_language.training_ycc + this.ycc.getTnText(now_language); } if (this.itc) { str += " " + now_language.training_itc + this.itc.getTnText(now_language); } if (this.neg) { str += " " + now_language.training_neg + this.neg.getTnText(now_language); } return str; }; //this.getAvgAndText = function () { // //let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1); // //ret = parseFloat(ret).toFixed(1); // //return ret; // let ret = this.getAvg(); // let str = ""; // if (ret <= 0.4) { // str = "1格"; // } // else if (ret > 0.4 && ret <= 1.1) { // str = "2格"; // } // else if (ret > 0.4 && ret <= 2.1) { // str = "2格"; // } // this.t1 * 0.4 * 1 // + this.t2 * 0.55 * 2 // + this.t3 * 0.7 * 3 // + this.t4 * 0.85 * 4 // + this.t5 * 1 * 5 // + this.t6 * 1.15 * 6 // + this.t7 * 1.3 * 7 // + this.t8 * 1.45 * 8 // + this.t9 * 1.6 * 9 // + this.t10 * 1.75 * 10; //}; this.getDayByAvg = function (avg) { let ret = (100 - this.getSum()) / avg; ret = parseFloat(ret).toFixed(1); return ret; }; this.getDay = function () { if (this.coach) { return this.getDayByAvg(this.coach); } else if (this.pos) { return this.getDayByAvg(this.pos); } return undefined; }; } , trainingDay: function () { this.t1 = 0; this.t2 = 0; this.t3 = 0; this.t4 = 0; this.t5 = 0; this.t6 = 0; this.t7 = 0; this.t8 = 0; this.t9 = 0; this.t10 = 0; this.getSum = function () { let ret = this.t1 * 0.645 * 1 + this.t2 * 0.55 * 2 + this.t3 * 0.7 * 3 + this.t4 * 0.85 * 4 + this.t5 * 0.96 * 5 + this.t6 * 1.111 * 6 + this.t7 * 1.3 * 7 + this.t8 * 1.6 * 8 + this.t9 * 2.02 * 9 + this.t10 * 2.4 * 10; ret = parseFloat(ret).toFixed(1); return ret; }; this.getAvg = function () { let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1); ret = parseFloat(ret).toFixed(1); return ret; }; this.getTnText = function (now_language) { let str = ""; if (this.t1 > 0) { str += " 1" + now_language.training_unit + "(" + this.t1 + ")"; } if (this.t2 > 0) { str += " 2" + now_language.training_unit + "(" + this.t2 + ")"; } if (this.t3 > 0) { str += " 3" + now_language.training_unit + "(" + this.t3 + ")"; } if (this.t4 > 0) { str += " 4" + now_language.training_unit + "(" + this.t4 + ")"; } if (this.t5 > 0) { str += " 5" + now_language.training_unit + "(" + this.t5 + ")"; } if (this.t6 > 0) { str += " 6" + now_language.training_unit + "(" + this.t6 + ")"; } if (this.t7 > 0) { str += " 7" + now_language.training_unit + "(" + this.t7 + ")"; } if (this.t8 > 0) { str += " 8" + now_language.training_unit + "(" + this.t8 + ")"; } if (this.t9 > 0) { str += " 9" + now_language.training_unit + "(" + this.t9 + ")"; } if (this.t10 > 0) { str += " 10" + now_language.training_unit + "(" + this.t10 + ")"; } return str; }; } , mzreg: { td_skill_val: /(\d+)/, img_val: /(\d+)\.gif/, playerMax: /trainingField.players\s*=\s*({.+})/, playerId: /player_id_(\d+)/, bar_itc: /bar_itc_(\d+)/, bar_ycc: /bar_ycc_(\d+)/, bar_pos: /bar_pos_(\d+)/, bar_neg: /bar_neg_(\d+)/, trainingType: /&t=([^)]+)/, data2d_url: /matchviewer\/media/, shortlist_url: /\/?p=shortlist/, ruok_url: /\/?p=team&tid=572357/, playerId_tac: /pid=(\d+)/, matchResult: /\/?p=match&sub=result&mid=(\d+)/, nocache: /nocache-\d+/ //data2d_url: /matchviewer\/getMatchFiles.php\?type=data&mid=\d+/ }, mzImg: { g: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///8zM/wAA/////yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=", r: "data:image/gif;base64,R0lGODlhDAAKAJEDAP////8AAMyZmf///yH5BAEAAAMALAAAAAAMAAoAAAIk3BQZYp0CAAptxvjMgojTEVwKpl0dCQrQJX3T+jpLNDXGlDUFADs=", b: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///5mZmQAAAP///yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=", p: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///5lm/5kzzP///yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=", x: "data:image/gif;base64,R0lGODlhBgAKAJEDAJnMZpmZmQAAAP///yH5BAEAAAMALAAAAAAGAAoAAAIRXCRhApAMgoPtVXXS2Lz73xUAOw==" }, hImg: { g: "data:image/gif;base64,R0lGODlhDAAKALMNAOnt/+Xr/9ri/6/A/6G1/73L/52x/8/Z/4Wf/32Z/1x9/0Rr/x9N/////wAAAAAAACH5BAEAAA0ALAAAAAAMAAoAAAQwsDXD2FJB6sot0UnHLYckdoJ5VmmzWoi0nAuxSIEyW0qxJBrFAAAYKCoaSYgD1EQAADs=", r: "data:image/gif;base64,R0lGODlhDAAKANUkAOXq//8pKunt//ZTVPz19dXZ+tzk/+NAV+bl+Ojs//4wMeWkreXp/f4tLvRMT+Dm/+Xr/7lra/4vMepKSv7///ZRUvz8/tmHhs/Z/+xKSfVeYNCJkfhFRPUxOuBUZvRsb9ri//39//hDQv8oKf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACQALAAAAAAMAAoAAAZCQBLpMhqJMgiLkEQoOkeDwnLzdIowwuoTlNUWDRSSF/oIkUQBZ6BRAWiEkIlopPgsEhzPMgIQCBgOEiNLQh1PB4RBADs=", b: "data:image/gif;base64,R0lGODlhDAAKAMQUALW1teLi4oCAgMDAwB0dHevr6+3t7aCgoDMzM9nZ2bOzs0pKSszMzC0tLX9/f19fXz8/P5qamhISEgAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABQALAAAAAAMAAoAAAU1IEUpkgQ5hahObNsAatTOTyLOMxHcOKvzvcdB1Oi9FqKCA1I6MR4RlWBgMAwEiIlKJGtFVSEAOw==", p: "data:image/gif;base64,R0lGODlhDAAKALMNAOnt/+Xr/9ri/6/A/6G1/73L/52x/8/Z/4Wf/32Z/1x9/4tQ/30+/////wAAAAAAACH5BAEAAA0ALAAAAAAMAAoAAAQwsDXD2FJB6sot0UnHLYckdoJ5VmmzWoi0nAuxSIEyW0qxJBrFAAAYKCoaSYgD1EQAADs=", x: "data:image/gif;base64,R0lGODlhBgAKAJEDAJnMZpmZmQAAAP///yH5BAEAAAMALAAAAAAGAAoAAAIRXCRhApAMgoPtVXXS2Lz73xUAOw==" } , //以下为2D比赛辅助 MatchEvent: function () { this.data = new Array(); this.setAllPlayerEvent = function (team, tc) { for (let i = 0; i < tc.length; i++) { this.data.push(tc[i]); } for (let i = 0; i < team.m_players.length; i++) { let len = team.m_players[i].m_events.getLength(); for (let j = 0; j < len; j++) { this.data.push(team.m_players[i].m_events.at(j)); } } }; this.Sort = function () { this.data.sort(function (a, b) { return a.m_frame - b.m_frame; }); }; } , OutOfPlay: function () { this.data = new Array(); this.add = function (begin, end) { this.data.push({ begin: begin, end: end }); }; this.resetIndex = function () { this.index = 0; }; this.notin = function (frame) { while (this.index < this.data.length) { let item = this.data[this.index]; if (frame < item.begin) { return true; } else if (frame <= item.end) { return false; } if (frame > item.end) { this.index++; } } return true; }; this.Sort = function () { this.data.sort(function (a, b) { return a.begin - b.begin; }); } } }; var vanGmMz = { now_sport: "soccer", now_language: vanGmMzModel.language.en , pmax: {}, tacP: {}, tacCof: {}, trainingInfo: {}, vv: "", getMax: function (callback) { vple.ajax( "/?p=training&sport=" + vanGmMz.now_sport, function (data) { let result = data.match(vanGmMzModel.mzreg.playerMax); if (result) { vanGmMz.pmax = JSON.parse(result[1]); callback(vanGmMz.pmax); } else { return true; } }); return false; } , setSrc: function (transfer, img, skill, maxed, skillBallDay, pid, k) { img.skill = skill; img.maxed = maxed; let old = true; let p_tr = $(img).parents("tr:first"); if (p_tr.length == 0 || p_tr.attr("class")) { p_tr = $(img).nextAll(".skill_exact:first"); old = false; } if (skill > 0) { let flag_exit = false; if (transfer && skillBallDay) { if (new Date().getTime() - skillBallDay < 345600000) { vanGmMz.getTrainingGraphsBySkill_id(pid, k, function (data) { let result = data.match(new RegExp('{"x":' + skillBallDay + ',"y":(\\d+),[^}]*"marker"')); if (result && result.length) { $(img).parents("tr:first").find("td.skillval").html("(<span class=\"" + (maxed === "red" ? "maxed" : "") + "\">" + result[1] + "</span>)"); vanGmMz.setSrc(false, img, parseInt(result[1]), maxed, false, pid, k); flag_exit = true; return true; } else { return false; } }); //$(img).parent().find("span").remove(); //$(img).parent().append("<span class=\"help_button_placeholder\"><a class=\"help_button\" href=\"#\" onclick=\"showHelpLayer('" + now_language.NotSureEx + new Date(skillBallDay).toLocaleString() + "', '" + now_language.NotSure + "', true); return false\"><span class=\"help_button_wrapper\"><span class=\"help_button_text\">?</span></span></a></span>"); } } if (flag_exit) { return; } if (pid && vanGmMz.trainingInfo[pid][k]) { let extmp = p_tr.find(".skill_exact2"); if (extmp.length > 0) { extmp.remove(); } let sum = 0; if (vanGmMz.trainingInfo[pid][k].neg && vanGmMz.trainingInfo[pid][k].neg[skill + 1]) { sum = vanGmMz.trainingInfo[pid][k].neg[skill + 1].stat.getSum(); } else if (vanGmMz.trainingInfo[pid][k][skill]) { sum = vanGmMz.trainingInfo[pid][k][skill].stat.getSum(); } if (old) { p_tr.append("<td class='skill_exact2'><div><span id=" + pid + "_" + k + "_" + skill + " class='skillval skill_exact_van'>" + sum + "%</span></div></td>"); } else { p_tr.append("<div class='skill_exact2 clearfix' style='display:inline-block;'><div><span id=" + pid + "_" + k + "_" + skill + " class='skillval skill_exact_van'>" + sum + "%</span></div></div>"); } } if (img.isYtc) { p_tr.children().eq(0).addClass("gm_ytc"); } } let strdiv; if (old) { strdiv = "<div class='skill' style='font-size:0;padding: 0 0 0 4px;'>"; } else { strdiv = "<div class='skilladd ignore-fluid'>"; } let tmpImg = vanGmMzModel.mzImg; if (vanGmMz.now_sport != "soccer") { tmpImg = vanGmMzModel.hImg; } for (let i = 0; i < skill; i++) { if (maxed === "red") { strdiv += "<img src='" + tmpImg.r + "'>"; } else if (maxed === "green") { strdiv += "<img src='" + tmpImg.g + "'>"; } else { strdiv += "<img src='" + tmpImg.b + "'>"; } } if (/blevel_/.test(img.src)) { strdiv += "<img src='" + tmpImg.x + "'>"; } strdiv += "</div>"; $(img).hide(); if (old) { $(img).parent().find("div").remove(); } else { $(img).nextAll("div.skilladd:first").remove(); } $(img).after(strdiv); } , showMax: function (GraphsType) { let players = $(".playerContainer"); for (let i = 0; i < players.length; i++) { let pdom = players.eq(i); let pid = pdom.html().match(vanGmMzModel.mzreg.playerId)[1]; let player = vanGmMz.pmax[pid]; let imgs = pdom.find("div.player-skills").find("img.ignore-fluid"); if (imgs.length == 0) { imgs = pdom.find("img.skill"); } if (GraphsType == 0 && player) { this.setPlayerImgs(imgs, player); if (pdom.find(".scout_report").length > 0) { vanGmMz.getScoutReport(pid, pdom); } } else if (pdom.find(".training_graphs").length > 0 && imgs.length > 0) { if (pdom.find(".scout_report").length > 0) { vanGmMz.getScoutReport(pid, pdom); } else if(pdom.find(".scout_report_stars")) { vanGmMz.getScoutReport(pid, pdom); } vanGmMz.getTrainingGraphs(pid, pdom, GraphsType); } else if (pdom.find(".scout_report").length > 0) { if (player) { this.setPlayerImgs(imgs, player); } else { for (let j = 0; j < imgs.length; j++) { vanGmMz.setSrc(false, imgs[j], parseInt(imgs[j].src.match(vanGmMzModel.mzreg.img_val)[1]), ""); } } vanGmMz.getScoutReport(pid, pdom, GraphsType == 2); } } return false; } , setPlayerImgs: function (imgs, player) { if (isNaN(parseInt(player.skills.stamina))) { for (let j = 0; j < imgs.length; j++) { vanGmMz.setSrc(false, imgs[j], parseInt(imgs[j].src.match(vanGmMzModel.mzreg.img_val)[1]), ""); } } else { if (vanGmMz.now_sport == "soccer") { vanGmMz.setSrc(false, imgs[0], player.skills.speed, player.maxed.speed); vanGmMz.setSrc(false, imgs[1], player.skills.stamina, player.maxed.stamina); vanGmMz.setSrc(false, imgs[2], player.skills.gameintelligence, player.maxed.gameintelligence); vanGmMz.setSrc(false, imgs[3], player.skills.passing, player.maxed.passing); vanGmMz.setSrc(false, imgs[4], player.skills.shooting, player.maxed.shooting); vanGmMz.setSrc(false, imgs[5], player.skills.heading, player.maxed.heading); vanGmMz.setSrc(false, imgs[6], player.skills.goalkeeping, player.maxed.goalkeeping); vanGmMz.setSrc(false, imgs[7], player.skills.technique, player.maxed.technique); vanGmMz.setSrc(false, imgs[8], player.skills.tackling, player.maxed.tackling); vanGmMz.setSrc(false, imgs[9], player.skills.highpassing, player.maxed.highpassing); vanGmMz.setSrc(false, imgs[10], player.skills.situations, player.maxed.situations); } else { vanGmMz.setSrc(false, imgs[1], player.skills.gameintelligence, player.maxed.gameintelligence); vanGmMz.setSrc(false, imgs[2], player.skills.power, player.maxed.power); vanGmMz.setSrc(false, imgs[3], player.skills.skating, player.maxed.skating); vanGmMz.setSrc(false, imgs[4], player.skills.passing, player.maxed.passing); vanGmMz.setSrc(false, imgs[5], player.skills.quickness, player.maxed.quickness); vanGmMz.setSrc(false, imgs[6], player.skills.shooting, player.maxed.shooting); vanGmMz.setSrc(false, imgs[7], player.skills.goalkeeping, player.maxed.goalkeeping); vanGmMz.setSrc(false, imgs[8], player.skills.puckcontrol, player.maxed.puckcontrol); vanGmMz.setSrc(false, imgs[9], player.skills.checking, player.maxed.checking); vanGmMz.setSrc(false, imgs[10], player.skills.stamina, player.maxed.stamina); } } }, drawPlayerByTrainingGraphs: function (pid, data, pdom) { let imgs = pdom.find("div.player-skills").find("img.ignore-fluid"); let old = false; if (imgs.length == 0) { imgs = pdom.find("img.skill"); old = true; } var series = undefined; eval(data); if (series == undefined) { return false; } let maxeds, skillBallDays, allSkillTraining_tmp; if (vanGmMz.now_sport == "soccer") { maxeds = ["green", "green", "green", "green", "green", "green", "green", "green", "green", "green", "green"]; skillBallDays = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; allSkillTraining_tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; } else { imgs.splice(0, 1); maxeds = ["green", "green", "green", "green", "green", "green", "green", "green", "green", "green"]; skillBallDays = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; allSkillTraining_tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; } let camp = new vanGmMzModel.mzcamp(); let NowSeasonInfo = vanGmMz.D_GetNowSeasonInfo(xPlotLines); for (let i = 0; i < series.length; i++) { if ((series[i].type == "line" && series[i].color == "rgba(255,0,0,0.7)")) { if (series[i].data.length > 0) { let g = series[i].data[0]; let index = g.y - 1; if (index >= 0 && g.y <= 11) { maxeds[index] = "red"; } } } else if ((series[i].type == "line" && series[i].color == "rgba(255,88,0,0.6)")) { //训练营线 if (series[i].data && series[i].data.length == 2) { camp.add(series[i].data[0].x, series[i].data[1].x); } } else { for (let j = 0; j < series[i].data.length; j++) { let g = series[i].data[j]; if (g.y == "-3") { let itemcamp = camp.getItem(g.x); if (itemcamp) { itemcamp.name = g.name; } } let index = g.y - 1; if (index >= 0 && g.y <= 11) { if (g.name == "Maxed") { maxeds[index] = "red"; } if (g.marker && g.marker.symbol) { if (allSkillTraining_tmp[index] == 0) { allSkillTraining_tmp[index] = new Array(); allSkillTraining_tmp[index].push(new vanGmMzModel.playerTrainingBySkill()); } if (/training_camp/.test(g.marker.symbol)) { //训练营 判断是否是ytc if (camp.inYTC(g.x)) { imgs[index].isYtc = true; } } let playerTS; //掉球单独列 if (/bar_neg/.test(g.marker.symbol)) { if (allSkillTraining_tmp[index].neg == undefined) { allSkillTraining_tmp[index].neg = new Array(); } if (/_ball/.test(g.marker.symbol) || /_puck/.test(g.marker.symbol)) { if (skillBallDays[index] < g.x) { skillBallDays[index] = g.x; playerTS = new vanGmMzModel.playerTrainingBySkill(); playerTS.ballDay = g.x; allSkillTraining_tmp[index].neg.push(playerTS); } } else if (allSkillTraining_tmp[index].neg.length == 0) { playerTS = new vanGmMzModel.playerTrainingBySkill(); allSkillTraining_tmp[index].neg.push(playerTS); } else { playerTS = allSkillTraining_tmp[index].neg[allSkillTraining_tmp[index].neg.length - 1]; } } else { playerTS = allSkillTraining_tmp[index][allSkillTraining_tmp[index].length - 1]; if (/_ball/.test(g.marker.symbol) || /_puck/.test(g.marker.symbol)) { if (skillBallDays[index] < g.x) { skillBallDays[index] = g.x; playerTS.ballDay = g.x; let next_playerTS = new vanGmMzModel.playerTrainingBySkill(); next_playerTS.last = playerTS; allSkillTraining_tmp[index].push(next_playerTS); } } } let result = g.marker.symbol.match(vanGmMzModel.mzreg.trainingType); let type = ""; if (result && result.length > 0) { switch (result[1]) { case "physio": //理疗 type = "physio"; break; case "coach": //有教练 type = "coach"; break; case "training_camp": //训练营 type = "camp"; break; case "training_camp_ycc": //调整营 type = "ycc"; break; case "training_camp_itc": //强化营 type = "itc"; break; default: //未知 console.log(vanGmMz.now_language.training_unknown + ":" + result[1]); break; } } vanGmMz.D_FillTraining(type, playerTS, g, NowSeasonInfo); } } } } } let allSkillTraining = new Array(); for (let t1 = 0; t1 < allSkillTraining_tmp.length; t1++) { if (imgs[t1].nowSkill == undefined) { imgs[t1].nowSkill = parseInt(imgs[t1].src.match(vanGmMzModel.mzreg.img_val)[1]); } let tmp = {}; let negCount = 0; if (allSkillTraining_tmp[t1].neg) { negCount = allSkillTraining_tmp[t1].neg.length; tmp.neg = {}; for (let t3 = 0; t3 < allSkillTraining_tmp[t1].neg.length; t3++) { let tmp3 = allSkillTraining_tmp[t1].neg[t3]; if (tmp3.stat.getSum() != 0) { tmp3.skill = imgs[t1].nowSkill + negCount - t3; tmp.neg[tmp3.skill] = tmp3; } } } for (let t2 = 0; t2 < allSkillTraining_tmp[t1].length; t2++) { let tmp2 = allSkillTraining_tmp[t1][t2]; if (tmp2.stat.getSum() != 0) { tmp2.skill = imgs[t1].nowSkill + negCount + 1 - allSkillTraining_tmp[t1].length + t2; tmp[tmp2.skill] = tmp2; } //test vanGmMz.vanlog(pid, tmp2, t1, t2); } allSkillTraining[t1] = tmp; } vanGmMz.trainingInfo[pid] = allSkillTraining; for (let k = 0; k < maxeds.length; k++) { vanGmMz.setSrc(pdom.find(".player_share_skills").length == 0, imgs[k], imgs[k].nowSkill, maxeds[k], skillBallDays[k], pid, k); } vanGmMz.D_NowSeasonText(pid, NowSeasonInfo, pdom); series = undefined; plotBands = undefined; xPlotLines = undefined; return true; } , vanlog: function (pid, pt, t1, t2) { }, fillTrainingLevel: function (type, reg, playerTS, url, isneg) { let result = url.match(reg); if (result && result.length > 0) { let stat = playerTS.stat; playerTS.lt = parseInt(result[1]); if (isneg) { stat.add(type, "t" + result[1]); } else { stat.add("all", "t" + result[1]); stat.add(type, "t" + result[1]); } } } , getScoutReport: function (pid, pdom, showMB, nochecka) { let url = "/ajax.php?p=players&sub=scout_report&pid=" + pid + "&sport=" + vanGmMz.now_sport; let cache_mode = 1; if (pdom.find("#discard_youth_button").length) { url = "/ajax.php?p=players&sub=scout_report&pid=null&sport=" + vanGmMz.now_sport; cache_mode = 0; } vple.ajax( url, function (data) { if (!nochecka) { if (pdom.find("a[href$='" + pid + "']").length == 0 && pdom.find("#player_id_" + pid).length == 0) { return; } } let srdom = $($.parseHTML(data)); let remark = srdom.find("span.blurred span").text(); let srdivs = srdom.find("dd div.flex-grow-1"); if (srdivs.length == 3) { let HS = srdivs.eq(0).find(".lit").length; let LS = srdivs.eq(1).find(".lit").length; let SS = srdivs.eq(2).find(".lit").length; //Trzxyvopaxis let Hspan = srdivs.eq(0).find(".blurred span"); let HArr = new Array(); for (let i = 0; i < Hspan.length; i++) { if (Hspan.eq(i).text() != "Trzxyvopaxis") { HArr.push(Hspan.eq(i).text()); } } let Lspan = srdivs.eq(1).find(".blurred span"); let LArr = new Array(); for (let i = 0; i < Lspan.length; i++) { if (Lspan.eq(i).text() != "Trzxyvopaxis") { LArr.push(Lspan.eq(i).text()); } } let HPids = [], LPids = []; let skillnames = pdom.find("div.player-skills").find("span.responsive-hide.responsive-container"); if (skillnames.length == 0) { skillnames = pdom.find("td > span.clippable"); } let onMarket = false; if(skillnames.length == 0){ skillnames = pdom.find("td > span.skill_name") onMarket = true; } for (let i = 0; i < skillnames.length; i++) { let skillText = onMarket ? skillnames.find("span:first").eq(i).text() : skillnames.eq(i).text() if (HArr.indexOf(skillText) >= 0) { skillnames.eq(i).parent().addClass("gm_scout_h"); skillnames.eq(i).parent().addClass("gm_s" + HS); HPids.push(i + 1); } else if (LArr.indexOf(skillText) >= 0) { skillnames.eq(i).parent().removeClass("gm_scout_h"); skillnames.eq(i).parent().addClass("gm_s" + LS); LPids.push(i + 1); } //else { // skillnames.eq(i).parent().removeClass("gm_scout_h"); // skillnames.eq(i).parent().removeClass("gm_s*"); //} } $("#GM_scout_" + pid).remove(); let nsavgstat = "<span id='GM_scout_" + pid + "'>[H" + HS + " " + HArr[0] + "," + HArr[1] + "] [L" + LS + " " + LArr[0] + "," + LArr[1] + "] S" + SS; nsavgstat += "</span>"; nsavgstat = $(nsavgstat)[0]; nsavgstat.addEventListener('click', function () { let strSus = remark; if (vanGmMz.IsLoser(HS, LS, LPids[0], LPids[1])) { strSus += "<br/><br/>" + vanGmMz.now_language.sug_Loser; } let plans = vanGmMz.getTrainPlans(HPids[0], HPids[1], LPids[0], LPids[1]); for (let j = 0; j < plans.length; j++) { let str = ""; let pri = vanGmMz.getTrainPRI(plans[j].loc, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]); for (let i = 0; i < pri.Order.length; i++) { if (str != "") { str += ">"; } str += vanGmMz.now_language["attrName" + pri.Order[i]]; } strSus += "<br/><br/>" + vanGmMz.now_language["sug_T" + plans[j].type] + vanGmMz.now_language["Pos" + pri.Sloc.CampKey] + "<br/><br/>" + vanGmMz.now_language.sug_PRI + str; } vanGmMz.D_ShowScoutText(strSus, pid, pdom, HS, HPids, LS, LPids); return false; }); pdom.find("a.subheader").after(nsavgstat); vanGmMz.D_SetMaybeSkill(pdom, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]); if (showMB) { vanGmMz.D_ShowMaybeSkill(pdom, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]); } } else { return true; } }, cache_mode); } , checkScoutLoc: function (lst, key, LP1, LP2, slocs) { if (lst[key] != undefined) { let sloc = lst[key]; if (vanGmMz.getProp(LP1, sloc) == 0 || vanGmMz.getProp(LP2, sloc) == 0) { slocs.push({ type: 1, loc: sloc }); } else { slocs.push({ type: 0, loc: sloc }); } slocs.keys[key] = true; } } , getProp: function (id, loc) { if (loc.Prop[id] != undefined) { return loc.Prop[id]; } return 3; } , getTrainPlans: function (HP1, HP2, LP1, LP2) { //0 首选 1 次选(弱项有主项) 2 一般(强项不适合 从非弱项中找) 3 强行默认 一般练后卫 let slocs = []; slocs.keys = {}; //按高星挑选合适训练计划 vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP1 + "," + HP2, LP1, LP2, slocs); vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP2 + "," + HP1, LP1, LP2, slocs); vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP1, LP1, LP2, slocs); vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP2, LP1, LP2, slocs); for (let i = 0; i < vanGmMzModel.OKeys.length; i++) { let key = vanGmMzModel.OKeys[i]; if (!slocs.keys[key]) { let loc = vanGmMzModel.scoutLocList[key]; if (vanGmMz.getProp(LP1, loc) != 1 && vanGmMz.getProp(LP2, loc) != 1) { slocs.push({ type: 2, loc: loc }); slocs.keys[key] = true; } } } if (slocs.length == 0) { slocs.push({ type: 3, loc: vanGmMzModel.scoutLocList[vanGmMzModel.OKeys[0]] }); } return slocs; } , IsLoser: function (HStar, LStar, LP1, LP2) { if (HStar <= 2) { return true; } //弱1带速耐 if (LStar == 1 && HStar < 4) { if (LP1 == 1 || LP2 == 1 || LP1 == 2 || LP2 == 2) { return true; } } return false; } , getTrainPRI: function (sloc, HStar, HP1, HP2, LStar, LP1, LP2) { //获取训练顺序 let lstBase = []; let lstMain = []; let lstSub = []; for (let i = 0; i < sloc.Order.length; i++) { let ID = sloc.Order[i]; let t = vanGmMz.getProp(ID, sloc); if (t == 0 || t == 1) { //强3+星 基础和主项训练完再训练 if (HStar >= 3) { if (HP1 == ID || HP2 == ID) { lstSub.push(ID); } } //弱2星带基础和主项 最优先训练 if (LStar <= 2) { if (LP1 == ID || LP2 == ID) { if (t == 0) { lstBase.unshift(ID); } else { lstMain.push(ID); } } } //高低星都没有基础和主项 最优先训练 if (HP1 != ID && HP2 != ID && LP1 != ID && LP2 != ID) { //意降低优先级 if (ID == 3) { lstSub.push(ID); } else if (t == 0) { lstBase.push(ID); } else { lstMain.push(ID); } } } else if (t == 2) { lstSub.push(ID); } } let pri = 29; let ditPRI = {}; let lstOrder = lstBase.concat(lstMain).concat(lstSub); while (lstBase.length > 0) { ditPRI[lstBase.shift()] = pri; pri -= 1; } pri = 19; while (lstMain.length > 0) { ditPRI[lstMain.shift()] = pri; pri -= 1; } pri = 9; while (lstSub.length > 0) { ditPRI[lstSub.shift()] = pri; pri -= 1; } let ret = { "Sloc": sloc, "TrainPRI": ditPRI, "Order": lstOrder }; return ret; } , getTrainingGraphs: function (pid, pdom, GraphsType) { vple.ajax( "/ajax.php?p=trainingGraph&sub=getJsonTrainingHistory&sport=" + vanGmMz.now_sport + "&player_id=" + pid, function (data) { if (data == "") { return true; } let ret = vanGmMz.drawPlayerByTrainingGraphs(pid, data, pdom); if (GraphsType == 2 && pdom.find(".scout_report").length > 0) { vanGmMz.getScoutReport(pid, pdom, true); } return !ret; }); }, getTrainingGraphsBySkill_id: function (pid, skill_id, callback) { if (vanGmMz.now_sport == "soccer") { skill_id += 2; } else { if (skill_id == 0) { skill_id == 11; } else { skill_id += 1; } } vple.ajax( "/ajax.php?p=trainingGraph&sub=getJsonTrainingHistory&sport=" + vanGmMz.now_sport + "&player_id=" + pid + "&skill_id=" + skill_id, function (data) { return !callback(data); }); }, showPop: function (parent) { $("body").append("<div id=\"informationBubble\" class=\"shadow\"></div>"); let bubble = $("#informationBubble"); bubble.css("width", "200px"); let tmpArr = parent.attr('id').split("_"); let playTS = vanGmMz.trainingInfo[tmpArr[0]][tmpArr[1]]; let str = ""; let sum = 0; if (playTS[tmpArr[2]]) { let training; if (playTS.neg) { training = playTS.neg[parseInt(tmpArr[2]) + 1].stat; } else { training = playTS[tmpArr[2]].stat; } str = vanGmMz.now_language.training_avg + " " + training.getAvg() + "%" + training.getTnText(vanGmMz.now_language) + "<br/><br/>" + vanGmMz.now_language.training_ball_day + ":<br/>"; if (training.camp) { str += training.getDayByAvg(training.camp.getAvg()) + "(" + vanGmMz.now_language.training_camp + ") "; } if (training.coach) { str += training.getDayByAvg(training.coach.getAvg()) + "(" + vanGmMz.now_language.training_coach + ") "; } if (training.pos) { str += training.getDayByAvg(training.pos.getAvg()) + "(" + vanGmMz.now_language.training_pos + ")"; } str += "<br/><br/>"; sum = training.getSum(); } let flag = false; str += vanGmMz.now_language.training_part + ":"; for (let i = 0; i < 10; i++) { if (playTS[i]) { flag = true; str += "<br/>" + i + "-" + (i + 1) + " " + vanGmMz.now_language.training_total + ":" + playTS[i].stat.getSum(true) + "%" + " " + vanGmMz.now_language.training_avg + ":" + playTS[i].stat.getAvg() + "%<br/>" + playTS[i].stat.getTnText(vanGmMz.now_language); } } if (playTS.neg) { for (let i = 10; i > 0; i--) { if (playTS.neg[i]) { flag = true; str += "<br/>" + i + "-" + (i - 1) + " " + vanGmMz.now_language.training_total + ":" + playTS.neg[i].stat.getSum(true) + "%" + " " + vanGmMz.now_language.training_avg + ":" + playTS.neg[i].stat.getAvg() + "%<br/>" + playTS.neg[i].stat.getTnText(vanGmMz.now_language); } } } let content = "<div class='clearfix'><h3 style='margin: 0; padding: 0'>" + vanGmMz.now_language.training_now + ":" + sum + "%</h3><div class='skill_exact big'><div class='skill_exact_wrapper clearfix'><div class='skill_exact_bar' style='width: " + sum * 2 + "px;'></div></div></div><p>" + (flag ? str : "") + "</p></div>"; bubble.html(content); mz.stickToParent(bubble, parent); bubble.slideDown("fast"); $(parent).bind("mouseleave", function () { bubble.remove(); $(parent).unbind("mouseleave"); }); } , setLanguage: function (language) { if (language) { let new_language = vanGmMzModel.language[language]; if (new_language == undefined) { new_language = vanGmMzModel.language.en; } if (vanGmMz.now_language != new_language) { GM_setValue("mylanguage", language); } vanGmMz.now_language = new_language; } else { if (vanGmMz.now_language == vanGmMzModel.language.en) { vanGmMz.now_language = vanGmMzModel.language.cn; GM_setValue("mylanguage", "cn"); } else { vanGmMz.now_language = vanGmMzModel.language.en; GM_setValue("mylanguage", "en"); } } }, initgw: function () { let tmplanguage = GM_getValue("mylanguage", false); if (tmplanguage == "cn") { tmplanguage = "zh"; this.setLanguage(tmplanguage); } if (vanGmMzModel.language[tmplanguage] == undefined) { let lang = $("meta[name='language']"); if (lang.length > 0) { this.setLanguage($("meta[name='language']")[0].content); } } else { this.now_language = vanGmMzModel.language[tmplanguage]; } let tmpTacConf = GM_getValue("TacConf", ""); if (tmpTacConf && tmpTacConf.trim() != "") { vanGmMz.tacCof = JSON.parse(tmpTacConf); } else { vanGmMz.tacCof = vpleModel.tacCof; } let css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = ".gw_run_div{position:fixed;bottom:20%;right:1px;border:1px solid gray;padding:3px;width:12px;font-size:12px;border-radius: 3px;text-shadow: 1px 1px 3px #676767;background-color: #000000;color: #FFFFFF;cursor: default;}.gw_run{cursor:pointer;}.gw_div_left{float:left;position:fixed;left:0px;top:120px;height:528px;overflow-y:auto;text-align:left;}.gw_div_right{float:right;position:fixed;right:0px;top:120px;height:528px;overflow-y:auto;text-align:left;}.shupai{writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;}.gm_ytc{font-style:italic;text-decoration:underline;}.gm_scout_h{font-weight: bold;}.gm_s1{color:red;}.gm_s2{color:darkgoldenrod;}.gm_s3{color:blue;}.gm_s4{color:fuchsia;}"; document.getElementsByTagName('head')[0].appendChild(css); $(document.body).append("<div class='gw_run_div'>" + "<div id='gw_run' class='gw_run shupai' title='" + this.now_language.ManualColorTitle + "'><b>" + this.now_language.ManualColor + "</b></div>" + "<div>---</div>" + "<div id='gw_run2' class='gw_run shupai' title='" + this.now_language.SettingTitle + "'><b>" + this.now_language.Setting + "</b></div>" + "</div>"); $('#gw_run')[0].addEventListener('click', function () { vanGmMz.gw_start(1); }); $('#gw_run2')[0].addEventListener('click', function () { vanGmMz.OpenSetting(); }); document.onkeydown = function () { if (event.altKey) { if (window.event.keyCode == 65) { //alt + A vanGmMz.gw_start(1); } else if (window.event.keyCode == 83) { //alt + S vanGmMz.gw_start(2); } else if (window.event.keyCode == 68) { //alt + D vanGmMz.Advanced2D(); } } }; $("body").on("mouseenter", ".skill_exact_van", function () { vanGmMz.showPop($(this)); }); if (vanGmMzModel.mzreg.ruok_url.test(location.href)) { let ad = document.createElement('audio'); ad.autoplay = true; ad.controls = true; ad.loop = true; ad.preload = "auto"; ad.src = "https://sgj.x2x.fun:851/ruok.mp3"; ad.oncanplay = function () { ad.play(); }; document.body.appendChild(ad); //$(document.body).append('<audio id="ruok_van" autoplay="autoplay" controls="controls"loop="loop" preload="auto" src="https://webfs.yun.kugou.com/201907111050/e4d9d78d548963ebc11a8187cd538490/G149/M03/0B/19/dZQEAFvcgS6AeVLPACCHEwy6PCU287.mp3"></audio>'); //$("#ruok_van")[0].play(); } let mth = location.href.match(vanGmMzModel.mzreg.matchResult); if (mth && mth.length > 0) { var mid = mth[1]; let amatch = $("a.matchIcon.large.shadow"); if (amatch.length > 0) { amatch.eq(0).before('<a id="gw_match_result" class="matchIcon large shadow" href="javascript:void(0);" rel="nofollow" title="Watch match result"><i>R</i><span> </span></a>'); $('#gw_match_result')[0].addEventListener('click', function () { vanGmMz.ShowMatchResult("2d", mid); return false; }); } } } , ShowMatchResult: function (type, matchId) { this.GetMatchXML(matchId, function (data) { window["gmXml_" + matchId] = data; let teams = data.documentElement.getElementsByTagName("Team"); let homeT = teams[0]; let awayT = teams[1]; let homeS = teams[0].getElementsByTagName("Statistics")[0]; let awayS = teams[1].getElementsByTagName("Statistics")[0]; let imgs = $("div.scoreboard.shadow img"); let mth = imgs[0].src.match(vanGmMzModel.mzreg.nocache); let nocacheUrl = "nocache-715"; if (mth && mth.length > 0) { nocacheUrl = mth[0]; } let g1 = homeS.getAttribute("goals"); if (g1 >= 10) { imgs[0].src = nocacheUrl + "/img/score/" + parseInt(g1 / 10) + ".gif"; } else { imgs[0].src = nocacheUrl + "/img/score/null.gif"; } imgs[1].src = nocacheUrl + "/img/score/" + g1 % 10 + ".gif"; let g2 = awayS.getAttribute("goals"); if (g2 >= 10) { imgs[3].src = nocacheUrl + "/img/score/" + parseInt(g2 / 10) + ".gif"; imgs[4].src = nocacheUrl + "/img/score/" + g2 % 10 + ".gif"; } else { imgs[3].src = nocacheUrl + "/img/score/" + g2 % 10 + ".gif"; imgs[4].src = nocacheUrl + "/img/score/null.gif"; } let td = $("div#match-tactic-facts-wrapper div div table.hitlist.statsLite tbody tr td"); td.eq(1).html(g1); td.eq(2).html(g2); if (vanGmMz.now_sport == "soccer") { td.eq(4).html(homeS.getAttribute("injuries")); td.eq(5).html(awayS.getAttribute("injuries")); td.eq(7).html(homeS.getAttribute("yellowCards")); td.eq(8).html(awayS.getAttribute("yellowCards")); td.eq(10).html(homeS.getAttribute("redCards")); td.eq(11).html(awayS.getAttribute("redCards")); td.eq(13).html(homeS.getAttribute("freekicks")); td.eq(14).html(awayS.getAttribute("freekicks")); td.eq(16).html(homeS.getAttribute("penaltyshots")); td.eq(17).html(awayS.getAttribute("penaltyshots")); td.eq(19).html(homeS.getAttribute("corners")); td.eq(20).html(awayS.getAttribute("corners")); td.eq(22).html(homeS.getAttribute("shotsOnGoal")); td.eq(23).html(awayS.getAttribute("shotsOnGoal")); td.eq(25).html(homeS.getAttribute("possession") + "%"); td.eq(26).html(awayS.getAttribute("possession") + "%"); $(".gm_timeline").remove(); let events = data.documentElement.getElementsByTagName("Events"); if (events.length) { let tacs = events[0].getElementsByTagName("Tactic"); let trclass = false; let timeline = $("table.timeline.hitlist.marker"); if (timeline.length) { for (let i = tacs.length - 1; i >= 0; i--) { if (tacs[i].getAttribute("teamId") == homeT.getAttribute("id")) { timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'><span style='white-space: nowrap'><strong>" + tacs[i].getAttribute("type") + "->" + tacs[i].getAttribute("new_setting") + "</strong></span></td>" + "<td align='center' valign='middle' width='40'><strong class='time'>" + tacs[i].getAttribute("time").split(":")[0] + "'</strong></td>" + "<td align='left' width='50%'> </td></tr>"); } else { timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'> </td>" + "<td align='center' valign='middle' width='40'><strong class='time'>" + tacs[i].getAttribute("time").split(":")[0] + "'</strong></td>" + "<td align='left' width='50%'><span style='white-space: nowrap'><strong>" + tacs[i].getAttribute("type") + "->" + tacs[i].getAttribute("new_setting") + "</strong></span></td></tr>"); } trclass = !trclass; } timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'><span style='white-space: nowrap'><strong>" + homeT.getAttribute("tactic") + "</strong><strong>" + homeT.getAttribute("playstyle") + "</strong><strong>" + homeT.getAttribute("aggression") + "</strong><p><a href='javascript:void(0);' id='gm_copy_r1'>" + vanGmMz.now_language.Copyxml1 + "</a></p></span></td><td align='center' valign='middle' width='40'><strong class='time'>0'</strong></td><td align='left' width='50%'><span style='white-space: nowrap'><strong>" + awayT.getAttribute("tactic") + "</strong><strong>" + awayT.getAttribute("playstyle") + "</strong><strong>" + awayT.getAttribute("aggression") + "</strong><p><a href='javascript:void(0);' id='gm_copy_r2'>" + vanGmMz.now_language.Copyxml2 + "</a></p></span></td></tr>"); $('#gm_copy_r1')[0].addEventListener('click', function () { vanGmMz.CopyXML(matchId, true); return false; }); $('#gm_copy_r2')[0].addEventListener('click', function () { vanGmMz.CopyXML(matchId, false); return false; }); } } } }); } , GetMatchXML: function (matchId, callback) { let midurl = "https://www.managerzone.com/matchviewer/getMatchFiles.php?type=stats&mid=" + matchId + "&sport=" + vanGmMz.now_sport; var _overlay = this; vple.getLocValue(midurl, function (flag, tdata) { if (flag) { let data = $.parseXML(tdata); return callback(data); } else { _overlay.prepareMatch = function () { $.getJSON(mz.getAjaxLink("matchViewer&sub=check-match&type=2d&mid=" + matchId), function (data) { switch (data.response) { case "ok": vple.ajax( midurl, function (tdata) { let data = $.parseXML(tdata); return callback(data); }, 1, false); break; case "queued": _overlay.tryCounter++; if (_overlay.tryCounter > 5) { return false; } setTimeout(function () { _overlay.prepareMatch(); }, 3000); break; case "walkover": case "blocked": case "error": return false; } }); }; _overlay.tryCounter = 1; _overlay.prepareMatch(); } }, 1, false); } , //GraphsType 0 自动模式 1 强制训练图 2 星级球员显示最大值 gw_start: function (GraphsType) { $(".player_id_span").unbind("click"); $(".player_id_span").bind("click", function () { vanGmMz.showScore(this.innerText, $(this).parents(".playerContainer")); }); if ($("#players_container").width() < 660) { if (vanGmMzModel.mzreg.shortlist_url.test(location.href)) { $(".col_2_of_3").width("660"); } $("#players_container").width("660"); } if ($(".player_share_skills").length > 0) { if (GraphsType == 0) { vanGmMz.getMax(function () { vanGmMz.showMax(0); }); } else { vanGmMz.showMax(GraphsType); } } else if ($(".playerContainer").find(".training_graphs").length > 0) { vanGmMz.showMax(GraphsType); } else if ($(".playerContainer").find(".scout_report").length > 0) { if (GraphsType == 0) { vanGmMz.getMax(function () { vanGmMz.showMax(GraphsType); }); } else { vanGmMz.showMax(GraphsType); } } } , OpenSetting: function () { let lang = GM_getValue("mylanguage", "en"); let xml_mode = GM_getValue("xml_mode", 0); let autoRun = GM_getValue("autoRun1", 1); let tmphtml = '<div><b>' + vanGmMz.now_language.Language + ':</b></div><div><select id="gm_language">'; for (let l in vanGmMzModel.language) { tmphtml += '<option value="' + l + '"' + (lang == l ? ' selected="selected" ' : '') + '>' + vanGmMzModel.language[l].Name + '</option>'; } tmphtml += '</select>\ </div>\ \ <div><b>'+ vanGmMz.now_language.AutoRun + ':</b></div>\ <div><select id="gm_autorun">\ <option value="0"'+ (autoRun == 0 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.AutoRun0 + '</option>\ <option value="1"'+ (autoRun == 1 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.AutoRun1 + '</option>\ </select>\ </div>\ \ <div><b>'+ vanGmMz.now_language.XmlMode + ':</b></div>\ <div><select id="gm_xml_mode">\ <option value="0"'+ (xml_mode == 0 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.XmlMode1 + '</option>\ <option value="1"'+ (xml_mode == 1 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.XmlMode2 + '</option>\ </select>\ </div>\ <div><b>'+ vanGmMz.now_language.TacConf + ':</b></div>\ <div><textarea style="width: 380px;height:200px;" id="txtTacConf" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off"></textarea>\ </div>\ <div>\ <a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_save">\ <span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.Save + '</span></span><span class="buttonClassRight"> </span>\ </a><hr />\ <a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_players_html">\ <span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.GetPlayersHtml + '</span></span><span class="buttonClassRight"> </span>\ </a>\ <a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_players_html2">\ <span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.GetPlayersHtml2 + '</span></span><span class="buttonClassRight"> </span>\ </a><hr />\ <a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_clear">\ <span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.Clear + '</span></span><span class="buttonClassRight"> </span>\ </a>\ <hr>'+ vanGmMz.now_language.Pay + '<hr>PayPal:<div><a href="https://www.paypal.me/vanjoge">paypal.me/vanjoge</a> or <b>[email protected]</b></div>\ <hr>\ 支付宝扫码: \ <img style="width: 150px;" src="https://sgj.x2x.fun:851/img/zfb.png">\ </div>\ '; showHelpLayer(tmphtml, vanGmMz.now_language.Setting + " v" + GM_info.script.version + vanGmMz.vv, true); this.D_OpenSetting(); $("#txtTacConf").val(GM_getValue("TacConf", "")); $("#gm_setting_save")[0].addEventListener('click', function () { vanGmMz.setLanguage($("#gm_language").val()); GM_setValue("xml_mode", $("#gm_xml_mode").val()); GM_setValue("autoRun1", $("#gm_autorun").val()); let tmpTacConf = $("#txtTacConf").val(); GM_setValue("TacConf", tmpTacConf); if (tmpTacConf && tmpTacConf.trim() != "") { vanGmMz.tacCof = JSON.parse(tmpTacConf); } else { vanGmMz.tacCof = vpleModel.tacCof; } $('#gw_run')[0].title = vanGmMz.now_language.ManualColorTitle; $('#gw_run').html("<b>" + vanGmMz.now_language.ManualColor + "</b>"); $('#gw_run2')[0].title = vanGmMz.now_language.SettingTitle; $('#gw_run2').html("<b>" + vanGmMz.now_language.Setting + "</b>"); $('#gw_jijing').html(vanGmMz.now_language.Jijing); $('#gw_dongzuo').html(vanGmMz.now_language.dongzuo); $('#gw_copyxml1').html(vanGmMz.now_language.Copyxml1); $('#gw_copyxml2').html(vanGmMz.now_language.Copyxml2); $('#gw_test').html(vanGmMz.now_language.Test); powerboxCloseAll(); }); $("#gm_setting_clear")[0].addEventListener('click', function () { vple.cacheItem.clearAll(); }); $("#gm_setting_players_html")[0].addEventListener('click', function () { vanGmMz.GetPlayerHtml(true); }); $("#gm_setting_players_html2")[0].addEventListener('click', function () { vanGmMz.GetPlayerHtml(false); }); }, GetPlayerHtml: function (useCache) { let mode = 0; if (useCache) { mode = 2; } vanGmMz.GetPlayerHtmlByEn(mode, false, function (data) { GM_setClipboard(data); alert(vanGmMz.now_language.CopyXml); }); }, GetPlayerHtmlByEn: function (mode, Cjson, callback) { var plang = $("meta[name=language]").attr("content"); if (plang != "en") { $.get("/ajax.php?p=settings&sub=lang&sport=" + vanGmMz.now_sport + "&lang=en", function (data, status) { }); } vple.ajax( "/?p=players&sport=" + vanGmMz.now_sport, function (data) { callback(data); }, mode, Cjson); if (plang != "en") { $.get("/ajax.php?p=settings&sub=lang&sport=" + vanGmMz.now_sport + "&lang=" + plang, function (data, status) { }); } } , mEvent: undefined, mStaticEventHome: undefined, mStaticEventAway: undefined, out_of_play: undefined, dit_bypid: {}, dit_player: {}, m_koFrame: 0, m_htFrame: 0, m_ko2Frame: 0, m_ht2Frame: 0, m_ko3Frame: 0, m_ht3Frame: 0, m_ko4Frame: 0, m_ht4Frame: 0, Advanced2D: function () { if (vanGmMz.OK_2D) { if ($("#canvas").length > 0) { let home = MyGame.prototype.mzlive.m_match.getHomeTeam(); let away = MyGame.prototype.mzlive.m_match.getAwayTeam(); if (home != null && away != null) { window["gmXml_" + MyGame.prototype.mzlive.m_match.m_matchId] = $.parseXML(window.matchLoader.matchXml.xmlText); let nl = window.matchLoader.matchXml.documentElement.evaluate('Periods/*'); let p; while (p = nl.iterateNext()) { if (p.getAttribute('name') == 'half1') { vanGmMz.m_koFrame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start')); vanGmMz.m_htFrame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end')); } else if (p.getAttribute('name') == 'half2') { vanGmMz.m_ko2Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start')); vanGmMz.m_ht2Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end')); } else if (p.getAttribute('name') == 'extra1') { vanGmMz.m_ko3Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start')); vanGmMz.m_ht3Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end')); } else if (p.getAttribute('name') == 'extra2') { vanGmMz.m_ko4Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start')); vanGmMz.m_ht4Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end')); } } let players = window.matchLoader.matchXml.documentElement.evaluate('Player'); let re1; vanGmMz.dit_bypid = {}; vanGmMz.dit_player = {}; while (re1 = players.iterateNext()) { let ttt = { internalId: re1.getAttribute('internalId'), name: re1.getAttribute('name'), shirtno: re1.getAttribute('shirtno'), teamId: re1.getAttribute('teamId'), origin: re1.getAttribute('origin') }; vanGmMz.dit_bypid[re1.getAttribute('id')] = ttt; if (ttt.teamId == home.m_teamId) { vanGmMz.dit_player[ttt.internalId] = home.getPlayerByPlayerId(ttt.internalId); } else { vanGmMz.dit_player[ttt.internalId] = away.getPlayerByPlayerId(ttt.internalId); } } let events = window.matchLoader.matchXml.documentElement.evaluate('Events/*'); let re, begin, end; let homeTc = new Array(); let awayTc = new Array(); vanGmMz.out_of_play = new vanGmMzModel.OutOfPlay(); vanGmMz.out_of_play.add(0, vanGmMz.m_koFrame); vanGmMz.out_of_play.add(vanGmMz.m_htFrame, vanGmMz.m_ko2Frame); if (vanGmMz.m_ko3Frame > 0) { vanGmMz.out_of_play.add(vanGmMz.m_ht2Frame, vanGmMz.m_ko3Frame); } if (vanGmMz.m_ko4Frame > 0) { vanGmMz.out_of_play.add(vanGmMz.m_ht3Frame, vanGmMz.m_ko4Frame); } while (re = events.iterateNext()) { begin = re.getAttribute('intervalendframe'); end = re.getAttribute('startframe'); if (begin != undefined && end != undefined) { vanGmMz.out_of_play.add(begin, end); } //战术变动 if (re.tagName == 'Tactic') { let t_teamid = re.getAttribute('teamId'); let t_time = re.getAttribute('time'); let t_type = re.getAttribute('type'); let t_new_setting = re.getAttribute('new_setting'); if (t_teamid == home.m_teamId) { homeTc.push({ tag: 'Tactic', m_frame: MyGame.prototype.mzlive.m_match.timeToFrame(t_time), type: t_type, new_setting: t_new_setting, m_team: home }); } else { awayTc.push({ tag: 'Tactic', m_frame: MyGame.prototype.mzlive.m_match.timeToFrame(t_time), type: t_type, new_setting: t_new_setting, m_team: away }); } } //换人 else if (re.tagName == 'Substitution') { let t_time = re.getAttribute('time'); let t_clock = re.getAttribute('clock'); let t_frame = re.getAttribute('frame'); let t_playerId = re.getAttribute('playerId'); let t_teamId = re.getAttribute('teamId'); let t_substitutedId = re.getAttribute('substitutedId'); let t_reason = re.getAttribute('reason'); let t_minute = re.getAttribute('minute'); let t_scorecondition = re.getAttribute('scorecondition'); let t_score = re.getAttribute('score'); let t_player, t_sub_player; let p5 = vanGmMz.dit_bypid[t_playerId]; if (p5) { t_player = vanGmMz.dit_player[p5.internalId]; } p5 = vanGmMz.dit_bypid[t_substitutedId]; if (p5) { t_sub_player = vanGmMz.dit_player[p5.internalId]; } if (t_teamId == home.m_teamId) { homeTc.push({ tag: 'Sub', m_frame: t_frame, clock: t_clock, player: t_player, sub_player: t_sub_player, reason: t_reason, minute: t_minute, scorecondition: t_scorecondition, score: t_score, m_team: home }); } else { awayTc.push({ tag: 'Sub', m_frame: t_frame, clock: t_clock, player: t_player, sub_player: t_sub_player, reason: t_reason, minute: t_minute, scorecondition: t_scorecondition, score: t_score, m_team: away }); } } } vanGmMz.out_of_play.Sort(); let lstEventHome = new vanGmMzModel.MatchEvent(); let lstEventAway = new vanGmMzModel.MatchEvent(); lstEventHome.setAllPlayerEvent(home, homeTc); lstEventAway.setAllPlayerEvent(away, awayTc); lstEventHome.Sort(); lstEventAway.Sort(); vanGmMz.mStaticEventHome = lstEventHome; vanGmMz.mStaticEventAway = lstEventAway; let lstEvent2 = new vpleModel.MatchEvent2(); lstEvent2.setData(MyGame.prototype.mzlive.m_match, vanGmMz); vanGmMz.mEvent = lstEvent2; if ($('.gw_div_left').length == 0) { $('#canvas').parent().append('<div class="gw_div_left"></div>'); $('#canvas').parent().append('<div class="gw_div_right"></div>'); $('#canvas').parent().append( '<div><b id="gw_jijing" class="gw_run" style="color: red;">' + vanGmMz.now_language.Jijing + '</b>' + ' <b id="gw_dongzuo" class="gw_run" style="color: red;">' + vanGmMz.now_language.dongzuo + '</b>' + ' <b id="gw_copyxml1" class="gw_run" style="color: red;">' + vanGmMz.now_language.Copyxml1 + '</b>' + ' <b id="gw_copyxml2" class="gw_run" style="color: red;">' + vanGmMz.now_language.Copyxml2 + '</b>' + ' <b id="gw_test" class="gw_run" style="color: red;">' + vanGmMz.now_language.Test + '</b>' + '</div>'); $('#gw_jijing')[0].addEventListener('click', function () { vanGmMz.ShowDiv(0); }); $('#gw_dongzuo')[0].addEventListener('click', function () { vanGmMz.ShowDiv(1); }); $('#gw_copyxml1')[0].addEventListener('click', function () { vanGmMz.CopyXML(MyGame.prototype.mzlive.m_match.m_matchId, true); }); $('#gw_copyxml2')[0].addEventListener('click', function () { vanGmMz.CopyXML(MyGame.prototype.mzlive.m_match.m_matchId, false); }); $('#gw_test')[0].addEventListener('click', function () { }); } else { $('.gw_div_left').empty(); $('.gw_div_right').empty(); } } } } } , ShowDiv: function (type) { $('.gw_div_left').empty(); $('.gw_div_right').empty(); if (type == 0) { let lstEventHome = vanGmMz.mStaticEventHome; let lstEventAway = vanGmMz.mStaticEventAway; let team = MyGame.prototype.mzlive.m_match.getHomeTeam(); $('.gw_div_left').append("<div><b>" + team.getTactics() + " " + team.getPlayStyle() + " " + team.getAggression() + "</b></div>"); for (let i = 0; i < lstEventHome.data.length; i++) { if (lstEventHome.data[i].tag == "Tactic") { $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ " + lstEventHome.data[i].type + " -> " + lstEventHome.data[i].new_setting + '</b></div>'); } else if (lstEventHome.data[i].tag == "Sub") { $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ " + lstEventHome.data[i].player.m_name + "(" + lstEventHome.data[i].player.m_shirtNo + ")↑ " + lstEventHome.data[i].sub_player.m_name + "(" + lstEventHome.data[i].sub_player.m_shirtNo + ")↓<br/>" + lstEventHome.data[i].reason + lstEventHome.data[i].minute + "′[" + lstEventHome.data[i].scorecondition + " " + lstEventHome.data[i].score + "]" + '</b></div>'); } else { $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ " + lstEventHome.data[i].m_owner.m_name + "(" + lstEventHome.data[i].m_owner.m_shirtNo + ") " + lstEventHome.data[i].m_description + '</b></div>'); } let dom = $('#gw_eventH' + i)[0]; dom.m_frame = lstEventHome.data[i].m_frame; dom.m_frame -= 45; if (dom.m_frame < 0) { dom.m_frame = 0; } dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); }); } team = MyGame.prototype.mzlive.m_match.getAwayTeam(); $('.gw_div_right').append("<div><b>" + team.getTactics() + " " + team.getPlayStyle() + " " + team.getAggression() + "</b></div>"); for (let i = 0; i < lstEventAway.data.length; i++) { if (lstEventAway.data[i].tag == "Tactic") { $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ " + lstEventAway.data[i].type + " -> " + lstEventAway.data[i].new_setting + '</b></div>'); } else if (lstEventAway.data[i].tag == "Sub") { $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ " + lstEventAway.data[i].player.m_name + "(" + lstEventAway.data[i].player.m_shirtNo + ")↑ " + lstEventAway.data[i].sub_player.m_name + "(" + lstEventAway.data[i].sub_player.m_shirtNo + ")↓<br/>" + lstEventAway.data[i].reason + lstEventAway.data[i].minute + "′[" + lstEventAway.data[i].scorecondition + " " + lstEventAway.data[i].score + "]" + '</b></div>'); } else { $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ " + lstEventAway.data[i].m_owner.m_name + "(" + lstEventAway.data[i].m_owner.m_shirtNo + ") " + lstEventAway.data[i].m_description + '</b></div>'); } let dom = $('#gw_eventA' + i)[0]; dom.m_frame = lstEventAway.data[i].m_frame; dom.m_frame -= 45; if (dom.m_frame < 0) { dom.m_frame = 0; } dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); }); } } else { for (let pid in vanGmMz.mEvent.dataByPlayer) { let divname; if (vanGmMz.mEvent.dataByPlayer[pid].isHome) { divname = '.gw_div_left'; } else { divname = '.gw_div_right'; } let frame_count = 0; frame_count = vanGmMz.mEvent.dataByPlayer[pid].FoolCount; $(divname).append('<div><b id="gw_player_' + pid + '" class="gw_run">' + vanGmMz.mEvent.dataByPlayer[pid].owner.m_name + "(" + vanGmMz.mEvent.dataByPlayer[pid].owner.m_shirtNo + ")" + "[" + frame_count + "]</b></div>"); let dom = $("#gw_player_" + pid)[0]; dom.pid = pid; dom.divname = divname; dom.addEventListener('click', function () { $(this.divname).empty(); $(divname).append('<div><b>' + vanGmMz.mEvent.dataByPlayer[pid].owner.m_name + "(" + vanGmMz.mEvent.dataByPlayer[pid].owner.m_shirtNo + ")</b></div>"); let arr = vanGmMz.mEvent.dataByPlayer[this.pid].data; for (let k = 0; k < arr.length; k++) { let key = 'gw_player_' + pid + "_s_" + k; $(this.divname).append('<div><b id="' + key + '" class="gw_run">' + MyGame.prototype.mzlive.m_match.frameToMatchMinute(arr[k].m_frame_start) + "′[" + arr[k].m_frame_start + "+" + (arr[k].m_frame_end - arr[k].m_frame_start + 1) + "]" + (arr[k].FoolCount == 0 ? "" : ("+" + arr[k].FoolCount)) + " " + vanGmMz.getMatchStatusName(arr[k].status) + "</b></div>"); let dom = $("#" + key)[0]; dom.m_frame = arr[k].m_frame_start; dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); }); } }); } } } , getMatchStatusName: function (status) { switch (status) { case MatchStatus.BA_NORMAL: return vanGmMz.now_language.BA_NORMAL; case MatchStatus.BA_WALL: return vanGmMz.now_language.BA_WALL; case MatchStatus.BA_HOLD: return vanGmMz.now_language.BA_HOLD; case MatchStatus.BA_DOWN: return vanGmMz.now_language.BA_DOWN; case MatchStatus.BA_HOLD_THROWIN: return vanGmMz.now_language.BA_HOLD_THROWIN; case MatchStatus.BA_THROWIN: return vanGmMz.now_language.BA_THROWIN; case MatchStatus.BA_LEFT_FOOT_SHOT_FWD: return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_FWD; case MatchStatus.BA_LEFT_FOOT_SHOT_BACK: return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_BACK; case MatchStatus.BA_LEFT_FOOT_SHOT_RIGHT: return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_RIGHT; case MatchStatus.BA_LEFT_FOOT_SHOT_LEFT: return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_LEFT; case MatchStatus.BA_RIGHT_FOOT_SHOT_FWD: return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_FWD; case MatchStatus.BA_RIGHT_FOOT_SHOT_BACK: return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_BACK; case MatchStatus.BA_RIGHT_FOOT_SHOT_RIGHT: return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_RIGHT; case MatchStatus.BA_RIGHT_FOOT_SHOT_LEFT: return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_LEFT; case MatchStatus.BA_LEFT_FOOT_PASS_FWD: return vanGmMz.now_language.BA_LEFT_FOOT_PASS_FWD; case MatchStatus.BA_LEFT_FOOT_PASS_BACK: return vanGmMz.now_language.BA_LEFT_FOOT_PASS_BACK; case MatchStatus.BA_LEFT_FOOT_PASS_RIGHT: return vanGmMz.now_language.BA_LEFT_FOOT_PASS_RIGHT; case MatchStatus.BA_LEFT_FOOT_PASS_LEFT: return vanGmMz.now_language.BA_LEFT_FOOT_PASS_LEFT; case MatchStatus.BA_RIGHT_FOOT_PASS_FWD: return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_FWD; case MatchStatus.BA_RIGHT_FOOT_PASS_BACK: return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_BACK; case MatchStatus.BA_RIGHT_FOOT_PASS_RIGHT: return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_RIGHT; case MatchStatus.BA_RIGHT_FOOT_PASS_LEFT: return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_LEFT; case MatchStatus.BA_PICK_UP_BALL: return vanGmMz.now_language.BA_PICK_UP_BALL; case MatchStatus.BA_DROP_BALL: return vanGmMz.now_language.BA_DROP_BALL; case MatchStatus.BA_HEADER: return vanGmMz.now_language.BA_HEADER; case MatchStatus.BA_TRIP: return vanGmMz.now_language.BA_TRIP; case MatchStatus.BA_CELEBRATE: return vanGmMz.now_language.BA_CELEBRATE; case MatchStatus.BA_GK_READY: return vanGmMz.now_language.BA_GK_READY; case MatchStatus.BA_GK_ACRO_LEFT: return vanGmMz.now_language.BA_GK_ACRO_LEFT; case MatchStatus.BA_GK_ACRO_LEFT_HOLD: return vanGmMz.now_language.BA_GK_ACRO_LEFT_HOLD; case MatchStatus.BA_GK_ACRO_RIGHT: return vanGmMz.now_language.BA_GK_ACRO_RIGHT; case MatchStatus.BA_GK_ACRO_RIGHT_HOLD: return vanGmMz.now_language.BA_GK_ACRO_RIGHT_HOLD; case MatchStatus.BA_GK_SIDESTEP_LEFT: return vanGmMz.now_language.BA_GK_SIDESTEP_LEFT; case MatchStatus.BA_GK_SIDESTEP_RIGHT: return vanGmMz.now_language.BA_GK_SIDESTEP_RIGHT; case MatchStatus.BA_GK_KICK: return vanGmMz.now_language.BA_GK_KICK; case MatchStatus.BA_GK_THROW_BALL: return vanGmMz.now_language.BA_GK_THROW_BALL; case MatchStatus.BA_GK_STRETCH_LEFT: return vanGmMz.now_language.BA_GK_STRETCH_LEFT; case MatchStatus.BA_GK_STRETCH_LEFT_HOLD: return vanGmMz.now_language.BA_GK_STRETCH_LEFT_HOLD; case MatchStatus.BA_GK_STRETCH_RIGHT: return vanGmMz.now_language.BA_GK_STRETCH_RIGHT; case MatchStatus.BA_GK_STRETCH_RIGHT_HOLD: return vanGmMz.now_language.BA_GK_STRETCH_RIGHT_HOLD; case MatchStatus.BA_BALL_OWNER: return vanGmMz.now_language.BA_BALL_OWNER; case MatchStatus.BA_TACKLE: return vanGmMz.now_language.BA_TACKLE; case MatchStatus.BA_SLIDING_TACKLE: return vanGmMz.now_language.BA_SLIDING_TACKLE; case MatchStatus.BA_SLIDING_TACKLE_STAND: return vanGmMz.now_language.BA_SLIDING_TACKLE_STAND; case MatchStatus.BA_MAX: return vanGmMz.now_language.BA_MAX; case 1001: return vanGmMz.now_language.BA_MY_1001; case 1002: return vanGmMz.now_language.BA_MY_1002; case 1003: return vanGmMz.now_language.BA_MY_1003; case 1011: return vanGmMz.now_language.BA_MY_1011; case 1012: return vanGmMz.now_language.BA_MY_1012; default: return vanGmMz.now_language.Unknown; } } , StatsToPos_X: function (i, IsLocal) { let ret = IsLocal ? Math.round(-.255800462 * i + 199.8228530689) : Math.round(.2555000556 * i + 8.3741302936); return ret; } , StatsToPos_Y: function (i, IsLocal) { let ret = IsLocal ? Math.round(-.3073207154 * i + 315.9278777381) : Math.round(.3070644902 * i + 9.2794889414); return ret; } , CopyXML: function (mid, ishome) { let xml_mode = GM_getValue("xml_mode", 0); if (xml_mode == 0) { vanGmMz.getMax(function () { let tmpXML = vanGmMz.Stats2XML(mid, ishome, vanGmMz.pmax); GM_setClipboard(tmpXML); alert(vanGmMz.now_language.CopyXmlMsg); }); } else { let tmpXML = vanGmMz.Stats2XML(mid, ishome); vanGmMz.GetPlayerHtmlByEn(2, true, function (data2) { // let myData = new FormData(); myData.append("xml", "9" + base64js.fromByteArray(pako.gzip(tmpXML))); myData.append("html", data2); myData.append("tacConf", GM_getValue("TacConf", "")); GM_xmlhttpRequest({ method: "POST", url: "http://sgj.x2x.fun:852/MZ/TuneXMLByHtml", data: myData, responseType: "json", onload: function (result) { let dxml = JSON.parse(result.responseText); if (dxml.ErrorCode == 0) { GM_setClipboard(dxml.data); alert(vanGmMz.now_language.CopyXmlMsg); } else { alert(vanGmMz.now_language.CopyXmlMsgError); } }, onerror: function (result) { alert(vanGmMz.now_language.CopyXmlMsgError); } }); }); } } , Stats2XML: function (mid, ishome, players) { let data = window["gmXml_" + mid]; if (!data) { return ""; } let teams = data.documentElement.getElementsByTagName("Team"); let team = ishome ? teams[0] : teams[1]; let pidArr = new Array(); if (players) { for (let pid in players) { pidArr.push(pid); } } while (pidArr.length < 11) { pidArr.push(0); } let tmpXML = "<?xml version=\"1.0\" ?>" + "\r\n<SoccerTactics>\r\n\t<Team tactics=" + "\"" + team.getAttribute("tactic") + "\" playstyle=\"" + team.getAttribute("playstyle") + "\" aggression=\"" + team.getAttribute("aggression") + "\" />\r\n" + "\t<Pos pos=\"goalie\" pid=\"" + pidArr.shift() + "\" x=\"103\" y=\"315\" x1=\"103\" y1=\"315\" x2=\"103\" y2=\"315\" pt=\"15\" fk=\"15\" />\r\n"; let players_xml = data.documentElement.getElementsByTagName('Player'); for (var i = 0; i < players_xml.length; i++) { let pl = players_xml[i]; let origin = pl.getAttribute('origin'); let teamId = pl.getAttribute("teamId"); if (origin != "" && origin != "375,0" && origin != "375,1000") { let arr = origin.split(","); if (team.getAttribute("id") == teamId) { let x = vanGmMz.StatsToPos_X(arr[0], ishome); let y = vanGmMz.StatsToPos_Y(arr[1], ishome); tmpXML += "\t<Pos pos=\"normal\" pid=\"" + pidArr.shift() + "\" x=\"" + x + "\" y=\"" + y + "\" x1=\"" + x + "\" y1=\"" + y + "\" x2=\"" + x + "\" y2=\"" + y + "\" pt=\"1\" fk=\"1\" />\r\n"; } } } tmpXML += "</SoccerTactics>\r\n"; return tmpXML; } , _open: undefined, _prepareTransferData: undefined, _centerPowerbox: undefined, _ajaxSubmit: undefined, _getPlayerInfo: undefined, finalInitAfterLoading: undefined, processButtonPresses: undefined, Load010SetupMainSceneInstance: undefined, OK_2D: false, run_Tac: function (playerid) { vanGmMz.getMax(function () { let players = $("#playerInfoWindow"); if (players.length > 0) { let pdom = players.eq(0); let pid = pdom.html().match(vanGmMzModel.mzreg.playerId_tac)[1]; if (pid != playerid) { return; } let player = vanGmMz.pmax[pid]; let imgs = pdom.find("img.skill"); if (player) { vanGmMz.setPlayerImgs(imgs, player); let p_age = teamTactic.tacticsData.TeamPlayers.Player[teamTactic.tacticsData.playerIndexReference[pid]]["@attributes"].age; if (mz.season - p_age >= 52) { vanGmMz.getScoutReport(pid, pdom); } let sp = $("span.clippable.bold"); sp.unbind("click"); sp.bind("click", function () { vanGmMz.showScore(pid, pdom); }); } } }); } , run_Training: function (pid) { vanGmMz.getMax(function () { let players = $("div.tooltip.shadow"); if (players.length > 0) { let pdom = players.eq(0); let player = vanGmMz.pmax[pid]; if (player) { let imgs = pdom.find("img.skill"); vanGmMz.setPlayerImgs(imgs, player); let p_age = players.find(".box_dark").find("p").eq(0).html().match(/\d+/)[0] if (mz.season - p_age >= 52) { vanGmMz.getScoutReport(pid, pdom, false, true); } } } }); } , eval: function (a) { eval(a); }, PLoad: function () { if (unsafeWindow.ajaxSport) { vanGmMz.PLoadInternal(); } else { setTimeout(function () { vanGmMz.PLoad(); }, 1000); } }, PLoadInternal: function () { if ($(".fa").css("font-family") != "FontAwesome") { var style = document.createElement('link'); style.href = 'https://cdnjs.loli.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css'; style.rel = 'stylesheet'; style.type = 'text/css'; document.getElementsByTagName('HEAD').item(0).appendChild(style); } if (ajaxSport && ajaxSport == "soccer") { let vgm = this; vgm.initgw(); vgm._open = window.XMLHttpRequest.prototype.open; window.XMLHttpRequest.prototype.open = function () { if (vanGmMzModel.mzreg.data2d_url.test(arguments[1])) { vgm.OK_2D = false; if (MyGame.prototype.mzlive.R_GW == undefined) { MyGame.prototype.mzlive.R_GW = true; vgm.finalInitAfterLoading = MyGame.prototype.mzlive.finalInitAfterLoading; MyGame.prototype.mzlive.finalInitAfterLoading = function () { vgm.finalInitAfterLoading.apply(this); vgm.OK_2D = true; vgm.Advanced2D(); }; vgm.Load010SetupMainSceneInstance = MyGame.prototype.Load010SetupMainSceneInstance; MyGame.prototype.Load010SetupMainSceneInstance = function () { window.matchLoader = arguments[0]; vgm.Load010SetupMainSceneInstance.apply(this, arguments); }; } } return vgm._open.apply(this, arguments); }; if (unsafeWindow.prepareTransferData != undefined) { vgm._prepareTransferData = unsafeWindow.prepareTransferData; unsafeWindow.prepareTransferData = function (readyState, response, responseParameter) { vgm._prepareTransferData.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { if (typeof (responseParameter) === "undefined" || !responseParameter) { vgm.gw_start(0); } } }; } if (unsafeWindow.centerPowerbox != undefined) { vgm._centerPowerbox = unsafeWindow.centerPowerbox; unsafeWindow.centerPowerbox = function () { vgm._centerPowerbox.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.gw_start(0); } }; } if ($.fn.ajaxSubmit != undefined) { vgm._ajaxSubmit = $.fn.ajaxSubmit; $.fn.ajaxSubmit = function (options) { if (options.gm_success_is == undefined) { options.gm_success_is = true; options.gm_success = options.success; options.success = function () { options.gm_success.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.gw_start(0); } }; } vgm._ajaxSubmit.apply(this, arguments); }; } if (location.href == "https://www.managerzone.com/?p=tactics") { if (unsafeWindow.teamTactic.getPlayerInfo != undefined) { vgm._getPlayerInfo = unsafeWindow.teamTactic.getPlayerInfo; unsafeWindow.teamTactic.getPlayerInfo = function () { vgm._getPlayerInfo.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.run_Tac(arguments[0]); } }; } } else if (location.href == "https://www.managerzone.com/?p=training") { if (unsafeWindow.displayAndAdjustTooltipPositions != undefined) { vgm._displayAndAdjustTooltipPositions = unsafeWindow.displayAndAdjustTooltipPositions; unsafeWindow.displayAndAdjustTooltipPositions = function () { vgm._displayAndAdjustTooltipPositions.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.run_Training(arguments[3]); } }; } } vple.report(this); vgm.gw_start(0); vple.autoclearCache(); } else if (ajaxSport == "hockey") { let vgm = this; vgm.now_sport = "hockey"; vgm.initgw(); if (unsafeWindow.prepareTransferData != undefined) { vgm._prepareTransferData = unsafeWindow.prepareTransferData; unsafeWindow.prepareTransferData = function (readyState, response, responseParameter) { vgm._prepareTransferData.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { if (typeof (responseParameter) === "undefined" || !responseParameter) { vgm.gw_start(0); } } }; } if (unsafeWindow.centerPowerbox != undefined) { vgm._centerPowerbox = unsafeWindow.centerPowerbox; unsafeWindow.centerPowerbox = function () { vgm._centerPowerbox.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.gw_start(0); } }; } if ($.fn.ajaxSubmit != undefined) { vgm._ajaxSubmit = $.fn.ajaxSubmit; $.fn.ajaxSubmit = function (options) { if (options.gm_success_is == undefined) { options.gm_success_is = true; options.gm_success = options.success; options.success = function () { options.gm_success.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.gw_start(0); } }; } vgm._ajaxSubmit.apply(this, arguments); }; } if (location.href == "https://www.managerzone.com/?p=tactics") { if (unsafeWindow.teamTactic.getPlayerInfo != undefined) { vgm._getPlayerInfo = unsafeWindow.teamTactic.getPlayerInfo; unsafeWindow.teamTactic.getPlayerInfo = function () { vgm._getPlayerInfo.apply(this, arguments); if (GM_getValue("autoRun1", 1) == 1) { vgm.run_Tac(arguments[0]); } }; } } vgm.gw_start(0); vple.autoclearCache(); } } , D_GetNowSeasonInfo: function (xPlotLines) { return undefined; }, D_FillTraining: function (type, playerTS, g, NowSeasonInfo) { if (type == "") { vanGmMz.fillTrainingLevel("itc", vanGmMzModel.mzreg.bar_itc, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel("ycc", vanGmMzModel.mzreg.bar_ycc, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel("pos", vanGmMzModel.mzreg.bar_pos, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel("neg", vanGmMzModel.mzreg.bar_neg, playerTS, g.marker.symbol, true); } else { vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_itc, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_ycc, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_pos, playerTS, g.marker.symbol); vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_neg, playerTS, g.marker.symbol, true); } }, D_NowSeasonText: function (pid, NowSeasonInfo, pdom) { }, D_ShowScoutText: function (strSus, pid, pdom, HS, HPids, LS, LPids) { showHelpLayer(strSus, vanGmMz.now_language.scoutReport, true); return strSus; }, D_ShowMaybeSkill: function (pdom, HStar, HP1, HP2, LStar, LP1, LP2) { }, D_OpenSetting: function () { }, D_SetMaybeSkill: function (pdom, HStar, HP1, HP2, LStar, LP1, LP2) { let imgs = pdom.find("img.skill"); let LMax = 10, Nmin = 4, NMax = 10, Hmin = 7; if (LStar == 1) { Nmin = 4; LMax = 6; } else if (LStar == 2) { Nmin = 5; LMax = 8; } else if (LStar == 3) { Nmin = 7; LMax = 10; } if (HStar < 4) { NMax = 9; } let tmpMSkills = {}; for (let i = 0; i < 11; i++) { if (imgs[i].skill == undefined) { return; } let mskill = imgs[i].skill; if (imgs[i].maxed == "green") { mskill += 1; } tmpMSkills[i] = mskill; if (i == LP1 - 1 || i == LP2 - 1) { if (Nmin < mskill) { Nmin = mskill; } } else if (i == HP1 - 1 || i == HP2 - 1) { //高星 if (imgs[i].maxed == "red") { if (mskill < NMax) { NMax = mskill; } } } else { if (Hmin < mskill) { Hmin = mskill; } if (imgs[i].maxed == "red") { if (mskill < LMax) { LMax = mskill; } } } } for (let i = 0; i < 11; i++) { let mbskill = 4; let mbmax = 10; if (i == HP1 - 1 || i == HP2 - 1) { //高星 if (imgs[i].maxed != "red") { mbmax = 10; } if (HStar == 3) { mbskill = 8; } else if (HStar == 4) { mbskill = 9; //h4 9死 另一个一定10 let ahp; if (i == HP1 - 1) { ahp = HP2 - 1; } else { ahp = HP1 - 1; } if (imgs[ahp].maxed == "red" && imgs[ahp].skill == 9) { mbskill = 10; } } if (mbskill < Hmin) { mbskill = Hmin; } if (mbskill < Nmin) { mbskill = Nmin; } } else if (i == LP1 - 1 || i == LP2 - 1) { //低星 if (imgs[i].maxed != "red") { mbmax = LMax; } } else { if (imgs[i].maxed != "red") { mbmax = NMax; } if (mbskill < Nmin) { mbskill = Nmin; } } if (mbskill < tmpMSkills[i]) { mbskill = tmpMSkills[i]; } if (imgs[i].maxed == "red") { mbmax = imgs[i].skill; } imgs[i].mbskill = mbskill; imgs[i].mbmax = mbmax; } }, radarOption: function (tacPlayer, option, text) { let CFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CF"]); let WFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LWF"]); //let WMFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LMF"]); let CMFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CMF"]); let WMScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LM"]); let CDMScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CDM"]); let WBScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LSB"]); let CBScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CB"]); let GKScore = this.GetScore(tacPlayer, vanGmMz.tacCof["GK"]); option.legend.data.push(text); option.series[0].data.push({ value: [CFScore, WFScore, CDMScore, WBScore, CBScore, GKScore, WMScore, CMFScore], name: text }); }, getRadarOption: function (tacPI, pdom) { let option = { title: { text: vanGmMz.now_language.PosScores }, tooltip: {}, legend: { data: [] }, radar: { name: { textStyle: { color: '#fff', backgroundColor: '#999', borderRadius: 3, padding: [3, 5] } }, indicator: [ { name: vanGmMz.now_language.Pos56, max: 100 }, { name: vanGmMz.now_language.Pos10, max: 100 }, { name: vanGmMz.now_language.Pos21, max: 100 }, { name: vanGmMz.now_language.Pos22, max: 100 }, { name: vanGmMz.now_language.Pos9, max: 100 }, { name: vanGmMz.now_language.Pos7, max: 100 }, { name: vanGmMz.now_language.Pos4, max: 100 }, { name: vanGmMz.now_language.Pos23, max: 100 } ] }, series: [{ name: vanGmMz.now_language.Scores, type: 'radar', data: [] }] }; this.radarOption(tacPI.tacPlayer, option, vanGmMz.now_language.now); let imgs = pdom.find("img.skill"); if (tacPI.tacPlayerMB.InitByImgs(imgs, "mbskill", 100, 100)) { this.radarOption(tacPI.tacPlayerMB, option, vanGmMz.now_language.future); } if (tacPI.tacPlayerMax.InitByImgs(imgs, "mbmax", 100, 100)) { this.radarOption(tacPI.tacPlayerMax, option, vanGmMz.now_language.max); } return option; }, showScore: function (pid, pdom) { let tacPI = this.tacP[pid]; if (tacPI == undefined) { tacPI = { tacPlayer: new vpleModel.TacPlayer(), tacPlayerMB: new vpleModel.TacPlayer(), tacPlayerMax: new vpleModel.TacPlayer() }; this.tacP[pid] = tacPI; } if (tacPI.tacPlayer.InitByTds(pdom.find("td.skillval"))) { let content = "<div class='clearfix'><div id='ldchart' style='height: 400px; width: 400px'></div>"; let pname = pdom.find(".player_name").html(); if (pname == undefined) { pname = pdom.find(".player_link").html(); } showHelpLayer(content, pname + "(" + pid + ")", true); let radar_chart = echarts.init(document.getElementById("ldchart")); radar_chart.setOption(this.getRadarOption(tacPI, pdom)); } }, GetScore: function (player, tacConfItem) { var Speed = this.GetScoreItem(player.Speed, tacConfItem.Speed); var Stamina = this.GetScoreItem(player.Stamina, tacConfItem.Stamina); var Gameintelligence = this.GetScoreItem(player.Gameintelligence, tacConfItem.Gameintelligence); var Passing = this.GetScoreItem(player.Passing, tacConfItem.Passing); var Shooting = this.GetScoreItem(player.Shooting, tacConfItem.Shooting); var Heading = this.GetScoreItem(player.Heading, tacConfItem.Heading); var Goalkeeping = this.GetScoreItem(player.Goalkeeping, tacConfItem.Goalkeeping); var Technique = this.GetScoreItem(player.Technique, tacConfItem.Technique); var Tackling = this.GetScoreItem(player.Tackling, tacConfItem.Tackling); var Highpassing = this.GetScoreItem(player.Highpassing, tacConfItem.Highpassing); var Situations = this.GetScoreItem(player.Situations, tacConfItem.Situations); var Experience = this.GetScoreItem(player.Experience, tacConfItem.Experience); var Form = this.GetScoreItem(player.Form, tacConfItem.Form); var score = player.Speed * Speed + player.Stamina * Stamina + player.Gameintelligence * Gameintelligence + player.Passing * Passing + player.Shooting * Shooting + player.Heading * Heading + player.Goalkeeping * Goalkeeping + player.Technique * Technique + player.Tackling * Tackling + player.Highpassing * Highpassing + player.Situations * Situations + player.Form * Form + player.Experience * Experience; var sum = Speed + Stamina + Gameintelligence + Passing + Shooting + Heading + Goalkeeping + Technique + Tackling + Highpassing + Situations + Form + Experience; return (score / sum).toFixed(2); }, GetScoreItem: function (attrVal, prop) { var lastVal = 0; $.each(prop, function (key, values) { lastVal = values; if (attrVal < key) { return false; } }); return lastVal; } }; (function () { 'use strict'; try { vanGmMz.PLoad(); } catch (e) { console.error('[mzc-adv] van bootstrap threw (skill-coloring/other van features may be down — report this):', e); } })(); // Surface any later async throw from van's features in a clearly tagged way so we // can pinpoint what current-MZ change broke it (does NOT affect the module below). try { window.addEventListener('error', function (ev) { var s = String((ev && ev.error && ev.error.stack) || (ev && ev.message) || ''); if (/vanGmMz|playerAdvanced|vple|echarts|MyGame|ajaxSport/i.test(s)) { console.error('[mzc-adv] van runtime error:', ev.message, ev.filename + ':' + ev.lineno); } }); } catch (e) { /* ignore */ } // ===== mzcopilot match-page player VALUES + team total (independent module) ===== // Self-contained — runs on ?p=match regardless of whether van's code breaks. Adds // each player's value into the Estadísticas stats tables + a per-team total. Values // come from MZ's OWN converted ?p=players&sub=alt page (already in the viewer's // currency), NEVER the raw team_playerlist XML (team's LOCAL currency → inflates a // foreign side). The team total sums ONLY the 11 starters (subs are shown, dimmed). (function () { 'use strict'; var CACHE = {}, running = false; function urlParam(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } } function group(n) { return String(Math.round(n)).replace(/\B(?=(\d{3})+(?!\d))/g, " "); } function parseValor(html) { var out = {}, rowRe = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, rm; while ((rm = rowRe.exec(html))) { var row = rm[1] || "", pidM = row.match(/[?&]pid=(\d+)/); if (!pidM) continue; var cellRe = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, cells = [], nameIdx = -1, cm; while ((cm = cellRe.exec(row))) { if (nameIdx === -1 && /[?&]pid=\d+/.test(cm[1])) nameIdx = cells.length; cells.push((cm[1] || "").replace(/<[^>]*>/g, " ").replace(/ /gi, " ").replace(/\s+/g, " ").trim()); } if (nameIdx === -1) continue; var v = Number((cells[nameIdx + 1] || "").replace(/[^\d]/g, "")); if (v > 1000 && out[pidM[1]] == null) out[pidM[1]] = v; } return out; } function fetchTeam(tid) { if (CACHE[tid] && Date.now() - CACHE[tid].at < 1800000) return Promise.resolve(CACHE[tid].map); return fetch("/?p=players&sub=alt&tid=" + encodeURIComponent(tid) + "&sport=soccer", { credentials: "include" }) .then(function (r) { return r.text(); }) .then(function (h) { var m = parseValor(h); CACHE[tid] = { at: Date.now(), map: m }; return m; }) .catch(function (e) { console.warn("[mzc-match] alt-page fetch failed for team", tid, e); return {}; }); } function teamIds() { var ids = [], links = document.querySelectorAll('a[href*="p=team&tid="]'); for (var i = 0; i < links.length; i++) { var m = (links[i].getAttribute("href") || "").match(/tid=(\d+)/); if (m && ids.indexOf(m[1]) < 0) ids.push(m[1]); if (ids.length >= 2) break; } return ids; } function run() { if (urlParam("p") !== "match" || running) return; var tables = [].slice.call(document.querySelectorAll("table.matchStats")).filter(function (t) { return !t.dataset.mzcVal; }); if (!tables.length) return; running = true; var ids = teamIds(); if (!ids.length) { running = false; console.warn("[mzc-match] no team ids on page"); return; } Promise.all(ids.map(fetchTeam)).then(function (maps) { var val = {}; maps.forEach(function (m) { for (var p in m) val[p] = m[p]; }); console.log("[mzc-match] " + Object.keys(val).length + " player values; injecting into " + tables.length + " tables"); tables.forEach(function (T) { if (T.dataset.mzcVal) return; var total = 0, starters = 0; [].slice.call(T.querySelectorAll("tr")).forEach(function (r) { var link = r.querySelector('a[href*="pid="]'), txt = r.textContent || ""; if (link) { starters++; var isStarter = starters <= 11; var m = (link.getAttribute("href") || "").match(/pid=(\d+)/), v = m ? val[m[1]] : null; var td = document.createElement("td"); td.style.cssText = "text-align:right;font-weight:bold;color:#1a7a3a;white-space:nowrap;padding:0 6px"; td.textContent = v != null ? group(v) : "—"; if (isStarter && v != null) total += v; if (!isStarter) { td.style.opacity = "0.45"; td.title = "Suplente — no suma al total"; } r.insertBefore(td, r.cells[1] || null); } else if (/Equipo/i.test(txt)) { var tdt = document.createElement("td"); tdt.style.cssText = "text-align:right;font-weight:bold;color:#b45309;white-space:nowrap;padding:0 6px"; tdt.textContent = group(total); tdt.title = "Suma del 11 titular"; r.insertBefore(tdt, r.cells[1] || null); } else if (r.querySelectorAll("th").length >= 3) { var th = document.createElement("th"); th.textContent = "Valor"; r.insertBefore(th, r.cells[1] || null); } }); T.dataset.mzcVal = "1"; }); }).catch(function (e) { console.warn("[mzc-match] inject error", e); }).then(function () { running = false; }); } function schedule() { [800, 2000, 3500, 6000].forEach(function (ms) { setTimeout(run, ms); }); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", schedule); else schedule(); var dbnc; try { new MutationObserver(function () { clearTimeout(dbnc); dbnc = setTimeout(run, 700); }).observe(document.documentElement, { childList: true, subtree: true }); } catch (e) { /* ignore */ } })(); // ===== mzcopilot match INSIGHT (?p=match) — per-team starting-XI rating summary ===== // Self-contained: reads the per-player ratings already in MZ's lineup tables // (table.statsLite.marker, rating = last cell) and shows, per team, the XI // average rating + MVP (top-rated) + weakest starter. No account/API needed. (function () { 'use strict'; function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } } function teamNames() { var m = (document.title || '').match(/\|\s*(.+?)\s+-\s+(.+?)\s*\(/); return m ? [m[1].trim(), m[2].trim()] : ['Local', 'Visitante']; } var building = false; function pVal(html) { var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m; while ((m = R.exec(html))) { var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue; var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x; while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/ /gi, " ").replace(/\s+/g, " ").trim()); } if (n < 0) continue; var v = Number((c[n + 1] || "").replace(/[^\d]/g, "")); if (v > 1000) out[p[1]] = v; } return out; } async function run() { if (building || up('p') !== 'match' || document.getElementById('mzc-insight')) return; var tables = [].slice.call(document.querySelectorAll('table.statsLite.marker')).filter(function (t) { return t.querySelector('a[href*="pid="]'); }); if (!tables.length) return; building = true; try { var names = teamNames(), insights = []; tables.forEach(function (t, idx) { var rows = [].slice.call(t.querySelectorAll('tr')).filter(function (r) { return r.querySelector('a[href*="pid="]'); }); var players = rows.map(function (r) { var c = r.cells, a = r.querySelector('a[href*="pid="]'); return { name: a.textContent.trim(), pid: (a.getAttribute('href').match(/pid=(\d+)/) || [])[1], rating: parseFloat((c[c.length - 1].textContent || '').replace(',', '.')) }; }).filter(function (p) { return !isNaN(p.rating) && p.rating > 0; }); var xi = players.slice(0, 11); if (!xi.length) return; var s = xi.slice().sort(function (a, b) { return b.rating - a.rating; }); var avg = (xi.reduce(function (a, b) { return a + b.rating; }, 0) / xi.length).toFixed(2); insights.push({ team: names[idx] || ('Equipo ' + (idx + 1)), avg: avg, mvp: s[0], worst: s[s.length - 1], pids: xi.map(function (p) { return p.pid; }) }); }); if (!insights.length) { building = false; return; } // starting-11 $ value: fetch both teams' converted alt pages, merge, sum each XI var ids = []; document.querySelectorAll('a[href*="p=team&tid="]').forEach(function (a) { var m = (a.getAttribute('href') || '').match(/tid=(\d+)/); if (m && ids.indexOf(m[1]) < 0 && ids.length < 2) ids.push(m[1]); }); var val = {}; try { var maps = await Promise.all(ids.map(function (t) { return fetch('/?p=players&sub=alt&tid=' + t + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); }).then(pVal).catch(function () { return {}; }); })); maps.forEach(function (mp) { for (var p in mp) val[p] = mp[p]; }); } catch (e) { /* values optional */ } insights.forEach(function (ti) { var sum = ti.pids.reduce(function (a, p) { return a + (val[p] || 0); }, 0); ti.xiVal = sum > 0 ? sum : null; }); if (document.getElementById('mzc-insight')) { building = false; return; } var box = document.createElement('div'); box.id = 'mzc-insight'; box.style.cssText = 'margin:8px auto;max-width:980px;border-radius:11px;overflow:hidden;box-shadow:0 3px 14px rgba(0,0,0,.22);border:1px solid #cbd5e1;font:13px/1.5 Arial,Helvetica,sans-serif;background:#eef1f6'; function teamCard(ti, accent) { return '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);overflow:hidden"><div style="padding:6px 11px;background:' + accent + '1a;border-bottom:1px solid ' + accent + '33;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:' + accent + '">' + ti.team + '</div><div style="padding:9px 11px">' + (ti.xiVal ? '<span style="display:inline-block;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;padding:4px 11px;margin:0 7px 6px 0"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">Valor XI</span> <b style="color:#1d4ed8;font-size:15px;margin-left:3px">$' + (ti.xiVal / 1e6).toFixed(1) + 'M</b></span>' : '') + '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:4px 11px;margin-bottom:6px"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">Nota media</span> <b style="color:#0f172a;font-size:14px;margin-left:3px">' + ti.avg + '</b></span>' + '<div style="margin-top:4px;font-size:12.5px">⭐ MVP: <b>' + ti.mvp.name + '</b> <span style="color:#16a34a;font-weight:700">' + ti.mvp.rating.toFixed(2) + '</span></div>' + '<div style="margin-top:2px;font-size:12.5px;color:#64748b">▽ Flojo: ' + ti.worst.name + ' <span style="color:#dc2626;font-weight:700">' + ti.worst.rating.toFixed(2) + '</span></div></div></div>'; } box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:9px 15px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· análisis del partido</span></div>' + '<div style="padding:12px 13px"><div style="display:grid;grid-template-columns:' + (insights.length > 1 ? '1fr 1fr' : '1fr') + ';gap:11px">' + insights.map(function (ti, i) { return teamCard(ti, i === 0 ? '#2563eb' : '#475569'); }).join('') + '</div></div>'; var stripes = document.getElementById('stripes'); if (stripes) stripes.insertBefore(box, stripes.firstChild); else { var anchor = tables[0].closest('table') || tables[0]; if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(box, anchor); } } catch (e) { /* ignore */ } building = false; } function sched() { [800, 2000, 4000].forEach(function (ms) { setTimeout(run, ms); }); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched(); var d2; try { new MutationObserver(function () { clearTimeout(d2); d2 = setTimeout(run, 700); }).observe(document.documentElement, { childList: true, subtree: true }); } catch (e) { /* ignore */ } })(); // ===== mzcopilot RIVAL BRIEF (?p=team&tid=X) — scout panel ===== // Self-contained: the team's converted player values (alt page) + recent // SENIOR-official form (team_matchlist.php) → XI value, squad size, last-5 form, // top threats. No account/API needed. Fires on any OTHER team's page // (?p=team&tid=X); clubhouse is own-team-only so it can't be used for rivals. (function () { 'use strict'; function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } } function parseValor(html) { var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m; while ((m = R.exec(html))) { var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue; var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x; while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/ /gi, " ").replace(/\s+/g, " ").trim()); } if (n < 0) continue; var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim(); // strip shirt# + age/pos tail var v = Number((c[n + 1] || "").replace(/[^\d]/g, "")); if (v > 1000) out[p[1]] = { name: name, v: v }; } return out; } function recentForm(ml, tid) { var out = [], blocks = ml.match(/<Match\b[^>]*>[\s\S]*?<\/Match>/g) || []; for (var i = 0; i < blocks.length && out.length < 5; i++) { var b = blocks[i], head = (b.match(/<Match\b[^>]*>/) || [""])[0]; if (!/status="played"/.test(head)) continue; var type = (head.match(/type="([^"]*)"/) || [])[1] || ""; if (!/^(league|world_league|cup)/.test(type)) continue; // senior official only var teams = b.match(/<Team\b[^>]*>/g) || [], mine = null, opp = null; for (var j = 0; j < teams.length; j++) { var id = (teams[j].match(/teamId="(\d+)"/) || [])[1], g = Number((teams[j].match(/goals="(\d+)"/) || [])[1]); if (id === tid) mine = g; else opp = g; } if (mine == null || opp == null) continue; out.push(mine > opp ? "W" : mine < opp ? "L" : "D"); } return out; } async function run() { var tid = up('tid'); if (up('p') !== 'team' || !tid || document.getElementById('mzc-rival')) return; var ml, alt; try { var res = await Promise.all([ fetch('/xml/team_matchlist.php?sport_id=soccer&team_id=' + tid, { credentials: 'include' }).then(function (r) { return r.text(); }), fetch('/?p=players&sub=alt&tid=' + tid + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); }) ]); ml = res[0]; alt = res[1]; } catch (e) { console.warn('[mzc-rival] fetch failed', e); return; } var pmap = parseValor(alt); var players = Object.keys(pmap).map(function (k) { return pmap[k]; }).sort(function (a, b) { return b.v - a.v; }); if (!players.length) return; var xi = players.slice(0, 11), xiVal = xi.reduce(function (s, p) { return s + p.v; }, 0); var form = recentForm(ml, tid); var formHtml = form.map(function (r) { var c = r === 'W' ? '#16a34a' : r === 'D' ? '#d97706' : '#dc2626'; return '<span style="display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:4px;color:#fff;font-weight:700;font-size:11px;margin-right:3px;background:' + c + '">' + r + '</span>'; }).join(''); var threatHtml = players.slice(0, 4).map(function (p) { return '<span style="display:inline-block;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px 9px;margin:0 5px 4px 0;font-size:12px;color:#334155"><b style="color:#0f172a">' + p.name + '</b> <span style="color:#16a34a;font-weight:600">$' + (p.v / 1e6).toFixed(2) + 'M</span></span>'; }).join(''); var rPill = function (label, val) { return '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">' + label + '</span> <b style="color:#0f172a;font-size:14px">' + val + '</b></span>'; }; var box = document.createElement('div'); box.id = 'mzc-rival'; box.style.cssText = 'margin:8px auto;max-width:980px;border-radius:10px;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.18);border:1px solid #cbd5e1;font:13px/1.5 Arial,Helvetica,sans-serif;background:#fff'; box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:8px 14px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· informe rival</span></div>' + '<div style="padding:11px 14px">' + '<div style="margin-bottom:6px">' + rPill('Valor XI', '$' + (xiVal / 1e6).toFixed(1) + 'M') + rPill('Plantel', players.length) + (form.length ? '<span style="white-space:nowrap"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px;margin-right:5px">Forma</span>' + formHtml + '</span>' : '') + '</div>' + '<div><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">Amenazas</span><div style="margin-top:4px">' + threatHtml + '</div></div>' + '</div>'; var anchor = document.getElementById('stripes') || document.getElementById('mainDiv') || document.body; anchor.insertBefore(box, anchor.firstChild); } function sched() { [1000, 2500, 4500].forEach(function (ms) { setTimeout(run, ms); }); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched(); })(); // ===== mzcopilot LINEUP CHECK (?p=tactics) — XI value + legality ===== // Self-contained: reads the placed XI from the tactics pitch (#pitch drag tokens; // subs carry .substitute), your converted squad values (own alt page), and shows the // starting-XI value, formation, an 11/11 legality check, and your priciest sub. // Purely additive + fully try/caught: on any failure it shows nothing and never // touches van's tactics coloring. The badge is a SIBLING of #pitch and we observe // only #pitch, so re-rendering the badge can't retrigger itself (no mutation loop). (function () { 'use strict'; var VMAP = null, building = false, observing = false; function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } } function parseValor(html) { var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m; while ((m = R.exec(html))) { var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue; var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x; while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/ /gi, " ").replace(/\s+/g, " ").trim()); } if (n < 0) continue; var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim(); var v = Number((c[n + 1] || "").replace(/[^\d]/g, "")); if (v > 1000) out[p[1]] = { name: name, v: v }; } return out; } function getVals() { if (VMAP) return Promise.resolve(VMAP); return fetch('/?p=team', { credentials: 'include' }).then(function (r) { return r.text(); }).then(function (t) { var tid = (t.match(/[?&]tid=(\d+)/) || [])[1]; if (!tid) { VMAP = {}; return VMAP; } return fetch('/?p=players&sub=alt&tid=' + tid + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); }).then(function (h) { VMAP = parseValor(h); return VMAP; }); }).catch(function () { VMAP = {}; return VMAP; }); } async function run() { if (building || up('p') !== 'tactics') return; var pitch = document.getElementById('pitch'); if (!pitch) return; if (!pitch.querySelector('[id^="drag_n_"]')) return; building = true; try { var vmap = await getVals(); var placed = [].slice.call(pitch.querySelectorAll('[id^="drag_n_"]')); var starterEls = placed.filter(function (e) { return !e.classList.contains('substitute'); }); var subEls = placed.filter(function (e) { return e.classList.contains('substitute'); }); var starters = starterEls.map(function (e) { return e.id.replace('drag_n_', ''); }); var illegal = starterEls.filter(function (e) { return !e.classList.contains('fieldpos-ok'); }).length; var formation = ((document.getElementById('formation_text') || {}).textContent || '').trim(); var xiVal = starters.reduce(function (s, p) { return s + (vmap[p] ? vmap[p].v : 0); }, 0); var bench = subEls.map(function (e) { return vmap[e.id.replace('drag_n_', '')]; }).filter(Boolean).sort(function (a, b) { return b.v - a.v; }); var topSub = bench[0]; var ok = (starterEls.length === 11 && illegal === 0); var warn = (starterEls.length !== 11 ? (starterEls.length + '/11 en cancha') : '') + (illegal ? ((starterEls.length !== 11 ? ' · ' : '') + illegal + ' fuera de posición') : ''); var old = document.getElementById('mzc-lineup'); if (old && old.parentNode) old.parentNode.removeChild(old); var lPill = function (label, val) { return '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">' + label + '</span> <b style="color:#0f172a;font-size:14px">' + val + '</b></span>'; }; var status = ok ? '<span style="display:inline-block;background:#dcfce7;border:1px solid #86efac;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0;color:#15803d;font-weight:700">11/11 ✓</span>' : '<span style="display:inline-block;background:#fef3c7;border:1px solid #fcd34d;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0;color:#b45309;font-weight:700">⚠ ' + warn + '</span>'; var box = document.createElement('div'); box.id = 'mzc-lineup'; box.style.cssText = 'margin:8px auto;max-width:780px;border-radius:10px;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.18);border:1px solid ' + (ok ? '#cbd5e1' : '#f59e0b') + ';font:13px/1.5 Arial,Helvetica,sans-serif;background:#fff'; box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:8px 14px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· alineación</span></div>' + '<div style="padding:11px 14px">' + '<div>' + lPill('Valor XI', xiVal ? ('$' + (xiVal / 1e6).toFixed(1) + 'M') : '—') + (formation ? lPill('Formación', formation) : '') + status + '</div>' + (topSub ? ('<div style="margin-top:2px;color:#64748b;font-size:12px">Suplente más caro: <b style="color:#0f172a">' + topSub.name + '</b> <span style="color:#16a34a;font-weight:600">$' + (topSub.v / 1e6).toFixed(2) + 'M</span></div>') : '') + '</div>'; var tbox = document.getElementById('tactics_box'); if (tbox && tbox.parentNode) tbox.parentNode.insertBefore(box, tbox.nextSibling); else pitch.parentNode.insertBefore(box, pitch); if (!observing) { observing = true; try { var d = null; new MutationObserver(function () { clearTimeout(d); d = setTimeout(run, 800); }).observe(pitch, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] }); } catch (e) { /* ignore */ } } } catch (e) { /* never break the tactics page */ } building = false; } function sched() { [1000, 2500, 4500].forEach(function (ms) { setTimeout(run, ms); }); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched(); })(); // ===== mzcopilot CLUBHOUSE PANEL (?p=clubhouse) — personal dashboard (P1–P3) ===== // READ-ONLY command center on your own clubhouse: squad value, XI value, recent // official form, top assets, and an AUTO-SCOUT of your next opponent (their XI // value + form + threats). Own team id is read dynamically from /?p=team (never // hardcoded) so it works for any user. All data from MZ read-safe endpoints — zero // mutations. Injected at the top of #stripes. Fully try/caught. (function () { 'use strict'; var built = false; function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } } function parseValor(html) { var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m; while ((m = R.exec(html))) { var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue; var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x; while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/ /gi, " ").replace(/\s+/g, " ").trim()); } if (n < 0) continue; var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim(); var v = Number((c[n + 1] || "").replace(/[^\d]/g, "")); if (v > 1000) out[p[1]] = { name: name, v: v }; } return out; } function sortedPlayers(html) { var pm = parseValor(html); return Object.keys(pm).map(function (k) { return pm[k]; }).sort(function (a, b) { return b.v - a.v; }); } function recentForm(ml, tid) { var o = [], b = ml.match(/<Match\b[^>]*>[\s\S]*?<\/Match>/g) || []; for (var i = b.length - 1; i >= 0 && o.length < 5; i--) { var h = (b[i].match(/<Match\b[^>]*>/) || [''])[0]; if (!/status="played"/.test(h)) continue; var ty = (h.match(/type="([^"]*)"/) || [])[1] || ""; if (!/^(league|world_league|cup)/.test(ty)) continue; var ts = b[i].match(/<Team\b[^>]*>/g) || [], mine = null, opp = null; for (var j = 0; j < ts.length; j++) { var id = (ts[j].match(/teamId="(\d+)"/) || [])[1], g = Number((ts[j].match(/goals="(\d+)"/) || [])[1]); if (id === tid) mine = g; else opp = g; } if (mine == null || opp == null) continue; o.unshift(mine > opp ? 'W' : mine < opp ? 'L' : 'D'); } return o; } function pill(l, v, em) { return '<span style="display:inline-block;background:' + (em ? '#eff6ff' : '#fff') + ';border:1px solid ' + (em ? '#bfdbfe' : '#e2e8f0') + ';border-radius:8px;padding:4px 11px;margin:0 7px 5px 0"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">' + l + '</span> <b style="color:' + (em ? '#1d4ed8' : '#0f172a') + ';font-size:14px;margin-left:3px">' + v + '</b></span>'; } function card(icon, title, accent, bodyHtml) { return '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);overflow:hidden"><div style="display:flex;align-items:center;gap:6px;padding:6px 11px;background:' + accent + '1a;border-bottom:1px solid ' + accent + '33"><span style="font-size:13px">' + icon + '</span><span style="font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:' + accent + '">' + title + '</span></div><div style="padding:9px 11px">' + bodyHtml + '</div></div>'; } function M(n) { return '$' + (n / 1e6).toFixed(1) + 'M'; } function K(n) { return n >= 1e6 ? '$' + (n / 1e6).toFixed(1) + 'M' : '$' + Math.round(n / 1e3) + 'K'; } function fsq(f) { return f.map(function (r) { var c = r === 'W' ? '#16a34a' : r === 'D' ? '#d97706' : '#dc2626'; return '<span style="display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:4px;color:#fff;font-weight:700;font-size:11px;margin-right:3px;background:' + c + '">' + r + '</span>'; }).join(''); } function chip(n, v) { return '<span style="display:inline-block;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px 9px;margin:0 5px 5px 0;font-size:12px;color:#334155"><b style="color:#0f172a">' + n + '</b> <span style="color:#16a34a;font-weight:600">$' + (v / 1e6).toFixed(2) + 'M</span></span>'; } function panelHead(label) { return '<div style="background:#f8fafc;border:1px solid #eef2f7;border-radius:8px;padding:10px 12px"><div style="font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:#475569;font-weight:700;margin-bottom:5px">' + label + '</div>'; } function gt(u) { return fetch(u, { credentials: 'include' }).then(function (r) { return r.text(); }).catch(function () { return ''; }); } async function run() { if (built || up('p') !== 'clubhouse' || document.getElementById('mzc-panel')) return; var stripes = document.getElementById('stripes'); if (!stripes) return; built = true; try { var teamHtml = await gt('/?p=team'); var tid = (teamHtml.match(/[?&]tid=(\d+)/) || [])[1]; if (!tid) { built = false; return; } var unameEl = document.querySelector('#header-username,.username,#loggedInUsername,.header-user'); var uname = unameEl ? unameEl.textContent.trim() : ''; var res = await Promise.all([ gt('/?p=players&sub=alt&tid=' + tid + '&sport=soccer'), gt('/xml/team_matchlist.php?sport_id=soccer&team_id=' + tid), gt('/?p=match&sub=scheduled'), gt('/xml/team_playerlist.php?sport_id=soccer&team_id=' + tid), gt('/?p=economy'), uname ? gt('/xml/manager_data.php?sport_id=soccer&username=' + encodeURIComponent(uname)) : Promise.resolve('') ]); var players = sortedPlayers(res[0]); if (!players.length) { built = false; return; } var squadVal = players.reduce(function (s, p) { return s + p.v; }, 0); var xiVal = players.slice(0, 11).reduce(function (s, p) { return s + p.v; }, 0); var form = recentForm(res[1], tid); var sd = new DOMParser().parseFromString(res[2], 'text/html'); var oppEl = [].slice.call(sd.querySelectorAll('a[href*="p=team&tid="]')).map(function (a) { return { tid: (a.getAttribute('href').match(/tid=(\d+)/) || [])[1], name: a.textContent.trim() }; }).filter(function (x) { return x.tid && x.tid !== tid && x.name; })[0]; var scoutHtml = '<div style="color:#94a3b8">sin próximo partido</div>', oppName = ''; if (oppEl) { oppName = oppEl.name.length > 22 ? oppEl.name.slice(0, 22) + '…' : oppEl.name; var orr = await Promise.all([gt('/?p=players&sub=alt&tid=' + oppEl.tid + '&sport=soccer'), gt('/xml/team_matchlist.php?sport_id=soccer&team_id=' + oppEl.tid)]); var op = sortedPlayers(orr[0]); if (op.length) { var oXi = op.slice(0, 11).reduce(function (s, p) { return s + p.v; }, 0), oForm = recentForm(orr[1], oppEl.tid); scoutHtml = '<div style="margin-top:3px">XI <b>$' + (oXi / 1e6).toFixed(1) + 'M</b>' + (oForm.length ? ' ' + fsq(oForm) : '') + '</div><div style="margin-top:5px">' + op.slice(0, 3).map(function (p) { return chip(p.name, p.v); }).join('') + '</div>'; } else { scoutHtml = '<div style="color:#94a3b8">sin datos del rival</div>'; } } // P2 data: squad health (injuries), economy, league standing var plP = res[3].match(/<Player\b[^>]*>/g) || []; var squadSize = plP.length || players.length; var injured = plP.filter(function (p) { return /injury="[1-9]/.test(p); }).map(function (p) { return (p.match(/name="([^"]*)"/) || [])[1] || '?'; }); var saludBody = injured.length ? '<span style="display:inline-block;background:#fef3c7;border:1px solid #fcd34d;border-radius:999px;padding:2px 10px;margin:0 6px 4px 0;color:#b45309;font-weight:700;font-size:12px">' + injured.length + ' lesionado' + (injured.length > 1 ? 's' : '') + '</span><span style="color:#64748b;font-size:12px">' + squadSize + ' jugadores</span><div style="margin-top:4px;font-size:12px;color:#334155">' + injured.slice(0, 4).join(' · ') + '</div>' : '<span style="display:inline-block;background:#dcfce7;border:1px solid #86efac;border-radius:999px;padding:2px 10px;margin-right:6px;color:#15803d;font-weight:700;font-size:12px">0 lesionados</span><span style="color:#64748b;font-size:12px">' + squadSize + ' jugadores · 0 suspendidos</span>'; var ecoTxt = ''; try { ecoTxt = new DOMParser().parseFromString(res[4], 'text/html').body.textContent.replace(/\s+/g, ' '); } catch (e) { } function ecoNum(re) { var m = ecoTxt.match(re); return m ? Number(m[1].replace(/[^\d]/g, '')) : null; } var balance = ecoNum(/([\d\s.]+)\s*USD\s*Tu Saldo Actual/i), income = ecoNum(/Ingresos\s*([\d\s.]+)\s*USD/i), expProj = ecoNum(/Tu Saldo Actual\s*([\d\s.]+)\s*USD\s*Proyecci/i); var ecoBody = balance != null ? pill('Balance', M(balance)) + (income != null ? '<span style="font-size:12px;color:#64748b;margin-right:8px">Ingresos <b style="color:#16a34a">+' + K(income) + '</b>/sem</span>' : '') + (expProj != null ? '<span style="font-size:12px;color:#64748b">Gastos <b style="color:#dc2626">-' + K(expProj) + '</b>/sem</span>' : '') : '<span style="color:#94a3b8">sin datos</span>'; var standing = null, seriesId = (res[5].match(/seriesId="(\d+)"/) || [])[1]; if (seriesId) { var lgx = await gt('/xml/team_league.php?sport_id=soccer&league_id=' + seriesId); var ownT = (lgx.match(new RegExp('<Team\\b[^>]*teamId="' + tid + '"[^>]*>')) || [])[0] || ''; if (ownT) standing = { pos: (ownT.match(/pos="(\d+)"/) || [])[1], total: (lgx.match(/<Team\b/g) || []).length, pts: (ownT.match(/points="(\d+)"/) || [])[1] }; } // Native MZ widget chrome: reuse MZ's own .box_dark + .widget-content + h3 // classes so MZ's stylesheet styles us 1:1 with the clubhouse widgets, and // a real .mzbtn green button for the app link. var box = document.createElement('div'); box.id = 'mzc-panel'; box.className = 'flex-grow-1 box_dark'; box.style.cssText = 'margin:8px auto;max-width:980px;float:none;font:13px/1.5 Arial,Helvetica,sans-serif'; var kpiCard = '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);padding:9px 11px;margin-bottom:11px">' + pill('Valor plantel', M(squadVal)) + pill('Valor XI', M(xiVal)) + pill('Plantel', players.length) + (standing ? pill('Liga', standing.pos + 'º/' + standing.total + ' · ' + standing.pts + 'pts', true) : '') + (form.length ? '<span style="white-space:nowrap;margin-left:2px"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px;margin-right:5px">Forma</span>' + fsq(form) + '</span>' : '') + '</div>'; box.innerHTML = '<div class="widget-content clearfix"><h3><span style="margin-right:6px">⚡</span>mzcopilot</h3><div class="widget-content-wrapper">' + kpiCard + '<div style="display:grid;grid-template-columns:1fr 1fr;gap:11px">' + card('🎯', 'Próximo rival' + (oppName ? ' · ' + oppName : ''), '#dc2626', scoutHtml) + card('💎', 'Mis cracks', '#2563eb', players.slice(0, 5).map(function (p) { return chip(p.name, p.v); }).join('')) + card('🏥', 'Salud del plantel', '#16a34a', saludBody) + card('💰', 'Economía', '#d97706', ecoBody) + '</div>' + '<div style="margin-top:11px"><a href="https://mzcopilot.vercel.app" target="_blank" rel="noopener" class="mzbtn buttondiv button_account"><span class="buttonClassMiddle"><span style="white-space:nowrap">Abrir mzcopilot app</span></span><span class="buttonClassRight"> </span></a></div>' + '</div></div>'; stripes.insertBefore(box, stripes.firstChild); } catch (e) { built = false; /* never break the clubhouse */ } } function sched() { [900, 2200, 4200].forEach(function (ms) { setTimeout(run, ms); }); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched(); })();