// ==UserScript== // @name Change the scope to suroi.io (surviv.io) and zombsroyale.io // @name:ru Изменить прицел в suroi.io (surviv.io) и zombsroyale.io // @namespace https://github.com/AlekPet/ // @version 0.0.8.3.6 // @description Сhange the scope in the game suroi.io (surviv.io), and zombsroyale.io // @description:ru Изменяет прицел в игре suroi.io (surviv.io) и zombsroyale.io // @copyright 2018, AlekPet (https://github.com/AlekPet) // @author AlekPet // @license MIT; https://opensource.org/licenses/MIT // @match *://surviv.io/* // @match *://surviv2.io/* // @match *://suroi.io/* // @match *://2dbattleroyale.com/* // @match *://zombsroyale.io/* // @icon data:image/jpeg;base64,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 // @updateURL https://raw.githubusercontent.com/AlekPet/Change-the-scope-to-games/master/Change-the-scope-to-games.user.js // @downloadURL https://raw.githubusercontent.com/AlekPet/Change-the-scope-to-games/master/Change-the-scope-to-games.user.js // @run-at document-end // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_getResourceText // @require https://code.jquery.com/jquery-3.1.0.min.js // @resource scopes https://raw.githubusercontent.com/AlekPet/Change-the-scope-to-games/master/assets/json/scopes.json // ==/UserScript== GM_addStyle(` .mPanel_cur { position: fixed; top: 5%; left: 50%; background: #dadada; max-width: 650px; width: 650px; z-index: 50; border: 1px solid silver; box-shadow: 2px 2px 5px #847b7b; margin-left: -325px; text-align: center; display: none; } .mPanel_cur_title { background: silver; font: bold 1em monospace; padding: 5px; color: white; text-shadow: 1px 1px 3px darkblue; border-bottom: 1px dotted white; user-select: none; } .mPanel_cur_title > div{ float:right; } .mPanel_cur_title > div:hover { color: #d1fffb; } .table_box{ display: table } .table_box > div{ display: table-cell } .rightPanel_options{ text-shadow: 1px 1px 3px darkgreen; background: linear-gradient(to right, #62a965,#0e2f0e); color: #ffffff; border-left: 1px dotted white; padding: 5px; } .rightPanel_options_title { background: linear-gradient(#69e815,#3f7703); color: white; padding: 2px 0; user-select: none; } .rightPanel_options_inside { border: 1px solid; width: 150px; overflow-y: auto; } .mPanel_cur_list_box { background: #ffffff; width: 80%; } .optionFiels { border-top: 1px dotted; } ul.list_cur { padding: 0; margin: 0; height: 550px; width: 480px; overflow-y: auto; display: flex; flex-direction: row; flex-wrap: wrap; } .list_cur > li { /*min-width: 88px; min-height: 88px; max-height: 120px; width: 88px; height: 88px; overflow: hidden;*/ } .list_cur > .element_cur_cont { list-style: none; display: inline-block; padding: 5px; text-align: center; border: 1px dotted silver; margin: 5px; cursor: pointer; vertical-align: top; background: linear-gradient(to right bottom, silver,white); flex: 1 0 88px; } .element_cur_cont:hover { background: linear-gradient(#00ffff75,#dbff005c); } .acive_cursor{ background: linear-gradient(#00ffff75,#dbff005c) !important; } .element_cur_title { color: black; text-shadow: 1px 1px 3px darkgrey; word-wrap: break-word; font-size: 0.8em; } .mPanel_cur_foot { background: #757574; padding: 3px; border-top: 1px dotted white; color: antiquewhite; text-shadow: 1px 1px 3px darkgreen; } .infoBlock { float: right; } .infoBlock>a{ font-size: 0.6em; margin-top: 4px; padding: 2px; text-decoration:none; } .cur_sel_button_box { display: inline-block; } .cur_button { border: 1px solid silver; padding: 3px; font-size: 0.7em; cursor: pointer; user-select: none; display: inline-block; margin-left:10px; } .add_cur{ background: linear-gradient(#b3b766,#07b994); color:white } .add_cur:hover{ background: linear-gradient(#e7f134,#00ffca); color: #424242; } .create_cur { background: linear-gradient(#b3b766,#07b994); color: white; } .create_cur { background: linear-gradient(#ff8a00,#ff6161); color: white; } .del_cur{ display:none; background:linear-gradient(#b76666,#b90776); } .del_cur:hover{ background: linear-gradient(#c12b2b,#d89cc1) !important; color: white; } .checkbox_del_cur { } .checkbox_edit_cur { font-size: 0.6em; vertical-align: text-top; background: limegreen; border: 0; color: white; border-radius: 4px; text-shadow: 1px 1px 3px black; cursor:pointer; } .checkbox_edit_cur:hover { background: #ff9b00; } .zomb_btn-red { background: rgb(175, 80, 80); border-bottom: 2px solid rgb(122, 56, 56); box-shadow: rgb(122, 56, 56) 0px -2px inset; color: #fff; cursor: pointer; font-size: 12px; position: fixed; text-shadow: 0 1px 2px rgba(0,0,0,.25); top: 50%; right: 0; display: block; opacity: 0.7; transform: translate(0, -20px) rotateZ(-90deg); transform-origin: bottom right; height: 25px; width: 105px; line-height: 20px; border: 0; border-radius: 5px; box-sizing: border-box; margin-bottom: 8px; text-align: center; text-decoration: none; z-index:999; } .zomb_btn-darken:active, .zomb_btn-darken:hover { color: inherit; -webkit-filter: brightness(80%); filter: brightness(80%); transition: all .25s ease; } .makeCursor_form { position: fixed; top: 20%; left: 50%; width: 350px; margin-left: -180px; border: 1px solid silver; background: #dadada; display: none; box-shadow: 3px 3px 5px silver; z-index: 5; } .makeCursor_form_title { background: darkgrey; color: white; text-shadow: 1px 1px 3px darkolivegreen; padding: 3px; border-bottom: 1px dotted; font: bold 1em monospace; } .makeCursor_form_title > div { float: right; cursor: pointer; } .makeCursor_form_title > div:hover { color: #d1fffb; } .maleCursor_form_body input { width: 80%; margin: 5px; padding: 2px; border: 1px dotted #04fbc6; } .maleCursor_form_body > .form_field{ } .maleCursor_form_body span { color: #635e5e; font: normal 1em monospace; } .maleCursor_form_foot { padding: 5px; background: whitesmoke; } .cur_preview { border: 1px dotted #0d6b57; width: 50%; margin: 10px auto; padding: 5px; background: floralwhite; } .cur_preview > p { background: #b7b2b2; padding: 0px; margin: 0; color: white; } .cur_preview > img { margin: 10px; } .drawSelf { font-size: 0.9em; padding: 3px; background: #b5c5c3; } .drawSelf > a{ font-size: 0.9em; } .cur_overlay { background: #000000cc; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 5; display:none; } img#image_aim { position: absolute; z-index: 6; } .colorchange_cur { width: 20px; height: 20px; background: radial-gradient(red,orange,yellow,green,cyan,blue,purple); border-radius: 10px; display: inline-block; margin-right: 2px; transition: 1s all; } .colorchange_cur:hover { background: radial-gradient(purple,blue,cyan,green,yellow,orange,red); } .colorChangeButtons{ width: 70px; margin: 2px; } #setChangeColor { background: linear-gradient(#669ab7,#0773b9); margin-top: 10px; } #setChangeColor:hover { background: linear-gradient(#00a4ff,#043656); } #setDefaultChangeColor { background: linear-gradient(#b76666,#b90707); } #setDefaultChangeColor:hover { background: linear-gradient(#ff0000,#5f0303); } .canvasColor{ width: 128px; height: 128px; border: 1px dotted; margin: 0 auto; display: table; } .canvasColor>div{ display: table-cell; vertical-align: middle; } .font_8{ font-size: 0.8em; } .font_7{ font-size: 0.7em; } .font_6{ font-size: 0.6em; } .rightPanel_options input[type=range]::-webkit-slider-thumb { background: #f3f3f3; } .rightPanel_options input[type=range] { background: #ff7500; border: 1px solid black; border-radius: 6px; } .makeCursor_form input { color: black; } `); (function() { 'use strict'; const cursorList = JSON.parse(GM_getResourceText('scopes')).scopes || [{name:"Scope 1",cururl:"http://www.rw-designer.com/cursor-view/101646.png",active:false}, {name:"Scope 2",cururl:"http://www.rw-designer.com/cursor-view/111928.png",active:false}, {name:"Scope 3",cururl:"http://www.rw-designer.com/cursor-view/111937.png",active:false}, {name:"Scope 4",cururl:"http://www.rw-designer.com/cursor-view/78056.png",active:false}, {name:"Scope 5",cururl:"http://www.rw-designer.com/cursor-view/97540.gif",active:false}, {name:"Scope 6",cururl:"https://image.flaticon.com/icons/png/128/487/487009.png",active:false}], lang = { ru:{ form_title: "Выбор прицела", addCrosshair: "Добавить прицел", editCrosshair: "Правка", editComplete: "Прицел был отредактирован!", editEditApply: "Применить изменения", delCrosshair: "Удалить прицел(ы)?", delComplete: "Прицел(ы) были удалены!", selectCrosshair: "Выбрать: ", scopeName: "Название прицела (необяз.)", scopeLink: "Ссылка прицела (png,gif,jpg,cur,base64)", errorName: "Внимание:\nПоле имени не задано, будет использовано случайное название!\nНазвание: ", errorLinkEmpty: "Поле ссылки пустое!", errorLink: "Поле ссылки указано неверно!", errorImage: "Размер изображения больше 128x128 px, или равно 0x0 px, или не определенно!", errorAdd: "Сообщение:\nПрицел не был добавлен из-за неверно заданных параметров!", addComplete: "Сообщение:\nПрицел был успешно добавлен!", name: "Название: ", link: "Ссылка: ", preview: "Предпросмотр", drawSelf: "Нарисовать свой ", drawSelfInstructions: "File > New\nSet size <= 128px\nРисуем прицел\nSave as data URL\nКопиуем код и вставляем в поле Ссылки", scopeSite: "Еще прицелы", createScope: "Создать прицел", alertMesImage: ["Внимание:\nРазмер изображения ","Максимально допустимый размер изображения 128x128px!\nИначе работать не будет!\nПроверить прицел можно, если навести на рисунок..."], selectScope: "Выбрать прицел", form_close: "Закрыть", resetDefault: "Загрузить стандартные", resetDefaultCompete: "Стандартные прицелы были загружены!", resetQuestion: "Вы действительно хотите загрузить стандартные прицелы?\nВсе ваши добавленные прицелы, буду удалены?", resetQuestionFisrt: "Загрузить стандартный набор прицелов?", laserColor: "Цвет луча:\nПо умолчанию: red", laserWidth: "Толщина луча:\nПо умолчанию: 2", laserParmDotted: "Параметры пунктира:\nПо умолчанию: 5,15", laserDottedOn: "Включить пунктир?", rightOptionsTitle: "Опции", selectAll: "Выбрать все", deselectAll: "Убрать выделение", buttonInGame: "Кнопка в игре", buttonInGameInfo: "Показывать кнопку \"Выбрать прицел\" в игре", laserSaveSetting:"Сохранить настройки лазера?", laser: "Лазер", paletteColor: "Палитра цветов:", changeColor: "Изменить цвет/размер", applyColor: "Применить", applyColorHint: "Применить выбранный цвет и размер", resetColor: "Сбросить", resetColorHint: "Установить значение по умолчанию", resetColorAnswer:"Сбросить настройки цвета и размера?", not_selected: "Не выбран", input_colors: ["Красный","Зеленый","Синий"], error_ChangeColor: "Выберите прицел, для редактирования цвета и размера!\nНажмите на радужный кружок, возле прицелов!", scopeSize: "Размер", donate: ["Поддержка","Поддержать автора"] }, en:{ form_title: "Select scope", addCrosshair: "Add scope", editCrosshair: "Edit", editComplete: "The scope was edited!", editEditApply: "Apply changes", delCrosshair: "Remove scope(s)?", delComplete: "The scope(s) have been removed!", selectCrosshair: "Select: ", scopeName: "Name for the sight (opt.)", scopeLink: "Sight link (png,gif,jpg,cur,base64)", errorName: "Warning:\nthe name field is not set, a random name will be used!\nName: ", errorLinkEmpty: "The link Field is empty!", errorLink: "The link Field is incorrect!", errorImage: "The image Size is greater than 128x128 px, or equal to 0x0 px, or indefinite!", errorAdd: "Message:\nThe sight was not added due to incorrect parameters!", addComplete: "Message:\nSight was successfully added!", name: "Name: ", link: "Link: ", preview: "Preview", drawSelf: "Draw your own ", drawSelfInstructions: "File > New\nSet size <= 128px\nPaint on canvas\nSave as data URL\nCopy code and past in the Link", scopeSite: "More sights", createScope: "Create sight", alertMesImage: ["Attention:\nImage Size", "The maximum image size is 128x128px!\nOtherwise it will not work!\nIt is possible to check the sight if you look at the picture ..."], selectScope: "Select scope", form_close: "Close", resetDefault: "Load default", resetDefaultCompete: "Standard scopes have been loaded!", resetQuestion: "Do you really want to load standard scopes?\nAll your added scopes will be deleted?", resetQuestionFisrt: "Download the standard set of sights?", laserColor: "Beam color:\nDefault: red", laserWidth: "Beam width:\nDefault: 2", laserParmDotted: "Dashed Parameters:\nDefault: 5,15", laserDottedOn: "Enable dotted line?", rightOptionsTitle: "Options", selectAll: "Select All", deselectAll: "Deselect All", buttonInGame: "Button in the game", buttonInGameInfo: "Show the \"Select Sight\" button in the game", laserSaveSetting: "Save laser settings?", laser: "Laser", paletteColor: "Color palette:", changeColor: "Change color/size", applyColor: "Apply", applyColorHint: "Apply selected color and size", resetColor: "Reset", resetColorHint: "Reset to default", resetColorAnswer:"Do you want to reset the color and size settings?", not_selected: "Not selected", input_colors: ["Red", "Green", "Blue"], error_ChangeColor: "Select the scope, to edit the color and size!\nClick on the rainbow circle, near the scopes!", scopeSize: "Size", donate: ["Donate","Donate to the author"] } }, debug = false, myVersion = GM_info.script.version, defaultCursorImage = "https://github.com/AlekPet/Change-the-scope-to-surviv.io/raw/master/assets/images/default.png", nav_platform = window.navigator.platform.toLowerCase(), os_var = nav_platform.indexOf("win") > -1 ? "win" : nav_platform.indexOf("mac") ? "mac" : "other" var ObjSaveCursors = null, language = 'en-US', selLang = lang.en, current_game = location.href.includes("zombsroyale.io")?"zombsroyale":"surviv", game_support = { "surviv":{ laser : true }, "zombsroyale":{ laser : false // not correct work! } } language = window.navigator.userLanguage || window.navigator.language if(language.includes("ru")) selLang = lang.ru if(debug) console.log("Язык:", language, selLang) // Functions function backdec(c) { var rgbal = [], dd = c, fou = ""; if (dd.length == 7) { for (var i = 0; i < 3; i++) { var fl = []; switch (i) { case 0: fou = dd.slice(1, 3); break; case 1: fou = dd.slice(3, 5); break; case 2: fou = dd.slice(5, 7); break; } fou = fou.toLowerCase() let ris = ""; for (var u = 0; u < 2; u++) { var gi = fou.charAt(u) if (gi.search(/[a-f]/ig) != -1) { switch (gi) { case "a": ris = 10; break; case "b": ris = 11; break; case "c": ris = 12; break; case "d": ris = 13; break; case "e": ris = 14; break; case "f": ris = 15; break; } } else { ris = gi } fl.push(ris) } let f = (fl[0] * Math.pow(16, 1)) + (fl[1] * Math.pow(16, 0)) rgbal.push(f) } } return rgbal } function hex(r=0,g=0,b=0) { let gf = "", hexv = "0123456789ABCDEF", rc = (typeof r == "number" && r<256 && r>=0)?Number(r):0, gc = (typeof g == "number" && g<256 && g>=0)?Number(g):0, bc = (typeof b == "number" && b<256 && b>=0)?Number(b):0, valhex = "", ff = [rc, gc, bc]; for (var i = 0; i < 3; i++) { let del = ff[i] % 16, di = Math.floor(ff[i] / 16); if (ff[i] >= 255) { valhex += "FF"; } else if (ff[i] <= 0) { valhex += "00"; } else { valhex += hexv.charAt(di) + hexv.charAt(del); } } gf = "#" + valhex; return gf; } // Functions end function loadStorage(){ let ObjSaveCursors_tmp = GM_getValue('ObjSaveCursors'); ObjSaveCursors = (ObjSaveCursors_tmp) ? JSON.parse(GM_getValue('ObjSaveCursors')) : { options: { firstRun: true, buttonShow: true, laserSetting:{enabled:false, color:"red", width: 2, dotted: {enabled: false, lines:"5,15"}} }, cursorList:{}, currentActive:null }; // Доп. поля опций, если нет if(ObjSaveCursors.hasOwnProperty("options")){ if(!ObjSaveCursors.options.hasOwnProperty("buttonShow")) ObjSaveCursors.options.buttonShow = true if(!ObjSaveCursors.options.hasOwnProperty("laserSetting")){ ObjSaveCursors.options.laserSetting = {enabled:false, color:"red", width: 2, dotted: {enabled: false, lines:"5,15"}} } } if(debug) console.log(ObjSaveCursors) return (ObjSaveCursors.hasOwnProperty("options") && ObjSaveCursors.options.firstRun)?true:false } function saveToStorage(){ try{ var save_data = JSON.stringify(ObjSaveCursors); if(save_data.length>0 && save_data !== null && save_data !=="" && save_data !== undefined){ GM_setValue('ObjSaveCursors', save_data); if(debug) console.log("Сохраненно: ",ObjSaveCursors); } }catch(e){ console.log(e); } } function imageSizes(imgCur){ let img = $("") .one('load', function(){ return {x:this.naturalWidth/2, y: this.naturalHeight/2} }) .one('error', function(){ return null }).attr('src',imgCur) } function setGameCursor(urlCur){ if(current_game == "zombsroyale"){ // zombsroyale.io let x = document.getElementById("#canvas"), las = document.getElementById("linebetas") $(x).css({cursor:urlCur,transform:"scale(1.42857) !important"}) $(las).css({cursor:urlCur,transform:"scale(1.42857) !important",position:"absolute",top:0,left:0}) } else { // surviv.io let surv_config = detectSurviv() $(surv_config.containerGame).css({'cursor': urlCur}) $(".zomb_menu-option").show() } } function setCursor(cur = "crosshair", imgInside = null){ if(debug) console.log(cur,imgInside) let urlCur = null if(cur == "crosshair" || imgInside == null){ if(debug) console.log('Равен: ', cur) urlCur = cur } else { let x = imgInside.naturalWidth/2, y = imgInside.naturalHeight/2, set_cursor = cur.change_color && cur.change_color.src_new ? cur.change_color.src_new : cur.cururl urlCur = 'url("'+set_cursor+'") '+x+' '+y+', crosshair' if(debug) console.log('Применяем:', urlCur) } setGameCursor(urlCur) } function imageCursorAim(){ if(this.checked){ let imagecheckActive = returnActive(), imagesrc = imagecheckActive != null && imagecheckActive.length ? imagecheckActive[0].cururl: defaultCursorImage, $img = $("").one('load', function(){ $(this).data('coord',{x:this.width/2, y: this.height/2}) }).attr({'src':imagesrc,'id':'image_aim'}) $("body").append($img) $(document).mousemove(function(event) { let imgData = $img.data('coord') if(typeof imgData.x == 'number'){ let x=event.pageX+1,//-imgData.x-1, y=event.pageY+1//-imgData.y-1 $img.css({ "top": y + "px", "left": x +"px" }); } }) } else { $(document).off('mousemove') $("#image_aim").remove() $(document).mousemove = null } } function loadDefaultScopes(firststart = false){ if(confirm(!firststart?selLang.resetQuestion:selLang.resetQuestionFisrt)){ let fileScopes = GM_getResourceText('scopes') if(fileScopes.length){ let convertJSON = JSON.parse(fileScopes).scopes if(ObjSaveCursors.hasOwnProperty("cursorList")){ ObjSaveCursors.cursorList = convertJSON; saveToStorage() alert(selLang.resetDefaultCompete) updatePanel() } } } } function makeCnavas(canv){ if(current_game == "surviv"){ let $canvas = $("#linebetas"), $cvs = $(canv), ctx if($canvas.length == 0){ $canvas = $(''). css({ position: 'absolute', top: 0, left: 0 }) .attr({ id:'linebetas', width: parseInt($cvs.attr('width'),10), height: parseInt($cvs.attr('height'),10) }) $canvas.click(null) $canvas.insertAfter($cvs) } if($canvas.get(0).getContext('2d')){ $canvas = $canvas.get(0) ctx = $canvas.getContext('2d') $cvs = $cvs.get(0) return {ctx: ctx, canvas: $canvas, cvs: $cvs} } } else { let canvas = document.getElementById("linebetas"), cvs = document.getElementById("#canvas"), ctx if(!canvas){ canvas = document.createElement('canvas') canvas.setAttribute("style", "display:none;position:absolute;top:0;left:0;transform:scale(1.42857) !important;") canvas.id="linebetas" canvas.width=1920 canvas.height=531 cvs.parentNode.insertBefore(canvas, cvs.nextSibling) } if(canvas.getContext('2d')){ ctx = canvas.getContext('2d') return {ctx: ctx, canvas: canvas, cvs: cvs} } } return null } var mouse_pos = {x:0, y:0}, ticker_frame $(document).mousemove(function(event){ mouse_pos = {x:event.pageX, y:event.pageY} }) function laserUpdate(params, color, widthLine, dotted){ let w = params.canvas.width, h = params.canvas.height $(params.canvas).attr({'width': params.cvs.width, 'height': params.cvs.height}) params.ctx.beginPath() if(dotted != null) params.ctx.setLineDash(dotted); params.ctx.strokeStyle=color params.ctx.lineWidth=widthLine params.ctx.moveTo(w/2,h/2) let posXY = current_game == "zombsroyale" ? {x:mouse_pos.x/1.42857, y:mouse_pos.y/1.42857} : {x:mouse_pos.x, y:mouse_pos.y} os_var == "win" ? params.ctx.lineTo(posXY.x, posXY.y) : os_var == "mac" ? params.ctx.lineTo(2*posXY.x, 2*posXY.y) : params.ctx.lineTo(posXY.x, posXY.y) params.ctx.stroke(); let surv_conf = detectSurviv() if(current_game == 'surviv' && surv_conf.game=='suroi.io' && ticker_frame.work) { ticker_frame(function(){ laserUpdate(params, color, widthLine, dotted) }); } // Engine not PIXI JS if(current_game != 'surviv' && ticker_frame.work) { ticker_frame(function(){ laserUpdate(params, color, widthLine, dotted) }); } } function stop_ticker(){ if(debug) console.log("Timer stop!", "Ticker:", ticker_frame, "Laser support:", game_support[current_game].laser) if(ticker_frame && game_support[current_game].laser){ if(current_game == 'surviv'){ ticker_frame.stop(); } else { const cancel_ticket = window.cancelAnimationFrame || window.mozCancelAnimationFrame ticker_frame.work = false cancel_ticket(ticker_frame) } } } function betaLine(color = "red", widthLine = 2, dotted = null){ let surv_config = detectSurviv(), params = makeCnavas(surv_config.canvas_game) if(surv_config.game=='suroi.io') params.canvas.style.zIndex = 1 if(params){ if(current_game == 'surviv' && surv_config.game == 'surviv.io'){ // surviv PIXI JS ticker_frame = new PIXI.ticker.Ticker(); ticker_frame.stop(); ticker_frame.add(function(deltaTime){ laserUpdate(params, color, widthLine, dotted) }); ticker_frame.start(); } else { // zombsroyale Unity and suroi.io ticker_frame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; ticker_frame.work = true; ticker_frame(function(){ laserUpdate(params, color, widthLine, dotted) }); /* Old version update mouse move $(document).mousemove(function(event){ let w = params.canvas.width, h = params.canvas.height $(params.canvas).attr({'width': params.cvs.width, 'height': params.cvs.height}) params.ctx.beginPath() if(dotted != null) params.ctx.setLineDash(dotted); params.ctx.strokeStyle=color params.ctx.lineWidth=widthLine params.ctx.moveTo(w/2,h/2) let posXY = current_game == "zombsroyale" ? {x:event.pageX/1.42857, y:event.pageY/1.42857} : {x:event.pageX, y:event.pageY} os_var == "win" ? params.ctx.lineTo(posXY.x, posXY.y) : os_var == "mac" ? params.ctx.lineTo(2*posXY.x, 2*posXY.y) : params.ctx.lineTo(posXY.x, posXY.y) params.ctx.stroke(); })*/ } } } function selectAllScopes(){ let selectedClass = this.className == 'selectedall' ? true : false this.innerText = selectedClass ? selLang.deselectAll : selLang.selectAll $(".list_cur input.checkbox_del_cur").each(function(){ this.checked = selectedClass }) $(".checkbox_del_cur:checked").length ? $(".del_cur").fadeIn('slow').css("display","inline-block").text(`Удалить [${$(".checkbox_del_cur:checked").length}]`):$(".del_cur").fadeOut('slow') } // zombsroyale.io function checkCursorStartup(){ if(debug) console.log("Game state:",game.currentGameState) //if(document.getElementsByTagName("canvas")[0].style.cursor.indexOf("data:image/cur") != -1){ let states = ["MainMenu","Dead","loading","UiLoadingOverlay","UiGameOver","UiSpectator","UiPatchNotesOverlay","UiLoginOverlay","UiSettingsOverlay","UiConfirmOverlay","UiMapOverlay","UiSeasonOverlay","UiChallengesOverlay","UiLeaveOverlay","VideoAd","Profile","Cosmetics","Shop","Friends","Leaderboards"] if(game_support[current_game].laser && game.currentGameState && states.indexOf(game.currentGameState)<0){ $("#linebetas").show() // $(".zomb_btn-red").show() } else { $("#linebetas").hide() } } function detectSurviv(){ const default_surviv = { containerGame: "#game-area-wrapper", containerMenu: ".btn-battle-container", game: "surviv.io", canvas_game: "#cvs", buttonStyleGame: { "font-size": "0.7em", "position": "fixed", "top": "0", "left": "5px", "width": "80px", "height": "20px", "line-height": "1.5", "opacity": "0.7", "z-index": "5", "display": ObjSaveCursors.options.buttonShow ? "block" : "none" }} let surviv_conf = default_surviv if(location.host == 'suroi.io'){ Object.assign(surviv_conf, { containerGame: "#game-ui", containerMenu:"#splash-ui", game: "suroi.io", canvas_game: 'canvas:not(#canvasChangeColor)', buttonStyleGame: { "font-size": "0.7em", "position": "fixed", "top": "0", "left": "0", "height": "20px", "line-height": "1.5", "opacity": "0.7", "z-index": "50", "padding:": "2px", "text-decoration": "none", "color":"white", "margin-top": "0", "cursor":"pointer", "display": ObjSaveCursors.options.buttonShow ? "block" : "none" }}) } return surviv_conf } function setZindex(){ ["#server-select-container","#skin-container","#left-joystick-container","#right-joystick-container","#top-left-container","#scopes-container","#action-container","#weapon-ammo-container","#adrenaline-bar-container","#health-bar-container","#killstreak-indicator-container","#spectating-buttons-container","#items-container","#healing-items-container","#ammo-container","#equipment-container","#weapons-container","#settings-tabs-container","#customize-tabs-container","#settings-menu","#game-ui","#splash-ui"].forEach((selector, indx)=>{ $(selector).css("z-index", indx+2) }) } function makeMenuButton(firststart = false){ let $openSelectCur = null if(current_game == "zombsroyale"){ // zombsroyale.io $openSelectCur = $(''+selLang.selectScope+'').click(function(){ if(firststart && ObjSaveCursors.options.firstRun) { if(debug) console.log("Прицелы не найдены, загрузить стандартные!") loadDefaultScopes(firststart) ObjSaveCursors.options.firstRun = false saveToStorage() } $(".mPanel_cur").fadeToggle('slow') }) $openSelectCur.insertAfter(".canvas-loading") setInterval(checkCursorStartup, 1000); } else { // surviv.io let surv_config = detectSurviv() $openSelectCur = $(''+selLang.selectScope+'') .css({ "background": "#af5050", "border-bottom": "2px solid #7a3838", "box-shadow": "inset 0 -2px #7a3838", "margin-top": "15px" }) .click(function(){ if(firststart && ObjSaveCursors.options.firstRun) { if(debug) console.log("Прицелы не найдены, загрузить стандартные!") loadDefaultScopes(firststart) ObjSaveCursors.options.firstRun = false saveToStorage() } $(".mPanel_cur").fadeToggle('slow') }) //$openSelectCur.insertAfter("#btn-start-mode-0") $openSelectCur.insertAfter(surv_config.containerMenu) if(surv_config.game = 'suroi.io'){ $openSelectCur.css(surv_config.buttonStyleGame) setZindex() } $(surv_config.containerGame).append($openSelectCur.clone(true).css(surv_config.buttonStyleGame).attr("id","buttonInGame")) $(".menu-block").css("max-height", "375px") } } function makePanel(firststart){ let $mPanel = $("
"+ "
"+selLang.form_title+" v"+myVersion+"
X
"+ "
"+ "
    "+ "
    "+ "
    "+ "
    "+selLang.rightOptionsTitle+"
    "+ ""+ ""+ "
    "+selLang.buttonInGame+":
    "+ "
    "+selLang.laser+":
    "+ "
    "+selLang.changeColor+"
    "+ "
    "+ "
    "+ "
    "+selLang.paletteColor+"
    "+ ""+selLang.input_colors[0].charAt(0)+":
    "+ ""+selLang.input_colors[1].charAt(0)+":
    "+ ""+selLang.input_colors[2].charAt(0)+":
    "+ "
    "+ ""+selLang.scopeSize+":

    0x0"+ "
    "+ "
    "+selLang.applyColor+"
    "+ "
    "+selLang.resetColor+"
    "+ "
    "+ "
    "+ "
    Image aim:
    "+ "
    "+ "
    "+ "
    "+ "
    "+ "
    "+ ""+ "
    "+ "
    "), $cur_overlay = $("
    "), closeX = $($mPanel).find(".mPanel_cur_title > div").click(function(){ $mPanel.fadeOut() }), bInG = $($mPanel).find("#buttin_scope_in_game").change(function(){ if(ObjSaveCursors.hasOwnProperty("options") && ObjSaveCursors.options.hasOwnProperty("buttonShow")){ ObjSaveCursors.options.buttonShow = this.checked saveToStorage(); if(debug) console.log('Показывать кнопку в игре:',this.checked) $("#buttonInGame").css("display", this.checked ? "block" : "none") } }), $LineLaser = $($mPanel).find("#LineLaser").change(function(){ if(game_support[current_game].laser){ if(this.checked){ let laserSetting = ObjSaveCursors.options.laserSetting, ls_color = laserSetting.color || "red", ls_width = laserSetting.width || "2", ls_dotted_lines = laserSetting.dotted.lines || "5,15", color = prompt(selLang.laserColor, ls_color), widthLine = prompt(selLang.laserWidth, ls_width), dotted_enabled = false, dotted = (dotted_enabled = confirm(selLang.laserDottedOn)) ? prompt(selLang.laserParmDotted, ls_dotted_lines) : null // Save setting if(confirm(selLang.laserSaveSetting)){ if(ObjSaveCursors.hasOwnProperty("options") && ObjSaveCursors.options.hasOwnProperty("laserSetting")){ ObjSaveCursors.options.laserSetting = {enabled:this.checked, color:color, width: widthLine, dotted: {enabled: dotted_enabled, lines:dotted}} saveToStorage(); } } if(dotted != null) dotted = dotted.split(',') betaLine(color,widthLine,dotted) } else { ObjSaveCursors.options.laserSetting.enabled = this.checked saveToStorage(); stop_ticker(); $("#linebetas").remove() } } else { this.checked = false alert("Laser for zombsroyale is being finalized...") } }), // All events click scope delegate ListBox = $($mPanel).find(".mPanel_cur_list_box > ul").click(function(event){ var target = event.target, elem = target while(elem !== this){ let datas = $(elem).data("el_val") ? $(elem).data("el_val") : null // Change scope if(elem.className.includes("element_cur_cont")){ if(elem.title === "Default"){ checkActive(null) setCursor("crosshair") } else { let imgInside = $(elem).find("img").get(0) checkActive(datas) setCursor(datas, imgInside) } $(".list_cur > li.acive_cursor").removeClass("acive_cursor") $(elem).addClass("acive_cursor") saveToStorage() break; } // Change color scope if(elem.className.includes("colorchange_cur")){ event.stopPropagation(); changeColor(datas) break; } // Edit scope if(elem.className.includes("checkbox_edit_cur")){ event.stopPropagation(); makeFormAddCursor(false, datas) break; } elem = elem.parentNode } }), $selectAll = $($mPanel).find("#selectAlltScopes").click(function(){ $(this).toggleClass("selectedall") selectAllScopes.call(this); }), resetDefaultScopes = $($mPanel).find("#resetDefaultScopes").click(loadDefaultScopes), $addCursor = $("
    ").attr('title',selLang.addCrosshair).text(selLang.addCrosshair).click(makeFormAddCursor), $delCursor = $("
    ").attr('title',selLang.delCrosshair).text(selLang.addCrosshair).click(delCursor), $cur_sel_button_box = $($mPanel).find(".cur_sel_button_box").append($addCursor,$delCursor), $mouseimgaim = $($mPanel).find("#mouseimgaim").change(function(){ imageCursorAim.call(this) }) if($LineLaser.is(":checked")){ if(game_support[current_game].laser){ let laserSetting = ObjSaveCursors.options.laserSetting, ls_color = laserSetting.color || "red", ls_width = laserSetting.width || "2", ls_dotted_enabled = laserSetting.dotted.enabled || false, ls_dotted_lines = laserSetting.dotted.lines || "5,15" ls_dotted_lines =(ls_dotted_enabled && ls_dotted_lines != null)?ls_dotted_lines.split(','):null betaLine(ls_color,ls_width,ls_dotted_lines) } else { $LineLaser.checked = false } } $mPanel.append($cur_overlay); $("body").append($mPanel) } function updatePanel(firststart = false){ let ListBox = $(".mPanel_cur_list_box > ul").empty(), activeTrue = false, divDef = $("
  • ").attr('title',"Default"), divDefTitle = $("").text("Default"), divDefImg = $("").attr("src", defaultCursorImage), divDefImgBox = $("
    ").append(divDefImg) divDef.append(divDefImgBox,divDefTitle) $(ListBox).append(divDef) $.each(ObjSaveCursors.cursorList, function(index, el){ let self = el, divCont = $("
  • ").attr('title',selLang.selectCrosshair+self.name).data("el_val", self), divTitle = $("").text(self.name.length>15?self.name.substr(0,12)+"...":self.name), divImg = $("").one('load',function(){ $(this).css("cursor","url("+this.src+")"+this.naturalWidth/2+" "+this.naturalHeight/2+", default") }).attr("src", self.change_color ? self.change_color.src_new : self.cururl), divImgBox = $("
    ").append(divImg), delCheck = $("").click(function(event){ event.stopPropagation(); }), editButton = $("").data("el_val", {element: self, index: index}) if(/^data:image/i.test(self.cururl)){ let colorChange = $("
    ").data("el_val", {element: self, img: divImg, index: index}) divCont.append($("

    ").append(colorChange,editButton,delCheck),divImgBox,divTitle) } else { divCont.append($("

    ").append(editButton,delCheck),divImgBox,divTitle) } $(ListBox).append(divCont) if(self.active){ activeTrue = true $(divCont).addClass("acive_cursor") divImg.one('load', function(){ setCursor(self, this) }).one('error', function(){ setCursor() }) } }) if(firststart || !activeTrue){ $(".element_cur_cont:eq(0)").addClass("acive_cursor") setCursor("crosshair") } $(".checkbox_del_cur").on("change",function(){ $(".checkbox_del_cur:checked").length ? $(".del_cur").fadeIn('slow').css("display","inline-block").text(`Удалить [${$(".checkbox_del_cur:checked").length}]`):$(".del_cur").fadeOut('slow') }) } function defaultValueForm(elem){ $(elem).find("#name_scope,#link_scope,#previewName,#previewImg").each(function(){ switch(this.id){ case 'name_scope': case 'link_scope': this.value = '' break; case 'previewName': this.innerText='Default' break; case 'previewImg': this.src = defaultCursorImage break; } }) $(".cur_preview").css('cursor','crosshair') } function ImgSizeData(img, val){ $(img).one('load', function(){ const w = this.naturalWidth, h = this.naturalHeight if(w>128 || h>128) alert(selLang.alertMesImage[0]+w+"px x "+h+"px!\n"+selLang.alertMesImage[1]) $(".cur_preview").css('cursor','url('+this.src+'), not-allowed') if(this.src !== defaultCursorImage) $(this).data("sizes", {w:w, h:h}); else $(this).data("sizes", {w:null, h:null}) }).one('error', function(){ this.src = defaultCursorImage $(".cur_preview").css('cursor','crosshair') }).attr('src', val) } function makeFormAddCursor(editmake = false, params = null){ let $makeCurForm = $(".makeCursor_form"), $cur_overlay = $(".cur_overlay") if($makeCurForm.length == 0){ $makeCurForm = $("

    ") let htmlInner = "
    "+selLang.addCrosshair+"
    X
    "+ "
    "+ "
    "+selLang.name+"
    "+ "
    "+selLang.link+"
    "+ "

    "+selLang.preview+"

    Default
    "+ "
    "+selLang.drawSelf+"miniPaint
    "+ ""+selLang.scopeSite+"
    "+ "
    "+ "
    "+ "
    "+selLang.createScope+"
    "+ "
    " $makeCurForm.html(htmlInner) $(".mPanel_cur").append($makeCurForm) $(".makeCursor_form_title > div").click(function(){ $makeCurForm.fadeOut('slow', function(){ $cur_overlay.fadeOut('slow', function(){ defaultValueForm($makeCurForm) }) }) }) $("#name_scope").on('input', function(){ $("#previewName").text($(this).val()) }) $("#link_scope").on('input', function(){ let val = $(this).val().trim() ImgSizeData("#previewImg", val) }) } // Show form $cur_overlay.fadeIn('slow', function(){ if(editmake){ $(".makeCursor_form_title > span").text(selLang.addCrosshair) $("#createCursor").text(selLang.createScope).off().click(function(){ add_edit_Cursor() }) } else { $(".makeCursor_form_title > span").text(selLang.editCrosshair) $makeCurForm.find("#name_scope").val(params.element.name) $makeCurForm.find("#link_scope").val(params.element.cururl) ImgSizeData("#previewImg", params.element.cururl) $("#createCursor").text(selLang.editEditApply).off().click(function(){ if(params !== null && Object.keys(params).length) add_edit_Cursor(params) }) } $makeCurForm.fadeIn('fast') }) } function add_edit_Cursor(parametri = null){ let $makeCurForm = $(".makeCursor_form"), $cursorName = $makeCurForm.find("#name_scope"), $cursorUrl = $makeCurForm.find("#link_scope"), $cur_overlay = $(".cur_overlay"), $previewImg = $makeCurForm.find("#previewImg") let cursorNameVal = $cursorName.val(), cursorUrlVal = $cursorUrl.val(), errors = false if(/^\s*$/i.test(cursorNameVal)){ cursorNameVal="Croshair_"+Math.floor(Math.random()*10000) $cursorName.val(cursorNameVal) alert(selLang.errorName+cursorNameVal) } if(/^\s*$/i.test(cursorUrlVal)){ alert(selLang.errorLinkEmpty) errors = true } if(!/(?:^https?:\/\/.*\.(?:png|jpg|jpeg|gif|cur|tiff)$|^data:image)/i.test(cursorUrlVal)){ alert(selLang.errorLink) errors = true } if(!errors){ const w = $previewImg.data("sizes").w || 0, h = $previewImg.data("sizes").h || 0 if(w>128 || h>128 || w == 0 || h == 0 || w == null || h == null){ alert(selLang.errorImage) errors = true } } if(errors){ alert(selLang.errorAdd) return } if(ObjSaveCursors.hasOwnProperty("cursorList")){ let ovetMessage = selLang.addComplete if(parametri == null){ ObjSaveCursors.cursorList.push({name:cursorNameVal, cururl:cursorUrlVal, active:false}) } else { if(Object.keys(ObjSaveCursors.cursorList).length && Object.keys(parametri).length){ ObjSaveCursors.cursorList[parametri.index] = {name:cursorNameVal, cururl:cursorUrlVal, active:false} ovetMessage = selLang.editComplete } else return } saveToStorage() $makeCurForm.fadeOut('slow', function(){ $cur_overlay.fadeOut('slow', function(){ defaultValueForm($makeCurForm) }) }) updatePanel() alert(ovetMessage) } } function returnActive(){ let activetrue = null if(ObjSaveCursors.hasOwnProperty("cursorList") && Object.keys(ObjSaveCursors.cursorList).length){ activetrue = ObjSaveCursors.cursorList.filter((ix,elem)=>{ return ix.active == true }) return activetrue } } function checkActive(el){ if(ObjSaveCursors.hasOwnProperty("cursorList") && Object.keys(ObjSaveCursors.cursorList).length){ ObjSaveCursors.cursorList.map((ix,elem)=>{ ix.active = false return ix.active }) if(el !== null ) el.active = true } } function delCursor(){ if(confirm(selLang.delCrosshair)){ let arr_delete_cursors = [] $(".list_cur").find("input[type=checkbox]").each(function(index,eleme){ if($(this).is(':checked')){ arr_delete_cursors.push(index); } }); arr_delete_cursors = arr_delete_cursors.reverse(); for(var k in arr_delete_cursors){ ObjSaveCursors.cursorList.splice(arr_delete_cursors[k],1); } saveToStorage() $(".del_cur").fadeOut('slow') updatePanel() alert(selLang.delComplete) } } function resize(valS){ let canvas = document.getElementById("canvasChangeColor"), ctx = canvas.getContext("2d") $("").one("load", function() { var oc = document.createElement('canvas'), octx = oc.getContext('2d'); if(this.naturalWidth >= this.naturalHeight){ canvas.width = valS; canvas.height = canvas.width * this.naturalHeight / this.naturalWidth; } else if(this.naturalWidth < this.naturalHeight){ canvas.width = canvas.height * this.naturalWidth / this.naturalHeight; canvas.height = valS; } ctx.drawImage(this, 0, 0, canvas.width, canvas.height); $("#rangeSizeValue").text(canvas.width+"x"+canvas.height) }).attr('src', $("#canvasChangeColor").data("imagesrc")) } function setSizeParams(can){ $("#rangeSize").val(can.width >= can.height ? can.width : can.height) $("#rangeSizeValue").text(can.width+"x"+can.height) } function setColorsScope(){ let can = document.getElementById("canvasChangeColor"), ctx = can.getContext("2d"), imgData = ctx.getImageData(0, 0, can.width, can.height), eli = document.getElementsByClassName("rangeColors"), r = parseInt(eli[0].value), g = parseInt(eli[1].value), b = parseInt(eli[2].value), a = 255 document.getElementById("colorInput").value = hex(r,g,b) for (var i = 0; i < imgData.data.length; i += 4) { imgData.data[i] = r; //r imgData.data[i + 1] = g; //g imgData.data[i + 2] = b; //b //imgData.data[i + 3] = a; // alpha } ctx.putImageData(imgData, 0, 0); $.data(can, "imagesrc", can.toDataURL("image/png")) } function setChangeColor(params){ const eli = document.getElementsByClassName("rangeColors"), size = parseInt(document.getElementById("rangeSize").value), r=parseInt(eli[0].value), g=parseInt(eli[1].value), b=parseInt(eli[2].value), a = 255, canvas = document.getElementById("canvasChangeColor") if(Object.keys(ObjSaveCursors.cursorList[params.index]).length && canvas){ if(!ObjSaveCursors.cursorList[params.index].hasOwnProperty('change_color')){ ObjSaveCursors.cursorList[params.index].change_color = {colors:{r:r,g:g,b:b,a:a,size:size}, src_new: canvas.toDataURL("image/png")} } else { ObjSaveCursors.cursorList[params.index].change_color = {colors:{r:r,g:g,b:b,a:a,size:size}, src_new: canvas.toDataURL("image/png")} } if(debug) console.log("Цвета:",ObjSaveCursors.cursorList[params.index]); saveToStorage(); updatePanel(); } else alert("Object not found, or canvas not isset!"); } function setDefaultCursorColors(params){ if(params.element.hasOwnProperty("change_color") && Object.keys(params.element.change_color).length && params.element.change_color.hasOwnProperty("src_new")){ if(confirm(selLang.resetColorAnswer)){ delete ObjSaveCursors.cursorList[params.index].change_color saveToStorage(); updatePanel(); new Array().slice.call(document.getElementsByClassName("rangeColors")).forEach(function(el){el.value = 0}) document.getElementById("colorInput").value = "#000000"; params.img.attr('src',params.element.cururl) changeColor(params) } } } function changeColor(params = null){ let can, ctx,img, colorInput can = document.getElementById("canvasChangeColor") ctx = can.getContext("2d") colorInput = document.getElementById("colorInput") if(params != null && Object.keys(params).length){ if(params.element.change_color && Object.keys(params.element.change_color.colors).length){ let colors = params.element.change_color.colors, a = colors.a, inptuts_colors = document.getElementsByClassName("rangeColors") inptuts_colors[0].value = colors.r inptuts_colors[1].value = colors.g inptuts_colors[2].value = colors.b colorInput.value = hex(colors.r,colors.g,colors.b) $("#rangeSize").data("sizeval",colors.size) } else { new Array().slice.call(document.getElementsByClassName("rangeColors")).forEach(function(el){el.value = 0}) colorInput.value = "#000000"; } img = new Image() img.onload = function() { can.width = this.naturalWidth can.height = this.naturalHeight ctx.drawImage(this, 0, 0) $.data(can, "imagesrc", this.src) setSizeParams(can) } img.src = params.img.attr('src') $("#setChangeColor").off().click(setChangeColor.bind(ctx, params)) $("#setDefaultChangeColor").off().click(setDefaultCursorColors.bind(ctx, params)) } else { can.width = 80 can.height = 80 ctx.font="10px Georgia"; ctx.textAlign="center"; ctx.fillStyle = "white"; ctx.fillText(selLang.not_selected.toUpperCase(),can.width/2,can.height/2); let eli = document.getElementsByClassName("rangeColors") for (let i = 0; i < eli.length; i++) { eli[i].addEventListener("input", setColorsScope) } let boxcolor = document.getElementById("colorInput").addEventListener("input", function(){ let curColor = this.value, digitColor = backdec(curColor) eli[0].value = digitColor[0] eli[1].value = digitColor[1] eli[2].value = digitColor[2] colorInput.value = hex(digitColor[0],digitColor[1],digitColor[2]) setColorsScope() }) // Size $("#rangeSize").on("input", function(){ resize(this.value) }) $("#setChangeColor").add($("#setDefaultChangeColor")).off().click(function(){ alert(selLang.error_ChangeColor) }) } } function init(){ let firststart = false; if(loadStorage()){ firststart = true if(debug) console.log("Первый запуск!", firststart) } console.log("Current game: ", current_game, "Laser support:", game_support[current_game].laser) makeMenuButton(firststart) makePanel() updatePanel(firststart) changeColor() } window.onload = function(){ init() } })();