搜索
查看: 6292|回复: 20

[AMXX 带源码] 怎样写一个升级插件的说明!!

[复制链接]
发表于 2009-9-8 14:40:45 | 显示全部楼层 |阅读模式 来自 中国–湖北–黄冈
本帖最后由 KzFun.小鱼 于 2009-9-8 14:44 编辑
好了 从下面开始 就开课了


我将在这里告诉你写一个最基本的升级插件的说明!
在开始写之前,你必须知道一些基本的脚本知识!

首先是几个重要的模块

#include <amxmodx>
#include <amxmisc>
#include <nvault>


定义一下最大的种类数量
我这里定义的是5个,不过如果你想再增加两个的话,例如鱼啊,鸟啊,你可以定义7个!这完全看个人喜好.

#define MAXCLASSES 5


我们来写入一些变量
  //  这里是用来控制[经验][等级][种类]

new PlayerXP[33],PlayerLevel[33],PlayerClass[33]
// 这里是杀敌相关的
new XP_Kill,XP_Knife,XP_Hs,
SaveXP
// 这里是Nvault.我们用他来保存经验
new g_vault  


这里是"maxclasses"变量,我们将要在游戏里面看到..
[备注] 这里的"maxclasses"就是说的最大种类数量

new const CLASSES[MAXCLASSES][] = {
   
"None"
,
   
"Dog"
,
   
"Cat"
,
   
"Horse"
,
   
"Cow"
}

[备注] 这里有5个种类,所以我们要定义"maxclasses"为5.

好了,现在可以制作等级,经验跟需要多少经验才能升级..
这里我定义的是7级

new const LEVELS[7] = {
0
,
100,   
//需要100经验才能升级
200,   
//同上的意思
400,   
//同上的意思


800,   
//同上的意思


1600,   
//同上的意思


3200   
//同上的意思


}
 楼主| 发表于 2009-9-8 14:41:18 | 显示全部楼层 来自 中国–湖北–黄冈
现在可以写入plugin_init()了

public plugin_init()
{
   
register_plugin("XpMod", "1.0", "Fxfighter"
)

   
//我们用这里来检查你杀敌之后的等级
   
register_event("DeathMsg", "eDeath", "a"
)
   
//这个是保存经验的开关
   
SaveXP = register_cvar("SaveXP","1"
)
   
//这里是杀死一个敌人获得的经验
   
XP_Kill=register_cvar("XP_per_kill", "20"
)
   
//这里是爆头获得的额外经验
   
XP_Hs=register_cvar("XP_hs_bonus","20"
)
   
//用刀子杀敌获得的额外经验
   
XP_Knife=register_cvar("XP_knife_bonus","20"
)
   
//这个是用来连接NVAULT的
    //我把这个叫做ainmod
   
g_vault = nvault_open("animod"
)
   
//我们需要一个命令用来更换种类
   
register_clcmd("say /class", "ChangeClass"
)
   
register_clcmd("say_team /class", "ChangeClass"
)
   
//这里是用来显示你的当前经验值
   
register_clcmd("say /xp", "ShowHud"
)
   
register_clcmd("say_team /xp", "ShowHud"
)
}


现在我将要做一个死亡函数
还记得在 plugin_init() 里面的 "eDeath" 吧!
这个可是跟你的经验息息相关的,它是用来监视你的经验值!

public eDeath( ) //函数的名字
{
   
// 如果他没有选择种类,那就可以不必执行下面的东东了
   
if(PlayerClass[attacker] == 0
)
         return
PLUGIN_CONTINUE

   
// 我们做一个受害者的变量
    // 当一个玩家死亡的时候
   
new iVictim = read_data( 2
)
   
// 如果是爆头,就将用到Xp_Hs
   
new headshot = read_data( 3
)

   
//使用的是什么武器来杀敌的


new clip, ammo, weapon = get_user_weapon(id,clip,ammo
);
   
PlayerXP[attacker] += get_pcvar_num(XP_Kill
)
   
// 这里将用到xp_hs
    // 这用来检测,当一个玩家是否是被爆头
   
if(headshot
)
   
// 给予他额外的奖励
   
PlayerXP[attacker] += get_pcvar_num(XP_Hs
)
   
// 这用来检测,当一个玩家是否是被刀子杀死的
   
if(weapon == CSW_KNIFE
)
        
// 给予他额外的奖励
   
PlayerXP[attacker] += get_pcvar_num(XP_Knife
)
   
// 这里是用来检测玩家的经验是否可以升级

     
while(PlayerXP[attacker] >= LEVELS[PlayerLevel[attacker
]])
    {
// 这里就是显示一条祝贺的消息
        
client_print(attacker, print_chat, "[Animal Mod] Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker
]])
        
// 这里是增加他的等级
        
PlayerLevel[attacker] +=
1
   
}
   
// 显示他的等级
   
ShowHud(attacker
)

}  
回复

使用道具 举报

 楼主| 发表于 2009-9-8 14:41:38 | 显示全部楼层 来自 中国–湖北–黄冈
这里是显示HUD的函数
这里是用来显示等级,经验,种类的...

public ShowHud(id)
{
   
set_hudmessage(255, 0, 0, 0.75, 0.01, 0, 6.0, 15.0
)
   
show_hudmessage(id, "Level: %i^nXP: %i^nClass: %s",PlayerLevel[id],PlayerXP[id],CLASSES[PlayerClass[id
]])
}

[备注]  ^n 的意思就是另起一行显示

现在可以写一个选择菜单了
这里给你一些选项 用来选择种类
我用的是新的菜单系统
我在这里就不多做说明了,大家可以来这里看看 这里是传送门 [原版E文,大家慢慢看吧!!! :)]
回复

使用道具 举报

 楼主| 发表于 2009-9-8 14:42:04 | 显示全部楼层 来自 中国–湖北–黄冈

public ChangeClass(id)
{
    new
menu = menu_create("Class Menu" , "Class_Handle"
);
   
menu_additem(menu ,"Dog", "1" , 0
);
   
menu_additem(menu ,"Cat", "2" , 0
);
   
menu_additem(menu ,"Horse", "3" , 0
);
   
menu_additem(menu ,"Cow", "4" , 0
);
   
menu_setprop(menu , MPROP_EXIT , MEXIT_ALL
);
   
menu_display(id , menu , 0
);
    return
PLUGIN_CONTINUE
;
}

public
Class_Handle(id , menu , item
)
{
    if(
item == MENU_EXIT
)
    {
        
menu_destroy(menu
);
    }
    new
szCommand[6] , szName[64]; new access , callback
;
   
menu_item_getinfo(menu , item , access , szCommand , 5 , szName , 63 , callback
);
    new
i = str_to_num(szCommand
)
    if(
PlayerClass[id] != i
)
    {
        
PlayerClass[id] = i client_print(id,print_chat,"You are now a %s",CLASSES[i
])
    }
    else
    {
        
client_print(id,print_chat,"You are alredy a %s",CLASSES[i
])
    }
   
menu_destroy(menu
);
    return
PLUGIN_CONTINUE
}


这里是关于玩家连接服务器的相关函数
我们可以用这个函数定义
当玩家进入服务器时,读取玩家的经验,等级等等相关数据

public client_connect(id)
{
   
// 如果是保存经验,才会读取数据
   
if(get_pcvar_num(SaveXP) == 1
)
    {
        
// 读取玩家的数据
        
LoadData(id
)
    }
}


回复

使用道具 举报

 楼主| 发表于 2009-9-8 14:42:22 | 显示全部楼层 来自 中国–湖北–黄冈
这个是玩家离开了服务器的相关函数


public client_disconnect(id)
{
// 当保存经验开启的时候
     
if(get_pcvar_num(SaveXP) == 1
)
     {
         
// 保存经验
         
SaveData(id
)
     }
}



我们可以写一个保存经验的函数


public SaveData(id)
{
   
// 获取玩家的steam ID,我们将要用steam ID来记录数据
   
new AuthID[35] get_user_authid(id,AuthID,34
)
    new
vaultkey[64],vaultdata[256
]
   
// 设计当进行本模式时候的vault文件
   
format(vaultkey,63,"%s-Mod",AuthID
)
   
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id
])
   
// 保存数据
   
nvault_set(g_vault,vaultkey,vaultdata
)
    return
PLUGIN_CONTINUE
}



好了,到了读取数据的时候了


public LoadData(id)
{
    new
AuthID[35] get_user_authid(id,AuthID,34
)
    new
vaultkey[64],vaultdata[256
]
   
// 查找玩家的数据
   
format(vaultkey,63,"%s-Mod",AuthID
)
   
format(vaultdata,255,"%i#%i#",PlayerXP[id],PlayerLevel[id
])
   
// 读取数据
   
nvault_get(g_vault,vaultkey,vaultdata,255
)
   
replace_all(vaultdata, 255, "#", " "
)
    new
playerxp[32], playerlevel[32
]
   
parse(vaultdata, playerxp, 31, playerlevel, 31
)
   
PlayerXP[id] = str_to_num(playerxp
)
   
PlayerLevel[id] = str_to_num(playerlevel
)
    return
PLUGIN_CONTINUE
}



到了总结的时候了
下面就是完整的源码了...




嗯,终于结束了. 过程就是这样
不过里面好像有几个错误,但是大概的思路就是这样
如果想看看什么地方错了
可以在下面的传送门看看

本文转自
http://forums.alliedmods.net/showthread.php?t=66497

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×

评分

参与人数 1经验 +4 点通币 +150 收起 理由
8874323 + 4 + 150 好帖

查看全部评分

回复

使用道具 举报

发表于 2009-9-8 18:08:20 | 显示全部楼层 来自 中国–江苏–南京
好贴要顶!
回复

使用道具 举报

发表于 2009-9-8 19:20:57 | 显示全部楼层 来自 中国–四川–成都
写的来部分我能看懂,部分我不能看懂。有点无语-_-!!
回复

使用道具 举报

发表于 2009-9-8 20:02:19 | 显示全部楼层 来自 中国–云南–昆明–五华区
好东西  。。。 谢谢咯。。
回复

使用道具 举报

发表于 2009-9-8 20:53:21 | 显示全部楼层 来自 中国–四川–遂宁
{:3_68:} 还好....全部可以看懂
回复

使用道具 举报

发表于 2009-9-8 22:20:18 | 显示全部楼层 来自 中国–陕西–西安–雁塔区
辛苦 辛苦~~~~~~~~~~~~
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表