本文章將會有 Minecraft: Java edition 的各種伺服器簡介與教學,並且只會提到 Java edition,也就是只能在電腦(包含 Windows、Linux 跟 macOS)玩的版本。 文章很長!請善用 Ctrl+F
介紹
Minecraft 是一個可玩性無限的遊戲。獨樂樂不如眾樂樂,為了讓玩家們可以一起玩遊戲、一起創造屬於大家的世界,Mojang 從非常早期的 Classic 版本就為遊戲加入了多人連線功能,現在伺服器不斷被改良,從原本小型生存伺服器遍地開花,隨著時代的發展,慢慢演變出能跨伺服器連線的大型小遊戲伺服器。
- Vanilla —— 官方發布的原版伺服器。
- CraftBukkit —— 修改 Vanilla 讓 Bukkit 插件得以運作並最佳化。
- Spigot —— 修改 CraftBukkit 並做了更多最佳化。
- Paper —— 修改 Spigot 並做了更多最佳化。
以上三者都是可使用 Bukkit API,一般稱為插件伺服器,通常為 CraftBukkit 寫的插件 Spigot 跟 Paper 能執行,Spigot 的插件 Paper 能執行。
- Forge —— 允許安裝 Forge 模組。
- NeoForge —— Forge 管理團隊不爽 Forge 原開發者嘴太臭,Fork 出來的版本,與 Forge 能共存。
- Fabric —— 允許安裝 Fabric 模組。
後三者通常需要伺服器與客戶端安裝相同的模組才可順利連線遊玩,Forge 與 Fabric 使用不同的 modloader,無法共存。
下載
JRE 下載
自架伺服器需要自行安裝 Java 執行環境(Java Runtime Environment),不像官方啟動器會自帶。64 位元電腦選擇 x64 版本,否則伺服器無法被分配到大於 4 GB 的記憶體。
伺服器檔案下載
下載 Jar 檔案後請創建新的資料夾並放入,伺服器在首次執行時會自動建立其所需檔案。從 Forge 取得安裝檔並啟動後,選擇 Install server 並指定伺服器將被裝到的目錄,點擊 OK 會自動下載所需檔案到指定目錄。
安裝
下載完後,要先執行一次讓它建立與下載需要的檔案,點兩下打開或是輸入以下指令:
java -jar 伺服器檔案名.jar nogui
執行後打開 eula.txt 會看到:
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
eula=false
閱讀 Minecraft 的 EULA 後並修改檔案,將上方的檔案內容改為 eula=true
伺服器才會啟動。
編寫啟動腳本
由於伺服器啟動時通常需要額外的參數,為了快速啟動並固定內容,建議編寫啟動腳本。若伺服器下載後已自帶啟動腳本,可跳過此步驟或閱讀啟動腳本客製化。詳細的 JVM 參數可參考 Configuring the Default JVM and Java Arguments。
Windows
在伺服器 .jar
檔案同一個資料夾處建立一個名為 run.bat
的檔案,並輸入以下內容:
java -Xmx4G -Xms4G -jar 伺服器檔案名.jar nogui
這樣對 run.bat
點兩下即可快速啟動。其中 -Xmx4G -Xms4G
是指定伺服器最大記憶體為 4GB,可依實際需求調整。nogui
是指定伺服器不要開啟圖形介面,以節省資源。
Linux/macOS
在伺服器 .jar
檔案同一個資料夾處建立一個名為 run.sh
的檔案,並輸入以下內容:
#!/bin/bash
java -Xmx4G -Xms4G -jar 伺服器檔案名.jar nogui
然後執行 chmod +x run.sh
讓使用者有執行權限,往後執行 ./run.sh
即可以啟動伺服器。Linux 環境下若不指定 nogui
,伺服器可能會因找不到圖形介面相關的套件而無法啟動。
另外,Linux 環境下也可以使用 screen
讓伺服器在背景執行,例如:
screen -S -m minecraft java -Xmx4G -Xms4G -jar 伺服器檔案名.jar nogui
伺服器啟動時就會在背景執行,若要操控伺服器控制台可使用 screen -r
來連線到伺服器,Ctrl + A,Ctrl + D 再次放到背景執行。搭配 crontab 可以讓伺服器在重新開機後自動執行。
設定
所有伺服器
同意 Eula 並重新執行伺服器會自動產生所需的檔案。
- world/:伺服器預設的的地圖資料夾,非 Vanilla 可能會有更多資料夾。
- banned-players.json banned-ips.json:紀錄被封鎖的玩家或 IP,無法登入伺服器。
- whitelist.json:白名單,伺服器開啟白名單時只有清單上的玩家才可登入。
- ops.json:管理員(OP)名單。
- server-icon.png:伺服器的標誌,可以放 64x64 的圖,會顯示在選伺服器頁面的左邊。
- logs/:存放伺服器的記錄檔的資料夾。
- usercache.json:伺服器上玩家資料暫存檔案,不需理會。
- eula.txt:伺服器是否同意 EULA。
- server.properties:伺服器設定預設值和說明(會被遊戲內設定覆蓋):
server.properties
# 伺服器在多人連線選單中顯示的字樣
motd=A Minecraft Server
# 伺服器 IP,正常狀況下不用理會
server-ip=
# 伺服器 Port,每個 Port 只能存在一個服務,若非使用預設的 25565,則需要在連線時加上「:數值」
server-port=25565
# 玩家數量上限
max-players=20
# 重生點保護(2x+1)格,管理員無視,0 關閉
spawn-protection=16
# 遊戲難度(peaceful/easy/normal/hard)
difficulty=easy
# 預設遊戲模式(survival/creative/adventure/spectator)
gamemode=survival
# 登入時是否強制切換為以上 gamemode
force-gamemode=false
# 白名單是否開啟
white-list=false
# 啟動白名單時是否踢出不在白名單上的玩家
enforce-whitelist=false
# 是否廣播控制台指令的結果給管理員
broadcast-console-to-ops=true
# 玩家掛機多少分鐘會踢出
player-idle-timeout=0
# 是否在多人遊戲選擇畫面中顯示伺服器上線
enable-status=true
# 是否隱藏線上的玩家
hide-online-players=false
# 預設的管理員權限(1 到 4),決定可以用的指令強度,請參閱 Minecraft Wiki
op-permission-level=4
# 是否與 Mojang 連線檢查玩家遊戲帳號,關閉後就算是正版玩家也不會有外觀
online-mode=true
# 預設是否開啟同隊(/party,無隊伍視同相同隊伍)玩家傷害
pvp=true
# 是否啟用指令方塊,玩地圖要開
enable-command-block=false
# function pack 能用的指令等級
function-permission-level=2
# 使否允許飛行(可能造成玩家意外被踢)
allow-flight=false
# 伺服器是否啟用極限模式,死後成為旁觀不能復活(管理員指令可復活)
hardcore=false
# 世界檔案的所在資料夾名稱
level-name=world
# 地圖型態(minecraft:normal/flat/large_biomes/amplified/single_biome_surface)
level-type=minecraft:normal
# 設定地圖生成條件(超平坦世界中的方案集)
generator-settings={}
# 生成世界時使用的種子碼
level-seed=
# 是否生成動物
spawn-animals=true
# 是否生成村民
spawn-npcs=true
# 是否生成怪物
spawn-monsters=true
# 是否啟用地獄
allow-nether=true
# 世界的 XY 軸各往正負延伸多少格
max-world-size=29999984
# 預設視野距離
view-distance=10
# 預設伺服器處理生物範圍
simulation-distance=10
# 是否生成結構
generate-structures=true
# 是否強制使用材質包
require-resource-pack=false
# 材質包的 uri
resource-pack=
# 強制使用材質包時的提示
resource-pack-prompt=
# 材質包的 sha1 雜湊,確保玩家使用的是正確的材質包
resource-pack-sha1=
# 是否啟用 GameSpy4 協議
enable-query=false
# GameSpy4 的 port
query.port=25565
# 是否啟用 RCON(讓伺服器管理員不須登入即可使用指令的協定)
enable-rcon=false
# RCON 控制的port
rcon.port=25575
# RCON 用的密碼
rcon.password=
# 是否把 RCON 的結果廣播給管理員
broadcast-rcon-to-ops=true
# 如果伺服器處理一個 tick 太久即判斷崩潰,單位毫秒,-1 停用
max-tick-time=60000
# 檢查玩家與 Mojang 和伺服器連線的 ISP 是否一致
prevent-proxy-connections=false
# 超過多少位元組的封包會被壓縮(-1 關閉,0 壓縮所有),建議 > 64,< 1500
network-compression-threshold=256
# 伺服器是否傳送除錯資訊給 Mojang
snooper-enabled=true
# 是否啟用給 Linux 系統的網路最佳化
use-native-transport=true
# 是否啟用 JMX
enable-jmx-monitoring=false
Forge/NeoForged 伺服器
- mods/:放伺服器欲載入的的 mods
- run.bat:Windows 的伺服器啟動腳本,點兩下即可啟動伺服器
- run.sh:Linux/macOS 的伺服器啟動腳本
- user_jvm_args.txt:設定 JVM 參數
- config/:模組設定檔案資料夾
- defaultconfigs/:創建新世界時會被複製到 world/serverconfig/,模組包作者用
插件伺服器
- plugins/:伺服器使用的插件、設定檔(通常插件會自行建立相同名稱的資料夾存放設定檔)
- plugins/PluginMetrics/:用來在bStats統計伺服器上的插件使用情況等等數據
- help.yml:/help 指令的自訂內容
- bukkit.yml:CraftBukkit 的設定檔
- spigot.yml:Spigot 的設定檔
- config/paper-global.yml:Paper 的設定檔
bukkit.yml
settings: # 一般設定
allow-end: true
# 是否啟用終界
warn-on-overload: true
# 是否在伺服器 tick 處理過久警告超載
permissions-file: permissions.yml
# 權限設定檔案(通常會直接由權限插件處理)
update-folder: update
# 這個名子的資料夾中的插件伺服器重開時會自動更新
use-exact-login-location: false
# 是否在玩家登入時使用他們的正確位置(而非安全位置)
world-container: worlds
# 世界資料夾的位置
plugin-profiling: false
# 是否啟用 /timing 指令,方便找出插件的效能問題
connection-throttle: 0
# 連線的冷卻時間,單位毫秒
query-plugins: true
# 是否回傳查詢插件的結果
deprecated-verbose: default
# 是否在插件呼叫了已棄用的程式時發出警告
shutdown-message: Server closed
# 伺服器關閉時時玩家試圖連線的錯誤訊息
minimum-api: none
# 是否阻止插件的不支援 API 被載入
use-map-color-cache: true
spawn-limits: # 每個世界能生怪的上線值
chunk-gc: # 幾個 tick 要清理一次不須使用但沒有成功從記憶體清除的 Chunk
period-in-ticks: 600
ticks-per: # 每多少 tick 觸發一次以下事件
auto-updater:
enabled: true # 自動更新相關
commands.yml:設定指令的縮寫,範例:
command-block-overrides:
- "give"
# 代表讓 Minecraft 接管指令方塊的 /give 指令,不使用 Bukkit 的最佳化版本
aliases:
lobby:
- rg teleport -w lobby lobby
# 範例:當玩家使用了 /lobby,伺服器視為玩家執行了 /rg teleport -w lobby lobby
# 同時 /lobby 指令可以被設定特殊權限,例如不能使用 /rg teleport 的一般玩家也能使用 /lobby
spigot.yml
# 由於 Spigot 的設定檔案太多,這裡只列出一些常用的
config-version: 12
settings:
log-named-deaths: true # 是否記錄被命名的實體死亡
log-villager-deaths: true # 是否記錄村民死亡
debug: false
save-user-cache-on-stop-only: false # 是否只在伺服器關閉時才儲存玩家快取
bungeecord: false
sample-count: 12 # 顯示在玩家清單上的玩家數量
timeout-time: 60 # 伺服器無回應崩潰時間,單位為秒
restart-on-crash: true # 伺服器崩潰時是否自動重啟
restart-script: ./run.sh # 重啟(/restart)時執行的腳本檔案名稱
messages: # 訊息設定
advancements: # 進度設定
commands:
log: true
tab-complete: 0 # 自動輸入要在輸入多少個字元後才會顯示
spam-exclusions: # 不會被視為濫發的指令
- /skill
replace-commands: # 使用原版的指令
world-settings:
default:
hopper-can-load-chunks: false # 漏斗是否能載入區塊
below-zero-generation-in-existing-chunks: true # 1.18 升級時是否生成負 Y 座標的方塊
hunger: # 飽食度調整
max-tick-time:
tile: 50
entity: 50
growth: # 作物生長速度調整
entity-activation-range: #生物應該在多遠的距離被啟動
ticks-per:
hopper-transfer: 8
hopper-check: 1
config/paper-global.yml
_version: 28
block-updates: # 方塊更新相關
chunk-loading: # 區塊載入相關
collisions: # 碰撞相關
commands: # 指令自動輸入相關
console: # 控制台相關
item-validation: # 避免物品資料量過大 Chunk ban
messages: # 訊息
misc:
chat-threads: # 聊天室執行緒數量
chat-executor-core-size: -1
chat-executor-max-size: -1
fix-entity-position-desync: true # 修正實體位置與客戶端不同步
lag-compensate-block-breaking: true # 修正方塊破壞的延遲
load-permissions-yml-before-plugins: true
max-joins-per-tick: 3 # 每個 tick 最多能有幾個玩家登入
packet-limiter: # 封包限制
player-auto-save: # 玩家資料自動儲存
proxies:
bungee-cord:
online-mode: true
proxy-protocol: false
velocity:
enabled: false
online-mode: false
secret: ''
spam-limiter: # 濫發封包限制
timings: # /timings 指令相關
watchdog: # 伺服器監控相關
early-warning-delay: 10000
early-warning-every: 5000
連線
每台伺服器與客戶端之間的連線狀況都不同,這邊只列出一些常見情況。
若伺服器與客戶端在同一台電腦上,使用 localhost
或是 127.0.0.1
即可連線。
尋找我的 IP
Windows
- 開啟命令提示字元:按下
Win + R
,輸入cmd
,按下Enter
。 - 在黑底白字的視窗內輸入
ipconfig
,按下Enter
。 - 找到你的網路介面卡,通常是
以太網路卡
或是無線區域網路卡
。 - 找到
IPv4 位址
,通常是192.168.X.X
或是10.X.X.X
,且第三個點後通常不是1
且第一個數字不是255
。
Linux
ip addr
或是
ifconfig
如果你的伺服器與客戶端使用同一個網路,直接輸入得到的 IP 即可連線。
Port Forwarding
如果你的伺服器與客戶端不在同一個網路,並且網際網路服務供應商有提供 IP,你可以進行 Port Forwarding。詳情請參考 IP 分享器的使用手冊。
測試是否成功:CanYouSeeMe(選擇 Port 25565
)(有時也會遇到前面沒有裝置擋著,可以先用工具試試看再設定)。
VPN
如果上述方法都無法使用,你可以使用 VPN 服務,例如 ZeroTier 或是 Hamachi。這裡只需要用到 VPN 建立虛擬網路的功能,不需要用於連上網際網路。
管理
這邊只列出一些常用或是在單人下沒有的指令,更多指令請參考 Minecraft Wiki。
op <玩家> # 給予玩家 OP 權限
deop <玩家> # 移除玩家的 OP 權限
ban <玩家> [原因] # 封鎖玩家
ban-ip <IP> [原因] # 封鎖 IP
pardon <玩家> # 解除玩家封鎖
pardon-ip <IP> # 解除 IP 封鎖
whitelist add <玩家> # 將玩家加入白名單
whitelist remove <玩家> # 將玩家移出白名單
whitelist reload # 重新載入白名單
whitelist list # 列出白名單
whitelist on # 開啟白名單
whitelist off # 關閉白名單
kick <玩家> [原因] # 踢出玩家
reload # 重新載入伺服器,建議條件允許還是 /stop 再啟動比較好
stop # 關閉伺服器
forge tps # 顯示 Forge 伺服器 TPS(每秒鐘處理的遊戲刻數,20 刻為 1 秒)
tps # 顯示伺服器 TPS,除了原版都會有這個或類似的指令,正常順暢的伺服器 TPS 應該要保持在 20
常見問題
注:---- Minecraft Crash Report ----
下一行的註解是彩蛋。
請求協助時請附上 Crash Report,並且不要用手機拍螢幕。
Connection refused: no further information
:遊戲看到目標位置有裝置,但是看不到伺服器Connection timed out: no further information
:目標位置沒有回應或是沒有裝置Internal Exception: java.net.SocketException
:可能是伺服器無法發送或處理封包,通常是負載過高或崩潰無效的 session
:購買正版或是重開遊戲