Hallo Zusammen,
da das Thema ItemShop-Scripte schon einige Male aufkam, aber in den Threads von anderen Topics vergraben liegt, möchte ich hier einen kleinen Guide inkl. einer geupdateten Version der Scripte bereitstellen.
Bevor es losgeht, ein kleines FAQ:
Hierbei handelt es sich um etwas vergleichbares wie ein Makro/Addon, das es euch erlaubt den ItemShop in eurem BROWSER (funktioniert nicht ingame) anders/besser darzustellen.
Eindeutig kann das natürlich nur von offizieller Seite beantwortet werden, aber bisher gab es trotz mehrmaliger Nennung der besagten Scripte hier im Forum und im Discord keine gegenteilige Aussage.
Nein, es reicht vollkommen aus, wenn ihr die folgenden Punkte Schritt für Schritt durchgeht und bei Fragen helfe ich gern weiter.
Durch das Update des Itemshops von gestern, werden nur noch die ersten 500 Items des Depots geladen. Einige ältere Versionen der Scripte verhindern das Laden/Anzeigen von weiteren Items. Sollte das für euch kein Problem sein, könnt ihr das folgende natürlich getrost ignorieren. Ansonsten empfehle ich aber ein Update der Scripte.
Nein. Jedes einzelne der Scripte funktioniert auch eigenständig, als auch in jeder möglichen Kombination. Es kann aber zu Komplikationen kommen, solltet ihr ältere Versionen oder andere Scripte für die Itemshop-Seite in Benutzung haben.
Vorbedingungen:
- Ein Addon, dass es euch ermöglicht den Itemshop außerhalb des Spiels, in eurem Browser zu öffnen -> Addons by Pyrr: ZShop
- Eine Browser-Erweiterung, die es euch erlaubt .js Code auszuführen -> https://www.tampermonkey.net/
- Eine Installationsanleitung findet ihr hier:
- Es kann sein, dass die Erweiterung euch auffordert, dass ihr erweiterte Berechtigungen wie z.B. "Ausführen von User-Scripts" (Chrome) oder "Entwicklermodus" (Firefox) benötigt. In diesem Fall könnt ihr unbesorgt auf die Meldung klicken und werden zur Einstellungsseite eures Browsers geleitet, auf der ihr diese Berechtigung vergeben könnt
Scripts:
Falls ihr eines oder mehrere der folgenden Scripte nutzen möchtet, könnt ihr dazu einfach die Übersicht von Tampermonkey öffnen, dort ein neues Script erstellen und den vorausgefüllten Inhalt mit dem jeweiligen Script ersetzen.
Dieses Script passt die Größe des Itemshops an euren Bildschirm an.
Leider gibt es aber zwei Probleme:
Ein manuelles Scrollen/Laden von mehr als den ersten 500 Items ist nicht mehr möglich.
Solltet ihr "Autoload full Depot" verwenden, werden automatisch alle Items geladen, aber es kommt leider zu einer Verzögerung beim Laden der Anpassung im Depot (sollte ich hier eine bessere Lösung finden, lasse ich es euch wissen).
- // ==UserScript==
- // @name RoM - Restyle
- // @namespace http://tampermonkey.net/
- // @version 3
- // @description try to take over the world!
- // @author You
- // @match https://eu-shop-runesofmagic.gameforge.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=gameforge.com
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- const isDepot = location.pathname.startsWith('/depotitems');
- function init() {
- $(".ingame").removeClass("ingame");
- $("#page").attr("style", "background: none;");
- setInterval(() => $(".card .last-in-line").removeClass('last-in-line'), 100);
- $('body').append(`<style>
- .tab-content .dropdown-menu { top: 27px !important; left: 0px !important; position: absolute !important; }
- #item-fancybox { height: initial !important; }
- </style>`);
- }
- if (isDepot) {
- function wait() {
- if (window.jQuery && document.querySelector('#page')) {
- setTimeout(init, 500);
- } else {
- setTimeout(wait, 100);
- }
- }
- wait();
- } else {
- init();
- }
- })();
Dieses Script stackt die einzelnen Items im Itemshop Depot und erlaubt es euch, mehrere auf einmal zu entnehmen. Im oberen Bereich wird nun zusätzlich noch angezeigt, wie viele Items gesamt geladen wurden (falls die Zahl genau 500, 1000, 1500,... sein sollte, ist das ein Indikator, dass nicht alles geladen wurde. In diesem Fall gern Bescheid geben.
- // ==UserScript==
- // @name RoM - Better Depot
- // @namespace http://tampermonkey.net/
- // @version 4
- // @description
- // @author You
- // @match https://eu-shop-runesofmagic.gameforge.com/depotitems*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=gameforge.com
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- const items = {};
- let num = 0;
- let observerRunning = false;
- async function takeItemByName(name, count, reload) {
- num = num + 1;
- const data = items[name];
- if (!data) {
- console.log(`${name} not found`);
- return;
- }
- if (count == null) count = data.urls.length;
- count = Math.max(1, Math.min(count, data.urls.length));
- for (let i = 0; i < count; i++) {
- const viewUrl = data.urls.pop();
- const popup = $(await (await fetch(viewUrl)).text());
- const oneChar = popup.find('.one_char');
- const transaction = oneChar.data('transactionId') || '';
- const player = oneChar.data('playerId') || '-1';
- const server = oneChar.data('serverId') || '-1';
- const url = popup.filter('script').html().match(/distributionURL = "(.+)";/)[1];
- const getUrl = url
- .replace(/%selection%/, '-1')
- .replace(/%amount%/, '1')
- .replace(/%server%/, server)
- .replace(/%player%/, player)
- .replace(/%transaction%/, transaction);
- await (await fetch(getUrl)).text();
- updateEntryCount(name);
- }
- num = num - 1;
- if (reload && num === 0) {
- window.location.reload();
- }
- }
- function createCountDropdown(initialMax) {
- const dropdown = $(`
- <div class="dropdown" style="display:inline-block; margin-right:6px;">
- <button class="dropdown-toggle" type="button" data-toggle="dropdown" style="width: 60px;">
- <span class="dropdown-selection" data-count="1">1</span>
- <span class="btn-default"><span class="caret"></span></span>
- </button>
- <ul class="dropdown-menu" style="max-height: 200px; overflow-y: auto; width: 60px;"></ul>
- </div>
- `);
- rebuildDropdownMenu(dropdown, initialMax);
- return dropdown;
- }
- function rebuildDropdownMenu(dropdown, maxCount) {
- const menu = dropdown.find('.dropdown-menu');
- menu.empty();
- let current = parseInt(dropdown.find('.dropdown-selection').data('count'), 10);
- if (!Number.isFinite(current) || current < 1) current = 1;
- for (let i = 1; i <= maxCount; i++) {
- menu.append(`<li><a class="dropdown-option" data-count="${i}" href="#"><span>${i}</span></a></li>`);
- }
- menu.find('.dropdown-option').on('click', function (e) {
- e.preventDefault();
- const c = $(this).data('count');
- dropdown.find('.dropdown-selection').data('count', c).text(c);
- });
- if (current > maxCount) {
- dropdown.find('.dropdown-selection').data('count', maxCount).text(maxCount);
- }
- }
- function doEntry(index, entry) {
- const name = entry.attr('data-sort-name');
- const url = entry.find('button.assign[href*=depot]').attr('href');
- if (items[name]) {
- items[name].urls.push(url);
- entry.remove();
- return;
- }
- items[name] = {
- obj: entry,
- name,
- urls: [url],
- };
- const pd = $(entry.find('.price_desc'));
- pd.children().remove();
- const dropdown = createCountDropdown(1);
- const take = $('<button class="btn-default assign"><span style="font-size: 11px;">Nehmen</span></button>')
- .css({
- "margin-left": "4px",
- "height": "26px",
- "padding": "2px 6px",
- "float": "none",
- "display": "inline-block",
- "vertical-align": "middle"
- });
- const takeAll = $('<button class="btn-default assign"><span style="font-size: 11px;">Alle Nehmen</span></button>')
- .css({
- "float": "right",
- "height": "26px",
- "padding": "2px 6px"
- });
- take.on('click', () => {
- const val = parseInt(dropdown.find('.dropdown-selection').data('count'), 10) || 1;
- takeItemByName(name, val, true);
- });
- takeAll.on('click', () => takeItemByName(name, null, true));
- pd.append(dropdown);
- pd.append(take);
- pd.append(takeAll);
- }
- function updateEntryCount(name) {
- const entry = items[name];
- if (!entry) return;
- entry.obj.find('.card-heading').html(`${entry.urls.length} x ${entry.name}`);
- const pd = entry.obj.find('.price_desc');
- const dd = pd.find('.dropdown');
- if (dd.length) {
- rebuildDropdownMenu(dd, entry.urls.length);
- }
- }
- function depotpage() {
- const depotitems = $('li.depot-item.shown');
- depotitems.each((index, e) => doEntry(index, $(e)));
- Object.keys(items).forEach(name => updateEntryCount(name));
- updateDepotHeader();
- }
- function updateDepotHeader() {
- const total = Object.values(items).reduce((sum, item) => sum + item.urls.length, 0);
- const formattedTotal = total.toLocaleString('de-DE');
- $('#accountContent h2').contents().filter(function () {
- return this.nodeType === Node.TEXT_NODE;
- }).first()[0].textContent = `Mein Item-Depot (${formattedTotal})`;
- }
- function observeNewItems() {
- const target = document.getElementById('depot-item-list');
- if (!target || observerRunning) return;
- observerRunning = true;
- const observer = new MutationObserver((mutations) => {
- mutations.forEach(mutation => {
- mutation.addedNodes.forEach(node => {
- if (!(node instanceof HTMLElement)) return;
- if ($(node).is('li.depot-item.shown')) {
- doEntry(0, $(node));
- }
- $(node).find('li.depot-item.shown').each((i, e) => {
- doEntry(i, $(e));
- });
- });
- });
- Object.keys(items).forEach(name => updateEntryCount(name));
- updateDepotHeader();
- });
- observer.observe(target, {
- childList: true
- });
- }
- depotpage();
- observeNewItems();
- })();
Dieses Script Lädt automatisch alle Items im Itemdepot (falls ihr mehr als 500 besitzt), ohne dass ihr dafür scrollen müsst.
- // ==UserScript==
- // @name RoM - Autoload full Depot
- // @namespace https://tampermonkey.net/
- // @version 1
- // @match https://eu-shop-runesofmagic.gameforge.com/depotitems*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=gameforge.com
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- let loading = false;
- let finished = false;
- let lastLoad = 0;
- let hasMore = true;
- function waitForJQuery() {
- if (!window.jQuery) {
- setTimeout(waitForJQuery, 300);
- return;
- }
- const $ = window.jQuery;
- $(document).ajaxComplete(function (event, xhr, settings) {
- if (!settings.url.includes("ajax/depotitems/loadMore")) return;
- lastLoad = Date.now();
- loading = false;
- try {
- const json = JSON.parse(xhr.responseText);
- if (typeof json.hasMore !== "undefined") {
- hasMore = json.hasMore;
- }
- } catch (e) {}
- const container = document.querySelector("#accountContent.depot .scrollable_container");
- if (container && hasMore) {
- container.scrollTop = container.scrollHeight;
- }
- if (!hasMore) {
- finished = true;
- console.log("Alle Items geladen (hasMore=false).");
- }
- });
- const interval = setInterval(() => {
- if (finished) return;
- const container = document.querySelector("#accountContent.depot .scrollable_container");
- if (!container) return;
- if (!hasMore) {
- finished = true;
- clearInterval(interval);
- return;
- }
- const now = Date.now();
- // nur initial oder nach Ladepause triggern
- if (!loading && now - lastLoad > 800) {
- loading = true;
- container.scrollTop = container.scrollHeight;
- }
- }, 400);
- }
- waitForJQuery();
- })();