您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Inventory color-sorter.
// ==UserScript== // @name Gaia Sort // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description Inventory color-sorter. // @author cae (twitter @mmt_n_) // @match https://www.gaiaonline.com/inventory* // @run-at document-end // @require https://cdnjs.cloudflare.com/ajax/libs/color-thief/2.0.1/color-thief.min.js // ==/UserScript== (function() { 'use strict'; var values = [], itemcnt = 0, colorThief, noerror = true; console.log('hi!') $('body').prepend('<button id="sorterbtn" style="position:fixed;z-index:999999999;background:white;padding:20px;font-size:200%;bottom:1em;right:1em">sort inventory</button>') $('#sorterbtn').on("click", function () { colorThief = new ColorThief(); $('.yui-nav')[0].style.cssText = 'opacity: 0.8; ' $('#items_tabview')[0].style.cssText = 'pointer-events:none' $('#sorterbtn').prop('disabled', true).text('(this might take a while)'); sorter.imgs() }) $('.yui-nav').on("click", function () { $('#sorterbtn').prop('disabled', true).text('wait a few seconds...'); setTimeout(function () { $('#sorterbtn').prop('disabled', false).text('sort inventory'); }, 5000); }); const sorter = { imgs: function () { values = [] let count = 0, targ = $('.yui-nav .selected em').text().replace(/\!/,'').toLowerCase() $('#' + targ + ' img').each(function (i, ele) { // fetch images so we can actually analyze them // since CORS is a dick try { $(ele).attr('crossOrigin', '') $.ajax({ url: ele.src, type: 'get', dataType: 'html', async: false, crossDomain: 'true', beforeSend: function (xhr) {xhr.overrideMimeType('text/plain; charset=x-user-defined');}, success: function (result, textStatus, jqXHR) { var binary = ""; var responseText = jqXHR.responseText; var responseTextLen = responseText.length; for ( i = 0; i < responseTextLen; i++ ) { binary += String.fromCharCode(responseText.charCodeAt(i) & 255) } console.log('replaced!') $(ele).attr('src', 'data:image/png;base64,' + btoa(binary)) count ++ if (count >= $('#' + targ + ' img').length) { console.log('Images ready.') sorter.colors() } } }); } catch (err) { console.log(err) alert('Sorry, something went wrong.') return false } }) }, colors: function () { let count = 0; let targ = $('.yui-nav .selected em').text().replace('!','').toLowerCase() $('#' + targ + ' img').each(function (i, ele) { if (noerror) { $(ele).load(() => { try { // get color & clone of original let res = colorThief.getColor(ele) let el = $(ele).parent()[0].cloneNode(true) // set slot, color, and the element copy values[i] = [$(el).parent()[0].slot, res, $(ele).parent()[0]] count ++ if (count >= $('#' + targ + ' img').length) { console.log('Colors found.') sorter.sort() } } catch (err) { // if that doesn't work, crop canvas n try again (too much transparency fucks it up I guess let canvas = $('<canvas/>'), context = canvas[0].getContext('2d') context.drawImage(ele, 7, 7, 16, 16, -1, -1, 32, 32); // then try again try { let res = colorThief.getColor(canvas[0]) let el = $(ele).parent()[0].cloneNode(true) values[i] = [$(ele).parent()[0].slot, res, $(ele).parent()[0]] count ++ if (count >= $('#' + targ + ' img').length) { console.log('Colors found.') sorter.sort() } } catch (err) { // past that you're probably fucked tbh console.log('something went wrong on ' + ele.alt) console.log(ele) alert("Huh, there's a problem somewhere. Refresh and try again?") noerror = false return false } } }) } }) }, // adapted from https://stackoverflow.com/questions/11923659/javascript-sort-rgb-values sort: function () { let targ = $('.yui-nav .selected em').text().replace('!','').toLowerCase() var result = values.map(function(x, i) { // Convert to HSL and keep track of original indices return {index: i, slot: x[0], color: sorter.HSL(x[1]), ele: x[2]}; }).sort(function(c1, c2) { // sort colors return c1.color[0] - c2.color[0]; }).map(function(data) { // just marks where the item's original position was return values[data.index]; }); // clear out current inventory box // adds everything into the inventory in the new order let x = ''; for (let res in result) { x += result[res][2].outerHTML } console.log('complete.') $('#' + targ + ' ul').html(x) $('.yui-nav, #items_tabview').removeAttr('style'); $('#sorterbtn').html('All done! Drag the last object<br>to trigger changes, then save') }, // adapted from same stackoverflow as previous HSL: function (a) {var e,r,s=a[0]/255,c=a[1]/255,n=a[2]/255,t=Math.max(s,c,n),i=Math.min(s,c,n),b=(t+i)/2;if(t==i)e=r=0;else{var h=t-i;switch(r=b>.5?h/(2-t-i):h/(t+i),t){case s:e=(c-n)/h+(c<n?6:0);break;case c:e=(n-s)/h+2;break;case n:e=(s-c)/h+4}e/=6}return new Array(360*e,100*r,100*b)} } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址