您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Calculates sum of skills obtained from items
// ==UserScript== // @namespace https://greatest.deepsurf.us/users/8637 // @name The West - Skills Calc // @author neversleep1911 // @description Calculates sum of skills obtained from items // @include http://*.the-west.*/game.php* // @include https://*.the-west.*/game.php* // @grant none // @version 2.1.3 // @copyright Copyright (c) 2015 neversleep1911 (full list of contributors/translators see here: https://greatest.deepsurf.us/scripts/7829) // @license MIT (http://opensource.org/licenses/MIT) // ==/UserScript== (function(func) { var script; script = document.createElement("script"); script.setAttribute("type", "text/javascript"); script.textContent = "(" + func.toString() + ")();"; document.body.appendChild(script); document.body.removeChild(script); })(function() { var Gui, I18n, SkillsCalc; I18n = function() { function I18n() {} var DEFAULT_LANGUAGE, STRINGS, language; DEFAULT_LANGUAGE = "en_US"; STRINGS = { de_DE: { dialogs: { add_item: "Gegenstand hinzufügen", add_character_items: "Items eines Spielers" }, groups: { skills: "Fertigkeiten", items: "Ausrüstung" }, buttons: { character: "Spieler", add: "Hinzufügen", reset: "Zurücksetzen" }, checkboxes: { show_bonus: "Bonus anzeigen", show_skills: "Meinen Skill anzeigen" }, labels: { level: "Stufe", item_id: "Item ID", character_name: "Name des Spielers", health: "LPs" }, tooltip: { health: "Normal / Soldat / Soldat mit Bonus" }, errors: { player_not_found: "Spieler nicht gefunden!" } }, en_US: { dialogs: { add_item: "Add item", add_character_items: "Character's items" }, groups: { skills: "Skills", items: "Items" }, buttons: { character: "Character", add: "Add", reset: "Reset" }, checkboxes: { show_bonus: "Show bonus", show_skills: "Show my skills" }, labels: { level: "Level", item_id: "Item ID", character_name: "Character's name", health: "Health" }, tooltip: { health: "Normal / Solder / Solder with bonus" }, errors: { player_not_found: "Player not found!" } }, pl_PL: { dialogs: { add_item: "Dodaj przedmiot", add_character_items: "Przedmioty gracza" }, groups: { skills: "Umiejętności", items: "Przedmioty" }, buttons: { character: "Gracz", add: "Dodaj", reset: "Reset" }, checkboxes: { show_bonus: "Pokaż bonus", show_skills: "Pokaż moje umiejętności" }, labels: { level: "Level", item_id: "ID przedmiotu", character_name: "Nazwa gracza", health: "Życie" }, tooltip: { health: "Normalny / Żołnierz / Żołnierz z bonusem" }, errors: { player_not_found: "Gracz nie znaleziony!" } }, ru_RU: { dialogs: { add_item: "Добавить предмет", add_character_items: "Предметы персонажа" }, groups: { skills: "Навыки", items: "Предметы" }, buttons: { character: "Персонаж", add: "Добавить", reset: "Сбросить" }, checkboxes: { show_bonus: "Показывать бонусы", show_skills: "Показывать мои навыки" }, labels: { level: "Уровень", item_id: "ID предмета", character_name: "Имя персонажа", health: "Здоровье" }, tooltip: { health: "Минимум / Солдат / Солдат с бонусом" }, errors: { player_not_found: "Игрок не найден!" } } }; language = DEFAULT_LANGUAGE; I18n.language = function() { return language; }; I18n.setLanguage = function(lang) { return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE; }; I18n.tr = function(id) { var string; string = STRINGS[language]; $(id.split(".")).each(function(k, v) { return (string = string[v]) !== void 0; }); return string || id; }; return I18n; }(); Gui = function() { function Gui() {} Gui.createMenuButton = function(options) { var button; if (options == null) { options = {}; } button = $("<div class='menulink' title='" + options.title + "' />"); if (options.image) { button.css("background-image", "url(" + options.image + ")"); } button.hover(function() { $(this).css("background-position", "-25px 0px"); return true; }, function() { $(this).css("background-position", "0px 0px"); return true; }).on("click", options.onclick); $("div#ui_menubar").append($('<div class="ui_menucontainer" />').append(button).append('<div class="menucontainer_bottom" />')); return button; }; Gui.createGroup = function(options) { var content, group, scrollPane; if (options == null) { options = {}; } group = new west.gui.Groupframe("", "<div />"); if (options.css) { $(group.getMainDiv()).css(options.css); } content = $(".tw2gui_groupframe_content_pane div", group.getMainDiv()).first(); if (options.title) { content.append($("<h2>" + options.title + "</h2><hr style='margin-top: 2px; margin-bottom: 4px;' />")); } if (options.scrollPane) { scrollPane = new west.gui.Scrollpane; if (options.scrollPane.css) { $(scrollPane.getMainDiv()).css(options.scrollPane.css); } content.append(scrollPane.getMainDiv()); group.scrollPane = scrollPane; group.appendToScrollContentPane = function(content) { scrollPane.appendContent(content); return group; }; } return group; }; Gui.createButton = function(options) { var button; if (options == null) { options = {}; } if (options.icon) { button = new west.gui.Iconbutton(options.icon, options.onclick); } else { button = new west.gui.Button(options.text, options.onclick); } if (options.css) { $(button.getMainDiv()).css(options.css); } return button; }; Gui.createCheckbox = function(options) { var checkbox; if (options == null) { options = {}; } checkbox = new west.gui.Checkbox(options.text, "", options.onclick); $(checkbox.getMainDiv()).css(options.css); return checkbox; }; Gui.createTextfield = function(options) { var field; if (options == null) { options = {}; } field = new west.gui.Textfield; field.setSize(options.size); field.setLabel($("<span>" + options.label + "</span>")); if (options.value) { field.setValue(options.value); } if (options.css) { $(field.getMainDiv()).css(options.css); } return field; }; return Gui; }(); SkillsCalc = function() { function SkillsCalc() { var self; self = this; I18n.setLanguage(Game.locale); Gui.createMenuButton({ title: SkillsCalc.NAME, image: this.MENU_BUTTON_IMAGE, onclick: function(e) { self.createWindow(); e.preventDefault(); return false; } }); } var ItemCalculator, Window; SkillsCalc.ID = "tw_skills_calc"; SkillsCalc.NAME = "Skills Calc"; SkillsCalc.AUTHOR = "neversleep1911"; SkillsCalc.WEB_SITE = "https://greatest.deepsurf.us/scripts/7829"; SkillsCalc.MIN_GAME_VERSION = "2.21"; SkillsCalc.MAX_GAME_VERSION = Game.version.toString(); SkillsCalc.prototype.MENU_BUTTON_IMAGE = "data:image/png;base64,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"; SkillsCalc.prototype.windows = {}; SkillsCalc.prototype.createWindow = function() { var self, wndId; self = this; while (true) { wndId = Math.ceil(Math.random() * 1024); if (!this.windows[wndId]) { break; } } this.windows[wndId] = new Window({ id: wndId, title: SkillsCalc.NAME, miniTitle: SkillsCalc.NAME }); this.windows[wndId].onDestroy = function(wnd) { delete self.windows[wnd.id]; return true; }; return true; }; Window = function() { function Window(options) { var self; self = this; this.images = {}; this.items = {}; this.calculator = new ItemCalculator; this.calculator.level = Character.level; this.id = options.id; this.wnd = wman.open("skills-calc-window-" + options.id, null, "noreload"); this.wnd.setTitle(options.title); this.wnd.setMiniTitle(options.miniTitle); this.wnd.addEventListener("WINDOW_DESTROY", function() { if (self.onDestroy) { return self.onDestroy(self); } else { return true; } }); this.wnd.appendToContentPane((this.groupSkills = Gui.createGroup({ title: I18n.tr("groups.skills"), css: { width: 402, position: "absolute" }, scrollPane: { css: { height: 264 } } })).getMainDiv()); this.wnd.appendToContentPane((this.groupItems = Gui.createGroup({ title: I18n.tr("groups.items"), css: { left: 400, width: 294 }, scrollPane: { css: { height: 264 } } })).getMainDiv()); this.wnd.appendToContentPane(Gui.createButton({ text: I18n.tr("buttons.reset"), css: { left: 592, top: 342, position: "absolute" }, onclick: function(button, data) { return self.onButtonResetClick(button, data); } }).getMainDiv()); this.wnd.appendToContentPane(Gui.createButton({ text: I18n.tr("buttons.add"), css: { left: 490, top: 342, position: "absolute" }, onclick: function(button, data) { return self.onButtonAddClick(button, data); } }).getMainDiv()); this.wnd.appendToContentPane(Gui.createButton({ text: I18n.tr("buttons.character"), css: { left: 388, top: 342, position: "absolute" }, onclick: function(button, data) { return self.onButtonCharacterClick(button, data); } }).getMainDiv()); this.wnd.appendToContentPane((this.checkboxBonus = Gui.createCheckbox({ text: I18n.tr("checkboxes.show_bonus"), css: { left: 2, top: 324, position: "absolute" }, onclick: function(state) { return self.onCheckboxBonusClick(state); } })).getMainDiv()); this.wnd.appendToContentPane((this.checkboxSkills = Gui.createCheckbox({ text: I18n.tr("checkboxes.show_skills"), css: { left: 2, top: 350, position: "absolute" }, onclick: function(state) { return self.onCheckboxSkillsClick(state); } })).getMainDiv()); this.wnd.appendToContentPane((this.textfieldLevel = Gui.createTextfield({ size: 6, label: I18n.tr("labels.level"), value: this.calculator.level, css: { left: 180, top: 320, position: "absolute" } })).getMainDiv()); this.wnd.appendToContentPane(this.labelHealth = $("<span />").css({ position: "absolute", left: 180, top: 352 }).attr("title", I18n.tr("tooltip.health"))); this.textfieldLevel.onlyNumeric().getField().keyup(function(e) { var level; level = parseInt(self.textfieldLevel.getValue()); if (!isNaN(level) && level > 0) { self.calculator.level = level; self.recalc(); self.repaint(); } return true; }); this.initGroupSkills(); this.initGroupItems(); } Window.prototype.initGroupSkills = function() { var attr, attrs, div, img, j, l, len, len1, skill, skillType, skills; attrs = CharacterSkills.allAttrKeys; for (j = 0, len = attrs.length; j < len; j++) { attr = attrs[j]; div = $('<div style="height: 41px;" />'); skills = CharacterSkills.skillKeys4Attr[attr]; for (l = 0, len1 = skills.length; l < len1; l++) { skillType = skills[l]; skill = new Skill(skillType); img = skill.getSkillImage(); img.removeAttr("class").css({ width: 72, display: "inline-block", "text-align": "center", "font-weight": "bold", "margin-left": 2 }); $("img.skillicon", img).removeAttr("class").css({ width: "100%" }); $("span.skillpoints_label", img).attr("class", "skills-calc-skillpoints_label").css({ display: "inline-block", position: "relative", top: -16, width: "100%", height: 12, color: "#ffffff", "text-align": "center", "font-size": "9pt", "text-shadow": "1px 1px 1px rgb(0, 0, 0)", "background-image": "url('/images/tw2gui/plusminus/plusminus_display_bg2.png')" }); div.append(img); this.images[skillType] = img.get(0); } this.groupSkills.appendToScrollContentPane(div); this.groupSkills.appendToScrollContentPane($('<hr style="margin: 12px 0;" />')); } return true; }; Window.prototype.initGroupItems = function() { var items, j, len, ref, slot; items = []; ref = Wear.slots; for (j = 0, len = ref.length; j < len; j++) { slot = ref[j]; if (Wear.wear[slot]) { items.push(Wear.wear[slot].obj); } } this.addItems(items); return this.repaint(); }; Window.prototype.onButtonCharacterClick = function() { var content, dlg, ok, self, textfieldName; self = this; dlg = new west.gui.Dialog(I18n.tr("dialogs.add_character_items")); content = $("<div style='margin-top: 10px; text-align: center;'></div>"); content.append((textfieldName = Gui.createTextfield({ size: 25, label: I18n.tr("labels.character_name") })).getMainDiv()); ok = function() { var name; if (!(name = $.trim(textfieldName.getValue()))) { return false; } self.wnd.showLoader(); return Ajax.remoteCallMode("ranking", "get_data", { rank: NaN, search: name = name.toLowerCase(), tab: "duels" }, function(json) { var found, j, len, player, ref; if (json.error) { self.wnd.hideLoader(); return (new UserMessage(json.msg, UserMessage.TYPE_ERROR)).show(); } found = false; ref = json.ranking; for (j = 0, len = ref.length; j < len; j++) { player = ref[j]; found = player.name.toLowerCase() === name; if (found) { Ajax.remoteCallMode("profile", "init", { name: player.name, playerId: player.id }, function(resp) { var items, l, len1, ref1, slot; if (resp.error) { self.wnd.hideLoader(); return (new UserMessage(resp.message, UserMessage.TYPE_ERROR)).show(); } else { items = []; ref1 = Wear.slots; for (l = 0, len1 = ref1.length; l < len1; l++) { slot = ref1[l]; if (resp.wear[slot]) { items.push(ItemManager.get(resp.wear[slot])); } } self.reset(); self.calculator.level = resp.level; self.textfieldLevel.setValue(resp.level); self.addItems(items); self.repaint(); self.wnd.hideLoader(); } return true; }); break; } } if (!found) { self.wnd.hideLoader(); (new UserMessage(I18n.tr("errors.player_not_found"), UserMessage.TYPE_ERROR)).show(); } return true; }); }; textfieldName.getField().keypress(function(e) { if (e.which === 13 && ok()) { dlg.hide(); } return true; }); dlg.setText(content).addButton("ok", ok).addButton("cancel").show(); textfieldName.getField().focus(); return true; }; Window.prototype.onButtonAddClick = function() { var content, dlg, ok, self, textfieldId; self = this; dlg = new west.gui.Dialog(I18n.tr("dialogs.add_item")); content = $('<div style="margin-top: 10px; text-align: center;"><div id="skills-calc-preview-item" style="height: 60px; width: 60px; float: right; border: 1px solid black; border-radius: 4px;" /></div>'); content.append((textfieldId = Gui.createTextfield({ size: 25, label: I18n.tr("labels.item_id") })).maxlength(8).getMainDiv()); textfieldId.getItem = function() { var id; id = parseInt(this.getValue()); if (isNaN(id)) { return void 0; } else { return ItemManager.get(id); } }; ok = function() { var item; if (item = textfieldId.getItem()) { self.addItems([ item ]); self.repaint(); return true; } else { return false; } }; dlg.setText(content).addButton("ok", ok).addButton("cancel").show(); textfieldId.getField().keypress(function(e) { if (e.which === 13 && ok()) { dlg.hide(); } return true; }).keyup(function(e) { var item, preview; preview = $("#skills-calc-preview-item", content).empty(); if (item = textfieldId.getItem()) { item = new tw2widget.InventoryItem(item); preview.append($(item.getMainDiv()).css({ "float": "none" })); } return true; }).focus(); return true; }; Window.prototype.onButtonResetClick = function() { return this.reset(); }; Window.prototype.onCheckboxBonusClick = function(state) { return this.repaint(); }; Window.prototype.onCheckboxSkillsClick = function(state) { this.recalc(); return this.repaint(); }; Window.prototype.addItems = function(items) { var item, j, len, self; self = this; for (j = 0, len = items.length; j < len; j++) { item = items[j]; this.removeItem(item); this.items[item.type] = new tw2widget.InventoryItem(item); $(this.items[item.type].getMainDiv()).css({ "float": "none", display: "inline-block" }).on("click", function(e) { if (!e.shiftKey) { item = ItemManager.get($(e.target).data("itemId")); if (item && self.removeItem(item)) { self.repaint(); } } return true; }); this.calculator.sumItem(item); this.groupItems.appendToScrollContentPane($(this.items[item.type].getMainDiv())); } return true; }; Window.prototype.removeItem = function(item) { if (this.items[item.type]) { this.calculator.subItem(this.items[item.type].obj); $(this.items[item.type].getMainDiv()).remove(); delete this.items[item.type]; return true; } else { return false; } }; Window.prototype.recalc = function() { var item, ref, ref1, skill, type, value; this.calculator.reset(); ref = this.items; for (type in ref) { item = ref[type]; this.calculator.sumItem(item.obj); } if (this.checkboxSkills.isSelected()) { ref1 = CharacterSkills.skills; for (skill in ref1) { value = ref1[skill]; this.calculator.calcSkill(skill, value.points, ItemCalculator.SUM_OP); } } return true; }; Window.prototype.repaint = function() { var health, min_health, result, skill, value; result = this.checkboxBonus.isSelected() ? this.calculator.resultWithBonus() : this.calculator.result; for (skill in result) { value = result[skill]; if (this.images[skill]) { $("span.skills-calc-skillpoints_label", this.images[skill]).text(value); } } min_health = this.calculator.level * 10 + 90; health = { normal: format_number(min_health + result.health * 10), solder: format_number(min_health + result.health * 15), solderBonus: format_number(min_health + result.health * 20), toString: function() { return this.normal + " / " + this.solder + " / " + this.solderBonus; } }; this.labelHealth.text(I18n.tr("labels.health") + ": " + health.toString()); return true; }; Window.prototype.reset = function() { var item, ref, type; ref = this.items; for (type in ref) { item = ref[type]; $(item.getMainDiv()).remove(); } $("span.skills-calc-skillpoints_label", this.groupSkills.getMainDiv()).text("0"); this.items = {}; this.calculator.reset(); this.calculator.level = Character.level; this.textfieldLevel.setValue(Character.level); this.labelHealth.text(I18n.tr("labels.health") + ": 0 / 0 / 0"); this.checkboxBonus.setSelected(false, true); this.checkboxSkills.setSelected(false, true); return true; }; return Window; }(); ItemCalculator = function() { function ItemCalculator() { this.level = 1; this._bonusExtractor = new west.item.BonusExtractor({ level: this.level }); this._resultStack = []; this.reset(); } ItemCalculator.SUM_OP = "sum"; ItemCalculator.SUB_OP = "sub"; ItemCalculator.prototype.sum = function(skill, value) { return this.result[skill] += value; }; ItemCalculator.prototype.sub = function(skill, value) { return this.result[skill] -= value; }; ItemCalculator.prototype.sumItem = function(item) { return this.calcItem(item, ItemCalculator.SUM_OP); }; ItemCalculator.prototype.subItem = function(item) { return this.calcItem(item, ItemCalculator.SUB_OP); }; ItemCalculator.prototype.calcItem = function(item, operator) { if (item.bonus.attributes) { this.calcAttributes(item.bonus.attributes, operator); } if (item.bonus.skills) { this.calcSkills(item.bonus.skills, operator); } if (item.bonus.item) { this.calcBonuses(item.bonus.item, operator); } if (item.item_level > 0) { this.calcDifference(item.bonus.item, item.item_level, operator); } if (item.set) { this.calcSet(item.set, operator); } return this.result; }; ItemCalculator.prototype.calcAttribute = function(attr, value, operator) { var j, len, skill, skills; skills = CharacterSkills.skillKeys4Attr[attr]; for (j = 0, len = skills.length; j < len; j++) { skill = skills[j]; this[operator](skill, value); } return this.result; }; ItemCalculator.prototype.calcAttributes = function(attrs, operator) { var attr, value; for (attr in attrs) { value = attrs[attr]; if (this.isAttribute(attr)) { this.calcAttribute(attr, value, operator); } } return this.result; }; ItemCalculator.prototype.calcSkill = function(skill, value, operator) { return this[operator](skill, value); }; ItemCalculator.prototype.calcSkills = function(skills, operator) { var skill, value; for (skill in skills) { value = skills[skill]; if (this.isSkill(skill)) { this.calcSkill(skill, value, operator); } } return this.result; }; ItemCalculator.prototype.calcDifference = function(bonuses, itemLevel, operator) { var bonus, diff, j, len; for (j = 0, len = bonuses.length; j < len; j++) { bonus = bonuses[j]; diff = this._bonusExtractor.getCharacterItemValueDifferenceToItemLevel(bonus, 0, itemLevel); if (diff <= 0) { continue; } switch (bonus.bonus.type) { case "attribute": this.calcAttribute(bonus.bonus.name, diff, operator); break; case "skill": this.calcSkill(bonus.bonus.name, diff, operator); } } return this.result; }; ItemCalculator.prototype.calcBonuses = function(bonuses, operator) { var bonus, j, len; this._bonusExtractor.character.level = this.level; for (j = 0, len = bonuses.length; j < len; j++) { bonus = bonuses[j]; this.calcSkills(this._bonusExtractor.getAffectedSkills(bonus), operator); } return this.result; }; ItemCalculator.prototype.calcSet = function(set, operator) { switch (operator) { case ItemCalculator.SUM_OP: this.itemSets[set] = (this.itemSets[set] || 0) + 1; break; case ItemCalculator.SUB_OP: if (this.itemSets[set] && (this.itemSets[set] -= 1) <= 0) { delete this.itemSets[set]; } } return this.result; }; ItemCalculator.prototype.isAttribute = function(attr) { return CharacterSkills.allAttrKeys.indexOf(attr) !== -1; }; ItemCalculator.prototype.isSkill = function(skill) { return CharacterSkills.allSkillKeys.indexOf(skill) !== -1; }; ItemCalculator.prototype.reset = function() { var j, len, ref, skill; this.itemSets = {}; this.result = {}; ref = CharacterSkills.allSkillKeys; for (j = 0, len = ref.length; j < len; j++) { skill = ref[j]; this.result[skill] = 0; } return this.result; }; ItemCalculator.prototype.resultWithBonus = function() { var b, bonus, cb, found, i, itemCount, itemSet, j, l, len, len1, len2, m, n, name1, name2, ref, ref1, ref2, ref3, result, setId, stage, value; this.pushResult(); this._bonusExtractor.level = this.level; bonus = {}; ref = this.itemSets; for (setId in ref) { itemCount = ref[setId]; itemSet = west.storage.ItemSetManager.get(setId); for (i = j = 1, ref1 = itemCount; 1 <= ref1 ? j <= ref1 : j >= ref1; i = 1 <= ref1 ? ++j : --j) { stage = itemSet.bonus[i]; if (stage) { for (l = 0, len = stage.length; l < len; l++) { b = stage[l]; switch (b.type) { case "attribute": case "skill": bonus[name1 = b.type] || (bonus[name1] = {}); bonus[b.type][b.name] = (bonus[b.type][b.name] || 0) + b.value; break; case "character": bonus[name2 = b.type] || (bonus[name2] = []); found = false; ref2 = bonus[b.type]; for (i = m = 0, len1 = ref2.length; m < len1; i = ++m) { cb = ref2[i]; found = cb.type === b.bonus.type && cb.name === b.bonus.name && cb.key === b.key && cb.roundingMethod === b.roundingMethod; if (found) { bonus[b.type][i].value += b.bonus.value; break; } } if (!found) { bonus[b.type].push({ type: b.bonus.type, name: b.bonus.name, value: b.bonus.value, key: b.key, roundingMethod: b.roundingMethod }); } } } } } } if (bonus.attribute) { this.calcAttributes(bonus.attribute, ItemCalculator.SUM_OP); } if (bonus.skill) { this.calcSkills(bonus.skill, ItemCalculator.SUM_OP); } if (bonus.character) { ref3 = bonus.character; for (n = 0, len2 = ref3.length; n < len2; n++) { b = ref3[n]; if (b.key === "level") { value = this._bonusExtractor.getRoundedValue(b.value * this.level, b.roundingMethod); switch (b.type) { case "attribute": this.calcAttribute(b.name, value, ItemCalculator.SUM_OP); break; case "skill": this.calcSkill(b.name, value, ItemCalculator.SUM_OP); } } } } result = this.result; this.popResult(); return result; }; ItemCalculator.prototype.pushResult = function() { return this._resultStack.push($.extend(true, {}, this.result)); }; ItemCalculator.prototype.popResult = function() { return this.result = this._resultStack.pop(); }; return ItemCalculator; }(); return SkillsCalc; }(); $(document).ready(function() { var api, calc; api = TheWestApi.register(SkillsCalc.ID, SkillsCalc.NAME, SkillsCalc.MIN_GAME_VERSION, SkillsCalc.MAX_GAME_VERSION, SkillsCalc.AUTHOR, SkillsCalc.WEB_SITE); api.setGui("Copyrights, changelog and other details see <a href='" + SkillsCalc.WEB_SITE + "' target='_blank'>here</a>."); calc = null; EventHandler.listen([ "itemmanager_loaded", "itemsetmanager_loaded" ], function() { if (calc === null && ItemManager.isLoaded() && west.storage.ItemSetManager.isLoaded()) { calc = new SkillsCalc; } return EventHandler.ONE_TIME_EVENT; }); return true; }); return true; });