// ==UserScript==
// @name ComfortablePlayingInGW
// @namespace https://github.com/MyRequiem/comfortablePlayingInGW
// @description Веселые плюшки для Gwars
// @id comfortablePlayingInGW@MyRequiem
// @updateURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/_comfortablePlayingInGW.meta.js
// @downloadURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/_comfortablePlayingInGW.user.js
// @include https://*gwars*
// @include https://*ganjafoto*
// @include http*://*ganjafile*
// @grant none
// @license MIT
// @version 1.176-200424
// @author MyRequiem [https://www.gwars.io/info.php?id=2095458]
// ==/UserScript==
// ______ ____ __ __ __
// / ____/___ ____ ___ / __/___ _____/ /_____ _/ /_ / /__
// / / / __ \/ __ `__ \/ /_/ __ \/ ___/ __/ __ `/ __ \/ / _ \
// / /___/ /_/ / / / / / / __/ /_/ / / / /_/ /_/ / /_/ / / __/
// \____/\____/_/ /_/ /_/_/ \____/_/ \__/\__,_/_.___/_/\___/
//
// ____ __ _ ____ _______ __
// / __ \/ /___ ___ __(_)___ ____ _ / _/___ / ____/ | / /
// / /_/ / / __ `/ / / / / __ \/ __ `/ / // __ \ / / __ | | /| / /
// / ____/ / /_/ / /_/ / / / / / /_/ / _/ // / / / / /_/ / | |/ |/ /
// /_/ /_/\__,_/\__, /_/_/ /_/\__, / /___/_/ /_/ \____/ |__/|__/
// /____/ /____/
// lint {{{1
/*global unsafeWindow */
/*jslint browser: true, maxlen: 80, regexp: true, vars: true, plusplus: true,
continue: true, devel: true, nomen: true
*/
/*eslint-env browser */
/*eslint no-useless-escape: 'warn', linebreak-style: ['error', 'unix'],
quotes: ['error', 'single'], semi: ['error', 'always'],
eqeqeq: 'error', curly: 'error'
*/
/*jscs:disable requireMultipleVarDecl, requireVarDeclFirst */
/*jscs:disable disallowKeywords, disallowDanglingUnderscores */
/*jscs:disable validateIndentation */
// 1}}}
(function () {
'use strict';
/**
* @class General {{{1
* @constructor
*/
var General = function () {
/**
* @property root
* @type {Object}
*/
this.root = this.getRoot();
/**
* @property doc
* @type {Object}
*/
this.doc = this.root.document;
/**
* @property loc
* @type {String}
*/
this.loc = this.root.location.href;
/**
* @property st
* @type {Object}
*/
this.st = this.root.localStorage;
/**
* @property cons
* @type {Object}
*/
this.cons = this.root.console;
/**
* @property version
* @type {String}
*/
this.version = '1.176-200424';
/**
* @property stString {{{2
* @type {String}
*/
this.stString = this.version + // [0] - script version
/*
[1] - initScript
[0] - NotGiveCannabisLeaf
[1] - AdditionForNavigationBar
[2] - AdsFilter (удален)
[3] - AdvBattleAll
[4] - BlacklistHighlighting
[5] - WorkPostGrenadesBroken
[6] - ResourcesAndBonuses
[7] - CritShotsAndLinksBtlLog
[8] - DeleteSms
[9] - FarmExperience
[10] - FarmTimer
[11] - ComfortableLinksForFarm (удален)
[12] - TimeNpc
[13] - AllPlantsOnFarm
[14] - GwMenu
[15] - InventoryPlus
[16] - CountBattles
[17] - GbCounter
[18] - BonusInfo (удален)
[19] - BuyHightech
[20] - NewsAndInvit
[21] - DoFilter (удален)
[22] - FilterResOnStat
[23] - FilterWarlistOne2One
[24] - FixSkills
[25] - FuckTheFarm
[26] - HistorySms
[27] - LinksToHighTech
[28] - GameMania
[29] - GosEnergoAtomFilter
[30] - SortSyndOnline
[31] - HousHealth
[32] - SortSyndWars (удален)
[33] - LinksInOne2One
[34] - One2OneCallerInfo
[35] - PersonalNPCNotifications
[36] - PortTimer
[37] - PortsAndTerminals
[38] - RangeWeapon
[39] - RentAndSale
[40] - ScanKarma
[41] - ScanPers
[42] - ShowInitMessOnForum
[43] - SearchUser
[44] - SkillCounters
[45] - SyndPtsAnalyser
[46] - SyndAnalyser
[47] - ShowMyAchievements
[48] - SyndPersInfo (удален)
[49] - SyndOnlineOnMainPage
[50] - TimeKarma
[51] - ImgPokemonsOnBattle
[52] - SoundSyndBattle
[53] - AdvForum
[54] - DelAndAddBlackSms
[55] - FilterGeneralFighting (удален)
[56] - Regeneration
[57] - ProfColor
[58] - CurrentQuestOnInfo
[59] - CommonBattleFilter
[60] - CalculateSyndLvl (удален)
[61] - PortsSyndLinks
[62] - BbCodeInMessages
[63] - ProfessionLevels */
'@||||||||||' +
'||||||||||' +
'||||||||||' +
'||||||||||' +
'||||||||||' +
'||||||||||' +
'|||' +
/*
[2] - AdditionForNavigationBar
[0] - '{"linkName": ["href", "style"], ...}' */
'@' +
/*
[3] - AdsFilter (удален)
[0] - остров (нет,Z,G: '', 1, 2)
[1] - фильтр по онлайну */
'@|' +
/*
[4] - AdvBattleAll
# настройки
[0] - таймаут обновления данных в бою
[1] - таймаут обновления страницы, когда висим в заявке
# основные данные скрипта
[2] - метод сортировки списка врагов (0 - 5)
[3] - чекбокс "запомнить ход"
[4] - чекбокс "не дублировать цель" (для двуруких)
# последний сделаный ход (если включено "запомнить ход")
[5] - левая
[6] - правая
[7] - куда отходим
[8] - кидаем грену или нет
[9] - подходим или нет
[10] - чекбокс <Сказать своей команде>
# запоминаем ход в хранилище перед тем как сказать ход
[11] - номер в кого стреляем
[12] - направление левой руки
[13] - направление правой руки
[14] - куда отходим
[15] - кидаем грену или нет
[16] - подходим или нет
[17] - список выбора врагов (хэш: имя --> номер)
[18] - чекбокс "Говорить только левую руку"
[19] - общий навык
[20] - навык специалиста
[21] - звук при начале боя
[22] - звук при начале хода
[23] - чекбокс "Говорить только правую руку"
[24] - подствольник
[25] - показывать чекбокс "Сказать как координатор"
[26] - чекбокс "Сказать как координатор" отмечен
### при нажатии на кнопку "Сказать ход":
[27] - не выводить имя противника
[28] - не выводить применяемые навыки */
'@||||||||||||||||||||||||||||' +
/*
[5] - BlacklistHighlighting
[0] - ID персов из ЧС ('id1,id2,...')
[1] - блокировать ссылку принятия боя в одиночках? */
'@|' +
/*
[6] - WorkPostGrenadesBroken
[0] - звук при получении почты/посылки (проигран, нет)
[1] - звук по окончании работы (проигран или нет)
[2] - отображать время работы
[3] - отображать почту/посылку
[4] - отображать слом
[5] - отображать грену
[6] - звук при получении почты/посылки
[7] - звук "Пора работать" */
'@|||||||' +
/*
[7] - CritShotsAndLinksBtlLog
[0] - показывать/не показывать критические выстрелы */
'@' +
/*
[8] - DeleteSms
[0] - отмечать синдовые рассылки
[1] - отмечать рассылки от робота
[2] - НЕ отмечать письма с пометкой "важное" */
'@||' +
/*
[9] - FarmTimer
[0] - время полива/сбора
[1] - действие (Полить|Собрать)
[2] - время последнего проигрывания звука
[3] - звук проигран?
[4] - номер звука когда пора поливать/собирать
[5] - интервал повторения звука */
'@|||||' +
/*
[10] - TimeNpc
[0] - звук вкл/выкл
[1] - ID NPC, у которого последний раз брали квест
[2] - время
[3] - номер звука */
'@|||' +
/*
[11] - AllPlantsOnFarm
[0] - номер первого недоступного растения
(не используется с версии 1.82)
[1] - время сброса счетчика
[2] - количество гб
[3] - количество производа
[4] - показывать счетчик ГБ?
[5] - показывать счетчик производа? */
'@|||||' +
/*
[12] - GwMenu
[0] - чекбокс "Показывать всегда" */
'@' +
/*
[13] - GbCounter
[0] - количество Гб */
'@' +
/*
[14] - NewsAndInvit
[0] - {'newsId': 0|1, ...} */
'@' +
/*
[15] - FilterResOnStat
[0] - список отображаемых ресурсов через запятую */
'@' +
/*
[16] - FilterWarlistOne2One
[0] - название оружия */
'@' +
/*
[17] - GosEnergoAtomFilter
[0] - остров ('' - любой, 'Z', 'G')
[1] - тип объекта ('' - любой, '1' - эски, '2' - уранки,
'3' - уранки [2], '4' - уранки [3])
[2] - синдикат ('', '0' - ничейки, 'xxx' - ID синда) */
'@' +
/*
[18] - PersonalNPCNotifications
[0] - звук,когда NPC ожидает распоряжений
[1] - звук, когда NPC находится на Аутленде и его
здоровье менее 30%
[2] - null (осталось от SortSyndOnline) */
'@||' +
/*
[19] - HousHealth
[0] - вышел из боя */
'@' +
/*
[20] - CommonBattleFilter
[0] - максимальный уровень
[1] - чекбокс "без именных"
[2] - чекбокс "по мощности" */
'@0|1|1' +
/*
[21] - One2OneCallerInfo
[0] - звук при вызове */
'@' +
/*
[22] - PortTimer
[0] - '{
date: "",
syndid: "",
time: [],
current: ""}' */
'@' +
/*
[23] - ScanKarma
[0] - текущая карма 'xx/xx' */
'@' +
/*
[24] - ScanPers
[0] - id персонажа
[1] - id синда персонажа
[2] - чекбокс звук
[3] - чекбокс сообщение
[4] - id звука при входе
[5] - id звука при выходе
[6] - звук(сообщение) проигран или нет
[7] - ник персонажа
[8] - timestamp последнего сканирования */
'@||||||||' +
/*
[25] - SkillCounters
[0] - боевой
[1] - эконом
[2] - производ
[3] - пистолеты
[4] - гранаты
[5] - автоматы
[6] - пулеметы
[7] - дробовики
[8] - снайперки
[9] - синдикатный уровень
[10] - время последнего сброса */
'@||||||||||' +
/*
[26] - ShowMyAchievements
[0] - номера ачивок '1,14,35...' */
'@' +
/*
[27] - TimeKarma
[0] - время, когда выставили карму */
'@' +
/*
[28] - SoundSyndBattle
[0] - время до боя, когда будет проигран второй звук
[1] - звук №1
[2] - звук №2
[3] - флаги проигрывани звука ('', '1', '2') */
'@|||' +
/*
[29] - AdvForum
[0] - отмечать закрытые темы
[1] - звук при появлении новой темы
[2] - интервал перезагрузки страниц с темами форума
[3] - не показывать закрытые темы
[4] - не показывать прикрепленки
[5] - ветки, где скрипт работать не будет
[6] - список включения/отключения показа форумов
[7] - данные веток форума:
{
'fid': {
'tid': {
d: str // дата первого просмотра темы
l: str // id последнего сообщения
с: str // номер последнего сообщения
},
...
},
...
}
[8] - {'fid': id_последней темы, ...} */
'@1|||||1,5,7,11,15,24,34,35,36,37,41,42,44,46,47,' +
'48,54|1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,' +
'1|{}|{}' +
/*
[30] - FilterGeneralFighting (удален)
[0] - минимальный уровень
[1] - максимальный уровень
[2] - командные
[3] - случайные
[4] - DM
[5] - без DM
[6] - без синдовых
[7] - только синдовые
[8] - показывать умения
[9] - показывать дальность
[10] - нужная дальность
[11] - время до боя (сек) */
'@5|50||||||||||' +
/*
[31] - Regeneration
[0] - номер звука при 80%
[1] - номер звука при 100%
[2] - текущее состояние:
'' : пустое
'1': получили 80%
'2': получили 100%
'3': получили 80%, но еще не получили 100%
'4': финиш
*/
'@||'; // 2}}}
/**
* @property myID
* @type {RegExpExecArray}
*/
this.myID = /(^|;) ?uid=([^;]*)(;|$)/.exec(this.doc.cookie);
/**
* @property DESIGN_VERSION
* @type {RegExpExecArray}
*/
this.DESIGN_VERSION = /(^|;) ?version=([^;]*)(;|$)/.
exec(this.doc.cookie);
/**
* @property selfName
* @type {String}
*/
this.selfName = 'comfortablePlayingInGW';
/**
* @property STORAGENAME
* @type {String}
*/
this.STORAGENAME = (this.myID ? this.myID[2] : '') + '_' +
this.selfName;
/**
* @property mainPath
* @type {String}
*/
this.mainPath = 'https://raw.githubusercontent.com/MyRequiem/' +
this.selfName + '/master/';
/**
* @property imgPath
* @type {String}
*/
this.imgPath = this.myID && this.myID[2] === '2095458' ?
'http://127.0.0.1/imgs/gwScripts/' : this.mainPath + 'imgs/';
/**
* @property viewMode
* @type {Boolean}
*/
this.viewMode = /\/(warlog|battlelog)\.php/.test(this.loc);
/**
* @property domain
* @type {String}
*/
this.domain = this.doc.domain;
/**
* @property mainDomain
* @type {Boolean}
*/
this.mainDomain = /gwars/.test(this.loc);
}; // 1}}}
/**
* @lends General.prototype {{{1
*/
General.prototype = {
/**
* @method getRoot {{{2
* @return {Object}
*/
getRoot: function () {
var rt = typeof unsafeWindow;
return rt !== 'undefined' ? unsafeWindow : window;
}, // 2}}}
/**
* @method setNewStorage {{{2
*/
setNewStorage: function () {
var oldSt = this.st.getItem(this.STORAGENAME);
if (!oldSt) {
this.st.setItem(this.STORAGENAME, this.stString);
return;
}
// если были старые данные, переносим их в новую storage-строку
var newSt = this.stString.split('@');
oldSt = oldSt.split('@');
var nSt, oSt, i, j;
for (i = 1; i < oldSt.length; i++) {
nSt = newSt[i].split('|');
if (nSt.length === 1) {
newSt[i] = oldSt[i];
continue;
}
oSt = oldSt[i].split('|');
for (j = 0; j < oSt.length; j++) {
nSt[j] = oSt[j];
}
newSt[i] = nSt.join('|');
}
this.st.setItem(this.STORAGENAME, newSt.join('@'));
}, // 2}}}
/**
* @method getData {{{2
* @param {int} ind
* @return {Array}
*/
getData: function (ind) {
return this.st.getItem(this.STORAGENAME).
split('@')[ind].split('|');
}, // 2}}}
/**
* @method setData {{{2
* @param {String|Array} data
* @param {int} ind
*/
setData: function (data, ind) {
var dt = this.st.getItem(this.STORAGENAME).split('@');
dt[ind] = typeof data !== 'string' ? data.join('|') : data;
this.st.setItem(this.STORAGENAME, dt.join('@'));
}, // 2}}}
/**
* @method getInitScript {{{2
* @return {Array}
*/
getInitScript: function () {
if (this.mainDomain) {
return this.getData(1);
}
return [];
}, // 2}}}
/**
* @method $ {{{2
* @param {String} id
* @return {HTMLElement|null}
*/
$: function (id) {
return this.doc.querySelector('#' + id);
}, // 2}}}
/**
* @method checkMainData {{{2
* @return {Boolean}
*/
checkMainData: function () {
if (!this.st) {
alert('Ваш браузер не поддерживает технологию localStorage');
return false;
}
if (this.mainDomain) {
if (!this.myID || !this.DESIGN_VERSION) {
this.cons.log('!this.myID || !this.DESIGN_VERSION');
return false;
}
if (!this.st.getItem(this.STORAGENAME) ||
this.getData(0)[0] !== this.version) {
this.setNewStorage();
}
this.myID = this.myID[2];
this.DESIGN_VERSION = this.DESIGN_VERSION[2];
}
return true;
} // 2}}}
}; // 1}}}
var general, initScript;
/**
* @class GetStrDate {{{1
* @constructor
*/
var GetStrDate = function () {
/**
* @method init
* @param {int|String} time
* @return {String}
*/
this.init = function (time) {
var date = time === 'now' ? new Date() : new Date(time),
month = date.getMonth() + 1,
day = date.getDate();
return (day < 10 ? '0' + day : day) + '.' +
(month < 10 ? '0' + month : month) + '.' +
/20(\d+)/.exec(date.getFullYear().toString())[1];
};
}; // 1}}}
/**
* @class GetTimestamp {{{1
* @constructor
*/
var GetTimestamp = function () {
/**
* @method init
* @param {String} val
* @return {int}
*/
this.init = function (val) {
var date = /(\d\d)\.(\d\d)\.(\d\d)/.exec(val);
if (!date) {
return 0;
}
var d = +date[1],
m = +date[2],
y = +date[3];
if (!d || d > 31 || !m || m > 12 || !y) {
return 0;
}
return new Date(2000 + y, m - 1, d).getTime();
};
}; // 1}}}
/**
* @class UrlEncode {{{1
* @constructor
*/
var UrlEncode = function () {
/**
* @method init
* @param {String} str
* @return {String}
*/
this.init = function (str) {
var mass = {1040: 192, 1041: 193, 1042: 194, 1043: 195, 1044: 196,
1045: 197, 1046: 198, 1047: 199, 1048: 200, 1049: 201,
1050: 202, 1051: 203, 1052: 204, 1053: 205, 1054: 206,
1055: 207, 1056: 208, 1057: 209, 1058: 210, 1059: 211,
1060: 212, 1061: 213, 1062: 214, 1063: 215, 1064: 216,
1065: 217, 1066: 218, 1067: 219, 1068: 220, 1069: 221,
1070: 222, 1071: 223, 1072: 224, 1073: 225, 1074: 226,
1075: 227, 1076: 228, 1077: 229, 1078: 230, 1079: 231,
1080: 232, 1081: 233, 1082: 234, 1083: 235, 1084: 236,
1085: 237, 1086: 238, 1087: 239, 1088: 240, 1089: 241,
1090: 242, 1091: 243, 1092: 244, 1093: 245, 1094: 246,
1095: 247, 1096: 248, 1097: 249, 1098: 250, 1099: 251,
1100: 252, 1101: 253, 1102: 254, 1103: 255, 1025: 168,
1105: 184, 8470: 185},
result = '',
code,
i;
for (i = 0; i < str.length; i++) {
code = str.charCodeAt(i);
code = mass[code] || code;
if (code < 16) {
result += '%0' + code.toString(16);
} else {
result += '%' + code.toString(16);
}
}
return result;
};
}; // 1}}}
/**
* @class PlaySound {{{1
* @constructor
*/
var PlaySound = function () {
/**
* @method init
* @param {int|String} sound
*/
this.init = function (sound) {
if (sound && sound !== '0') {
var audio = general.$('cpingw_audio');
if (!audio) {
audio = general.doc.createElement('audio');
audio.setAttribute('id', 'cpingw_audio');
var divAudio = general.doc.createElement('div');
divAudio.setAttribute('style', 'display: none;');
divAudio.appendChild(audio);
general.doc.body.appendChild(divAudio);
}
audio.volume = 0.2;
audio.src = (general.myID === '2095458' ?
'http://127.0.0.1/' : general.mainPath) + 'sounds/' +
sound + '.ogg';
// noinspection JSIgnoredPromiseFromCall
audio.play();
}
};
}; // 1}}}
/**
* @class GetRandom {{{1
* @constructor
*/
var GetRandom = function () {
/**
* @method init
* @param {int} a
* @param {int} b
* @return {int}
*/
this.init = function (a, b) {
return Math.round(a + (b - a) * Math.random());
};
}; // 1}}}
/**
* @class GetTopPanel {{{1
* @constructor
*/
var GetTopPanel = function () {
/**
* @method init
* @return {HTMLElement|null}
*/
this.init = function () {
// ищем верхнюю панель "MyRequiem [603/603] ... 21:01, 3095 онлайн"
var topPanel;
if (general.DESIGN_VERSION === 'v2') { // новый дизайн
topPanel = general.doc.querySelector('td.gw-header-col2 ' +
'td[width="50%"][valign="middle"]');
if (topPanel) {
topPanel.setAttribute('style', 'width: 70%;');
}
} else {
topPanel = general.doc.
querySelector('td.txt[align="left"] nobr:first-child');
if (topPanel) {
// noinspection JSUnresolvedFunction
topPanel.parentNode.setAttribute('style', 'width: 70%;');
}
}
return topPanel;
};
}; // 1}}}
/**
* @class SetSettingsButton {{{1
* @constructor
*/
var SetSettingsButton = function () {
/**
* @method init
*/
this.init = function () {
var topPanel = new GetTopPanel().init();
if (topPanel) {
// noinspection JSUnresolvedVariable
var settingsButton = general.doc.createElement('a'),
target = topPanel.nextElementSibling ||
topPanel.parentNode.nextElementSibling;
settingsButton.innerHTML = '';
settingsButton.setAttribute('href',
'https://' + general.domain + '/news.php?set=1');
settingsButton.setAttribute('style', 'margin-left: 7px;');
target.querySelector('table td:last-child>nobr').
appendChild(settingsButton);
}
};
}; // 1}}}
/**
* @class AjaxQuery {{{1
* @constructor
*/
var AjaxQuery = function () {
/**
* @method init
* @param {String} url
* @param {String} rmethod
* @param {String|null} param
* @param {Boolean} async
* @param {Function} onsuccess
* @param {Function|null} onfailure
*/
this.init = function (url, rmethod, param, async, onsuccess,
onfailure) {
var xmlHttpRequest = new XMLHttpRequest();
if (!xmlHttpRequest) {
general.cons.log('Error create xmlHttpRequest !!!');
return;
}
xmlHttpRequest.open(rmethod, url, async);
if (rmethod === 'POST') {
xmlHttpRequest.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
xmlHttpRequest.setRequestHeader('Content-length',
param.length.toString());
xmlHttpRequest.setRequestHeader('Connection', 'close');
}
xmlHttpRequest.send(param);
if (async) {
var timeout = general.root.setTimeout(function () {
xmlHttpRequest.abort();
}, 10000);
xmlHttpRequest.onreadystatechange = function () {
if (xmlHttpRequest.readyState === 4) {
clearTimeout(timeout);
if (xmlHttpRequest.status === 200) {
onsuccess(xmlHttpRequest);
} else if (onfailure) {
onfailure();
}
}
};
} else {
if (xmlHttpRequest.status === 200) {
onsuccess(xmlHttpRequest);
} else {
onfailure(xmlHttpRequest);
}
}
};
}; // 1}}}
/**
* @class CheckInputText {{{1
* @constructor
*/
var CheckInputText = function () {
/**
* @method init
* @param {Object} inp
* @param {int} limit
* @return {Boolean}
*/
this.init = function (inp, limit) {
var _inp = inp,
val = _inp.value,
lim = limit || 0;
return !(!val || isNaN(+val) || +val < lim);
};
}; // 1}}}
/**
* @class GetSelectSound {{{1
* @constructor
*/
var GetSelectSound = function () {
/**
* @method init
* @param {String} id
* @return {String}
*/
this.init = function (id) {
var sounds = [
'Без звука', 'Перезарядка', 'Выстрел дробовика',
'Открытие двери', 'Взрыв бочки', 'Выстрел BFG',
'Радио-зуммер', 'Подтверждение цели', 'Ion Cannon Ready!',
'Select target!', 'Звук тревоги', 'I`m alive!',
'Орки смеются', 'Unholy Armor', 'We`ve been attacked!',
'Кот мяукает', 'Кот мяукает #2', 'Take cover!', 'Stupid!',
'Hello!', 'hehehehe!', 'Chimes', 'Ding', 'Ошибка',
'Отказ оборудования', 'А, вот эти ребята', 'Не-не-не-не!',
'нет, Девид Блейн, нет!',
'Я делаю особую магию ', 'Prepare for battle!',
'Pick up your weapons'
],
str = ' ' +
'';
};
}; // 1}}}
/**
* @class ShowMainSettings {{{1
* @constructor
*/
var ShowMainSettings = function () {
/**
* @property getSelectSound
* @type {Function}
*/
this.getSelectSound = new GetSelectSound().init;
// noinspection HtmlUnknownAttribute
/**
* @property infoScripts {{{2
* @type {Object}
*/
this.infoScripts = {
'Персонаж': [
['Gw-Меню', 'Панель с множеством полезных ссылок для игры.' +
this.getGitHubLink('gwMenu'), '14'],
['Логотип игры', 'На всех страницах заменяет логотип игры ' +
' на зеленый ' +
'листик ' +
this.getGitHubLink('notGiveCannabisLeaf'), '0'],
['Таймер выздоровления', 'Таймер выздоровления персонажа ' +
'на главной странице. ' +
this.getSelectSound('sound80HP') +
' звук при достижении 80% HP ' +
this.getSelectSound('sound100HP') +
' звук при достижении 100% HP' +
this.getGitHubLink('regeneration') +
'идея: ' +
'W_or_M', '56'],
['Дополнение для панели навигации',
'Добавляет возможность установить дополнительные ссылки ' +
'в панель навигации.' +
this.getGitHubLink('additionForNavigationBar'), '1'],
['Подсветка персонажей из ЧС', 'Подсвечивает ссылки на ' +
'персонажей, входящих в черный список на всех страницах ' +
'игры. Делает неактивной ссылку принятия боя c ' +
'персонажем из черного списка в одиночных боях.
' +
' ' +
'Запомнить черный список (скрипт должен быть включен)' +
' блокировать ссылку принятия боя с персонажем ' +
'из ЧС в одиночных заявках' +
this.getGitHubLink('blacklistHighlighting'), '4'],
['Работа, письмо, посылка, граната, слом', 'Окончание ' +
'работы, осталось времени работать, почта, посылка, ' +
'присутствие гранаты на поясе, проверка сломанных вещей. ' +
'На все события оповещения звуковые и визуальные. ' +
'P.S. Гранатомет в руках расценивается как ' +
'присутствие гранаты.
отображать время работы ' +
' ' +
'отображать получение почты/посылки отображать ' +
'наличие сломанных предметов отображать отсутствие гранаты ' +
'на поясе Звук при получении почты: ' +
this.getSelectSound('soundSms') + ' Звук ' +
'"Пора работать": ' +
' ' + this.getSelectSound('soundWork') +
this.getGitHubLink('workPostGrenadesBroken'), '5'],
['Ресурсы и бонусы', 'Создает ссылки "Ресурсы" и "Бонусы" ' +
'вверху страницы. При клике выводятся соответствующие ' +
'данные.' + this.getGitHubLink('resourcesAndBonuses'), '6'],
['Удаление личных сообщений', 'Добавляет сылку "Удалить ' +
'отмеченные" вверху страниц входящих и исходящих ' +
'сообщений. Отметка синдикатных рассылок и сообщений от ' +
'робота.
отмечать синдовые рассылки ' +
' ' +
'отмечать рассылки от робота ' +
' ' +
'НЕ отмечать письма с пометкой "важное"' +
this.getGitHubLink('deleteSms'), '8'],
['Подтверждение нажатия "Удалить и забанить"', 'Красит ' +
'кнопку "Удалить и забанить" при просмотре личных ' +
'сообщений в розовый цвет. При нажатии требует ' +
'подтверждения операции.' +
this.getGitHubLink('delAndAddBlackSms'), '54'],
['Таймер для выполнения квестов NPC', 'На главной странице ' +
'выводит время, оставшееся до взятия квеста и сcылку на ' +
'NPC, у которого в последний раз брали квест. Звуковое ' +
'оповещение. Умеет выводить список NPC с информацией ' +
'о них для каждого острова. Звук "Пора делать ' +
'квест": ' + this.getSelectSound('soundTimerNPC') +
this.getGitHubLink('timeNpc'), '12'],
['Упаковка одинаковых предметов в инвентаре', 'Упаковка ' +
'одинаковых предметов в инвентаре.' +
this.getGitHubLink('inventoryPlus'), '15'],
['Счетчик Гб', 'Показывает измененние количества Гб на ' +
'главной странице персонажа.' +
this.getGitHubLink('gbCounter'), '17'],
['Новости и приглашения в синдикаты', 'Выделение и мигание ' +
'приглашений в синдикаты, новых и не прочитанных ' +
'новостей на главной странице персонажа.' +
this.getGitHubLink('newsAndInvit'), '20'],
['Исправление умелок вида +-xxx', 'Исправляет умелки вида ' +
'+-xxx, полученные при выполнении квестов на странице ' +
'информации персонажа и на главной странице.' +
this.getGitHubLink('fixSkills'), '24'],
['Просмотр истории личных сообщений', 'При просмотре ' +
'входящего/исходящего сообщения устанавливает ссылку ' +
'для вывода предыдущей переписки с персонажем. Так же ' +
'"умеет" выводить ссылки на тексты сообщений, доступные ' +
'для официальных синдикатов в хронологическом порядке.' +
this.getGitHubLink('historySms'), '26'],
['Результативность игры в рулетку, покер, тотализатор',
'Анализ результативности игры в рулетку, тотализатор, ' +
'покер и заработанных денег в боях на странице ' +
'информации персонажа.' +
this.getGitHubLink('gameMania'), '28'],
['Порты и терминалы', 'Показывает на карте местонахождение ' +
'терминалов и портов.' +
this.getGitHubLink('portsAndTerminals'), '37'],
['Дальность оружия', 'Добавляет дальность оружия на странице ' +
'информации любого персонажа.' +
this.getGitHubLink('rangeWeapon'), '38'],
['Изменение Вашей кармы', 'При изменении Вашей кармы выводит ' +
'сообщение на странице информации персонажа.' +
this.getGitHubLink('scanKarma'), '40'],
['Извещения о входе персонажа в игру', 'Выдает сообщение ' +
'и/или звуковой сигнал при появлении (или выходе) в ' +
'онлайне определенного персонажа.' +
this.getGitHubLink('scanPers'), '41'],
['Поиск персонажа', 'Добавляет форму поиска персонажа.' +
this.getGitHubLink('searchUser'), '43'],
['Счетчики опыта и умений', 'Счетчики опыта и умений на ' +
'главной странице персонажа.' +
this.getGitHubLink('skillCounters'), '44'],
['Быстрый просмотр Ваших достижений', 'Добавляет ссылку ' +
'"Достижения" в верхней части страниц игры при нажатии ' +
'на которую выводятся Ваши ачивки, но только те, ' +
'которые были отмечены на странице достижений.' +
this.getGitHubLink('showMyAchievements') +
'идея: ' +
'' +
'Горыныч', '47'],
['Время до возможности выставить карму', 'На странице ' +
'информации персонажа показывает динамический счетчик ' +
'времени до возможности поставить карму.' +
this.getGitHubLink('timeKarma'), '50'],
['Подсветка профессий', 'При наличии у персонажа лицензии ' +
'киллера, боевика или наемника название профессии на его ' +
'странице информации окрашивается в красный цвет.' +
this.getGitHubLink('profColor'), '57'],
['Текущий мини-квест на странице информации персонажа',
'Вывод текущего ужедневного мини-квеста на странице ' +
'информации персонажа.' +
this.getGitHubLink('currentQuestOnInfo') +
'идея: ' +
'' +
'kaa', '58'],
['Кнопки для вставки bb-кодов цитирования и наклонного шрифта',
'В формах для отправки личных сообщений и сообщений на ' +
'форуме добавляет кнопки для вставки в позиции курсора ' +
'bb-кодов для цитирования [q][/q] и наклонного шрифта ' +
'[i][/i]' +
this.getGitHubLink('bbCodeInMessages'), '62'],
['Счетчик опыта профессий',
'На странице информации персонажа отображает оставшееся ' +
'количество очков до следующего уровня професии.' +
this.getGitHubLink('professionLevels') +
'идея: ' +
'' +
'Bodyarm', '63']],
'Персональный NPC': [
['Оповещения', 'Если личный NPC ожидает распоряжений и его ' +
'здоровье более 79%, то на главной странице персонажа ' +
'ссылка на NPC начинает "пульсировать". Если NPC ' +
'находится на Аутленде и его здоровье менее 30%, то фон ' +
'ссылки становится розовый. Звуковые оповещения. Статус ' +
'NPC проверяется один раз в 10 секунд, перезагрузки ' +
'главной страницы персонажа не требуется.
' +
'Звук при ожидании распоряжений: ' +
this.getSelectSound('soundPersNPC1') +
' Звук, если здоровье на Ауте < 30%: ' +
this.getSelectSound('soundPersNPC2') +
this.getGitHubLink('personalNPCNotifications'), '35']],
'Бои': [
['Дополнение для боев', 'Расширенная информация в списке ' +
'выбора противника + сортировка списка по номеру, ' +
'дальности, уровню, видимости и т.д. Динамический центр, ' +
'продвинутое расположение бойцов на поле боя в бою и в ' +
'режиме наблюдения за боем, кнопка "Сказать ход", ' +
'чекбоксы "Говорить только правую руку", "Говорить ' +
'только левую руку", "Сказать своей команде", "Сказать ' +
'как координатор". Быстрая вставка ника в поле чата (при ' +
'клике на "конвертике" рядом с никами бойцов или при ' +
'двойном клике на изображении бойца на схеме поле боя). ' +
'Информация вверху страницы о набитом HP, вашем ' +
'здоровье, видимости и т.д. При одиночном клике по ' +
'противнику на схеме поля боя происходит его выбор в ' +
'качестве цели. Кнопка "Обновить". Подсвечивает зеленым ' +
'цветом тех персонажей, которые уже сделали ход. Выводит ' +
'общее количество персонажей и количество персонажей ' +
'сделавших ход. Таймаут обновления заявки после входа в ' +
'нее и таймаут обновления данных в бою. ' +
'Параметры в настройках ' +
'персонажа для правильной работы скрипта: ' +
'(скриншот) ' +
' ' +
'- оформление боя в desktop-версии игры: упрощенное ' +
' ' +
'- расположение в бою: примитивное ' +
' ' +
'- JavaScript-версия: использовать.
' +
'Показывать чекбокс "Сказать как координатор" ' +
'(вставка \'!*\' в поле чата боя): ' +
'' +
'
При нажатии на кнопку "Сказать ход": ' +
' ' +
' ' +
'не выводить имя противника ' +
' ' +
' ' +
'не выводить применяемые навыки' +
'
Таймаут обновления данных в бою:' +
'' +
' сек (0 - настройки игры по умолчанию) ' +
'Таймаут обновления заявки при входе в нее: ' +
' сек (0 - настройки игры по умолчанию) ' +
'Звук при начале боя: ' +
this.getSelectSound('advBattleSound1') + ' ' +
'Звук при начале хода: ' +
this.getSelectSound('advBattleSound2') +
this.getGitHubLink('advBattleAll'), '3'],
['Ссылки в логе боя, критические выстрелы', 'В бою и на ' +
'страницax логов боев делает все ники персонажей ' +
'ссылками. Показывает критические выстрелы вашего ' +
'персонажа и их общее количество (опционально).
' +
' ' +
'показывать критические выстрелы' +
this.getGitHubLink('critShotsAndLinksBtlLog'), '7'],
['Счетчик боев', 'Показывает общее количество боев, побед и ' +
'поражений за текущие сутки на страницax протоколов ' +
'боев.' + this.getGitHubLink('countBattles'), '16'],
['Счетчик времени до начала синдикатного боя', 'Динамический ' +
'счетчик времени до начала синдикатного боя, звуковое ' +
'оповещение.
- время до боя ' +
'(сек), когда будет проигран второй звук ' +
'(не менее 15) ' +
this.getSelectSound('syndSoundBattle1') + ' - звук, если ' +
'осталось более сек ' +
this.getSelectSound('syndSoundBattle2') + ' - звук, если ' +
'осталось менее сек' +
this.getGitHubLink('soundSyndBattle'), '52'],
['Фильтр общих боев', 'Фильтр общих боев по уровню бойцов.' +
this.getGitHubLink('commonBattleFilter'), 59],
['Фильтр по оружию в одиночных заявках', 'Фильтр по оружию в ' +
'одиночых заявках. Фильтр по уровням и типу оружия, ' +
'встроенный в игре, переносится вверх страницы. Все ' +
'настройки находятся на странице одиночных заявок' +
this.getGitHubLink('filterWarlistOne2One'), '23'],
['Ссылки на странице одиночных заявок', 'На странице ' +
'заявок одиночных боев делает ники вызывающих на бой ' +
'персонажей ссылками на них.' +
this.getGitHubLink('linksInOne2One'), '33'],
['Информация о вызывающем Вас на бой персонаже в одиночных ' +
'боях', 'Выводит информацию о вызывающем Вас на бой ' +
'персонаже в одиночных боях (HP, дальность оружия, ' +
'умения, ссылки-изображения на экипировку, бонусы). ' +
'Звуковое оповещение при вызове.
Звук при вызове: ' +
this.getSelectSound('soundOne2One') +
this.getGitHubLink('one2OneCallerInfo'), '34'],
['Контроль Уранa и ЭC', 'Сортировка объектов по типу, ' +
'островам и контролирующим синдикатам на странице ' +
'ГосЭнегоАтом' +
this.getGitHubLink('gosEnergoAtomFilter'), '29'],
['Проверка сектора после боя', 'Выводит сообщение после боя, ' +
'если персонаж находится не в секторе со своим домом и ' +
'его здоровье менее 80%.' +
this.getGitHubLink('housHealth'), '31'],
['Изображения покемонов', 'В боях с покемонами и в режиме ' +
'наблюдения за боем (Ejection Point, Overlord Point, ' +
'прибрежная зона) показывает изображения для каждого ' +
'пока.' + this.getGitHubLink('imgPokemonsOnBattle') +
'идея: ' +
'' +
'Buger_man', '51'],
['Таймер для боев за порты', 'Вывод точного/оставшегося ' +
'времени до боя за порт в верхней части страницы.' +
this.getGitHubLink('portTimer') +
'идея: ' +
'' +
'Enemy333', '36'],
['Знаки синдикатов на страницах списков ближайших/прошедших ' +
'боев за порты', 'На страницах списков ближайших/' +
'прошедших боев за порты добавляет знаки синдикатов, ' +
'являющиеся ссылками на их онлайн.' +
this.getGitHubLink('portsSyndLinks'), '61']],
'Синдикаты': [
['Сортировка на странице онлайна синдиката', 'Сортировка ' +
'онлайна синдиката и союза по идущим боям. Выделение ' +
'синдикатных боев.' +
this.getGitHubLink('sortSyndOnline'), '30'],
['Анализ активности синдиката', 'Анализ активности ' +
'синдиката. Рейтинг нападающих, баланс Гб и PTS ' +
'контролируемой недвижимости, кто и сколько взял/положил ' +
'Гб на счет синдиката, изменения состава.' +
this.getGitHubLink('syndAnalyser'), '46'],
['Анализ расхода PTS', 'Анализ расхода PTS синдиката. ' +
'Сортировка данных по купленным гранатам, чипам, ' +
'выданным званиям и знакам, общему количеству PTS.' +
this.getGitHubLink('syndPtsAnalyser'), '45'],
['Онлайн основного синдиката и союза на главной странице',
'На главной странице персонажа добавляет ссылки на его ' +
'основной синдикат и союз (если есть), при нажатии на ' +
'которые выводится онлайн синдиката со ссылками отправки ' +
'сообщения каждому бойцу. Если персонаж в бою, то ссылка ' +
'красного цвета. Так же добавляются конвертики для ' +
'отправки сообщений в разделах "Мои друзья" и "Гости".' +
this.getGitHubLink('syndOnlineOnMainPage'), '49']],
'Форум': [
['Отображение сообщения, на которое отвечают', 'В ответе на ' +
'сообщение показывает то сообщение, на которое ' +
'отвечают.' + this.getGitHubLink('showInitMessOnForum'),
'42'],
['Отметки сообщений на форуме и другое.', 'Звуковые и ' +
'визуальные оповещения при появлении новых тем или смене ' +
'верхней темы, новых сообщений в темах, скрытие закрытых ' +
'тем и прикрепленок, отметка закрытых тем, скрытие ' +
'ненужных веток форума.' +
this.getGitHubLink('advForum'), '53']],
'Торговля': [
['Ссылки в HighTech магазине для подачи объявлений', 'В ' +
'HighTech магазине добавляет ссылки "Продать" и "Купить" ' +
'для каждого предмета, при нажатии на которые, выводится ' +
'форма подачи объявления на ДО для данного предмета.' +
this.getGitHubLink('buyHightech'), '19'],
['Фильтр ресурсов на странице экономической статистики',
'Фильтр ресурсов на ' +
'странице экономической статистики
Введите ' +
'названия ресурсов через запятую, которые будут ' +
'отображаться на вышеуказанной странице. Например: ' +
'Уран,Водоросли,Маковая соломка,Трава,Батареи ' +
'' +
this.getGitHubLink('filterResOnStat'), '22'],
['Ссылки на High-tech вооружение в государственном магазине',
'В государственном магазине рядом со ссылками на типы ' +
'вооружения добавляет ссылки на вооружение High-tech' +
this.getGitHubLink('linksToHighTech') +
'идея: ' +
'' +
'Buger_man', '27'],
['Форма аренды и продажи', 'При передаче предмета в аренду ' +
'форма передачи выделяется голубым цветом. Если предмет ' +
'продается или передается в постоянное пользование, то ' +
'красным. Если указана нулевая цена, выводится сообщение ' +
'с подтверждением продолжения операции.' +
this.getGitHubLink('rentAndSale'), '39']],
'Ферма': [
['Производственный опыт и прибыль', 'Отображение ' +
'производственного опыта и прибыли в Гб за один час для ' +
'каждого растения.' +
this.getGitHubLink('farmExperience'), '9'],
['Таймер', 'Таймер для фермы. Звуковое оповещение когда ' +
'пора полить/собрать.
' +
this.getSelectSound('farmTmSound') + ' - звук когда пора ' +
'поливать/собирать (0 - без звука) ' +
' - интервал повторения ' +
'звука в секундах (0 - не повторять)' +
this.getGitHubLink('farmTimer'), '10'],
['Все растения на одной странице, счетчики', 'Счетчик гб и ' +
'производственного опыта на ферме. Для каждого растения ' +
'присутствует изображение, производственный опыт и ' +
'прибыль (общие и в 1 час), цена, время созревания в ' +
'минутах и часах.
' +
' показывать счетчик Гб ' +
' показывать счетчик производственног опыта' +
this.getGitHubLink('allPlantsOnFarm'), '13'],
['Играем без фермы', 'Убирает ссылку на ферму на главной ' +
'странице и на странице информации персонажа.' +
this.getGitHubLink('fuckTheFarm'), '25']]
}; // 2}}}
/**
* @method showHideScriptInfo // {{{2
*/
this.showHideScriptInfo = function () {
var _this = this,
info = _this.parentNode.lastElementChild;
if (info.style.display) {
info.style.display = '';
_this.innerHTML = '[−]';
} else {
info.style.display = 'none';
_this.innerHTML = '[+]';
}
}; // 2}}}
/**
* @method onOffScript // {{{2
*/
this.onOffScript = function () {
var _this = this,
ind = /chk(\d+)/.exec(_this.id)[1],
hiddenDiv = _this.nextElementSibling,
inp = hiddenDiv.querySelectorAll('input'),
sel = hiddenDiv.querySelectorAll('select'),
i;
initScript[ind] = _this.checked ? '1' : '';
general.setData(initScript, 1);
// выкл/вкл элементы управления настройками
for (i = 0; i < inp.length; i++) {
inp[i].disabled = !_this.checked;
}
for (i = 0; i < sel.length; i++) {
sel[i].disabled = !_this.checked;
}
}; // 2}}}
/**
* @method checkScriptUpdate // {{{2
*/
this.checkScriptUpdate = function () {
var url = 'https://' + general.domain + '/info.php?id=2095458';
new AjaxQuery().init(url, 'GET', null, true, function (xml) {
var ver = /cpingw:(\d+\.\d+-\d+)/.exec(xml.responseText);
if (ver && ver[1] !== general.version) {
general.$('linkNewVerScript').style.
visibility = 'visible';
general.$('refreshVer').innerHTML = '(' + ver[1] + ')';
}
}, null);
}; // 2}}}
/**
* @method setSettingsForAdvBattleAll // {{{2
*/
this.setSettingsForAdvBattleAll = function () {
var _this = this,
ind = _this.id === 'refreshBattle' ? 0 : 1,
data = general.getData(4);
data[ind] = new CheckInputText().init(_this, 0) ?
_this.value : '';
general.setData(data, 4);
}; // 2}}}
/**
* @method testSound // {{{2
*/
this.testSound = function () {
var _this = this;
new PlaySound().init(_this.previousElementSibling.value);
}; // 2}}}
/**
* @method modifyData // {{{2
* @param {int} ind
* @param {int} ind1
* @param {String} val
*/
this.modifyData = function (ind, ind1, val) {
var tmp = general.getData(ind);
tmp[ind1] = val;
general.setData(tmp, ind);
}; // 2}}}
/**
* @method init // {{{2
*/
this.init = function () {
general.doc.title = 'CPIGW :: Настройки';
// noinspection HtmlUnknownAttribute
var tdStyle = ' style="background-color: #E0FFE0;">',
gwImgUrl = 'https://images.' +
general.domain.replace('www.', '') + '/i/home/',
str = '
Поймать рыбу 1 раз ' +
'(ловить можно не ' +
'чаще, чем раз в 40 минут, с 8 до 11 и с 17 до ' +
'20 часов по серверу)' +
'
Зайти на замену и выжить в 2 боях' +
'
Выжить в 5 боях на Outland ' +
'(засчитывается и ' +
'в прибрежной зоне)' +
'
Нанести в синдикатных боях суммарный урон в ' +
(bLevel * 20).toString() + ' HP' +
'
Убить хотя бы одного врага в 3 синдикатных ' +
'боях (бои за ' +
'бункер не учитываются)' +
'
Сделать 3 критических попадания из снайперской ' +
'винтовки или автомата ' +
'(Если после боя ' +
'ломается оружие и персонаж оказывается с ' +
'пустыми руками, то все попадания, сделанные в ' +
'этом бою, не засчитаются. Для двуручного оружия ' +
'криты считаются с левой, при этом в правой ' +
'должен быть тип оружия, на которое в квесте ' +
'запрошены криты.)' +
'
Убить гранатой 2 Z-Lands ' +
'(горение идёт в ' +
'зачёт)' +
'
Привезти 5 предметов с Outland' +
'
Сделать 4 критических попаданий из ' +
'пистолетов-пулеметов ' +
'(для двуручного ' +
'оружия криты считаются с левой, при этом в ' +
'правой должен быть тип оружия, на которое в ' +
'квесте запрошены криты)' +
'
Выполнить 2 задания NPC' +
'
Убить 3 врагов в уличных боях' +
'
Выжить в 5 общих групповых боях ' +
'(в зачёт идут ' +
'нападения на бункер для всех)' +
'
Убить 7 Z-Lands на Outland ' +
'(Засчитывается и ' +
'в прибрежной зоне. Горение идёт в зачёт.)' +
'
5 раз нанести врагу урон гранатой ' +
'(Подразумевается, ' +
'что в пяти боях, туз в рукаве не засчитывается. ' +
'Горение идёт в зачёт.)' +
'
Выжить в 4 синдикатных боях ' +
'(бои за бункер ' +
'не учитываются)' +
'
';
_this.target.parentNode.setAttribute('width', '100%');
_this.target.parentNode.nextElementSibling.
removeAttribute('width');
_this.target.appendChild(span);
var desc = general.$('questDesc');
if (/суммарный урон.* \d+ HP/.test(desc.innerHTML)) {
var val = bLevel * 20;
desc.innerHTML = desc.innerHTML.
replace(/\d+ HP/, val + ' HP');
desc.innerHTML = desc.innerHTML.
replace(/\/\d+\]/, '/' + val + ']');
}
var questList = general.$('questList'),
li = questList.querySelectorAll('li'),
i;
desc = /^(.*) \[/.exec(desc.innerHTML)[1];
for (i = 0; i < li.length; i++) {
if (li[i].innerHTML.indexOf(desc) !== -1) {
li[i].setAttribute('style', 'border: #000000 1px ' +
'dotted; background: ' +
(isDone ? '#D0EED0' : '#DADADA') + ';');
break;
}
}
general.$('showHideQuestList').
addEventListener('click', function () {
var display = questList.style.display;
questList.style.display = display ? '' : 'none';
}, false);
}, function () {
general.root.setTimeout(function () {
_this.showQuest(url);
}, _this.tm);
});
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
if (this.persID && this.target) {
this.showQuest('https://' + general.domain +
'/questlog.php?id=' + this.persID);
}
}; // 2}}}
}; // 1}}}
/**
* @class CommonBattleFilter {{{1
* @constructor
*/
var CommonBattleFilter = function () {
/**
* @property battleTable
* @type {Object|null}
*/
this.battleTable = null;
/**
* @method getLvl {{{2
* @param {Object} row
* @return {int}
*/
this.getLvl = function (row) {
return +row.querySelector('font[color="red"]').innerHTML.
split('-')[1];
}; // 2}}}
/**
* @method sortBattleTable {{{2
*/
this.sortBattleTable = function () {
var stData = general.getData(20),
row,
i;
for (i = 1; i < this.battleTable.rows.length; i++) {
row = this.battleTable.rows[i];
row.style.display = '';
stData[0] = +stData[0];
if (stData[0] && this.getLvl(row) > stData[0]) {
row.style.display = 'none';
}
if (stData[1] && !/именные<\/s>/.test(row.innerHTML)) {
row.style.display = 'none';
}
if (stData[2] && !/по мощности/.test(row.innerHTML)) {
row.style.display = 'none';
}
}
}; // 2}}}
/**
* @method getSelect {{{2
* @param {String} id
* @return {String}
*/
this.getSelect = function (id) {
return '';
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
// форма создания заявки
if (/&form=\d+/.test(general.loc)) {
return;
}
// основная таблица общих заявок
this.battleTable = general.doc.querySelector('table[border="0"]' +
'[cellpadding="5"][cellspacing="1"][style="padding-left:10px;' +
'padding-right:10px;min-width:500px;"]');
// сообщение о причине невозможности зайти в заявку
// (нет оружия, недостаточно HP), нет общих заявок или
// таблица с заявками вообще не найдена
if (general.doc.querySelector('table[class="panelfloat"]') ||
!this.battleTable ||
this.battleTable.rows.length === 1) {
return;
}
// заявка на бой отклонена
if (/Заявка на бой отклонена/i.test(general.doc.body.innerHTML)) {
general.root.location.href = '/wargroup.php?war=armed';
}
// уже в заявке
if (/Вы заявлены на бой/i.test(general.doc.body.innerHTML)) {
return;
}
// интерфейс
var span = general.doc.createElement('span');
span.setAttribute('style', 'margin-left: 10px;');
span.innerHTML = 'Максимальный уровeнь: ' +
this.getSelect('blevel') +
'без именных: ' +
'по мощности:';
general.$('updatetimer2').parentNode.parentNode.appendChild(span);
var stData = general.getData(20),
_this = this;
// максимальный уровень
var blevel = general.$('blevel');
blevel.value = stData[0];
blevel.addEventListener('change', function () {
var data = general.getData(20);
data[0] = blevel.value;
general.setData(data, 20);
_this.sortBattleTable();
}, false);
// чекбокс "без именных"
var personal = general.$('personalchk');
personal.checked = !!stData[1];
personal.addEventListener('click', function () {
personal.checked = !!personal.checked;
var data = general.getData(20);
data[1] = personal.checked ? 1 : '';
general.setData(data, 20);
_this.sortBattleTable();
}, false);
// чекбокс "по мощности"
var power = general.$('powerchk');
power.checked = !!stData[2];
power.addEventListener('click', function () {
power.checked = !!power.checked;
var data = general.getData(20);
data[2] = power.checked ? 1 : '';
general.setData(data, 20);
_this.sortBattleTable();
}, false);
this.sortBattleTable();
}; // 2}}}
}; // 1}}}
/**
* @class PortTimer {{{1
* @constructor
*/
var PortTimer = function () {
/**
* @property tm
* @type {int}
*/
this.tm = 1200;
/**
* @property topPanel
* @type {HTMLElement|null}
*/
this.topPanel = null;
/**
* @property url
* @type {String|null}
*/
this.url = null;
/**
* @property date
* @type {int}
*/
this.date = 0;
/**
* @method getBattles {{{2
*/
this.getBattles = function () {
var _this = this;
new AjaxQuery().init(_this.url, 'GET', null, true, function (xhr) {
var spanContent = general.doc.createElement('span'),
cssSelector = 'table+table+table[cellspacing="1"]' +
'[cellpadding="5"][width="100%"]';
spanContent.innerHTML = xhr.responseText;
var table = spanContent.querySelector(cssSelector);
if (table) {
var data = JSON.parse(general.getData(22)[0]),
trs = table.querySelectorAll('tr'),
nobr,
i;
data.time = [];
if (trs.length > 1 &&
!/\(отсутствуют\)<\/i>/.test(trs[1].innerHTML)) {
for (i = 1; i < trs.length; i++) {
nobr = trs[i].querySelector('nobr');
if (nobr && /^\d+:\d+$/.test(nobr.innerHTML)) {
data.time.push(nobr.innerHTML);
}
}
}
data.date = _this.date;
data.time.reverse();
data.current = '';
general.setData(JSON.stringify(data), 22);
_this.setTime();
}
}, function () {
general.root.setTimeout(function () {
_this.getBattles();
}, _this.tm);
});
}; // 2}}}
/**
* @method resetStorage {{{2
*/
this.resetStorage = function () {
general.setData(JSON.stringify({
'date': '',
'syndid': '',
'time': [],
'current': ''
}), 22);
}; // 2}}}
/**
* @method getTimeDiff {{{2
* @return {int}
*/
this.getTimeDiff = function () {
var stData = JSON.parse(general.getData(22)[0]),
now = new Date();
stData.current = stData.current.split(':');
// noinspection JSRemoveUnnecessaryParentheses
return (+stData.current[0] * 60 + (+stData.current[1])) -
((now.getUTCHours() + 3) * 60 + now.getMinutes());
}; // 2}}}
/**
* @method setTimer {{{2
*/
this.setTimer = function () {
var diff = this.getTimeDiff(),
hours = parseInt((diff / 60).toString(), 10),
min = diff - hours * 60;
general.$('portTimer').innerHTML = (hours < 10 ? '0' + hours :
hours) + ':' + (min < 10 ? '0' + min : min);
}; // 2}}}
/**
* @method changeCurrentTime {{{2
*/
this.changeCurrentTime = function () {
var stData = JSON.parse(general.getData(22)[0]);
if (!stData.time.length) {
stData.current = '';
general.setData(JSON.stringify(stData), 22);
return;
}
var time = stData.time.pop();
stData.current = time;
general.setData(JSON.stringify(stData), 22);
if (this.getTimeDiff() <= 0) {
this.changeCurrentTime();
return;
}
this.setInterface();
general.$('portTime').innerHTML = time;
this.setTimer();
}; // 2}}}
/**
* @method setInterface {{{2
*/
this.setInterface = function () {
var mainTimer = general.doc.createElement('span');
mainTimer.innerHTML = '' +
'Порты []';
this.topPanel.appendChild(general.doc.createTextNode(' | '));
this.topPanel.appendChild(mainTimer);
}; // 2}}}
/**
* @method setTime {{{2
*/
this.setTime = function () {
var stData = JSON.parse(general.getData(22)[0]);
if (!stData.current || this.getTimeDiff() <= 0) {
this.changeCurrentTime();
} else {
this.setInterface();
general.$('portTime').innerHTML = stData.current;
this.setTimer();
}
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
// верхняя панель
this.topPanel = new GetTopPanel().init();
if (!this.topPanel) {
return;
}
/* localStorage:
* [0] - '{date: '', syndid: '', time: [], current: ''}'
*/
var stData = general.getData(22)[0];
if (!stData) {
this.resetStorage();
}
stData = JSON.parse(general.getData(22)[0]);
// на главной странице персонажа проверяем ID основного синдиката
if (/\/me(\/|\.php)/.test(general.loc)) {
var linkMainSynd = general.doc.querySelector('span>b+nobr>' +
'a[href*="/syndicate.php?id="]');
var syndID = linkMainSynd ?
/\?id=(\d+)/.exec(linkMainSynd.href)[1] : null;
// нет основного синдиката
if (!syndID) {
this.resetStorage();
return;
}
// сменили синд
if (stData.syndid !== syndID) {
stData.syndid = syndID;
stData.time = [];
general.setData(JSON.stringify(stData), 22);
}
}
// нет основного синдиката
if (!stData.syndid) {
return;
}
this.url = 'https://' + general.domain + '/object.php?id=11712&' +
'page=oncoming1&sid=' + stData.syndid;
// сегодня запрос не делали, делаем не ранее 7 утра.
var serverHour = new Date().getUTCHours() + 3,
now = new Date();
serverHour = serverHour > 23 ? serverHour - 24 : serverHour;
this.date = new Date(now.setHours(now.getHours() +
now.getTimezoneOffset() / 60 + 3)).getDate();
if (+stData.date !== this.date && serverHour >= 7) {
this.getBattles();
} else {
this.setTime();
}
}; // 2}}}
}; // 1}}}
/**
* @class PortsSyndLinks {{{1
* @constructor
*/
var PortsSyndLinks = function () {
/**
* @method init {{{2
*/
this.init = function () {
var table = general.doc.querySelector('td>table.simplewhitebg');
if (table) {
var syndLinks = table.querySelectorAll('a[href*="&page="]'),
link,
sign,
reg,
i;
for (i = 0; i < syndLinks.length; i++) {
link = syndLinks[i];
reg = /&sid=(\d+)$/.exec(link.href);
if (reg) {
sign = general.doc.createElement('a');
sign.setAttribute('href', 'https://' + general.domain +
'/syndicate.php?id=' + reg[1] + '&page=online');
sign.setAttribute('target', '_blank');
sign.setAttribute('style', 'margin-right: 2px;');
sign.innerHTML = '';
link.parentNode.insertBefore(sign, link);
}
}
}
}; // 2}}}
}; // 1}}}
/**
* @class PersonalNPCNotifications {{{1
* @constructor
*/
var PersonalNPCNotifications = function () {
/**
* @property isCssSet
* @type {Boolean}
*/
this.isCssSet = false;
/**
* @property spanContent
* @type {Element}
*/
this.spanContent = general.doc.createElement('span');
/**
* @property ajax
* @type {Function}
*/
this.ajax = new AjaxQuery().init;
/**
* @property playSound
* @type {Function}
*/
this.playSound = new PlaySound().init;
/**
* @method setCss {{{2
*/
this.setCss = function () {
// css-ботва для ссылки на главную страницу NPC
var npcLinkStyle = general.doc.createElement('style');
npcLinkStyle.innerHTML = '@-webkit-keyframes npcBlink {' +
'100% { color: rgba(34, 34, 34, 0);}' +
'}' +
'@keyframes npcBlink {' +
'100% { color: rgba(34, 34, 34, 0); }' +
'}' +
'#npcBlink {' +
'-webkit-animation: npcBlink 1s linear infinite;' +
'animation: npcBlink 1s linear infinite;' +
'}';
general.doc.querySelector('head').appendChild(npcLinkStyle);
this.isCssSet = true;
}; // 2}}}
/**
* @method changepostdo {{{2
*/
this.changepostdo = function () {
var _this = this;
general.root.postdo = function (url) {
// noinspection JSUnresolvedFunction
var url_loaded = url,
my_main_div = $('#my_main_div');
// noinspection JSUnresolvedFunction
my_main_div.css('opacity', '0.6');
/*jslint unparam: true */
/*eslint no-unused-vars: 0 */
// noinspection JSUnusedLocalSymbols
my_main_div.load(url,
function (responseTxt, statusTxt, xhr) {
if (statusTxt === 'success') {
// noinspection JSUnresolvedFunction
$('#my_main_div').css('opacity', '1');
window.history.
replaceState({}, null, url_loaded);
_this.init();
} else {
// noinspection JSUnresolvedFunction
$('#my_main_div').css('opacity', '0.3');
window.location.href = url_loaded;
}
});
return false;
};
}; // 2}}}
/**
* @method start {{{2
*/
this.start = function () {
var npcLink = general.doc.querySelector('a[href*="/me.php?nid="]' +
'[onclick^="dolink"]');
if (npcLink) {
var url = 'https://' + general.domain + '/info.php?id=' +
/\?nid=(\d+)/.exec(npcLink.href)[1],
_this = this;
this.ajax(url, 'GET', null, true, function (xhr) {
_this.spanContent.innerHTML = xhr.responseText;
var link = _this.spanContent.
querySelector('a[onclick^="show_npc_control"]'),
div = _this.spanContent.
querySelector('#namespan').parentNode,
health = /\[(\d+) \/ (\d+)\]/.exec(div.innerHTML);
// noinspection JSRemoveUnnecessaryParentheses
health = Math.floor(+health[1] * 100 / (+health[2]));
if (link.innerHTML === 'Ожидает распоряжений' &&
health >= 80) {
npcLink.setAttribute('id', 'npcBlink');
_this.playSound(general.getData(18)[0]);
} else if (link.innerHTML === 'Путешествует по Аутленду'
&& health < 30) {
npcLink.setAttribute('style', 'background: #FFE3E3');
_this.playSound(general.getData(18)[1]);
} else {
npcLink.removeAttribute('id');
npcLink.removeAttribute('style');
}
general.root.setTimeout(function () {
_this.start();
}, 10000);
}, function () {
general.root.setTimeout(function () {
_this.start();
}, 3000);
});
}
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
if (!this.isCssSet) {
this.setCss();
}
this.changepostdo();
this.start();
}; // 2}}}
}; // 1}}}
/**
* @class BbCodeInMessages {{{1
* @constructor
*/
var BbCodeInMessages = function () {
/**
* @property textArea
* @type {Object|null}
*/
this.textArea = general.doc.querySelector('textarea[name="msg"],' +
'textarea[name="message"]') ||
general.doc.querySelector('textarea#newsms');
/**
* @method setButton {{{2
* @param {String} imgName
* @param {String} title
* @param {Object} target
* @param {String} tag
*/
this.setButton = function (imgName, title, target, tag) {
var button = general.doc.createElement('span');
button.setAttribute('style', 'margin-left: 10px; cursor: pointer;');
button.innerHTML = '';
target.appendChild(button);
var _this = this;
button.addEventListener('click', function () {
var text = _this.textArea.value,
cursorPos = _this.textArea.selectionStart;
_this.textArea.value = text.substring(0, cursorPos) + tag +
text.substring(cursorPos, text.length);
_this.textArea.focus();
_this.textArea.selectionEnd = cursorPos + 3;
}, false);
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
var sendButton = general.doc.
querySelector('input[value="Отправить сообщение"]');
if (this.textArea) {
var target;
if (sendButton) { // старая версия почты и форум
target = sendButton.parentNode.parentNode.parentNode.
parentNode.querySelectorAll('td');
target = /sms-create/.test(general.loc) ? target[4] :
target[0];
} else {
target = general.doc.
querySelector('td>span[style="opacity:0.8;"]');
}
if (target) {
this.setButton('quote', 'Цитирование', target, '[q][/q]');
this.setButton('italic', 'Наклонный шрифт', target,
'[i][/i]');
}
}
}; // 2}}}
}; // 1}}}
/**
* @class ProfessionLevels {{{1
* @constructor
*/
var ProfessionLevels = function () {
/**
* @property profLevels
* @type {Array}
*/
this.profLevels = [51, 109, 184, 284, 422, 609, 856, 1176, 1581, 2085];
/**
* @method setCounter {{{2
* @param {Object} target
* @param {int} value
*/
this.setCounter = function (target, value) {
var td = general.doc.createElement('td');
td.setAttribute('style', 'padding-left: 5px; font-size: 10px; ' +
'color: #809980;');
td.innerHTML = '+' + value;
target.appendChild(td);
}; // 2}}}
/**
* @method init {{{2
*/
this.init = function () {
var killer = general.doc.querySelector('table[border="0"] ' +
'td[style*="font-size:10px"]');
if (!killer) {
return;
}
var profsTrs = killer.parentNode.parentNode.querySelectorAll('tr'),
currentVal,
i,
j;
for (i = 0; i < 3; i++) {
currentVal = /\((\d+(\.\d+)?)\)/.exec(profsTrs[i].innerHTML)[1];
currentVal = Math.floor(currentVal);
for (j = 0; j < this.profLevels.length; j++) {
if (currentVal < this.profLevels[j]) {
this.setCounter(profsTrs[i],
this.profLevels[j] - currentVal);
break;
}
}
}
var tr = general.doc.createElement('tr');
tr.innerHTML = '