引用 | 編輯
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") 再來= = 複製程式 register_menucmd(register_menuid("\y選單教學:"), 1023, "MenuCMD" ) //註冊選單命令,menuid需與要連結的選單一樣才有用 x0 |
引用 | 編輯
a7811311622
2009-09-21 23:06 |
3樓
▲ ▼ |
引用 | 編輯
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 |
引用 | 編輯
a7811311622
2009-09-22 22:52 |
7樓
▲ ▼ |
引用 | 編輯
storym88349
2009-09-23 19:34 |
9樓
▲ ▼ |
引用 | 編輯
storym88349
2009-09-23 19:37 |
10樓
▲ ▼ |
引用 | 編輯
storym88349
2009-09-23 20:41 |
12樓
▲ ▼ |
下面是引用 koto07 於 2009-09-23 19:45 發表的 : 有的! 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. 有點懂!" ) format是什麼意思 255-nLen又是怎樣= =? 相對的指令在那... x0 |
引用 | 編輯
a7811311622
2009-09-23 21:51 |
15樓
▲ ▼ |
引用 | 編輯
storym88349
2009-09-24 18:31 |
16樓
▲ ▼ |
下面是引用 112459 於 2009-09-23 21:23 發表的 : 事實上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樓
▲ ▼ |
引用 | 編輯
oscarbox2001
2009-09-24 19:37 |
18樓
▲ ▼ |
真猛呀..
最近想做個選單 類似把txt放在cstrike裡面 然後把插件擺到玩家選單中 之後點進去 跑出個視窗 內有介紹等.. 如果大大有控的話 希望能幫忙一下.. x0 |
引用 | 編輯
storym88349
2009-09-24 20:47 |
19樓
▲ ▼ |
下面是引用 oscarbox2001 於 2009-09-24 19:37 發表的 : 呃...我有點被搞混 搞不清處到底是要在玩家選單中增加一個選單來顯示某個東西的介紹 還是製作一個用來顯示介紹的插件... 我就說顯示介紹的好了 有三種寫法,都是以讀取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樓
▲ ▼ |
引用 | 編輯
storym88349
2009-09-25 21:16 |
23樓
▲ ▼ |
引用 | 編輯
a7811311622
2009-10-08 11:16 |
24樓
▲ ▼ |
引用 | 編輯
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吧... 那是顯示浮點數用的耶.... 講白一點就是小數.... 如 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 發表的 : 是嗎…? 我都不知道的說… 不過…之前測驗的結果是…用Float好像也只能判斷到小數點後1位而已… (例如數值我改"0.8"或"0.85"都好像沒差…因為"0.85"跑出來的結果和"0.8"一樣…) x0 |
引用 | 編輯
storym88349
2009-10-09 17:07 |
28樓
▲ ▼ |
下面是引用 tony987852 於 2009-10-08 22:35 發表的 : 這就跟看目錄是一樣的道理 假如說,目錄裡有一行叫做: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的範圍設定? 像是%3.3就是顯示小數點前三位和小數點後三位,沒錯吧? 不過數字為0可以省略這點,有點像是CNC程序吶...... x0 |