diff --git a/README.md b/README.md index 1265807..bfb769a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## Docker - Palworld Dedicated Server +# Docker - Palworld Dedicated Server [![Build Docker Image](https://github.com/jammsen/docker-palworld-dedicated-server/actions/workflows/docker-build-and-push.yml/badge.svg)](https://github.com/jammsen/docker-palworld-dedicated-server/actions/workflows/docker-build-and-push.yml) ![Docker Pulls](https://img.shields.io/docker/pulls/jammsen/palworld-dedicated-server) @@ -7,16 +7,36 @@ This includes a Palworld Dedicated Server based on Linux and Docker. +___ + +## Overview + +* [Do you need support for this Docker Image](#do-you-need-support-for-this-docker-image) +* [What you need to run this](#what-you-need-to-run-this) +* [Getting started](#getting-started) +* [Environment-Variables](#environment-variables) + * [Container-Settings](#container-settings) + * [TZ identifiers](#tz-identifiers) + * [Cron expression](#cron-expression) + * [Gameserver-Settings](#gameserver-settings) +* [Docker-Compose examples](#docker-compose-examples) + * [Standalone gameserver](#standalone-gameserver) + * [Gameserver with RCON](#gameserver-with-rcon) + * [Run RCON commands](#run-rcon-commands) +* [FAQ](#faq) +* [Planned features in the future](#planned-features-in-the-future) +* [Software used](#software-used) + ## Do you need support for this Docker Image - What to do? - Feel free to create a NEW issue - It is okay to "reference" that you might have the same problem as the person in issue #number - Follow the instructions and answer the questions of people who are willing to help you - - If your issue is done, close it + - If your issue is done, close it and please consider giving this repo and the [Docker-Hub repository](https://hub.docker.com/repository/docker/jammsen/palworld-dedicated-server) a star - I will Inactivity-Close any issue thats not been active for a week - What NOT to do? - - Dont re-use issues / Necro! + - Dont re-use issues / Dont necro! - You are most likely to chat/spam/harrass thoose participants who didnt agree to be part of your / a new problem and might be totally out of context! - If this happens, i reserve the rights to lock the issue or delete the comments, you have been warned! @@ -26,35 +46,115 @@ This includes a Palworld Dedicated Server based on Linux and Docker. ## Getting started -1. Choose a Docker-Compose examples from below -2. Create `game` sub-directories on your Dockernode in your game-server-directory (Example: `/srv/palworld`) and give it with `chmod 777 game` full permissions or use `chown -R 1000:1000 game/`. -3. Setup Port-Forwarding or NAT for the ports in the Docker-Compose file -4. (Build the image if you need) Start via `docker-compose up -d` - See docker-compose.yml and next section for more infos -5. After first start, stop the server, setup your config at `game/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini` and start it again +1. Create a `game` sub-directories on your Dockernode in your game-server-directory (Example: `/srv/palworld`) and give it with `chmod 777 game` full permissions or use `chown -R 1000:1000 game/`. +2. Setup Port-Forwarding or NAT for the ports in the Docker-Compose file +3. Pull the latest version of the image with `docker pull jammsen/palworld-dedicated-server:latest` +4. Setup your own docker-compose.yml just how you like it - Look into the [Docker-Compose examples](#examples) section and the [Environment-Variables](#examples) section for more information +5. Start the container via `docker-compose up -d && docker-compose logs -f` and watch the log, if no errors occur you can close the logs with ctrl+c +6. Happy gaming! ## Environment-Variables -| Variable | Description | Default Value | Allowed Value | -| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- | -| TZ | Timezone used for time stamping server backups | Europe/Berlin | See [TZ identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#Time_Zone_abbreviations) | -| ALWAYS_UPDATE_ON_START | Updates the server on startup | true | false/true | -| MAX_PLAYERS | Maximum amout of players | 32 | 1-32 | -| MULTITHREAD_ENABLED | Sets options for "Improved multi-threaded CPU performance" | true | false/true | -| COMMUNITY_SERVER | Sets the server to a "Community-Server". If true, the server will appear in the Community-Serverlist. Needs PUBLIC_IP and PUBLIC_PORT | true | false/true | -| RCON_ENABLED | RCON function - use ADMIN_PASSWORD to login after enabling it - Will be listening on port 25575 inside the container | true | false/true | -| PUBLIC_IP | Public ip, auto-detect if not specified, see COMMUNITY_SERVER | 10.0.0.1 | ip address | -| PUBLIC_PORT | Public port, auto-detect if not specified, see COMMUNITY_SERVER | 8211 | 1024-65535 | -| SERVER_NAME | Name of the server | jammsen-docker-generated-###RANDOM### | string | -| SERVER_DESCRIPTION | Description of the server | Palworld-Dedicated-Server running in Docker by jammsen | string | -| SERVER_PASSWORD | Password of the server | serverPasswordHere | string | -| ADMIN_PASSWORD | Admin password of the server | adminPasswordHere | string | -| BACKUP_ENABLED | Backup function, creates backups in your `game` directory | true | false/true | -| BACKUP_CRON_EXPRESSION | Needs a Cron-Expression - See https://github.com/aptible/supercronic#crontab-format or https://crontab-generator.org/ | 0 * * * * (meaning every hour) | Cron-Expression | - -Look at https://tech.palworldgame.com/optimize-game-balance for more information and config-settings in `game/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini` + +**Imporant:** In this section you will find a lot of environment variables to control your container-behavior and gameserver-settings. But because of a lot of control, there comes a lot of settings, so this is split into 2 parts for documentation. First comes **Container-Settings** and second **Gamesserver-Settings**. + +### Container-Settings + +| Variable | Description | Default value | Allowed value | +| ---------------------- | ------------------------------------------------------------------- | ------------------------------ | ------------------------------------- | +| TZ | Timezone used for time stamping server backups | Europe/Berlin | See [TZ identifiers](#tz-identifiers) | +| ALWAYS_UPDATE_ON_START | Updates the server on startup | true | false/true | +| MULTITHREAD_ENABLED | Sets options for "Improved multi-threaded CPU performance" | true | false/true | +| COMMUNITY_SERVER | Set to enabled, the server will appear in the Community-Serverlist. | true | false/true | +| BACKUP_ENABLED | Backup function, creates backups in your `game` directory | true | false/true | +| BACKUP_CRON_EXPRESSION | Needs a Cron-Expression - See [Cron expression](#cron-expression) | 0 * * * * (meaning every hour) | Cron-Expression | + +#### TZ identifiers + +This setting affects logging output and the backup function. [TZ identifiers](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#Time_Zone_abbreviations) are format of defining a timezone near you. + +#### Cron expression + +This setting affects the backup function. In a Cron-Expression you define an interval for jobs to run. This image uses Supercronic for crons, see https://github.com/aptible/supercronic#crontab-format or https://crontab-generator.org + +### Gameserver-Settings + +This is a list of all the settings currently adjustable via Docker environment variables, based on the **order** and **contents of the DefaultPalWorldSettings.ini** + +Information-sources and credits to the following websites: +* [Palworld Tech Guide](https://tech.palworldgame.com/optimize-game-balance) for the gameserver documentation +* [PalworldSettingGenerator](https://dysoncheng.github.io/PalWorldSettingGenerator/setting.html) for variable descriptions + +**Imporant:** Please note that all of this is subject to change. **The game is still in early access.** + +| Variable | Game setting | Description | Default Value | Allowed Value | +| ----------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ------------- | +| DIFFICULTY | Difficulty | Choose one of the following:
`None`
`Normal`
`Difficult` | None | Enum | +| DAYTIME_SPEEDRATE | DayTimeSpeedRate | Day time speed - Smaller number means shorter days | 1.000000 | Float | +| NIGHTTIME_SPEEDRATE | NightTimeSpeedRate | Night time speed - Smaller number means shorter nights | 1.000000 | Float | +| EXP_RATE | ExpRate | EXP rate | 1.000000 | Float | +| PAL_CAPTURE_RATE | PalCaptureRate | Pal capture rate | 1.000000 | Float | +| PAL_SPAWN_NUM_RATE | PalSpawnNumRate | Pal appearance rate | 1.000000 | Float | +| PAL_DAMAGE_RATE_ATTACK | PalDamageRateAttack | Damage from pals multipiler | 1.000000 | Float | +| PAL_DAMAGE_RATE_DEFENSE | PalDamageRateDefense | Damage to pals multipiler | 1.000000 | Float | +| PLAYER_DAMAGE_RATE_ATTACK | PlayerDamageRateAttack | Damage from player multipiler | 1.000000 | Float | +| PLAYER_DAMAGE_RATE_DEFENSE | PlayerDamageRateDefense | Damage to player multipiler | 1.000000 | Float | +| PLAYER_STOMACH_DECREASE_RATE | PlayerStomachDecreaceRate | Player hunger depletion rate | 1.000000 | Float | +| PLAYER_STAMINA_DECREACE_RATE | PlayerStaminaDecreaceRate | Player stamina reduction rate | 1.000000 | Float | +| PLAYER_AUTO_HP_REGENE_RATE | PlayerAutoHPRegeneRate | Player auto HP regeneration rate | 1.000000 | Float | +| PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP | PlayerAutoHpRegeneRateInSleep | Player sleep HP regeneration rate | 1.000000 | Float | +| PAL_STOMACH_DECREACE_RATE | PalStomachDecreaceRate | Pal hunger depletion rate | 1.000000 | Float | +| PAL_STAMINA_DECREACE_RATE | PalStaminaDecreaceRate | Pal stamina reduction rate | 1.000000 | Float | +| PAL_AUTO_HP_REGENE_RATE | PalAutoHPRegeneRate | Pal auto HP regeneration rate | 1.000000 | Float | +| PAL_AUTO_HP_REGENE_RATE_IN_SLEEP | PalAutoHpRegeneRateInSleep | Pal sleep health regeneration rate (in Palbox) | 1.000000 | Float | +| BUILD_OBJECT_DAMAGE_RATE | BuildObjectDamageRate | Damage to structure multipiler | 1.000000 | Float | +| BUILD_OBJECT_DETERIORATION_DAMAGE_RATE | PalAutoHpRegeneRateInSleep | Structure determination rate | 1.000000 | Float | +| COLLECTION_DROP_RATE | CollectionDropRate | Getherable items multipiler | 1.000000 | Float | +| COLLECTION_OBJECT_HP_RATE | CollectionObjectHpRate | Getherable objects HP multipiler | 1.000000 | Float | +| COLLECTION_OBJECT_RESPAWN_SPEED_RATE | CollectionObjectRespawnSpeedRate | Getherable objects respawn interval | 1.000000 | Float | +| ENEMY_DROP_ITEM_RATE | EnemyDropItemRate | Dropped Items Multipiler | 1.000000 | Float | +| DEATH_PENALTY | DeathPenalty | `None` : No lost
`Item` : Lost item without equipment
`ItemAndEquipment` : Lost item and equipment
`All`: Lost All item, equipment, pal(in inventory) | All | Enum | +| ENABLE_PLAYER_TO_PLAYER_DAMAGE | bEnablePlayerToPlayerDamage | Allows players to cause damage to players | false | Boolean | +| ENABLE_FRIENDLY_FIRE | bEnableFriendlyFire | Allow friendly fire | false | Boolean | +| ENABLE_INVADER_ENEMY | bEnableInvaderEnemy | Enable invaders | true | Boolean | +| ACTIVE_UNKO | bActiveUNKO | Enable UNKO | false | Boolean | +| ENABLE_AIM_ASSIST_PAD | bEnableAimAssistPad | Enable controller aim assist | true | Boolean | +| ENABLE_AIM_ASSIST_KEYBOARD | bEnableAimAssistKeyboard | Enable Keyboard aim assist | false | Boolean | +| DROP_ITEM_MAX_NUM | DropItemMaxNum | Maximum number of drops in the world | 3000 | Integer | +| DROP_ITEM_MAX_NUM_UNKO | DropItemMaxNum | Maximum number of UNKO drops in the world | 100 | Integer | +| BASE_CAMP_MAX_NUM | BaseCampMaxNum | Maximum number of base camps | 128 | Integer | +| BASE_CAMP_WORKER_MAXNUM | BaseCampWorkerMaxNum | Maximum number of workers | 15 | Integer | +| DROP_ITEM_ALIVE_MAX_HOURS | DropItemAliveMaxHours | Time it takes for items to despawn in hours | 1.000000 | Float | +| AUTO_RESET_GUILD_NO_ONLINE_PLAYERS | bAutoResetGuildNoOnlinePlayers | Automatically reset guild when no players are online | false | Bool | +| AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS | AutoResetGuildTimeNoOnlinePlayers | Time to automatically reset guild when no players are online | 72.000000 | Float | +| GUILD_PLAYER_MAX_NUM | GuildPlayerMaxNum | Max player of Guild | 20 | Integer | +| PAL_EGG_DEFAULT_HATCHING_TIME | PalEggDefaultHatchingTime | Time(h) to incubate massive egg | 72.000000 | Float | +| WORK_SPEED_RATE | WorkSpeedRate | Work speed muliplier | 1.000000 | Float | +| IS_MULTIPLAY | bIsMultiplay | Enable multiplayer | false | Boolean | +| IS_PVP | bIsPvP | Enable PVP | false | Boolean | +| CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP | bCanPickupOtherGuildDeathPenaltyDrop | Allow players from other guilds to pick up death penalty items | false | Boolean | +| ENABLE_NON_LOGIN_PENALTY | bEnableNonLoginPenalty | Enable non-login penalty | true | Boolean | +| ENABLE_FAST_TRAVEL | bEnableFastTravel | Enable fast travel | true | Boolean | +| IS_START_LOCATION_SELECT_BY_MAP | bIsStartLocationSelectByMap | Enable selecting of start location | true | Boolean | +| EXIST_PLAYER_AFTER_LOGOUT | bExistPlayerAfterLogout | Toggle for deleting players when they log off | false | Boolean | +| ENABLE_DEFENSE_OTHER_GUILD_PLAYER | bEnableDefenseOtherGuildPlayer | Allows defense against other guild players | false | Boolean | +| COOP_PLAYER_MAX_NUM | CoopPlayerMaxNum | Maximum number of players in a guild | 4 | Integer | +| MAX_PLAYERS | ServerPlayerMaxNum | Maximum number of people who can join the server | 32 | Integer | +| SERVER_NAME | ServerName | Server name | jammsen-docker-generated-###RANDOM### | Integer | +| SERVER_DESCRIPTION | ServerDescription | Server description | Palworld-Dedicated-Server running in Docker by jammsen | String | +| ADMIN_PASSWORD | server admin password | AdminPassword | adminPasswordHere | String | +| SERVER_PASSWORD | AdminPassword | Set the server password. | serverPasswordHere | String | +| PUBLIC_PORT | public port | Public port number | 8211 | Integer | +| PUBLIC_IP | public ip | Public IP | | String | +| RCON_ENABLED | RCONEnabled | Enable RCON - Use ADMIN_PASSWORD to login | false | Boolean | +| RCON_PORT | RCONPort | Port number for RCON | 25575 | Integer | +| REGION | Region | Area | | String | +| USEAUTH | bUseAuth | Use authentication | true | Boolean | +| BAN_LIST_URL | BanListURL | Which ban list to use | https://api.palworldgame.com/api/banlist.txt | String | ## Docker-Compose examples ### Standalone gameserver + ```yml version: '3.9' services: @@ -69,31 +169,85 @@ services: published: 8211 # Gamerserver port on your host protocol: udp mode: host - - target: 25575 # RCon port inside of the container - published: 25575 # RCon port on your host + - target: 25575 # RCON port inside of the container + published: 25575 # RCON port on your host protocol: tcp mode: host environment: - TZ=Europe/Berlin # Change this for logging and backup, see "Environment-Variables" - ALWAYS_UPDATE_ON_START=true - - MAX_PLAYERS=32 - MULTITHREAD_ENABLED=true - COMMUNITY_SERVER=true - - RCON_ENABLED=true - - RCON_PORT=25575 - - PUBLIC_IP=10.0.0.5 - - PUBLIC_PORT=8211 + - BACKUP_ENABLED=true + - BACKUP_CRON_EXPRESSION=0 * * * * + - DIFFICULTY=None + - DAYTIME_SPEEDRATE=1.000000 + - NIGHTTIME_SPEEDRATE=1.000000 + - EXP_RATE=1.000000 + - PAL_CAPTURE_RATE=1.000000 + - PAL_SPAWN_NUM_RATE=1.000000 + - PAL_DAMAGE_RATE_ATTACK=1.000000 + - PAL_DAMAGE_RATE_DEFENSE=1.000000 + - PLAYER_DAMAGE_RATE_ATTACK=1.000000 + - PLAYER_DAMAGE_RATE_DEFENSE=1.000000 + - PLAYER_STOMACH_DECREASE_RATE=1.000000 + - PLAYER_STAMINA_DECREACE_RATE=1.000000 + - PLAYER_AUTO_HP_REGENE_RATE=1.000000 + - PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000 + - PAL_STOMACH_DECREACE_RATE=1.000000 + - PAL_STAMINA_DECREACE_RATE=1.000000 + - PAL_AUTO_HP_REGENE_RATE=1.000000 + - PAL_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000 + - BUILD_OBJECT_DAMAGE_RATE=1.000000 + - BUILD_OBJECT_DETERIORATION_DAMAGE_RATE=1.000000 + - COLLECTION_DROP_RATE=1.000000 + - COLLECTION_OBJECT_HP_RATE=1.000000 + - COLLECTION_OBJECT_RESPAWN_SPEED_RATE=1.000000 + - ENEMY_DROP_ITEM_RATE=1.000000 + - DEATH_PENALTY=All + - ENABLE_PLAYER_TO_PLAYER_DAMAGE=false + - ENABLE_FRIENDLY_FIRE=false + - ENABLE_INVADER_ENEMY=true + - ACTIVE_UNKO=false + - ENABLE_AIM_ASSIST_PAD=true + - ENABLE_AIM_ASSIST_KEYBOARD=false + - DROP_ITEM_MAX_NUM=3000 + - DROP_ITEM_MAX_NUM_UNKO=100 + - BASE_CAMP_MAX_NUM=128 + - BASE_CAMP_WORKER_MAXNUM=15 + - DROP_ITEM_ALIVE_MAX_HOURS=1.000000 + - AUTO_RESET_GUILD_NO_ONLINE_PLAYERS=false + - AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS=72.000000 + - GUILD_PLAYER_MAX_NUM=20 + - PAL_EGG_DEFAULT_HATCHING_TIME=72.000000 + - WORK_SPEED_RATE=1.000000 + - IS_MULTIPLAY=false + - IS_PVP=false + - CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP=false + - ENABLE_NON_LOGIN_PENALTY=true + - ENABLE_FAST_TRAVEL=true + - IS_START_LOCATION_SELECT_BY_MAP=true + - EXIST_PLAYER_AFTER_LOGOUT=false + - ENABLE_DEFENSE_OTHER_GUILD_PLAYER=false + - COOP_PLAYER_MAX_NUM=4 + - MAX_PLAYERS=32 - SERVER_NAME=jammsen-docker-generated-###RANDOM### - SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen - - SERVER_PASSWORD=serverPasswordHere - ADMIN_PASSWORD=adminPasswordHere - - BACKUP_ENABLED=true - - BACKUP_CRON_EXPRESSION=0 * * * * - - TZ=UTC + - SERVER_PASSWORD=serverPasswordHere + - PUBLIC_PORT=8211 + - PUBLIC_IP= + - RCON_ENABLED=false + - RCON_PORT=25575 + - REGION= + - USEAUTH=true + - BAN_LIST_URL=https://api.palworldgame.com/api/banlist.txt volumes: - ./game:/palworld ``` + ### Gameserver with RCON + ```yml version: '3.9' services: @@ -108,27 +262,79 @@ services: published: 8211 # Gamerserver port on your host protocol: udp mode: host - - target: 25575 # RCon port inside of the container - published: 25575 # RCon port on your host + - target: 25575 # RCON port inside of the container + published: 25575 # RCON port on your host protocol: tcp mode: host environment: - TZ=Europe/Berlin # Change this for logging and backup, see "Environment-Variables" - ALWAYS_UPDATE_ON_START=true - - MAX_PLAYERS=32 - MULTITHREAD_ENABLED=true - COMMUNITY_SERVER=true - - RCON_ENABLED=true - - RCON_PORT=25575 - - PUBLIC_IP=10.0.0.5 - - PUBLIC_PORT=8211 + - BACKUP_ENABLED=true + - BACKUP_CRON_EXPRESSION=0 * * * * + - DIFFICULTY=None + - DAYTIME_SPEEDRATE=1.000000 + - NIGHTTIME_SPEEDRATE=1.000000 + - EXP_RATE=1.000000 + - PAL_CAPTURE_RATE=1.000000 + - PAL_SPAWN_NUM_RATE=1.000000 + - PAL_DAMAGE_RATE_ATTACK=1.000000 + - PAL_DAMAGE_RATE_DEFENSE=1.000000 + - PLAYER_DAMAGE_RATE_ATTACK=1.000000 + - PLAYER_DAMAGE_RATE_DEFENSE=1.000000 + - PLAYER_STOMACH_DECREASE_RATE=1.000000 + - PLAYER_STAMINA_DECREACE_RATE=1.000000 + - PLAYER_AUTO_HP_REGENE_RATE=1.000000 + - PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000 + - PAL_STOMACH_DECREACE_RATE=1.000000 + - PAL_STAMINA_DECREACE_RATE=1.000000 + - PAL_AUTO_HP_REGENE_RATE=1.000000 + - PAL_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000 + - BUILD_OBJECT_DAMAGE_RATE=1.000000 + - BUILD_OBJECT_DETERIORATION_DAMAGE_RATE=1.000000 + - COLLECTION_DROP_RATE=1.000000 + - COLLECTION_OBJECT_HP_RATE=1.000000 + - COLLECTION_OBJECT_RESPAWN_SPEED_RATE=1.000000 + - ENEMY_DROP_ITEM_RATE=1.000000 + - DEATH_PENALTY=All + - ENABLE_PLAYER_TO_PLAYER_DAMAGE=false + - ENABLE_FRIENDLY_FIRE=false + - ENABLE_INVADER_ENEMY=true + - ACTIVE_UNKO=false + - ENABLE_AIM_ASSIST_PAD=true + - ENABLE_AIM_ASSIST_KEYBOARD=false + - DROP_ITEM_MAX_NUM=3000 + - DROP_ITEM_MAX_NUM_UNKO=100 + - BASE_CAMP_MAX_NUM=128 + - BASE_CAMP_WORKER_MAXNUM=15 + - DROP_ITEM_ALIVE_MAX_HOURS=1.000000 + - AUTO_RESET_GUILD_NO_ONLINE_PLAYERS=false + - AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS=72.000000 + - GUILD_PLAYER_MAX_NUM=20 + - PAL_EGG_DEFAULT_HATCHING_TIME=72.000000 + - WORK_SPEED_RATE=1.000000 + - IS_MULTIPLAY=false + - IS_PVP=false + - CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP=false + - ENABLE_NON_LOGIN_PENALTY=true + - ENABLE_FAST_TRAVEL=true + - IS_START_LOCATION_SELECT_BY_MAP=true + - EXIST_PLAYER_AFTER_LOGOUT=false + - ENABLE_DEFENSE_OTHER_GUILD_PLAYER=false + - COOP_PLAYER_MAX_NUM=4 + - MAX_PLAYERS=32 - SERVER_NAME=jammsen-docker-generated-###RANDOM### - SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen - - SERVER_PASSWORD=serverPasswordHere - ADMIN_PASSWORD=adminPasswordHere - - BACKUP_ENABLED=true - - BACKUP_CRON_EXPRESSION=0 * * * * - - TZ=UTC + - SERVER_PASSWORD=serverPasswordHere + - PUBLIC_PORT=8211 + - PUBLIC_IP= + - RCON_ENABLED=false + - RCON_PORT=25575 + - REGION= + - USEAUTH=true + - BAN_LIST_URL=https://api.palworldgame.com/api/banlist.txt volumes: - ./game:/palworld @@ -137,9 +343,12 @@ services: entrypoint: ['/rcon', '-a', '10.0.0.5:25575', '-p', 'adminPasswordHere'] profiles: ['rcon'] ``` -The profiles defintion, prevents the container from starting with the server and in your console you can run now RCON commands via -#### RCON -In your shell you can now run commands against the gameserver via RCON + +*Note: The profiles defintion, prevents the container from starting with the server, this is on purpose, because of Docker-Compose's ability to run container over the CLI, after the start* + +#### Run RCON commands + +In your shell, you can now run commands against the gameserver via Docker-Compose and RCON ```shell $ docker compose run --rm rcon ShowPlayers name,playeruid,steamid @@ -166,5 +375,6 @@ Errors like `[S_API FAIL] Tried to access Steam interface SteamUser021 before St ## Software used -- CM2Network SteamCMD (Officially recommended by Valve - https://developer.valvesoftware.com/wiki/SteamCMD#Docker) +- CM2Network SteamCMD - Debian-based (Officially recommended by Valve - https://developer.valvesoftware.com/wiki/SteamCMD#Docker) +- Supercronic - https://github.com/aptible/supercronic - Palworld Dedicated Server (APP-ID: 2394010 - https://steamdb.info/app/2394010/config/) diff --git a/servermanager.sh b/servermanager.sh index 44676ec..a2028e5 100644 --- a/servermanager.sh +++ b/servermanager.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Stop on errors, comment in, if needed +#set -e + GAME_PATH="/palworld" function installServer() { @@ -22,6 +25,7 @@ function startServer() { echo ">>> Starting the gameserver" cd $GAME_PATH + echo ">>> Setting up setting ..." echo "Checking if config exists" if [ ! -f ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini ]; then echo "No config found, generating one" @@ -32,17 +36,209 @@ function startServer() { cp ${GAME_PATH}/DefaultPalWorldSettings.ini ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi - if [[ ! -z ${RCON_ENABLED+x} ]]; then - echo "Setting rcon-enabled to $RCON_ENABLED" - sed -i "s/RCONEnabled=[a-zA-Z]*/RCONEnabled=$RCON_ENABLED/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + if [[ ! -z ${DIFFICULTY+x} ]]; then + echo "Setting Difficulty to $DIFFICULTY" + sed -i "s/Difficulty=[a-zA-Z]*/Difficulty=$DIFFICULTY/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi - if [[ ! -z ${PUBLIC_IP+x} ]]; then - echo "Setting public ip to $PUBLIC_IP" - sed -i "s/PublicIP=\"[^\"]*\"/PublicIP=\"$PUBLIC_IP\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + if [[ ! -z ${DAYTIME_SPEEDRATE+x} ]]; then + echo "Setting DayTimeSpeedRate to $DAYTIME_SPEEDRATE" + sed -i "s/DayTimeSpeedRate=[+-]?([0-9]*[.])?[0-9]+/DayTimeSpeedRate=$DAYTIME_SPEEDRATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi - if [[ ! -z ${PUBLIC_PORT+x} ]]; then - echo "Setting public port to $PUBLIC_PORT" - sed -i "s/PublicPort=[0-9]*/PublicPort=$PUBLIC_PORT/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + if [[ ! -z ${NIGHTTIME_SPEEDRATE+x} ]]; then + echo "Setting NightTimeSpeedRate to $NIGHTTIME_SPEEDRATE" + sed -i "s/NightTimeSpeedRate=[+-]?([0-9]*[.])?[0-9]+/NightTimeSpeedRate=$NIGHTTIME_SPEEDRATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${EXP_RATE+x} ]]; then + echo "Setting ExpRate to $EXP_RATE" + sed -i "s/ExpRate=[+-]?([0-9]*[.])?[0-9]+/ExpRate=$EXP_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_CAPTURE_RATE+x} ]]; then + echo "Setting PalCaptureRate to $PAL_CAPTURE_RATE" + sed -i "s/PalCaptureRate=[+-]?([0-9]*[.])?[0-9]+/PalCaptureRate=$PAL_CAPTURE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_SPAWN_NUM_RATE+x} ]]; then + echo "Setting PalSpawnNumRate to $PAL_SPAWN_NUM_RATE" + sed -i "s/PalSpawnNumRate=[+-]?([0-9]*[.])?[0-9]+/PalSpawnNumRate=$PAL_SPAWN_NUM_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_DAMAGE_RATE_ATTACK+x} ]]; then + echo "Setting PalDamageRateAttack to $PAL_DAMAGE_RATE_ATTACK" + sed -i "s/PalDamageRateAttack=[+-]?([0-9]*[.])?[0-9]+/PalDamageRateAttack=$PAL_DAMAGE_RATE_ATTACK/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_DAMAGE_RATE_DEFENSE+x} ]]; then + echo "Setting PalDamageRateDefense to $PAL_DAMAGE_RATE_DEFENSE" + sed -i "s/PalDamageRateDefense=[+-]?([0-9]*[.])?[0-9]+/PalDamageRateDefense=$PAL_DAMAGE_RATE_DEFENSE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_DAMAGE_RATE_ATTACK+x} ]]; then + echo "Setting PlayerDamageRateAttack to $PLAYER_DAMAGE_RATE_ATTACK" + sed -i "s/PlayerDamageRateAttack=[+-]?([0-9]*[.])?[0-9]+/PlayerDamageRateAttack=$PLAYER_DAMAGE_RATE_ATTACK/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_DAMAGE_RATE_DEFENSE+x} ]]; then + echo "Setting PlayerDamageRateDefense to $PLAYER_DAMAGE_RATE_DEFENSE" + sed -i "s/PlayerDamageRateDefense=[+-]?([0-9]*[.])?[0-9]+/PlayerDamageRateDefense=$PLAYER_DAMAGE_RATE_DEFENSE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_STOMACH_DECREASE_RATE+x} ]]; then + echo "Setting PlayerStomachDecreaceRate to $PLAYER_STOMACH_DECREASE_RATE" + sed -i "s/PlayerStomachDecreaceRate=[+-]?([0-9]*[.])?[0-9]+/PlayerStomachDecreaceRate=$PLAYER_STOMACH_DECREASE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_STAMINA_DECREACE_RATE+x} ]]; then + echo "Setting PlayerStaminaDecreaceRate to $PLAYER_STAMINA_DECREACE_RATE" + sed -i "s/PlayerStaminaDecreaceRate=[+-]?([0-9]*[.])?[0-9]+/PlayerStaminaDecreaceRate=$PLAYER_STAMINA_DECREACE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_AUTO_HP_REGENE_RATE+x} ]]; then + echo "Setting PlayerAutoHPRegeneRate to $PLAYER_AUTO_HP_REGENE_RATE" + sed -i "s/PlayerAutoHPRegeneRate=[+-]?([0-9]*[.])?[0-9]+/PlayerAutoHPRegeneRate=$PLAYER_AUTO_HP_REGENE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP+x} ]]; then + echo "Setting PlayerAutoHpRegeneRateInSleep to $PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP" + sed -i "s/PlayerAutoHpRegeneRateInSleep=[+-]?([0-9]*[.])?[0-9]+/PlayerAutoHpRegeneRateInSleep=$PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_STOMACH_DECREACE_RATE+x} ]]; then + echo "Setting PalStomachDecreaceRate to $PAL_STOMACH_DECREACE_RATE" + sed -i "s/PalStomachDecreaceRate=[+-]?([0-9]*[.])?[0-9]+/PalStomachDecreaceRate=$PAL_STOMACH_DECREACE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_STAMINA_DECREACE_RATE+x} ]]; then + echo "Setting PalStaminaDecreaceRate to $X" + sed -i "s/PalStaminaDecreaceRate=[+-]?([0-9]*[.])?[0-9]+/PalStaminaDecreaceRate=$PAL_STAMINA_DECREACE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_AUTO_HP_REGENE_RATE+x} ]]; then + echo "Setting PalAutoHPRegeneRate to $PAL_AUTO_HP_REGENE_RATE" + sed -i "s/PalAutoHPRegeneRate=[+-]?([0-9]*[.])?[0-9]+/PalAutoHPRegeneRate=$PAL_AUTO_HP_REGENE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_AUTO_HP_REGENE_RATE_IN_SLEEP+x} ]]; then + echo "Setting PalAutoHpRegeneRateInSleep to $PAL_AUTO_HP_REGENE_RATE_IN_SLEEP" + sed -i "s/PalAutoHpRegeneRateInSleep=[+-]?([0-9]*[.])?[0-9]+/PalAutoHpRegeneRateInSleep=$PAL_AUTO_HP_REGENE_RATE_IN_SLEEP/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${BUILD_OBJECT_DAMAGE_RATE+x} ]]; then + echo "Setting BuildObjectDamageRate to $BUILD_OBJECT_DAMAGE_RATE" + sed -i "s/BuildObjectDamageRate=[+-]?([0-9]*[.])?[0-9]+/BuildObjectDamageRate=$BUILD_OBJECT_DAMAGE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${BUILD_OBJECT_DETERIORATION_DAMAGE_RATE+x} ]]; then + echo "Setting PalAutoHpRegeneRateInSleep to $BUILD_OBJECT_DETERIORATION_DAMAGE_RATE" + sed -i "s/PalAutoHpRegeneRateInSleep=[+-]?([0-9]*[.])?[0-9]+/PalAutoHpRegeneRateInSleep=$BUILD_OBJECT_DETERIORATION_DAMAGE_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${COLLECTION_DROP_RATE+x} ]]; then + echo "Setting CollectionDropRate to $COLLECTION_DROP_RATE" + sed -i "s/CollectionDropRate=[+-]?([0-9]*[.])?[0-9]+/CollectionDropRate=$COLLECTION_DROP_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${COLLECTION_OBJECT_HP_RATE+x} ]]; then + echo "Setting CollectionObjectHpRate to $COLLECTION_OBJECT_HP_RATE" + sed -i "s/CollectionObjectHpRate=[+-]?([0-9]*[.])?[0-9]+/CollectionObjectHpRate=$COLLECTION_OBJECT_HP_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${COLLECTION_OBJECT_RESPAWN_SPEED_RATE+x} ]]; then + echo "Setting CollectionObjectRespawnSpeedRate to $COLLECTION_OBJECT_RESPAWN_SPEED_RATE" + sed -i "s/CollectionObjectRespawnSpeedRate=[+-]?([0-9]*[.])?[0-9]+/CollectionObjectRespawnSpeedRate=$COLLECTION_OBJECT_RESPAWN_SPEED_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENEMY_DROP_ITEM_RATE+x} ]]; then + echo "Setting EnemyDropItemRate to $ENEMY_DROP_ITEM_RATE" + sed -i "s/EnemyDropItemRate=[+-]?([0-9]*[.])?[0-9]+/EnemyDropItemRate=$ENEMY_DROP_ITEM_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${DEATH_PENALTY+x} ]]; then + echo "Setting DeathPenalty to $DEATH_PENALTY" + sed -i "s/DeathPenalty=[a-zA-Z]*/DeathPenalty=$DEATH_PENALTY/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_PLAYER_TO_PLAYER_DAMAGE+x} ]]; then + echo "Setting bEnablePlayerToPlayerDamage to $ENABLE_PLAYER_TO_PLAYER_DAMAGE" + sed -i "s/bEnablePlayerToPlayerDamage=[a-zA-Z]*/bEnablePlayerToPlayerDamage=$ENABLE_PLAYER_TO_PLAYER_DAMAGE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_FRIENDLY_FIRE+x} ]]; then + echo "Setting bEnableFriendlyFire to $ENABLE_FRIENDLY_FIRE" + sed -i "s/bEnableFriendlyFire=[a-zA-Z]*/bEnableFriendlyFire=$ENABLE_FRIENDLY_FIRE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_INVADER_ENEMY+x} ]]; then + echo "Setting bEnableInvaderEnemy to $ENABLE_INVADER_ENEMY" + sed -i "s/bEnableInvaderEnemy=[a-zA-Z]*/bEnableInvaderEnemy=$ENABLE_INVADER_ENEMY/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ACTIVE_UNKO+x} ]]; then + echo "Setting bActiveUNKO to $ACTIVE_UNKO" + sed -i "s/bActiveUNKO=[a-zA-Z]*/bActiveUNKO=$ACTIVE_UNKO/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_AIM_ASSIST_PAD+x} ]]; then + echo "Setting bEnableAimAssistPad to $ENABLE_AIM_ASSIST_PAD" + sed -i "s/bEnableAimAssistPad=[a-zA-Z]*/bEnableAimAssistPad=$ENABLE_AIM_ASSIST_PAD/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_AIM_ASSIST_KEYBOARD+x} ]]; then + echo "Setting bEnableAimAssistKeyboard to $ENABLE_AIM_ASSIST_KEYBOARD" + sed -i "s/bEnableAimAssistKeyboard=[a-zA-Z]*/bEnableAimAssistKeyboard=$ENABLE_AIM_ASSIST_KEYBOARD/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${DROP_ITEM_MAX_NUM+x} ]]; then + echo "Setting DropItemMaxNum to $DROP_ITEM_MAX_NUM" + sed -i "s/DropItemMaxNum=[0-9]*/DropItemMaxNum=$DROP_ITEM_MAX_NUM/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${DROP_ITEM_MAX_NUM_UNKO+x} ]]; then + echo "Setting DropItemMaxNum_UNKO to $DROP_ITEM_MAX_NUM_UNKO" + sed -i "s/DropItemMaxNum_UNKO=[0-9]*/DropItemMaxNum_UNKO=$DROP_ITEM_MAX_NUM_UNKO/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${BASE_CAMP_MAX_NUM+x} ]]; then + echo "Setting BaseCampMaxNum to $BASE_CAMP_MAX_NUM" + sed -i "s/BaseCampMaxNum=[0-9]*/BaseCampMaxNum=$BASE_CAMP_MAX_NUM/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${BASE_CAMP_WORKER_MAXNUM+x} ]]; then + echo "Setting BaseCampWorkerMaxNum to $BASE_CAMP_WORKER_MAXNUM" + sed -i "s/BaseCampWorkerMaxNum=[0-9]*/BaseCampWorkerMaxNum=$BASE_CAMP_WORKER_MAXNUM/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${DROP_ITEM_ALIVE_MAX_HOURS+x} ]]; then + echo "Setting DropItemAliveMaxHours to $DROP_ITEM_ALIVE_MAX_HOURS" + sed -i "s/DropItemAliveMaxHours=[+-]?([0-9]*[.])?[0-9]+/DropItemAliveMaxHours=$DROP_ITEM_ALIVE_MAX_HOURS/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${AUTO_RESET_GUILD_NO_ONLINE_PLAYERS+x} ]]; then + echo "Setting bAutoResetGuildNoOnlinePlayers to $AUTO_RESET_GUILD_NO_ONLINE_PLAYERS" + sed -i "s/bAutoResetGuildNoOnlinePlayers=[a-zA-Z]*/bAutoResetGuildNoOnlinePlayers=$AUTO_RESET_GUILD_NO_ONLINE_PLAYERS/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS+x} ]]; then + echo "Setting AutoResetGuildTimeNoOnlinePlayers to $AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS" + sed -i "s/AutoResetGuildTimeNoOnlinePlayers=[+-]?([0-9]*[.])?[0-9]+/AutoResetGuildTimeNoOnlinePlayers=$AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${GUILD_PLAYER_MAX_NUM+x} ]]; then + echo "Setting GuildPlayerMaxNum to $GUILD_PLAYER_MAX_NUM" + sed -i "s/GuildPlayerMaxNum=[0-9]*/GuildPlayerMaxNum=$GUILD_PLAYER_MAX_NUM/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${PAL_EGG_DEFAULT_HATCHING_TIME+x} ]]; then + echo "Setting PalEggDefaultHatchingTime to $PAL_EGG_DEFAULT_HATCHING_TIME" + sed -i "s/PalEggDefaultHatchingTime=[+-]?([0-9]*[.])?[0-9]+/PalEggDefaultHatchingTime=$PAL_EGG_DEFAULT_HATCHING_TIME/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${WORK_SPEED_RATE+x} ]]; then + echo "Setting WorkSpeedRate to $WORK_SPEED_RATE" + sed -i "s/WorkSpeedRate=[+-]?([0-9]*[.])?[0-9]+/WorkSpeedRate=$WORK_SPEED_RATE/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${IS_MULTIPLAY+x} ]]; then + echo "Setting bIsMultiplay to $IS_MULTIPLAY" + sed -i "s/bIsMultiplay=[a-zA-Z]*/bIsMultiplay=$IS_MULTIPLAY/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${IS_PVP+x} ]]; then + echo "Setting bIsPvP to $IS_PVP" + sed -i "s/bIsPvP=[a-zA-Z]*/bIsPvP=$IS_PVP/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP+x} ]]; then + echo "Setting bCanPickupOtherGuildDeathPenaltyDrop to $CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP" + sed -i "s/bCanPickupOtherGuildDeathPenaltyDrop=[a-zA-Z]*/bCanPickupOtherGuildDeathPenaltyDrop=$CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_NON_LOGIN_PENALTY+x} ]]; then + echo "Setting bEnableNonLoginPenalty to $ENABLE_NON_LOGIN_PENALTY" + sed -i "s/bEnableNonLoginPenalty=[a-zA-Z]*/bEnableNonLoginPenalty=$ENABLE_NON_LOGIN_PENALTY/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_FAST_TRAVEL+x} ]]; then + echo "Setting bEnableFastTravel to $ENABLE_FAST_TRAVEL" + sed -i "s/bEnableFastTravel=[a-zA-Z]*/bEnableFastTravel=$ENABLE_FAST_TRAVEL/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${IS_START_LOCATION_SELECT_BY_MAP+x} ]]; then + echo "Setting bIsStartLocationSelectByMap to $IS_START_LOCATION_SELECT_BY_MAP" + sed -i "s/bIsStartLocationSelectByMap=[a-zA-Z]*/bIsStartLocationSelectByMap=$IS_START_LOCATION_SELECT_BY_MAP/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${EXIST_PLAYER_AFTER_LOGOUT+x} ]]; then + echo "Setting bExistPlayerAfterLogout to $EXIST_PLAYER_AFTER_LOGOUT" + sed -i "s/bExistPlayerAfterLogout=[a-zA-Z]*/bExistPlayerAfterLogout=$EXIST_PLAYER_AFTER_LOGOUT/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${ENABLE_DEFENSE_OTHER_GUILD_PLAYER+x} ]]; then + echo "Setting bEnableDefenseOtherGuildPlayer to $ENABLE_DEFENSE_OTHER_GUILD_PLAYER" + sed -i "s/bEnableDefenseOtherGuildPlayer=[a-zA-Z]*/bEnableDefenseOtherGuildPlayer=$ENABLE_DEFENSE_OTHER_GUILD_PLAYER/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${COOP_PLAYER_MAX_NUM+x} ]]; then + echo "Setting CoopPlayerMaxNum to $COOP_PLAYER_MAX_NUM" + sed -i "s/CoopPlayerMaxNum=[+-]?([0-9]*[.])?[0-9]+/CoopPlayerMaxNum=$COOP_PLAYER_MAX_NUM/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${MAX_PLAYERS+x} ]]; then + echo "Setting max-players to $MAX_PLAYERS" + sed -i "s/ServerPlayerMaxNum=[0-9]*/ServerPlayerMaxNum=$MAX_PLAYERS/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi if [[ ! -z ${SERVER_NAME+x} ]]; then echo "Setting server name to $SERVER_NAME" @@ -58,18 +254,44 @@ function startServer() { echo "Setting server description to $SERVER_DESCRIPTION" sed -i "s/ServerDescription=\"[^\"]*\"/ServerDescription=\"$SERVER_DESCRIPTION\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi + if [[ ! -z ${ADMIN_PASSWORD+x} ]]; then + echo "Setting server admin password to $ADMIN_PASSWORD" + sed -i "s/AdminPassword=\"[^\"]*\"/AdminPassword=\"$ADMIN_PASSWORD\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi if [[ ! -z ${SERVER_PASSWORD+x} ]]; then echo "Setting server password to $SERVER_PASSWORD" sed -i "s/ServerPassword=\"[^\"]*\"/ServerPassword=\"$SERVER_PASSWORD\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi - if [[ ! -z ${ADMIN_PASSWORD+x} ]]; then - echo "Setting server admin password to $ADMIN_PASSWORD" - sed -i "s/AdminPassword=\"[^\"]*\"/AdminPassword=\"$ADMIN_PASSWORD\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + if [[ ! -z ${PUBLIC_PORT+x} ]]; then + echo "Setting public port to $PUBLIC_PORT" + sed -i "s/PublicPort=[0-9]*/PublicPort=$PUBLIC_PORT/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi - if [[ ! -z ${MAX_PLAYERS+x} ]]; then - echo "Setting max-players to $MAX_PLAYERS" - sed -i "s/ServerPlayerMaxNum=[0-9]*/ServerPlayerMaxNum=$MAX_PLAYERS/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + if [[ ! -z ${PUBLIC_IP+x} ]]; then + echo "Setting public ip to $PUBLIC_IP" + sed -i "s/PublicIP=\"[^\"]*\"/PublicIP=\"$PUBLIC_IP\"/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${RCON_ENABLED+x} ]]; then + echo "Setting rcon-enabled to $RCON_ENABLED" + sed -i "s/RCONEnabled=[a-zA-Z]*/RCONEnabled=$RCON_ENABLED/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini fi + if [[ ! -z ${RCON_PORT+x} ]]; then + echo "Setting RCONPort to $RCON_PORT" + sed -i "s/RCONPort=[0-9]*/RCONPort=$RCON_PORT/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${REGION+x} ]]; then + echo "Setting Region to $REGION" + sed -i "s/Region=[a-zA-Z]*/Region=$REGION/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${USEAUTH+x} ]]; then + echo "Setting bUseAuth to $USEAUTH" + sed -i "s/bUseAuth=[a-zA-Z]*/bUseAuth=$USEAUTH/" ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + if [[ ! -z ${BAN_LIST_URL+x} ]]; then + echo "Setting BanListURL to $BAN_LIST_URL" + sed -i 's/BanListURL=(((ftp|http|https):\/\/)|(\/)|(..\/))(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/BanListURL=$BAN_LIST_URL/g' ${GAME_PATH}/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini + fi + echo ">>> Finished setting up setting ..." + START_OPTIONS="" if [[ -n $COMMUNITY_SERVER ]] && [[ $COMMUNITY_SERVER == "true" ]]; then