[Grief.QQ] 发表于 2005-8-30 16:02:36

[原创]表情插件及制作全过程

声明:一开始看到那位仁兄说想做个表情插件,其实我也是很来兴趣的,但是我只修改过插件,从来没有自己写过,昨天实在是无聊透顶,想起来这个建议,于是自己动手用了一晚上和早上的时间终于写完了,cs1.5+amx0.99下测试通过。在写的期间,我有求助过官方论坛,但是没人理会,唉,世态炎凉,没办法,只有自己查资料,看源代码,调试。因为我本身是学系统维护和网页后台程序设计的,所以脚本对我来说并不是一筹莫展。下面我就说说制作的全过程。
第一步:在你写程序之前,你应该构想一下整个程序的框架,这个程序的作用,功能,以及需要实现它的一些必要的因素和可能出现的障碍。
好了,让我们开始吧,在游戏中,当我们say /某个命令的时候,程序得以执行,这时候就要进行判断,CS中,有死亡的玩家和活着的玩家,那么,究竟是死亡的玩家有权限执行命令还是活着的玩家还是只要是玩家都可以呢?这里,我们选择活着的玩家,因为是表情秀,人都死了,当然谈不上表情了。
接下来,如果玩家处于死亡状态,那么程序应给于判断后的提示信息,并且中止程序的执行。
再着,如果玩家处于活着状态,那么程序继续执行,这时候我们还需要一个判断,那就是客户端是否拥有我们想表现的实体,如果没有,那就需要客户端下载,表情想要在玩家头上表示出来,那么我们就需要知道玩家的ID和玩家的Z坐标(通俗的说就是玩家有多高)
然后,知道这些以后,我们开始创建实体,它应当包括的因素有,显示位置,实体名称,实体寿命几个要素,然后结束实体效果,最后结束程序以等待下次玩家继续激活该命令。
有了这些,我们写起来就顺手多了。好了,开始写吧。

附TE_PLAYERATTACHMENT语法。
00524 #define TE_PLAYERATTACHMENT                     124 // attaches a TENT to a player (this is a high-priority tent)
00525 // byte (entity index of player)
00526 // coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset )
00527 // short (model index)
00528 // short (life * 10 );

附INC文件说明:它就相当于一个类库,里面包含了很多常用或必备或系统命令,而不需要编写者自己再去定义命令。


#include <amxmod>                        //包含amxmod.inc库。
#define TE_PLAYERATTACHMENT 124                //定义玩家附属效果,此效果在const.h里面有介绍,就是在玩家头部产生一个实体效果,就像个帐篷一样盖在头上。

new ic4                                        //申请全局变量,以便把SPR文件索引存入值中。

public plugin_precache()                //
{
   ic4 = precache_model("sprites/ic4.spr")        //把ic4.spr文件索引存入ic4中。
   if (file_exists("sprites/ic4.spr"))                //判断客户端是否存在ic4.spr文件。
   precache_model("sprites/ic4.spr")                //如果没有就下载。
}

public cmdFace(id)                                //定义命令,并保存执行命令的玩家ID索引。
{
if(!is_user_alive(id))                        //进行判断,如果玩家不是活着的,
        {
        set_hudmessage(200, 100, 0, -1.0, 0.3, 0, 1.0, 5.0, 0.1, 0.2, 3)//那么客户端宣示消息(这里是设置消息颜色,位置,显示时间等参数)
        show_hudmessage(id,"Sorry,You Are Dead!!!")//客户端屏幕中间显示文本
        return PLUGIN_HANDLED//命令中止(当然是以玩家死亡状态的时候。)
        }
message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0},id)//信息开始(玩家活着的时候才执行到这里),向所有玩家广播临时实体,XYZ坐标,并保存玩家ID索引。
write_byte(TE_PLAYERATTACHMENT)//创建实体的效果,
write_byte(id)//被创建实体效果的玩家ID索引,由上面的cmdFace(id)而来,当玩家引发cmdFace命令时,系统获取其ID索引。
write_coord(40)//实体效果Z坐标轴。
write_short(ic4)//实体索引。
write_short(30)//实体寿命,这里表示*0.1秒,也就是值为10,就是10*0.1=1秒。
message_end()//广播消息结束。
return PLUGIN_HANDLED//命令结束。
}

public plugin_init()//注册插件,这里我就不多解释了。
{
register_plugin("face show","0.1","")
register_concmd("say /face","cmdFace",0)//这里提示一下,参数0,表示所有玩家都有权限去执行say命令.
return PLUGIN_CONTINUE
}

好了,一个简单的表情插件就写完了,但是却具备了必要的判断,如果想要更多的表情命令,我们可以反复定义say命令。它看起来像这样
public cmdHaHa(id)
{

}
public cmdFuck(id)
{

}
public cmdYuMen(id)
{

}

.......

当然,我们还可以实现更为复杂的程序,比如说用配置文件来保存命令和SPR索引,用菜单来进行选择表情,当然这些是后话了,我写这些的目的只是想大家更多的了解和分享插件的做法,借此抛砖引玉,有兴趣的朋友可以做出更多命令来。

BoeZombie 发表于 2005-8-30 16:11:41

回复: [原创]表情插件及制作全过程

顶~~~~~~~

强贴~~~~~~~

蓝筹贴~~~~~~~

BoeZombie 发表于 2005-8-30 16:12:20

回复: [原创]表情插件及制作全过程

很有意思,Pub服务器又增添了乐趣!

nwb13 发表于 2005-8-30 16:18:25

回复: [原创]表情插件及制作全过程

嘿嘿,原理很清楚,不过记得发帖的时候选择类别,这个属于技术文章类。

55

ssj4gogeta 发表于 2005-8-30 19:03:47

回复: [原创]表情插件及制作全过程

就不能做成sprites_show那样么?
表情库是读取sprites_show.txt文件!

[Grief.QQ] 发表于 2005-8-30 19:10:26

回复: [原创]表情插件及制作全过程

慢慢来吧,不要着急,我发贴的目的是为了多数人了解插件的开发过程
并不是要做什么插件,只是想把自己学到的东西与大家分享,
虽然这只是简短的一段代码,但是已经实现了我们想要的功能不是么?
能把自己的创作过程和大家分享,是件很快乐的事情,所以我不隐藏贴子,
更不要大家花钱来买,甚至不介意看贴不回!

ssj4gogeta 发表于 2005-8-30 19:14:28

回复: [原创]表情插件及制作全过程

说得也是,支持!!!!!

China.OP.Union 发表于 2005-8-30 19:24:44

回复: [原创]表情插件及制作全过程

Post by '
']慢慢来吧,不要着急,我发贴的目的是为了多数人了解插件的开发过程
并不是要做什么插件,只是想把自己学到的东西与大家分享,
虽然这只是简短的一段代码,但是已经实现了我们想要的功能不是么?
能把自己的创作过程和大家分享,是件很快乐的事情,所以我不隐藏贴子,
更不要大家花钱来买,甚至不介意看贴不回!

:cry: 感人,DT有无私的,也有得机会就收费的,很多东西都是国外免费的。

向楼主这样的,值得尊重。

顶~

zats 发表于 2005-8-30 19:43:06

回复: [原创]表情插件及制作全过程

实在是没怎么看懂

zhangsheng 发表于 2005-8-30 22:38:26

回复: [原创]表情插件及制作全过程

怎么用哦,命令和用法? :boss::d 我在AMX0.9.5上编译出来了不知道怎么用
页: [1] 2 3
查看完整版本: [原创]表情插件及制作全过程