題外話,我先講清楚免得又有莫名其妙的人跑出來砲。我會用yupoo當相簿單純是因為當初在API開發上有一些項目,不要無限上綱到啥愛呆丸有的沒的鬼。
以前單位框架一直是使用X-Perl,但是4.0剛改版時,總有一些莫名其妙的錯誤,尤其增減益顯示不正常這個大問題,讓我不得不改用PitBull4。
雖然我一直以來都很欣賞PitBull4的功能,但由於該插件的預設介面實在有點蠢,雖然這個插件幾乎所有細節都可以自己調整,可是一般玩家實在很難有那個閒功夫去搞這些。所以仔細想想,這次X-Perl壞掉也並不是壞事,至少讓我把PitBull4用熟就是一件大好事。
今天主要分享的是一些關於生命、法力數值的Lua文字編寫,主要是嫌PitBull4內建的文字不夠好,也不符我使用習慣,才會去搞這些東西。

一開始我覺得最麻煩的地方是,隨著等級提高,首領血量愈來愈多,玩家血量也愈來愈多,因此時常遇到血量超出框架的事情,十分之礙眼。原本是用內建的「簡短模式」(Short函式),也就是說「100000」顯示成「100K」,剛開始看還好,幾分鐘之後愈看愈礙眼,畢竟在我心中長久以來就認定四位一進才是正確的用法,所以我下定決心要讓「100000」顯示成「10萬」。
於是我參考Short函式自己寫了個數值顯示的函式:
local cur,max = HP(unit),MaxHP(unit)
……
CorrectNumber1=CorrectNumber1 or function(value)
if(value>=10000000000 or value<=-10000000000)then--高於百億則顯示「X億」
fmt = "%.0f億"
value=value/100000000
elseif(value>=1000000000 or value<=-1000000000)then--高於十億則顯示「X.X億」
fmt = "%.1f億"
value=value/100000000
elseif(value>=100000000 or value<=-100000000)then--高於億則顯示「X.XX億」
fmt = "%.2f億"
value=value/100000000
elseif(value>=1000000 or value<=-1000000)then--高於百萬則顯示「X萬」
fmt = "%.0f萬"
value=value/10000
elseif(value>=100000 or value<=-100000)then--高於十萬則顯示「X.X萬」
fmt = "%.1f萬"
value=value/10000
else
fmt = "%d"
value = math.floor(value+0.5)
end
return fmt:format(value)
end
return "%s/%s(%s%%)",CorrectNumber(cur),CorrectNumber(max),Percent(cur,max)--最終顯示「生命/上限(百分比)」
……
效果:

接著我又想了,如果游標移上去的時候,能顯示完整數字,好像會比較好。
於是我在前面加了一行:
……
if(IsMouseOver())then
return "%s/%s(%s%%)",cur,max,Percent(cur,max)
else
……
效果:

最後,由於PitBull4內建的狀態「離線」是顯示為「Offline」,同樣的,愈看愈礙眼。於是我把「return s」改成「return gsub(s,"Offline","離線")」,蘇胡!
最終成品是這樣:
local cur,max = HP(unit),MaxHP(unit)
if(max>0)then
if(IsMouseOver())then
return "%s/%s(%s%%)",cur,max,Percent(cur,max)
else
local s = Status(unit)
if(s)then
return gsub(s,"Offline","離線")
else
CorrectNumber1=CorrectNumber1 or function(value)
if(value>=10000000000 or value<=-10000000000)then
fmt = "%.0f億"
value=value/100000000
elseif(value>=1000000000 or value<=-1000000000)then
fmt = "%.1f億"
value=value/100000000
elseif(value>=100000000 or value<=-100000000)then
fmt = "%.2f億"
value=value/100000000
elseif(value>=1000000 or value<=-1000000)then
fmt = "%.0f萬"
value=value/10000
elseif(value>=100000 or value<=-100000)then
fmt = "%.1f萬"
value=value/10000
else
fmt = "%d"
value = math.floor(value+0.5)
end
return fmt:format(value)
end
return "%s/%s(%s%%)",CorrectNumber1(cur),CorrectNumber1(max),Percent(cur,max)
end
end
end
話說人心總是不足的,生命值處理好,就開始打法力值的主意。這法力值數字方面完全可以拿剛剛寫的生命值函式套用,但玩家的法力值提昇並沒有像生命值提昇的幅度這麼大,所以該函式「十萬」(elseif(value>=100000 or value<=-100000)then)的那部分改成「一萬」(elseif(value>=10000 or value<=-10000)then)。
另一個問題是,法力以外的東西,怒氣、能量、集中值,好像根本就沒有必要顯示上限跟百分比吧?怒氣還好,像那種110符能、120能量的,加上百分比有時候根本會造成玩家在控制能量上的誤判。所以我們加個小條件,上限在兩百以下的,不顯示上限和百分比:
……
if(max<=200)then
return "%s",cur
else
……
當然,由於前面還是有「if(IsMouseOver())」這個條件,所以游標移上去一樣會顯示完整數值跟百分比。
最後寫好長這樣:
local cur,max = Power(unit),MaxPower(unit)
if(max>0)then
if(IsMouseOver())then
return "%s/%s(%s%%)",cur,max,Percent(cur,max)
else
CorrectNumber2=CorrectNumber2 or function(value)
if(value>=10000000000 or value<=-10000000000)then
fmt = "%.0f億"
value=value/100000000
elseif(value>=1000000000 or value<=-1000000000)then
fmt = "%.1f億"
value=value/100000000
elseif(value>=100000000 or value<=-100000000)then
fmt = "%.2f億"
value=value/100000000
elseif(value>=1000000 or value<=-1000000)then
fmt = "%.0f萬"
value=value/10000
elseif(value>=10000 or value<=-10000)then
fmt = "%.1f萬"
value=value/10000
else
fmt = "%d"
value = math.floor(value+0.5)
end
return fmt:format(value)
end
if(max<=200)then
return "%s",cur
else
return "%s/%s(%s%%)",CorrectNumber2(cur),CorrectNumber2(max),Percent(cur,max)
end
end
end
效果:
法力一般狀況:

法力游標對象:

能量一般狀況:

能量游標對象:

發這篇教學不像教學,心得不像心得的東西,主要還是希望大家能一起使用PitBull4、Parrot這類自訂空間很大的插件,多動動腦,打造自己滿意的功能與介面。
像PitBull4,你看哪裡不爽就改哪裡,尤其自訂Lua文字這個強到有點變態的功能,幾乎已經變成了你不需要學習編寫插件,就能編寫出自己想要的插件!只要你想,甚至可以用PitBull4寫出一個Grid。(無誤)
最後碎碎唸一下……我實在搞不懂整合包的意義到底在哪裡(小紫例外,小紫做到了整合函式庫,自己也有相當的插件開發功力,如Cartographer_QuestInfo),知道自己該用什麼插件的人,會去用整合包嗎?
至於不懂的人,你們難道就沒辦法預見自己用了整合包,下場就是一個悲劇嗎?啊你都已經不懂了,還去用別人包了一大堆你完全不曉得它們功能的東西?更別說現在許多整合包都亂塞一些功能重疊並且預設啟用的東西。