引用 | 编辑
pro_on_0
2010-08-12 20:39 |
楼主
▼ |
||
x12
第一次发教学帖 如果有错 多多包含 首先 写一个 Amxx #include 是第一步啦 #include, 简单一点来说 这次的等级系统需要用 amxmodx amxmisc nvault fakemeta hamsandwich 复制程式 #include <amxmodx> #include <amxmisc> #include <nvault> #include <fakemeta> #include <hamsandwich> 接着, 就是弄几个 variables (中文不懂怎样解释 -_-") 出来 要弄一个 variable 出来 这次需要用到 玩家的经验值 玩家的等级 玩家的累积伤害 储存玩家资料的档案 复制程式 new g_xp[33] new g_level[33] new g_damage[33] new g_vault 跟着, 我们需要 注册 一些东西 复制程式 plugin_init() 复制程式 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 } 那么, 现在就说怎么改变玩家的血量
这两个都是设定玩家的血量[/quote]
这就好了 那么, 现在就说怎么改变玩家的速度 我们同样可以用到两个Function, 一个是fun (inc.), 一个是fakemeta (inc.) set_user_maxspeed(玩家, 速度)
那就再说 玩家的重力吧 都是 fun 和 fakemeta set_user_gravity(玩家, 重力)
就是这样了 待续.... x5
|
引用 | 编辑
poo12369100
2010-08-24 11:45 |
4楼
▲ ▼ |
很难明..........................
可以整段片出来吗? x0 |
引用 | 编辑
asd1231603
2010-08-25 08:13 |
8楼
▲ ▼ |
谢谢分享 不过 还真复杂= =
x0 |
引用 | 编辑
caution222
2010-08-25 10:03 |
9楼
▲ ▼ |
引用 | 编辑
zxcv1896254
2010-08-26 09:10 |
12楼
▲ ▼ |
有了等级插件
感觉有多点有趣耶~ x0 |
引用 | 编辑
ivan147591
2010-08-26 19:30 |
13楼
▲ ▼ |
是用什么制作amxx/sma? 用文字档?
x0 |
引用 | 编辑
pro_on_0
2010-08-30 12:40 |
15楼
▲ ▼ |
下面是引用 784063999 于 2010-08-25 19:38 发表的 : 看过你的帖子 按照你的要求 我觉得还是把 等级系统 写入丧尸模式的SMA中较好 否则很容易发生错误 x0 |
引用 | 编辑
ivan147591
2010-08-31 22:24 |
17楼
▲ ▼ |
点改杀人经验??和升级的经??
x0 |
引用 | 编辑
leekwanyee
2010-09-02 15:59 |
18楼
▲ ▼ |
我现在看你的教学,做sma中....
x0 |
引用 | 编辑
ivan147591
2010-09-03 19:37 |
20楼
▲ ▼ |
请问何时教到把等级显示的位放在那??
和怎加入杀人的经和升lv的经 fw_PlayerKilled 和 fw_PlayerPreThink 中的 g_xp <---不明怎加 x0 |
引用 | 编辑
climbd25976
2010-09-04 19:30 |
26楼
▲ ▼ |
怎在死斗用...一重生就变回100血
x0 |
引用 | 编辑
ivan147591
2010-09-06 17:31 |
28楼
▲ ▼ |
引用 | 编辑
ivan147591
2010-09-06 17:33 |
29楼
▲ |