您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Trophymanager: show main events of the match. So you can easy research tactics of other clubs and your tactics rules happened as expected or not.
// ==UserScript== // @name TMVN Match Event // @version 5 // @description Trophymanager: show main events of the match. So you can easy research tactics of other clubs and your tactics rules happened as expected or not. // @namespace https://trophymanager.com // @include https://trophymanager.com/matches/* // ==/UserScript== (function () { 'use strict'; const MENTALITY_MAP = new Map() .set("1", "Very Defensive") .set("2", "Defensive") .set("3", "Slightly Defensive") .set("4", "Normal") .set("5", "Slightly Attacking") .set("6", "Attacking") .set("7", "Very Attacking"); const STYLE_MAP = new Map() .set("1", "Balanced") .set("2", "Direct") .set("3", "Wings") .set("4", "Shortpassing") .set("5", "Long Balls") .set("6", "Through Balls"); const GOAL_STYLE_MAP = new Map() .set("p_s", "Penalty") .set("kco", "GK Counter") .set("klo", "GK Kick") .set("doe", "Conner") .set("cou", "Counter/Direct") .set("dir", "Freekick") .set("win", "Wing Attack") .set("sho", "Short Pass") .set("lon", "Long Ball") .set("thr", "Through Ball"); const FOCUS_MAP = new Map() .set("1", "Balanced") .set("2", "Left") .set("3", "Center") .set("4", "Right"); const EVENT_TYPE = { GOAL: 'goal', YELLOW_CARD: 'yellow', RED_CARD: 'red', MENTALITY: 'mentality', STYLE: 'style', POSITION: 'position', SUBTITION: 'subtition', INJURY: 'injury' } var mainEventHTML = ""; var matchUrl = location.href.split('/'); var matchId, url; if (isNaN(matchUrl[4])) { matchId = matchUrl[5]; url = 'https://trophymanager.com/ajax/match.ajax.php?id=nt' + matchId; } else { matchId = matchUrl[4]; url = 'https://trophymanager.com/ajax/match.ajax.php?id=' + matchId; } var xhr = new XMLHttpRequest(); var homeStartStyle, homeStartMentality, homeFocus, awayStartStyle, awayStartMentality, awayFocus; xhr.open('GET', url, true); xhr.send(); xhr.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { var data = JSON.parse(this.responseText); var report = data.report; if (Object.keys(report).length <= 3) { return; //because don't have datas of match } homeStartStyle = data.match_data.attacking_style.home; if (homeStartStyle == "0") { homeStartStyle = "1"; //bug of TM } awayStartStyle = data.match_data.attacking_style.away; if (awayStartStyle == "0") { awayStartStyle = "1"; //bug of TM } homeStartMentality = data.match_data.mentality.home.toString(); awayStartMentality = data.match_data.mentality.away.toString(); homeFocus = data.match_data.focus_side.home; awayFocus = data.match_data.focus_side.away; var homeClubId = data.club.home.id; var awayClubId = data.club.away.id; var homeLineup = data.lineup.home; var awayLineup = data.lineup.away; var homePlayerIds = Object.getOwnPropertyNames(homeLineup); var awayPlayerIds = Object.getOwnPropertyNames(awayLineup); var homePlayer = new Map(), awayPlayer = new Map(); homePlayerIds.forEach((playerId) => { homePlayer.set(playerId, homeLineup[playerId].name); }); awayPlayerIds.forEach((playerId) => { awayPlayer.set(playerId, awayLineup[playerId].name); }); var homeGoal = 0, awayGoal = 0; var eventReport = []; Object.keys(report).forEach(function (key, index) { var minuteArr = report[key]; for (var i = 0; i < minuteArr.length; i++) { var paramArr = minuteArr[i].parameters; if (paramArr) { for (var j = 0; j < paramArr.length; j++) { var paramObj = paramArr[j]; if (paramObj.goal) { if (homePlayer.has(paramObj.goal.player)) { homeGoal++; let goalStyle = ""; let chanceType = minuteArr[i].type; if (chanceType) { chanceType = chanceType.substring(0, 3); if (GOAL_STYLE_MAP.has(chanceType)) { goalStyle = GOAL_STYLE_MAP.get(chanceType); } } eventReport.push({ minute: key, type: EVENT_TYPE.GOAL, home: true, content: "[Goal] " + homePlayer.get(paramObj.goal.player) + (paramObj.goal.assist ? " (" + homePlayer.get(paramObj.goal.assist) + ") " : " ") + (goalStyle != "" ? " [" + goalStyle + "] " : " ") + paramObj.goal.score[0] + " - " + paramObj.goal.score[1] }); } else { awayGoal++; let goalStyle = ""; let chanceType = minuteArr[i].type; if (chanceType) { chanceType = chanceType.substring(0, 3); if (GOAL_STYLE_MAP.has(chanceType)) { goalStyle = GOAL_STYLE_MAP.get(chanceType); } } eventReport.push({ minute: key, type: EVENT_TYPE.GOAL, home: false, content: "[Goal] " + awayPlayer.get(paramObj.goal.player) + (paramObj.goal.assist ? " (" + awayPlayer.get(paramObj.goal.assist) + ") " : " ") + (goalStyle != "" ? " [" + goalStyle + "] " : " ") + paramObj.goal.score[0] + " - " + paramObj.goal.score[1] }); } } else if (paramObj.yellow) { if (homePlayer.has(paramObj.yellow)) { eventReport.push({ minute: key, type: EVENT_TYPE.YELLOW_CARD, home: true, content: "[Yellow card] " + homePlayer.get(paramObj.yellow) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.YELLOW_CARD, home: false, content: "[Yellow card] " + awayPlayer.get(paramObj.yellow) }); } } else if (paramObj.red) { if (homePlayer.has(paramObj.red)) { eventReport.push({ minute: key, type: EVENT_TYPE.RED_CARD, home: true, content: "[Red card] " + homePlayer.get(paramObj.red) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.RED_CARD, home: false, content: "[Red card] " + awayPlayer.get(paramObj.red) }); } } else if (paramObj.yellow_red) { if (homePlayer.has(paramObj.yellow_red)) { eventReport.push({ minute: key, type: EVENT_TYPE.RED_CARD, home: true, content: "[Red card] (2 yellow cards) " + homePlayer.get(paramObj.yellow_red) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.RED_CARD, home: false, content: "[Red card] (2 yellow cards) " + awayPlayer.get(paramObj.yellow_red) }); } } else if (paramObj.mentality_change) { if (paramObj.mentality_change.mentality) { if (paramObj.mentality_change.team == homeClubId) { eventReport.push({ minute: key, type: EVENT_TYPE.MENTALITY, home: true, content: "[Tactics] Mentality change to " + MENTALITY_MAP.get(paramObj.mentality_change.mentality) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.MENTALITY, home: false, content: "[Tactics] Mentality change to " + MENTALITY_MAP.get(paramObj.mentality_change.mentality) }); } } else if (paramObj.mentality_change.style) { if (paramObj.mentality_change.team == homeClubId) { eventReport.push({ minute: key, type: EVENT_TYPE.STYLE, home: true, content: "[Tactics] Attacking style change to " + STYLE_MAP.get(paramObj.mentality_change.style) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.STYLE, home: false, content: "[Tactics] Attacking style change to " + STYLE_MAP.get(paramObj.mentality_change.style) }); } } } else if (paramObj.player_change) { if (homePlayer.has(paramObj.player_change.player)) { eventReport.push({ minute: key, type: EVENT_TYPE.POSITION, home: true, content: "[Position] " + homePlayer.get(paramObj.player_change.player) + " change to " + (paramObj.player_change.position !== undefined ? paramObj.player_change.position.toUpperCase() : "") }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.POSITION, home: false, content: "[Position] " + awayPlayer.get(paramObj.player_change.player) + " change to " + (paramObj.player_change.position !== undefined ? paramObj.player_change.position.toUpperCase() : "") }); } } else if (paramObj.sub && paramObj.sub.player_in && paramObj.sub.player_out) { if (homePlayer.has(paramObj.sub.player_in)) { eventReport.push({ minute: key, type: EVENT_TYPE.SUBTITION, home: true, content: "[Subtition] " + homePlayer.get(paramObj.sub.player_in) + " replace " + homePlayer.get(paramObj.sub.player_out) + (paramObj.sub.player_position !== undefined ? " and play " + paramObj.sub.player_position.toUpperCase() : "") }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.SUBTITION, home: false, content: "[Subtition] " + awayPlayer.get(paramObj.sub.player_in) + " replace " + awayPlayer.get(paramObj.sub.player_out) + (paramObj.sub.player_position !== undefined ? " and play " + paramObj.sub.player_position.toUpperCase() : "") }); } } else if (paramObj.injury) { if (homePlayer.has(paramObj.injury)) { eventReport.push({ minute: key, type: EVENT_TYPE.INJURY, home: true, content: "[Injury] " + homePlayer.get(paramObj.injury) }); } else { eventReport.push({ minute: key, type: EVENT_TYPE.INJURY, home: false, content: "[Injury] " + awayPlayer.get(paramObj.injury) }); } } } } } }); if (eventReport.length > 0) { mainEventHTML += '<li style="color:burlywood"><table><tbody><tr><td align="left">' + '0. Mentality: ' + MENTALITY_MAP.get(homeStartMentality) + '. Attacking style: ' + STYLE_MAP.get(homeStartStyle) + '. Focus: ' + FOCUS_MAP.get(homeFocus) + '</td><td align="right">' + 'Mentality: ' + MENTALITY_MAP.get(awayStartMentality) + '. Attacking style: ' + STYLE_MAP.get(awayStartStyle) + '. Focus: ' + FOCUS_MAP.get(awayFocus) + ' .0' + '</td></tr></tbody></table></li>'; eventReport.forEach((event) => { let color; switch (event.type) { case EVENT_TYPE.GOAL: color = "style='color:Aqua;'"; break; case EVENT_TYPE.YELLOW_CARD: color = "style='color:Yellow;'"; break; case EVENT_TYPE.RED_CARD: color = "style='color:Darkred;'"; break; case EVENT_TYPE.MENTALITY: color = "style='color:Orange;'"; break; case EVENT_TYPE.STYLE: color = "style='color:Blue;'"; break; case EVENT_TYPE.POSITION: color = "style='color:GreenYellow;'"; break; case EVENT_TYPE.INJURY: color = "style='color:Brown;'"; break; default: color = ""; } if (event.home) { mainEventHTML += "<li align='left' " + color + ">" + event.minute + ". " + event.content + "</li>"; } else { mainEventHTML += "<li align='right' " + color + ">" + event.content + " ." + event.minute + "</li>"; } }); } } } var myInterval = setInterval(display, 1000); var pause = false; function display() { if (mainEventHTML !== "" && $('.box_body.mv_bottom').length > 0) { if ($('.post_report').length > 0) { let divArea = $('.box_body.mv_bottom div.post_report')[0]; divArea.innerHTML = '<div class="mega_headline tcenter report_section_header dark_bg">Main Event</div><div><ul class="clean underlined large_padding">' + mainEventHTML + '</ul></div>' + divArea.innerHTML; clearInterval(myInterval); } else if (!pause) { let divArea = $('.box_body.mv_bottom')[0]; divArea.innerHTML = '<div class="mega_headline tcenter report_section_header dark_bg">Main Event</div><div><ul class="clean underlined large_padding">' + mainEventHTML + '</ul></div>' + divArea.innerHTML; pause = true; } } } })();