commit 94b4e61228399abed3ed73c2c71817d7d82ef5ec Author: Ereshkigal Date: Fri May 28 17:19:31 2021 +0200 2.2.0 upload diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c59e5c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +ZEreshkigal-AllinOneMod-1.10.0.zip +ZEreshkigal-AllinOneMod/obfuscating.bat +ZEreshkigal-AllinOneMod/package.js diff --git a/Documentation_AIO.docx b/Documentation_AIO.docx new file mode 100644 index 0000000..f669bbe Binary files /dev/null and b/Documentation_AIO.docx differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d5136e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +Copyright (c) 2020 Ereshkigal. All rights reserved. + +Developed by: SPT-Aki + Ereshkigal + www.sp-tarkov.com + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal with the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + +* Neither the names of Ereshkigal, SPT-Aki nor the names of its + contributors may be used to endorse or promote products derived from + this Software without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c6ffca --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +### This mod is designated for SPT-Aki R4 only, dont use it for lower versions. +## What this mod do ? +This mod is merging these following mods into one mod that you can configure: + +* AllItemExamined +* NoItemWeight +* IncreasedAmmoStack +* Instant Hideout crafting +* Instant hideout construction +* Instant scav case +* Cheaper scav case +* EquipRigsWithArmor +* IncreasedMoneyStack +* AllQuestAvailable +* UnlimitedStamina +* Disable SkillFatigue +* Change maximum stamina +* Remove scav timer +* Change maps loot multipliers +* Change Therapist healing price rate +* Change flea market lvl +* Change skill progression rate +* All clothing free +* All clothing cross-side +* Extended raid time +* Remove inraid restrictions +* Change insurances times + +and more i'm forgetting (check the config file for all the features) + +This mod let you choose which of these mod goal you want to apply, in short you can: + +* *Activate AllItemsExamined with IncreasedAmmoStack +* *Activate only NoItemWeight +* *Activate all the three mods + +**Without conflicting each other.** + +## Find informations and support about Ereshkigal's mods at: +https://www.guilded.gg/ereshkigalmods/ + +## Get updated on lastest updates about Ereshkigal's mods: +https://www.guilded.gg/ereshkigalmods/blog/Mods-announcements/ +https://www.guilded.gg/ereshkigalmods/blog/Previews/ + +## Credits to: +* Ereshkigal +* SolidJuho +* GGaulin diff --git a/ZEreshkigal-AllinOneMod/1Please read the following file.txt b/ZEreshkigal-AllinOneMod/1Please read the following file.txt new file mode 100644 index 0000000..e69de29 diff --git a/ZEreshkigal-AllinOneMod/2readme.pdf b/ZEreshkigal-AllinOneMod/2readme.pdf new file mode 100644 index 0000000..3ea3943 Binary files /dev/null and b/ZEreshkigal-AllinOneMod/2readme.pdf differ diff --git a/ZEreshkigal-AllinOneMod/3Come on have you read it... Pleeeeease.txt b/ZEreshkigal-AllinOneMod/3Come on have you read it... Pleeeeease.txt new file mode 100644 index 0000000..e69de29 diff --git a/ZEreshkigal-AllinOneMod/LICENSE b/ZEreshkigal-AllinOneMod/LICENSE new file mode 100644 index 0000000..d5136e1 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/LICENSE @@ -0,0 +1,32 @@ +Copyright (c) 2020 Ereshkigal. All rights reserved. + +Developed by: SPT-Aki + Ereshkigal + www.sp-tarkov.com + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation files +(the "Software"), to deal with the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + +* Neither the names of Ereshkigal, SPT-Aki nor the names of its + contributors may be used to endorse or promote products derived from + this Software without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH +THE SOFTWARE. \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/README.md b/ZEreshkigal-AllinOneMod/README.md new file mode 100644 index 0000000..bb75762 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/README.md @@ -0,0 +1,12 @@ +## Find informations and support about Ereshkigal's mods at: +https://www.guilded.gg/ereshkigalmods/ + +## Get updated on lastest updates about Ereshkigal's mods: +https://www.guilded.gg/ereshkigalmods/blog/Mods-announcements/ +https://www.guilded.gg/ereshkigalmods/blog/Previews/ + +## Credits to: +* Ereshkigal +* SolidJuho +* GGaulin +* jdpeckham \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/config/config.json b/ZEreshkigal-AllinOneMod/config/config.json new file mode 100644 index 0000000..c36b677 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/config/config.json @@ -0,0 +1,112 @@ +{ + "Explanation": { + "############## PLEASE READ THE README.PDF OF THE MOD BEFORE EDITING BELOW VALUES. ######################": "///" + }, + "items": { + "AllExaminedItems": false, + "WeightOptions": false, + "WeightChanger": 0, + "MoreStack": false, + "EquipRigsWithArmors": false, + "ForceMoneyStack": false, + "RemoveSecureContainerFilters": false, + "RemoveBackpacksRestrictions": false, + "RemoveContainersRestrictions": false, + "InRaidModdable": false, + "IncreaseLootExp": false, + "IncreaseExamineExp": false, + "RemoveKeysUsageNumber": false, + "StackableBarters": false, + "RemoveAllGearPenalties": false, + "ChangeIndividualItemProperty": { + "activated": false, + "ItemList": { + "__REPLACEMEBYITEMID__": { + "SpawnChance": 0 + } + } + } + }, + "hideout": { + "ChangeFuelConsumptionRate": false, + "FastHideoutConstruction": false, + "FastHideoutProduction": false, + "FastScavCase": false, + "ScavCasePriceReducer": false, + "RemoveConstructionsRequirements": false + }, + "player": { + "RemoveScavTimer": false, + "ChangeSkillProgressionMultiplier": false, + "ChangeWeaponSkillMultiplier": false, + "DisableSkillFatigue": false, + "SkillMinEffectiveness": 0.2, + "SkillFatiguePerPoint": 0.2, + "SkillFreshEffectiveness": 1.3, + "SkillFreshPoints": 1, + "SkillPointsBeforeFatigue": 1, + "SkillFatigueReset": 300, + "ChangeMaxStamina": false, + "UnlimitedStamina": false, + "RemoveInRaidsRestrictions": false, + "DisableFallDamage": false, + "AllSkillsMaster": false, + "EnableSkillBotReload": false, + "EnableSkillBotSound": false + }, + "traders": { + "AllQuestsAvailable": false, + "AllClothesFree": false, + "AllClotheForEverySide": false, + "ChangeFleaMarketLvl": false, + "InsuranceTime": { + "activated": false, + "Therapist": { + "activated": false, + "min": 0, + "max": 0 + }, + "Prapor": { + "activated": false, + "min": 0, + "max": 0 + } + }, + "MaxInsuranceStorageTime": false, + "AllTraders4Stars": false, + "Remove FIR condition on quests": false + }, + "raids": { + "Change Map Loot Spawn Chances": false, + "Map Loot Spawn Chances Multipliers": { + "globalsMul": 1.3, + "bigmap": 1, + "factory4_day": 1, + "factory4_night": 1, + "interchange": 1, + "laboratory": 1, + "shoreline": 1, + "woods": 1, + "reserve": 1 + }, + "NoExtractsRestrictions": false, + "AllExtractionsAvailable": false, + "IncreasedBossChance": false, + "ExtendedRaid": false, + "RemoveLabKeycard": false, + "ExtractionsExtended": false + }, + "other": { + "CompatibilityMods": { + "CardGameMod": false, + "TerragroupSpecialist": false, + "CoD MW - Mil-Sim: CTSFO I": false, + "Additionnal Gear - Tan": false, + "Additionnal Gear - Black": false, + "Additionnal Gear - Untar": false, + "Additionnal Clothing": false, + "Andrudis Quest Maniac": false + }, + "HideWarningMessage": false + } +} \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/config/errors.json b/ZEreshkigal-AllinOneMod/config/errors.json new file mode 100644 index 0000000..7a4a9f8 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/config/errors.json @@ -0,0 +1,104 @@ +{ + "items": { + "AllExaminedItems": "AllExaminedItems option is incorrect, it must be a bool as value (true or false). You actual value isn't one of these. Please check back readme.pdf to ensure you use the correct value.", + "WeightOptions": "WeightOptions option is incorrect, it must be one the following options: \"Forced\",\"Perc\",\"Mult\" or false. Check back readme.pdf to ensure you use the correct value.", + "WeightChanger": "WeightChanger option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "MoreStack": "MoreStack option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "EquipRigsWithArmors": "EquipRigsWithArmors option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ForceMoneyStack": "ForceMoneyStack option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "RemoveSecureContainerFilters": "RemoveSecureContainerFilters option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveBackpacksRestrictions": "RemoveBackpacksRestrictions option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveContainersRestrictions": "RemoveContainersRestrictions option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "InRaidModdable": "InRaidModdable option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "IncreaseLootExp": "IncreaseLootExp option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "IncreaseExamineExp": "IncreaseExamineExp option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "RemoveKeysUsageNumber": "RemoveKeysUsageNumber option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "StackableBarters": "StackableBarters option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveAllGearPenalties": "RemoveAllGearPenalties option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ChangeIndividualItemProperty": { + "activated": "ChangeIndividualItemProperty[activated] option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value." + } + }, + "hideout": { + "ChangeFuelConsumptionRate": "ChangeFuelConsumptionRate option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "FastHideoutConstruction": "FastHideoutConstruction option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "FastHideoutProduction": "FastHideoutProduction option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "FastScavCase": "FastScavCase option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ScavCasePriceReducer": "ScavCasePriceReducer option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveConstructionsRequirements": "RemoveConstructionsRequirements option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value." + }, + "player": { + "RemoveScavTimer": "RemoveScavTimer option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ChangeSkillProgressionMultiplier": "ChangeSkillProgressionMultiplier option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "ChangeWeaponSkillMultiplier": "ChangeWeaponSkillMultiplier option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "DisableSkillFatigue": "DisableSkillFatigue option is incorrect, it must be the following values: Either true or \"Custom\". Check back readme.pdf to ensure you use the correct value.", + "SkillMinEffectiveness": "SkillMinEffectiveness option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "SkillFatiguePerPoint": "SkillFatiguePerPoint option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "SkillFreshEffectiveness": "SkillFreshEffectiveness option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "SkillFreshPoints": "SkillFreshPoints option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "SkillPointsBeforeFatigue": "SkillPointsBeforeFatigue option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "SkillFatigueReset": "SkillFatigueReset option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "ChangeMaxStamina": "ChangeMaxStamina option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "UnlimitedStamina": "UnlimitedStamina option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveInRaidsRestrictions": "RemoveInRaidsRestrictions option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "AllSkillsMaster": "AllSkillsMaster option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "EnableSkillBotReload": "EnableSkillBotReload option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "EnableSkillBotSound": "EnableSkillBotSound option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "DisableFallDamage": "DisableFallDamage option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value." + }, + "traders": { + "AllQuestsAvailable": "AllQuestsAvailable option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "AllClothesFree": "AllClothesFree option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "AllClotheForEverySide": "AllClotheForEverySide option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ChangeFleaMarketLvl": "ChangeFleaMarketLvl option is incorrect, it must be either false or a number in order to work. Check back readme.pdf to ensure you use the correct value.", + "InsuranceTime": { + "activated": "InsuranceTime[activated] option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "Therapist": { + "activated": "InsuranceTime[Therapist][activated] option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "min": 0, + "max": 0 + }, + "Prapor": { + "activated": "InsuranceTime[Prapor][activated] option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "min": 0, + "max": 0 + } + }, + "MaxInsuranceStorageTime": "WeightChanger option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "AllTraders4Stars": "AllTraders4Stars option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "Remove FIR condition on quests": "Remove FIR condition on quests option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value." + }, + "raids": { + "Change Map Loot Spawn Chances": "Change Map Loot Spawn Chances option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "Map Loot Spawn Chances Multipliers": { + "globalsMul": "globalsMul option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "bigmap": "bigmap option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "factory4_day": "factory4_day option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "factory4_night": "factory4_night option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "interchange": "interchange option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "laboratory": "laboratory option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "shoreline": "shoreline option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "woods": "woods option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value.", + "reserve": "reserve option is incorrect, it must be a number only. You can use - sign to make negatives numbers but nothing else. Check back readme.pdf to ensure you use the correct value." + }, + "NoExtractsRestrictions": "NoExtractsRestrictions option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "AllExtractionsAvailable": "AllExtractionsAvailable option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "IncreasedBossChance": "IncreasedBossChance option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ExtendedRaid": "ExtendedRaid option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "RemoveLabKeycard": "RemoveLabKeycard option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value.", + "ExtractionsExtended": "ExtractionsExtended option is incorrect, it must be a boolean in order to work (true or false). Check back readme.pdf to ensure you use the correct value." + }, + "other": { + "CompatibilityMods": { + "CardGameMod": false, + "TerragroupSpecialist": false, + "CoD MW - Mil-Sim: CTSFO I": false, + "Additionnal Gear - Tan": false, + "Additionnal Gear - Black": false, + "Additionnal Gear - Untar": false, + "Additionnal Clothing": false, + "Andrudis Quest Maniac": false + }, + "HideWarningMessage": false + } +} \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/disclaimer.pdf b/ZEreshkigal-AllinOneMod/disclaimer.pdf new file mode 100644 index 0000000..4ad7dc5 Binary files /dev/null and b/ZEreshkigal-AllinOneMod/disclaimer.pdf differ diff --git a/ZEreshkigal-AllinOneMod/loader.js b/ZEreshkigal-AllinOneMod/loader.js new file mode 100644 index 0000000..4585963 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/loader.js @@ -0,0 +1,4 @@ + + require('bytenode'); + require('./package.jsc'); + \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode new file mode 100644 index 0000000..b695a90 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../bytenode/lib/cli.js" "$@" + ret=$? +else + node "$basedir/../bytenode/lib/cli.js" "$@" + ret=$? +fi +exit $ret diff --git a/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.cmd b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.cmd new file mode 100644 index 0000000..805f5e2 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.cmd @@ -0,0 +1,17 @@ +@ECHO off +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +"%_prog%" "%dp0%\..\bytenode\lib\cli.js" %* +ENDLOCAL +EXIT /b %errorlevel% +:find_dp0 +SET dp0=%~dp0 +EXIT /b diff --git a/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.ps1 b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.ps1 new file mode 100644 index 0000000..9718473 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.ps1 @@ -0,0 +1,18 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + & "$basedir/node$exe" "$basedir/../bytenode/lib/cli.js" $args + $ret=$LASTEXITCODE +} else { + & "node$exe" "$basedir/../bytenode/lib/cli.js" $args + $ret=$LASTEXITCODE +} +exit $ret diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/LICENSE b/ZEreshkigal-AllinOneMod/node_modules/bytenode/LICENSE new file mode 100644 index 0000000..a604c93 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Osama Abbas + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/README.md b/ZEreshkigal-AllinOneMod/node_modules/bytenode/README.md new file mode 100644 index 0000000..b1c530d --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/README.md @@ -0,0 +1,270 @@ +# Bytenode + +A minimalist bytecode compiler for Node.js. + +This tool truly compiles your JavaScript code into `V8` bytecode, so that you can protect your source code. It can be used with Node.js, as well as Electron and NW.js (check `examples/` directory). + +--- + +## Install + +```console +npm install --save bytenode +``` + +Or globally: + +```console +sudo npm install -g bytenode +``` + +--- + +## Known Issues and Limitations + +* In Node 10.x, Bytenode does not work in debug mode. See [#29](https://github.com/OsamaAbbas/bytenode/issues/29). + +* Any code depends on `Function.prototype.toString` function will break, because Bytenode removes the source code from `.jsc` files and puts a dummy code instead. See [#34](https://github.com/OsamaAbbas/bytenode/issues/34). + +* In recent versions of Node, the `--no-flush-bytecode` must be set. Bytenode sets it internally, but if you encounter any issues, try to run Node with that flag: ` $ node --no-flush-bytecode server.js`. See [#41](https://github.com/OsamaAbbas/bytenode/issues/41). + +* Arrow functions (especially Async arrow functions) cause crash in Puppeteer and in Electron apps if used in render processes. See [#106](https://github.com/bytenode/bytenode/issues/106), [#47](https://github.com/OsamaAbbas/bytenode/issues/47). They also cause an issue with the ndb debugger. See [#135](https://github.com/bytenode/bytenode/issues/135). Use the usual async functions instead. + +--- + +## Bytenode CLI + +``` + Usage: bytenode [option] [ FILE... | - ] [arguments] + + Options: + -h, --help show help information. + -v, --version show bytenode version. + + -c, --compile [ FILE... | - ] compile stdin, a file, or a list of files + -n, --no-module compile without producing commonjs module + -e, --electron compile for Electron + + -l, --loader [ FILE | PATTERN ] create a loader file and optionally define + loader filename or pattern using % as filename replacer + defaults to %.loader.js + + Examples: + + $ bytenode -c script.js compile `script.js` to `script.jsc`. + $ bytenode -c server.js app.js + $ bytenode -c src/*.js compile all `.js` files in `src/` directory. + + $ bytenode -c *.js -l %.load.js create `filename.load.js` loader files along side `.jsc` files + + $ bytenode script.jsc [arguments] run `script.jsc` with arguments. + $ bytenode open Node REPL with bytenode pre-loaded. +``` + +Examples: + +* Compile `express-server.js` to `express-server.jsc`. +```console +user@machine:~$ bytenode --compile express-server.js +``` + +* Run your compiled file `express-server.jsc`. +```console +user@machine:~$ bytenode express-server.jsc +Server listening on port 3000 +``` + +* Compile all `.js` files in `./app` directory. +```console +user@machine:~$ bytenode --compile ./app/*.js +``` + +* Compile all `.js` files in your project. +```console +user@machine:~$ bytenode --compile ./**/*.js +``` +Note: you may need to enable `globstar` option in bash (you should add it to `~/.bashrc`): +`shopt -s globstar` + +* Starting from v1.0.0, bytenode can compile from `stdin`. +```console +$ echo 'console.log("Hello");' | bytenode --compile - > hello.jsc +``` + +--- + +## Bytenode API + +```javascript +const bytenode = require('bytenode'); +``` + +--- + +#### bytenode.compileCode(javascriptCode) → {Buffer} + +Generates v8 bytecode buffer. + +- Parameters: + +| Name | Type | Description | +| ---- | ---- | ----------- | +| javascriptCode | string | JavaScript source that will be compiled to bytecode. | + +- Returns: + +{Buffer} The generated bytecode. + +- Example: + +```javascript +let helloWorldBytecode = bytenode.compileCode(`console.log('Hello World!');`); +``` +This `helloWorldBytecode` bytecode can be saved to a file. However, if you want to use your code as a module (i.e. if your file has some `exports`), you have to compile it using `bytenode.compileFile({compileAsModule: true})`, or wrap your code manually, using `Module.wrap()` function. + +--- + +#### bytenode.compileElectronCode(javascriptCode) → {Promise\} + +Asynchronous function which generates v8 bytecode buffer for Electron. + +Same as `bytenode.compileCode()`, but generates bytecode for the version of Electron currently installed in node_modules. + +- Parameters: + +| Name | Type | Description | +| ---- | ---- | ----------- | +| javascriptCode | string | JavaScript source that will be compiled to bytecode. | + +- Returns: + +{Promise\} A Promise which resolves with the generated bytecode. + +- Example: + +```javascript +let helloWorldBytecode = await bytenode.compileElectronCode(`console.log('Hello World!');`); +``` +This `helloWorldBytecode` bytecode can be saved to a file. However, if you want to use your code as a module (i.e. if your file has some `exports`), you have to compile it using `bytenode.compileFile({compileAsModule: true})`, or wrap your code manually, using `Module.wrap()` function. + +--- + +#### bytenode.runBytecode(bytecodeBuffer) → {any} + +Runs v8 bytecode buffer and returns the result. + +- Parameters: + +| Name | Type | Description | +| ---- | ---- | ----------- | +| bytecodeBuffer | Buffer | The buffer object that was created using compileCode function. | + +- Returns: + +{any} The result of the very last statement executed in the script. + +- Example: + +```javascript +bytenode.runBytecode(helloWorldBytecode); +// prints: Hello World! +``` + +--- + +#### bytenode.compileFile(args, output) → {Promise\} + +Asyncrhonous function which compiles JavaScript file to .jsc file. + +- Parameters: + +| Name | Type | Description | +| ---- | ---- | ----------- | +| args | object \| string | | +| args.filename | string | The JavaScript source file that will be compiled. | +| args.compileAsModule | boolean | If true, the output will be a commonjs module. Default: true. | +| args.electron | boolean | If true, the output will be a compiled through Electrong. Default: false. | +| args.output | string | The output filename. Defaults to the same path and name of the original file, but with `.jsc` extension. | +| output | string | The output filename. (Deprecated: use args.output instead) | + +- Returns: + +{Promise\}: A Promise that resolves as the compiled filename. + +- Examples: + +```javascript +let compiledFilename = bytenode.compileFile({ + filename: '/path/to/your/file.js', + output: '/path/to/compiled/file.jsc' // if omitted, it defaults to '/path/to/your/file.jsc' +}); +``` +Previous code will produce a commonjs module that can be required using `require` function. + +```javascript +let compiledFilename = await bytenode.compileFile({ + filename: '/path/to/your/file.js', + output: '/path/to/compiled/file.jsc', + compileAsModule: false +}); +``` +Previous code will produce a direct `.jsc` file, that can be run using `bytenode.runBytecodeFile()` function. It can NOT be required as a module. Please note that `compileAsModule` MUST be `false` in order to turn it off. Any other values (including: `null`, `""`, etc) will be treated as `true`. (It had to be done this way in order to keep the old code valid.) + +--- + +#### bytenode.runBytecodeFile(filename) → {any} + +Runs .jsc file and returns the result. + +- Parameters: + +| Name | Type | +| ---- | ---- | +| filename | string | + +- Returns: + +{any} The result of the very last statement executed in the script. + +- Example: + +```javascript +// test.js +console.log('Hello World!'); +``` + +```javascript +bytenode.runBytecodeFile('/path/to/test.jsc'); +// prints: Hello World! +``` + +--- + +#### require(filename) → {any} + +- Parameters: + +| Name | Type | +| ---- | ---- | +| filename | string | + +- Returns: + +{any} exported module content + +- Example: + +```javascript +let myModule = require('/path/to/your/file.jsc'); +``` +Just like regular `.js` modules. You can also omit the extension `.jsc`. + +`.jsc` file must have been compiled using `bytenode.compileFile()`, or have been wrapped inside `Module.wrap()` function. Otherwise it won't work as a module and it can NOT be required. + +Please note `.jsc` files must run with the same Node.js version that was used to compile it (using same architecture of course). Also, `.jsc` files are CPU-agnostic. However, you should run your tests before and after deployment, because V8 sanity checks include some checks related to CPU supported features, so this may cause errors in some rare cases. + +--- + +## Acknowledgements + +I had the idea of this tool many years ago. However, I finally decided to implement it after seeing this [issue](https://github.com/nodejs/node/issues/11842) by @hashseed. Also, some parts were inspired by [v8-compile-cache](https://github.com/zertosh/v8-compile-cache) by @zertosh. \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/cli.js b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/cli.js new file mode 100644 index 0000000..9f57493 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/cli.js @@ -0,0 +1,157 @@ +#!/usr/bin/env node + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const wrap = require('module').wrap; +const spawnSync = require('child_process').spawnSync; +const bytenode = require('./index.js'); + +const args = process.argv.slice(2); + +if (args.includes('-c')) { + args[args.indexOf('-c')] = '--compile'; +} + +if (args.includes('-o')) { + args[args.indexOf('-o')] = '--out'; +} + +if (args.includes('-h')) { + args[args.indexOf('-h')] = '--help'; +} + +if (args.includes('-v')) { + args[args.indexOf('-v')] = '--version'; +} + +if (args.includes('-n')) { + args[args.indexOf('-n')] = '--no-module'; +} + +if (args.includes('-e')) { + args[args.indexOf('-e')] = '--electron'; +} + +if (args.includes('-l')) { + args[args.indexOf('-l')] = '--loader'; +} + +let loaderFilename; +let createLoader = false; + +if (args.includes('--loader')) { + createLoader = true; + const nextIndex = args.indexOf('--loader') + 1; + const nextItem = args[nextIndex]; + if (nextItem && nextItem[0] !== '-') { + loaderFilename = nextItem; + // remove the loader filename from the args so it + // isn't mistaken for a file to compile + args.splice(nextIndex, 1); + } +} + +if (args.includes('--no-loader')) { + createLoader = false; +} + +const program = { + dirname: __dirname, + filename: __filename, + nodeBin: process.argv[0], + flags: args.filter(arg => arg[0] === '-'), + files: args.filter(arg => arg[0] !== '-' && arg[1] !== '-') +}; + +if (program.flags.includes('--compile')) { + program.files.forEach(async function (filename) { + filename = path.resolve(filename); + + if (fs.existsSync(filename) && fs.statSync(filename).isFile()) { + const compileAsModule = !program.flags.includes('--no-module'); + const electron = program.flags.includes('--electron'); + + try { + await bytenode.compileFile({ filename, compileAsModule, electron, createLoader, loaderFilename }); + } catch (error) { + console.error(error); + } + } else { + console.error(`Error: Cannot find file '${filename}'.`); + } + }); + + if (program.files.length === 0) { + let script = ''; + + process.stdin.setEncoding('utf-8'); + + process.stdin.on('readable', () => { + const data = process.stdin.read(); + if (data !== null) { + script += data; + } + }); + + process.stdin.on('end', () => { + try { + if (program.flags.includes('--no-module')) { + process.stdout.write(bytenode.compileCode(script)); + } else { + process.stdout.write(bytenode.compileCode(wrap(script))); + } + } catch (error) { + console.error(error); + } + }); + } +} else if (program.flags.includes('--help')) { + console.log(` + Usage: bytenode [option] [ FILE... | - ] [arguments] + + Options: + -h, --help show help information. + -v, --version show bytenode version. + + -c, --compile [ FILE... | - ] compile stdin, a file, or a list of files + -n, --no-module compile without producing commonjs module + -e, --electron compile for Electron + + --no-loader do not create a loader file, conflicts with -l + -l, --loader [ FILE | PATTERN ] create a loader file and optionally define + loader filename or pattern using % as filename replacer + defaults to %.loader.js + + Examples: + + $ bytenode -c script.js compile \`script.js\` to \`script.jsc\`. + $ bytenode -c server.js app.js + $ bytenode -c src/*.js compile all \`.js\` files in \`src/\` directory. + + $ bytenode script.jsc [arguments] run \`script.jsc\` with arguments. + $ bytenode open Node REPL with bytenode pre-loaded. + + $ echo 'console.log("Hello");' | bytenode --compile - > hello.jsc + compile from stdin and save to \`hello.jsc\` +`); +} else if (program.flags.includes('--version') && program.flags.length === 1 && program.files.length === 0) { + const pkg = require('../package.json'); + console.log(pkg.name, pkg.version); + console.log('Node', process.versions.node); + if (process.versions.electron) { + console.log('Electron', process.versions.electron); + } +} else { + try { + spawnSync(program.nodeBin, [ + '-r', + path.resolve(__dirname, 'index.js') + ].concat(args), { + stdio: 'inherit' + }); + } catch (error) { + console.error(error); + } +} diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.d.ts b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.d.ts new file mode 100644 index 0000000..4813c4a --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.d.ts @@ -0,0 +1,17 @@ +/// +export declare const compileCode: (javascriptCode: string) => Buffer; +export declare const compileElectronCode: (javascriptCode: string) => Promise; +export declare const runBytecode: (bytecodeBuffer: Buffer) => any; +interface BytenodeOptions { + filename: string; + output?: string; + compileAsModule?: boolean; + electron?: boolean; + createLoader?: boolean; + loaderFilename?: string; +} +export declare const compileFile: (args: BytenodeOptions | string, output?: string | undefined) => Promise; +export declare const runBytecodeFile: (filename: string) => any; +export declare function addLoaderFile(fileToLoad: string, loaderFilename?: string): void; +export declare function loaderCode(targetPath: string): string; +export {}; diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.js b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.js new file mode 100644 index 0000000..76ed918 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/lib/index.js @@ -0,0 +1,343 @@ +'use strict'; + +const fs = require('fs'); +const vm = require('vm'); +const v8 = require('v8'); +const path = require('path'); +const Module = require('module'); +const fork = require('child_process').fork; + +v8.setFlagsFromString('--no-lazy'); + +if (Number.parseInt(process.versions.node, 10) >= 12) { + v8.setFlagsFromString('--no-flush-bytecode'); // Thanks to A-Parser (@a-parser) +} + +const COMPILED_EXTNAME = '.jsc'; + +/** + * Generates v8 bytecode buffer. + * @param {string} javascriptCode JavaScript source that will be compiled to bytecode. + * @returns {Buffer} The generated bytecode. + */ +const compileCode = function (javascriptCode) { + if (typeof javascriptCode !== 'string') { + throw new Error(`javascriptCode must be string. ${typeof javascriptCode} was given.`); + } + + const script = new vm.Script(javascriptCode, { + produceCachedData: true + }); + + const bytecodeBuffer = (script.createCachedData && script.createCachedData.call) + ? script.createCachedData() + : script.cachedData; + + return bytecodeBuffer; +}; + +/** + * This function runs the compileCode() function (above) + * via a child process usine Electron as Node + * @param {string} javascriptCode + * @returns {Promise} - returns a Promise which resolves in the generated bytecode. + */ +const compileElectronCode = function (javascriptCode) { + return new Promise((resolve, reject) => { + let data = Buffer.from([]); + + const electronPath = path.join('node_modules', 'electron', 'cli.js'); + if (!fs.existsSync(electronPath)) { + throw new Error('Electron not installed'); + } + const bytenodePath = path.join(__dirname, 'cli.js'); + + // create a subprocess in which we run Electron as our Node and V8 engine + // running Bytenode to compile our code through stdin/stdout + const proc = fork(electronPath, [bytenodePath, '--compile', '--no-module', '-'], { + env: { ELECTRON_RUN_AS_NODE: '1' }, + stdio: ['pipe', 'pipe', 'pipe', 'ipc'] + }); + + if (proc.stdin) { + proc.stdin.write(javascriptCode); + proc.stdin.end(); + } + + if (proc.stdout) { + proc.stdout.on('data', (chunk) => { + data = Buffer.concat([data, chunk]); + }); + proc.stdout.on('error', (err) => { + console.error(err); + }); + proc.stdout.on('end', () => { + resolve(data); + }); + } + + if (proc.stderr) { + proc.stderr.on('data', (chunk) => { + console.error('Error: ', chunk); + }); + proc.stderr.on('error', (err) => { + console.error('Error: ', err); + }); + } + + proc.addListener('message', (message) => console.log(message)); + proc.addListener('error', err => console.error(err)); + + proc.on('error', (err) => reject(err)); + proc.on('exit', () => { resolve(data); }); + }); +}; + +// TODO: rewrite this function +const fixBytecode = function (bytecodeBuffer) { + if (!Buffer.isBuffer(bytecodeBuffer)) { + throw new Error('bytecodeBuffer must be a buffer object.'); + } + + const dummyBytecode = compileCode('"ಠ_ಠ"'); + + if (process.version.startsWith('v8.8') || process.version.startsWith('v8.9')) { + // Node is v8.8.x or v8.9.x + dummyBytecode.slice(16, 20).copy(bytecodeBuffer, 16); + dummyBytecode.slice(20, 24).copy(bytecodeBuffer, 20); + } else if (process.version.startsWith('v12') || + process.version.startsWith('v13') || + process.version.startsWith('v14') || + process.version.startsWith('v15') || + process.version.startsWith('v16')) { + dummyBytecode.slice(12, 16).copy(bytecodeBuffer, 12); + } else { + dummyBytecode.slice(12, 16).copy(bytecodeBuffer, 12); + dummyBytecode.slice(16, 20).copy(bytecodeBuffer, 16); + } +}; + +// TODO: rewrite this function +const readSourceHash = function (bytecodeBuffer) { + if (!Buffer.isBuffer(bytecodeBuffer)) { + throw new Error('bytecodeBuffer must be a buffer object.'); + } + + if (process.version.startsWith('v8.8') || process.version.startsWith('v8.9')) { + // Node is v8.8.x or v8.9.x + // eslint-disable-next-line no-return-assign + return bytecodeBuffer.slice(12, 16).reduce((sum, number, power) => sum += number * Math.pow(256, power), 0); + } else { + // eslint-disable-next-line no-return-assign + return bytecodeBuffer.slice(8, 12).reduce((sum, number, power) => sum += number * Math.pow(256, power), 0); + } +}; + +/** + * Runs v8 bytecode buffer and returns the result. + * @param {Buffer} bytecodeBuffer The buffer object that was created using compileCode function. + * @returns {any} The result of the very last statement executed in the script. + */ +const runBytecode = function (bytecodeBuffer) { + if (!Buffer.isBuffer(bytecodeBuffer)) { + throw new Error('bytecodeBuffer must be a buffer object.'); + } + + fixBytecode(bytecodeBuffer); + + const length = readSourceHash(bytecodeBuffer); + + let dummyCode = ''; + + if (length > 1) { + dummyCode = '"' + '\u200b'.repeat(length - 2) + '"'; // "\u200b" Zero width space + } + + const script = new vm.Script(dummyCode, { + cachedData: bytecodeBuffer + }); + + if (script.cachedDataRejected) { + throw new Error('Invalid or incompatible cached data (cachedDataRejected)'); + } + + return script.runInThisContext(); +}; + +/** + * Compiles JavaScript file to .jsc file. + * @param {object|string} args + * @param {string} args.filename The JavaScript source file that will be compiled + * @param {boolean} [args.compileAsModule=true] If true, the output will be a commonjs module + * @param {string} [args.output=filename.jsc] The output filename. Defaults to the same path and name of the original file, but with `.jsc` extension. + * @param {boolean} [args.electron=false] If true, compile code for Electron (which needs to be installed) + * @param {boolean} [args.createLoader=false] If true, create a loader file. + * @param {boolean} [args.loaderFilename='%.loader.js'] Filename or pattern for generated loader files. Defaults to originalFilename.loader.js. Use % as a substitute for originalFilename. + * @param {string} [output] The output filename. (Deprecated: use args.output instead) + * @returns {Promise} A Promise which returns the compiled filename + */ +const compileFile = async function (args, output) { + let filename, compileAsModule, electron, createLoader, loaderFilename; + + if (typeof args === 'string') { + filename = args; + compileAsModule = true; + electron = false; + createLoader = false; + } else if (typeof args === 'object') { + filename = args.filename; + compileAsModule = args.compileAsModule !== false; + electron = args.electron; + createLoader = args.createLoader; + loaderFilename = args.loaderFilename; + if (loaderFilename) createLoader = true; + } + + if (typeof filename !== 'string') { + throw new Error(`filename must be a string. ${typeof filename} was given.`); + } + + // @ts-ignore + const compiledFilename = args.output || output || filename.slice(0, -3) + COMPILED_EXTNAME; + + if (typeof compiledFilename !== 'string') { + throw new Error(`output must be a string. ${typeof compiledFilename} was given.`); + } + + const javascriptCode = fs.readFileSync(filename, 'utf-8'); + + let code; + + if (compileAsModule) { + code = Module.wrap(javascriptCode.replace(/^#!.*/, '')); + } else { + code = javascriptCode.replace(/^#!.*/, ''); + } + + let bytecodeBuffer; + + if (electron) { + bytecodeBuffer = await compileElectronCode(code); + } else { + bytecodeBuffer = compileCode(code); + } + + fs.writeFileSync(compiledFilename, bytecodeBuffer); + + if (createLoader) { + addLoaderFile(compiledFilename, loaderFilename); + } + + return compiledFilename; +}; + +/** + * Runs .jsc file and returns the result. + * @param {string} filename + * @returns {any} The result of the very last statement executed in the script. + */ +const runBytecodeFile = function (filename) { + if (typeof filename !== 'string') { + throw new Error(`filename must be a string. ${typeof filename} was given.`); + } + + const bytecodeBuffer = fs.readFileSync(filename); + + return runBytecode(bytecodeBuffer); +}; + +Module._extensions[COMPILED_EXTNAME] = function (fileModule, filename) { + const bytecodeBuffer = fs.readFileSync(filename); + + fixBytecode(bytecodeBuffer); + + const length = readSourceHash(bytecodeBuffer); + + let dummyCode = ''; + + if (length > 1) { + dummyCode = '"' + '\u200b'.repeat(length - 2) + '"'; // "\u200b" Zero width space + } + + const script = new vm.Script(dummyCode, { + filename: filename, + lineOffset: 0, + displayErrors: true, + cachedData: bytecodeBuffer + }); + + if (script.cachedDataRejected) { + throw new Error('Invalid or incompatible cached data (cachedDataRejected)'); + } + + /* + This part is based on: + https://github.com/zertosh/v8-compile-cache/blob/7182bd0e30ab6f6421365cee0a0c4a8679e9eb7c/v8-compile-cache.js#L158-L178 + */ + + function require (id) { + return fileModule.require(id); + } + require.resolve = function (request, options) { + // @ts-ignore + return Module._resolveFilename(request, fileModule, false, options); + }; + if (process.mainModule) { + require.main = process.mainModule; + } + + // @ts-ignore + require.extensions = Module._extensions; + // @ts-ignore + require.cache = Module._cache; + + const compiledWrapper = script.runInThisContext({ + filename: filename, + lineOffset: 0, + columnOffset: 0, + displayErrors: true + }); + + const dirname = path.dirname(filename); + + const args = [fileModule.exports, require, fileModule, filename, dirname, process, global]; + + return compiledWrapper.apply(fileModule.exports, args); +}; + +/** + * Add a loader file for a given .jsc file + * @param {String} fileToLoad path of the .jsc file we're loading + * @param {String} loaderFilename - optional pattern or name of the file to write - defaults to filename.loader.js. Patterns: "%" represents the root name of .jsc file. + */ +const addLoaderFile = function (fileToLoad, loaderFilename) { + let loaderFilePath; + if (typeof loaderFilename === 'boolean' || loaderFilename === undefined || loaderFilename === '') { + loaderFilePath = fileToLoad.replace('.jsc', '.loader.js'); + } else { + loaderFilename = loaderFilename.replace('%', path.parse(fileToLoad).name); + loaderFilePath = path.join(path.dirname(fileToLoad), loaderFilename); + } + const relativePath = path.relative(path.dirname(loaderFilePath), fileToLoad); + const code = loaderCode('./' + relativePath); + fs.writeFileSync(loaderFilePath, code); +}; + +const loaderCode = function (targetPath) { + return ` + require('bytenode'); + require('${targetPath}'); + `; +}; + +global.bytenode = { + compileCode, + compileFile, + compileElectronCode, + runBytecode, + runBytecodeFile, + addLoaderFile, + loaderCode +}; + +module.exports = global.bytenode; diff --git a/ZEreshkigal-AllinOneMod/node_modules/bytenode/package.json b/ZEreshkigal-AllinOneMod/node_modules/bytenode/package.json new file mode 100644 index 0000000..38a8de9 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/node_modules/bytenode/package.json @@ -0,0 +1,66 @@ +{ + "_from": "bytenode", + "_id": "bytenode@1.3.3", + "_inBundle": false, + "_integrity": "sha512-N/d5zwUSsl7WbwY3xVmh8TzDjW4PyVxbb0RQdwc80PKs97a99WVfO+k/dfdG49Xr4NQyab8s6lQJd4tdUo7X1Q==", + "_location": "/bytenode", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "bytenode", + "name": "bytenode", + "escapedName": "bytenode", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/bytenode/-/bytenode-1.3.3.tgz", + "_shasum": "cec8ef591647baa9ba6e8059c29625f95372fcc3", + "_spec": "bytenode", + "_where": "E:\\Github_Repositories\\EreshkigalMods_reworked\\AdvancedBotLoadouts_new\\ZEreshkigal-AdvancedBotLoadouts", + "author": { + "name": "Osama Abbas", + "email": "pw.osama@gmail.com" + }, + "bin": { + "bytenode": "lib/cli.js" + }, + "bugs": { + "url": "https://github.com/bytenode/bytenode/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A minimalist bytecode compiler for Node.js", + "devDependencies": { + "electron": "^12.0.9", + "mocha": "^8.4.0" + }, + "files": [ + "lib" + ], + "homepage": "https://github.com/bytenode/bytenode#readme", + "keywords": [ + "bytenode", + "bytecode", + "v8-snapshots", + "compile", + "compiler" + ], + "license": "MIT", + "main": "lib/index.js", + "name": "bytenode", + "repository": { + "type": "git", + "url": "git+https://github.com/bytenode/bytenode.git" + }, + "scripts": { + "test": "mocha ./test/*.test.js" + }, + "types": "lib/index.d.ts", + "version": "1.3.3" +} diff --git a/ZEreshkigal-AllinOneMod/package.jsc b/ZEreshkigal-AllinOneMod/package.jsc new file mode 100644 index 0000000..bbb7582 Binary files /dev/null and b/ZEreshkigal-AllinOneMod/package.jsc differ diff --git a/ZEreshkigal-AllinOneMod/package.json b/ZEreshkigal-AllinOneMod/package.json new file mode 100644 index 0000000..979e2c7 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/package.json @@ -0,0 +1,10 @@ +{ + "name": "AllinOneMod", + "author": "Ereshkigal", + "version": "2.2.0", + "license": "NCSA Open Source", + "dependencies": { + "CoreMod": "2.0.0" + }, + "main": "loader.js" +} \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/items.js b/ZEreshkigal-AllinOneMod/src/items.js new file mode 100644 index 0000000..9786e7f --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/items.js @@ -0,0 +1,202 @@ +/* +エレシュキガル +*/ + +"use strict"; + +class itemsModification { + + static ApplyItemsModifications() { + const config = require("../config/config.json"); + const database = DatabaseServer.tables; + const items = database.templates.items; + const CoreMod = require("../../CoreMod/src/Core.js") + const OtherModitication = require("./other.js"); + + for (const id in items) { + let base = items[id] + + if (OtherModitication.IsThisIDaMod(id) === false) { + + //Examine all items + if (config.items.AllExaminedItems === true) { + CoreMod.EditSimpleItemData(id, "ExaminedByDefault", true) + } + //Change the weight + + switch (config.items.WeightOptions) { + case "Forced": + if (typeof config.items.WeightChanger === "number") { + //Exclude nodes, inventory and pockets from the weight changer + if (base._type !== "Node" && (base.parent !== "557596e64bdc2dc2118b4571" || base._parent !== "55d720f24bdc2d88028b456d")) { + CoreMod.EditSimpleItemData(id, "Weight", config.items.WeightChanger) + } + } + break; + case "Perc": + if (typeof config.items.WeightChanger === "number") { + //Exclude nodes, inventory and pockets from the weight changer + if (base._type !== "Node" && (base.parent !== "557596e64bdc2dc2118b4571" || base._parent !== "55d720f24bdc2d88028b456d")) { + CoreMod.EditSimpleItemData(id, "Weight", (base._props.Weight + ((config.items.WeightChanger / 100) * base._props.Weight)).toFixed(3)) + } + } + break; + case "Mult": + if (typeof config.items.WeightChanger === "number") { + //Exclude nodes, inventory and pockets from the weight changer + if (base._type !== "Node" && (base.parent !== "557596e64bdc2dc2118b4571" || base._parent !== "55d720f24bdc2d88028b456d")) { + CoreMod.EditSimpleItemData(id, "Weight", (base._props.Weight * config.items.WeightChanger)) + } + } + break; + } + + if (config.items.RemoveAllGearPenalties === true) { + if (base._props.mousePenalty) { + CoreMod.EditSimpleItemData(id, "mousePenalty", 0) + } + if (base._props.weaponErgonomicPenalty) { + CoreMod.EditSimpleItemData(id, "weaponErgonomicPenalty", 0) + } + if (base._props.speedPenaltyPercent) { + CoreMod.EditSimpleItemData(id, "speedPenaltyPercent", 0) + } + } + + if (config.items.StackableBarters === true) { + switch (base._parent) { + case "57864ee62459775490116fc1": // Battery + CoreMod.EditSimpleItemData(id, "StackMaxSize", 5) + break; + case "57864ada245977548638de91": //Building materials + CoreMod.EditSimpleItemData(id, "StackMaxSize", 100) + break; + case "57864a66245977548f04a81f": //Electronics + CoreMod.EditSimpleItemData(id, "StackMaxSize", 150) + break; + case "57864c322459775490116fbf": //Household goods + CoreMod.EditSimpleItemData(id, "StackMaxSize", 50) + break; + case "57864a3d24597754843f8721": // Jewelry + CoreMod.EditSimpleItemData(id, "StackMaxSize", 25) + break; + case "57864c8c245977548867e7f1": //Medical supplies + CoreMod.EditSimpleItemData(id, "StackMaxSize", 65) + break; + case "57864e4c24597754843f8723": //Flammable + CoreMod.EditSimpleItemData(id, "StackMaxSize", 100) + break; + case "57864bb7245977548b3b66c2": //Tools + CoreMod.EditSimpleItemData(id, "StackMaxSize", 120) + break; + case "590c745b86f7743cc433c5f2": //Other + CoreMod.EditSimpleItemData(id, "StackMaxSize", 150) + break; + + } + } + + //Change ammo stacks + if (typeof config.items.MoreStack == "number") { + if (base._name.includes("patron") && !base._name.includes("40x46")) { + CoreMod.EditSimpleItemData(id, "StackMaxSize", config.items.MoreStack) + } + } + + //Change money stacks + if (typeof config.items.ForceMoneyStack == "number" && base._parent === "543be5dd4bdc2deb348b4569") { + CoreMod.EditSimpleItemData(id, "StackMaxSize", config.items.ForceMoneyStack) + } + + //Allow armored rigs with armors + if (config.items.EquipRigsWithArmors === true) { + CoreMod.EditSimpleItemData(id, "BlocksArmorVest", false); + } + + //Remove filters + if (config.items.RemoveSecureContainerFilters === true) { + if (base._parent === "5448bf274bdc2dfc2f8b456a") { + if (base._props.Grids[0]._props.filters !== undefined) { + base._props.Grids[0]._props.filters = []; + } + } + } + if (config.items.RemoveBackpacksRestrictions === true) { + if (base._parent === "5448e53e4bdc2d60728b4567") { + if (base._props.Grids[0]._props.filters !== undefined) { + base._props.Grids[0]._props.filters = []; + } + } + } + if (config.items.RemoveContainersRestrictions === true) { + if (base._parent === "5795f317245977243854e041") { + if (base._props.Grids[0]._props.filters !== undefined) { + base._props.Grids[0]._props.filters = []; + } + } + } + + //Change items experience gain + if (typeof config.items.IncreaseLootExp == "number") { + if (base._props.LootExperience !== undefined) { + let calculation = Math.round((base._props.LootExperience + ((config.items.IncreaseLootExp / 100) * base._props.LootExperience))); + CoreMod.EditSimpleItemData(id, "LootExperience", calculation); + } + } + if (typeof config.items.IncreaseExamineExp == "number") { + if (base._props.ExamineExperience !== undefined) { + + let calculation = Math.round((base._props.ExamineExperience + ((config.items.ExamineExperience / 100) * base._props.ExamineExperience))); + CoreMod.EditSimpleItemData(id, "ExamineExperience", calculation); + } + } + + //Remove the keys usage + if (config.items.RemoveKeysUsageNumber === true) { + if (base._parent === "5c99f98d86f7745c314214b3" || base._parent === "5c164d2286f774194c5e69fa") { + base._props.MaximumNumberOfUsage = 0 + } + } + + //Change weapons parts moddability + if (config.items.InRaidModdable === true) { + if (base._props.RaidModdable) { + CoreMod.EditSimpleItemData(id, "RaidModdable", true); + if (base._props.ToolModdable) { + CoreMod.EditSimpleItemData(id, "ToolModdable", true); + } + } + if (base._props.Slots) { + for (let k in base._props.Slots) { + if (base._props.Slots[k]._required !== "false") { + base._props.Slots[k]._required = false + } + } + } + } + } + + } //End of the loot for items modifications + + //Individual items proprety changes + if (config.items.ChangeIndividualItemProperty.activated === true) { + //Edit item properties + if (config.items.ChangeIndividualItemProperty.ItemList !== {}) { + for (let k in config.items.ChangeIndividualItemProperty.ItemList) { + if (k === "__REPLACEMEBYITEMID__") { + Logger.error("AllinOne Mod: " + k + " : IS NOT AN ITEMID") + } else { + for (let property in config.items.ChangeIndividualItemProperty.ItemList[k]) { + let value = config.items.ChangeIndividualItemProperty.ItemList[k][property] + Logger.log(value) + CoreMod.EditSimpleItemData(k, property, value); + } + } + } + } + } + } + +} + +module.exports = itemsModification; \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/other.js b/ZEreshkigal-AllinOneMod/src/other.js new file mode 100644 index 0000000..9292586 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/other.js @@ -0,0 +1,61 @@ +/* +エレシュキガル +*/ + +"use strict"; + +const DontNukeMyModPlz = [] + +class OtherModifications { + + static ApplyVariousModifications() { + const config = require("../config/config.json"); + if (config.other.CompatibilityMods.CardGameMod === true) { + DontNukeMyModPlz.push("cgm_") + } else if (config.other.CompatibilityMods.TerragroupSpecialist === true) { + DontNukeMyModPlz.push("terragroupSpecialist") + } else if (config.other.CompatibilityMods["CoD MW - Mil-Sim: CTSFO I"] === true) { + DontNukeMyModPlz.push("ctsfo1") + } else if (config.other.CompatibilityMods["Additionnal Gear - Tan"]) { + DontNukeMyModPlz.push("AddGearTan") + } else if (config.other.CompatibilityMods["Additionnal Gear - Black"]) { + DontNukeMyModPlz.push("AddGearBlack") + } else if (config.other.CompatibilityMods["Additionnal Gear - Untar"]) { + DontNukeMyModPlz.push("AddGearUntar") + } else if (config.other.CompatibilityMods["Additionnal Clothing"]) { + DontNukeMyModPlz.push("AdditionalClothing") + } else if (config.other.CompatibilityMods["Andrudis Quest Maniac"]) { + DontNukeMyModPlz.push("Ammo_Proficiency") + } + + } + + static IsThisIDaMod(id) { + if (DontNukeMyModPlz.length > 0) { + for (const mod in DontNukeMyModPlz) { + if (id.includes(DontNukeMyModPlz[mod])) { + return true; + } else { + return false + } + } + } else { + return false + } + } + + static CustomWarning(prefix, text, suffix = "") { + Logger.log("[" + prefix + "]" + text + " " + suffix, "white", "red") + } + + static IsStolenModsLoaded() { + if (ModLoader.onLoad.SVM) { + this.CustomWarning("AIOMod","You have loaded a stolen mod on your server. Please remove SVM from your modlist in order to use this mod.") + return true; + } else { + return false + } + } +} + +module.exports = OtherModifications; \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/player.js b/ZEreshkigal-AllinOneMod/src/player.js new file mode 100644 index 0000000..fa999f6 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/player.js @@ -0,0 +1,122 @@ +/* +エレシュキガル +*/ + +"use strict"; + +class PlayerModifications { + + static ApplyPlayerModifications() { + const config = require("../config/config.json"); + const database = DatabaseServer.tables; + const globals = database.globals.config; + + //Remove scav timer + if (config.player.RemoveScavTimer === true) { + globals.SavagePlayCooldown = 1; + } + + //Change skills progression multiplier + if (config.player.ChangeSkillProgressionMultiplier !== false && typeof config.player.ChangeSkillProgressionMultiplier == "number") { + globals.SkillsSettings.SkillProgressRate = config.player.ChangeSkillProgressionMultiplier; + } + + //Change weapons skill multiplier + if (config.player.ChangeWeaponSkillMultiplier !== false && typeof config.player.ChangeWeaponSkillMultiplier == "number") { + globals.SkillsSettings.WeaponSkillProgressRate = config.player.ChangeWeaponSkillMultiplier; + } + + //Change fleamarket mini level + if (config.traders.ChangeFleaMarketLvl !== false && typeof config.traders.ChangeFleaMarketLvl == "number") { + globals.RagFair.minUserLevel = config.traders.ChangeFleaMarketLvl; + } + + //Change in raids restrictions + if (config.player.RemoveInRaidsRestrictions === true) { + globals.RestrictionsInRaid = [] + } + + //Remove fall damages + if(config.player.DisableFallDamage === true){ + globals.Health.Falling.SafeHeight = 200 + globals.Health.Falling.DamagePerMeter = 0 + } + + //Change staminas (unlimited or no) + if (typeof config.player.ChangeMaxStamina == "number" && config.player.UnlimitedStamina === false) { + globals.Stamina.Capacity = config.player.ChangeMaxStamina + } else if (config.player.ChangeMaxStamina === false && config.player.UnlimitedStamina === true) { + globals.Stamina.Capacity = 500, + globals.Stamina.BaseRestorationRate = 500; + globals.Stamina.StaminaExhaustionCausesJiggle = false; + globals.Stamina.StaminaExhaustionStartsBreathSound = false; + globals.Stamina.StaminaExhaustionRocksCamera = false; + globals.Stamina.SprintDrainRate = 0; + globals.Stamina.JumpConsumption = 0; + globals.Stamina.AimDrainRate = 0; + globals.Stamina.SitToStandConsumption = 0; + } + + if (config.player.DisableSkillFatigue === true) { + globals.SkillMinEffectiveness = 1; + globals.SkillFatiguePerPoint = 0; + globals.SkillFreshEffectiveness = 1.0; + } else if (config.player.DisableSkillFatigue === "Custom") { + Logger.info("AllinOne Mod: DisableSkillFatigue activated on Custom settings"); + Logger.info("AllinOne Mod: Fatigue Settings: MinEffect: " + config.player.SkillMinEffectiveness + " FatiguePerPoint: " + config.player.SkillFatiguePerPoint + " FreshEffect: " + config.player.SkillFreshEffectiveness + " FreshPoints: " + config.player.SkillFreshPoints + " PointsBeforeFatigue: " + config.player.SkillPointsBeforeFatigue + " FatigueResetTime: " + config.player.SkillFatigueReset); + globals.SkillMinEffectiveness = config.player.SkillMinEffectiveness; + globals.SkillFatiguePerPoint = config.player.SkillFatiguePerPoint; + globals.SkillFreshEffectiveness = config.player.SkillFreshEffectiveness; + globals.SkillFreshPoints = config.player.SkillFreshPoints; + globals.SkillPointsBeforeFatigue = config.player.SkillPointsBeforeFatigue; + globals.SkillFatigueReset = config.player.SkillFatigueReset; + } else if (config.player.DisableSkillFatigue !== "Custom" && config.player.DisableSkillFatigue !== false && config.player.DisableSkillFatigue !== true) { + Logger.warning("DisableSkillFatigue variable is incorrect, please read carefully the description") + + } + + function maxSkills(url, info, sessionID) { + const config = require("../config/config.json") + let pmcData = null + + if (sessionID) { + pmcData = ProfileController.getPmcProfile(sessionID); + } + + if (pmcData !== null) { + if (pmcData.Skills.Common.length > 0 && pmcData.Skills.Common !== undefined) { + for (let skills in pmcData.Skills.Common) { + let skill = pmcData.Skills.Common[skills] + switch (skill.Id) { + case "BotReload": + if (config.player.EnableSkillBotReload === true) { + skill.Progress = 5100 + } + break; + case "BotSound": + if (config.player.EnableSkillBotSound === true) { + skill.Progress = 5100 + } + break; + default: + skill.Progress = 5100 + break; + } + } + + } else { + Logger.error("No skills for PMC to master, skipping") + } + } + return HttpResponse.nullResponse(); + } + + if (config.player.AllSkillsMaster === true) { + HttpRouter.onStaticRoute["/client/game/version/validate"]["aioMod"] = maxSkills.bind(this) + } + } + + +} + +module.exports = PlayerModifications; \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/raids.js b/ZEreshkigal-AllinOneMod/src/raids.js new file mode 100644 index 0000000..657a49f --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/raids.js @@ -0,0 +1,232 @@ +/* +エレシュキガル +*/ + +"use strict"; + +class RaidsModifications { + static ApplyRaidsModifications() { + const config = require("../config/config.json") + const database = DatabaseServer.tables; + const hideout = database.hideout + const locations = database.locations; + const OtherModitication = require("./other.js"); + + //Change hideout fuel consumption + if (config.hideout.ChangeFuelConsumptionRate !== false) { + if (typeof config.hideout.ChangeFuelConsumptionRate === "number") { + hideout.settings.generatorFuelFlowRate = config.hideout.ChangeFuelConsumptionRate + } + } + + //Enable hideout fast constructions + if (config.hideout.FastHideoutConstruction === true) { + + for (const data in hideout.areas) { + let areaData = hideout.areas[data] + if (OtherModitication.IsThisIDaMod(areaData._id) === false) { + for (const i in areaData.stages) { + + if (areaData.stages[i].constructionTime > 0) { + areaData.stages[i].constructionTime = 10; + } + + } + } + } + } + + //Enable fast hideout production + if (config.hideout.FastHideoutProduction === true) { + + for (const data in hideout.production) { + let productionData = hideout.production[data]; + if (OtherModitication.IsThisIDaMod(productionData._id) === false) { + if (productionData.continuous === false && productionData.productionTime >= 10) { + productionData.productionTime = 10; + } + } + } + + } + + //Scav cases modifications + if (config.hideout.FastScavCase === true) { + + for (const scav in hideout.scavcase) { + let caseData = hideout.scavcase[scav]; + if (OtherModitication.IsThisIDaMod(caseData._id) === false) { + if (caseData.ProductionTime >= 10) { + caseData.ProductionTime = 10; + } + } + } + } + if (config.hideout.ScavCasePriceReducer === true) { + for (const scase in hideout.scavcase) { + let caseData = hideout.scavcase[scase]; + if (OtherModitication.IsThisIDaMod(caseData._id) === false) { + if (caseData.Requirements[0].count >= 10 && (caseData.Requirements[0].templateId === "5449016a4bdc2d6f028b456f" || caseData.Requirements[0].templateId === "5696686a4bdc2da3298b456a" || caseData.Requirements[0].templateId === "569668774bdc2da2298b4568")) { + caseData.Requirements[0].count = 10; + } + } + } + } + + //Remove construction requirements + if(config.hideout.RemoveConstructionsRequirements === true){ + for (const data in hideout.areas) { + let areaData = hideout.areas[data] + if (OtherModitication.IsThisIDaMod(areaData._id) === false) { + for (const i in areaData.stages) { + if (areaData.stages[i].requirements !== undefined) { + areaData.stages[i].requirements = []; + } + + } + } + } + } + + //Remove labs entry keycard + if (config.raids.RemoveLabKeycard === true) { + locations["laboratory"].base.AccessKeys = [] + } + + + //Changing maps loots spawn chances multiplier + if (config.raids["Change Map Loot Spawn Chances"] === true) { + if (config.raids["Map Loot Spawn Chances Multipliers"].globalsMul !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].globalsMul === "number") { + DatabaseServer.tables.globals.config.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].globalsMul; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].bigmap !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].bigmap === "number") { + locations["bigmap"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].bigmap; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].factory4_day !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_day === "number") { + locations["factory4_day"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].factory4_day; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].factory4_night !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_night === "number") { + locations["factory4_night"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].factory4_night; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].interchange !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].interchange === "number") { + locations["interchange"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].interchange; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].laboratory !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].laboratory === "number") { + locations["laboratory"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].laboratory; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].shoreline !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].shoreline === "number") { + locations["shoreline"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].shoreline; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].woods !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].woods === "number") { + locations["woods"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].woods; + } + if (config.raids["Map Loot Spawn Chances Multipliers"].reserve !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].reserve === "number") { + locations["rezervbase"].base.GlobalLootChanceModifier = config.raids["Map Loot Spawn Chances Multipliers"].reserve; + } + } + + //Remove extracts restrictions + if (config.raids.NoExtractsRestrictions === true) { + for (let i in locations) { + if (i !== "base") { + for (let x in locations[i].base.exits) { + if (locations[i].base.exits[x].Name !== "EXFIL_Train" && !locations[i].base.exits[x].Name.includes("lab") || locations[i].base.exits[x].Name === "lab_Vent") { + if (locations[i].base.exits[x].PassageRequirement !== "None") { + locations[i].base.exits[x].PassageRequirement = "None"; + } + if (locations[i].base.exits[x].ExfiltrationType !== "Individual") { + locations[i].base.exits[x].ExfiltrationType = "Individual"; + } + if (locations[i].base.exits[x].Id !== '') { + locations[i].base.exits[x].Id = ''; + } + if (locations[i].base.exits[x].Count !== 0) { + locations[i].base.exits[x].Count = 0; + } + if (locations[i].base.exits[x].RequirementTip !== '') { + locations[i].base.exits[x].RequirementTip = ''; + } + if (locations[i].base.exits[x].RequiredSlot) { + delete locations[i].base.exits[x].RequiredSlot; + } + } + } + } + } + } + + //Make all extractions available to extract + if (config.raids.AllExtractionsAvailable === true) { + for (let i in locations) { + if (i !== "base") { + for (let x in locations[i].base.exits) { + if (locations[i].base.exits[x].Name !== "EXFIL_Train") { + if (locations[i].base.exits[x].Chance !== 100) { + locations[i].base.exits[x].Chance = 100; + } + } + } + } + } + } + + //Make all bosses to 100% spawn + if (config.raids.IncreasedBossChance === true) { + Logger.info("AllinOne Mod: IncreasedBossChance activated"); + for (let i in locations) { + if (i !== "base") { + if (locations[i].base.BossLocationSpawn !== []) { + for (let x in locations[i].base.BossLocationSpawn) { + locations[i].base.BossLocationSpawn[x].BossChance = 100 + } + } + } + } + } + + //Extend raids to 16 hours + if (config.raids.ExtendedRaid === true) { + Logger.info("AllinOne Mod: Extended Raid activated"); + for (let map in locations) { + if (map !== "base") { + locations[map].base.exit_access_time = 999 + locations[map].base.escape_time_limit = 999 + } + } + } + + //Make all extractions of the map available regardless of the infill + if (config.raids.ExtractionsExtended === true) { + for (let map in locations) { + switch (map) { + case "base": + break; + case "bigmap": + for (const extract in locations[map].base.exits) { + locations[map].base.exits[extract].EntryPoints = "Customs,Boiler Tanks" + } + break; + case "interchange": + for (const extract in locations[map].base.exits) { + locations[map].base.exits[extract].EntryPoints = "MallSE,MallNW" + } + break; + case "shoreline": + for (const extract in locations[map].base.exits) { + locations[map].base.exits[extract].EntryPoints = "Village,Riverside" + } + break; + case "woods": + for (const extract in locations[map].base.exits) { + locations[map].base.exits[extract].EntryPoints = "House,Old Station" + } + break; + default: + break; + } + } + } + } +} + +module.exports = RaidsModifications; \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/traders.js b/ZEreshkigal-AllinOneMod/src/traders.js new file mode 100644 index 0000000..56cddc4 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/traders.js @@ -0,0 +1,134 @@ +/* +エレシュキガル +*/ + +"use strict"; + +class TradersModifications { + static ApplyTradersModifications() { + const config = require("../config/config.json") + const database = DatabaseServer.tables; + const traders = database.traders; + const quests = database.templates.quests + const suits = database.templates.customization + const OtherModitication = require("./other.js"); + + //Enable all the quests + if (config.traders.AllQuestsAvailable === true) { + Logger.info("AllinOne Mod: AllQuestsAvailable activated"); + + for (let id in quests) { + if (OtherModitication.IsThisIDaMod(id) === false) { + let questData = quests[id] + + questData.conditions.AvailableForStart = [{ + "_parent": "Level", + "_props": { + "compareMethod": ">=", + "value": "1", + "index": 0, + "parentId": "", + "id": "AllInOne-Mod: AllQuestsAvailable" + } + }] + } + } + } + + if (config.traders["Remove FIR condition on quests"]) { + for (const id in quests) { + let condition = quests[id].conditions.AvailableForFinish + for (const requirements in condition) { + let requirement = condition[requirements] + if (requirement._parent === "FindItem" || requirement._parent === "HandoverItem") { + if ('_props' in requirement && 'onlyFoundInRaid' in requirement._props) { + requirement._props.onlyFoundInRaid = false + } + } + } + } + } + + //Enable all clothes available for both side + if (config.traders.AllClotheForEverySide === true) { + Logger.info("AllinOne Mod: AllClotheForEverySide activated"); + + for (let suit in suits) { + if (OtherModitication.IsThisIDaMod(suit) === false) { + let suitData = suits[suit] + suitData._props.Side = ["Savage", "Bear", "Usec"]; + } + } + } + + //Enable all clothes for free + if (config.traders.AllClothesFree === true) { + for (let trader in traders) { + if (OtherModitication.IsThisIDaMod(trader) === false) { + if (traders[trader].suits) { + + for (let file in traders[trader].suits) { + let fileData = traders[trader].suits[file] + fileData.requirements.loyaltyLevel = 1; + fileData.requirements.profileLevel = 1; + fileData.requirements.standing = 0; + fileData.requirements.skillRequirements = []; + fileData.requirements.questRequirements = []; + fileData.requirements.itemRequirements = []; + } + } + } + } + } + + //Change insurances return times + if (config.traders.InsuranceTime.activated === true) { + Logger.info("AllinOne Mod: InsuranceTime activated"); + + if (config.traders.InsuranceTime.Prapor.activated === true) { + Logger.info("AllinOne Mod: Prapor insurance changed"); + traders["54cb50c76803fa8b248b4571"].base.insurance.min_return_hour = config.traders.InsuranceTime.Prapor.min + traders["54cb50c76803fa8b248b4571"].base.insurance.max_return_hour = config.traders.InsuranceTime.Prapor.max + } + if (config.traders.InsuranceTime.Therapist.activated === true) { + Logger.info("AllinOne Mod: Therapist insurance changed"); + traders["54cb57776803fa99248b456e"].base.insurance.min_return_hour = config.traders.InsuranceTime.Therapist.min + traders["54cb57776803fa99248b456e"].base.insurance.max_return_hour = config.traders.InsuranceTime.Therapist.max + } + } + + //Change the maximum time for insurance to be in mails + if (config.traders.MaxInsuranceStorageTime !== false) { + traders["54cb50c76803fa8b248b4571"].base.insurance.max_storage_time = config.traders.MaxInsuranceStorageTime + traders["54cb57776803fa99248b456e"].base.insurance.max_storage_time = config.traders.MaxInsuranceStorageTime + } + + function lvlUp(traderID, sessionID) { + let pmcData = ProfileController.getPmcProfile(sessionID); + let loyaltyLevels = DatabaseServer.tables.traders[traderID].base.loyalty.loyaltyLevels; + + // level up player + pmcData.Info.Level = PlzRefactorMeHelper.calculateLevel(pmcData); + + + for (let level in loyaltyLevels) { + loyaltyLevels[level].minLevel = 1 + loyaltyLevels[level].minSalesSum = 0 + loyaltyLevels[level].minStanding = 0 + pmcData.TraderStandings[traderID].currentLevel = 4; + DatabaseServer.tables.traders[traderID].base.loyalty.currentLevel = 4; + pmcData.TraderStandings[traderID].display = true; + } + } + + //Enable all traders 4 stars + if (config.traders.AllTraders4Stars === true) { + TraderController.lvlUp = lvlUp + } + + } + + +} + +module.exports = TradersModifications; \ No newline at end of file diff --git a/ZEreshkigal-AllinOneMod/src/warnings.js b/ZEreshkigal-AllinOneMod/src/warnings.js new file mode 100644 index 0000000..4946059 --- /dev/null +++ b/ZEreshkigal-AllinOneMod/src/warnings.js @@ -0,0 +1,344 @@ +/* +エレシュキガル +*/ + +"use strict"; + +class Warnings { + static SendUserInformations() { + + const config = require("../config/config.json"); + const errors = require("../config/errors.json") + const OtherModitication = require("./other.js"); + //Notice information + if (config.other.HideWarningMessage === false) { + Logger.log(`[AIO Mod INFORMATION]`, "white", "red"); + Logger.log(`Please, take care of reading the readme.pdf of the mod before using it. It contains all configurations explanations.`, "white", "red"); + Logger.log(`[AIO Mod INFORMATION]`, "white", "red"); + } + + if (typeof config.items.ChangeIndividualItemProperty.activated !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.ChangeIndividualItemProperty.activated) + } + if (typeof config.items.AllExaminedItems !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.AllExaminedItems) + } + if (typeof config.items.StackableBarters !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.StackableBarters) + } + if (typeof config.items.RemoveAllGearPenalties !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.RemoveAllGearPenalties) + } + if (typeof config.hideout.RemoveConstructionsRequirements !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.RemoveConstructionsRequirements) + } + if (typeof config.player.DisableFallDamage !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.player.DisableFallDamage) + } + if (typeof config.traders["Remove FIR condition on quests"] !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders["Remove FIR condition on quests"]) + } + if (typeof config.raids.ExtractionsExtended !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.ExtractionsExtended) + } + if (config.items.MoreStack !== false && typeof config.items.MoreStack !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.items.MoreStack) + } + if (config.items.WeightOptions !== "Forced" && config.items.WeightOptions !== "Perc" && config.items.WeightOptions !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.items.WeightOptions) + } + if (typeof config.items.EquipRigsWithArmors !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.EquipRigsWithArmors) + } + if (typeof config.items.ForceMoneyStack !== "number" && config.items.ForceMoneyStack !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.items.ForceMoneyStack) + } + if (typeof config.items.RemoveSecureContainerFilters !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.RemoveSecureContainerFilters) + } + if (typeof config.items.RemoveBackpacksRestrictions !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.RemoveBackpacksRestrictions) + } + if (typeof config.items.RemoveContainersRestrictions !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.RemoveContainersRestrictions) + } + if (typeof config.items.InRaidModdable !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.InRaidModdable) + } + if (config.items.IncreaseLootExp !== false && typeof config.items.IncreaseLootExp !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.items.IncreaseLootExp) + } + if (config.items.IncreaseExamineExp !== false && typeof config.items.IncreaseExamineExp !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.items.IncreaseExamineExp) + } + if (typeof config.raids.RemoveLabKeycard !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.RemoveLabKeycard) + } + if (typeof config.traders.AllTraders4Stars !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.AllTraders4Stars) + } + if (typeof config.player.AllSkillsMaster !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.player.AllSkillsMaster) + } + if (typeof config.traders.InsuranceTime.activated !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.InsuranceTime.activated) + } + if (typeof config.raids.ExtendedRaid !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.ExtendedRaid) + } + if (typeof config.raids.IncreasedBossChance !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.IncreasedBossChance) + } + if (typeof config.raids.AllExtractionsAvailable !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.AllExtractionsAvailable) + } + if (typeof config.raids.NoExtractsRestrictions !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids.NoExtractsRestrictions) + } + if (typeof config.raids["Change Map Loot Spawn Chances"] !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Change Map Loot Spawn Chances"]) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].reserve !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].reserve !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].reserve) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].woods !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].woods !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].woods) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].shoreline !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].shoreline !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].shoreline) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].laboratory !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].laboratory !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].laboratory) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].interchange !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].interchange !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].interchange) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_night !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].factory4_night !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].factory4_night) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_day !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].factory4_day !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].factory4_day) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].bigmap !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].bigmap !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].bigmap) + } + if (typeof config.raids["Map Loot Spawn Chances Multipliers"].globalsMul !== "number" && config.raids["Map Loot Spawn Chances Multipliers"].globalsMul !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.raids["Map Loot Spawn Chances Multipliers"].globalsMul) + } + if (typeof config.player.RemoveInRaidsRestrictions !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.player.RemoveInRaidsRestrictions) + } + if (typeof config.player.UnlimitedStamina !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.player.UnlimitedStamina) + } + if (config.player.ChangeMaxStamina !== false && typeof config.player.ChangeMaxStamina !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.player.ChangeMaxStamina) + } + if (config.player.DisableSkillFatigue !== "Custom" && config.player.DisableSkillFatigue !== false && config.player.DisableSkillFatigue !== true) { + OtherModitication.CustomWarning("AIO Mod", errors.player.DisableSkillFatigue) + } + if (config.traders.ChangeFleaMarketLvl !== false && typeof config.traders.ChangeFleaMarketLvl !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.ChangeFleaMarketLvl) + } + if (config.player.ChangeWeaponSkillMultiplier !== false && typeof config.player.ChangeWeaponSkillMultiplier !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.player.ChangeWeaponSkillMultiplier) + } + if (config.player.ChangeSkillProgressionMultiplier !== false && typeof config.player.ChangeSkillProgressionMultiplier !== "number") { + OtherModitication.CustomWarning("AIO Mod", errors.player.ChangeSkillProgressionMultiplier) + } + if (typeof config.player.RemoveScavTimer !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.player.RemoveScavTimer) + } + if (typeof config.traders.AllClothesFree !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.AllClothesFree) + } + if (typeof config.traders.AllClotheForEverySide !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.AllClotheForEverySide) + } + if (typeof config.traders.AllQuestsAvailable !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.traders.AllQuestsAvailable) + } + if (typeof config.hideout.ScavCasePriceReducer !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.ScavCasePriceReducer) + } + if (typeof config.hideout.FastScavCase !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.FastScavCase) + } + if (typeof config.hideout.FastHideoutProduction !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.FastHideoutProduction) + } + if (typeof config.hideout.FastHideoutConstruction !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.FastHideoutConstruction) + } + if (typeof config.hideout.ChangeFuelConsumptionRate !== "number" && config.hideout.ChangeFuelConsumptionRate !== false) { + OtherModitication.CustomWarning("AIO Mod", errors.hideout.ChangeFuelConsumptionRate) + } + if (typeof config.items.ChangeIndividualItemProperty.activated !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.ChangeIndividualItemProperty.activated) + } + if (typeof config.items.RemoveKeysUsageNumber !== "boolean") { + OtherModitication.CustomWarning("AIO Mod", errors.items.RemoveKeysUsageNumber) + } + if (config.player.DisableSkillFatigue !== "Custom" && config.player.DisableSkillFatigue !== false && config.player.DisableSkillFatigue !== true) { + OtherModitication.CustomWarning("AIO Mod", errors.player.DisableSkillFatigue) + } + /////// Activation notices + if (config.items.RemoveKeysUsageNumber === true) { + Logger.info("AllinOne Mod: RemoveKeysUsageNumber activated"); + } + if (config.hideout.FastScavCase === true) { + Logger.info("AllinOne Mod: Changing ScavCase time"); + } + if (config.hideout.FastHideoutConstruction === true) { + Logger.info("AllinOne Mod: Changing Hideout construction time"); + } + if (config.hideout.FastHideoutProduction === true) { + Logger.info("AllinOne Mod: Changing Hideout production time"); + } + if (config.hideout.ScavCasePriceReducer === true) { + Logger.info("AllinOne Mod: Changing ScavCase prices"); + } + if (config.traders.AllQuestsAvailable === true) { + Logger.info("AllinOne Mod: AllQuestsAvailable activated"); + } + if (config.traders.AllClotheForEverySide === true) { + Logger.info("AllinOne Mod: AllClotheForEverySide activated"); + } + if (config.traders.AllClothesFree === true) { + Logger.info("AllinOne Mod: AllClothesFree activated"); + } + if (config.player.RemoveScavTimer === true) { + Logger.info("AllinOne Mod: RemoveScavTimer activated"); + } + if (config.player.ChangeSkillProgressionMultiplier !== false && typeof config.player.ChangeSkillProgressionMultiplier == "number") { + Logger.info("AllinOne Mod: ChangeSkillProgressionMultiplier activated"); + } + if (config.player.ChangeWeaponSkillMultiplier !== false && typeof config.player.ChangeWeaponSkillMultiplier == "number") { + Logger.info("AllinOne Mod: ChangeWeaponSkillMultiplier activated"); + } + if (config.traders.ChangeFleaMarketLvl !== false && typeof config.traders.ChangeFleaMarketLvl == "number") { + Logger.info("AllinOne Mod: ChangeFleaMarketLvl activated"); + } + if (config.player.DisableSkillFatigue === true) { + Logger.info("AllinOne Mod: DisableSkillFatigue activated"); + } + if (config.player.DisableSkillFatigue === "Custom") { + Logger.info("AllinOne Mod: DisableSkillFatigue activated on Custom settings"); + Logger.info("AllinOne Mod: Fatigue Settings: MinEffect: " + config.player.SkillMinEffectiveness + " FatiguePerPoint: " + config.player.SkillFatiguePerPoint + " FreshEffect: " + config.player.SkillFreshEffectiveness + " FreshPoints: " + config.player.SkillFreshPoints + " PointsBeforeFatigue: " + config.player.SkillPointsBeforeFatigue + " FatigueResetTime: " + config.player.SkillFatigueReset); + } + if (typeof config.player.ChangeMaxStamina == "number" && config.player.UnlimitedStamina === false) { + Logger.info("AllinOne Mod: ChangeMaxStamina activated"); + } + if (config.player.ChangeMaxStamina === false && config.player.UnlimitedStamina === true) { + Logger.info("AllinOne Mod: UnlimitedStamina activated"); + } + if (config.player.RemoveInRaidsRestrictions === true) { + Logger.info("AllinOne Mod: RemoveInRaidsRestrictions activated"); + } + if (config.raids.RemoveLabKeycard === true) { + Logger.info("AllinOne Mod: RemoveLabKeycard activated"); + } + if (config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: ChangeLootMultipiers activated"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].globalsMul !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].globalsMul === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Globals multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].bigmap !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].bigmap === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Bigmap multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].factory4_day !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_day === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Factory4_day multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].factory4_night !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].factory4_night === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Factory4_night multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].interchange !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].interchange === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Interchange multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].laboratory !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].laboratory === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Laboratory multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].shoreline !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].shoreline === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Shoreline multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].woods !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].woods === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: Woods multiplier changed"); + } + if (config.raids["Map Loot Spawn Chances Multipliers"].reserve !== false && typeof config.raids["Map Loot Spawn Chances Multipliers"].reserve === "number" && config.raids["Change Map Loot Spawn Chances"] === true) { + Logger.info("AllinOne Mod: ReserveBase multiplier changed"); + } + if (config.raids.NoExtractsRestrictions === true) { + Logger.info("AllinOne Mod: NoExtractsRestrictions activated"); + } + if (config.raids.AllExtractionsAvailable === true) { + Logger.info("AllinOne Mod: AllExtractionsAvailable activated"); + } + if (config.raids.ExtendedRaid === true) { + Logger.info("AllinOne Mod: Extended Raid activated"); + } + if (config.items.WeightOptions === "Forced") { + Logger.info("AllInOne Mod: All Items Weight Forced to " + config.items.WeightChanger + " kg"); + } + if (typeof config.items.WeightChanger !== "number") { + Logger.info("WeightChanger variable is incorrect, please read carefully the description"); + } + if (config.items.WeightOptions === "Perc" && config.items.WeightChanger > 0) { + Logger.info("AllInOne Mod: All Items Weight Increased by " + config.items.WeightChanger + "%"); + } + if (config.items.WeightOptions === "Perc" && config.items.WeightChanger < 0) { + Logger.info("AllInOne Mod: All Items Weight Decreased by " + config.items.WeightChanger + "%"); + } + if (typeof config.items.MoreStack == "number") { + Logger.info("AllInOne Mod: All Ammo Stack Sizes Increased to " + config.items.MoreStack); + } + if (config.items.EquipRigsWithArmors === true) { + Logger.info("AllInOne Mod: Equip Rigs and Armors Allowed"); + } + if (config.items.ForceMoneyStack !== false && typeof config.items.ForceMoneyStack == "number") { + Logger.info("AllInOne Mod: All Money Stack Sizes Increased to " + config.items.ForceMoneyStack); + } + if (config.items.RemoveSecureContainerFilters === true) { + Logger.info("AllInOne Mod: Secure Containers Restrictions Removed"); + } + if (config.items.RemoveBackpacksRestrictions === true) { + Logger.info("AllInOne Mod: RemoveBackpacksRestrictions activated"); + } + if (config.items.RemoveContainersRestrictions === true) { + Logger.info("AllInOne Mod: RemoveContainersRestrictions activated"); + } + if (config.items.AllExaminedItems === true) { + Logger.info("AllInOne Mod: All Items Examined"); + } + if (config.traders.AllTraders4Stars === true) { + Logger.info("AllInOne Mod: AllSkillsMaster activated") + } + if (config.items.StackableBarters === true) { + Logger.info("AllInOne Mod: StackableBarters activated") + } + if (config.items.RemoveAllGearPenalties === true) { + Logger.info("AllInOne Mod: RemoveAllGearPenalties activated") + } + if (config.hideout.RemoveConstructionsRequirements === true) { + Logger.info("AllInOne Mod: RemoveConstructionsRequirements activated") + } + if (config.player.DisableFallDamage === true) { + Logger.info("AllInOne Mod: DisableFallDamage activated") + } + if (config.traders["Remove FIR condition on quests"] === true) { + Logger.info("AllInOne Mod: Remove FIR condition on quests activated") + } + if (config.raids.ExtractionsExtended === true) { + Logger.info("AllInOne Mod: ExtractionsExtended activated") + } + if (config.player.DisableSkillFatigue === true) { + Logger.info("AllinOne Mod: DisableSkillFatigue activated"); + } + if (config.player.DisableSkillFatigue === "Custom") { + Logger.info("AllinOne Mod: DisableSkillFatigue activated on Custom settings"); + Logger.info(`AllinOne Mod: Fatigue Settings: MinEffect: ${config.player.SkillMinEffectiveness} FatiguePerPoint: ${config.player.SkillFatiguePerPoint} FreshEffect: ${config.player.SkillFreshEffectiveness} FreshPoints: ${config.player.SkillFreshPoints} PointsBeforeFatigue: ${config.player.SkillPointsBeforeFatigue} FatigueResetTime: ${config.player.SkillFatigueReset}`); + } + } +} + +module.exports = Warnings; \ No newline at end of file