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 页)