Palworld幻兽帕鲁专业服务器搭建

Foreword

幻兽帕鲁,宝可梦版方舟,还缝合了一点塞尔达,The Survivalists,有意思,啥时候GF能做个这样的宝可梦游戏啊

本身支持小服务器4人联机,也支持大服务器32人联机,刚好有独立服务器,可以开一个玩一下。

服务器需求

image-20240120154407599

  • CPU,4cores
  • RAM,8G
  • Network,Port UDP 8211
  • 硬盘,50G

这是推荐配置,我直接8c,16g,防止出问题,使用Ubuntu来安装

  • 后面发现12个人内存16g就满了(大概率造成某些玩家卡档黑屏无法进入,需要删档),后续扩展到了32g
  • 32g后期其实也不太够,扩展到了48g,再也不用担心爆内存了

平均一个玩家1g内存占用,越往后期占用越高,所以内存能大尽量大

  • 内存使用逻辑和探图有关系,就算只有3个玩家依然可以占用20g内存,在一次重启以后,玩家走过的地图面积越大,内存占用越大

服务器无人在线的情况下已经用到了30g内存,拓宽到48g保平安是最好的

image-20240128155917173

对于网络带宽的需求应该是小于10M的,多数小水管都够跑了

image-20240121180736062

linux

安装

首先安装steamcmd

sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt install steamcmd

安装PalServer

steamcmd +login anonymous +app_update 2394010 validate +quit
cd ~/Steam/steamapps/common/PalServer
./PalServer.sh

路由上开放UDP端口8211即可

更新

一样使用这个代码进行更新就行了

steamcmd +login anonymous +app_update 2394010 validate +quit

常见问题

连不上steam

安装PalServer可能会一直重试,最后失败,这是由于连不上steam,所以服务器最好挂个代理

Loading Steam API...dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
Connecting anonymously to Steam Public...Retrying. . . 
Retrying. . . 
Retrying. . . 
Retrying. . . 


FAILED (No Connection)

修改默认网关,走透明代理,我这里自己的网关

route add default gw 192.168.6.232

恢复网关

route add default gw 192.168.6.1

挂上透明代理以后,正常安装了

缺少sdk

第一次运行./PalServer.sh大概率会出现类似的错误

/home/el/.steam/sdk64/steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Sys_LoadModule failed to load: /home/el/.steam/sdk64/steamclient.so

安装一下相关的sdk

mkdir -p ~/.steam/sdk64/
steamcmd +login anonymous +app_update 1007 +quit
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/

就恢复正常了

缺少steamclient.so

第二次运行./PalServer.sh,可能会提示steamclient.so找不到,这个问题可以忽略,实际上找到了

$ ./PalServer.sh
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
dlopen failed trying to load:
steamclient.so
with error:
steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Loaded '/home/ubuntu/.steam/sdk64/steamclient.so' OK.  (First tried local 'steamclient.so')

其他可能服务器太老了,包没更新之类的问题

sudo apt update
sudo add-apt-repository --remove ppa:whatever/ppa
sudo apt install steam
sudo apt-get -f install

设置服务器密码反而进不去

设置服务器密码以后,只能通过游戏内服务器列表或者是历史游戏记录中进入,那样才有输入密码的提示框

直连IP或者域名反而没有任何提示框,会导致提示没有输入密码而进不去

25日后修复了,可以显示密码弹窗了

玩家卡档、黑屏

造成这个的原因大概率还是内存不够用导致的,我之前开的16g服务器,那会内存不够用,好几个人在退出以后再也进不去了。

https://tieba.baidu.com/p/8869855204?see_lz=0&qq-pf-to=pcqq.group

[BUG]服务器会有玩家随机坏档案,导致无法进入服务器 具体触发情况未知,会导致玩家UID变成00000000,然后这个玩家就再也进不了服务器了 网络问题排除过,服务端也重启了,游戏也重启了,必须删除这个玩家的档案才可以恢复进服

其他人都能正常进入,但是某些玩家进不去,这个是坏档问题,需要找到有问题的玩家存档,并且删除他的存档,重启服务器,然后他就能正常进入了,不过这样会造成他丢档,要重新玩

在有问题的玩家电脑上的steam里下载Palworld Dedicated Server,打开后再启动游戏进一次本地服务器127.0.0.1:8211,进入后随便创建一个人物,再去Palworld Dedicated Server的根目录PalServer\Pal\Saved\SaveGames\0\(随机ID)\Players内,会有一个唯一的乱码.sav玩家存档,那个就是你的存档文件,去服务器上找到同名文件删除即可。

Palworld Dedicated Server直接搜索安装即可

image-20240122000701569

出现这个问题,需要这个玩家自己建立服务器,并且创建人物,然后去查找他的ID是什么,这个ID在自己服和别人服是相同的,通过这种方式就能定位到,不过这样太麻烦了。实际可以通过服务器快速确定,建议服主提前存一下每个的ID界面,后续再删档就轻松了。

下面的数据需要服务器管理员登录,查看每个人的ID,进别人服务器,别的管理员也能看到这个ID,都是一样的

image-20240121172909439

就比如这里出问题的是xinghe,他的playerid是2078406141,转换成十六进制就是7BE1F5FD,那么存档里同名的就是他了

存档路径

~/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames/0/随机码/Players
类似:
/home/el/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames/0/BCE40ECCE406405EA86463114026317B/Players

image-20240121171728947

删除以后重启服务器,这个玩家就能正常进入游戏了

玩家进入以后最好退出一下公会,再重新加入,否则左键无法蓄力

  • 此条会引起更多的丢档

目前分析应该是玩家退会了,但是有玩家此时不在线,如果他上线,那么公会的信息就会同步了。

而这个信息又仅仅存在内存中,如果服务器重启了,内存清空了,那么必然会造成那个离线玩家信息不同步,进而导致下次再进入的时候他就卡黑屏了。

所以建议如果要重启,尽量是同一个公会的玩家尽量在重启前都上线一次,同步一下信息,再下线,再重启。

或者是这些玩家都是同一个时间下线的,那么后续不在线,服务器重启也不影响他们。

服务器设置

修改游戏设置

Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

类似:
/home/el/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer

默认这个文件是空的

cd ~/Steam/steamapps/common/PalServer/DefaultPalWorldSettings.ini

但是在这里有默认设置,复制一下根据这个修改即可

; This configuration file is a sample of the default server settings.
; Changes to this file will NOT be reflected on the server.
; To change the server settings, modify Pal/Saved/Config/LinuxServer/PalWorldSettings.ini.
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

    # 难度
    Difficulty=None,
    # 白天时间流速
    DayTimeSpeedRate=1.000000,
    # 夜晚时间流速
    NightTimeSpeedRate=1.000000,
    # 经验倍率
    ExpRate=2.000000,
    # 帕鲁捕捉倍率
    PalCaptureRate=2.000000,
    # 帕鲁重生数量倍率
    PalSpawnNumRate=1.000000,
    # 帕鲁伤害倍率
    PalDamageRateAttack=1.000000,
    # 帕鲁防御倍率
    PalDamageRateDefense=1.000000,
    # 玩家攻击倍率
    PlayerDamageRateAttack=1.000000,
    # 玩家防御倍率
    PlayerDamageRateDefense=1.000000,
    # 玩家饥饿消耗倍率
    PlayerStomachDecreaceRate=1.000000,
    # 玩家耐力消耗倍率
    PlayerStaminaDecreaceRate=1.000000,
    # 玩家HP恢复倍率
    PlayerAutoHPRegeneRate=1.000000,
    # 玩家休息时HP恢复倍率
    PlayerAutoHpRegeneRateInSleep=1.000000,
    # 帕鲁饥饿消耗倍率
    PalStomachDecreaceRate=1.000000,
    # 帕鲁耐力消耗倍率
    PalStaminaDecreaceRate=1.000000,
    # 帕鲁HP恢复倍率
    PalAutoHPRegeneRate=1.000000,
    # 帕鲁休息时HP恢复倍率
    PalAutoHpRegeneRateInSleep=1.000000,
    # 建筑伤害倍率
    BuildObjectDamageRate=1.000000,
    # 建筑老化倍率
    BuildObjectDeteriorationDamageRate=1.000000,
    # 采集掉落倍率
    CollectionDropRate=1.000000,
    # 可采集物恢复倍率
    CollectionObjectHpRate=1.000000,
    # 可采集物重生倍率
    CollectionObjectRespawnSpeedRate=1.000000,
    # 掉落倍率
    EnemyDropItemRate=1.000000,
    # 死亡是否掉落 ALL全掉 None不掉 Item仅掉落背包内的道具 ItemAndEquipment 除了帕鲁全掉
    DeathPenalty=None,
    # 是否允许玩家之间的伤害,PVP
    bEnablePlayerToPlayerDamage=False,
    # 是否允许友伤,包含帕鲁
    bEnableFriendlyFire=False,
    # 是否允许入侵事件
    bEnableInvaderEnemy=True,
    # 
    bActiveUNKO=False,
    # 手柄是否可以辅助瞄准
    bEnableAimAssistPad=True,
    # 键鼠是否可以辅助瞄准
    bEnableAimAssistKeyboard=False,
    # 地面最多存在掉落物数量
    DropItemMaxNum=3000,
    # 
    DropItemMaxNum_UNKO=100,
    # 最多据点数量
    BaseCampMaxNum=128,
    # 据点最多工作帕鲁数量
    BaseCampWorkerMaxNum=15,
    # 掉落物最多存在时间
    DropItemAliveMaxHours=1.000000,
    # 是否开启公会超时销毁
    bAutoResetGuildNoOnlinePlayers=False,
    # 公会超时销毁时间
    AutoResetGuildTimeNoOnlinePlayers=72.000000,
    # 公会人数上限
    GuildPlayerMaxNum=20,
    # 孵蛋消耗时间倍率
    PalEggDefaultHatchingTime=72.000000,
    # 帕鲁工作速率
    WorkSpeedRate=1.000000,
    # 多人游戏,PVP
    bIsMultiplay=False,
    # 开启PVP
    bIsPvP=False,
    # 是否可以捡其他部落的死亡掉落,PVP
    bCanPickupOtherGuildDeathPenaltyDrop=False,
    # 启用非登录惩罚,PVP
    bEnableNonLoginPenalty=True,
    # 是否可以快速传送
    bEnableFastTravel=True,
    # 是否可以选择出生点
    bIsStartLocationSelectByMap=True,
    # 所有玩家退出后自动关闭服务器
    bExistPlayerAfterLogout=False,
    # 是否受到其他公会伤害,PVP
    bEnableDefenseOtherGuildPlayer=False,
    # 合作玩家数量,似乎没用
    CoopPlayerMaxNum=4,
    # 服务器人数
    ServerPlayerMaxNum=32,
    ServerName="服务器名称",
    ServerDescription="服务器描述信息",
    # 管理员密码和RCON密码
    AdminPassword="",
    # 服务器密码建议先别设
    ServerPassword="",
    # 服务器端口
    PublicPort=8211,
    # 公网Ip 可以不设
    PublicIP="palworld.elmagnifico.tech",
    # RCON相关配置
    RCONEnabled=False,
    RCONPort=25575,
    # 地区配置
    Region="",
    #
    bUseAuth=True,
    # 
    BanListURL="https://api.palworldgame.com/api/banlist.txt"
  • PalSpawnNumRate,注意此倍率不要调整,内存消耗与此有关系,xN就是内存消耗xN,同时游戏内BOSS和野外帕鲁都会数量翻倍

设置密码

ServerPassword="123456"
  • 注意设置密码以后,默认通过IP的方式无法连接,稍微有点不方便

密码的临时解决办法:

首先在服务器列表页面,随便选一个带密码的服务器,输入你要去的服务器密码,但是不进去。

然后通过IP方式连接,这个时候游戏会使用刚才缓存的密码,就能正常进去了。

设置服务器名称

此处都可以用文中

ServerName="Default Palworld Server"

服务器描述

ServerDescription="点击链接加入QQ频道【elmagnifico's游戏屋】:https://pd.qq.com/s/enyor3z9m"

人数上限

ServerPlayerMaxNum=32

管理员密码

AdminPassword="123"

死亡掉落

死亡全掉落

DeathPenalty=All

死亡不掉落

DeathPenalty=None

测试

服务器正常启动提示:

dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
Setting breakpad minidump AppID = 2394010
[S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.

image-20240120194012313

服务器开久了好像FPS会下降,刚开始是60稳定的

image-20240121143459091

发现应该是和玩家数成正比的,超过4个人以后,这个FPS就开始下降了,估计20个人就10FPS了(事实确实如此)

正式启动

安装screen

apt install screen

使用一个独立的终端运行服务器

screen -S pal

image-20240121035519064

欢迎来玩,暂时没有设置密码

image-20240121035626927

服务器加入请使用如下地址

image-20240121035929638

palworld.elmagnifico.tech:8211

管理

管理员指令

用管理员密码登录服务器

/AdminPassword 密码

image-20240121035813548

显示当前玩家
/ShowPlayers

image-20240121035825055

其他命令类似

踢出
/KickPlayer [UserID]/[SteamID64]

封禁
/BanPlayer [UserID]/[SteamID64]

传送
/TeleportToPlayer {SteamID}

拉人
/TeleportToMe {SteamID}

存档
/Save

强制服务器退出
/DoExit

广播信息
/Broadcast {MessageText}

通知服务器在线玩家n秒后服务器关闭
/Shutdown {Seconds} {MessageText}
/Shutdown 240 4分钟后重启,请及时下线,否则有可能坏档
/Shutdown 300 5分钟后重启,请及时下线,否则有可能坏档

RCON

palworld支持RCON远程管理,方便服务器主操作

https://github.com/gorcon/rcon-cli

需要开启RCON和端口放行 RCON使用的是TCP,不是UDP

RCONEnabled=True
RCONPort=25575

之后就可以使用rcon.exe远程连接,之后输入指令和游戏中相同。甚至可以做出批脚本执行那就是后话了。

image-20240122150733509

  • ShowPlayers 命令会超时,应该是命令有问题

广播测试

rcon.exe -a 192.168.6.144:25575 -p 管理员密码 "Broadcast 测试一下"

重启脚本

rcon.exe -a 192.168.6.144:25575 -p 管理员密码 "Shutdown 300 5分钟后重启,请及时下线,否则有可能坏档"

存档修改

参考此工具修改存档的一些内容

https://github.com/cheahjs/palworld-save-tools

短评

Palworld 刚好填补了方舟疲软,方舟2迟迟不出,方舟1.5口碑倒退的空缺,宝可梦DLC没新意,英灵神殿千万销量以后新制作内容基本等于没有,天下苦“秦“久矣。同时即将过年,大家都有时间来玩了,更别说是一个联机游戏。

Palworld 很多宝可梦设定都借鉴了阿尔宙斯,而阿尔宙斯毫无疑问是近年宝可梦游戏中最好的一作。

Palworld 和创世理想乡是同一个制作组,而创世理想乡当时就是缝合了各种游戏,弄了一个四不像出来,虽然可以玩,但是热度很快就掉下去了。创世理想乡在当时很多东西没有制作完成,而游戏模式又没有以某一款游戏为主,而是东抄一点、西抄一点,游玩的目标不是很明确,虽然后续完善了,不过玩家已经没多少了。

Palworld 很明显有了创世理想乡的技术基础,再加上阿尔宙斯的主轴线路,稍稍完善,整体的体验就可以了,做出了宝可梦不敢做的东西。

短短3天就达成了400w销量,千万销量基本稳了,上一个这么火的游戏英灵神殿花了4周。

image-20240122000146826

Palworld同样是EA阶段开售,总体游戏体验没有明显bug,完整度是可以的。而游戏内容还有很多可填补的地方,希望Palworld别想理想乡一样,拖这么久都没做完,中途拿了钱就跑去开发其他游戏。他能像方舟和无人深空一样,用心开发两三年,这个游戏就很不错了,配上千万销量,算是独立游戏中的翘楚了。

image-20240125112114290

6天800w,晚高峰在线200w+,真是恐怖啊

Summary

简单配好以后就可以正常游玩了

Quote

https://developer.valvesoftware.com/wiki/SteamCMD#Linux

https://tech.palworldgame.com/dedicated-server-guide#windows

https://techraptor.net/gaming/guides/palworld-server-guide

https://tech.palworldgame.com/server-commands

https://tech.palworldgame.com/optimize-game-balance

https://tieba.baidu.com/p/8869855204?see_lz=0&qq-pf-to=pcqq.group

THE END