Valheim 難度與伺服器設定:英靈神殿專用伺服器的世界修正實測
在《英靈神殿》Valheim 專用伺服器上實測世界修正:每個預設與 -modifier 實際寫進世界的數值、-setkey 參數的正確寫法,以及死亡懲罰和里程碑(成就)會被停用的條件。
建立《英靈神殿》(Valheim)世界時選的難度與規則,也就是戰鬥、死亡懲罰、資源、突襲、傳送門和幾個勾選框,遊戲裡統稱為世界修正。但專用伺服器沒有這個選單,只能用啟動參數來指定。多數教學把那幾個參數列出來就結束了。
我們自己在營運英靈神殿專用伺服器,所以實測了每個參數到底往世界裡寫了什麼:在 1.0.16 的專用伺服器上跑了幾十種組合,再到 1.0.17 重新確認,每一輪都把世界檔讀回來看;檔案回答不了的地方,就去讀遊戲程式碼。最常讓人意外的結果有四個:
- 世界修正存在世界檔裡。把啟動參數拿掉,什麼都不會變。
-modifier不是取代既有的值,而是疊加上去。-setkey的數字必須和鍵名放在同一個參數裡,否則數字會被默默丟掉。- 只要用了一項遊戲選單裡沒有的設定,這個世界的里程碑(成就)就會被停用。
世界修正存在哪裡
存在世界的中繼資料檔,也就是放世界本體的 .db 旁邊那個 .fwl(1.0 的存檔格式是 .fwl2 與 .db2),以一串鍵的形式記錄。.db 裡沒有這些資料。伺服器每次載入世界,都會先清掉所有世界修正的鍵,再從這份清單重新讀進來,所以設定只存在世界檔這一個地方。
這帶來幾個實際影響:
- 拿掉啟動參數,設定不會變。 下次啟動照樣沿用世界裡已經有的值。
- 還原備份,世界修正也跟著回去。 回到上週二的備份,難度也回到上週二的狀態。
- 搬進來的世界會帶著自己的設定。 把單人世界搬上伺服器,或從別家伺服器租用服務搬過來,世界會帶著建立時的世界修正一起來。
- 檔案要到下次存檔才更新。 伺服器每 30 分鐘、以及正常關機時會存一次世界。改完參數重啟後馬上打開檔案,看到的還是舊清單;但遊戲裡新設定其實已經生效了。
四個啟動參數
| 參數 | 作用 |
|---|---|
-preset <名稱> | 先清掉所有世界修正,再套用預設:normal、casual、easy、hard、hardcore、immersive、hammer |
-modifier <類別> <等級> | 只改 combat、deathpenalty、resources、raids、portals 其中一項,其餘不動 |
-setkey <鍵> | 原樣加入一個鍵,選單裡沒有的鍵也收 |
-resetmodifiers | 清掉所有世界修正。伺服器附帶的說明書裡沒寫,但可以用 |
參數照你寫的順序從左到右執行,名稱和等級不分大小寫。預設或等級名稱打錯,伺服器也不會停下來:它只會記一行 Could not parse 開頭的紀錄,然後用世界原本的世界修正照常啟動。
為什麼 -modifier 清不掉先前的設定
-modifier 只會新增或覆寫你所選等級用到的鍵,那個等級沒用到的鍵會原封不動留著。例如一個用「困難」預設開的世界,後來改成 -modifier combat veryeasy,「困難」寫下的 enemyleveluprate 120 還會留在世界裡——其他都是非常簡單,偏偏帶星的敵人特別多。因為「非常簡單」本來就沒有這個鍵,也就沒有東西去覆寫它。
解法是每次都從空清單開始。用下面這個順序,不管重啟幾次結果都一樣:
./valheim_server.x86_64 -nographics -batchmode -name "Our world" -world "Dedicated" -password "<密碼>" \
-resetmodifiers -preset hard -modifier deathpenalty casual -setkey nomap
-resetmodifiers 放最前面,接著是預設或個別的 -modifier,最後才是 -setkey。-preset 本身就會清空一切,寫在它前面的設定都會不見。
每個預設實際寫入的值
在新世界上實測的結果,數字是相對遊戲標準值的百分比。每個預設另外還會留一筆 preset <名稱> 的紀錄用項目,後面講到的里程碑判定會略過它。
| 預設 | 寫入的鍵 |
|---|---|
| 普通 | 無(全部清空) |
| 休閒 | playerdamage 125、enemydamage 50、enemyspeedsize 90、deathkeepequip、skillreductionrate 15、resourcerate 150、eventrate 0、passivemobs、teleportall、playerevents |
| 簡單 | playerdamage 110、enemydamage 75、enemyspeedsize 95、eventrate 150 |
| 困難 | playerdamage 85、enemydamage 150、enemyspeedsize 110、enemyleveluprate 120、eventrate 60 |
| 硬派 | playerdamage 70、enemydamage 200、enemyspeedsize 120、enemyleveluprate 140、eventrate 60、deathdeleteitems、deathskillsreset、nomap、nobossportals |
| 沉浸式 | nomap、noportals、fire |
| 建築鎚模式 | nobuildcost、passivemobs、eventrate 0 |
「休閒」是戰鬥非常簡單,加上休閒的死亡懲罰、資源變多、沒有突襲、被動敵人、傳送門物品與基於玩家的突襲;「硬派」是戰鬥非常困難,加上硬派的死亡懲罰、無地圖,以及首領還活著時不能用傳送門。
每個等級實際寫入的值
戰鬥——playerdamage 是你造成的傷害,enemydamage 是你受到的傷害,enemyspeedsize 是敵人的體型與速度,enemyleveluprate 是帶星敵人出現的頻率。
-modifier combat | playerdamage | enemydamage | enemyspeedsize | enemyleveluprate |
|---|---|---|---|---|
veryeasy(非常簡單) | 125 | 50 | 90 | — |
easy(簡單) | 110 | 75 | 95 | — |
normal(普通) | — | — | — | — |
hard(困難) | 85 | 150 | 110 | 120 |
veryhard(非常困難) | 70 | 200 | 120 | 140 |
死亡懲罰——skillreductionrate 調的是死亡時失去多少技能。
-modifier deathpenalty | 鍵 | 死亡時 |
|---|---|---|
casual(休閒) | deathkeepequip、skillreductionrate 15 | 身上裝備留著,其餘掉在原地;技能只掉一點 |
veryeasy(非常簡單) | skillreductionrate 15 | 全部掉在死亡地點;技能只掉一點 |
easy(簡單) | skillreductionrate 50 | 全部掉落;技能掉平常的一半 |
normal(普通) | 無 | 全部掉落,可以回去撿 |
hard(困難) | deathdeleteunequipped、skillreductionrate 150 | 裝備中的物品掉在原地,其餘背包內容直接刪除;技能掉得更多 |
hardcore(硬派) | deathdeleteitems、deathskillsreset | 身上所有東西刪除,所有技能歸零 |
資源掉落率——只有一個鍵 resourcerate:muchless 50、less 75、more 150、muchmore 200、most 300。
突襲頻率——只有一個鍵 eventrate,而且方向是反的:它拉長的是兩次突襲之間的間隔,所以數字越大,突襲越少。none 0(沒有突襲)、muchless 200、less 150、more 60、muchmore 30。
傳送門——casual 寫入 teleportall(包含礦石與金屬,所有物品都能通過),hard 寫入 nobossportals(首領還活著時不能用),veryhard 寫入 noportals。
選單裡的五個勾選框沒有 -modifier 的寫法,要用 -setkey 指定:nobuildcost(無建造費用)、passivemobs(被動敵人)、playerevents(基於玩家的突襲)、nomap(無地圖)、fire(火災)。
選單裡沒有的設定
-setkey 收的鍵比選單多。下面這些鍵不在遊戲的世界修正畫面裡,但遊戲程式碼會讀取,專用伺服器上照樣生效:
| 鍵 | 效果 |
|---|---|
nocraftcost | 製作不需要材料 |
noworkbench | 不靠近工作台也能建造 |
allpiecesunlocked | 所有建築物一開始就能用 |
allrecipesunlocked | 所有製作配方一開始就能用 |
dungeonbuild | 可以在地城等室內放建築物 |
nobuildingfall | 雨、雪、灰燼與岩漿不再損壞建築 |
deathkeepinventory、nopseudodrops、noheavysnow、allheavysnow、worldlevellockedtools 也是遊戲會讀的鍵,實際效果我們還沒測。
再來是倍率。全部以百分比指定,100 是遊戲預設值,而且數字要和鍵放在同一個參數裡:-setkey "carryweightrate 200" 就是負重上限加倍。
| 鍵 | 調整的是 |
|---|---|
skillgainrate | 技能升級速度 |
skillreductionrate | 死亡時失去的技能 |
staminarate | 所有動作的體力消耗(0 = 不消耗) |
movestaminarate | 跑、跳、游泳額外的體力消耗 |
staminaregenrate | 體力恢復速度 |
eitrrate | 施法消耗的巨蛇之毒(Eitr) |
durabilityrate | 武器、工具、護甲的耐久耗損速度 |
foodrate | 食物效果消退的速度(越高越快) |
adrenalinerate | 腎上腺素累積的速度 |
carryweightrate | 負重上限 |
戰鬥的鍵也能用同樣的寫法填任意百分比,例如 -setkey "playerdamage 150"。
這一節的設定全部都會停用該世界的里程碑,選單上任何等級都沒有的戰鬥數值也一樣。詳見下文。
為什麼 -setkey 看起來沒有生效
數字被當成另一個參數了。 -setkey carryweightrate 200 其實是兩個參數:伺服器存下的是沒有數字的 carryweightrate(等於 100%),200 則被當成多出來的參數。鍵和數字一定要是同一個參數,請用引號括起來:-setkey "carryweightrate 200"。也要留意那種把一整串變數照空白切開來組啟動指令的啟動器——有些面板和容器映像就是這樣做的,會把你用引號括好的那一對又切成兩個。
打錯字也照收。 -setkey 不檢查名稱,-setkey nobuildcosts 會照你打的原樣存進世界,然後什麼效果都沒有。
它沒辦法刪除。 下次啟動把某個 -setkey 拿掉,設定也不會關掉,因為那個鍵早就存在世界裡了。從 -resetmodifiers 開始,再把要留的重新寫一遍。
你太早去看檔案了。 新的鍵在世界載入的那一刻就在遊戲裡生效,但要到下次存檔才會寫進 .fwl。
租用的伺服器不必自己拼這一行
在 KeepWorlds,世界修正是會員中心裡的一張表單:選一個預設,或選「自訂修正」逐項設定難度五項、規則和倍率。會員中心會照上面的順序寫參數、每次都從空清單開始,倍率也一律當成一個參數傳。預設選項是保留世界原有設定,所以搬進來的世界、或你之前就設好的世界,會保留原本的世界修正。
哪些設定會停用里程碑(成就)
遊戲選單裡選得到的設定——各個預設、五條滑桿的各個等級、五個勾選框——本身不會停用里程碑;其他的都會。
遊戲會把世界裡的每一個世界修正鍵,拿去和選單能產生的值逐一比對。只要有一個鍵不在範圍內,這個世界就會被標記,在裡面玩的每個人都會在里程碑畫面看到這句話:
由於使用作弊世界修改器,此世界的里程碑進度已永久停用。
會觸發的包括:「選單裡沒有的設定」那一節的所有鍵;所有倍率鍵——就算寫的是 100 也算——除非數值剛好是選單某個等級會寫的值(例如 skillreductionrate 50);以及任何等級都沒用到的戰鬥數值(例如 playerdamage 150)。專用伺服器上也一樣:玩家連線時,伺服器會把世界的鍵送過去,玩家這端的遊戲做同一套判定。這是我們在 1.0.16 的遊戲程式碼裡讀到的,1.0.17 也確認沒有改。提示寫的是「永久」;判定讀的是世界當下的鍵,所以用 -resetmodifiers 清掉之後也許會解除,但我們沒有在遊戲裡驗證過,請當作永久處理。
Iron Gate 的 Valheim 1.0 FAQ 另外提到,選單裡的部分世界修正也會擋住某些里程碑,舉的例子是建築鎚模式,並把它算作「暫時作弊」。我們在程式碼裡找不到對應的處理,保險起見,就當建築鎚模式也會擋。
和難度掛鉤的里程碑,只看戰鬥這一項來計算進度;死亡懲罰、資源、突襲、傳送門都不影響。
備份救不回來的,只有死亡懲罰
英靈神殿的角色存在每位玩家自己的電腦上,不在伺服器上。伺服器備份裡的是世界:建築、箱子、地圖和世界修正,不包含任何人的背包或技能。
所以困難和硬派這兩種死亡懲罰,作用在伺服器備份碰不到的地方。困難時,死掉的玩家會失去背包裡所有沒裝備的東西;硬派時,身上所有東西都會被刪掉,技能全部歸零。事後就算把世界回檔,回去的也只有世界,丟掉的裝備不會回來。
這兩種請當成大家一起做的決定,在開啟之前就先告訴所有人,而不是等第一個人死了才說。
已經在玩的世界也能改世界修正
隨時都能改:停下伺服器、改參數、再啟動。新的世界修正會在世界載入時套用,之後就存進世界裡。已經在這個世界玩的人角色不受影響,新的戰鬥、倍率和規則從那次啟動開始套用到他們身上。
如果你本來就打算把參數留在啟動指令裡,那就留下從 -resetmodifiers 開始的完整清單。這樣啟動指令本身就是這個世界設定最準確的紀錄,改一個字就只改一項設定。
常見問題
Valheim 專用伺服器要怎麼調整難度?
在伺服器的啟動指令後面加上啟動參數:七種預設之一用 -preset,戰鬥、死亡懲罰、資源、突襲、傳送門用 -modifier <類別> <等級>,勾選框和其他設定用 -setkey。開頭先放 -resetmodifiers,讓結果不受世界原本設定影響,然後重啟伺服器。
伺服器重啟後世界修正會被重置嗎?
不會。世界修正存在世界檔裡、跟著世界一起載入,所以就算重啟時不帶參數也會保留。要改就得傳新的參數;要清掉就用 -resetmodifiers 或 -preset normal。
為什麼 -setkey 後面的數字沒有生效?
因為鍵和數字被當成兩個參數傳了。請用引號把它們括成一個:-setkey "carryweightrate 200"。寫成 -setkey carryweightrate 200 的話,伺服器存下的是沒有數字的鍵,也就是預設的 100%。
世界修正會被一起備份嗎?
會。世界修正是世界檔的一部分,所以備份裡帶著當時的世界修正,還原時會一起回來。玩家角色不在伺服器備份裡,被嚴苛的死亡懲罰拿走的東西也一樣救不回來。
交給我們處理
上面每一項設定,都是要把順序、引號和拼字全部寫對的啟動參數;而世界還會默默留著最後一次收到的值。
在 KeepWorlds 的英靈神殿 Valheim 伺服器租用上,同樣這些設定是一張表單。儲存困難或硬派死亡懲罰時,會先請房主確認已經告知其他玩家;就算實驗出了差錯,也有備份和還原可以把世界救回來。
遊戲程式啟動時才會讀取設定,儲存後需重新啟動才生效。