|
发表于 2016-11-5 20:10:46
|
显示全部楼层
来自 中国–广东–佛山
我给你一个仿csol复活的吧,自己修改一下参数就可以了
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#define PLUGIN_NAME "延迟复活"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_AUTHOR "Hui"
new fixduck
new Float:time1[33]
new tdos[33]
new spawn_count
new waitime2, waitspawn
new r_bot, Float:saveorg[33][3]
new Float:waitime[33]
new KillCount[33]
new Ducking[33]
new spawn_cunge
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR); //注册插件名字,版本,作者
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled") //给玩家注册一个死亡事件
register_event("TeamInfo", "player_joinTeam", "ae") //玩家进入服务器后选定人物的时候触发
register_forward(FM_PlayerPostThink, "Spawn_PostThink", 1) //注册玩家的思考
r_bot = register_forward(FM_PlayerPostThink, "fw_BotForwardRegister_Post", 1) //给BOT注册一个思考
set_msg_block( get_user_msgid( "ClCorpse" ), BLOCK_SET ) //让尸体不会一直存在
spawn_cunge = register_cvar("spawn_cg", "0") //是否可以原地复活(1可以,0不能)
fixduck = register_cvar("spawn_fixduck", "30.0") //修复死亡时玩家蹲着后复活后的高度
waitspawn = register_cvar("spawn_wait2", "1.0") //死亡后需要等几秒才能开始倒数
spawn_count = register_cvar("spawn_time","2") //复活需要多久
waitime2 = register_cvar("spawn_wait", "6.0") //进入服务器选定人物后要等待多久才能复活
}
//BOT的思考
public fw_BotForwardRegister_Post(id)
{
if (is_user_bot(id))
{
unregister_forward(FM_PlayerPostThink, r_bot, 1) //取消思考注册,这里就会只执行一次,而不是无限执行
RegisterHamFromEntity(Ham_Killed, id, "fw_PlayerKilled", 1) //给BOT注册死亡事件
}
}
//玩家的思考
public Spawn_PostThink(id)
{
if(is_user_alive(id) || !get_user_team(id)) //如果玩家是活着的,或者玩家没有选择阵营,不往下执行
return
if(waitime[id] <= get_gametime()) //如果waitime时间小于当前游戏时间
{
if(time1[id] <= get_gametime()) //如果time1时间小于当前游戏时间
{
//这样的话,这个地方就是一秒执行一次
if(tdos[id] >= 0) tdos[id] -= 1 //如果tdos的值大于等于0,即减少1
time1[id] = get_gametime() + 1.0 //更新time1的存储时间为 当前游戏时间 + 1.0
}
if(tdos[id] >= 0) //如果值大于等于0
{
client_print(id,print_center, "复活剩余时间 (%d秒)", tdos[id])
}
else //不然的话,值应该是-1,执行下面的
{
if(get_user_team(id) != 3) //玩家不是观察者
{
ExecuteHamB(Ham_CS_RoundRespawn, id)
client_print(id, print_center, "已经复活") //给玩家屏幕中间打印文字
//如果spawn_cunge参数为0,即返回
if(!get_pcvar_num(spawn_cunge)) return //如果参数没有开启原地复活
//在第一次进入服务器后等待复活,但是这个时候不需要设置坐标
//防止玩家第一次进入服务器复活后坐标设置到0坐标位置
if(KillCount[id])
{
if(Ducking[id]) //如果玩家死亡的时候是蹲着的
{
saveorg[id][2] += get_pcvar_float(fixduck) //修正高度
Ducking[id] = 0 //修复Bug:变量存储为一直蹲着
}
set_pev(id, pev_origin, saveorg[id]) //设置坐标
}
}
}
}
}
//死亡触发事件
public fw_PlayerKilled(vic, attacker)
{
if(!is_user_connected(vic)) //如果玩家没有进入服务器,那么不往下执行
return
//如果玩家是观察者,那么不往下执行
if(get_user_team(vic) == 3) return
tdos[vic] = get_pcvar_num(spawn_count) //存储复活需要多少秒
waitime[vic] = get_gametime() + get_pcvar_float(waitspawn) //存储死亡后需要等待多少秒才能[开始倒计时]
//这里是防止玩家第一次进入服务器,会被spawn_cg参数复活坐标设置到0坐标的问题
//这里的变量只会更新一次
if(KillCount[vic] < 1) KillCount[vic] = 1
//如果玩家的Flags是蹲着的,那么Ducking变量改成1
if(pev(vic, pev_flags) & FL_DUCKING) Ducking[vic] = 1
pev(vic, pev_origin, saveorg[vic]) //获取玩家当前位置(死亡的位置)
}
//玩家选择阵营触发事件
public player_joinTeam()
{
new id = read_data(1) //从客户端信息取值
if(!is_user_connected(id)) //如果玩家没有进入服务器,不往下执行
return
//以下代码都是为了玩家在进入服务器选定人物后 延迟触发复活的
new team = get_user_team(id) //声明team变量是获取玩家阵营
if(team != 3 && team) //如果玩家的阵营不是观察者并且已经有阵营了(没阵营的意思是:玩家没有选择菜单中的任何阵营)
{
tdos[id] = get_pcvar_num(spawn_count) //让tdos变量更新为需要多久才能复活
waitime[id] = get_gametime() + get_pcvar_float(waitime2) //存储变量为多久开始倒计时复活
}
} |
|