怎样写一个升级插件的说明!!
本帖最后由 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 //同上的意思
}
现在可以写入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, " Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
// 这里是增加他的等级
PlayerLevel[attacker] += 1
}
// 显示他的等级
ShowHud(attacker)
}
这里是显示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文,大家慢慢看吧!!! :)]
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)
}
}
这个是玩家离开了服务器的相关函数
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 好贴要顶! 写的来部分我能看懂,部分我不能看懂。有点无语-_-!! 好东西。。。 谢谢咯。。 {:3_68:} 还好....全部可以看懂 辛苦 辛苦~~~~~~~~~~~~