我的世界Minecraft 1.19 Mod開(kāi)發(fā)教程分享-14-網(wǎng)絡(luò)
創(chuàng)建類和文件
networking/ModMessage?

輸入以下的代碼
SimpleChannel是Minecraft中發(fā)送和接受自定義數(shù)據(jù)包的類,通過(guò)SimpleChannel來(lái)創(chuàng)建一個(gè)網(wǎng)絡(luò)通道,注冊(cè)發(fā)送和接受的數(shù)據(jù)包,這樣就可以在Minecraft的客戶端和服務(wù)器之間進(jìn)行通訊。
其中packetId是包的標(biāo)識(shí),用于網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)包的區(qū)分。自增保證唯一。
NetworkRegistry是網(wǎng)絡(luò)管理的類
用于客戶端和服務(wù)器是否接送該版本的消息。
ChannelBuilder是構(gòu)建網(wǎng)絡(luò)通道的輔助類,使用ChannelBuilder來(lái)指定網(wǎng)絡(luò)通道的名稱,協(xié)議版本等。
ResourceLocation聲明和指定游戲?qū)ο蟮念?,輔助查找特定的字符,從mod id下的assets或者data下查找數(shù)據(jù)。
sendToServer方法是SimpleChannel類提供的方法,將一個(gè)數(shù)據(jù)包發(fā)送到服務(wù)器對(duì)應(yīng)的處理器。
send 方法是從一個(gè)PacketDistributor instance實(shí)例發(fā)送一個(gè)數(shù)據(jù)包給 PacketDistributor.PacketTarget
PacketDistributor.PacketTarget 指定服務(wù)器向客戶端發(fā)送數(shù)據(jù)包的目標(biāo)。
PacketTarget.PLAYER 向指定的玩家發(fā)送。使用with來(lái)提供一個(gè)玩家的實(shí)例,
在Tutorialmod類中注冊(cè)ModMessage


創(chuàng)建一個(gè)數(shù)據(jù)包
創(chuàng)建如下的目錄和類

加入如下的代碼
這是一個(gè)數(shù)據(jù)包,由客戶端向服務(wù)器發(fā)送的數(shù)據(jù)包,其中handle是當(dāng)服務(wù)器接受到該包時(shí)候的回調(diào)方法。
ExampleC2SPacket(FriendlyByteBuf buf)方法是用于從緩沖區(qū)中讀取數(shù)據(jù)初始化數(shù)據(jù)包片段
toBytes(FriendlyByteBuf buf)將數(shù)據(jù)包寫入緩沖區(qū)中
handle用于接受到的數(shù)據(jù)包,并執(zhí)行邏輯,在發(fā)送者的位置生成一只牛

注冊(cè)Example包
在ModMessage類中加入如下代碼

messageBuilder構(gòu)建一個(gè)消息,該構(gòu)建用于創(chuàng)建對(duì)象進(jìn)行網(wǎng)路傳輸。
參數(shù)接受三個(gè)參數(shù),第一個(gè)數(shù)據(jù)包類,消息ID,消息方向,這里說(shuō)明了消息是發(fā)送給server
返回消息構(gòu)建器。
decoder是字節(jié)流轉(zhuǎn)為對(duì)象,反序列化
encoder是對(duì)象轉(zhuǎn)為字節(jié)流,序列化
consumerMainThread是回調(diào)處理
add添加。

發(fā)送數(shù)據(jù)包
修改之前的綁定按鍵O的觸發(fā)。將數(shù)據(jù)包從客戶端發(fā)送給服務(wù)器。


測(cè)試O鍵發(fā)包
測(cè)試按o之前

測(cè)試按o之后


創(chuàng)建喝水的數(shù)據(jù)包
創(chuàng)建該類 DrinkWaterC2SPacket

寫入如下的代碼
MESSAGE_DRINK_WATER = "message.tutorialmod.drink_water";在之前的發(fā)送消息我們使用的是Component類的iternal方法,這個(gè)方法會(huì)直接將參數(shù)的消息發(fā)送。但是這樣在代碼中的語(yǔ)言是不能漢化的。所以這里的translate方法會(huì)在語(yǔ)言文件中查找對(duì)應(yīng)的內(nèi)容,可以在en_us.json中寫入對(duì)應(yīng)的文字。這樣的話即使友人想翻譯為中文時(shí)候只需要書寫相應(yīng)的文件就好了。直接卸載代碼中的是無(wú)法被漢化的、
hasWaterAroundThem 方法是判斷玩家size周圍是否有水源方塊。
level的getBlockStates方法 是獲得一個(gè)區(qū)域內(nèi)的所有的方塊的狀態(tài),接受一個(gè)AABB作為參數(shù),返回blockstate的數(shù)組。
其中的player.getBounding()是serverplayer的一個(gè)方法,獲得AABB的一個(gè)對(duì)象,這個(gè)對(duì)象描述了玩家所在的空間,inflate是擴(kuò)在size格子,意思在玩家的空間在向外擴(kuò)張2格,
filter是數(shù)組的方法,篩選出是水方塊的方塊,然后轉(zhuǎn)為數(shù)組,判斷該數(shù)組是否長(zhǎng)度大于0。如果大于0就說(shuō)明周圍具有水方塊,否則就是沒(méi)有水方塊。
serverlevel的playSound方法,第一個(gè)參數(shù)是 player,第二個(gè)參數(shù)是位置,第三個(gè)參數(shù)是播放什么類型的聲音,第四個(gè)是聲音類別和選項(xiàng),第五個(gè)是音量,第六個(gè)是音調(diào),

加入語(yǔ)言文件


注冊(cè)數(shù)據(jù)包DrinkWaterC2SPacket


修改按鍵綁定的事件
發(fā)送數(shù)據(jù)包


測(cè)試
附近沒(méi)水源

有水源時(shí)候,有提示,并且有喝水的聲音。
