// ==UserScript==
// @name DayZ Map Improvement
// @namespace https://azzurite.tv
// @match https://dayz.xam.nu/*
// @run-at document-start
// @grant none
// @version 1.3.5
// @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 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.filters) {
highlighter.button.dataset.active = areExactlyTheseFiltersActive(highlighter.filters) ? 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 nicerToggleAll() {
if (anyMarkerActive()) {
setAllFiltersTo(0);
} 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);
}
}
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();
updateDisplay();
});
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()) {
console.log(`highlight off`);
highlight();
highlighters[id].timeout = setTimeout(doHighlight, 100);
} else {
console.log(`highlight on`);
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) {
const btn = createTextButton(text);
btn.classList.add(`highlighter`);
btn.classList.add(text);
btn.addEventListener(`click`, (ev) => {
if (btn.dataset.active === `1`) {
nicerToggleAll();
nicerToggleAll();
} else {
if (anyMarkerActive()) {
nicerToggleAll();
}
setFiltersTo(toHighlight, 1);
}
updateDisplay();
});
addBlinkingBehavior(btn, text,
() => {
const newState = areTheseFiltersActive(toHighlight) ? 0 : 1;
setFiltersTo(toHighlight, newState);
updateDisplay();
},
() => areTheseFiltersActive(toHighlight)
);
highlighters[text].filters = toHighlight;
updateDisplay();
}
function addWeaponAmmoHighlight() {
createHighlightButton(`HighValue`, {
medic: true,
hunting: [`high`, `medium`, `low`, `store`],
police: true,
military: true
});
}
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 init() {
if (!document.querySelector(`.filters`)) {
setTimeout(init, 100);
return;
}
replaceFilterAllButton();
addBlinkingToAllButtons();
addWeaponAmmoHighlight();
addShowCarSpawns();
}
setTimeout(init, 100);
})();