引用 | 编辑
storym88349
2009-09-21 20:06 |
楼主
▼ |
||
![]() ![]() 如果有回锅的话,可能是我没有看到,又或者是不小心给漏看了,多多包涵 ![]() 那么~进入正题~ 有写过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, "你选了退出!" ) //同样的,也可以输入别的命令 } } 写完~不懂请发问~有错请指正~ ![]() ![]()
|
引用 | 编辑
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) ↑ ↑ 这个不打可以吗@@ ![]() ![]() ![]() |
引用 | 编辑
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需与要连结的选单一样才有用 ![]() |
引用 | 编辑
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搞混。 此外要修改时,也可以直接修改定义,虽然有些鸡肋,但在大量重复使用时也是常用用法之一。 ![]() |
引用 | 编辑
a7811311622
2009-09-22 21:31 |
5楼
▲ ▼ |
我会说要加return是担心没加会变成:
按了"0"后的确是跳出,不过选单还在画面上…不知会不会变成这样… 至于switch和#define我之前写的插件都玩过了,所以我算是了解了… ![]() |
引用 | 编辑
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 (整数) ![]() |
引用 | 编辑
112459
2009-09-23 21:23 |
13楼
▲ ▼ |
那假如我想要写出像csdm(死斗)那落选单要怎写><
先选个手枪..选完再选步枪等>< 另外1023是代表什么= =? key = (1023)吗? 新手再问- - 那按了选择相对的指令打在那= =? .............................................................. 再问.... 复制程式 nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. 有点懂!" ) format是什么意思 255-nLen又是怎样= =? 相对的指令在那... ![]() ![]() |
引用 | 编辑
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来中断插件执行就完成了 ![]() |
引用 | 编辑
storym88349
2009-09-24 18:35 |
17楼
▲ ▼ |
引用 | 编辑
oscarbox2001
2009-09-24 19:37 |
18楼
▲ ▼ |
真猛呀..
最近想做个选单 类似把txt放在cstrike里面 然后把插件摆到玩家选单中 之后点进去 跑出个视窗 内有介绍等.. 如果大大有控的话 希望能帮忙一下.. ![]() |
引用 | 编辑
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/档案名称.副档名", 变数名称) 这样档案就算载入完毕了 不过最重要的读取却是有些难讲了 因为这涉及到文字档的内容编排,再决定要用什么指令 所以就暂时不讲了 ![]() |
引用 | 编辑
oscarbox2001
2009-09-25 17:47 |
20楼
▲ ▼ |
我想说的是..
做出一个插件 输入插件指令 打开motd那种..- - ![]() |
引用 | 编辑
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) } ![]() |
引用 | 编辑
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 这么长的浮点数... ![]() ![]() ![]() ![]() |
引用 | 编辑
a7811311622
2009-10-09 14:04 |
27楼
▲ ▼ |
下面是引用 Chaosx 于 2009-10-09 09:54 发表的 : 是吗…? ![]() ![]() 不过…之前测验的结果是…用Float好像也只能判断到小数点后1位而已… (例如数值我改"0.8"或"0.85"都好像没差…因为"0.85"跑出来的结果和"0.8"一样…) ![]() |
引用 | 编辑
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才可以 这样讲你懂吗? ![]() |
引用 | 编辑
storym88349
2009-10-09 17:10 |
29楼
▲ |
下面是引用 Chaosx 于 2009-10-09 09:54 发表的 : 所以可以依此类推去找出%f的范围设定? 像是%3.3就是显示小数点前三位和小数点后三位,没错吧? 不过数字为0可以省略这点,有点像是CNC程序呐...... ![]() |