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

  • EventPriority.MONITOR
  • EventPriority.HIGHEST
  • EventPriority.HIGH
  • EventPriority.NORMAL
  • EventPriority.LOW
  • EventPriority.LOWEST

物品.

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

 

Minecraft Server & Plugins

By speedcubing

Minecraft Server & Plugins

  • 174