pro_on_0
|
分享:
▼
x12
|
[插件] [Amxx 制作] 简单等级系统 [NVault 保存][血量][速度][重力]
(持续更新)
第一次发教学帖 如果有错 多多包含 首先 写一个 Amxx #include 是第一步啦 #include, 简单一点来说 就是 读取某个档案 而档案里面有你的Amxx插件需要用到的东西
举一个例子 复制程式
这是去 读取 fakemeta 这档案 < 及 > 只是把档案名括住 没有甚么意思
而这些档案的副档名是 .inc, 放在 addons\amxmodx\scripting\include 这次的等级系统需要用 amxmodx amxmisc nvault fakemeta hamsandwich 复制程式
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <fakemeta>
#include <hamsandwich> 接着, 就是弄几个 variables (中文不懂怎样解释 -_-") 出来 要弄一个 variable 出来 我们用 new 举一个例子 复制程式
这里的大概解释是 一个新variable 名为g_xp 33个位置 一般来说 如果你想暂时记录的资料只有一个 你可以省略 [33] 不过我们需要储存1 - 32玩家的资料 因为所有 variable 都是由 0 开始 , 不是由 1 开始 所以我们需要33 (不肯定是不是这样 不过33就没错 -_-") 这次需要用到 玩家的经验值 玩家的等级 玩家的累积伤害 储存玩家资料的档案 复制程式
new g_xp[33]
new g_level[33]
new g_damage[33]
new g_vault 跟着, 我们需要 注册 一些东西 复制程式
复制程式
public plugin_init()
{
register_plugin("等级系统", "1.0", "oN.")
// register_plugin 是注册插件的资料
// 依次序是 插件的名字 插年的版本 插件的作者
// 这是可以省略的
// register_clcmd 是注册一个指令
// 当玩家输入那指令便运行后面的 Function
// 依次序是 你要的指令 你要运行的 Function 的名字
register_clcmd( "say /save" ,"say_save")
register_clcmd( "say /xp" ,"say_xp")
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
// register_forward 是注册一个 forward (中文都是不懂得怎样解释 -_-")
// 依次序是 forward 的名字 (能在inc.中找到) 你所定的名字 (甚么都可以)
// 这个 forward 十分有用 你的作用简单来说是 监视玩家的一举一动
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
// RegisterHam 是一个 hamsandwich(inc.档) 中的 Fucntion
// 它来注册 hamsandwich 中的forward
// 依次序是 forward 的名字 (能在inc.中找到) 对象 你所定的名字 (甚么都可以)
// 这是一个 玩家被杀 的 forward
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
// 这是一个 玩家被伤害 的 forward
g_vault = nvault_open("n_xp")
// 这里把 nvault_open("n_xp") 代入 g_vault
// nvault_open 是 nvault(inc.档) 中的 Fucntion
// 这用来开启一个 .vault 档案, 用作储存资料
// n_xp 是档案的名称
// 这种储存方法是不可以直接打开档案修改内容
// 档案储存在 addons\amxmodx\data\vault
// 还有另一种可以直接修改的储存方法, 但那种较为复杂
} 下一步, 就是去写上面所注册的 forward 和 clcmd (玩家指令 - client command) 复制程式
// fw_TakeDamage 和上面的名字是一样的
// (victim, inflictor, attacker, Float:damage, damage_type) 这是 forward 中所获得的资料
// 上面的 victim attacker 这些名字可以改变的 只是把资料代入而已
// 依次是 受伤者 武器 攻击者 伤害值 伤害种类
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
// 首先在一些不适合的情况下 不运行下面的动作
// if 是 如果
// ( 及 ) 是必需的
// || 是 或者
// attacker == victim - 受伤者 是 攻击者
// ! 是 相反意思
// is_user_connected 是 玩家连接着伺服器的
// 全句解作 如果 受伤者 是 攻击者 或者 攻击者不是连接着伺服器的
if (attacker == victim || !is_user_connected(attacker))
return HAM_IGNORED // 返回原来操作
// 其实 attacker 和 victim 都是数字来的
// 我们令用玩家的 id 去做我们想做的事
// g_damage[attacker] 是 攻击者的g_damage
// += 是把 a 的数值加上 b
// 全句解作 把 攻击者的g_damage 加上 伤害值
g_damage[attacker] += damage
// 这里我们做一个检查
// 如果 攻击者的g_damage 大于或等于 150, 就会运行下面的动作
if (g_damage[attacker] >= 150)
{
// 把 攻击者的g_damage 变回做 0
g_damage[attacker] -= 150
// 把 攻击者的g_xp 加上 1
g_xp[attacker] += 1
}
// 上面的意思是 如果攻击者的累积伤害大于150时, 就会加1经济值和重设累积伤害
// 因为我们上面用过 return HAM_IGNORED 所以最后要多打一次
return HAM_IGNORED
}
// 依次是 受伤者 攻击者 ??? (这个不太知道-_- 不过没有太大作用)
public fw_PlayerKilled(victim, attacker, shouldgib)
{
// 和上面的一样
if (attacker == victim || !is_user_connected(attacker))
return HAM_IGNORED
// 大家应该明白吧
g_xp[attacker] += 1
return HAM_IGNORED
// 这里的意思是当玩家死亡事件发生 攻击者经验值增加
}
// 依次是 玩家
public fw_PlayerPreThink(id)
{
// 全句的意思是 如果 玩家的经验值 大于或等于 ((玩家的等级 + 1) 乘 100)
if (g_xp[id] >= ((g_level[id] + 1) * 100))
g_level[id] ++ // 玩家的等级上升 (+1)
}
// 依次是 玩家
public say_save(id)
{
// 运行 SaveData 这个 Function, 而且把这里的 id 连接 SaveData 那里
SaveData(id)
// client_print 是给玩家弹出一段句子
// 依次序是 对象 类型 句子
// 给大家一个查询 Function 的网站 (不是全部都有 !!)
// 大家可以打上client_print 然后就有佢的资讯 - 句子类型
// http://www.amxmodx.org/funcwiki.php
client_print(id, print_center, "保存记录成功")
}
// 依次是 玩家
public say_rank(id)
client_print(id, print_center, "你目前的等级: %i 经验值: %i ", g_level[id], g_xp[id])
// 我们可以在client_print入面代入可变的资料
// 由于g_level及g_xp是整数, 所以我们用 %i
// 如果玩家的 level 是 1, xp 是 103
// 句子就是 你目前的等级: 1 经验值: 103
// client_putinserver 是一个inc档入面包含的Fucntion
// 意思是玩家进入伺服时
public client_putinserver(id)
LoadData(id)
// client_disconnect 是一个inc档入面包含的Fucntion
// 意思是玩家离开伺服时
public client_disconnect(id)
SaveData(id)
// 这是一个自定意 Function 名字甚么都可以
public SaveData(id)
{
// variables
// 要注意的是 今次我们的variables是记录 string (字串) 的
// 所以 [xx] 代表 字串 可以有多长
new name[32], vaultkey[64], vaultdata[256]
// 这是把玩家的名字代入 name 入面
get_user_name(id, name, 31)
// format 是把一个variable写成一段句字
// 依次序是 variable 长度 ([xx] 中的 xx - 1) 句字 需要代入的variable
// 如果玩家的名字是oN. 累积伤害是50
// vaultkey 就是 oN.-mod
// vaultdata 就是 103#1#50#
format(vaultkey, 63, "%s-mod", name)
format(vaultdata, 255, "%i#%i#%i#", g_xp[id], g_level[id], g_damage[id])
// 这个是 nvault 中的 Function, 意思是把 vaultkey 及 vaultdata 写入 g_vault
nvault_set(g_vault, vaultkey, vaultdata)
}
// 这是一个自定意 Function 名字甚么都可以
public LoadData(id)
{
new name[32], vaultkey[64], vaultdata[256]
get_user_name(id,name,31)
format(vaultkey, 63, "%s-caxp", name)
format(vaultdata, 255, "%i#%i#%i#", g_xp[id], g_level[id], g_damage[id])
// 这个是 nvault 中的 Function, 意思从 g_vault 搜寻数据
nvault_get(g_vault, vaultkey, vaultdata, 255)
// replace_all 是把某string中的 a 变为 b
// 依次序是 字串 长度 a b
replace_all(vaultdata, 255, "#", " ")
new playerxp[32], playerlevel[32], playerdamage[32]
// 解释 vaultdata, 把 vaultdata 中的资料 代入 以下 variables
// 依次序是 字串 variables 长度 variables1 长度 variables2 长度 (还可以有更多)
parse(vaultdata, playerxp, 31, playerlevel, 31, playerdamage, 31)
// str_to_num 是把字串转变为数字
// 由于读出来的是字串, 所以要转变
g_xp[id] = str_to_num(playerxp)
g_level[id] = str_to_num(playerlevel)
g_damage[id] = str_to_num(playerdamage)
}
就那么多先, 还有更新 那么, 现在就说管理员的指令吧 第一步就是 注册管理员指令 (在 plugin_init() 中) 复制程式
public plugin_init()
// 依次序是 指令 运行的Function 需要的权限 解释
// 解释打甚么都行
// 权限的名字可以在 amxconst.inc 中找到
register_concmd("give_xp", "cmd_give_xp", ADMIN_KICK, "- givexp <name> <amount> : Give XP") 然后就是 cmd_give_xp 这个 Function 复制程式
public cmd_give_xp(id, level, cid)
{
// cmd_access 是检查指令有没有错
// 当中的 3 是指指令一共有多少个参数
// 例如 testing oN. 20 90
// 上面就有 4 个参数 (指令计算在里)
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED // 返回
// 这里我们或可写成 new arg[2][4]
// 那我们就以 arg[0] 和 arg[1] 来表示
new arg_name[4], arg_amount
// read_argv 就是一个读取参数的 Function
// 依次序是 参数的位置 代入的Variable 长度
read_argv(1, arg_name, 3)
read_argv(2, arg_amount, 3)
// cmd_target 是 从名字搜寻玩家
// 依次序是 指令者 名字 模式
// 模式可以在上述网址中查到
// 在下面的情况 target 已成为该名字的玩家 (如果名字不合 则是!target)
new target = cmd_target(id, arg_name, 2)
if (!target)
{
client_print(id, print_console, "Player not found")
return PLUGIN_HANDLED
}
g_xp[target] += str_to_num(arg_amount)
return PLUGIN_HANDLED
} 那么, 现在就说怎么改变玩家的血量 我们可以用到两个Function, 一个是fun (inc.), 一个是fakemeta (inc.) (记住要#include 相应的inc.档案)
[quote]set_user_health(玩家, 血量) set_pev(玩家, pev_health, 血量)
这两个都是设定玩家的血量[/quote] 那我们该在那里用到这两个Function呢 ? 当然是在玩家出生的时间了 我们就先要在 注册这个出生的时间 (在 plugin_init() 中)
复制程式
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
整个来说了, 就是.... 复制程式
public plugin_init()
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
// Ham Player Spawn Post Forward
public fw_PlayerSpawn_Post(id)
{
// 如果 玩家不是生存的
if (!is_user_alive(id))
return // 返回
// set_pev 是一个 fakemeta 的 Function, 作用是设定某些东西
// 而 pev_health 就是指定 set_pev 所设定的东西, 这个就是玩家的血量
// 而 float 呢, 这个就是把整数转变成浮点数 (0.9, 1.2, 11.3, 100.0 这些)
// 全句解释就是 先把 (玩家的血量 加上 玩家的等级) 变成 浮点数 (例如100 + 10 = 110 就是 110.0)
// 然后 设定 (set_pev) 玩家的血量 (pev_health) 变成 (玩家的血量 加上 玩家的等级[Float])
set_pev(id, pev_health, float(pev(id, pev_health) + g_level[id]))
} 这就好了 那么, 现在就说怎么改变玩家的速度 我们同样可以用到两个Function, 一个是 fun (inc.), 一个是 fakemeta (inc.) set_user_maxspeed(玩家, 速度) set_pev(玩家, pev_maxspeed, 速度) 速度必须是Float, 而正常速度值为 240.0
我们就先要在 注册运作设定速度的时间 (在 plugin_init() 中) 我们今次就用回 FM_PlayerPreThink
复制程式
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
整个来说了, 就是.... 复制程式
public plugin_init()
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
public fw_PlayerPreThink(id)
{
// 如果 玩家不是生存的
if (!is_user_alive(id))
return // 返回
// 由于这里的速度值必须是Float 所以g_level需要转变成Float
set_pev(id, pev_maxspeed, 240.0 + float(g_level[id]))
} 那就再说 玩家的重力吧 都是 fun 和 fakemeta set_user_gravity(玩家, 重力) set_pev(玩家, pev_gravity, 重力) 重力必须是Float, 而正常速度值为 1.0 数值愈低 玩家就愈轻
如果要设定玩家的重力 可以运行在以上的两个Forward 复制程式
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1) 复制程式
register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
复制程式
set_pev(id, pev_gravity, 1.0 - (g_level[id] * 0.006)) 如果大家想改变能力的增加幅度 其实很容易 例如你想每级增加 3 HP
就把复制程式
set_pev(id, pev_health, float(pev(id, pev_health) + g_level[id]))
改成 复制程式
set_pev(id, pev_health, float(pev(id, pev_health) + (g_level[id] * 3))) 就是这样了 待续....
[ 此文章被pro_on_0在2011-12-04 12:45重新编辑 ]
|