您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
6/11/2024, 1:26:23 AM
// ==UserScript== // @name DayZ Map Improvement // @namespace https://azzurite.tv // @match https://dayz.xam.nu/* // @run-at document-start // @grant none // @version 1.3.6 // @author Azzurite // @license GPLv3 // @description 6/11/2024, 1:26:23 AM // ==/UserScript== (() => { const highlighters = {}; function makeHuntingMoreVisible() { if (this.options.iconUrl === `https://dayz.xam.nu/js/../images/b8fe30b7.webp`) { this.options.iconUrl = `https://images.azzurite.tv/uploads/original/d3/0f/6a50614db7df56f32d5aa2840268.webp`; } else if (this.options?.iconUrl === `https://dayz.xam.nu/js/../images/a92e2f53.webp`) { this.options.iconUrl = `https://images.azzurite.tv/uploads/original/92/8b/e706a502ab0931c2338883333633.webp`; } } Object.defineProperty(window, `L`, { set(obj) { this.storedL = obj; obj.Map.addInitHook(function() { // addInitHook binds `this` window.map = this; }); obj.Icon.addInitHook(makeHuntingMoreVisible); }, get() { return this.storedL; } }) function getMarkers() { return window.map.modules.filters.markers; } function getFilters() { return window.map.modules.filters.filters; } function setFilters(filters) { window.map.modules.filters.filters = filters; } function filtersContain(filters, key, subKey) { return filters[key] === true || filters[key]?.includes(subKey); } function areExactlyTheseFiltersActive(filters) { return Object.entries(getFilters()).every(([filterKey, filterValue]) => { return Object.keys(filterValue).every(subFilterKey => { if (filterKey === `tier`) return true; if (filtersContain(filters, filterKey, subFilterKey)) { return filterValue[subFilterKey] === 1; } else { return filterValue[subFilterKey] === 0; } }); }); } function updateButtonsState() { document.querySelector(`.azzu-all > button`).dataset.active = anyMarkerActive() ? 1 : 0; for (let highlighter of Object.values(highlighters)) { if (highlighter.isActive) { highlighter.button.dataset.active = highlighter.isActive() ? 1 : 0; } } } function updateDisplay() { window.map.modules.filters._check(); map.modules.filters._updateStorage(); updateButtonsState(); } function anyMarkerActive() { return Object.entries(getFilters()).some(([subFilterKey, subFilterValue]) => { if (subFilterKey === `tier`) return false; return Object.values(subFilterValue).some(state => state === 1) }); } function forAllFiltersExceptTiers(callback) { Object.entries(getFilters()).forEach(([subFilterKey, subFilterValue]) => { if (subFilterKey !== `tier`) { callback(subFilterKey, subFilterValue); } }) } function getButtonList() { return document.querySelector(`.filters`).parentNode; } function setAllFiltersTo(state) { forAllFiltersExceptTiers((_, val) => { for (let key of Object.keys(val)) { val[key] = state; } }); } function setFiltersTo(filters, state) { forAllFiltersExceptTiers((key, val) => { if (Object.keys(filters).includes(key)) { const toChange = filters[key] === true ? Object.keys(getFilters()[key]) : filters[key]; for (let toDisable of toChange) { val[toDisable] = state; } } }); } function setMarkersTo(filterFn, value) { for (let e of getMarkers()) { if (filterFn(e)) { e.options.visible = value; e.options.interactive = value; } } map.modules.filters.layer._redraw() } function nicerToggleAll() { if (anyMarkerActive()) { setAllFiltersTo(0); updateDisplay(); } else { const unwanted = { food: [`pear`, `apple`, `plum`], animal: true, area: [`dynamiccontamination`], misc: [`infected`, `playerspawnhop`, `playerspawnsafe`, `playerspawntravel`], vehicle: [`playerspawnhop`, `playerspawnsafe`, `playerspawntravel`] } setAllFiltersTo(1); setFiltersTo(unwanted, 0); updateDisplay(); setMarkersTo((marker) => marker.data.m[0] === `land_mil_tower_small`, 0); setMarkersTo((marker) => marker.data.t.includes(`no loot`), 0); } } function replaceFilterAllButton() { const li = document.createElement(`li`); li.classList.add(`azzu-all`); const btn = document.querySelector(`[data-type="all"][data-weight="all"]`).cloneNode(true); li.append(btn); btn.addEventListener(`click`, () => { stopHighlighters(); nicerToggleAll(); }); getButtonList().prepend(li); document.querySelector(`.filters`).style.display = `none`; } function createTextButton(text) { const li = document.createElement(`li`); li.classList.add(`azzu-highlight`); const btn = document.createElement(`button`); btn.style.padding = `0 10px`; btn.style.width = `inherit`; btn.innerHTML = text; li.append(btn); getButtonList().prepend(li); return btn; } function stopHighlighters() { for (const [key, {timeout}] of Object.entries(highlighters)) { if (timeout) { clearTimeout(timeout); highlighters[key].timeout = false; } } } function isHighlighterRunning(id) { return !!highlighters[id].timeout; } function addBlinkingBehavior(btn, id, highlight, isEnabled = () => btn.dataset.active == `1`) { highlighters[id] = { button: btn, timeout: false, }; btn.addEventListener(`contextmenu`, (ev) => { ev.preventDefault(); const running = isHighlighterRunning(id); stopHighlighters(); if (running) { return; } const doHighlight = () => { if (isEnabled()) { highlight(); highlighters[id].timeout = setTimeout(doHighlight, 100); } else { highlight(); highlighters[id].timeout = setTimeout(doHighlight, 600); } } highlighters[id].timeout = setTimeout(doHighlight, 0); }); btn.addEventListener(`click`, (ev) => { if (!ev.isTrusted) { return; } const running = isHighlighterRunning(id); stopHighlighters(); }) } function areTheseFiltersActive(filters) { return Object.entries(getFilters()).every(([filterKey, filterValue]) => { return Object.keys(filterValue).every(subFilterKey => { if (filterKey === `tier`) return true; if (filtersContain(filters, filterKey, subFilterKey)) { return filterValue[subFilterKey] === 1; } else { return true; } }); }); } function createHighlightButton(text, toHighlight, isActive = () => areTheseFiltersActive(toHighlight)) { const btn = createTextButton(text); btn.classList.add(`highlighter`); btn.classList.add(text); const toggle = (newState) => { if (typeof toHighlight === `function`) { toHighlight(btn, newState); } else { setFiltersTo(toHighlight, newState); updateDisplay(); } }; btn.addEventListener(`click`, (ev) => { if (btn.dataset.active === `1`) { toggle(0); } else { toggle(1); } }); addBlinkingBehavior(btn, text, () => { toggle(isActive() ? 0 : 1); }, isActive ); highlighters[text].isActive = isActive; updateDisplay(); return btn; } function addWeaponAmmoHighlight() { createCustomHighlightButton(`HighValue`, (marker) => { const subType = marker.data.w; const lootTypes = marker.data.t; return subType !== `dynamic` && ((lootTypes.includes(`military`) && subType !== `helicrash`) || lootTypes.includes(`police`) || lootTypes.includes(`medic`) || (lootTypes.includes(`hunting`) && subType !== `deerstand` && subType !== `feedshack`)); }); } function addShowCarSpawns() { createHighlightButton(`Vehicles`, {vehicle: [`vehicleoffroadhatchback`, `vehiclehatchback02`, `vehicleoffroad02`, `vehicletruck01`, `vehicleciviliansedan`, `vehiclesedan02`]}); } function addBlinkingToAllButtons() { for (const btn of [...document.querySelectorAll(`[data-weight][data-type]:not([data-type="all"])`)]) { const {type, weight} = btn.dataset; const id = `${type}-${weight}`; btn.classList.add(`highlighter`); btn.classList.add(id); addBlinkingBehavior(btn, id, () => btn.click()); } } function createCustomHighlightButton(text, filterFn) { createHighlightButton(text, (btn, newState) => { setMarkersTo(filterFn, newState); updateButtonsState(); }, () => getMarkers().some(marker => filterFn(marker) && marker.options.visible === 1)); } function addCoastal() { createCustomHighlightButton(`Coastal`, (marker) => marker.data.t.includes(`coast`)) } function init() { if (!document.querySelector(`.filters`)) { setTimeout(init, 100); return; } replaceFilterAllButton(); addBlinkingToAllButtons(); addWeaponAmmoHighlight(); addShowCarSpawns(); addCoastal(); test(); } setTimeout(init, 100); })();