KzFun.小鱼 发表于 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    //同上的意思

}

KzFun.小鱼 发表于 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, " Congratulations! You are a level %i %s!", PlayerLevel[attacker],CLASSES[PlayerClass[attacker]])
      // 这里是增加他的等级
      PlayerLevel[attacker] += 1
    }
    // 显示他的等级
    ShowHud(attacker)

}

KzFun.小鱼 发表于 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文,大家慢慢看吧!!! :)]

KzFun.小鱼 发表于 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)
    }
}

KzFun.小鱼 发表于 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

INSUN 发表于 2009-9-8 18:08:20

好贴要顶!

qiang_zhong 发表于 2009-9-8 19:20:57

写的来部分我能看懂,部分我不能看懂。有点无语-_-!!

76233386 发表于 2009-9-8 20:02:19

好东西。。。 谢谢咯。。

sakulekingz 发表于 2009-9-8 20:53:21

{:3_68:} 还好....全部可以看懂

gearfox 发表于 2009-9-8 22:20:18

辛苦 辛苦~~~~~~~~~~~~
页: [1] 2 3
查看完整版本: 怎样写一个升级插件的说明!!