广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 40207 个阅读者
 
<<   1   2   3   4   5  下页 >>(共 13 页)
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
pro_on_0
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x29 鲜花 x13
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x12
[插件] [Amxx 制作] 简单等级系统 [NVault 保存][血量][速度][重力]  (持续更新)
第一次发教学帖
如果有错 多多包含

首先 写一个 Amxx
#include 是第一步啦

#include, 简单一点来说
就是 读取某个档案
而档案里面有你的Amxx插件需要用到的东西

举一个例子
复制程式
 #include <fakemeta>

这是去 读取 fakemeta 这档案
< 及 > 只是把档案名括住 没有甚么意思

而这些档案的副档名是 .inc,
放在 addons\amxmodx\scripting\include


这次的等级系统需要用 amxmodx amxmisc nvault fakemeta hamsandwich

复制程式
#include <amxmodx> 
#include <amxmisc> 
#include <nvault> 
#include <fakemeta> 
#include <hamsandwich>


接着, 就是弄几个 variables (中文不懂怎样解释 -_-") 出来

要弄一个 variable 出来
我们用 new
举一个例子
复制程式
new g_xp[33] 

这里的大概解释一个新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


跟着, 我们需要 注册 一些东西
复制程式
 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 
}


那么, 现在就说怎么改变玩家的血量


我们可以用到两个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])) 
}


那就再说 玩家的重力吧
都是 funfakemeta
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重新编辑 ]



献花 x5 回到顶端 [楼 主] From:IANA保留地址 | Posted:2010-08-12 20:39 |
tw2twtw
个人头像
个人文章 个人相簿 个人日记 个人地图
小有名气
级别: 小有名气 该用户目前不上站
推文 x50 鲜花 x548
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

等这篇完成后,恐怕会有很多等级插件发出来.....
前提是要看的懂..... 表情


我的SV: 59.126.178.46:27015
模式:乱七八糟?
献花 x1 回到顶端 [1 楼] From:台湾中华电信 | Posted:2010-08-12 22:54 |
pro_on_0
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x29 鲜花 x13
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

我都解释得很详尽了-_-"....


献花 x0 回到顶端 [2 楼] From:香港和记电讯 | Posted:2010-08-12 22:57 |
husano896 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x79 鲜花 x138
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

variable 最简洁的说法 就是变数=.=


这边流动率真的挺低的'w' 但我是有在看的哦w
也许哪天被我乱入也说不定(!?

按这里检视影片,登入论坛可以直接观看
*ZP*没爆头回合不结束

↓吃浏览数长大的龙:)
献花 x0 回到顶端 [3 楼] From:台湾中华电信 | Posted:2010-08-13 14:36 |
poo12369100
数位造型
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

很难明..........................
可以整段片出来吗?


献花 x0 回到顶端 [4 楼] From:没有资料 | Posted:2010-08-24 11:45 |
784063999
个人头像
个人文章 个人相簿 个人日记 个人地图
游戏高手奖
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x32 鲜花 x86
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

很多英文不明是什么 表情


献花 x0 回到顶端 [5 楼] From:没有资料 | Posted:2010-08-24 15:50 |
lf2man123
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x62 鲜花 x212
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片


正打算编一个等级系统 表情


当初...还是有点中二,最近再看回自己之前的文章
真的感谢了husano大帮忙我那么多问题
如果有机会去台湾(?)一定要找他谈谈天
本人目前年龄14(?)
有待成长
献花 x0 回到顶端 [6 楼] From:香港特别行政区 | Posted:2010-08-24 15:55 |
paul34hk
数位造型
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

真的是很细心既教学
辛苦了大大 表情 表情


献花 x0 回到顶端 [7 楼] From:未知地址 | Posted:2010-08-25 03:37 |
asd1231603
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

谢谢分享 不过 还真复杂= =


献花 x0 回到顶端 [8 楼] From:台湾凯擘 | Posted:2010-08-25 08:13 |
caution222
个人文章 个人相簿 个人日记 个人地图
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x15 鲜花 x34
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

下面是引用 poo12369100 于 2010-08-24 11:45 发表的 : 到引言文
很难明..........................
可以整段片出来吗?

如果你明机本的sma就会明


正在准备CS1.6灾厄之章影片@_@
献花 x0 回到顶端 [9 楼] From:香港 | Posted:2010-08-25 10:03 |

<<   1   2   3   4   5  下页 >>(共 13 页)
首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.075343 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言