UU看書

第一百五十六章 村莊與掠奪更新後的自定義交易

天才一秒記住【UU看書】地址:www.uukanshu.co

在開始本章的主要內容之前,容我先講幾句話。

看起來我已經有一兩個月沒更新了,但其實這些天來我一直在高強度更新。更新什麼呢?以前的章節。

為什麼我要去更新以前的章節呢?因為隨著MC版本的更新,以及時間的流逝,加上我當時沒什麼寫教程的經驗,以上種種因素導致以前的章節出現了許多錯誤和疏漏之處,因此我開始進行一次大修,我稱之為『本書第一次大修』。這個大修主要是對本書113章之前的內容進行修改,工程量十分的巨大。但好訊息是,截止2022年7月25日,本書已經基本完成了從序言到第九十章的修改。因為改動巨大,所以我強烈推薦各位抽點時間重看一遍,特別是自計分板之後的內容,幾乎每章都有重寫。

大修預計將會在8月初結束,不出意外的話,屆時我將會重新恢復相對比較高的更新頻率。另外,如果你是在一些盜版網站上閱讀本書,建議你來起點讀書或紅袖添香等正版網站來看,不然盜版網站可不會對之前的章節進行更新。

回到正題。

—————不華麗的分割線—————

黑夜將至,忘記帶床和羊毛的你,雖然身披下界合金套裝,但源自內心對黑暗的恐懼仍然使你感覺到些許害怕。行走在積雪的樺樹森林中,你想起剛剛開啟這個存檔時,雖然挖三填一度過了危險的夜晚,但仍然一出來就被骷髏射死的窘迫場面。

低頭看了看手上拿著的海洋探險家地圖,再次抬頭時,你看見前方似乎有一些亮光。你以為這是岩漿湖的亮光,但隨著你的前進,亮光背後的房子冒了出來——前方是一個村莊!興奮的你跑了過去,那房子越來越近。但奇怪的是,這房子後面並沒有任何其他房子,直到你快要到達那裡時,才發現這個房子建在懸崖上,村莊本體其實在懸崖下面。

一個村民從你旁邊走過——他看起來像是這棟房子的主人。此時你冒出了個點子——趁著村民不注意,把他擠下山崖。這個想法很成功付諸實現,然後你就一覺睡到天亮。

次日清晨,你來到山崖下的村莊,手上拿著剛剛從田裡摘的胡蘿蔔。突然有一位手中抱著綠寶石的農民興沖沖跑到你的面前。你開啟了這個農民的交易介面,他是一位沒有任何經驗的新手農民,提供兩項交易:

22胡蘿蔔→1綠寶石

15甜菜根→1綠寶石

你突然來了興趣,想要和這個村民交易億下。很快你就把村莊裡所有胡蘿蔔給摘了,加上你揹包裡原有的胡蘿蔔,總共215個。你和他進行了5次交易,花費110根胡蘿蔔拿到5顆綠寶石,村民也剛好獲得足夠的經驗升到了『學徒』級,並附帶生命恢復效果。

升到『學徒』級之後,村民新開放了兩個交易:

6南瓜→1綠寶石

1綠寶石→4南瓜派

你先把剩下的胡蘿蔔花光,然後拿著得到的9顆綠寶石加上自己原先的3顆綠寶石買了48個南瓜派,這一項交易就沒貨了,村民也成功升級到『老手』級。到了老手後,村民又開放兩個新的交易,且由於好感度的提升,交易開始打折。你繼續和村民交易,讓他繼續升級十幾分鍾後,村民成功升級到了『大師』級。

升級到『大師』級別之後,村民的經驗條消失,也就是無法再次升級。你也得到了一堆的交易品和大量的經驗值。將交易品裝入潛影箱後,你繼續朝著海底神殿的方向進發。

如上文所見加上你的經驗,可以得出,在村莊與掠奪更新後,村民的交易系統有這麼幾個特點:

①指定的村民職業具有指定的交易專案。

②有職業村民具有經驗系統和等級系統。等級分為5級,從低到高分別是『新手、學徒、老手、專家和大師』。村民可以從交易中獲得經驗,經驗可以用來提升自己的等級,每提升一次等級,升級到下一級所花費的經驗值會更多。

③每個交易專案都可以用一到兩種物品換取指定的物品。

④玩家也能夠從交易中獲得一定的經驗。

⑤交易專案具有次數限制,次數限制達到後將無法使用該交易專案,需要村民前往工作站工作並補貨後,交易專案才能重新開放。

⑥每個交易專案的價格都會受到該村民言論以及其他因素的影響,可能會上浮也可能會打折。

上面這六個特點其實與村民NBT標籤中的這些標籤有關:

①VillagerData(複合標籤)

②VillagerData內的level、Xp和一個交易專案中的xp(均為Int整形)

③一個交易專案中的buy、bugB和sell(均為複合標籤)

④一個交易專案中的rewardExp(Byte布林值)

⑤Brain(複合標籤)和一個交易專案中的maxUses(Int整形)

⑥Gossips(複合標籤列表)和一個交易專案中的demand、specialPrice和priceMultiplier(前兩者為Int整形,後者為Float單精度浮點數)

為了在村莊與掠奪更新後也能夠使用NBT自定義交易,我們得先來看看村民職業方面的改變。

在114版本之前,村民有一級職業(Profession標籤決定)和二級職業(Career標籤決定)。而在114版本更新後,就沒有什麼一級二級之分,所有職業都有了單獨的名稱空間ID,如農民就有了minecraftfarmer。並且由於職業不再分一級二級,所以在新版本只有一個標籤決定著村民的職業:VillagerData複合標籤下的profession標籤。

profession標籤的值就是該村民的職業ID。截止Java119版本,原版村民14個職業的ID分別是:

minecraftarmorer——盔甲匠

minecraftbutcher——屠夫

minecraftcartographer——製圖師

minecraftcleric——牧師

minecraftfarmer——農民

minecraftfisherman——漁夫

minecraftfletcher——制箭師

minecraftleatherworker——皮匠

minecraftlibrarian——圖書管理員

minecraftmason——石匠

minecraftnitwit——傻子(這也是職業?)

minecraftshepherd——牧羊人

minecrafttoolsmith——工具匠

minecraftweaponsmith——武器匠

舉個例子,假設我們要生成一個農民,只需要這樣子:

summonvillagerVillagerDataprofession“minecraftfarmer“

然後遊戲就會生成一個沒有任何職業的村民。等等,怎麼不是農民?

因為我們沒有指定工作站點。村民由於沒有工作站點,所以就變成了無職業的村民。我們會在待會了解到如何解決這個問題。

VillagerData內不僅僅有profession標籤用來決定村民職業,還有另外兩個比較重要的標籤:

level(Int整形)——村民的職業等級,新手為1級,大師為5級。如果設定的等級高於職業的最高等級,村民將不會開放新的交易專案。(沒錯,這就等同於114更新前的CareerLevel標籤)

type(字串)——村民的種類,它指定了這個村民是沙漠村民(minecraftdesert)還是平原村民(minecraftplains)還是其他型別的村民。

其中的type標籤不用管,除非你想要給村民弄點兒不一樣的衣服。我們重點看看level標籤。舉個例子:

summonvillagerVillagerDataprofession“minecraftfarmer“,level5

這將會生成一個大師級別的農民。等等,怎麼不變回無職業了?

正常情況下,level欄位只能由交易改變,也就是說玩家是個關鍵因素。新版本的村民雖然有『工作站沒掉就失業』的性質,但如果遊戲發現這個村民好像和其他玩家交易過,就不會讓這個村民失業。在這邊,由於我們改變了level標籤的值,導致遊戲認為這個村民已經和玩家交易過了,所以這個村民不會失業。

上面這些也是114更新後與自定義交易關係相當大的內容,接下來我們來看看同樣也是114更新後自定義交易的核心:Offers標籤。

Offers標籤的內容其實變化並不大,我們在第一百五十四章所講的內容可以完美適配過來,因此這裡就不細講那些重複的內容。我們就重點來看看114更新後,在交易專案中新增的4個新標籤:

xp(Int整形)——村民每次交易能從該交易專案中獲取的經驗值

demand(Int整形)——價格調整因素之一:供需關係

specialPrice(Int整形)——價格調整因素之二:特惠

priceMultiplier(Float單精度浮點數)——價格調整因素之三:價格乘數

xp標籤我們就不講了,做自定義交易幹嘛要管村民升級。我們重點來看看後面三個標籤,這三個標籤十分重要,因為它們關係到一個非常重要的東西:價格

在村莊與掠奪更新後,每個交易專案的第一個收購項,也就是buy複合標籤所規定的物品,其數量,也就是價格,會發生變化。所以我們有一個專門的公式來計算村民收購的第一個物品的最終數量,也就是價格的計算公式:

(此公式更新於2022年12月28日,僅適用於Java版)

當a≥0且V≥1時

e〔5ABCD5E×p〕〔V1×0062503×m〕f

yclamp〔a×p×m〕me,1,M

當a<0且V≥1時

e〔5ABCD5E×p〕〔V1×0062503×m〕f

yclampme,1,M

當a≥0且V<1時

e〔5ABCD5E×p〕f

yclamp〔a×p×m〕me,1,M

當a<0且V<1時

e〔5ABCD5E×p〕f

yclampme,1,M

引數列表

a······該交易專案demand標籤的值

f······該交易專案specialPrice標籤在玩家開啟交易介面之前的值

p······價格乘數

m······原價

y·······最終價格

e······該交易專案specialPrice標籤的值

A······majorpositive類言論強度

B······minorpositive類言論強度

C······trading類言論強度

D······minornegative類言論強度

E······majornegative類言論強度

M······村民收購的第一個物品的堆疊上限

V······玩家的村莊英雄效果等級(Vlt1即無村莊英雄效果)

其中,作者自己定義的六角括號〔〕,代表此括號內的運算在得出結果後會被去除小數部分,只保留整數部分。比如〔185〕18、〔6412〕65、〔01〕0

上面的clampa,b,c函式,則用來限制a介於b、c之間(b≤c)。比如:

clamp34,1,33

34超過了最大值3,所以輸出3

clamp12,8,8812

12介於8和88之間,所以還是輸出12

clamp44,9,739。

44低於最小值9,所以輸出9

你可能會感到疑惑:唉這個公式怎麼和上一章的公式完全不一樣啊?

這個問題很有趣。首先,上一章的公式僅僅只考慮了言論對價格的影響。仔細觀察,你也會發現這裡的公式中含有上一章的公式。那這有趣究竟在哪裡呢?

上一章的公式來自MinecraftWiki。在中文MinecraftWiki的村民頁面上,還有另一個價格計算公式。而這個公式,對於聲望的計算,是完全不一樣的!

ym〔5ABCD5E×p〕

僅考慮言論的價格公式

y〔a×p×m〕〔p×D〕〔p×C×10〕em

a······該交易專案demand標籤的值

p······價格乘數

e······該交易專案specialPrice標籤的值

m······原價

C······trading類言論強度

D······minornegative類言論強度

MinecraftWiki上的計算公式

於是,作者基於這兩個公式,透過一些實驗,總結出了上面的那個計算公式。

但不管如何,這個錯誤仍是一個較為嚴重的錯誤,因為它已經存在了很長時間,並有許多教程引用了這個公式,影響範圍較大。

需要注意的是,上述公式都有涉及到言論系統,但言論系統目前(2022年12月28日)僅僅存在於Java版中,所以上述公式不一定適用於基岩版。

PS2022年12月4日,MinecraftWiki的使用者Nickid2018終於將百科的計算公式改了。新的計算公式如下:

e聲望影響的降價村莊英雄效果影響的降價

yclampm×〔1a×p〕e,1,M

a······該交易專案demand標籤的值

p······價格乘數

e······該交易專案specialPrice標籤的值

m······原價

M······村民收購的第一個物品的堆疊上限

這個公式與上面作者自己得出的公式相差不大,但仍有一個可能的問題:

e(specialPrice)的值的計算方式可能有誤

要說明為什麼有這個問題,我們得先了解一下specialPrice的機制。

當一名玩家開啟村民的交易介面時,遊戲會計算每個交易專案的實際價格。這時候,遊戲會先計算言論和村莊英雄效果的影響,並將它們的值加到每個交易專案的specialPrice標籤中。第二步,遊戲才會根據demand等其他標籤,綜合計算出每個交易專案的值。在這個過程中,specialPrice標籤會加到計算的值中。第三步,也就是向玩家展示這些交易專案。最後,當玩家關閉村民的交易介面時,遊戲會把每個交易專案的specialPrice標籤清零。

也就是說,如果要使得交易打折,specialPrice的值必須要為負。

但是,如果根據MinecraftWiki的計算方式,specialPrice為負的情況只有一種可能:村民對於玩傢俱有過多的負面言論。而這是不可能的。

當然,我們也別過多糾結這個問題,該改正的總會改正,只不過是時間問題。我們更加需要關心的有兩件事情:

1我們肯定不希望我們自定義的商品價格被隨意改變,所以我們該怎麼辦呢?

2specialPrice的性質可以弄出什麼效果呢?

對於第一個問題,我們的解決方法很簡單——仔細觀察上面的公式,我們不難發現『p價格乘數』都是一個及其重要的變數。

既然是『乘數』,如果我們把這東西改為0,那問題是不是就解決了?

試一試!當p0時

e〔5ABCD5E×0〕〔V1×0062503×m〕f

e〔V1×0062503×m〕f

yclamp〔a×0×m〕m〔V1×0062503×m〕f,1,M

yclampm〔V1×0062503×m〕f,1,M

不難發現,就算p0解決了大多數問題,但村莊英雄效果和specialPrice的原始值仍然會影響到價格。但村莊英雄效果畢竟是很難得到的,specialPrice的原始值又是隻能透過命令改變,所以總體上來說影響很小。

總結下來,相比更新之前,我們在新版本中自定義村民交易,還需要注意將價格乘數priceMultiplier設為00(有沒有一種可能,不設定其實也預設是0)。舉個例子:

summonvillagerVillagerDatalevel6,profession“minecraftfarmer“,OffersRecipesrewardExp1,maxUses150000,buyCount1,id“minecraftdiamond“,buyBCount10,id“minecraftemerald“,sellCount1,id“minecraftdiamondsword“,tagEnchantmentsid“minecraftsharpness“,lvl10,priceMultiplier00

這個例子是我們第一百五十四章的一箇舊版例子的新版寫法,只不過將暮色森林Mod的幻影騎士戰利品換成了普通的鑽石。

上面這條指令將會生成一個等級為6的農民,並帶有一個『具有15萬次使用次數、每次交易返回1點經驗值、價格乘數為00、能夠用1鑽石加上10綠寶石買一個附魔有鋒利X的鑽石劍』的交易專案。

那對於第二個問題呢?

既然遊戲在計算specialPrice時會將specialPrice的初始值加上,那麼只要控制得當,在玩家開啟交易專案之前就更改specialPrice的值,就能做到自定義折扣。

另外,修改specialPrice的值並不會影響到村民給正在交易中的玩家的商品價格。

村莊與掠奪更新後的自定義交易到此就結束了,你現在可以嘗試去自定義一個新版本的村民,看看效果如何。

附表:新版本村民歷史

Java

114——對村民進行了大改

11431144——最佳化

115——傻子村民現在沒有徽章,村民會被玩家趕下床

116——最佳化

1162——工作站點最佳化

攜帶基岩版

1100——大改

1110——最佳化

1130——村民現在會在戰勝襲擊後歡呼

116220——村民現在不再能夠穿牆過去睡覺

11810——村民現在會發射煙花火箭慶祝,交易時頭頂不會再出現綠寶石圖示

11830——最佳化

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

勇者鬥魔神 後衛之王 夢魘遊戲 網遊之終極主宰 我的小火球術10000米 網遊:雙天賦的我橫推諸天 籃壇禁區霸主