您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows you to save attack formations
// ==UserScript== // @name Tiberium Alliances Formation Saver // @description Allows you to save attack formations // @namespace https://prodgame*.alliances.commandandconquer.com/*/index.aspx* // @include https://prodgame*.alliances.commandandconquer.com/*/index.aspx* // @version 2.3 // @author Panavia, KRS_L, DebitoSphere // ==/UserScript== (function (){ var tafs_main = function() { var windowSaver; function initialize() { console.log("Formation Saver Loaded"); qx.Class.define("webfrontend.gui.PlayArea.FormationSaver", { extend: qx.ui.container.Composite, construct:function() { qx.ui.container.Composite.call(this); this.setLayout(new qx.ui.layout.Canvas()); this.add(this.init()); }, statics: { SaverCollapsedHeight: 32, SaverExpandedHeight: 245, }, properties: { expanded: {init: true, apply: "expand"}, }, members: { buttonResize: null, containerContence: null, containerSaves: null, containerMain: null, buttonSave: null, init: function() { var Y = 6; this.buttonResize = new webfrontend.ui.SoundButton(null, "FactionUI/icons/icon_tracker_minimise.png").set({width: 20, height: 20, appearance: "button-notif-cat", center: true, allowGrowX: false}); this.buttonResize.addListener("click",function(e) { this.setExpanded(!this.getExpanded()); }, this); var ba = new qx.ui.container.Composite(new qx.ui.layout.HBox().set({alignY:"middle"})).set({margin:Y,marginRight:Y+3}); ba.add(this.buttonResize); var labelTitle = new qx.ui.basic.Label("<b>Saver</b>"); labelTitle.set({marginLeft: 4, rich: true}); labelTitle.setTextColor("#FFFFFF"); ba.add(labelTitle); this.containerContence = new qx.ui.container.Composite(new qx.ui.layout.VBox().set({alignX:"center"})).set({allowGrowX:true,marginTop:0,marginBottom:5}); containerSaves = new qx.ui.container.Composite(new qx.ui.layout.Grid(10, 2)).set({allowGrowX: true , marginLeft: 0, marginBottom: 5}); this.containerContence.add(containerSaves); buttonSave = new qx.ui.form.Button("Save"); buttonSave.set({width: 50, appearance: "button-text-small", toolTipText: "Save attack formation", allowGrowX:false}); buttonSave.addListener("click", this.save, this); this.containerContence.add(buttonSave); this.containerMain=new qx.ui.container.Composite(new qx.ui.layout.VBox().set({alignX:"right"})).set({maxHeight:webfrontend.gui.PlayArea.FormationSaver.SaverExpandedHeight,width:75,minHeight:32,allowShrinkY:true}); this.containerMain.add(ba); this.containerMain.add(this.containerContence,{flex:1}); return this.containerMain; }, expand: function(bs) { if(!bs) { this.buttonResize.setIcon("FactionUI/icons/icon_tracker_maximise.png"); this.containerMain.setMaxHeight(webfrontend.gui.PlayArea.FormationSaver.SaverCollapsedHeight); } else { this.buttonResize.setIcon("FactionUI/icons/icon_tracker_minimise.png"); this.containerMain.setMaxHeight(webfrontend.gui.PlayArea.FormationSaver.SaverExpandedHeight); } }, update: function() { containerSaves.removeAll(); var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities(); var currentOwnCity = playerCities.get_CurrentOwnCity(); var cityID = playerCities.get_CurrentCity().get_Id(); var ownCityID = currentOwnCity.get_Id(); var formations = this.loadFormations(); if(!formations) { return; } if(!formations[cityID]) { return; } if(!formations[cityID][ownCityID]) { return; } var i = 0; for(var id in formations[cityID][ownCityID]) { if(id != 0) { i++; var formation = formations[cityID][ownCityID][id]; var date = new Date(Number(formation.t)); var toolTipText = "<div><span style='float: left'><b>" + formation.n + "</b></span><span style='float: right'> " + date.getHours() + ":" + (date.getMinutes() <= 9 ? "0" : "") + date.getMinutes() + " " + date.getDate() + "/" + (date.getMonth() + 1) + "</span></div><div style='clear: both;'></div>"; if(formation.cy != null) { toolTipText += formation.cy + "% Construction Yard</br>" + formation.df + "% Defense Facility</br>" + formation.ts + "% Troop Strength</br>" + this.formatSecondsAsTime(formation.r) + " Repair Time"; } var labelLoad = new qx.ui.basic.Label(formation.n); labelLoad.set({width: 40, allowGrowX: false, toolTipText: toolTipText}); labelLoad.setTextColor("#FFFFFF"); labelLoad.addListener("click", this.clickLoad(formation), this); labelLoad.addListener("mouseover", this.mouseover(labelLoad, "#BBBBBB"), this); labelLoad.addListener("mouseout", this.mouseout(labelLoad, "#FFFFFF"), this); containerSaves.add(labelLoad, {row: i, column: 1}); var labelDelete = new qx.ui.basic.Label("<b>X</b>"); labelDelete.set({width: 10, allowGrowX:false, rich: true, toolTipText: "Delete " + formation.n}); labelDelete.setTextColor("#881717"); labelDelete.addListener("click", this.clickDeleteF(cityID, ownCityID, id), this); labelDelete.addListener("mouseover", this.mouseover(labelDelete, "#550909"), this); labelDelete.addListener("mouseout", this.mouseover(labelDelete, "#881717"), this); containerSaves.add(labelDelete, {row: i, column: 2}); } } }, mouseover: function(label, color) { return function() { label.setTextColor(color); } }, mouseout: function(label, color) { return function() { label.setTextColor(color); } }, save: function() { try { var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities(); var currentOwnCity = playerCities.get_CurrentOwnCity(); var cityID = playerCities.get_CurrentCity().get_Id(); var ownCityID = currentOwnCity.get_Id(); var newFormation = new Object(); newFormation.t = new Date().getTime().toString(); newFormation.n = ""; newFormation.l = new Array(); var formation = currentOwnCity.get_CityArmyFormationsManager().GetFormationByTargetBaseId(cityID); var armyUnits = formation.get_ArmyUnits(); if(armyUnits == null) { console.log("tafs Error: You must move a unit befor saving!"); return; } armyUnits = armyUnits.l; for(var i in armyUnits) { var unit = armyUnits[i]; newFormation.l[i] = new Object(); newFormation.l[i].x = unit.get_CoordX(); newFormation.l[i].y = unit.get_CoordY(); newFormation.l[i].e = unit.get_Enabled(); } var formations = this.loadFormations(); if(!formations) { formations = new Object(); } if(!formations[cityID]) { formations[cityID] = new Object(); } if(!formations[cityID][ownCityID]) { formations[cityID][ownCityID] = new Array(); formations[cityID][ownCityID][0] = 0; } formations[cityID][ownCityID][0]++; newFormation.n = "Save " + formations[cityID][ownCityID][0]; formations[cityID][ownCityID].push(newFormation); this.saveFormations(formations); windowSaver.update(); } catch(e) { console.log(e); } }, clickLoad: function(newFormation) { return function() { this.load(newFormation); } }, load: function(newFormation) { try { var playerCities = ClientLib.Data.MainData.GetInstance().get_Cities(); var currentOwnCity = playerCities.get_CurrentOwnCity(); var cityID = playerCities.get_CurrentCity().get_Id(); var formation = currentOwnCity.get_CityArmyFormationsManager().GetFormationByTargetBaseId(cityID); var armyUnits = formation.get_ArmyUnits(); if(armyUnits == null) { console.log("tafs Error: You must move a unit befor loading!"); return; } armyUnits = armyUnits.l; for(var i in newFormation.l) { var unitData = newFormation.l[i]; armyUnits[i].MoveBattleUnit(unitData.x, unitData.y); if(unitData.e != null) { if(armyUnits[i].set_Enabled_Original) { armyUnits[i].set_Enabled_Original(unitData.e); } else { armyUnits[i].set_Enabled(unitData.e); } } } //formation.set_CurrentTargetBaseId(cityID); } catch(e) { console.log(e); } }, clickDeleteF: function(cityID, ownCityID, id) { return function() { this.deleteF(cityID, ownCityID, id); } }, deleteF: function(cityID, ownCityID, id) { var formations = this.loadFormations(); if(!formations || !formations[cityID] || !formations[cityID][ownCityID]) return; formations[cityID][ownCityID].splice(id, 1); if(formations[cityID][ownCityID].length <= 1) { delete formations[cityID][ownCityID]; } var i for(i in formations[cityID]) { if(formations[cityID].hasOwnProperty(i)) { break; } } if(!i) delete formations[cityID]; this.saveFormations(formations); windowSaver.update(); }, saveFormations: function(formations) { var data = JSON.stringify(formations); localStorage.formations = data; }, loadFormations: function() { var formations = localStorage.formations; return formations && JSON.parse(formations); }, formatSecondsAsTime: function(secs, format) { var hr = Math.floor(secs / 3600); var min = Math.floor((secs - (hr * 3600)) / 60); var sec = Math.floor(secs - (hr * 3600) - (min * 60)); if(hr < 10) { hr = "0" + hr; } if(min < 10) { min = "0" + min; } if(sec < 10) { sec = "0" + sec; } return hr + ':' + min + ':' + sec; }, } }) windowSaver = new webfrontend.gui.PlayArea.FormationSaver(); windowSaver.hide(); qx.core.Init.getApplication().getPlayArea().add(windowSaver, {top: 55, right: -2}); if(!ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentOwnCityId) { ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentOwnCityId = ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentOwnCityId; } ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentOwnCityId = function(a) { this.__tafs__set_CurrentOwnCityId(a); updateView(); } if(!ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentCityId) { ClientLib.Data.MainData.GetInstance().get_Cities().__tafs__set_CurrentCityId = ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId; } ClientLib.Data.MainData.GetInstance().get_Cities().set_CurrentCityId = function(a) { this.__tafs__set_CurrentCityId(a); updateView(); } function updateView() { if (PerforceChangelist >= 376877) { switch(qx.core.Init.getApplication().getPlayArea().getViewMode()) { case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupDefense: case ClientLib.Data.PlayerAreaViewMode.pavmCombatSetupBase: windowSaver.update(); windowSaver.show(); break; default: windowSaver.hide(); } } else { switch(qx.core.Init.getApplication().getPlayArea().getViewMode()) { case webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatSetupDefense: case webfrontend.gui.PlayArea.PlayArea.modes.EMode_CombatSetupBase: windowSaver.update(); windowSaver.show(); break; default: windowSaver.hide(); } } } } function tafs_checkIfLoaded() { try { if (typeof qx != 'undefined') { a = qx.core.Init.getApplication(); // application mb = qx.core.Init.getApplication().getMenuBar(); if (a && mb) { initialize(); } else window.setTimeout(tafs_checkIfLoaded, 1000); } else { window.setTimeout(tafs_checkIfLoaded, 1000); } } catch (e) { if (typeof console != 'undefined') console.log(e); else if (window.opera) opera.postError(e); else GM_log(e); } } if (/commandandconquer\.com/i.test(document.domain)) { window.setTimeout(tafs_checkIfLoaded, 1000); } } // injecting, because there seem to be problems when creating game interface with unsafeWindow var tafsScript = document.createElement("script"); tafsScript.innerHTML = "(" + tafs_main.toString() + ")();"; tafsScript.type = "text/javascript"; if (/commandandconquer\.com/i.test(document.domain)) { document.getElementsByTagName("head")[0].appendChild(tafsScript); } })();