Xeraphinite - zombs.io

fontawesome icons (both svgs and converted to pngs) added.

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         Xeraphinite - zombs.io
// @namespace    http://tampermonkey.net/
// @version      2.17
// @description  fontawesome icons (both svgs and converted to pngs) added.
// @author       rdm, god of simping
// @match        *://zombs.io/
// @icon         https://cdn.discordapp.com/attachments/854376044522242059/907931471518502922/flowerxeraphinite.png
// @grant        none
// @require      https://greatest.deepsurf.us/scripts/47911-font-awesome-all-js/code/Font-awesome%20AllJs.js?version=275337
// ==/UserScript==

// v0.1: basic html and css added
// v0.2: html and css done (except party hud)
// v0.3: all html and css done
// v0.4: some functions added
// v0.41: added credits
// v0.5: reworked sell menu
// v0.6: find it out yourself
// v0.61: small adjustments, almost ready for release
// v0.7: added crossbow toolbar icon and afs
// v0.8: autobow added
// v0.9: marker functions, v1.0?
// v1.0: official release, added changelog button
// v1.1: added rendering options, pretty big update imo
// v1.2: fixed score logger, added some small functions
// v1.3: ui change, added chat spammer...
// v1.4: funky button toggle in party hud, woohoo
// v1.5: HUGE ui changes and bug fixes
// v1.53: just a note, score logger will be deleted in v1.6.
// v1.55: quick feature debug, you can now resize chat.
// v1.6: score logger is gone.
// v1.7: name a useless feature
// v1.72: critical fix of not being abled to request to parties, sorry!
// v.75: quick afs update, refined some stuff
// v1.8: great new chat system by Morpheus_ !
// v1.82: updated to comply with the new patch update, smaller ahrc raw code.
// v1.9: added ignition's show rss counter.
// v1.92: last minor update of v1.0, refined functions and temporary disabled sell all functions.
// v2.0: ui themes (more coming soon), refined functions and tidied up the code.
// v2.1: 1 more themes + screenshot mode.
// v2.11: record base fix.

/* remove cringe icons & intro styles */
document.querySelectorAll('.ad-unit, .hud-intro-left, .hud-intro-youtuber, .hud-intro-footer, .hud-intro-stone, .hud-intro-tree, .hud-intro-social, .hud-intro-more-games').forEach(el => el.remove());
document.getElementsByClassName("hud-intro-form")[0].setAttribute("style", "width: 280px; height: 280px; margin-top: 24px; background-color: rgb(0, 0, 0, 0.0);");
document.getElementsByClassName("hud-intro-guide")[0].setAttribute("style", "width: 280px; height: 400px; margin-top: 8px; background-color: rgb(0, 0, 0, 0.0);");

if (localStorage.themeClass == undefined) localStorage.setItem('themeClass', 'summer');

// intro screen options since people complain about me putting only two waifus to simp
let setColor = {
    themeColor: {
        summer: '#1eacbf',
        mirai: '#1eacbf',
        zettai: '#13c2b4',
        blossom: '#e492dd',
    },
    lightThemeColor: {
        summer: '#1cb2c9',
        mirai: '#1cb2c9',
        zettai: '#59d4ca',
        blossom: '#d47acd',
    },
    hoverColor: {
        summer: '#10c7e3',
        mirai: '#10c7e3',
        zettai: '#40eddf',
        blossom: '#ff7df4',
    },
    background: {
        summer: 'https://cdn.discordapp.com/attachments/854376044522242059/907880671610040330/background.jpg',
        mirai: 'https://cdn.discordapp.com/attachments/854376044522242059/924865286719557672/BG_Mirai_Light.webp',
        zettai: 'https://cdn.discordapp.com/attachments/854376044522242059/946654780367978516/BG_zettai_light.webp',
        blossom: 'https://cdn.discordapp.com/attachments/854376044522242059/897760137043902474/another_one.png',
    },
    menuBackground: {
        summer: 'rgba(28, 178, 201, 0.5)',
        mirai: 'rgba(28, 178, 201, 0.5)',
        zettai: 'rgba(60, 207, 195, 0.5)',
        blossom: 'rgba(158, 47, 142, 0.55)',
    },
};

let susArray = [`
<img src="https://cdn.discordapp.com/attachments/854376044522242059/952365789632163931/ganyu.png" style="margin: -1290px 0 0 0;width: 512px;opacity: 0.05;display: flex;" >
`, '', '', '', '']

let cssTitle = `
.hud-intro::before {
    background-image: url(${setColor.background[localStorage.themeClass]});
    background-size: cover;
}
.btn-fixed {
    display: inline-block;
    height: 25px;
    line-height: 25px;
    padding: 0 12px;
    background: #444;
    color: #eee;
    border: 0;
    font-size: 14px;
    vertical-align: top;
    text-align: center;
    text-decoration: none;
    text-shadow: 0 1px 0 rgba(0, 0, 0, 0.4);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
    border-radius: 4px;
    transition: all 0.15s ease-in-out;
}
.search-bar {
	background-color: #FFF;
    outline: none;
    border: 2px solid white;
    border-radius: 5px;
    color: black;
    font-size: 16px;
    vertical-align: middle;
    margin: 0 5px 0 0;
}
.btn:hover {
    cursor: pointer;
}
.border-theme {
    border: 3px solid ${setColor.themeColor[localStorage.themeClass]};
    border-radius: 4px;
    background: none;
    transition: all 0.15s ease-in-out;
}
.border-theme:hover {
    cursor: pointer;
    border-color: ${setColor.hoverColor[localStorage.themeClass]};
}
.btn-theme {
    background-color: ${setColor.themeColor[localStorage.themeClass]};
}
.btn-theme:hover {
    background-color: ${setColor.hoverColor[localStorage.themeClass]};
}
.hud-xera-anchor {
    position: relative;
    display: block;
    float: left;
    width: 100%;
    height: 64px;
    margin: 0 0 10px;
    padding: 10px 10px 10px 64px;
    text-decoration: none;
    background: rgba(255, 255, 255, 0.1);
    color: #eee;
    border-radius: 3px;
    transition: all 0.15s ease-in-out;
}
.hud-xera-anchor-no-hover {
    position: relative;
    display: block;
    float: left;
    width: 100%;
    height: 64px;
    margin: 0 0 10px;
    padding: 10px 10px 10px 64px;
    text-decoration: none;
    background: rgba(255, 255, 255, 0.1);
    color: #eee;
    border-radius: 3px;
    transition: all 0.15s ease-in-out;
}
.hud-xera-anchor::after {
    content: ' ';
    display: block;
    position: absolute;
    top: 16px;
    left: 16px;
    bottom: 16px;
    width: 32px;
    height: 32px;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
    opacity: 0.9;
    transition: all 0.15s ease-in-out;
}
.hud-xera-anchor-no-hover::after {
    content: ' ';
    display: block;
    position: absolute;
    top: 16px;
    left: 16px;
    bottom: 16px;
    width: 32px;
    height: 32px;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
    opacity: 0.9;
    transition: all 0.15s ease-in-out;
}
.hud-xera-anchor[data-item=record]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/916849867370938450/WHITE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=build]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/916853186491469914/ALSO_WHITE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=deletebase]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/916854543977955348/WHITE_CIRCLE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=upall]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/916855487457271838/DOUBLE_WHITE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=togglechat]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/917286994667769886/THE_WHITE_TOGGLE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=ahrc]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/917623699115507752/FILL_THE_WHITE.png');
    top: 13px;
}
.hud-xera-anchor[data-item=exactrss]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/917624255104057354/EQUAL_TO_THE_WHITE.png');
    top: 13px;
}
.hud-xera-anchor-no-hover[data-item=rdmcolor]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/923866937677725737/A_WHITE_PALLETTE.png');
    top: 13px;
}
.hud-xera-anchor-no-hover[data-item=spamchat]::after {
    background-image: url('https://cdn.discordapp.com/attachments/854376044522242059/917297025970757652/A_WHITE_SPAMMER.png');
    top: 13px;
}
.hud-input-value {
    margin: 0 0 60px;
    border-radius: 4px 4px 0 0;
}
.disabled-class {
    opacity: 0.4 !important;
    cursor: not-allowed !important;
}
.hud-xera-actions {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    height: 50px;
    margin: 0;
    padding: 10px;
    background: rgba(255, 255, 255, 0.05);
    border-radius: 0 0 4px 4px;
}
.hud-xera-anchor:hover {
    background: rgba(255, 255, 255, 0.2);
}
.hud-menu-settings span {
    color: rgba(255, 255, 255, 0.4);
    font-size: 12px;
    display: flex;
}
.hud-intro-main {
    border-radius: 5px;
    padding: 0px 25px 25px 25px;
    width: 580px;
    height: 290px;
    max-height: 400px;
    background-image: linear-gradient(to bottom right, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4))
}
.hud-intro .hud-intro-form .hud-intro-play {
    background-color: ${setColor.themeColor[localStorage.themeClass]};
}
.hud-intro .hud-intro-form .hud-intro-play:hover {
    background-color: ${setColor.hoverColor[localStorage.themeClass]};
}
`;

let styles = document.createElement("style");
styles.appendChild(document.createTextNode(cssTitle));
document.head.appendChild(styles);
styles.type = "text/css";

document.getElementsByClassName('hud-intro-corner-bottom-left')[0].insertAdjacentHTML("afterbegin", `
<img src="https://cdn.discordapp.com/attachments/854376044522242059/908331735010377728/xeraedit.png" class="xera" style="opacity: 0.5;">
`);

document.getElementsByClassName('hud-intro-corner-bottom-right')[0].insertAdjacentHTML("afterbegin", `
<select id="introBackground" class="btn" style="background: white;color: black;text-shadow: none;opacity: 0.6;">
    <option value="summer" ${localStorage.themeClass == 'summer' ? 'selected' : ''}>Summer Hikari & Tairitsu</option>
    <option value="mirai" ${localStorage.themeClass == 'mirai' ? 'selected' : ''}>Light Mirai</option>
    <option value="zettai" ${localStorage.themeClass == 'zettai' ? 'selected' : ''}>Light Zettai</option>
    <option value="blossom" ${localStorage.themeClass == 'blossom' ? 'selected' : ''}>Blossom</option>
</select>
<br></br>
<span style="color: white;opacity: 0.4;">Option will save after hitting the Play button!</span>
`);
game.ui.components.Intro.submitElem.addEventListener('click', () => {
    localStorage.setItem('themeClass', document.getElementById('introBackground').value);
})

/* random character gen */
var availableCharacters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890~!@#$%^&*()_+`-=[]{};':,./<>?\|";
var textLength = 29;
var text = "";
for (let i = 0; i < textLength; i++) text += availableCharacters[Math.floor(Math.random() * availableCharacters.length)];


/* name stuffs here */
document.getElementsByClassName('hud-intro-name')[0].setAttribute('maxlength', 29);

let guide = document.getElementsByClassName("hud-intro-guide")[0];
guide.innerHTML = `
<center>
<h1 style="text-transform: none;">Usernames</h1>
<hr />
</center>
<br />
<button class="btn hud-intro-invisible" style = 'margin-bottom: 10px;'>Invisible username</button>
<button class="btn hud-intro-random" style = 'margin-bottom: 10px;'>Random-generated username</button>
<div class="hud-intro-name-save">
</div>
`;
guide.style.height = "260px";

function invisiblename() { document.getElementsByClassName('hud-intro-name')[0].value = "ㅤ"; };
function randomname() { document.getElementsByClassName('hud-intro-name')[0].value = `${text}`; };

document.querySelector('.hud-intro-invisible').addEventListener('click', invisiblename);
document.querySelector('.hud-intro-random').addEventListener('click', randomname);


/* ui styles */
document.getElementsByClassName('hud-top-right')[0].insertAdjacentHTML("beforeend", `
<div id="zsd">
    <button class="btn btn-theme" style="position: absolute;left: -41.5%;z-index: 14;top: 0%;width: 48px;padding: 0 0 0 0px;" onclick="window.zoomOut();">
        <i class="fa fa-arrow-up fa-2x" style="margin-top: 5px;"></i>
    </button>
    <input type='range' style='-webkit-appearance: slider-vertical;position: absolute;left: -15%;width: 5%;z-index: 14;top: -1000%;' id="zoomSlider" min=0.2 max=20 value=1 step=0.02 />
    <button class="btn btn-theme" style="position: absolute;z-index: 14;left: -60%;top: 0%;width: 45px;padding: 0 0 0 0px;" onclick="window.zoomIn();">
        <i class="fa fa-arrow-down fa-2x" style="margin-top: 5px;"></i>
    </button>
</div>`);
document.getElementsByClassName('hud-top-right')[0].insertAdjacentHTML("beforeend", `
<div class="refrsh">
    <button class="btn btn white" style="position: absolute;z-index: 14;left: -20%;top: 0%;width: 40px;height: 40px; padding: 0 0 0 0px;" onclick="window.toggleZoS();">
        <i class="fa fa-redo"></i>
    </button>
</div>
`);
document.getElementsByClassName("hud-menu-icons")[0].insertAdjacentHTML("beforeend", `<div class="hud-menu-icon" data-type="More" onclick="window.moreMenu();"></div>`);
function getRandomItem(array) {
    return array[Math.floor(Math.random() * array.length)];
};
document.getElementsByClassName('hud-respawn')[0].insertAdjacentHTML('beforeend', `${getRandomItem(susArray)}`);

document.body.insertAdjacentHTML('beforeend', `
<div class="hud-menu hud-menu-settings hud-menu-more">
<h3 style="text-align: left;">Renderer</h3>
<br />
<br />
<div style="text-align: left">
<button class="btn btn-theme 1z" style="width: 45%;margin: 1px;">Stop Rendering Ground?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i> The ground will start/stop rendering.</small>
<br />
<br />
<div id="addon" style="display: none;">
<button class="btn btn-green 1z1" style="margin: 1px;">Black Ground With Grid?</button>
<br />
<br />
</div>
<button class="btn btn-theme 2z" style="width: 45%;margin: 1px;">Stop Rendering NPCs?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i> All NPCs (including players, apparently) will start/stop rendering.</small>
<br />
<br />
<button class="btn btn-theme 3z" style="width: 45%;margin: 1px;">Stop Rendering Enviroment?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i> Trees, Stones, Crystals and Buildings will start/stop rendering. Can be a performance increase if you have travelled to too many places on the map...</small>
<br />
<br />
<button class="btn btn-theme 4z" style="width: 45%;margin: 1px;">Stop Rendering Projectiles?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i> Projectiles will start/stop rendering. Good for sitting in large bases!</small>
<br />
<br />
<button class="btn btn-theme 5z" style="width: 45%;margin: 1px;">Stop Rendering <strong>Everything</strong>?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i><strong> Everything.</strong></small>
<br />
<br />
<button class="btn btn-theme 6z" style="width: 45%;margin: 1px;">Stop Renderer?</button>
<br />
<br />
<small><i class="fa fa-info-circle"></i> Freezes renderer.</small>
<br />
<br />
</div>
</div>
`);
var xyshow = document.createElement("p");
xyshow.style = 'position: relative;top: 17px;right: 0px;font-weight: 900;font-family: "Hammersmith One";text-shadow: 1px 0 0 #fff, -1px 0 0 #fff, 0 1px 0 #fff, 0 -1px 0 #fff, 0.5px 0.5px #fff, -0.5px -0.5px 0 #fff, 0.5px -0.5px 0 #fff, -0.5px 0.5px 0 #fff;';
xyshow.innerHTML = "loading x/y coordinate";
xyshow.className = "xyshowcoordinate";
document.querySelector(".hud-bottom-left").appendChild(xyshow);

let cssMain = `
#hud-menu-party {
    top: 51%;
    width: 610px;
    height: 480px;
    background-color: ${setColor.menuBackground[localStorage.themeClass]};
    border: 5px solid white;
}
.hud-menu-party .hud-party-tag {
    width: 120px;
}
.hud-menu-party .hud-party-share {
    width: 280px;
}
.hud-menu-party .hud-party-grid .hud-party-link.is-active {
    background: ${setColor.lightThemeColor[localStorage.themeClass]} !important;
}
.hud-menu-party .hud-party-visibility {
    background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-menu-party .hud-party-visibility:hover, .hud-menu-party .hud-party-visibility:active {
    background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-popup-overlay .hud-popup-confirmation .hud-confirmation-actions .btn.btn-green {
    background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-chat {
    resize: vertical;
    max-height: 380px;
    min-height: 75px;
    overflow-y: auto;
    border-radius: 4px 4px 4px 0;
}
.hud-chat .hud-chat-message {
    display: block;
    position: relative;
    width: 90%;
    white-space: unset;
    word-break: break-all;
    overflow: visible;
}
.hud-chat .hud-chat-message strong {
    display: inline-block;
}
.hud-chat .hud-chat-message > small {
    position: absolute;
    right: -12%;
    font-weight: bold;
    opacity: 0.4;
}
#hud-menu-shop {
    top: 54.5%;
    left: 50.5%;
    width: 690px;
    height: 500px;
    background-color: ${setColor.menuBackground[localStorage.themeClass]};
    border: 5px solid white;
    margin: -350px 0 0 -350px;
    padding: 20px 20px 20px 20px;
}
.hud-menu-shop .hud-shop-grid .hud-shop-item .hud-shop-item-actions .hud-shop-actions-equip {
    background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-menu-shop .hud-shop-grid .hud-shop-item .hud-shop-item-actions .hud-shop-actions-equip:hover, .hud-menu-shop .hud-shop-grid .hud-shop-item .hud-shop-item-actions .hud-shop-actions-equip:active {
    background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-menu-shop .hud-shop-grid .hud-shop-item .hud-shop-item-actions .hud-shop-actions-equip.is-disabled {
    background: none;
}
.hud-menu-shop .hud-shop-grid .hud-shop-item[data-item=HatComingSoon] .hud-shop-item-coming-soon {
    background: none;
}
#hud-menu-settings {
    height: 550px;
    background-color: ${setColor.menuBackground[localStorage.themeClass]};
    border: 5px solid white;
}
.hud-menu-settings .hud-xera-grid {
    display: block;
    height: 460px;
    padding: 10px;
    margin-top: 18px;
    background: rgba(0, 0, 0, 0.2);
    overflow: auto;
}
.hud-respawn .hud-respawn-info .hud-respawn-btn {
   background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
.hud-respawn .hud-respawn-info .hud-respawn-btn:hover {
   background: ${setColor.lightThemeColor[localStorage.themeClass]};
}
#hud-building-overlay {
    background-color: ${setColor.menuBackground[localStorage.themeClass]};
    border: 1px solid white;
}
.btn.btn-green.hud-building-upgrade {
    background-color: ${setColor.themeColor[localStorage.themeClass]}
}
.hud-building-overlay .hud-building-upgrade.is-disabled {
    background: ${setColor.themeColor[localStorage.themeClass]} !important;
}
.hud-building-overlay .hud-tooltip-health .hud-tooltip-health-bar {
    background: ${setColor.lightThemeColor[localStorage.themeClass]}
}
.hud-menu-icons .hud-menu-icon[data-type=More]::before {
    background-image: url("https://media.discordapp.net/attachments/870020008128958525/876133010360107048/unknown.png");
    background-size: 30px;
}
.hud-menu-more {
    background-color: ${setColor.menuBackground[localStorage.themeClass]};
    border: 5px solid white;
}
.hud-menu-icons .hud-menu-icon::before {
    filter: drop-shadow(1px 1px 0px #000) drop-shadow(-1px 1px 0px #000) drop-shadow(1px -1px 0px #000) drop-shadow(-1px -1px 0px #000)
}
::-webkit-scrollbar {
	width: 12px;
    height: 0px;
    border-radius: 10px;
	background-color: rgba(0, 0, 0, 0);
}
::-webkit-scrollbar-thumb {
	border-radius: 10px;
	background-image: url(https://cdn.discordapp.com/attachments/854376044522242059/924927754326142976/whiteslider.png);
}
/* sliders from ignition, very beautiful and nice */

.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
}

.switch input {
  opacity: 0;
  width: 0;
  height: 0;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  -webkit-transition: .4s;
  transition: .4s;
}

.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  -webkit-transition: .4s;
  transition: .4s;
}

input:checked + .slider {
  background-color: #1eacbf;
}

input:focus + .slider {
  box-shadow: 0 0 1px #1eacbf;
}

input:checked + .slider:before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(30px);
}
.slider.round {
  border-radius: 34px;
}

.slider.round:before {
  border-radius: 50%;
}
`;

let stylesMain = document.createElement("style");
stylesMain.appendChild(document.createTextNode(cssMain));
document.head.appendChild(stylesMain);
stylesMain.type = "text/css";


/* main code incoming */
//
//
//
/* main css */
let menu = document.querySelector("#hud-menu-settings");
menu.style.overflow = "auto";
menu.innerHTML = `
<p class="hud-Close-icon" style="display:inline-block;margin: 0 0 0 0px;opacity: 0.3;"><strong>&#x2715</strong></p>
<br />
<div class="hud-xera-grid">
<center>
<h2 style="margin: 20px 0 0 0"> Sell </h2>
<hr />
<br />
<button class="border-theme 1i" style="margin: 1px;padding: 7px;width: 60px;height: 60px;"><img src="/asset/image/entity/wall/wall-t1-base.svg" style="width: 40px;"></button>
<button class="border-theme 2i" style="margin: 1px;padding: 7px;width: 60px;height: 60px;"><img src="/asset/image/entity/door/door-t1-base.svg" style="width: 40px;"></button>
<button class="border-theme 3i" style="margin: 1px;padding: 7px;width: 60px;height: 60px;"><img src="/asset/image/entity/slow-trap/slow-trap-t1-base.svg" style="width: 40px;"></button>
<br />
<button class="border-theme 4i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/arrow-tower/arrow-tower-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/arrow-tower/arrow-tower-t1-head.svg" style="width: 55px;position: relative;transform: translate(-10%, -100%);"></button>
<button class="border-theme 5i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/cannon-tower/cannon-tower-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/cannon-tower/cannon-tower-t1-head.svg" style="width: 60px;position: relative;transform: translate(-10%, -95%);"></button>
<button class="border-theme 6i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/melee-tower/melee-tower-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/melee-tower/melee-tower-t1-middle.svg" style="width: 40px;position: relative;transform: translate(30%, -130%);"><img src="/asset/image/entity/melee-tower/melee-tower-t1-head.svg" style="width: 35px;position: relative;transform: translate(-5%, -207.5%);"></button>
<br />
<button class="border-theme 7i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/bomb-tower/bomb-tower-t1-base.svg" style="width: 48px;"></button>
<button class="border-theme 8i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/mage-tower/mage-tower-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/mage-tower/mage-tower-t1-head.svg" style="width: 25px;position: relative;transform: translate(-0%, -160%);"></button>
<button class="border-theme 9i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/gold-mine/gold-mine-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/gold-mine/gold-mine-t1-head.svg" style="width: 45px;position: relative;transform: translate(-0%, -110%);"></button>
<br />
<button class="border-theme 10i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/harvester/harvester-t1-base.svg" style="width: 48px;"><img src="/asset/image/entity/harvester/harvester-t1-head.svg" style="width: 50px;position: relative;transform: translate(-5%, -125%);"></button>
<button class="border-theme 11i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/pet-ghost/pet-ghost-t1-base.svg" style="width: 39.5px;"></button>
<button class="border-theme 0i" style="margin: 1px;padding: 3px;width: 60px;height: 60px;"><img src="/asset/image/entity/gold-stash/gold-stash-t1-base.svg" style="width: 48px;"></button>
<br />
<small style="opacity: 0.1">lte's sell numpad sucks lol</small>
<br />
<img src="https://cdn.discordapp.com/attachments/854376044522242059/908538354239434772/clicker.png" style="transform: translate(-180px, -270px);width: 150px;position: relative;margin: -200px;opacity: 0.5;">
<h2> Build </h2>
<hr />
<br />
</center>
<a class="hud-xera-anchor 0i2" data-item="record" onclick="RecordBase();">
    <strong>Record Base</strong>
    <span>Record your base with this button!</span>
</a>
<a class="hud-xera-anchor 1i2" data-item="build" onclick="buildRecordedBase();">
    <strong>Build Recorded Base</strong>
    <span>Build your base instantly with this button!</span>
</a>
<a class="hud-xera-anchor 2i2" data-item="deletebase" onclick="DeleteRecordedbase();">
    <strong>Delete Recorded Base!</strong>
    <span>Delete your recorded base with this button!</span>
</a>
<a class="hud-xera-anchor 3i2" data-item="upall">
     <strong>Upgrade All</strong>
     <small id="upalltoggle" style="color: red;margin: 0 0 0 320px;opacity: 0.7;font-weight: 900;">OFF</small>
     <span>Upgrade all of your towers with this toggle!</span>
</a>
<br />
<small><i class="fa fa-info-circle"></i> Base saver system made by Apex, give him some love! <a href="https://discord.gg/KuVUwpqqcK" target="_blank" style="color: lightblue">Discord server</a></small>
<br />
<h2 style="text-align: center;"> Chat </h2>
<hr />
<br />
<a id="chattoggle" class="hud-xera-anchor 0i3" data-item="togglechat" onclick="window.toggleChat();">
    <strong>Toggle Chat</strong>
    <small id="togglechattoggle" style="color: red;margin: 0 0 0 320px;opacity: 0.7;font-weight: 900;">OFF</small>
    <span>Hide your chat with this toggle!</span>
</a>
<a class="hud-xera-anchor-no-hover 1i3" data-item="spamchat">
    <strong>Spam Chat</strong>
    <span>Spam your nonsensical chat messages with this!</span>
    <span class="hud-xera-actions">
        <button class="btn btn-theme" id="togglespmch" style="height: 30px;line-height: unset;width: 230px;">Toggle Chat Spam</button>
        <input id="spmchinput" type="tel" style="background-color: rgba(0,0,0,0);padding: 4px 5px;border-radius: 8px;color: rgba(255,255,255,0.7);border: 2px solid rgba(255, 255, 255, 0.7);width: 230px;height: 30px;margin: 0 0px 5px 40px;" placeholder="Your message here..." class="btn" >
    </span>
</a>
<br />
<small style="opacity: 0">c</small>
<br />
<small style="opacity: 0">c</small>
<br />
<h2 style="text-align: center;"> Miscellaneous </h2>
<hr />
<br />
<a class="hud-xera-anchor 0i4" data-item="ahrc">
    <strong>Activate AHRC</strong>
    <small id="ahrctoggle" style="color: red;margin: 0 0 0 300px;opacity: 0.7;font-weight: 900;">OFF</small>
    <span>Automatically refills your harvesters, only 1 gold each!</span>
</a>
<a class="hud-xera-anchor 1i4" data-item="exactrss">
    <strong>Enable Exact RSS Counter</strong>
    <small id="exactrsstoggle" style="color: red;margin: 0 0 0 215px;opacity: 0.7;font-weight: 900;">OFF</small>
    <span>Gives you exact infos about your resource units!</span>
</a>
<a class="hud-xera-anchor-no-hover 2i4" data-item="rdmcolor">
    <strong>Random Color</strong>
    <span>Make names look les... more fancy!</span>
    <span class="hud-xera-actions">
        <button class="btn btn-theme" style="height: 30px;line-height: unset;width: 230px;" onclick="window.randomColor();">Randomize Color!</button>
        <button class="btn btn-theme" style="height: 30px;line-height: unset;width: 230px;margin: 0 0px 5px 40px;" onclick="window.resetColor();">Reset Color!</button>
    </span>
</a>
<br />
<small style="opacity: 0">c</small>
<br />
<small style="opacity: 0">c</small>
<br />
<h2 style="text-align: center;"> Help </h2>
<hr />
<br />
<h3><i class="fa fa-info-circle"></i> General </h3>
<p>+ Record base(s): You can save a base with the button, "Record Base!", and build the saved base with "Build Recorded Base!" button. In case you need to delete for another one, just click "Delete Recorded Base!".</P>
<p>+ Upgrade All: Automatically upgrades everything in your base to maximum tier possible.</p>
<p>+ AHRC: Stands for "Automatic Harvester Resource Collector", automatically refills your harvester(s) and collects them back to you.</p>
<p>+ Exact RSS Counter: "De-truncate" your resource stats.</p>
<p>+ Join party by PSK function: PSK stands for Party Share Key, use this to join your previous parties!</p>
<br />
<h3><i class="fa fa-keyboard"></i> Keybinds </h3>
<p> - // Enable show other players' RSS.</p>
<p> = // Toggle Exact RSS Counter.</p>
<p> ~ // Add a marker on the minimap.</p>
<p> ? // Toggles on screenshot mode.</p>
<p> X // Toggles on mod menu.</p>
<br />
<br />
<br />
<br />
<br />
<h4>Xeraphinite, v2.1</h4>
<img id="padoru" src="https://cdn.discordapp.com/attachments/871760287760519232/914408457443094568/EohccRVVoAAMjiu.png" style="width: 256px;margin: -300px 0 0 250px;opacity: 0.3;transform: scaleX(-1);">
`;
function modm() {
    if(menu.style.display == "none" || menu.style.display == "") {
        menu.style.display = "block";
    } else {
        menu.style.display = "none";
    };
};


/* main code */
var showRSS = false;
var AHRC = false;
var upgradeAll = false;
var petTimeout = false;
var heal = true;
var autobow = false;
var getRss = false;
var allowed1 = true;

function msToTime(s) {

    // Pad to 2 or 3 digits, default is 2
    function pad(n, z) {
        z = z || 2;
        return ('00' + n).slice(-z);
    }

    var ms = s % 1000;
    s = (s - ms) / 1000;
    var secs = s % 60;
    s = (s - secs) / 60;
    var mins = s % 60;
    var hrs = (s - mins) / 60;

    return pad(hrs) + ':' + pad(mins) + ':' + pad(secs) + '.' + pad(ms, 3);
}

function counter(e = 0) {
    if (e <= -0.99949999999999999e24) {
        return Math.round(e/-1e23)/-10 + "TT";
    }
    if (e <= -0.99949999999999999e21) {
        return Math.round(e/-1e20)/-10 + "TB";
    }
    if (e <= -0.99949999999999999e18) {
        return Math.round(e/-1e17)/-10 + "TM";
    }
    if (e <= -0.99949999999999999e15) {
        return Math.round(e/-1e14)/-10 + "TK";
    }
    if (e <= -0.99949999999999999e12) {
        return Math.round(e/-1e11)/-10 + "T";
    }
    if (e <= -0.99949999999999999e9) {
        return Math.round(e/-1e8)/-10 + "B";
    }
    if (e <= -0.99949999999999999e6) {
        return Math.round(e/-1e5)/-10 + "M";
    }
    if (e <= -0.99949999999999999e3) {
        return Math.round(e/-1e2)/-10 + "K";
    }
    if (e <= 0.99949999999999999e3) {
        return Math.round(e) + "";
    }
    if (e <= 0.99949999999999999e6) {
        return Math.round(e/1e2)/10 + "K";
    }
    if (e <= 0.99949999999999999e9) {
        return Math.round(e/1e5)/10 + "M";
    }
    if (e <= 0.99949999999999999e12) {
        return Math.round(e/1e8)/10 + "B";
    }
    if (e <= 0.99949999999999999e15) {
        return Math.round(e/1e11)/10 + "T";
    }
    if (e <= 0.99949999999999999e18) {
        return Math.round(e/1e14)/10 + "TK";
    }
    if (e <= 0.99949999999999999e21) {
        return Math.round(e/1e17)/10 + "TM";
    }
    if (e <= 0.99949999999999999e24) {
        return Math.round(e/1e20)/10 + "TB";
    }
    if (e <= 0.99949999999999999e27) {
        return Math.round(e/1e+23)/10 + "TT";
    }
    if (e >= 0.99949999999999999e27) {
        return Math.round(e/1e+23)/10 + "TT";
    }
}

game.network.addEntityUpdateHandler(() => {
    if (game.network.connected) {
        if(upgradeAll) {
            let entities = game.world.entities;
            for (let uid in entities) {
                if (!entities.hasOwnProperty(uid)) continue;
                game.network.sendRpc({name: "UpgradeBuilding", uid: entities[uid].fromTick.uid});
            }
        }
        if (AHRC) {
            let entities = Game.currentGame.world.entities;
            for (let uid in entities) {
                let obj = entities[uid];
                if (obj.fromTick.model == "Harvester") {
                    let amount = obj.fromTick.tier * 0.05 - 0.02;
                    game.network.sendRpc({name: "AddDepositToHarvester", uid: obj.fromTick.uid, deposit: amount});
                    game.network.sendRpc({name: "CollectHarvester", uid: obj.fromTick.uid});
                };
            };
        };

        if (autobow) {
            game.network.sendInput({space: 0})
            game.network.sendInput({space: 1})
        }
    }
    if (getRss) {
        !allowed1 && (allowed1 = true);
    }
    if (getRss || allowed1) {
        for (let i in game.renderer.npcs.attachments) {
            if (game.renderer.npcs.attachments[i].fromTick.name) {
                let player = game.renderer.npcs.attachments[i];
                let wood_1 = counter(player.targetTick.wood);
                let stone_1 = counter(player.targetTick.stone);
                let gold_1 = counter(player.targetTick.gold);
                let token_1 = counter(player.targetTick.token);
                let px_1 = counter(player.targetTick.position.x);
                let py_1 = counter(player.targetTick.position.y);
                let timeout_1 = "";
                if (getRss && !player.targetTick.oldName) {
                    player.targetTick.oldName = player.targetTick.name;
                    player.targetTick.oldWood = wood_1;
                    player.targetTick.oldStone = stone_1;
                    player.targetTick.oldGold = gold_1;
                    player.targetTick.oldToken = token_1;
                    player.targetTick.oldPX = px_1;
                    player.targetTick.oldPY = py_1;
                    player.targetTick.info = `
  ${player.targetTick.oldName}; score: ${player.targetTick.score.toLocaleString()}
  UID: ${player.targetTick.uid}
  W: ${wood_1}, S: ${stone_1}, G: ${gold_1}, T: ${token_1}
  x: ${Math.round(player.targetTick.position.x)}, y: ${Math.round(player.targetTick.position.y)}
  partyId: ${Math.round(player.targetTick.partyId)}
  timeDead: ${msToTime(player.targetTick.timeDead)}
                    ${player.targetTick.isPaused ? "On Timeout" : ""}





`;
                    player.targetTick.name = game.renderer.npcs.attachments[i].targetTick.info;
                }
                if (!getRss && player.targetTick.oldName) {
                    player.targetTick.info = player.targetTick.oldName;
                    player.targetTick.name = game.renderer.npcs.attachments[i].targetTick.info;
                    player.targetTick.oldName = null;
                }
                if (getRss) {
                    if (player.targetTick.oldGold !== gold_1 || player.targetTick.oldWood !== wood_1 || player.targetTick.oldStone !== stone_1 || player.targetTick.oldToken !== token_1 || player.targetTick.oldPX !== px_1 || player.targetTick.oldPY !== py_1) {
                        player.targetTick.oldWood = wood_1;
                        player.targetTick.oldStone = stone_1;
                        player.targetTick.oldGold = gold_1;
                        player.targetTick.oldToken = token_1;
                        player.targetTick.oldPX = px_1;
                        player.targetTick.oldPY = py_1;
                        player.targetTick.info = `
  ${player.targetTick.oldName}; score: ${player.targetTick.score.toLocaleString()}
  UID: ${player.targetTick.uid}
  W: ${wood_1}, S: ${stone_1}, G: ${gold_1}, T: ${token_1}
  x: ${Math.round(player.targetTick.position.x)}, y: ${Math.round(player.targetTick.position.y)}
  partyId: ${Math.round(player.targetTick.partyId)}
  timeDead: ${msToTime(player.targetTick.timeDead)}
                    ${player.targetTick.isPaused ? "On Timeout" : ""}





`;
                        player.targetTick.name = game.renderer.npcs.attachments[i].targetTick.info;
                    }
                }
            }
        }
    }
    if (!getRss) {
        allowed1 = false;
    }
    if(!window.zoomonscroll) {
        window.zoom(document.getElementById("zoomSlider").value);
    };
});

Game.currentGame.ui._events.playerPetTickUpdate.push(pet => {
    if (pet.health <= 0) {
        Game.currentGame.network.sendRpc({name: "BuyItem", itemName: "PetRevive", tier: 1});
        Game.currentGame.network.sendRpc({name: "EquipItem", itemName: "PetRevive", tier: 1});
    }
    if (heal) {
        let petHealth = (pet.health / pet.maxHealth) * 100;
        if (petHealth <= 50) {
            game.network.sendRpc({name: "BuyItem", itemName: "PetHealthPotion", tier: 1});
            game.network.sendRpc({name: "EquipItem", itemName: "PetHealthPotion", tier: 1});
        };
    };
});

game.ui._events.playerTickUpdate.push(player => {
    if (heal) {
        let playerHealth = (player.health / player.maxHealth) * 100;
        if (playerHealth <= 50) healPlayer();
    }
    xyshow.innerHTML = `X: ${Math.round(player.position.x - 13)}, Y: ${Math.round(player.position.y) - 13}`;
});

function healPlayer() {
    Game.currentGame.network.sendRpc({
        "name": "EquipItem",
        "itemName": "HealthPotion",
        "tier": 1
    })
    Game.currentGame.network.sendRpc({
        "name": "BuyItem",
        "itemName": "HealthPotion",
        "tier": 1
    })
}

function sellAllByType(type) {
    if (!game.ui.playerPartyCanSell) return;

    let sellInterval = () => {
        let target = Object.values(game.ui.buildings).find(e => e.type == type);
        if (target !== undefined) {
            Game.currentGame.network.sendRpc({name: "DeleteBuilding", uid: target.uid});
            setTimeout(() => { sellInterval(); }, 100);
        }
    }
    sellInterval();
};

document.getElementsByClassName("0i")[0].addEventListener('click', function() {
    Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to delete all towers?", 1e4, function() {
        let sellInterval = () => {
            if (Object.keys(game.ui.buildings).length > 1 && game.ui.playerPartyCanSell) {
                Game.currentGame.network.sendRpc({name: "DeleteBuilding", uid: parseInt(Object.keys(game.ui.buildings)[1])});
                setTimeout(() => { sellInterval(); }, 100);
            }
        }
        sellInterval();
    })
})

document.getElementsByClassName("1i")[0].addEventListener('click', () => { sellAllByType("Wall") });
document.getElementsByClassName("2i")[0].addEventListener('click', () => { sellAllByType("Door") });
document.getElementsByClassName("3i")[0].addEventListener('click', () => { sellAllByType("SlowTrap") });
document.getElementsByClassName("4i")[0].addEventListener('click', () => { sellAllByType("ArrowTower") });
document.getElementsByClassName("5i")[0].addEventListener('click', () => { sellAllByType("CannonTower") });
document.getElementsByClassName("6i")[0].addEventListener('click', () => { sellAllByType("MeleeTower") });
document.getElementsByClassName("7i")[0].addEventListener('click', () => { sellAllByType("BombTower") });
document.getElementsByClassName("8i")[0].addEventListener('click', () => { sellAllByType("MagicTower") });
document.getElementsByClassName("9i")[0].addEventListener('click', () => { sellAllByType("GoldMine") });
document.getElementsByClassName("10i")[0].addEventListener('click', () => { sellAllByType("Harvester") });
document.getElementsByClassName("11i")[0].addEventListener('click', () => { Game.currentGame.network.sendRpc({name: "DeleteBuilding", uid: game.ui.getPlayerPetUid()}); });

document.getElementsByClassName("3i2")[0].addEventListener('click', function() {
    upgradeAll = !upgradeAll;
    let upalltoggle = document.getElementById('upalltoggle');
    if (upgradeAll) {
        upalltoggle.style.color = "green";
        upalltoggle.innerText = "ON";
    } else {
        upalltoggle.style.color = "red";
        upalltoggle.innerText = "OFF";
    }
})
document.getElementsByClassName("0i4")[0].addEventListener('click', function() {
    AHRC = !AHRC;
    let ahrctoggle = document.getElementById('ahrctoggle');
    if (AHRC) {
        ahrctoggle.style.color = "green";
        ahrctoggle.innerText = "ON";
    } else {
        ahrctoggle.style.color = "red";
        ahrctoggle.innerText = "OFF";
    }
})
document.getElementsByClassName("1i4")[0].addEventListener('click', function() {
    window.frss = !window.frss;
    let rsstoggle = document.getElementById('exactrsstoggle');
    if (window.frss) {
        rsstoggle.style.color = "green";
        rsstoggle.innerText = "ON";
    } else {
        rsstoggle.style.color = "red";
        rsstoggle.innerText = "OFF";
    }
})

document.getElementsByClassName("hud-Close-icon")[0].addEventListener("click", function () {
    menu.style.display = "none";
});

var towerCodes = ["Wall", "Door", "SlowTrap", "ArrowTower", "CannonTower", "MeleeTower", "BombTower", "MagicTower", "GoldMine", "Harvester"];

function getGoldStash() {
    return Object.values(Game.currentGame.ui.buildings).find(building => building.type == "GoldStash");
}

window.RecordBase = function() {
    let baseStr = "";
    for (let i in game.ui.buildings) {
        const building = game.ui.buildings[i];
        if (towerCodes.indexOf(building.type) < 0) continue;

        let yaw = 0;

        if (["Harvester", "MeleeTower"].includes(building.type)) {
            if (game.world.entities[building.uid] !== undefined) yaw = game.world.entities[building.uid].targetTick.yaw;
        }
        baseStr += `${towerCodes.indexOf(building.type)},${getGoldStash().x - building.x},${getGoldStash().y - building.y},${yaw};`;
    }
    localStorage.savedBase = baseStr;
    console.log(baseStr);
}
window.buildRecordedBase = function() {
    function BuildBase(design) {
        if (typeof design !== "string") throw new Error("Argument must be given as a string.");
        if (getGoldStash() === undefined) throw new Error("You must have a gold stash to be able to use this.");

        const towers = design.split(";");

        for (let towerStr of towers) {
            const tower = towerStr.split(",");

            if (tower[0] === "") continue;
            if (tower.length < 4) throw new Error(`${JSON.stringify(tower)} contains an issue that must be fixed before this design can be replicated.`);

            Game.currentGame.network.sendRpc({
                name: "MakeBuilding",
                type: towerCodes[parseInt(tower[0])],
                x: getGoldStash().x - parseInt(tower[1]),
                y: getGoldStash().y - parseInt(tower[2]),
                yaw: parseInt(tower[3])
            });
        }
    }
    BuildBase(localStorage.savedBase);
}
window.DeleteRecordedbase = function() {
    Game.currentGame.ui.getComponent("PopupOverlay").showConfirmation("Are you sure you want to delete the recorded base?", 1e4, function() {
        game.ui.components.PopupOverlay.showHint("Recorded base has been successfully deleted!");
        localStorage.savedBase = null;
    })
}

game.network.sendRpc2 = game.network.sendRpc;
const placeWall = (x, y) => {
    game.network.sendRpc2({
        name: 'MakeBuilding',
        x: x,
        y: y,
        type: "Wall",
        yaw: 0
    });
};
game.network.sendRpc = (data) => {
    let gridPos = { x: data.x, y: data.y };
    if(data.name === "MakeBuilding" && data.type === "Wall" && window.x3builds) {
        placeWall(gridPos.x, gridPos.y);
        placeWall(gridPos.x + 48, gridPos.y);
        placeWall(gridPos.x, gridPos.y + 48);
        placeWall(gridPos.x - 48, gridPos.y);
        placeWall(gridPos.x, gridPos.y - 48);
        placeWall(gridPos.x - 48, gridPos.y + 48);
        placeWall(gridPos.x + 48, gridPos.y - 48);
        placeWall(gridPos.x + 48, gridPos.y + 48);
        placeWall(gridPos.x - 48, gridPos.y - 48);
    };
    game.network.sendRpc2(data);
};

let dimension = 1;
let upd = () => {
    const renderer = Game.currentGame.renderer;
    let canvasWidth = window.innerWidth * window.devicePixelRatio;
    let canvasHeight = window.innerHeight * window.devicePixelRatio;
    let ratio = canvasHeight / (1080 * dimension);
    renderer.scale = ratio;
    renderer.entities.setScale(ratio);
    renderer.ui.setScale(ratio);
    renderer.renderer.resize(canvasWidth, canvasHeight);
    renderer.viewport.width = renderer.renderer.width / renderer.scale + 2 * renderer.viewportPadding;
    renderer.viewport.height = renderer.renderer.height / renderer.scale + 2 * renderer.viewportPadding;
};
const onWindowResize = () => {
    if (window.zoomonscroll) {
        upd();
        console.log(dimension);
    }
} // Zoom by Apex, modified by eh
onWindowResize();
window.onresize = onWindowResize;
window.onwheel = e => {
    if (e.deltaY > 0) {
        dimension += 0.02;
    } else if (e.deltaY < 0) {
        dimension -= 0.02;
    }
    onWindowResize();
}
window.zoom = val => {
    dimension = val;
    upd();
};
window.toggleZoS = () => {
    dimension -= 0.02;
    window.zoomonscroll = !window.zoomonscroll;
    let zs = document.getElementById("zsd");
    zs.style.display = zs.style.display == "none" ? "block" : "none";
};
window.zoomOut = () => {
    let zs = document.getElementById("zoomSlider");
    zs.value = parseInt(zs.value) + 1;
};
window.zoomIn = () => {
    let zs = document.getElementById("zoomSlider");
    zs.value = parseInt(zs.value) - 1;
}; // cutdown version of ignition's zoom


// Zombs.io Emoji System + Chat Blocker
// Morpheus_ , ehScripts

const blockedUids = [];

window.blockPlayer = (name, uid) => {
    game.ui.components.PopupOverlay.showConfirmation(`Are you sure you want to block ${window.filterXSS(name)} (${uid})?`, 3500, () => {
        blockedUids.push(uid);
        for (let bl of Array.from(document.getElementsByClassName(`uid${uid}`))) {
            bl.innerHTML = "Unblock";
            bl.style.color = "blue";
            bl.onclick = () => window.unblockPlayer(name, uid);
        };
    }, () => {});
};

window.unblockPlayer = (name, uid) => {
    this.blockedUids.splice(blockedUids.indexOf(uid), 1);
    for (let bl of Array.from(document.getElementsByClassName(`uid${uid}`))) {
        bl.innerHTML = "Block";
        bl.style.color = "red";
        bl.onclick = () => window.blockPlayer(name, uid);
    };
};

const getClock = () => {
    var date = new Date();
    var d = date.getDate();
    var d1 = date.getDay();
    var h = date.getHours();
    var m = date.getMinutes();
    var s = date.getSeconds()
    var session = "PM";

    if(h == 2){
        h = 12;
    };

    if(h < 13) {
        session = "AM"
    };
    if(h > 12){
        session = "PM";
        h -= 12;
    };

    h = (h < 10) ? "0" + h : h;
    m = (m < 10) ? "0" + m : m;
    s = (s < 10) ? "0" + s : s;
    return `${h}:${m} ${session}`;
}

var emojiList = {
    hmm: "https://cdn.discordapp.com/emojis/724365641963929611.png?size=48",
    pog: "https://cdn.discordapp.com/emojis/721070353337811026.png?size=48",
    pepehands: "https://cdn.discordapp.com/emojis/733406770139103293.png?size=48",
    pepeEyes: "https://cdn.discordapp.com/emojis/869573233794486323.gif?size=48",
    pepeHappy: "https://cdn.discordapp.com/emojis/801475958883614811.png?size=48",
    sadge: "https://cdn.discordapp.com/emojis/826530556974989344.png?size=48",
    ha: "https://cdn.discordapp.com/emojis/782756472886525953.png?size=48",
    kekw: "https://cdn.discordapp.com/emojis/748511358076846183.png?size=48",
    pogEyes: "https://cdn.discordapp.com/emojis/786979080406564885.png?size=48",
    appalled: "https://cdn.discordapp.com/emojis/830880294881853530.png?size=48",
    pogYou: "https://cdn.discordapp.com/emojis/790293794716516430.png?size=48",
    pogChag: "https://cdn.discordapp.com/emojis/831156303497134090.png?size=48",
    pogey: "https://cdn.discordapp.com/emojis/790293759861719050.png?size=48",
    weirdChamp: "https://cdn.discordapp.com/emojis/757553915389673502.png?size=48",
    monkaS: "https://cdn.discordapp.com/emojis/757179783573405766.png?size=48",
    yep: "https://cdn.discordapp.com/emojis/758356179477987339.png?size=48",
    whale: "https://media.discordapp.net/attachments/876015747204268033/950597451897770064/1f433.png?width=48&height=48",

    weirdButOkay: "https://cdn.discordapp.com/emojis/831156194247966782.gif?size=48",
    pogpogpogpog: "https://cdn.discordapp.com/emojis/869580566096379974.gif?size=48",
    wooyeah: "https://cdn.discordapp.com/emojis/791008461420888084.gif?size=48",
    idk: "https://cdn.discordapp.com/emojis/882513306164805642.gif?size=48",
    WYSI: "https://cdn.discordapp.com/emojis/816356638767972402.gif?size=48",
}


Game.currentGame.network.emitter.removeListener("PACKET_RPC", Game.currentGame.network.emitter._events.PACKET_RPC[1]);
const onMessageReceived = function(e) {
    if (blockedUids.includes(e.uid) || window.chatDisabled) return;
    let a = Game.currentGame.ui.getComponent("Chat"),
        b = window.filterXSS(e.displayName),
        c = window.filterXSS(e.message)
    .replace(/(?:f|F)uck/gi, `<img src="https://cdn.discordapp.com/emojis/907625398832070667.png?size=80" height="16" width="18" style="margin: 1px 0 0 0;"></img>`)
    .replace(/s[3e]x+/gi, `<img src="https://cdn.discordapp.com/emojis/953759638350872666.gif?size=80&quality=lossless" height="16" width="18" style="margin: 1px 0 0 0;"></img>`)
    .replace(/n+[i1]+gg+[a@]+/i, `<img src="https://cdn.discordapp.com/emojis/902742239996936226.webp?size=80" height="16" width="17" style="margin: 1px 0 0 0;"></img>`);
    let arr = c.split(':');

    for (let i = 1; i < arr.length; i += 2) {
        if (!emojiList[arr[i]]) arr = [c];
        else arr[i] = `<img src="${emojiList[arr[i]]}" height="16" width="18" style="margin: 1px 0 0 0;"></img>`;
    }

    let d = a.ui.createElement(`<div class="hud-chat-message"><a href="javascript:void(0);" style="color: red;margin: 0 5px 0 0;display: inline-block;" class="uid${e.uid}">Block</a><strong> ${b}</strong>: ${arr.join(" ")}<small>${getClock()}</small></div>`);
    d.children[0].onclick = () => window.blockPlayer(b, e.uid);
    a.messagesElem.appendChild(d);
    a.messagesElem.scrollTop = a.messagesElem.scrollHeight;
};
Game.currentGame.network.addRpcHandler("ReceiveChatMessage", onMessageReceived);

let chattoggle = document.getElementById("togglechattoggle");
window.toggleChat = () => {
    window.chatDisabled = !window.chatDisabled;
    let chat = document.getElementsByClassName("hud-chat")[0];
    if (window.chatDisabled) {
        chat.style.display = "none";
        chattoggle.style.color = "green";
        chattoggle.innerText = "ON";
    } else {
        chat.style.display = "block";
        chattoggle.style.color = "red";
        chattoggle.innerText = "OFF";
    };
}; // toggle chat, from ignition

(function() { // modified private parties tab code, except the new tab in the party menu is used differently (not private parties)
    let getElement = (Element) => {
        return document.getElementsByClassName(Element);
    }
    let getId = (Element) => {
        return document.getElementById(Element);
    }
    getElement("hud-party-members")[0].style.display = "block";
    getElement("hud-party-grid")[0].style.display = "none";
    let privateTab2 = document.createElement("a");
    privateTab2.className = "hud-party-tabs-link";
    privateTab2.id = "privateTab2";
    privateTab2.innerHTML = "Share Keys";
    let privateHud2 = document.createElement("div");
    privateHud2.className = "hud-private hud-party-grid";
    privateHud2.id = "privateHud2";
    privateHud2.style = "display: none;";
    getElement("hud-party-tabs")[0].appendChild(privateTab2);
    getElement("hud-menu hud-menu-party")[0].insertBefore(privateHud2, getElement("hud-party-actions")[0]);
    getId("privateTab2").onclick = e => {
        for (let i = 0; i < getElement("hud-party-tabs-link").length; i++) {
            getElement("hud-party-tabs-link")[i].className = "hud-party-tabs-link";
        }
        getId("privateTab2").className = "hud-party-tabs-link is-active";
        getId("privateHud2").setAttribute("style", "display: block;");
        if (getElement("hud-party-members")[0].getAttribute("style") == "display: block;") {
            getElement("hud-party-members")[0].setAttribute("style", "display: none;");
        }
        if (getElement("hud-party-grid")[0].getAttribute("style") == "display: block;") {
            getElement("hud-party-grid")[0].setAttribute("style", "display: none;");
        }
        if (getId("privateHud2").getAttribute("style") == "display: none;") {
            getId("privateHud2").setAttribute("style", "display: block;");
        }
    }

    getElement("hud-party-tabs-link")[0].onmouseup = e => {
        getId("privateHud2").setAttribute("style", "display: none;");
        if (getId("privateTab2").className == "hud-party-tabs-link is-active") {
            getId("privateTab2").className = "hud-party-tabs-link"
        }
    }

    getElement("hud-party-tabs-link")[1].onmouseup = e => {
        getId("privateHud2").setAttribute("style", "display: none;");
        if (getId("privateTab2").className == "hud-party-tabs-link is-active") {
            getId("privateTab2").className = "hud-party-tabs-link"
        }
    }
    getId("privateHud2").innerHTML = `
  <h1>Share Keys</h1>
  `;
    game.network.addRpcHandler("PartyShareKey", function(e) {
        let psk = e.partyShareKey;
        let lnk = `http://zombs.io/#/${game.options.serverId}/${psk}/`;
        getId("privateHud2").innerHTML += `<div style="display:inline-block;margin-right:10px;"><p style="user-select: text;">${psk} <a href="${lnk}" target="_blank" color="purple">[Link]</a></p></div>`
    });
    document.getElementsByClassName("hud-party-actions")[0].insertAdjacentHTML("afterend", `
  <button class="btn btn-theme" style="width: 120px;margin: 10px 0 0 0;" onclick="game.network.sendRpc({ name: 'JoinPartyByShareKey', partyShareKey: document.getElementById('psk').value })">Join Party</button>
  <input id="psk" style="margin: 10px 15px 0 15px;width: 280px;" placeholder="Party share key... (not link!)" value="" class="btn" />
  <button class="btn btn-red" style="width: 120px;margin: 10px 0 0 0;box-shadow: none;" onclick="Game.currentGame.network.sendRpc({name: 'LeaveParty'});">Leave</button>
`);
})(); // modified party tools from ignition

let showpriv = true;
document.getElementsByClassName('hud-party-tabs')[0].insertAdjacentHTML("beforeend", `
    <label class="switch thelabel" class="display:inline-block;" style="width: fit-content;">
        <input type="checkbox" onchange="window.showpriv = !window.showpriv">
        <span class="slider round" style="margin: 0 -70px 0 185px;"></span>
        <small style="margin: 0 0 0 100px">Only Public</small>
    </label>
`);
function checkStatus(party) {
    if (showpriv == true) {
        if(party.isOpen == 1) {
            return '<a style = "color: #00e700;opacity: 0.4;">[Open]<a/>';
        } else if(!party.isOpen == 1) {
            return '<a style = "color:red;opacity: 0.4;">[Private]<a/>';
        }
    } else {
        return '';
    }
};
//
let partyCheck = (all_parties) => {
    document.getElementsByClassName('hud-party-grid')[0].innerHTML = '';

    for (let i in all_parties) {
        let parties = all_parties[i];
        let tab = document.createElement('div');
        tab.classList.add('hud-party-link');
        tab.classList.add('custom-party');
        tab.id = parties.partyId;
        tab.isPublic = parties.isOpen;
        tab.name = parties.partyName;
        tab.members = parties.memberCount;
        tab.innerHTML = `
                <strong>${parties.partyName} ${checkStatus(parties)}<strong/>
                <small>id: ${parties.partyId}</small> <span>${parties.memberCount}/4<span/>
            `;

        if(parties.memberCount == 4) {
            tab.classList.add('is-disabled');
        } else {
            tab.style.display = 'block';
        }
        setTimeout(() => {
            if (parties.partyId == game.ui.playerPartyId) tab.classList.add('is-active');
        }, 1000);
        if (parties.isOpen !== 1 && showpriv == false) {
            tab.style.display = 'none';
        }
        tab.addEventListener('click', function() {
            let isJoining = true;
            if(tab.isPublic == 1 && tab.members < 4) {
                isJoining = true;
                game.network.sendRpc({
                    name: 'JoinParty',
                    partyId: Math.floor(tab.id)
                });
                if(isJoining == true) {
                    document.getElementsByClassName('hud-party-grid')[0].classList.add('is-disabled');
                    document.getElementsByClassName('hud-party-link')[0].classList.add('is-disabled');
                    setTimeout(() => {
                        document.getElementsByClassName('hud-party-grid')[0].classList.remove('is-disabled');
                        document.getElementsByClassName('hud-party-link')[0].classList.remove('is-disabled');
                    }, 27500);
                }
            } else if(!tab.isPublic == 1) {
                isJoining = false;
                game.ui.components.PopupOverlay.showHint("You can't request private parties!");
            }
        });
        document.getElementsByClassName('hud-party-grid')[0].appendChild(tab);
    };
};
game.network.addRpcHandler("SetPartyList", (e) => { partyCheck(e) });
//

const entirePop = document.getElementsByClassName("hud-intro-wrapper")[0].children[1];
const request = new XMLHttpRequest();
request.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        let data = JSON.parse(request.responseText);
        entirePop.innerHTML = `People in game now: ${data.players} - ${(data.players / data.capacity * 100).toFixed(2)}% / ${data.capacity}`;
        let servers = ["US East", "US West", "Europe", "Asia", "Australia", "South America"];
        for (let i in servers) {
            game.ui.components.Intro.serverElem.children[i].setAttribute("label", `${servers[i]}: Population: ${data.regions[servers[i]].players}`);
        }
    }
};
request.open("GET", "http://zombs.io/capacity", true);
request.send(); // server pop by apex

const fullRSS = () => {
    if(!window.frss) { return; };
    let resources = ["wood", "stone", "gold"];
    let pt = game.ui.playerTick;
    let rc = game.ui.components.Resources;
    for(let i = 0; i < resources.length; i++) {
        let rs = resources[i];
        rc[`${rs}Elem`].innerHTML = Math.round(pt[rs]).toLocaleString("en");
    };
    rc.tokensElem.innerHTML = Math.round(pt.token).toLocaleString("en");
};
let sipt = setInterval(() => {
    game.ui.addListener('playerTickUpdate', fullRSS);
}, 50);
setTimeout(() => { clearInterval(sipt); }, 50); // full RSS from ignition, modified to refresh slower

function hexToRgb(hex) {
    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
    if(result){
        var r= parseInt(result[1], 16);
        var g= parseInt(result[2], 16);
        var b= parseInt(result[3], 16);
        return [r, g, b];
    }
    return null;
};

window.randomColor = function() {
    for (let i in game.world.entities) {
        if (game.world.entities[i].entityClass === "PlayerEntity") {
            var hexValue = "1234567890abcdef";
            var hexLength = 6;
            var hex = "";
            for (let i = 0; i < hexLength; i++) hex += hexValue[Math.floor(Math.random() * hexValue.length)];
            let hr = hexToRgb(hex);
            game.world.entities[i].currentModel.nameEntity.setColor(hr[0], hr[1], hr[2]);
        };
    };
};

window.resetColor = function() {
    for (let i in game.world.entities) {
        if (game.world.entities[i].entityClass === "PlayerEntity") {
            game.world.entities[i].currentModel.nameEntity.setColor(220, 220, 220);
        };
    };
};

var isSpamming = 0;
function pauseChatSpam(e) {
    if (!isSpamming) {
        if (e !== "") {
            window.spammer = setInterval(() => {
                game.network.sendRpc({name: "SendChatMessage", channel: "Local", message: e});
            }, 1500);
        } else {
            game.ui.components.PopupOverlay.showHint(`Please enter your message!`);
        };
    } else if (isSpamming) {
        clearInterval(window.spammer);
    };
    isSpamming = !isSpamming;
};
document.querySelector('#togglespmch').addEventListener('click', function () {
    pauseChatSpam(document.querySelector('#spmchinput').value)
    let spamtoggle = document.querySelector('#spamtoggle')
    this.innerText = isSpamming ? "Disable Spam Chat" : "Enable Spam Chat"
    if (isSpamming) {
        this.classList.add("btn-red"); this.classList.remove("btn-theme");
    } else {
        this.classList.add("btn-theme"); this.classList.remove("btn-red");
    };
});

!game.world.removeEntity2 && (game.world.removeEntity2 = game.world.removeEntity);
game.world.removeEntity = (uid) => {
    if (game.world.entities[uid].fromTick.model == "Tree" || game.world.entities[uid].fromTick.model == "Stone" || game.world.entities[uid].fromTick.model == "NeutralCamp") return;
    game.world.removeEntity2(uid);
}

var map = document.getElementById("hud-map");
let markerId = 1;
window.addMarker = () => {
    map.insertAdjacentHTML("beforeend", `<div style="color: red; display: block; left: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.left)}%; top: ${parseInt(game.ui.components.Map.playerElems[game.world.getMyUid()].marker.style.top)}%; position: absolute;" class='hud-map-player'></div>`)
    markerId++;
};

let smm = document.getElementsByClassName("hud-menu-more")[0];
smm.style.overflow = "auto";
window.moreMenu = () => {
    let mm = document.getElementsByClassName("hud-menu-more")[0];
    if(["none", ""].includes(mm.style.display)) {
        mm.style.display = "block";
        for(let i of Array.from(document.getElementsByClassName("hud-menu"))) {
            if(i.classList.contains('hud-menu-more')) { return; };
            i.style.display = "none";
        };
    } else {
        mm.style.display = "none";
    };
};

var hasBeenInWorld = false;
game.network.addEnterWorldHandler(() => {
    if(hasBeenInWorld) { return };
    hasBeenInWorld = true;
    for(let i of Array.from(document.getElementsByClassName("hud-menu-icon"))) {
        if(i.dataset.type !== "More") {
            i.addEventListener('click', function() {
                document.getElementsByClassName("hud-menu-more")[0].style.display = "none";
            });
        };
    };
});

document.getElementsByClassName("1z")[0].addEventListener('click', function() {
    window.ground();
    this.className = "btn btn-theme 1z";
    this.innerText = "Stop Rendering Ground?";
    if (window.groundtoggle) {
        this.className = "btn btn-red 1z";
        this.innerText = "Start Rendering Ground?";
    }
})
document.getElementsByClassName("1z1")[0].addEventListener('click', function() {
    window.grid();
    this.className = "btn btn-green 1z1";
    this.innerText = "Black Ground With Grid?";
    if (window.gridtoggle) {
        this.className = "btn btn-red 1z1";
    }
})
document.getElementsByClassName("2z")[0].addEventListener('click', function() {
    window.npc();
    this.className = "btn btn-theme 2z";
    this.innerText = "Stop Rendering NPCs?";
    if (window.npctoggle) {
        this.className = "btn btn-red 2z";
        this.innerText = "Start Rendering NPCs?";
    }
})
document.getElementsByClassName("3z")[0].addEventListener('click', function() {
    window.env();
    this.className = "btn btn-theme 3z";
    this.innerText = "Stop Rendering Environment?";
    if (window.envtoggle) {
        this.className = "btn btn-red 3z";
        this.innerText = "Start Rendering Enviroment?";
    }
})
document.getElementsByClassName("4z")[0].addEventListener('click', function() {
    window.pjt();
    this.className = "btn btn-theme 4z";
    this.innerText = "Stop Rendering Projectiles?";
    if (window.pjttoggle) {
        this.className = "btn btn-red 4z";
        this.innerText = "Start Rendering Projectiles?";
    }
})
document.getElementsByClassName("5z")[0].addEventListener('click', function() {
    window.everything();
    this.className = "btn btn-theme 5z";
    this.innerText = `Stop Rendering Everything?`;
    if (window.everythingtoggle) {
        this.className = "btn btn-red 5z";
        this.innerText = `Start Rendering Everything?`;
    }
})
document.getElementsByClassName("6z")[0].addEventListener('click', function() {
    window.rndr();
    this.className = "btn btn-theme 6z";
    this.innerText = `Stop Renderer?`;
    if (window.rndrtoggle) {
        this.className = "btn btn-red 6z";
        this.innerText = `Start Renderer?`;
    }
})

window.ground = () => {
    window.groundtoggle = !window.groundtoggle;
    let z1 = document.getElementById('addon')
    let z1button = document.getElementsByClassName("1z1")[0]
    if (window.groundtoggle) {
        game.renderer.ground.setVisible(false)
        z1.style.display = "block";
    } else {
        game.renderer.ground.setVisible(true)
        game.renderer.ground.setAlpha(1)
        z1.style.display = "none";
    }
    if (z1button.classList.contains('btn-red') && z1.style.display === "block") {
        game.renderer.ground.setVisible(true)
        game.renderer.ground.setAlpha(0.25)
    }
}
window.grid = () => {
    window.gridtoggle = !window.gridtoggle;
    if (window.gridtoggle) {
        game.renderer.ground.setVisible(true)
        game.renderer.ground.setAlpha(0.25)
    } else {
        game.renderer.ground.setVisible(false)
    }
}
window.npc = () => {
    window.npctoggle = !window.npctoggle;
    if (window.npctoggle) {
        game.renderer.npcs.setVisible(false)
    } else {
        game.renderer.npcs.setVisible(true)
    }
}
window.env = () => {
    window.envtoggle = !window.envtoggle;
    if (window.envtoggle) {
        game.renderer.scenery.setVisible(false)
    } else {
        game.renderer.scenery.setVisible(true)
    }
}
window.pjt = () => {
    window.pjttoggle = !window.pjttoggle;
    if (window.pjttoggle) {
        game.renderer.projectiles.setVisible(false)
    } else {
        game.renderer.projectiles.setVisible(true)
    }
}
window.everything = () => {
    window.everythingtoggle = !window.everythingtoggle;
    if (window.everythingtoggle) {
        game.renderer.scene.setVisible(false)
    } else {
        game.renderer.scene.setVisible(true)
    }
}
window.rndr = () => {
    window.rndrtoggle = !window.rndrtoggle;
    if (window.rndrtoggle) {
        game.stop();
    } else {
        game.start();
    }
}
document.getElementsByClassName('hud')[0].addEventListener('mousedown', e => {
    if (!e.button) {
        game.network.sendPacket(3, {
            mouseDown: game.inputPacketCreator.screenToYaw(e.clientX, e.clientY)
        })
    }
    smm.style.display = "none";
})

window.addName = name => {
    let id = `username${Math.floor(Math.random() * 9999)}`;
    localStorage.usernames = `${localStorage.usernames || ""}<div id="${id}"><button onclick="document.querySelector('.hud-intro-name').value = \`${name.replaceAll('`', '\`')}\`" class="btn btn-theme">${name}</button>`;
};
(window.refreshNS = () => {
    let guide2 = document.getElementsByClassName("hud-intro-name-save")[0];
    guide2.innerHTML = `
<div>
${localStorage.usernames || "<h2>No saved names... sad.<h2>"}
<br />
</div>
<hr />
<input type="text" class="search-bar" style="width:135px;" id="inpn" /><button class="btn-fixed btn-theme" onclick="window.addName(document.getElementById('inpn').value); window.refreshNS();">Add name</button>
`;
})();

window.ssMode = () => {
    window.ssModeToggle = !window.ssModeToggle;
    var mba = document.querySelectorAll([".hud-bottom-right", ".hud-bottom-left", ".hud-bottom-center", ".hud-center-left", ".hud-center-right", ".hud-chat", ".hud-chat-messages", ".hud-top-right", ".refrsh"]);
    for(let mb of mba) {
        if (mb.style.display === "none") {
            mb.style.display = "block";
        } else {
            mb.style.display = "none";
        }
    };
    document.querySelector(".hud-bottom-right").appendChild(document.querySelector("#hud-shield-bar"));
    document.querySelector(".hud-bottom-right").appendChild(document.querySelector("#hud-health-bar"));
    document.querySelector(".hud-bottom-right").insertAdjacentElement("afterbegin", document.querySelector("#hud-party-icons"));

    document.querySelector(".hud-bottom-left").insertAdjacentElement("afterbegin", document.querySelector("#hud-day-night-ticker"));
    document.querySelector(".hud-bottom-left").insertAdjacentElement("afterbegin", xyshow);
    // original screenshot mode code by deathrain, modified by eh
};

/* keybinds */
document.addEventListener('keyup', function (e) {
    if (e.key === "Enter" && game.ui.playerTick.dead === 1) {
        game.ui.components.Chat.startTyping();
    };
    if (e.key === "`") {
        window.addMarker();
        game.ui.components.PopupOverlay.showHint(`Added Marker #${markerId-1}`);
    };
});

document.addEventListener("keydown", e => {
    if (document.activeElement.tagName.toLowerCase() !== "input" && document.activeElement.tagName.toLowerCase() !== "textarea") {
        if (e.keyCode == 189) { // key -
            getRss = !getRss;
        };
        if (e.key === "!") {
            window.x3builds = !window.x3builds;
            game.ui.components.PopupOverlay.showHint("Toggled 3x3 Block.");
        };
        if (e.key === "=") {
            document.getElementsByClassName("1i4")[0].click();
            game.ui.components.PopupOverlay.showHint("Toggled Full RSS.");
        };
        if (e.key === "g") {
            document.getElementsByClassName("0i3")[0].click();
            game.ui.components.PopupOverlay.showHint("Toggled Chat.");
        };
        if (e.key === " " && game.ui.playerTick.weaponName === 'Bow') {
            autobow = true;
        };
        if (game.ui.playerTick.weaponName !== 'Bow') {
            autobow = false;
        };
        if (e.key === "x") {
            modm();
        };
        if (e.key === "?") {
            window.ssMode();
        };
    };
});