AMXX 插件编写指南。(AMXX新手必看)!

社区服务
高级搜索
猴岛论坛CSGO反恐精英CS个性化修改专区AMXX 插件编写指南。(AMXX新手必看)!
发帖 回复
正序阅读 最近浏览的帖子最近浏览的版块
8个回复

AMXX 插件编写指南。(AMXX新手必看)!

楼层直达
446709528

ZxID:2941539

等级: 少将
叫我小郭
举报 只看楼主 使用道具 楼主   发表于: 2010-07-06 0
[    post][/post]1. 介绍
Pawn 语言是一种跨平台的脚本语言. 我们常看到两种类型的语言, 一种是"编译"语言, 例如: C 和 C++. 一种是"解释"语言, 像 VB Script.
AMX Pawn 语言是两者的混合体: 将脚本编译成二进制文件, 并由 AMXx 来解释它.

当然, 在编写你的脚本之前, 你必须先知道几种结构.
第一是 "变量".
变量是一个符号或者标记用来保存数据. 例如:变量 "a" 能够保存数字 "2", "16", "0", 等等. 变量由程序创建一个空间让你保存数据. 你必须在使用它们之前先定义你的变量. 变量用 = 号来赋值:


new a,b,c,da=5b=16c=0d=500
第二是 "函数". 函数是一个符号或者标记, 当你调用它的时候, 它就会执行一些操作. 这意味着当你调用它们的时候, 它们将会处理你提供给它们的数据.
函数有几种类型, 但是调用的方法还是类似的. 例如: "show" 函数输出几个数据到屏幕上:


show(56)      //激活 "show" 函数, 并将值 56 传递给它show()        //激活 "show" 函数但是不传递数据给它show(a)      //激活 "show" 函数, 并将变量 a 的值传递给它
注意, 任何以 "//" 开头的文字都属于注释.
你所传递给函数的每一个数据都称之为 "参数". 一个函数可以有几个参数, 而你必须保证传递给函数的参数数据必须正确.
如果参数是两个数字, 你就不能传递一个单词.
函数也可以返回数据, 像这样:


new bb = add(5, 7)
在例子中, 假设 "add" 是一个将两个数字相加并返回和的函数, 变量 "b" 的值将为 12.

第三个概念是 "代码块", 也就是结构化. 你可以将一段代码用 { 和 } 符号合并成一个代码块.
例如:


{      here      is      some      code}通常我们习惯尽可能地使用代码块, 并将代码块里面的代码缩进.

以上是介绍 Pawn 语言的背景.



2. Pawn 语言基础
目录:
变量
 
数组
 
字符串
 
函数
 
表达式与操作
 
条件
 
循环
 
二维数组
 
编译器指令
 
结束语
 
1. 变量
 

Pawn 语言是一种可嵌入的, 几乎无类型的, 容易使用的虚拟机脚本语言.
AMX Mod X 使用 Pawn 语言传递函数到 Half-Life 引擎, 使用 Pawn 虚拟机和 Metamod (Pawn 是用 C 写的, Metamod 是用 C++ 写的).
当你写完脚本之后, 必须用 AMX Mod X 提供的编译器编译成二进制文件. AMX Mod X 小组在每一个版本都有随之分发.

用 Pawn 语言来编写脚本是很容易的, 并且不需要使用其他语言用不到的概念, 例如 指针, 向量, 结构, 类, 流, 等等.
Pawn 语言只有三种数据类型. 默认的数据类型是整数. 一个变量名不能大于 19 个字符, 而且必须用字母开头.
它可以包含 A-Z, a-z, 0-9, 还有下划线 ("_").
变量名对大小些敏感, 例如 "myvar", "MyVaR", 和 "MYVAR" 是三个不同的变量. 定义一个变量可以是用 "new" 关键字:


new a              //定义一个变量 "a"new b=5            //定义一个变量 "b" 并赋值为 5.new c=5.0          //这样不合法, 技术上, 5.0并不是一个整数!new d="hello"      //这样不合法, "hello" 不是一个数字.//你也可以在一行里定义多个变量:new e,f,g,hnew x=7, y=3
你也可以用 "Float" 关键字定义一个浮点数, 即带有小数部分的整数. 定义方法如下:


new Float:a              //定义一个浮点数变量 "a"new Float:b=5.3          //定义一个浮点数变量 "b" 并赋值为 5.3.new Float:c=5            // 这样虽然合法, 但是编译器会出现一个警告信息.new Float:d="hello"      //这样不合法, "hello" 不是一个浮点数.你也可以这样://float(n) 是一个将整数转换为浮点数的函数.new Float:var = float(5)new Float:var2 = 5.0        new Float:var3 = 1.0*5new var4 = floatround(5.0)        //注意: floatround(n) 是一个将浮点数转换为近似整数的函数.
注意 - 空格的多少并没有什么关系, 编译器会处理. 但是也不能太离谱, 例如: "new var = 5" 和 "new var=5" 是相同的, 但是 "newvar=5" 就完全错了.

最后一个数据类型是逻辑值. 只有 "真" 和 "假" 两个值.


new bool:IsItOn          //定义一个逻辑值 "IsItOn", 默认为 "假".new bool:xyz=true        //定义一个逻辑值 "xyz" 并赋值为 "真".

2. 数组
 

Pawn 的其中一个功能: 数组. 数组是一组数据的集合. 这样你可以在一个变量里储存多个数据!
数组的定义方法和普通变量一样, 并且类型也和普通一样. 它能包含多个数据. 用括号 [] 来定义数组的元素数量, 例如:


//定义一个 32 个元素的数组 "Players" new Players[32]//你可以使用数组中的任何一个元素, 每个数组的元素的位置都是由 0 到 n-1//每一个数组的元素的位置都是从 0 开始的.//为数组的第一个元素赋值 5Players[0] = 5//令数组的第二个元素的值为第一个元素的值Players[1] = Players[0]//以下是不合法的!//虽然数组有 32 个元素, 但是元素的位置是 0 到 31.//这样做会出现 AMX_ERR_BOUNDS 错误.//或者, 无法编译.Players[32] = 15//这样更不合法了.Players[-1] = 6new a = 3//以下这样做也是一样不合法.//a 必须是一个常数, 在这里 a 是一个变量:new BadArray[a]const b = 3new GoodArray//你也可以使用 编译器指令 (见最后一章)#define ARRAY_SIZE 3new Array[ARRAY_SIZE]
数组定义时也可以赋值, 像这样:


new Numbers[4] = {0,1,2,3}//注意: 赋值时元素的数量必须完全吻合.
你也可以使用其他数据类型的数组:


//浮点数数组:new Float:Numbers[4] = {0.0, 1.2, 2.4, 3.8}//逻辑值数组. 以下将初始值都赋值为 true 了.new bool:playerHasGun[32] = true

3. 字符串
 

你也许注意到我们好像没说过一个重要的数据类型 - 字符 (字母和符号). 它们被称为 "字符串", 在 Pawn 语言里, 他们只是一些数字!
一个字符串是一个 ASCII 字符的数组. 例如:


//定义一个字符串 "myString" 包含字符 "Hello".    //它将有 6 个元素, 因为它包含了 5 个字符.    //最后一个元素保留为数字 0, 这样 Pawn 引擎就可以知道这是一个字符串.new myString[] = "Hello"//注意: 任何在 /* 和 */ 之间的文字都属于注释. 你不能在 /* */ 里包含另一个 /* */./* 以下做法的结果和上面一样, 但是, 复杂的多, 所以我们不推荐你这样做.*/      原理是 "Hello" 的每个字符串保存在 myString 数组中.new myString[6]myString[0] = "H"myString[1] = "e"myString[2] = "l"myString[3] = "l"myString[4] = "o"myString[5] = 0/*你不能像下面这样做! 这样可能会导致溢出.*/new myString[6]myString = "Hello"        //INVALID!myString[0] = "Hello"    //INVALID!//如果你想添加一个字符串, 你可以这样做:new goodString[6]copy(goodString, 6, "Hello")//copy 函数可参见 点通 AMXx 常用函数汉化小组 汉化的函数文档.:copy(destination[], length, source[])//最后, 为了证明字符串只是一个包含数字的数组, 请看以下例子:new weird[6]weird[0] = 68weird[1] = 65weird[2] = 73weird[3] = 86weird[4] = 68weird[5] = 0//这将定义变量 "weird" 并赋值为字符串 "DAVID".//如果想知道字母和符号是怎样转换为数字的话, 可访问 www.asctiitable.com

4. 函数
 

Pawn 语言允许你定义自己的函数. 函数可以让你的代码重用.
注意: 所有函数必须返回值. 你可以使用 "return" 命令, 用来中止函数并返回值.
例如:


//这个函数没有任何参数, 并且返回 1.//当使用的时候, 它执行了一个实际上不存在的函数 "print".//这只是作为例子.show(){      print("Hello!")      return 1      //End, return 1}//使用方法:show()
你也可以定义需要参数的函数.


//以下定义了一个函数 "add_two_numbers", 将两个数字相加.add_two_numbers(first, second){      new sum = first + second      return sum    //Return the sum}//你可以这样使用它:new a,ba = 5a = 12new c = add_two_numbers(a,b)//c    将等于 5 +12 = 17.
在函数的参数中, 你可以使用任何数据类型. 参数是通过 "传递" 机制而发送到函数的.
你可以将数据或者变量传递给函数.


//下面定义了一个新函数 "add_two_floats"//可以将两个浮点数相加.Float:add_two_floats(Float:first, Float:second){      new Float:sum = first + second      return sum}new Float:anew Float:ba = 5.0b = 6.3new Float:cc = add_two_floats( a+b )//c 将等于 5.0 + 6.3 = 11.3//你甚至可以传递数组! 你不需要指定数组的大小.//如果你指定了, 你就必须确定你传递到函数的数组的大小和类型与你所定义的一致.add_two_from_array(array[], a, b){      new first = array[a]      new second = array      new sum = add_two_numbers(first, second)      //使用我们先前定义的函数          return sum}
记住, 数组是使用 "引用传递" 机制.
当我们传递一个普通的值的时候, 它将先复制到内存中, 然后传递给函数, 之后删除.
但是在传递数组时, 由于数组可能非常大, 所以使用 "引用传递" 机制.
这意味着如果你在函数里改变了数组的值, 原先的数组也会改变.
例如:


//这个函数将交换数组里位置 a 和位置 b 的值.swap_slots(array[], a, b){      new temp                //注意, 在交换之前你必须先存储其中一个位置的值作为临时变量                          //否则, 你不能交换两个数的值! 这是一个很经典的问题了.                          //如果你有 a 和 b, 将 b 赋值为 a 然后消除 b 原先的值.      temp = array      array = array[a]      array[a] = temp}new myArray[2]myArray[0] = 5myArray[1] = 6swap_slots(myArray, 0, 1)//myArray[0] 为 6, myArray[1] 为 5//你可以通过使用 "const" 关键字来防止数组的值被改变, 像这样:add_two_from_array(const array[], a, b){      new first = array[a]      new second = array      new sum = add_two_from_array(first, second)      return sum}//注意,当你使用函数的时候, 你可以保证数组不会修改了.//这个函数将数组作为常量来传递. 所以此函数是无法生效的.bad_function(const array[]){      array[0] = 0}
下载地址:http://www.qiannao.com/space/show/niuyanbin/上传分享/2009/5/2/1000多个SMA.rar/.page
[    post][/post]
本帖de评分: 1 条评分 DB +30
DB+30

谢谢分享

我是QQ洲

ZxID:12675596

等级: 上尉
QQ洲
举报 只看该作者 8楼  发表于: 2010-08-01 0
NIU
爷们辅助

ZxID:6991542

等级: 贵宾
混蛋!我的元老呢?

举报 只看该作者 7楼  发表于: 2010-07-24 0
这个命令是很多的,楼主虽然不全,但我还是说一句,谢谢分享!
l375985082

ZxID:12661185

等级: 上等兵
月下幽灵
举报 只看该作者 6楼  发表于: 2010-07-20 0
好复杂~!!!!  
ddbblove

ZxID:1121959

等级: 中士
举报 只看该作者 5楼  发表于: 2010-07-18 0
学些~
mhjl

ZxID:1170230

等级: 列兵
举报 只看该作者 4楼  发表于: 2010-07-09 0
看看
ヤ - 厌倦

ZxID:7457705

等级: 大元帅
收元帅和猴子,有意者PM。

举报 只看该作者 地板   发表于: 2010-07-06 0
额,了解。看过了
446709528

ZxID:2941539

等级: 少将
叫我小郭
举报 只看该作者 板凳   发表于: 2010-07-06 0
外带1000多个插件源码,各位笑纳!

; 管理员 基本类 - 两个中只能使用一种
admin.amxx  ; 管理员 基本 (与管理员相关的插件都需要该插件)
;admin_sql.amxx  ;管理员 基本 - SQL 版本 (注释掉 admin.amxx)   
; 基本类
admincmd.amxx  ; 基本的管理员控制台命令
adminhelp.amxx  ; 给管理员控制台命令提供帮助的命令
;adminslots.amxx debug ; 管理员预留通道
multilingual.amxx ; 多语言管理

; 菜单类
menufront.amxx  ; 管理员菜单格式
;cmdmenu.amxx  ; 命令菜单 (声音播放, 各种设置)
plmenu.amxx  ; 玩家菜单 (踢人, 封人, 客户端命令等.)
;telemenu.amxx  ; 传送玩家菜单 (需要开启娱乐模块!)
OnlineAdmin.amxx        ;在线管理员显示
mapsmenu.amxx  ; 地图菜单 (投票, 切换地图)


; 聊天 / 信息 类
adminchat.amxx  ; 控制台聊天命令
antiflood.amxx  ; 阻止客户端向服务器灌水
scrollmsg.amxx  ; 显示一条滚动信息
imessage.amxx  ; 显示消息信息
adminvote.amxx  ; 投票命令

; 地图相关类
maphandler.amxx        ; 自动更新map.ini文件(AMX地图处理机)
nextmap.amxx  ; 显示地图循环的下一张地图
mapchooser.amxx        ; 允许投票选择下一张地图
timeleft.amxx  ; 显示当前地图的剩余时间

; 配置类
pausecfg.amxx  ; 允许暂停或者恢复某些插件的使用
statscfg.amxx  ; 通过菜单或者命令来管理数据统计插件
;miscstats_cn.amxx  ; 显示CS中各种stats数据以及事件广播
;stats_logging.amxx ; 武器数据统计记录 (需要开启 CSX 模块!)
statsx.amxx                ;显示玩家游戏数据
;stats.amxx ; 在死亡或者结束一局的时候显示统计信息 (需要开启 CSX 模块!)
;miscstats.amxx  ; 为反恐精英集成各种事件通告

; 反恐精英
;restmenu.amxx  ; 禁用武器菜单

; 允许使用 AMX Mod 插件
amxmod_compat.amxx ; AMX Mod 向后兼容层


; 自定义类 - 添加第三方插件到这里  本插件由QQ:544867418收集
say_menu.amxx  ; 按Y键后输入menu可以打开管理员菜单或玩家菜单
;votemenu.amxx  ; 投票踢出玩家和投票封禁玩家
;high_ping_kicker.amxx ; 踢高Ping
amx_bank_cn.amxx        ;银行插件1(中文版)(i权限)
;amx_bank.amxx          ;银行插件一样(英文版) [适合CS1.6]
lastmanbets.amxx        ;赌博(死后进行赌博,猜哪方胜利)
drop_gren.amxx          ;掉手雷
;flashbangs.amxx        ;彩色闪光弹
;Gore_Plugin.amxx        ;血腥
;c4_kill.amxx            ;C4杀人
;slaylosers.amx          ;失败全死
ctpickupc4.amxx        ;CT捡包埋包
;AllowCenterHUD.amxx    ;彩色显示
;multikill_cn.amxx        ;多种语言的管理
;hospital.amxx          ;医院
;bcd_hud.amxx            ;C4倒记时
;throwing_knives.amxx    ;飞刀
;only_one_name.amxx      ;禁止改名插件,只允许使用1个名字
one_name_cn.amxx      ;不能更改名字[中文版]
key_bind.amxx          ;帮玩家邦定按键
;GHW_Blood_Color.amxx    ;改变血的颜色
frostnades.amxx        ;寒冰手雷
;grentrail.amx        ;手雷彩虹弹道
;weapon_knife.amxx          ;第一局刀战
;amx_dib.amx    ; 显示死亡原因弹道
;Bullet_Whizz.amxx          ;子弹声音
;bullet_damage.amxx        ; 显示每一木仓打的HP (bullet_damage 1)
;TimeProjector.amxx    ; 在屏幕左上角实时显示当前日期,时间,地图时间
;plugin_bonus1.amxx        ;前5名杀人加钱
;unlimited_money.amxx      ;金钱无上限
;Ryu_MoneyX.amxx            ;捡钱发钱无限金钱
;unlimited_money2.amxx      ;新金钱无上线[修复8000的限制什么的]
knife_after_throw_nade.amxx;扔雷换刀插件
liuyangyang.amxx          ;扔木仓换刀插件
warcraft3FT.amxx          ;魔兽CS 冰峰版
;uwc3.amxx                  ;魔兽争霸40级
;warcraft3.amxx  ; 魔兽争霸3 2.6.3 中文版
;war3ft.amxx              ;魔兽冰峰版[3最新版]
;admin_radar.amxx          ; 管理员在雷达上看到所有玩家[L权限]
;amx_ejl_playerghosts.amxx ; 玩家鬼魂显示
;amx_atagger.amxx          ; 管理员名字前面加标记
;hy_admin_adv.amxx        ; 管理员赖皮
;admin_spec_esp.amxx      ; 管理员死后监视玩家视角
;leader_glow.amxx          ; 双方排名第一的人发光
;adminlisten.amxx          ; 管理员看到所有玩家的讲话
;CsummzCN.amxx        ;管理远换衣服(倒..大家都可以换..)
;amx_medkit.amxx            ;//玩家死亡后变急救包插件
;lc_admin_cn.amxx        ;OP管理功能的集合,集合了用户修改密码,OP对玩家的操作等等,比如加
;lc_mymenu_cn.amxx              ;  消耗经验来使用某些功能,如换图,踢出玩家,杀死玩家,重新开始,
;lc_core_cn.amxx                    ;帐号的注册与登录
;lc_misc_cn.amxx                ;经验和点数的增加和减少,整合了第一个杀人奖励功能,放包奖励经
;lc_funmenu_cn.amxx                    ;消耗经验来换取金钱,点数等等
armordrop.amxx                        ;[AMXX]CS 防具掉出插件
;start_health.amx                      ;玩家出生自動108HP值
;amx_super.amxx                    ;很多NB的命令,不能一一列出,因为太多了-_-
dropdefuser.amxx                ; 让CT能扔拆弹器钳子 (bind * dropdefuser)
;bombstealer.amxx                ; 偷炸弹 (say /steal)
;amx_adminmodel.amxx            ; 管理员模型(别人进F时需下载5M左右的人物模型/VIP会员模型B权限)
;amx_hs_only.amxx                ; 只有暴头才死
AFK_C4.amxx                    ; C4携带者不动掉出炸药包
;weapons_menu.amxx                  ;送HP和AP<A. 管理
;admin_command.amxx                    ;送钱<管理员>
;Timer12.amxx  ;白天黑夜及四季变化插(不建议)
grenaderealism.amxx                ; 手榴弹长时间握手里会爆炸
;idregcn.amxx                        ;帐号
;auto_player.amxx                      ;玩家进入服务器后自动加入人少一方
;Weather.amxx            ;雨雪天气
;reward_sim.amxx                  ;掉钱捡钱<强烈介意不要打开,这鸟东西太没用了>
;liuyangyang1.amxx                    ;骷...鬼魂
;deathbones.amxx                ;死后几秒变成骷髅
;sign2.amxx              ; 点通签名
;enterleave.amxx          ; 显示排名、IP地址、进入离开服务器信息提示
;sign.amxx                          ; 个性签名
;flag_name.amxx                      ; 名字前加标记
;client_exec.amxx  ;管理员让指定玩家执行指定的命令
;blindfury.amxx                ;高手专用黑喑之王娱乐插件
;Fake_Playe_CN.amxx                  ;分身术
admin_mark.amxx      ;管理员标志<管理员个性帽子>[C权限]
;fog.amxx                              ;雾颜色插件[X]
;bind.amxx                  ;超级绑定键盘(没有弄清楚)
;name.amxx            ; 限制名字包含、限制长名、禁止改名
;antisilentrun.amxx        ;禁止小跳[狗跳]插件
;day_changer.amxx            ;日光转换
sillyc4.amxx                        ;C4(土匪的炸药包)可以放在墙上!+放C4时可以移动
;WaterWorld.amxx                      ;水世界
;idreg.amxx                              ;ID注册
;amx_gasnades.amxx        ;毒气弹,把烟雾弹改成毒气(需要开启engine模块)
;ctbombstealer.amxx      ;CT捡到包后变YIP(不知道是什么意思/没什么用..不知VIP)
;negativeflash.amxx              ;被闪光闪到几秒中敌人透明(AMXX中可以开启队友防闪)
;OooH_Team_Flashed.amxx          ;被队友闪到时,闪光为红色(会有惩罚的)
;admins_manager.amxx                      ;CS游戏中管理员
hy_sunglasses.amxx                        ;防闪镜*太阳镜
;amx_buyc4.amxx                    ;购买C4[英文]
;amx_buyc41.amxx                  ;购买C4[中文]
;webmod_pass.amxx      ; 即时战况
;sign2.amxx              ; 点通签名插件
;night_day.amxx          ; 日光改变
;ip_filter.amxx          ; 禁止指定IP(段)进入
;amx_ejl_missiles.amxx          ;导弹插件(需要开启engine和cstrike模块)
;amx_ejl_jetpack.amxx          ;飞行器(需要开启engine和cstrike模块)
;weapons_menu_cn.amxx                  ;管理员送武器菜单<amx_weaponmenu> (建议和保镖机器人一起开/估计A权限)
446709528

ZxID:2941539

等级: 少将
叫我小郭
举报 只看该作者 沙发   发表于: 2010-07-06 0
表达式
 

表达式和数学式子差不多, 都是计算一些数据并返回值.
表达式通常是一些括号表达式的组合, 并通过固定的顺序来计算 (从内到外, 先计算括号内的, 然后是乘法, 除法, 加法, 减法, 等等), 像四则混合运算法则一样.
任何地方都可以使用表达式. 你可以设置变量的值为表达式, 甚至可以传递到函数.


//这是一个简单的表达式. 返回数字 0.0//为了更容易看懂, 这样也是可以的:(0)
如果一个表达式非 0 或者非假, 它不但返回它的值, 还可以返回真. 否则, 它将返回 0, 也就是假.


//以下是一些数学表达式. 数学符号是:// + 加// - 减// * 乘// / 除// % 模运算 (余数 (5%2 等于 1))(5+6)                          //返回 11((5*6)+3)                      //返回 33((((5+3)/2)*4)-9)              //返回 5((5*6) % 7)                    //返回 2//其他表达式:(true)                        //返回真(5.0 + 2.3)                    //返回浮点数 7.3//还有一些可直接用到变量上的表达式.new a = 5new b = 6//自加符号.a++            //返回 a+1, 或者 6. 先返回自己的值, 再将自己加 1.++a            //也返回 a+1, 或者 6. 先将自己加 1, 再返回自己的值.
两者有一个微妙的差别. a++ 先返回自己的值, 再将自己加 1. ++a 先将自己加 1, 再返回自己的值.
可以在条件或循环语句中使用此操作以节省时间.


a--            //返回 4, 先返回自己的值, 再将自己减 1.--a            //返回 4, 先将自己减 1, 再返回自己的值.//注意: a++ 实质上等于:a = a + 1//你也可以这样写代码:a = a 操作符 y//操作符 是一个数学运算符的话. 可以精简成:a 操作符= x//请看下面例子:a += 1          //等同于 a = a + 1a -= b          //等同于 a =    a - ba *= 0          //等同于 a = a * 0a /= 2          //等同于 a = a / 2.
数学运算符 并不是唯一的操作符. 还有其他操作符可以让你进行逻辑判断.


//"与" 操作符: &&. 比较左右两边的表达式,//如果都为真, 则返回真.//如果两者都不为真, && 返回假.(1 && 0)    //返回假, 因为 1 返回真, 而 0 返回假.    (1 && 2)                      //两边都为真, 所以返回真.(true && false)                //假(false && false)              //假(true && true)                //真//另一个重要的操作符 "或": ||. 如果两边之中的一边为真,    则返回真.(1 || 0)                      //真, 因为 1 为真.(1 || 2)                      //真(true || true)                //真(false || false)              //假(true || true)                //真
还有其他操作符, 但你可能不常用. "位与" 操作返回一个二进制序列是否包含在另一个序列之中.
在技术上的限制, 它在两个数字的每一个二进制位上都执行 "与 (&&)" 操作.
例如: 如果你有数字 "9", 二进制码为 "1001". 如果你要知道它是否包含 "8" (1000), 你可以这样做:


//返回 8, 因为 8 确实是 9 中的一位.(9 & 8)//4 (00100) 并不是 16 (10000) 中的一位, 所以返回 0.(16 & 4)//下一个操作符是 "位或": |//它在两个数字的每一个二进制位上都执行 "或 (||)" 操作.//下面将 9 (1001) 与 3 (0011) 比较, 返回 1011, 或者 11.(9 | 3)
这两个操作符虽然重要, 但是并不常用. 它们是位移操作符, << 是左位移, >> 是右位移.


//将数字 3 (00011) 的二进制码向左移动 3 位, 结果为 (11000), 或者 24.(3 << 3)//将数字 24 (11000) 的二进制码向右移动 3 位, 结果为 (00011), 或者 3.(24 >> 3)
最后一个操作符是 "位非": !. 它将数据做相反操作. 用于数字上的时候, 它将交换数字的二进制码 (1 变为 0, 0 变为 1).


//返回假(!true)//返回真(!false)//将 9 (二进制码 1001) 变为 6 (二进制码 0110).(!(9))                       

6. 条件
 

条件语句可以让你在某种情况下执行你所指定的操作.
最重要的条件语句是 "if ... then". If 计算给定的表达式的值为 "真" 或 "假".
如果为真, 则执行代码块. 否则, 执行另一个代码块. 例如:

这是一个最基本的 if ... then 语句. 第一行检查表达式是否为真.
在这里, 如果变量 a 的值为 5, 则执行下面的代码块, 将 a 赋值为 6.


if (a == 5){      a = 6}
可是, 如果 a 的值不等于 5 的话呢? 代码就不会执行.
然而, 你可以让程序在表达式为假的情况下执行另一个代码块. 现在, 如果 a 等于 5, a 将被赋值为 6. 否则, 赋值为 7.


if (a == 5){      a = 6} else {      a = 7}
在 if () 语句中你可以使用许多不同的操作符. 事实上, 你可以使用任何计算 "真"(非 0) 或 "假"(0) 的表达式.


//如果 a 不等于 5 则返回真if (a != 5) {//如果 a 大于 5 则返回真if (a > 5) {//如果 a 小于 5 则返回真if (a < 5) {//如果 a 大于或等于 5 则返回真if (a >= 5) {//如果 a 小于或等于 5 则返回真if (a <= 5) {//返回真, 因为 5+6 = 11 非0if (5+6) {//如果 a 和 b 都为真则返回真if (a && b) {//如果 7.5 大于 c 则返回真if ( ((5*3)/2) > c) {//总是返回真if (true) {//总是返回假if (false) {
注意: 数组无法直接比较. 以下的表达式不合法:


my arrayOne[3]my arrayTwo[3]if (arrayOne == arrayTwo) {
你必须这样:
if ((arrayOne[0] == arrayTwo[0]) &&        (arrayOne[1] == arrayTwo[1]) &&        (arrayOne[2] == arrayTwo[2])) {
很明显, 如果数组很大的话, 表达式将很长. 在后面我们将介绍如何简单地比较数组或字符串.

if...then 语句可以使用多层表达式判断, 如以下例子.


//"if...else if" 的示例if (a == 5) {      //如果 a 等于 5 则执行此段代码.} else if (a < 6) {      //如果 a 小于 6 则执行此段代码.} else if (a == 7) {      //如果 a 等于 7 则执行此段代码.} else {      //如果都不符合以上的条件, 则执行此段代码.}
在上面的例子中有一个重要的地方, 就是表达式是按顺序来判断的, 如果其中一个条件为真, 则执行该代码块, 并且, if 语句结束, 而不会再判断下一个表达式.

最后, 介绍另一种类型的条件判断语句: "switch" 语句, 它允许你判断某个变量是否为某个值, 但是它不够 "if...else if" 好用.


//switch 语句示例switch (a){      case 5:      {          //当 a 等于 5 时执行该代码块.      }            case 6:      {          //当 a 等于 6 时执行该代码块.      }      case 7:      {          //当 a 等于 7 时执行该代码块.      }      default:      {          //当 a 不等于以上值时执行该代码块.      }}
注意: switch 语句也和 if 语句类似, 如果其中一个条件为真, 则执行该代码块, 并且, switch 语句结束, 而不会再判断下一个表达式.
循环语句是任何语言都必有的语句. 它允许你在特定的条件下重复执行某段代码.最常用的循环语句: "for 循环". 它包含一个初始语句, 执行条件, 增量语句.然后不断地执行代码直到条件不为真. 例如:说明: 下面提供了一个管理数组的好方法!下一个重要的循环类型是: "while 循环". 它只有一个参数: 条件语句.只要条件为真, 它就执行代码. 看看上面例子的 while 循环版本. 在 Pawn 语言里我们还可以定义数组中的数组.我们可以通过它来创建一个数据表格, 第一个 [] 表示行数, 第二个 [] 表示列数. 二维数组像以下这样定义:请看以下例子.BigArray 的结果将会是这样: 注意: 刚才的 sum_of_array() 函数还是可以使用! 我们可以这样做:因为 BigArray[2] 包含另一个一维数组, 包含 {7,8,9}. 下面, 让我们写一个二维数组求和函数. 注意, 二维数组也可以保存字符串.StringList 的结果将会是这样: 在多维数组里比较字符串也是一样的: 编译器指令可以改变你的代码. 这里只简要带过. 这篇文章简要地介绍了 Pawn 语言的一些基础知识. 它包含了 Pawn 语言的方方面面.如果你想了解更多, 请访问: (注意: 这个 pawn-lang.pdf 文件很长, 你只可以作为一个参考. 你可以访问 AMX Mod X 论坛). 请看下一章来了解如何编写 AMX Mod X 插件! 想自己制作一个插件吧? 首先你必须看过了上面两章, 而且必须坐在电脑前面, 打开一个文本编辑器(记事本也可以), AMXx 编译器.如果你想现在就写一个魔兽插件, 黑客帝国插件, 死亡竞赛插件, 那是不可能的事吧.我推荐你使用 AMXX Studio:  作为你的脚本编辑器. 你必须知道怎么编译插件. 你可以参见 "编译插件" 那一章.你也必须知道如何使用插件.  一个 AMX Mod X 可以有四种主要类型的函数. 第一种是 "公共" 函数. 这意味着它在 AMX Mod X 引擎里公共可见.第二种是 "Native" 函数, 来自 AMX Mod X 核心模块.第三种是常规用户函数, 就是你自己定义的函数.第四种是 "Forward" 函数,当某个特殊事件发生时将被触发 (同时也是一个公共函数).一个 AMX Mod X 插件必须由一个初始化函数开始:试试编译上面的插件. 它将会非常小 - 因为它没有什么代码.当你载入你的插件后, 在 HLDS 控制台输入 "amxx plugins", 你可以见到你的插件显示在里面.  AMX Mod X 提供了一个创建管理员命令的简单方法. 每个命令都被注册为控制台命令. 当你注册一个命令时, 你必须定义 4 个参数: 在控制台输入的命令, 输入该命令时执行的函数, 执行该命令的管理员等级, 该命令的简短介绍.为了演示, 让我们制作能通过 "amx_hp" 命令更改玩家生命值的插件.我们必须先做两件事 - 第一, 注册命令. 第二, 确认我们输入命令时执行的函数是存在的.第一个新函数是 "register_concmd", 有 4 个参数.第一个参数是玩家在控制台输入的命令. 第二个参数是处理该命令的公共函数. 第三个参数是使用该命令的玩家管理员等级. 最后一个参数是该命令的说明 (输入 amx_help 命令时可看到). 下一步, 我们创建了一个公共函数来处理 amx_hp 命令. 注意, 它有 3 个参数. 这些参数保存着使用该命令的玩家的一些数据. - id 是输入该命令的玩家的索引, level 是使用该命令的管理员等级 (你必须自己检查玩家的管理员等级), 而 cid 将保存该命令的内部索引.并且, 注意 PLUGIN_HANDLED. 通常我们使用两个主要的返回值 PLUGIN_CONTINUE 意思是继续正常操作, 而 PLUGIN_HANDLED 意思是中止下面的操作.两者之间有微妙但是很重要的区别. 例如, 当绑定一个命令的时候, 你绝对不能返回 PLUGIN_CONTINUE.但如果你绑定到 "say" 命令的时候返回 PLUGIN_HANDLED, 它将不会显示玩家输入的文字.你必须小心地使用它们. 重要的事情先来. 我们怎样知道玩家拥有 ADMIN_SLAY 权限呢? cmd_access() 函数将会检查一个命令的信息 (用户, 管理员等级, 索引) 并且确认两件事情: 用户是否有权限执行, 命令是否带有足够的参数.这里我们需要 3 个参数, 因为命令看起来是这样的: amx_hp <目标> <数量>, 命令本身也算做一个参数.如果 cmd_access 函数执行失败, 我们将立即中止命令.下一部分是: 我们需要获取两个参数. "数量" 参数很简单, 我们只需要将字符串转换为数字.第二个参数就比较麻烦, 因为我们要用到三种人群上:所以, 整个 amx_hp 插件如下: 服务器参数是例如 "mp_startmoney" 等设置. 你可以在 plugin_init() 过程中注册你自己的服务器参数. 让我们自己制作一个 mp_startmoney.(这个插件可能不能用, 只是一个演示). 你可以设置参数为整数, 浮点数, 或者字符串. 你可以修改任何服务器参数. 如果想了解更多 AMX Mod X 插件可使用的函数, 你可以查看由  发布的函数说明文档. 你也可以访问 http://www.amxmodx.org/ 提出问题, 或看看其他用户的使用经验. 当然, 这个网站是英文的. 你也可以访问  提出问题, 或看看其他用户的使用经验.

SMA下载地址:http://www.qiannao.com/space/show/niuyanbin/上传分享/2009/5/2/1000多个SMA.rar/.page上传分享/2009/5/2/1000多个SMA.rar/.page
« 返回列表
发帖 回复