2.2.0 upload

This commit is contained in:
Ereshkigal 2021-05-28 17:19:31 +02:00
commit 94b4e61228
30 changed files with 2378 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
ZEreshkigal-AllinOneMod-1.10.0.zip
ZEreshkigal-AllinOneMod/obfuscating.bat
ZEreshkigal-AllinOneMod/package.js

BIN
Documentation_AIO.docx Normal file

Binary file not shown.

32
LICENSE Normal file
View File

@ -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.

49
README.md Normal file
View File

@ -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

Binary file not shown.

View File

@ -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.

View File

@ -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

View File

@ -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
}
}

View File

@ -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
}
}

Binary file not shown.

View File

@ -0,0 +1,4 @@
require('bytenode');
require('./package.jsc');

15
ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode generated vendored Normal file
View File

@ -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

17
ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.cmd generated vendored Normal file
View File

@ -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

18
ZEreshkigal-AllinOneMod/node_modules/.bin/bytenode.ps1 generated vendored Normal file
View File

@ -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

21
ZEreshkigal-AllinOneMod/node_modules/bytenode/LICENSE generated vendored Normal file
View File

@ -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.

270
ZEreshkigal-AllinOneMod/node_modules/bytenode/README.md generated vendored Normal file
View File

@ -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\<Buffer\>}
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\<Buffer\>} 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\<string\>}
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\<string\>}: 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.

View File

@ -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);
}
}

View File

@ -0,0 +1,17 @@
/// <reference types="node" />
export declare const compileCode: (javascriptCode: string) => Buffer;
export declare const compileElectronCode: (javascriptCode: string) => Promise<Buffer>;
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<string>;
export declare const runBytecodeFile: (filename: string) => any;
export declare function addLoaderFile(fileToLoad: string, loaderFilename?: string): void;
export declare function loaderCode(targetPath: string): string;
export {};

View File

@ -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<Buffer>} - 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<string>} 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;

View File

@ -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"
}

Binary file not shown.

View File

@ -0,0 +1,10 @@
{
"name": "AllinOneMod",
"author": "Ereshkigal",
"version": "2.2.0",
"license": "NCSA Open Source",
"dependencies": {
"CoreMod": "2.0.0"
},
"main": "loader.js"
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;