SMA腳本:簡易舊版選單製作

Home Home
<< 1 2 >>
跳頁: (共 2 頁)
引用 | 編輯 storym88349
2009-09-21 20:06
樓主
推文 x7
咳咳!嗯...好久沒發文了,正在想要發什麼文來打發打發時間時,一時興起就來打一篇選單的製作教學,不過我只會舊版的,因為新版的我看不懂 表情  

如果有回鍋的話,可能是我沒有看到,又或者是不小心給漏看了,多多包涵 表情    

那麼~進入正題~



有寫過SMA的都知道,最關鍵的include一定要打,但是這邊我只講選單相關,所以include相關請自行尋找 表情    

那麼,請往下↓

複製程式
public plugin_init(){ 
    register_plugin("Menu","1.0","storym88349")    //註冊腳本,常識就不多說了 
    register_clcmd("say menu","ShowMenu",-1,"Show Menu")    //註冊命令,內容是說「menu」時執行ShowMenu 
    register_menucmd(register_menuid("\y選單教學:"), 1023, "MenuCMD" )    //註冊選單命令,menuid需與要連結的選單一樣才有用 
} 
public ShowMenu(id){    //這裡是輸入命令時的事件,在這裡顯示選單的內容 
    new szMenuBody[256]    //以new選告szMenuBody為變數,以此作為載體來儲存選單內容 
    new keys    //宣告按鍵 
    new nLen = format( szMenuBody, 255, "\y選單教學:^n" )    //選單標題、內容 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 有點懂!" ) 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. 好像懂!" ) 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w3. 應該懂!" ) 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w4. 不太懂!" ) 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w5. 你說啥?" ) 
    nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. 退出" ) 
    keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)    //設定按鍵,這不難懂吧? 
    show_menu( id, keys, szMenuBody, -1 )    //顯示選單 
} 
public MenuCMD( id,key ){    //執行選單的命令,此處的id下方需要用到此變數才加 
    switch( key ){    //switch在很多地方都用的到,ex:隨機選取 
    case 0: client_print( id, print_chat, "你選了有點懂!" )    //這裡的case0是w1的命令喔 
    case 1: client_print( id, print_chat, "你選了好像懂!" ) 
    case 2: client_print( id, print_chat, "你選了應該懂!" ) 
    case 3: client_print( id, print_chat, "你選了不太懂!" ) 
    case 4: client_print( id, print_chat, "需要我在說一遍?" )    //這段的意思是在玩家端的對話頻道顯示後面那句話 
    case 9: client_print( id, print_chat, "你選了退出!" )    //同樣的,也可以輸入別的命令 
    } 
}


寫完~不懂請發問~有錯請指正~表情

獻花 x2
引用 | 編輯 112459
2009-09-21 21:13
1樓
  
@@這個不錯~話說能再解釋一下include方面的東西嗎?
另外...選單的振鍵能改其他嗎???@@
↓                 ↓
keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)
↑                 ↑
這個不打可以嗎@@
表情 好文幫你推薦一下 表情

獻花 x0
引用 | 編輯 112459
2009-09-21 21:27
2樓
  
複製程式
    new szMenuBody[256]    //以new選告szMenuBody為變數,以此作為載體來儲存選單內容 
                 new keys    //宣告按鍵 
能解釋一下嗎?環是不太懂= =|||
複製程式
    register_clcmd("say menu","ShowMenu",-1,"Show Menu")
當中的-1是什麼一意....囧= =另外Show Menu又是為何=口=
再來= =
複製程式
    register_menucmd(register_menuid("\y選單教學:"), 1023, "MenuCMD" )    //註冊選單命令,menuid需與要連結的選單一樣才有用 
這個要怎去改= =

獻花 x0
引用 | 編輯 a7811311622
2009-09-21 23:06
3樓
  
雖然不太懂選單的寫法,不過以前看「超級M4+M203」裡的內容後,
發現:
複製程式
case 9: client_print( id, print_chat, "你選了退出!" )

好像要改成
複製程式
default:{client_print( id, print_chat, "你選了退出!" );return ╳╳╳;}
default好像是用在其他條件都不成立的時候的樣子,如果用case 9我也不知可不可行…
而return沒有的話應該不會退出選單吧…

雖然是讓我受益良多~不過…我看一堆人看到內容後就按"0"退出了吧…

獻花 x0
引用 | 編輯 storym88349
2009-09-22 19:12
4樓
  
回一樓:

include本來是不想說的,但既然問了,那就只好說了
AMX MOD X的腳本使用的是PAWN語言,又因為模仿了C/C++的架構,所以又被稱為Small C
include指令在C/C++語言中也是一定會用到的
#include <amxmodx>
#include <amxmisc>
這兩個是最基礎的兩個,主要是影響到語法的命令內容,include是「包含」的意思,用這個指令來載入所謂的「字典」
例如說,有個東西叫bomb_explode,這個命令是用在C4爆炸時執行事件,而此命令在csx之中,所以要加:
#include <csx>來使用,如果不加的話,在compile時就會顯示「無效的命令」,從而導致compile失敗

keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)
看字面就知道這是按鍵的設定
據說只打1023也可以正常執行,但是我想既然是教學,還是打完整的好

回二樓:

new szMenuBody[256]↓

用new來宣告新變數,字面上的意思就是,增加一個名為szMenuBody的變數,並給予256位元的資料儲存
在選單的語法中,每一句都有szMenuBody,就是要將資料儲存在這裡面。
變數的名稱可以自己給,只要你打的語法可以正常執行打什麼都可以。

register_clcmd("say menu","ShowMenu",-1,"Show Menu")

既然你問第三和第四格,前兩個我就不說了。
第三格指的是使用者的資格,-1是不列入計算,也就是所有玩家都可以。
第四格其實可以不用打也能執行,官方的原文是"Description of the command"也就是命令的描述。

register_menucmd(register_menuid("\y選單教學:"), 1023, "MenuCMD" )

這個其實有做整合,第一格其實只要打menuid就好,但是如果在這裡打了register_menuid的話,就不用在多打一行。
「選單教學:」就是選單的標題,前面的\y是顏色,y是黃色,w是白色,r是紅色,其他的我不太清楚,就麻煩你們自行研究了。
1023的意義,可以看我給一樓的回文,之所以這裡比較省略,是因為一個一個打實在很多。
最後的MenuCMD,就是連結到指令的語法,不難理解吧?名稱也可以隨便改。

回三樓:

我沒看過超級M4+M203的原始碼,不好意思...
case 9,是指switch(keys)的0鍵,是為了配合選單內容才這樣寫的。
default主要是用在所有case都不符合才使用的,我不太會用到它。
另外,在case之中如果要使用兩個以上的命令,才要在兩端加上{}

return的用法有三個:return PLUGIN_CONTINUE/PLUGIN_HANDLED/PLUGIN_HANDLED_MAIN
第一個就是繼續使用插件
第二個是說插件命令停止,直到下次呼叫
第三個我不太會用,大概是說停止命令,但不中斷呼叫
此外,可以打得簡短些,根據我打得次序,可以只打0/1/2來代替

補充:

既然提到了switch,就不得不說另一個也常常會使用switch的語法:隨機
複製程式
new rand = random_num(0,3)    //宣告變數rand,並使rand為隨機數字0~3(共四個) 
switch(rand){    //發現了嗎?這裡用的是變數rand,和按鍵的不同喔! 
    case 0: client_print( id, print_chat, "你抽到了一萬元!" ) 
    case 1: client_print( id, print_chat, "你抽到了五千元!" ) 
    default : client_print( id, print_chat, "你什麼都沒得到!")    //一時興起寫了default,很久沒用這個,有錯請指正 


如此如此這般這般,就完成了一段隨機的語法,那些隨機播放音效的大都是用這種方法寫的。




另外還有一個東西,叫做define(定義),和new的用法很像,但是又不太一樣
例如說,我先在#include下面打上#define keys (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)
這樣一來,整個插件之中,使用到keys的部份,就不需要重新宣告keys,直接使用就可以。
為何呢?因為我在一開始就把keys定義成(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)
所以就不需要在宣告變數,是個很方便的命令。

此外,在隨機的語法也可以用得上。
#define MAX_NUM 4
new rand = random_num(0,MAX_NUM-1)
發現了嗎?這樣寫和上面的隨機是一樣的喔!而且這樣寫就可以直接設定總數,而不會被第一個數字到底是0還是1搞混。
此外要修改時,也可以直接修改定義,雖然有些雞肋,但在大量重複使用時也是常用用法之一。

獻花 x3
引用 | 編輯 a7811311622
2009-09-22 21:31
5樓
  
我會說要加return是擔心沒加會變成:
按了"0"後的確是跳出,不過選單還在畫面上…不知會不會變成這樣…
至於switch和#define我之前寫的插件都玩過了,所以我算是了解了…
還真的像雞肋一樣…食之無味,棄之可惜啊…

獻花 x0
引用 | 編輯 koto07
2009-09-22 21:54
6樓
  
請問選單要有下一頁 又該怎樣寫 表情

獻花 x0
引用 | 編輯 a7811311622
2009-09-22 22:52
7樓
  
下面是引用 koto07 於 2009-09-22 21:54 發表的 : 到引言文
請問選單要有下一頁 又該怎樣寫 表情

雖然沒寫過…不過依在下淺見…應該是設定一個鍵可以開啟另一個選單,
簡單說寫兩個選單,然後利用一個鍵來交互切換…

以上言論純是猜測,如有雷同,純屬巧合…

獻花 x0
引用 | 編輯 koto07
2009-09-23 19:15
8樓
  
摁摁 我去試試看

獻花 x0
引用 | 編輯 storym88349
2009-09-23 19:34
9樓
  
下面是引用 koto07 於 2009-09-22 21:54 發表的 : 到引言文
請問選單要有下一頁 又該怎樣寫 表情


既然我在這篇教學中,將0設定為退出,那麼就依慣例,將9設為下一頁
在這邊要重新註冊新的選單,因為寫下一頁的語法其實不過是將另一個選單叫過來而已
將case 9的指令寫成顯示選單的指令,到下一頁之後,也可以依樣畫葫蘆的寫回到上一頁的語法

一切就是那麼的簡單表情

之前看過另一種寫法,但是我看半天都看不懂,所以只好作罷了

如果有人可以提供別的寫法的話,歡迎一起來研究~

獻花 x0
引用 | 編輯 storym88349
2009-09-23 19:37
10樓
  
下面是引用 a7811311622 於 2009-09-22 21:31 發表的 : 到引言文
我會說要加return是擔心沒加會變成:
按了"0"後的確是跳出,不過選單還在畫面上…不知會不會變成這樣…
至於switch和#define我之前寫的插件都玩過了,所以我算是了解了…
還真的像雞肋一樣…食之無味,棄之可惜啊…


理論上是不會繼續顯示啦...
不過真的不會消失的話在加也沒關係表情

小插件不加return一般是不會有所影響的,但是大插件不加的話就很容易出事...

獻花 x0
引用 | 編輯 koto07
2009-09-23 19:45
11樓
  
這個client_cmd是在玩家控制台執行的語法
那請問有從伺服器執行的語法嗎 表情

獻花 x0
引用 | 編輯 storym88349
2009-09-23 20:41
12樓
  
下面是引用 koto07 於 2009-09-23 19:45 發表的 : 到引言文
這個client_cmd是在玩家控制台執行的語法
那請問有從伺服器執行的語法嗎 表情


有的!
client是玩家端,而伺服器端則是server
因此,不難推斷出伺服器執行語法叫做server_cmd

只不過server_cmd的使用方法我不是很懂,就拿官方的舉例來說明好了:
複製程式
server_cmd("echo The maxplayers on this server is: %d",get_maxplayers())  


此外,官方的說明是:Executes command on a server console(中文翻譯:在伺服器控制台執行指令)

官方的舉例實行上是在控制台顯示此伺服器的最大玩家數
不過這個舉例只能說明它能夠用來顯示有變數的字句
不需要變數的情況下,用server_print就可以了

補充:

echo是顯示字句的語法,命令提示字元也有,有興趣可以玩玩看
官方的語言代換:
%s - String (字串)
%f - Floating point number (不太懂,請高手解答)
%d - Integer (整數)



獻花 x0
引用 | 編輯 112459
2009-09-23 21:23
13樓
  
那假如我想要寫出像csdm(死鬥)那落選單要怎寫><
先選個手槍..選完再選步槍等><
另外1023是代表什麼= =?
key = (1023)嗎?
新手再問- -
那按了選擇相對的指令打在那= =?
..............................................................
再問....
複製程式
    nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 有點懂!" ) 
nLen是什麼意思
format是什麼意思
255-nLen又是怎樣= =?
相對的指令在那... 表情

獻花 x0
引用 | 編輯 koto07
2009-09-23 21:26
14樓
  
怎樣可以只有按退出選單才會退出阿
按別的鍵 執行完會回到原本選單 表情

獻花 x0
引用 | 編輯 a7811311622
2009-09-23 21:51
15樓
  
下面是引用 storym88349 於 2009-09-23 19:37 發表的 : 到引言文


理論上是不會繼續顯示啦...
不過真的不會消失的話在加也沒關係表情

小插件不加return一般是不會有所影響的,但是大插件不加的話就很容易出事...

不知道是不是我邏輯不好…都靠理論寫插件寫到最後常常出錯…還要改來改去…表情
想加return是擔心沒有其他指令或條件將那個效果取消,才會直覺想到用return…

獻花 x0
引用 | 編輯 storym88349
2009-09-24 18:31
16樓
  
下面是引用 112459 於 2009-09-23 21:23 發表的 : 到引言文
那假如我想要寫出像csdm(死鬥)那落選單要怎寫><
先選個手槍..選完再選步槍等><
另外1023是代表什麼= =?
key = (1023)嗎?
新手再問- -
那按了選擇相對的指令打在那= =?
..............................................................
再問....
複製程式
 
  nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 有點懂!" ) 

nLen是什麼意思
format是什麼意思
255-nLen又是怎樣= =?
相對的指令在那... 表情


事實上1023的用法我也不太懂表情
因為只是聽說可以這樣寫,而實際上測試也確實可以,但在怎樣的情況下會無效就不得而知了。

nLen是字串代換,在標題的部份就有設定
format則是載入字串,在這裡的用法是將"^n\w1. 有點懂!"載入到szMenuBody儲存
之後在用show_menu( id, keys, szMenuBody, -1 )來顯示
255-nLen就是計算剩餘的容量單位,之前已經設定了szMenuBody為256,為了做1單位的保留空間,所以設255
當然,你要設256也無所謂,只要能正常執行就可以了

另外,相對的指令要另外寫。
注意喔,寫顯示選單的部份之所以設定keys,就是要在另外一個地方使用它
在最上方註冊語法的地方,有一段register_menucmd(register_menuid("\y選單教學:"), 1023, "MenuCMD" )
所以選單的命令是要寫在public MenuCMD之中的
(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9)
↑這個設定是官方給的,按照順序,1=0,2=1以此類推
所以第一項是寫在case 0而不是case 1

死鬥的原始碼我沒看過,但是也可以用我自己的想法寫出來
先註冊了一個命令,內容是在復活時執行命令
語法的內容則是顯示小槍選單
然後在寫取得小槍和子彈的命令,在命令之後在加上一段顯示大槍的選單

注意喔,如果在命令之中有執行某段顯示選單的公眾命令(public)的話,可以不用註冊顯示選單,但是要註冊選單命令

大槍的選單命令就寫取得大槍和子彈,最後再加上return PLUGIN_HANDLED來中斷插件執行就完成了

獻花 x1
引用 | 編輯 storym88349
2009-09-24 18:35
17樓
  
下面是引用 koto07 於 2009-09-23 21:26 發表的 : 到引言文
怎樣可以只有按退出選單才會退出阿
按別的鍵 執行完會回到原本選單 表情


在語法的最下面加上return PLUGIN_HANDLED來中斷執行

以上表情

獻花 x1
引用 | 編輯 oscarbox2001
2009-09-24 19:37
18樓
  
真猛呀..
最近想做個選單
類似把txt放在cstrike裡面
然後把插件擺到玩家選單中
之後點進去
跑出個視窗
內有介紹等..
如果大大有控的話
希望能幫忙一下..

獻花 x0
引用 | 編輯 storym88349
2009-09-24 20:47
19樓
  
下面是引用 oscarbox2001 於 2009-09-24 19:37 發表的 : 到引言文
真猛呀..
最近想做個選單
類似把txt放在cstrike裡面
然後把插件擺到玩家選單中
之後點進去
跑出個視窗
內有介紹等..
如果大大有控的話
希望能幫忙一下..


呃...我有點被搞混表情

搞不清處到底是要在玩家選單中增加一個選單來顯示某個東西的介紹
還是製作一個用來顯示介紹的插件...

我就說顯示介紹的好了
有三種寫法,都是以讀取txt或ini檔來決定顯示的內容
第一種是用client_print顯示在聊天頻道當中
第二種則是用show_hudmessage以HUDmessage的形式顯示,不過要多寫一段set_hudmessage
最後一種,是最麻煩、最複雜,同時也是比較美觀的一種,那就是show_motd
motd的寫法和選單幾乎一樣
都是宣告變數,然後用變數作為載體來儲存內容,最後用show_motd顯示

最後來說說怎麼用插件來進行外部檔案載入
先宣告變數名稱[大小]
然後用get_configsdir設定變數用途
get_configsdir(變數名稱,大小-1)-1保留空間
再用format載入讀取檔案
format(變數名稱,大小-1, "%s/檔案名稱.副檔名", 變數名稱)
這樣檔案就算載入完畢了

不過最重要的讀取卻是有些難講了
因為這涉及到文字檔的內容編排,再決定要用什麼指令
所以就暫時不講了

獻花 x0
引用 | 編輯 oscarbox2001
2009-09-25 17:47
20樓
  
我想說的是..
做出一個插件
輸入插件指令
打開motd那種..- -

獻花 x0
引用 | 編輯 storym88349
2009-09-25 19:09
21樓
  
下面是引用 oscarbox2001 於 2009-09-25 17:47 發表的 : 到引言文
我想說的是..
做出一個插件
輸入插件指令
打開motd那種..- -


這樣說就淺顯易懂了嘛表情

不說清楚我會想很多喔表情

獻花 x0
引用 | 編輯 koto07
2009-09-25 20:23
22樓
  
表情 表情 按鈕8 按了無反應......

獻花 x0
引用 | 編輯 storym88349
2009-09-25 21:16
23樓
  
下面是引用 koto07 於 2009-09-25 20:23 發表的 : 到引言文
表情 表情 按鈕8 按了無反應......


至少把你的原始碼放上來讓我看吧

只說按鍵8沒反應,我怎麼可能知道問題出在哪表情

獻花 x0
引用 | 編輯 a7811311622
2009-10-08 11:16
24樓
  
下面是引用 storym88349 於 2009-09-23 20:41 發表的 : 到引言文
echo是顯示字句的語法,命令提示字元也有,有興趣可以玩玩看
官方的語言代換:
%s - String (字串)
%f - Floating point number (不太懂,請高手解答)
%d - Integer (整數)

.......


我不知道有沒有 %f 耶…因為我只看過 %.1f 和 %2.1f …表情
不過 %2.1f 好像用在顯示時(例如顯示冷卻時間)會出錯,所以就不用 %2.1f 了…表情

獻花 x0
引用 | 編輯 tony987852
2009-10-08 22:35
25樓
  
那我想問,如果要執行public,那應該要怎辦?

public gun(id) {     <這個(id)裡面的id去掉有沒有影響?(題外話)
     give_item(id, weapon_m249)
}

獻花 x0
引用 | 編輯 ChaosX
2009-10-09 09:54
26樓
  
下面是引用 a7811311622 於 2009-10-08 11:16 發表的 : 到引言文
 

我不知道有沒有 %f 耶…因為我只看過 %.1f 和 %2.1f …表情  
不過 %2.1f 好像用在顯示時(例如顯示冷卻時間)會出錯,所以就不用 %2.1f 了…表情  

有%f吧...
那是顯示浮點數用的耶....
講白一點就是小數....
如 1.1   2.2    3.3


%2.1f是指...顯示小數點後面那一位...和小數點前2位數  如 12.3
%.1f  是只顯示小數點後1位   如     1.1     22.2          333.3         4444.4        55555.5          666666.6
印象中  %f  會顯示出...   1.12345678  這麼長的浮點數...
表情 表情 表情   

獻花 x0
引用 | 編輯 a7811311622
2009-10-09 14:04
27樓
  
下面是引用 Chaosx 於 2009-10-09 09:54 發表的 : 到引言文


有%f吧...
那是顯示浮點數用的耶....
講白一點就是小數....
如 1.1   2.2    3.3


%2.1f是指...顯示小數點後面那一位...和小數點前2位數  如 12.3
%.1f  是只顯示小數點後1位   如     1.1     22.2          333.3         4444.4        55555.5          666666.6
印象中  %f  會顯示出...   1.12345678  這麼長的浮點數...
表情 表情 表情   

是嗎…?表情 我都不知道的說…表情
不過…之前測驗的結果是…用Float好像也只能判斷到小數點後1位而已…
(例如數值我改"0.8"或"0.85"都好像沒差…因為"0.85"跑出來的結果和"0.8"一樣…)

獻花 x0
引用 | 編輯 storym88349
2009-10-09 17:07
28樓
  
下面是引用 tony987852 於 2009-10-08 22:35 發表的 : 到引言文
那我想問,如果要執行public,那應該要怎辦?

public gun(id) {     <這個(id)裡面的id去掉有沒有影響?(題外話)
     give_item(id, weapon_m249)
}


這就跟看目錄是一樣的道理

假如說,目錄裡有一行叫做:SMA的檔案編寫

而內頁卻沒有這個部份,那麼目錄裡的那一行是不是就多打了?

反之亦然,如果目路裡沒有,而內頁卻有的話,以一個報告來說,這是不對的

所以↓
public gun(id) {
     give_item(id, weapon_m249)
}

在give_item中使用了id這個參數
那麼gun就必須包含id才可以

這樣講你懂嗎?

獻花 x0
引用 | 編輯 storym88349
2009-10-09 17:10
29樓
  
下面是引用 Chaosx 於 2009-10-09 09:54 發表的 : 到引言文


有%f吧...
那是顯示浮點數用的耶....
講白一點就是小數....
如 1.1   2.2    3.3


%2.1f是指...顯示小數點後面那一位...和小數點前2位數  如 12.3
%.1f  是只顯示小數點後1位   如     1.1     22.2          333.3         4444.4        55555.5          666666.6
印象中  %f  會顯示出...   1.12345678  這麼長的浮點數...
表情 表情 表情   


所以可以依此類推去找出%f的範圍設定?

像是%3.3就是顯示小數點前三位和小數點後三位,沒錯吧?

不過數字為0可以省略這點,有點像是CNC程序吶......

獻花 x0
<< 1 2 >>
跳頁: (共 2 頁)