Minecraft Server & plugins
speedcubing#5311
https://discord.gg/rnbRWrb
Text
Text
Minecraft Java Edition
伺服器版本: 1.8.8
一個Server佔一個TCP port
預設port是25565
1.8.8最少需要512M的memory
1.18.1最少需要1G的memory
intro:伺服器的種類
Vanilla (原版,香草)
原版
從Vailiia改來 首次有插件功能
從Bukkit改來 伺服器串聯
從Paper改來 優化性能
原汁原味,一堆bug的原版香草服
intro:Setting up your server
1. 下載server的jar檔
(Spigot 1.8.8 git-Spigot-21fe707-741a1bd)
bit.ly/3hb2HwT
2. 用Java開啟.jar
(建議)把server.jar放到一個新資料夾裡面
在server.jar的目錄中
創建一個.bat檔案(名子隨便)
用記事本編輯.bat檔
裡面打上 java -jar server.jar
然後儲存
開啟.bat檔 (開服)
第一次開了之後應該會自動關閉
且他會生成一堆檔案
5. EULA (END USER LICENSE AGREEMENT)
生成的檔案中有一個叫做eula.txt
打開之後,裡面寫說:
總之就是要你同意這
把第三行 eula=false
改成 eula=true
然後儲存
之後打開.bat
看到最後一行有一個"Done"
就代表伺服器開啟成功
這是主控台(Console),有伺服器的最高權限。
關服:
在Console(或是有權限的玩家)打"stop"指令.
如果沒辦法就殺掉
(直接打x)
(或是去task manager殺)
(地圖不會儲存)
intro:其他檔案
Folders »
logs » 伺服器日誌資料夾(定時清理,有機會炸開)
plugins » 放插件的資料夾
world, world_nether, world_the_end » 世界資料夾
無須編輯的檔案 »
banned-ips.json » 儲存封鎖的ip
banned-players.json » 儲存封鎖的玩家
ops.json » 儲存有op權限的玩家
whitelist.json » 儲存有whitelist的玩家
usercache.json » 玩家資料快取
eula.txt » 就那個協議同意的檔案
能編輯的檔案 »
commands.yml » 更改指令別名/刪除指令...
help.yml » 修改/help指令
permissions.yml » 有關權限的...沒什麼用...
bukkit.yml » bukkit做的config設定檔
spigot.yml » spigot做的config設定檔
server.properties » 原版的config設定檔
paper.yml » paper做的config設定檔(paper服才有)
intro:更改伺服器icon
在資料夾裡面放一個
server-icon.png
圖片需為64x64 pixel
如果你沒有正版Minecraft...
下載 HMCL
(offline minecraft client)
bit.ly/3JSHfJf
裝好之後打開.exe
按 Download
找到1.8.9
Install
Play
輸入玩家名稱
3-16個字元, (a~z,A~z,0~9,_)
然後Login
environment: Eclipse建構專案
File -> New -> Java Project
輸入專案名稱(隨便怎麼取)
然後按底下的"Finish"
按 "Don't Create".
然後
你應該會在左邊
看到剛剛創建的專案
如果沒有,把Project Explorer打開
environment:
Eclipse 把Spigot加入dependency
右鍵點擊專案
Build Path
Configure Build Path
上面那一排 點Libraries
Classpath
然後左邊的Add External Jars
選取剛下載的server.jar然後Open.
然後Apply and Close.
environment: Intellij建構專案
左上角: File -> New -> Project
File -> Project Structure -> Artifacts
-> 按裡面的+號
-> Jar -> Empty
Include in project build打開
Name是輸出jar的檔名
按照箭頭把這東西拉過去
像這樣.
First plugin: create a class
建立第一個class
展開專案
右鍵src
New
Class
你打code的地方.
填入這個class在這個Project的檔案位置(都小寫)
還有這個class的名稱(第一個字大寫).
怎麼取Package名稱
每個專案的Package盡量不要重複。
如果有兩個同名的class在同樣的package裡面
就會出事。
大多數的取法是:
com.example.aproject
屬example.com的aproject專案
但我不是很在乎就是了
不要跟其他插件,server裡面的package衝突
就沒事
First plugin: using spigot api
Hello World
1:package... 這個class所在的package
3:import... 匯入org.xxx.xxx.JavaPlugin這個class
5:public c... Main.class 是繼承自JavaPlugin這個class
7:public v... 這是一個函式, void代表無回傳值.
這個函式會在插件載入的時候被呼叫.
8:System... 在Console印出Hello World!這個字串 (字串要用""括起來)
題外話: 伺服器怎麼開始跑的
在
org.bukkit.craftbukkit.Main
裡面有個起始的函式。
正常的程式都是從
public static void main(String[] args){
}開始的.
plugin.yml
這是Spigot插件裡面一定要有的檔案
就 插件裡面.
右鍵專案
New
File
檔名: plugin.yml
Finish
裡面打上三行東西
name: 插件名子(隨便取)(英文)
main: Main class的位置
version: 版本, 懶得打的話就1.0
然後儲存。
編譯 (匯出)
右鍵專案
Export
Java -> JAR file -> Next
路徑打上
伺服器裡的plugins資料夾,
然後取一個jar檔名(隨便取)
...\plugins\test.jar
然後Finish.
重開伺服器
或是打"reload"指令(重新載入插件)(有可能會裂開,重開最好)
你應該就會看到
創建指令
範例:做一個/ok指令
開一個新class(名子不一定要是"ok")
先將這個class implements CommandExecutor
然後加上底下這個函式
public boolean onCommand(....){
return true;
}
此函式須回傳boolean.
return true的意思是:
結束這個函式,並且回傳true
如果回傳false,系統會傳一個訊息給sender.
(等一下會在plugin.yml出現.)
當玩家(或是Console)打這個指令時,會呼叫這個函式.
這函式傳入的東西:
sender是指使用指令的玩家
c是這個指令的object。(沒用)
s是指令名稱("ok")
args是一個字串陣列
如果玩家打了/ok a b c
那args就會是 {"a","b","c"} (String array)。
範例:
加上一欄commands:
裡面打指令名稱(ok)
裡面usage是return false的時候
會傳給玩家的字串
在onEnable打上
"ok"是指令名稱
new dude()是剛剛創建指令的那個class
的新物件.
Player
CraftPlayer implements Player
EntityPlayer
EntityHuman
EntityLiving
控制玩家
要先有Player物件
可以從指令獲得
或是直接以名字,UUID來...
Bukkit.getPlayer("speedcubing");
Bukkit.getPlayer(UUID uuid);
如果該玩家不在線
或是名字,UUID不存在
上述結果就會是null.
Player#sendMessage...
playSound
teleport
setMaxNoDamageTicks
setAllowFlight
...
事件
如何讓這個事件監聽器生效
priority
物品.
Vector
那條紅色的向量 v=(2,3,5)
(起點不一定是原點)
|v|=sqrt(2*2+3*3+5*5)
單位向量=(2/|v|,3/|v|,5/|v|)
V1 = (x1,y1,b1) V2 = (x2,y2,z2)
V1 + V2 = (x1+x2,y1+y2,z1+z2)
V1 * 2 = (2 * x1,2* y1,2* z1)
|a x b| = 平行四邊形面積 = |a||b|sin(θ)
範例: 玩家移動時 判斷他是否朝向一個點
範例2: 噴射(擊退)玩家
範例3: TNT炸方塊的時候
方塊以隨機方向噴出
Configuration file
in the plugin folder:
spawn.x
SaveDefaultConfig();
建立plugin folder裡面的config file
reloadConfig();
編輯config file之後
把更動同步到plugin裡面
saveConfig();
plugin編輯config之後
把更動同步config file裡面
getConfig();
插件讀/寫plugin裡面的config
MainInstance#getConfig()
How to get the Main instance in other classes:
Main.getPlugin(Main.class)
example:
result:
多重世界
如果世界不存在 -> 生成世界+載入世界
如果世界存在 -> 載入世界
自訂事件
extend Event需要的東西
放上自己的constructor
呼叫自己的事件
Mojang API
example: username to UUID
result:
Inventory
創建Inventory
創建有holder的inventory
法二:
BungeeCord