diff --git a/README.md b/README.md index dee19e7..d6b45fa 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ This project aims to autostart a Stardew Valley Multiplayer Server as easy as po - Updating to most recent version requires a rebuild: `docker-compose build --no-cache` - Although I'm trying to put out updates, I don't have the time for testing, so I recommend forking and fixing things on your own. + - Ansible and Terraform will not be supported anymore + - Thanks to the brilliant configuration script from Novex and the genius baseimage from jlesage this now looks a bit better ## Setup @@ -16,7 +18,7 @@ git clone https://github.com/printfuck/stardew-multiplayer-docker docker-compose up ``` -### Ansible +### Ansible !deprecated! Create an inventory file with your hosts @@ -24,7 +26,7 @@ Create an inventory file with your hosts ansible -i playbook.yml ``` -### Terraform (with Hetzner Cloud) +### Terraform (with Hetzner Cloud) !deprecated! Enter your API Token in `terraform/vars.auto.tfvars` and modify the resource section in `main.tf` to your liking, then run the following script: @@ -34,7 +36,7 @@ Enter your API Token in `terraform/vars.auto.tfvars` and modify the resource sec ## Game Setup -Intially you have to create or load a game once at first startup via VNC. After that the Autoload Mod jumps into the previously loaded savegame everytime you rerun the container. You can also edit the config file of the Autoload Mod to archieve similar behaviour. +Intially you have to create or load a game once at first startup via VNC or Web interface. After that the Autoload Mod jumps into the previously loaded savegame everytime you rerun the container. You can also edit the config file of the Autoload Mod to archieve similar behaviour. ### VNC @@ -50,15 +52,20 @@ Localhost: - VNCPASS=insecure ``` +### Web Interface + +On port 5800 inside the container is a web interface that uses noVNC. This is a bit easier and more accessible than just the vnc interface. Although you will be asked for the vnc password, I wouldn't recommend exposing the the port to the outside world. + ## How it works -The game, the modloader (SMAPI), and the necessary Mods are pulled from my servers (I'll assume you already own the game - since you're looking for a multiplayer - so please don't rip it from there) to minimize version conflicts. The `docker-entrypoint.sh` script will start `Xvfb` and `x11vnc` before starting the game. You can control the game via vnc with the settings within the `docker-compose.yml` file. +The game will be pulled from my servers (I'll assume you already own the game - since you're looking for a multiplayer - so please don't rip it from there) and the modloader (SMAPI) will be pulled from Github when building the container. You can control the mod's settings with environment variables in the `docker-compose.yml` file. ## Used Mods * [AutoLoadGame](https://www.nexusmods.com/stardewvalley/mods/2509) * [Always On](https://community.playstarbound.com/threads/updating-mods-for-stardew-valley-1-4.156000/page-20#post-3353880) * [Unlimited Players](https://www.nexusmods.com/stardewvalley/mods/2213) +* some more ... ## Troubleshooting diff --git a/configs/alwayson.json b/configs/alwayson.json deleted file mode 100755 index bf480ab..0000000 --- a/configs/alwayson.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "serverHotKey": "F9", - "profitmargin": 50, - "upgradeHouse": 0, - "petname": "mypetnyame", - "farmcavechoicemushrooms": false, - "communitycenterrun": true, - "timeOfDayToSleep": 2200, - "lockPlayerChests": true, - "clientsCanPause": false, - "copyInviteCodeToClipboard": true, - "festivalsOn": true, - "eggHuntCountDownConfig": 120, - "flowerDanceCountDownConfig": 120, - "luauSoupCountDownConfig": 120, - "jellyDanceCountDownConfig": 120, - "grangeDisplayCountDownConfig": 120, - "iceFishingCountDownConfig": 120, - "endofdayTimeOut": 300, - "fairTimeOut": 1200, - "spiritsEveTimeOut": 900, - "winterStarTimeOut": 900, - "eggFestivalTimeOut": 120, - "flowerDanceTimeOut": 120, - "luauTimeOut": 120, - "danceOfJelliesTimeOut": 120, - "festivalOfIceTimeOut": 120 -} \ No newline at end of file diff --git a/configs/autoload.json b/configs/autoload.json index c73ad9f..8754221 100755 --- a/configs/autoload.json +++ b/configs/autoload.json @@ -1,5 +1,5 @@ { - "LastFileLoaded": "Bar_271098218", + "LastFileLoaded": "Barr_271103276", "LoadIntoMultiplayer": true, "ForgetLastFileOnTitle": true } \ No newline at end of file diff --git a/configs/unlimitedplayers.json b/configs/unlimitedplayers.json deleted file mode 100755 index c7bb445..0000000 --- a/configs/unlimitedplayers.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "PlayerLimit": 10 -} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index fe85e10..0f23d91 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,18 +5,140 @@ services: build: docker container_name: stardew environment: - - "VNC_PASSWORD=2342" + - "VNC_PASSWORD=nyanyanya" - "DISPLAY_HEIGHT=1000" - "DISPLAY_WIDTH=1400" + ## Always On Server mod + # Removing this will probably defeat the point of ever using this? + - ENABLE_ALWAYSONSERVER_MOD=${ENABLE_ALWAYSONSERVER_MOD-true} + - ALWAYS_ON_SERVER_HOTKEY=${ALWAYS_ON_SERVER_HOTKEY-F9} + - ALWAYS_ON_SERVER_PROFIT_MARGIN=${ALWAYS_ON_SERVER_PROFIT_MARGIN-100} + - ALWAYS_ON_SERVER_UPGRADE_HOUSE=${ALWAYS_ON_SERVER_UPGRADE_HOUSE-0} + - ALWAYS_ON_SERVER_PET_NAME=${ALWAYS_ON_SERVER_PET_NAME-nya} + - ALWAYS_ON_SERVER_FARM_CAVE_CHOICE_MUSHROOMS=${ALWAYS_ON_SERVER_FARM_CAVE_CHOICE_MUSHROOMS-true} + - ALWAYS_ON_SERVER_COMMUNITY_CENTER_RUN=${ALWAYS_ON_SERVER_COMMUNITY_CENTER_RUN-true} + - ALWAYS_ON_SERVER_TIME_OF_DAY_TO_SLEEP=${ALWAYS_ON_SERVER_TIME_OF_DAY_TO_SLEEP-2200} + - ALWAYS_ON_SERVER_LOCK_PLAYER_CHESTS=${ALWAYS_ON_SERVER_LOCK_PLAYER_CHESTS-true} + - ALWAYS_ON_SERVER_CLIENTS_CAN_PAUSE=${ALWAYS_ON_SERVER_CLIENTS_CAN_PAUSE-true} + - ALWAYS_ON_SERVER_COPY_INVITE_CODE_TO_CLIPBOARD=${ALWAYS_ON_SERVER_COPY_INVITE_CODE_TO_CLIPBOARD-false} + + - ALWAYS_ON_SERVER_FESTIVALS_ON=${ALWAYS_ON_SERVER_FESTIVALS_ON-true} + - ALWAYS_ON_SERVER_EGG_HUNT_COUNT_DOWN=${ALWAYS_ON_SERVER_EGG_HUNT_COUNT_DOWN-600} + - ALWAYS_ON_SERVER_FLOWER_DANCE_COUNT_DOWN=${ALWAYS_ON_SERVER_FLOWER_DANCE_COUNT_DOWN-600} + - ALWAYS_ON_SERVER_LUAU_SOUP_COUNT_DOWN=${ALWAYS_ON_SERVER_LUAU_SOUP_COUNT_DOWN-600} + - ALWAYS_ON_SERVER_JELLY_DANCE_COUNT_DOWN=${ALWAYS_ON_SERVER_JELLY_DANCE_COUNT_DOWN-600} + - ALWAYS_ON_SERVER_GRANGE_DISPLAY_COUNT_DOWN=${ALWAYS_ON_SERVER_GRANGE_DISPLAY_COUNT_DOWN-600} + - ALWAYS_ON_SERVER_ICE_FISHING_COUNT_DOWN=${ALWAYS_ON_SERVER_ICE_FISHING_COUNT_DOWN-600} + + - ALWAYS_ON_SERVER_END_OF_DAY_TIMEOUT=${ALWAYS_ON_SERVER_END_OF_DAY_TIMEOUT-300} + - ALWAYS_ON_SERVER_FAIR_TIMEOUT=${ALWAYS_ON_SERVER_FAIR_TIMEOUT-1200} + - ALWAYS_ON_SERVER_SPIRITS_EVE_TIMEOUT=${ALWAYS_ON_SERVER_SPIRITS_EVE_TIMEOUT-900} + - ALWAYS_ON_SERVER_WINTER_STAR_TIMEOUT=${ALWAYS_ON_SERVER_WINTER_STAR_TIMEOUT-900} + + - ALWAYS_ON_SERVER_EGG_FESTIVAL_TIMEOUT=${ALWAYS_ON_SERVER_EGG_FESTIVAL_TIMEOUT-120} + - ALWAYS_ON_SERVER_FLOWER_DANCE_TIMEOUT=${ALWAYS_ON_SERVER_FLOWER_DANCE_TIMEOUT-120} + - ALWAYS_ON_SERVER_LUAU_TIMEOUT=${ALWAYS_ON_SERVER_LUAU_TIMEOUT-120} + - ALWAYS_ON_SERVER_DANCE_OF_JELLIES_TIMEOUT=${ALWAYS_ON_SERVER_DANCE_OF_JELLIES_TIMEOUT-120} + - ALWAYS_ON_SERVER_FESTIVAL_OF_ICE_TIMEOUT=${ALWAYS_ON_SERVER_FESTIVAL_OF_ICE_TIMEOUT-120 } + + ## Unlimited Players mod + # Removing this will limit game players to 4 + - ENABLE_UNLIMITEDPLAYERS_MOD=${ENABLE_UNLIMITEDPLAYERS_MOD-true} + - UNLIMITED_PLAYERS_PLAYER_LIMIT=${UNLIMITED_PLAYERS_PLAYER_LIMIT-10} + + ## Auto Load Game mod + # Removing this will mean you need to VNC in to manually start the game each boot + - ENABLE_AUTOLOADGAME_MOD=${ENABLE_AUTOLOADGAME-true} + - AUTO_LOAD_GAME_LAST_FILE_LOADED=${AUTO_LOAD_GAME_LAST_FILE_LOADED-null} + - AUTO_LOAD_GAME_FORGET_LAST_FILE_ON_TITLE=${AUTO_LOAD_GAME_FORGET_LAST_FILE_ON_TITLE-true} + - AUTO_LOAD_GAME_LOAD_INTO_MULTIPLAYER=${AUTO_LOAD_GAME_LOAD_INTO_MULTIPLAYER-true} + + ## Remote Control mod + # Disabling this will remove the ability to automatically sleep and save on shutdown + - ENABLE_REMOTECONTROL_MOD=${ENABLE_REMOTECONTROL_MOD-true} + - REMOTE_CONTROL_EVERYONE_IS_ADMIN=${REMOTE_CONTROL_EVERYONE_IS_ADMIN-false} # Disable any authorization by just making everyone an admin - useful for private servers where everyone is trusted + - REMOTE_CONTROL_DEFAULT_ADMINS=${REMOTE_CONTROL_DEFAULT_ADMINS-} # A list of comma-separated json objects to use as default admins, eg: {id: "123456789", name: "Seb"}, {id: "987654321", name: "Kitz"} + - REMOTE_CONTROL_SHOULD_ASSIGN_ADMIN_TO_FIRST_CABIN_FARMER=${REMOTE_CONTROL_SHOULD_ASSIGN_ADMIN_TO_FIRST_CABIN_FARMER-true} # Give the first player that connects admin privileges + + ## Save Backup mod + # Disabling this will stop saves being backed up + - ENABLE_SAVEBACKUP_MOD=${ENABLE_SAVEBACKUP_MOD-true} + + ## Chat Commands mod + - ENABLE_CHATCOMMANDS_MOD=${ENABLE_CHATCOMMANDS_MOD-false} + + ## Console Commands mod + - ENABLE_CONSOLECOMMANDS_MOD=${ENABLE_CONSOLECOMMANDS_MOD-false} + + ## Time Speed mod + - ENABLE_TIMESPEED_MOD=${ENABLE_TIMESPEED_MOD-false} + + # Days are only 20 hours long + # 7.0 = 14 mins per in game day (default) + # 10.0 = 20 mins + # 15.0 = 30 mins + # 20.0 = 40 mins + # 30.0 = 1 hour + # 120.0 = 4 hours + # 300.0 = 10 hours + # 600.0 = 20 hours (realtime) + + - TIME_SPEED_DEFAULT_TICK_LENGTH=${TIME_SPEED_DEFAULT_TICK_LENGTH-7.0} + - TIME_SPEED_TICK_LENGTH_BY_LOCATION_INDOORS=${TIME_SPEED_TICK_LENGTH_BY_LOCATION_INDOORS-7.0} + - TIME_SPEED_TICK_LENGTH_BY_LOCATION_OUTDOORS=${TIME_SPEED_TICK_LENGTH_BY_LOCATION_OUTDOORS-7.0} + - TIME_SPEED_TICK_LENGTH_BY_LOCATION_MINE=${TIME_SPEED_TICK_LENGTH_BY_LOCATION_MINE-7.0} + + - TIME_SPEED_ENABLE_ON_FESTIVAL_DAYS=${TIME_SPEED_ENABLE_ON_FESTIVAL_DAYS-false} + - TIME_SPEED_FREEZE_TIME_AT=${TIME_SPEED_FREEZE_TIME_AT-null} + - TIME_SPEED_LOCATION_NOTIFY=${TIME_SPEED_LOCATION_NOTIFY-false} + + - TIME_SPEED_KEYS_FREEZE_TIME=${TIME_SPEED_KEYS_FREEZE_TIME-N} + - TIME_SPEED_KEYS_INCREASE_TICK_INTERVAL=${TIME_SPEED_KEYS_INCREASE_TICK_INTERVAL-OemPeriod} + - TIME_SPEED_KEYS_DECREASE_TICK_INTERVAL=${TIME_SPEED_KEYS_DECREASE_TICK_INTERVAL-OemComma} + - TIME_SPEED_KEYS_RELOAD_CONFIG=${TIME_SPEED_KEYS_RELOAD_CONFIG-B} + + ## Crops Anytime Anywhere mod + - ENABLE_CROPSANYTIMEANYWHERE_MOD=${ENABLE_CROPSANYTIMEANYWHERE_MOD-false} + + - CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SPRING=${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SPRING-true} + - CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SUMMER=${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SUMMER-true} + - CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_FALL=${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_FALL-true} + - CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_WINTER=${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_WINTER-true} + + - CROPS_ANYTIME_ANYWHERE_FARM_ANY_LOCATION=${CROPS_ANYTIME_ANYWHERE_FARM_ANY_LOCATION-true} + + - CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_DIRT=${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_DIRT-true} + - CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_GRASS=${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_GRASS-true} + - CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_STONE=${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_STONE-false} + - CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_OTHER=${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_OTHER-false} + + ## Friends Forever mod + - ENABLE_FRIENDSFOREVER_MOD=${ENABLE_FRIENDSFOREVER_MOD-false} + + - FRIENDS_FOREVER_AFFECT_SPOUSE=${FRIENDS_FOREVER_AFFECT_SPOUSE-false} + - FRIENDS_FOREVER_AFFECT_DATES=${FRIENDS_FOREVER_AFFECT_DATES-true} + - FRIENDS_FOREVER_AFFECT_EVERYONE_ELSE=${FRIENDS_FOREVER_AFFECT_EVERYONE_ELSE-true} + - FRIENDS_FOREVER_AFFECT_ANIMALS=${FRIENDS_FOREVER_AFFECT_ANIMALS-true} + + ## No Fence Decay mod + - ENABLE_NOFENCEDECAY_MOD=${ENABLE_NOFENCEDECAY_MOD-false} + + ## Non-destructive NPCs mod + - ENABLE_NONDESTRUCTIVENPCS_MOD=${ENABLE_NONDESTRUCTIVENPCS_MOD-false} + ports: + # VNC - 5902:5900 + # NOVNC WEB - 5801:5800 + # Game - 24642:24642/udp volumes: - - ./valley_saves:/root/.config/StardewValley/Saves/ - - ./configs/alwayson.json:/data/Stardew/Stardew Valley/Mods/Always On Server/config.json - - ./configs/unlimitedplayers.json:/data/Stardew/Stardew Valley/Mods/UnlimitedPlayers/config.json + # Saves go here now + - ./valley_saves:/config/xdg/config/StardewValley/Saves + # Should work, not tested + - ./backups:/config/xdg/config/StardewValley/Saves/save-backups + # The stateful configs should be initially empty files with 777 permission - ./configs/autoload.json:/data/Stardew/Stardew Valley/Mods/AutoLoadGame/config.json - # add another mod - # - ./ModFolder:/data/Stardew/Stardew Valley/Mods/ModFolder + diff --git a/docker/Dockerfile b/docker/Dockerfile index 1180429..d9fd38c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -31,16 +31,21 @@ RUN wget https://github.com/Pathoschild/SMAPI/releases/download/3.9.0/SMAPI-3.9. unzip /data/nexus.zip -d /data/nexus/ && \ /bin/bash -c "echo -e \"2\n/data/Stardew/Stardew\ Valley\n1\n\" | /usr/bin/mono /data/nexus/SMAPI\ 3.9.0\ installer/internal/unix-install.exe" -# Add Mods -COPY mods/alwayson.zip /data/alwayson.zip -COPY mods/unlimitedplayers.zip /data/unlimitedplayers.zip -COPY mods/autoloadgame.zip /data/autoloadgame.zip +RUN apt-get install -y gettext-base jq netcat procps + +# Add Mods + +# Add Mods & Scripts +COPY ["mods/", "/data/Stardew/Stardew Valley/Mods/"] +COPY scripts/ /opt/ -RUN unzip /data/alwayson.zip -d /data/Stardew/Stardew\ Valley/Mods && \ - unzip /data/unlimitedplayers.zip -d /data/Stardew/Stardew\ Valley/Mods && \ - unzip /data/autoloadgame.zip -d /data/Stardew/Stardew\ Valley/Mods && \ - rm /data/alwayson.zip /data/unlimitedplayers.zip /data/autoloadgame.zip RUN chmod +x /data/Stardew/Stardew\ Valley/StardewValley && \ - chmod -R 777 /data/Stardew/ + chmod -R 777 /data/Stardew/ && \ + chown -R 1000:1000 /data/Stardew && \ + chmod +x /opt/*.sh + +RUN \ + APP_ICON_URL=https://stardewcommunitywiki.com/mediawiki/images/4/48/Fiddlehead_Fern.png && \ + install_app_icon.sh "$APP_ICON_URL" COPY docker-entrypoint.sh /startapp.sh diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index d9e07a9..6862a4a 100755 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -1,17 +1,39 @@ -#!/bin/sh +#!/bin/bash +export HOME=/config -#if [ -f /tmp/.X10-lock ]; then rm /tmp/.X10-lock; fi -#Xvfb :10 -screen 0 1580x920x24 -ac & +for modPath in /data/Stardew/Stardew\ Valley/Mods/*/ +do + mod=$(basename "$modPath") -#while [ ! -z "`xdpyinfo -display :10 2>&1 | grep 'unable to open display'`" ]; do -# echo Waiting for display; -# sleep 5; -#done + # Normalize mod name ot uppercase and only characters, eg. "Always On Server" => ENABLE_ALWAYSONSERVER_MOD + var="ENABLE_$(echo "${mod^^}" | tr -cd '[A-Z]')_MOD" -#export DISPLAY=:10.0 -#x11vnc -display :10 -rfbport 5900 -rfbportv6 -1 -no6 -noipv6 -httpportv6 -1 -forever -desktop StardewValley -cursor arrow -passwd $VNCPASS -shared & -#sleep 5 -#i3 & -#export XAUTHORITY=~/.Xauthority -#TERM=xterm + # Remove the mod if it's not enabled + if [ "${!var}" != "true" ]; then + echo "Removing ${modPath} (${var}=${!var})" + rm -rf "$modPath" + continue + fi + + if [ -f "${modPath}/config.json.template" ]; then + echo "Configuring ${modPath}config.json" + + # Seed the config.json only if one isn't manually mounted in (or is empty) + if [ "$(cat "${modPath}config.json" 2> /dev/null)" == "" ]; then + envsubst < "${modPath}config.json.template" > "${modPath}config.json" + fi + fi +done + +# Run extra steps for certain mods +/opt/configure-remotecontrol-mod.sh + +/opt/tail-smapi-log.sh & + +# Try fixing Backup Permissions +chmod -R 777 /data/Stardew/Stardew\ Valley/save-backups + +# Ready to start! /data/Stardew/Stardew\ Valley/StardewValley + +sleep 233 diff --git a/docker/mods/Always On Server/Always On Server.dll b/docker/mods/Always On Server/Always On Server.dll new file mode 100644 index 0000000..9d75250 Binary files /dev/null and b/docker/mods/Always On Server/Always On Server.dll differ diff --git a/docker/mods/Always On Server/Always On Server.pdb b/docker/mods/Always On Server/Always On Server.pdb new file mode 100644 index 0000000..d9e553d Binary files /dev/null and b/docker/mods/Always On Server/Always On Server.pdb differ diff --git a/docker/mods/Always On Server/config.json.template b/docker/mods/Always On Server/config.json.template new file mode 100644 index 0000000..8c163d6 --- /dev/null +++ b/docker/mods/Always On Server/config.json.template @@ -0,0 +1,28 @@ +{ + "serverHotKey": "${ALWAYS_ON_SERVER_HOTKEY}", + "profitmargin": ${ALWAYS_ON_SERVER_PROFIT_MARGIN}, + "upgradeHouse": ${ALWAYS_ON_SERVER_UPGRADE_HOUSE}, + "petname": "${ALWAYS_ON_SERVER_PET_NAME}", + "farmcavechoicemushrooms": ${ALWAYS_ON_SERVER_FARM_CAVE_CHOICE_MUSHROOMS}, + "communitycenterrun": ${ALWAYS_ON_SERVER_COMMUNITY_CENTER_RUN}, + "timeOfDayToSleep": ${ALWAYS_ON_SERVER_TIME_OF_DAY_TO_SLEEP}, + "lockPlayerChests": ${ALWAYS_ON_SERVER_LOCK_PLAYER_CHESTS}, + "clientsCanPause": ${ALWAYS_ON_SERVER_CLIENTS_CAN_PAUSE}, + "copyInviteCodeToClipboard": ${ALWAYS_ON_SERVER_COPY_INVITE_CODE_TO_CLIPBOARD}, + "festivalsOn": ${ALWAYS_ON_SERVER_FESTIVALS_ON}, + "eggHuntCountDownConfig": ${ALWAYS_ON_SERVER_EGG_HUNT_COUNT_DOWN}, + "flowerDanceCountDownConfig": ${ALWAYS_ON_SERVER_FLOWER_DANCE_COUNT_DOWN}, + "luauSoupCountDownConfig": ${ALWAYS_ON_SERVER_LUAU_SOUP_COUNT_DOWN}, + "jellyDanceCountDownConfig": ${ALWAYS_ON_SERVER_JELLY_DANCE_COUNT_DOWN}, + "grangeDisplayCountDownConfig": ${ALWAYS_ON_SERVER_GRANGE_DISPLAY_COUNT_DOWN}, + "iceFishingCountDownConfig": ${ALWAYS_ON_SERVER_ICE_FISHING_COUNT_DOWN}, + "endofdayTimeOut": ${ALWAYS_ON_SERVER_END_OF_DAY_TIMEOUT}, + "fairTimeOut": ${ALWAYS_ON_SERVER_FAIR_TIMEOUT}, + "spiritsEveTimeOut": ${ALWAYS_ON_SERVER_SPIRITS_EVE_TIMEOUT}, + "winterStarTimeOut": ${ALWAYS_ON_SERVER_WINTER_STAR_TIMEOUT}, + "eggFestivalTimeOut": ${ALWAYS_ON_SERVER_EGG_FESTIVAL_TIMEOUT}, + "flowerDanceTimeOut": ${ALWAYS_ON_SERVER_FLOWER_DANCE_TIMEOUT}, + "luauTimeOut": ${ALWAYS_ON_SERVER_LUAU_TIMEOUT}, + "danceOfJelliesTimeOut": ${ALWAYS_ON_SERVER_DANCE_OF_JELLIES_TIMEOUT}, + "festivalOfIceTimeOut": ${ALWAYS_ON_SERVER_FESTIVAL_OF_ICE_TIMEOUT} +} \ No newline at end of file diff --git a/docker/mods/Always On Server/manifest.json b/docker/mods/Always On Server/manifest.json new file mode 100644 index 0000000..1dc9455 --- /dev/null +++ b/docker/mods/Always On Server/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Always On Server", + "Author": "funny-snek & Zuberii", + "Version": "1.20.2-unofficial.1-slamerz", + "Description": "A Headless server mod.", + "UniqueID": "funny-snek.Always_On_Server", + "EntryDll": "Always On Server.dll", + "MinimumApiVersion": "3.0.0", + "UpdateKeys": [ "Nexus:2677" ] +} diff --git a/docker/mods/AutoLoadGame/AutoLoadGame.dll b/docker/mods/AutoLoadGame/AutoLoadGame.dll new file mode 100644 index 0000000..b4146a1 Binary files /dev/null and b/docker/mods/AutoLoadGame/AutoLoadGame.dll differ diff --git a/docker/mods/AutoLoadGame/AutoLoadGame.pdb b/docker/mods/AutoLoadGame/AutoLoadGame.pdb new file mode 100644 index 0000000..17c33c7 Binary files /dev/null and b/docker/mods/AutoLoadGame/AutoLoadGame.pdb differ diff --git a/docker/mods/AutoLoadGame/config.json.template b/docker/mods/AutoLoadGame/config.json.template new file mode 100644 index 0000000..3d306ab --- /dev/null +++ b/docker/mods/AutoLoadGame/config.json.template @@ -0,0 +1,5 @@ +{ + "LastFileLoaded": "${AUTO_LOAD_GAME_LAST_FILE_LOADED}", + "LoadIntoMultiplayer": ${AUTO_LOAD_GAME_LOAD_INTO_MULTIPLAYER}, + "ForgetLastFileOnTitle": ${AUTO_LOAD_GAME_FORGET_LAST_FILE_ON_TITLE} +} \ No newline at end of file diff --git a/docker/mods/AutoLoadGame/manifest.json b/docker/mods/AutoLoadGame/manifest.json new file mode 100644 index 0000000..f96add9 --- /dev/null +++ b/docker/mods/AutoLoadGame/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Auto Load Game", + "Author": "Caraxian", + "Version": "1.0.2", + "Description": "Automatically load a save file when starting.", + "UniqueID": "caraxian.AutoLoadGame", + "EntryDll": "AutoLoadGame.dll", + "MinimumApiVersion": "2.10.1", + "UpdateKeys": [ "Nexus:2509" ] +} diff --git a/docker/mods/ChatCommands/ChatCommands.dll b/docker/mods/ChatCommands/ChatCommands.dll new file mode 100644 index 0000000..f499831 Binary files /dev/null and b/docker/mods/ChatCommands/ChatCommands.dll differ diff --git a/docker/mods/ChatCommands/ChatCommands.pdb b/docker/mods/ChatCommands/ChatCommands.pdb new file mode 100644 index 0000000..75fe70d Binary files /dev/null and b/docker/mods/ChatCommands/ChatCommands.pdb differ diff --git a/docker/mods/ChatCommands/manifest.json b/docker/mods/ChatCommands/manifest.json new file mode 100644 index 0000000..8c2e88e --- /dev/null +++ b/docker/mods/ChatCommands/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Chat Commands", + "Author": "Cat", + "Version": "1.14.0", + "Description": "Lets you run SMAPI commands from the chat window!", + "UniqueID": "cat.chatcommands", + "EntryDll": "ChatCommands.dll", + "MinimumApiVersion": "3.0.0", + "UpdateKeys": [ "Nexus:2092" ] +} diff --git a/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.dll b/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.dll new file mode 100644 index 0000000..f0a8f2c Binary files /dev/null and b/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.dll differ diff --git a/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.pdb b/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.pdb new file mode 100644 index 0000000..830fda2 Binary files /dev/null and b/docker/mods/CropsAnytimeAnywhere/CropsAnytimeAnywhere.pdb differ diff --git a/docker/mods/CropsAnytimeAnywhere/config.json.template b/docker/mods/CropsAnytimeAnywhere/config.json.template new file mode 100644 index 0000000..502b9e0 --- /dev/null +++ b/docker/mods/CropsAnytimeAnywhere/config.json.template @@ -0,0 +1,15 @@ +{ + "EnableInSeasons": { + "Spring": ${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SPRING}, + "Summer": ${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_SUMMER}, + "Fall": ${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_FALL}, + "Winter": ${CROPS_ANYTIME_ANYWHERE_ENABLE_IN_SEASONS_WINTER} + }, + "FarmAnyLocation": ${CROPS_ANYTIME_ANYWHERE_FARM_ANY_LOCATION}, + "ForceTillable": { + "Dirt": ${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_DIRT}, + "Grass": ${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_GRASS}, + "Stone": ${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_STONE}, + "Other": ${CROPS_ANYTIME_ANYWHERE_FORCE_TILLABLE_OTHER} + } +} \ No newline at end of file diff --git a/docker/mods/CropsAnytimeAnywhere/manifest.json b/docker/mods/CropsAnytimeAnywhere/manifest.json new file mode 100644 index 0000000..fb12fa2 --- /dev/null +++ b/docker/mods/CropsAnytimeAnywhere/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Crops Anytime Anywhere", + "Author": "Pathoschild", + "Version": "1.1.0", + "MinimumApiVersion": "2.10.1", + "Description": "Lets you grow crops in any season and location (configurable).", + "UniqueID": "Pathoschild.CropsAnytimeAnywhere", + "EntryDll": "CropsAnytimeAnywhere.dll", + "UpdateKeys": [ "Nexus:3000" ] +} diff --git a/docker/mods/FriendsForever/FriendsForever.dll b/docker/mods/FriendsForever/FriendsForever.dll new file mode 100644 index 0000000..bb6a4bb Binary files /dev/null and b/docker/mods/FriendsForever/FriendsForever.dll differ diff --git a/docker/mods/FriendsForever/FriendsForever.pdb b/docker/mods/FriendsForever/FriendsForever.pdb new file mode 100644 index 0000000..bbd8bb5 Binary files /dev/null and b/docker/mods/FriendsForever/FriendsForever.pdb differ diff --git a/docker/mods/FriendsForever/config.json.template b/docker/mods/FriendsForever/config.json.template new file mode 100644 index 0000000..c728438 --- /dev/null +++ b/docker/mods/FriendsForever/config.json.template @@ -0,0 +1,6 @@ +{ + "AffectSpouses": ${FRIENDS_FOREVER_AFFECT_SPOUSE}, + "AffectDates": ${FRIENDS_FOREVER_AFFECT_DATES}, + "AffectEveryoneElse": ${FRIENDS_FOREVER_AFFECT_EVERYONE_ELSE}, + "AffectAnimals": ${FRIENDS_FOREVER_AFFECT_ANIMALS} +} \ No newline at end of file diff --git a/docker/mods/FriendsForever/manifest.json b/docker/mods/FriendsForever/manifest.json new file mode 100644 index 0000000..033fcbc --- /dev/null +++ b/docker/mods/FriendsForever/manifest.json @@ -0,0 +1,11 @@ +{ + "Name": "Friends Forever", + "Author": "Isaac S.", + "Version": "1.2.3", + "Description": "Makes it so friendship levels never decay!", + "UniqueID": "IsaacS.FriendsForever", + "EntryDll": "FriendsForever.dll", + "UpdateKeys": [ "Nexus:1738" ], + "MinimumApiVersion": "2.10.2", + "Dependencies": [] +} diff --git a/docker/mods/NoFenceDecay/NoFenceDecay.dll b/docker/mods/NoFenceDecay/NoFenceDecay.dll new file mode 100644 index 0000000..6d6b5f0 Binary files /dev/null and b/docker/mods/NoFenceDecay/NoFenceDecay.dll differ diff --git a/docker/mods/NoFenceDecay/NoFenceDecay.pdb b/docker/mods/NoFenceDecay/NoFenceDecay.pdb new file mode 100644 index 0000000..a8ccd64 Binary files /dev/null and b/docker/mods/NoFenceDecay/NoFenceDecay.pdb differ diff --git a/docker/mods/NoFenceDecay/manifest.json b/docker/mods/NoFenceDecay/manifest.json new file mode 100644 index 0000000..13e237c --- /dev/null +++ b/docker/mods/NoFenceDecay/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "No Fence Decay", + "Author": "Cat", + "Version": "1.5.0", + "Description": "Makes all fences and gates last forever.", + "UniqueID": "cat.nofencedecay", + "EntryDll": "NoFenceDecay.dll", + "MinimumApiVersion": "2.9.0", + "UpdateKeys": [ "Nexus:1180" ] +} diff --git a/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.dll b/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.dll new file mode 100644 index 0000000..66e3ec2 Binary files /dev/null and b/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.dll differ diff --git a/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.pdb b/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.pdb new file mode 100644 index 0000000..3a02063 Binary files /dev/null and b/docker/mods/NonDestructiveNPCs/NonDestructiveNPCs.pdb differ diff --git a/docker/mods/NonDestructiveNPCs/manifest.json b/docker/mods/NonDestructiveNPCs/manifest.json new file mode 100644 index 0000000..783a794 --- /dev/null +++ b/docker/mods/NonDestructiveNPCs/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Non Destructive NPCs", + "Author": "Madara Uchiha", + "Version": "1.0.0", + "Description": "NPCs no longer destroy placed objects in their paths. They would instead pass through them.", + "UniqueID": "MadaraUchiha.NonDestructiveNPCs", + "EntryDll": "NonDestructiveNPCs.dll", + "MinimumApiVersion": "3.1.0", + "UpdateKeys": [ "Nexus:5176" ] +} \ No newline at end of file diff --git a/docker/mods/RemoteControl/RemoteControl.dll b/docker/mods/RemoteControl/RemoteControl.dll new file mode 100644 index 0000000..40515ac Binary files /dev/null and b/docker/mods/RemoteControl/RemoteControl.dll differ diff --git a/docker/mods/RemoteControl/RemoteControl.pdb b/docker/mods/RemoteControl/RemoteControl.pdb new file mode 100644 index 0000000..fe18f4e Binary files /dev/null and b/docker/mods/RemoteControl/RemoteControl.pdb differ diff --git a/docker/mods/RemoteControl/config.json.template b/docker/mods/RemoteControl/config.json.template new file mode 100644 index 0000000..1d331d5 --- /dev/null +++ b/docker/mods/RemoteControl/config.json.template @@ -0,0 +1,5 @@ +{ + "everyoneIsAdmin": ${REMOTE_CONTROL_EVERYONE_IS_ADMIN}, + "admins": [], + "shouldAssignAdminToFirstCabinFarmer": ${REMOTE_CONTROL_SHOULD_ASSIGN_ADMIN_TO_FIRST_CABIN_FARMER} +} \ No newline at end of file diff --git a/docker/mods/RemoteControl/manifest.json b/docker/mods/RemoteControl/manifest.json new file mode 100644 index 0000000..19fbec5 --- /dev/null +++ b/docker/mods/RemoteControl/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "Remote Control", + "Author": "Sebbity", + "Version": "1.0.0", + "Description": "Remotely control a stardew valley host ", + "UniqueID": "Sebbity.RemoteControl", + "EntryDll": "RemoteControl.dll", + "MinimumApiVersion": "2.10.0", + "UpdateKeys": [ "GitHub:Novex/StardewValley-RemoteControl"] +} \ No newline at end of file diff --git a/docker/mods/TimeSpeed/TimeSpeed.dll b/docker/mods/TimeSpeed/TimeSpeed.dll new file mode 100644 index 0000000..e76c240 Binary files /dev/null and b/docker/mods/TimeSpeed/TimeSpeed.dll differ diff --git a/docker/mods/TimeSpeed/TimeSpeed.pdb b/docker/mods/TimeSpeed/TimeSpeed.pdb new file mode 100644 index 0000000..3b6da6f Binary files /dev/null and b/docker/mods/TimeSpeed/TimeSpeed.pdb differ diff --git a/docker/mods/TimeSpeed/config.json.template b/docker/mods/TimeSpeed/config.json.template new file mode 100644 index 0000000..5a5ba2f --- /dev/null +++ b/docker/mods/TimeSpeed/config.json.template @@ -0,0 +1,19 @@ +{ + "DefaultTickLength": ${TIME_SPEED_DEFAULT_TICK_LENGTH}, + "TickLengthByLocation": { + "Indoors": ${TIME_SPEED_TICK_LENGTH_BY_LOCATION_INDOORS}, + "Outdoors": ${TIME_SPEED_TICK_LENGTH_BY_LOCATION_OUTDOORS}, + "Mine": ${TIME_SPEED_TICK_LENGTH_BY_LOCATION_MINE} + }, + + "EnableOnFestivalDays": ${TIME_SPEED_ENABLE_ON_FESTIVAL_DAYS}, + "FreezeTimeAt": ${TIME_SPEED_FREEZE_TIME_AT}, + "LocationNotify": ${TIME_SPEED_LOCATION_NOTIFY}, + + "Keys": { + "FreezeTime": "${TIME_SPEED_KEYS_FREEZE_TIME}", + "IncreaseTickInterval": "${TIME_SPEED_KEYS_INCREASE_TICK_INTERVAL}", + "DecreaseTickInterval": "${TIME_SPEED_KEYS_DECREASE_TICK_INTERVAL}", + "ReloadConfig": "${TIME_SPEED_KEYS_RELOAD_CONFIG}" + } + } \ No newline at end of file diff --git a/docker/mods/TimeSpeed/manifest.json b/docker/mods/TimeSpeed/manifest.json new file mode 100644 index 0000000..1396570 --- /dev/null +++ b/docker/mods/TimeSpeed/manifest.json @@ -0,0 +1,10 @@ +{ + "Name": "TimeSpeed", + "Author": "cantorsdust", + "Version": "2.4.3", + "Description": "Lets you control the flow of time in the game: speed it up, slow it down, or freeze it altogether.", + "UniqueID": "cantorsdust.TimeSpeed", + "EntryDll": "TimeSpeed.dll", + "MinimumApiVersion": "3.0.0", + "UpdateKeys": [ "Nexus:169" ] +} diff --git a/docker/mods/UnlimitedPlayers/UnlimitedPlayers.dll b/docker/mods/UnlimitedPlayers/UnlimitedPlayers.dll new file mode 100644 index 0000000..9a478c4 Binary files /dev/null and b/docker/mods/UnlimitedPlayers/UnlimitedPlayers.dll differ diff --git a/docker/mods/UnlimitedPlayers/config.json.template b/docker/mods/UnlimitedPlayers/config.json.template new file mode 100644 index 0000000..1f5bc81 --- /dev/null +++ b/docker/mods/UnlimitedPlayers/config.json.template @@ -0,0 +1,3 @@ +{ + "PlayerLimit": ${UNLIMITED_PLAYERS_PLAYER_LIMIT} +} \ No newline at end of file diff --git a/docker/mods/UnlimitedPlayers/manifest.json b/docker/mods/UnlimitedPlayers/manifest.json new file mode 100644 index 0000000..4c3c407 --- /dev/null +++ b/docker/mods/UnlimitedPlayers/manifest.json @@ -0,0 +1,9 @@ +{ + "Author": "Armitxes", + "Description": "Remove the maximum player restrictions, build endless cabins.", + "Name": "Armi's Unlimited Players", + "EntryDll": "UnlimitedPlayers.dll", + "UniqueID": "Armitxes.UnlimitedPlayers", + "UpdateKeys": [ "GitHub:Armitxes/StardewValley_UnlimitedPlayers" ], + "Version": "2020.2.15" +} diff --git a/docker/mods/alwayson.zip b/docker/mods/alwayson.zip deleted file mode 100644 index 5bb956f..0000000 Binary files a/docker/mods/alwayson.zip and /dev/null differ diff --git a/docker/mods/autoloadgame.zip b/docker/mods/autoloadgame.zip deleted file mode 100644 index ab447c1..0000000 Binary files a/docker/mods/autoloadgame.zip and /dev/null differ diff --git a/docker/mods/unlimitedplayers.zip b/docker/mods/unlimitedplayers.zip deleted file mode 100644 index 405a912..0000000 Binary files a/docker/mods/unlimitedplayers.zip and /dev/null differ diff --git a/docker/scripts/configure-remotecontrol-mod.sh b/docker/scripts/configure-remotecontrol-mod.sh new file mode 100644 index 0000000..0ff8f63 --- /dev/null +++ b/docker/scripts/configure-remotecontrol-mod.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +# Quit if we don't have any default admins +if [ -z "${REMOTE_CONTROL_DEFAULT_ADMINS}" ] || [ ! -f "/data/Stardew/Stardew Valley/Mods/RemoteControl/config.json" ]; then + return +fi + +# Add default admins to the admin list +jq ".admins[.admins | length] |= . + ${REMOTE_CONTROL_DEFAULT_ADMINS}" "/data/Stardew/Stardew Valley/Mods/RemoteControl/config.json" > "/data/Stardew/Stardew Valley/Mods/RemoteControl/config.json.out" +mv -f "/data/Stardew/Stardew Valley/Mods/RemoteControl/config.json.out" "/data/Stardew/Stardew Valley/Mods/RemoteControl/config.json" diff --git a/docker/scripts/tail-smapi-log.sh b/docker/scripts/tail-smapi-log.sh new file mode 100644 index 0000000..d90e3bc --- /dev/null +++ b/docker/scripts/tail-smapi-log.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +echo "-- SMAPI Log: Starting" + +# Wait for SMAPI log and tail infinitely +while [ ! -f "/root/.config/StardewValley/ErrorLogs/SMAPI-latest.txt" ]; do + echo "-- SMAPI Log: Waiting for log to appear"; + sleep 5; +done + +echo "-- SMAPI Log: Tailing" +tail -f /config/xdg/config/StardewValley/ErrorLogs/SMAPI-latest.txt