// ==UserScript==
// @name Free Custom Surviv.io Skins and Mods (FREE SURVIV GOLD PASS #8 )
// @namespace https://github.com/notKaiAnderson/
// @version 1.3.4
// @description a free and purely cosmetic script that lets you use custom skins during games, it even lets you make your own skins!
// @author preacher
// @match *://surviv.io/*
// @match *://surviv2.io/*
// @match *://2dbattleroyale.com/*
// @match *://2dbattleroyale.org/*
// @match *://piearesquared.info/*
// @match *://thecircleisclosing.com/*
// @match *://archimedesofsyracuse.info/*
// @match *://secantsecant.com/*
// @match *://parmainitiative.com/*
// @match *://nevelskoygroup.com/*
// @match *://kugahi.com/*
// @match *://chandlertallowmd.com/*
// @match *://ot38.club/*
// @match *://kugaheavyindustry.com/*
// @match *://drchandlertallow.com/*
// @match *://rarepotato.com/*
// @grant none
// @icon https://i.imgur.com/jgHdTYA.png
// @run-at document-end
// @license MIT
// ==/UserScript==
/*** contributors
* garlic
* preacher
* and thanks to Michal2SAB for the webpack inject code
***/
//*************** Michal2SAB's code
let webpackR = undefined;
const func = {webpack_inject: (w, e, get) => {webpackR = get.bind(this)}};
if (typeof webpackJsonp === 'function') webpackJsonp([0], func, ["webpack_inject"])
else webpackJsonp.push([["webpack_inject"],func,[["webpack_inject"]]]);
//*************** don't edit code above ^
// make console.log() work
console.log = console.info;
// global declarartion
const skins = webpackR("63d67e9d");
const hands = webpackR("ccb6ad93");
const guns = webpackR("ad1c4e70");
// utils
const getEle = selector => document.querySelector(selector);
const getAllEle = selector => document.querySelectorAll(selector);
const removeBorder = () => getAllEle(".active").forEach(i => i.classList.remove("active"));
const addBorder = id => getEle(`#${id}`).classList.add('active')
const injectCss = css => document.head.innerHTML += `<style>${css}</style>`;
const imgToUrl = (type, img) => `https://surviv.io/img/${type}/${img.slice(0, -4)}.svg`;
const backUpDeafultSkin = () => skins.defaultSkin = {...skins.outfitBase};
// if you want to add a skin to the script add it below
const skinsArr = ["defaultSkin", "outfitDragonTails", "outfitCosmicBlue", "outfitJuleVerny", "outfitNorseCode", "outfitDigiturt", "outfitStreetArt", "outfitGhoulFire", "outfitGaudisque", "outfitMelonWater", "outfitStarryNight", "outfitEyes-T", "outfitBlueZone", "outfitKingGalaxy", "outfitBraaains", "outfitILavaYou", "outfitStumpd","outfitEggnite", "outfitTiki", "outfitMachoLucha2", "outfitCalaca", "outfitTipTheScales", "outfitAvocadoh", "outfitChromesis", "outfitBoet","outfitFireball", "outfitMagmatic", "outfitPurpleMecha", "outfitMecha", "outfitDiamondy", "outfitAstronaut","outfitLasrDisk", "outfitCrusader", "outfitBlueMecha", "outfitSnowman" , "outfitChritstmasTree", "outfitGrinch", "outfitGingerbread", "outfitEventHorizon", "outfitMod", "outfitDev","outfitMojo", "outfitGiraffe", "outfitUrbanCamo", "outfitBlueLava", "outfitMango", "outfitBengal", "outfitUnderbrush", "outfitViper", "outfitGeometric", "outfitMilitary", "outfitClaymore", "outfitSunset", "outfitSplotchfest", "outfitRedLeader"];
const handsArr = [];
// add all the availaible surviv hand skins to handsArr
for (key in hands) {
if(key.includes('fist_')) handsArr.push(key);
}
const gunsArr = {
weaponSkinMilitary: {
name: 'weaponSkinMilitary',
long: "https://surviv.io/img/guns/gun-long-02.svg",
med: "https://surviv.io/img/guns/gun-med-02.svg",
short: "https://surviv.io/img/guns/gun-short-02.svg",
},
weaponSkinAquatic: {
name: 'weaponSkinAquatic',
long: "https://surviv.io/img/guns/gun-long-03.svg",
med: "https://surviv.io/img/guns/gun-med-03.svg",
short: "https://surviv.io/img/guns/gun-short-03.svg"
},
weaponSkinSand: {
name: 'weaponSkinSand',
long: "https://surviv.io/img/guns/gun-long-04.svg",
med: "https://surviv.io/img/guns/gun-med-04.svg",
short: "https://surviv.io/img/guns/gun-short-04.svg",
},
}
// _SKIN and _Hand must be a String
// ex: skins["outfitFireball"]
window.assignSkin = _SKIN => {
if(!skins[_SKIN]) return;
skins.outfitBase.accessory = {}
skins.outfitBase.accessory.sprite = "";
Object.assign(skins.outfitBase, skins[_SKIN]);
removeBorder();
addBorder(_SKIN);
}
window.assignHand = _HAND => {
if(!hands[_HAND]) return;
hands.fists.handSprites = {};
hands.fists.handSprites.spriteL = ""
hands.fists.handSprites.spriteR = ""
Object.assign(hands.fists, hands[_HAND]);
removeBorder();
addBorder(_HAND);
}
window.assignGuns = _GUNSKIN => {
// guns = webpackR("ad1c4e70");
// loop through all the guns and change their skins
Object.values(guns).forEach(gun => {
switch(gun.worldImg.sprite) {
case 'gun-short-01.img':
gun.worldImg.sprite = gunsArr[_GUNSKIN].short
break;
case 'gun-med-01.img':
gun.worldImg.sprite = gunsArr[_GUNSKIN].med
break;
case 'gun-long-01.img':
gun.worldImg.sprite = gunsArr[_GUNSKIN].long
break;
};
if (gun.worldImg.tint != 16777215) gun.worldImg.tint = 16777215;
})
removeBorder();
addBorder(_GUNSKIN);
}
const css = `.active { color: green; border: 2px solid #668e38;} .content, .pass-body-container {display: none;}; .skin-name {margin: 10px;} .tab {display: flex !important;} .active-tab {display: block !important} .contents {display: flex; flex-direction: column; width: 100%; overflow-y: scroll; height: 100%;text-align: center; box-sizing: border-box;} .container {width: 100%; flex: 1 0 auto;} .skins, .fists, .guns, .crates {display: flex; box-sizing: border-box; flex-wrap: wrap} .trees img {max-height: auto; max-width: 100%} .maps {display: flex; box-sizing: border-box; flex-wrap: wrap} .skin-item, .map-item {flex-grow: 1; flex-basis: 25%; position: relative; cursor: pointer; box-sizing: border-box; padding: 10px 0;} .tabs {display: flex !important;} .tab {display: inline-block !important; flex-grow: 1; padding: 10px; background: rgba(0, 0, 0, 0.28); cursor: pointer; border-right: 1px solid #ddd; border-bottom: 1px solid #ddd;} #start-menu {padding: 0;} #social-share-block-wrapper {display: none;} .tab.active-tab {background: #000;} .footer {background-color: #000; padding: 10px; border-top: 1px solid #ddd; flex-shrink: 0;} .footer p {margin:0; text-align: center;} .tab.icon { padding: 0; display: flex !important; justify-content: center; align-items: center;} .svg-icon { width: 1.5em; height: 1.5em; } .svg-icon path, .svg-icon polygon, .svg-icon rect { fill: #ffffff; } .svg-icon circle { stroke: #ffffff; stroke-width: 1;} .container.set .modal-settings-item {padding: 10px 0; } .btn-custom {-webkit-animation-name:custom-pulse;-webkit-animation-duration:5s;border-bottom:4px solid #00448a}@-webkit-keyframes custom-pulse{from{background-color:#8a9e69;border-bottom-color:#8a9e69;-webkit-box-shadow:0 0 9px #8a9e69}25%{background-color:#318585;border-bottom-color:#208686;-webkit-box-shadow:0 0 18px #318585}75%{background-color:#675fe0;border-bottom-color:#312b8a;-webkit-box-shadow:0 0 18px #675fe0}to{background-color:#8a9e69;border-bottom-color:#8a9e69;-webkit-box-shadow:0 0 9px #8a9e69}}#deleteSkinItem { position: absolute; right: 2px;} .btn-submit { margin-left: 10px; padding: 5px 10px; font-size: 1.3rem; background: #191616; color: #fff; border: solid 1px #fff; border-radius: 4px;} #addSkinName { font-size: 1.5rem;} .custom-wrapper-random { width: 753.89px; height: 415.06px; border-radius: 10.27px; box-sizing: border-box; max-height: unset; display: -webkit-box; display: flex;} #start-menu {padding: 0 !important;} .disable-the-script { position: absolute; bottom: -10%; text-align: center; background: #000; width: 100%; } #start-menu { position: relative; }`
injectCss(css);
loadMainScript();
function loadMainScript() {
backUpDeafultSkin();
const passBody = getEle('.pass-body-container');
const disableScripthtml = `
<div class="disable-the-script">
<label>Disable the script</label>
<input type="checkbox" id="disableTheScript">
</div>`;
const startMenuEle = getEle("#start-menu");
startMenuEle.insertAdjacentHTML("afterend", disableScripthtml);
const customSkinsWrapperHtml = `<div class="custom-wrapper-random">)</div>`;
startMenuEle.insertAdjacentHTML("beforeend", customSkinsWrapperHtml);
getEle(".custom-wrapper-random").innerHTML = `
<div class="contents">
<div class="tabs">
<div class="tab" style="flex-basis: 80%;">Select Skins</div>
<div class="tab" style="flex-basis: 80%;">Select Fists</div>
<div class="tab" style="flex-basis: 80%;">Select Guns</div>
<div class="tab" style="flex-basis: 80%;">Settings</div>
</div>
<div class="container content">
<div class="skins"></div>
</div>
<div class="container content">
<div class="fists"></div>
</div>
<div class="container content">
<div class="guns"></div>
</div>
<div class="container content">
<div class="settings">
<div style="padding: 1em">
<span>disable the endgame screen: </span>
<input type="checkbox" id="disableTheEndGameScreen">
</div>
</div>
</div>
<div class="footer">
<p>
report bugs on
<a href="https://discord.gg/WjXgrGa" target="_blank">Discord</a> 🐓
</p>
</div>
</div>`;
// disable the script
getEle('#disableTheScript').addEventListener('click',(e) => {
if (e.target.checked){
passBody.style.display = "block";
customWrapperEle.style.display = "none";
} else if (!e.target.checked) {
passBody.style.display = "none";
customWrapperEle.style.display = "block";
}
})
// Tabs
const tabLinks = getAllEle(".tab");
const tabContents = getAllEle(".content");
tabLinks[0].classList.add("active-tab");
tabContents[0].classList.add("active-tab");
tabLinks.forEach((tabLink, i) => {
tabLink.addEventListener("click", () => {
tabLinks.forEach((tabLink) => tabLink.classList.remove("active-tab"));
tabContents.forEach((tabContent) =>
tabContent.classList.remove("active-tab")
);
tabLink.classList.add("active-tab");
tabContents[i].classList.add("active-tab");
});
});
generateHtml();
}
getEle('#disableTheEndGameScreen').addEventListener('change', (e) => {
if (e.target.checked){
// if checked add code to hide end screen here
} else if(!e.target.checked) {
// if not show end screen
}
})
function generateHtml() {
const generateSkinTemplate = (arr, obj, func) => {
const isGunSkins = arr.constructor == Object;
let html = "";
Object.values(arr).forEach(i => {
let htmlMockup = `
<div class="skin-item" id="${isGunSkins ? i.name : i}" onclick="${func}('${isGunSkins ? i.name : i}')">
<img src="${isGunSkins ? i.long :imgToUrl('loot', obj[i].lootImg.sprite)}" class="skin-img" />
<h4 class="skin-name">${isGunSkins ? i.name : obj[i].name}</h4>
</div>`
html += htmlMockup;
});
return html;
}
getEle(".skins").innerHTML = generateSkinTemplate(skinsArr, skins, 'assignSkin');
getEle(".fists").innerHTML = generateSkinTemplate(handsArr, hands, 'assignHand');
getEle(".guns").innerHTML = generateSkinTemplate(gunsArr, null, 'assignGuns');
}
// make variables accessible in the console
window.public = {skins, hands, guns, skinsArr, handsArr, gunsArr}