您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Use more than 4 classes at once
// ==UserScript== // @name MultipleSchools // @version 1.0.6 // @description Use more than 4 classes at once // @author Allure149; translated by tylernelson224 // @match https://*www.missionchief.com/buildings/* // @grant none // @namespace https://greasyfork.org/users/981346 // ==/UserScript== /* global $ */ (async function(){ var schoolToSearch = +$("h1:first").attr("building_type") || null; var accessibleBuildings = [19, 4, 7, 24,]; if(schoolToSearch == null || !accessibleBuildings.includes(schoolToSearch)){ return false; } async function loadBuildingsApi(){ if(!sessionStorage.aBuildings || JSON.parse(sessionStorage.aBuildings).lastUpdate < (new Date().getTime() - 5 * 1000 * 60)) { await $.getJSON("/api/buildings.json").done(data => sessionStorage.setItem("aBuildings", JSON.stringify({lastUpdate: new Date().getTime(), value: data})) ); } return JSON.parse(sessionStorage.aBuildings).value; } async function loadAllianceBuildingsApi(){ if(!sessionStorage.aAllianceBuildings || JSON.parse(sessionStorage.aAllianceBuildings).lastUpdate < (new Date().getTime() - 5 * 1000 * 60)) { await $.getJSON("/api/alliance_buildings.json").done(data => sessionStorage.setItem("aAllianceBuildings", JSON.stringify({lastUpdate: new Date().getTime(), value: data})) ); } return JSON.parse(sessionStorage.aAllianceBuildings).value; } var aBuildings = await loadBuildingsApi(); var personalIds = []; var thisSchoolId = +window.location.pathname.match((/[0-9]+/)); var thisSchoolName = $("h1:first").text(); var thisSchoolFreeClasses = $("#building_rooms_use option").length || 1; var schoolsToUse = [{"id": thisSchoolId, "name": thisSchoolName, "free": thisSchoolFreeClasses}]; var searchThroughBuildings = await (async function(){ if($(".dl-horizontal:first a").length > 0 && $(".dl-horizontal:first a").attr("href").indexOf("alliances") > -1){ var aAllianceBuildings = await loadAllianceBuildingsApi(); return aAllianceBuildings; } else { return aBuildings; } })(); var freeClasses = 1; for(var building of searchThroughBuildings){ freeClasses = 1; if(building.building_type == schoolToSearch && building.caption != thisSchoolName){ for(var extension of building.extensions){ if(extension.available && extension.enabled) freeClasses++; } if(building.schoolings.length > 0) freeClasses -= building.schoolings.length; if(freeClasses > 0) { schoolsToUse.push({"id": building.id, "name": building.caption, "free": freeClasses}); } } } schoolsToUse.sort((a,b)=>a.name>b.name); var savedSchoolsToUse = schoolsToUse; if($("#building_rooms_use").length == 0){ $("h3:first").before(`<label for="building_rooms_use">How many rooms should be used for this training? </label> <select id="building_rooms_use" name="building_rooms_use"> <option value="1">1</option> </select>`); } $("input[name=commit]:last").after(`<span class="btn btn-success navbar-btn" id="multiple_commits">Start Education</span>`); $("input[name=commit]").remove(); $("#building_rooms_use").after(`<br><label for="multipleClassesSelect">Should special schools be used?</label> <input class="form-check-input" type="checkbox" value="" id="cbxMultipleClassrooms"><select multiple="" class="form-control hidden" id="multipleClassesSelect" style="height:10em;width:32em"></select>`); for(var school of schoolsToUse){ if(school.name != thisSchoolName) $("#multipleClassesSelect").append(`<option value="${school.free}" building_id="${school.id}">${school.name}</option>`); } var freeTotal = (function(){ var multivalues = $("#multipleClassesSelect").val(); if(multivalues && multivalues.val().length > 0) return $("#multipleClassesSelect").val().map((s)=>Number(s)).reduce((a,b)=>a+b,0); else return Object.values(schoolsToUse).reduce((a,b)=>a+b.free,0); })(); function createGlobalOptions(){ $("#building_rooms_use option").remove(); for(var i = 1; i <= freeTotal; i++){ $("#building_rooms_use").append(`<option value="${i}">${i}</option>`); } } createGlobalOptions(); $("#building_rooms_use").on("change", function(){ update_schooling_free(); }); $("#cbxMultipleClassrooms").on("change", function(a){ $("#multipleClassesSelect option:selected").each(function(){ $(this).prop("selected", false); }); schoolsToUse = savedSchoolsToUse; createGlobalOptions(); if(a.target.checked) $("#multipleClassesSelect").removeClass("hidden"); else $("#multipleClassesSelect").addClass("hidden"); }); $("#multipleClassesSelect").on("change", function(){ update_schooling_free(); var classCounter = 0; schoolsToUse = [{"id": thisSchoolId, "name": thisSchoolName, "free": thisSchoolFreeClasses}]; $("#building_rooms_use option").remove(); var options = $("option:selected", this); if(options.length == 0) { createGlobalOptions(); schoolsToUse = savedSchoolsToUse; } else { for(var i = 0; i < options.length; i++){ var el = options[i]; schoolsToUse.push({"id": +el.attributes.building_id.value, "name": el.text, "free": +el.value}); classCounter += +el.value; } for(var j = 1; j <= classCounter+thisSchoolFreeClasses; j++){ $("#building_rooms_use").append(`<option value="${j}">${j}</option>`); } } }); $("#multiple_commits").on("click", async function(){ $("#multiple_commits").after(`<span id="multipleClassesOutput" class="label label-warning" style="font-size: 14px">Loading... Please wait...</span>`); for(var counter in $(".schooling_checkbox")){ var el = $(".schooling_checkbox")[counter]; var usePersonal = el.checked; if(usePersonal) personalIds.push(el.value); } var education = (function() { for(var counter in $("form input.radio")){ var el = $("form input.radio")[counter]; if(el && el.checked) return +el.attributes.value.value; } }); var classCounter = +$("#building_rooms_use")[0].value; var auswertung = {"schulen": 0, "klassen": classCounter}; var persTemp = []; for(var school of schoolsToUse){ auswertung.schulen++; persTemp = []; var loopCounter = school.free * 10 > personalIds.length ? personalIds.length : school.free * 10; for(var j = 0; j < loopCounter; j++){ persTemp.push(personalIds[0]); personalIds.splice(0,1); if(personalIds.length == 0) break; } var usedClasses = classCounter <= school.free ? classCounter : school.free; var params = { "education": education, "personal_ids": persTemp, "building_rooms_use": usedClasses } if($("#alliance_duration")[0].value != 0){ params.alliance = { "duration": $("#alliance_duration")[0].value, "cost": $("#alliance_cost")[0].value }; } await $.post("/buildings/" + school.id + "/education", params, function(){ $("#multipleClassesOutput").text(`${school.name} was over ${usedClasses} ${(usedClasses==1?"new course":"new courses")} informed.`); }); classCounter -= school.free; if(classCounter <= 0) break; } $("#multipleClassesOutput").toggleClass("label-warning label-success").text(`${auswertung.schulen} ${(auswertung.schulen==1?"school became":"schools became")} über ${auswertung.klassen} ${(auswertung.klassen==1?"new course":"new courses")} successfully informed.`); setTimeout(window.location.reload(), 1000); }); })();