raprush 发表于 2016-11-3 12:33:47

请帮忙写个无限复活到出生点间隔3秒一次的小插件

就是普通的无限复活到出生点的插件 加个3秒一次的时间间隔

给个码源有时候可能需要调整下时间

丶某人的痛才是 发表于 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
new tdos
new spawn_count
new waitime2, waitspawn
new r_bot, Float:saveorg
new Float:waitime
new KillCount
new Ducking
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 <= get_gametime()) //如果waitime时间小于当前游戏时间
        {
                if(time1 <= get_gametime()) //如果time1时间小于当前游戏时间
                {
                        //这样的话,这个地方就是一秒执行一次
                       
                        if(tdos >= 0) tdos -= 1 //如果tdos的值大于等于0,即减少1
                        time1 = get_gametime() + 1.0 //更新time1的存储时间为 当前游戏时间 + 1.0
                }

                if(tdos >= 0) //如果值大于等于0
                {
                        client_print(id,print_center, "复活剩余时间 (%d秒)", tdos)
                }
                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)
                                {
                                        if(Ducking) //如果玩家死亡的时候是蹲着的
                                        {
                                                saveorg += get_pcvar_float(fixduck) //修正高度
                                                Ducking = 0 //修复Bug:变量存储为一直蹲着
                                        }
                                       
                                        set_pev(id, pev_origin, saveorg) //设置坐标
                                }
                        }
                }
        }
}

//死亡触发事件
public fw_PlayerKilled(vic, attacker)
{
        if(!is_user_connected(vic)) //如果玩家没有进入服务器,那么不往下执行
        return
       
        //如果玩家是观察者,那么不往下执行
        if(get_user_team(vic) == 3) return
       
        tdos = get_pcvar_num(spawn_count) //存储复活需要多少秒
        waitime = get_gametime() + get_pcvar_float(waitspawn) //存储死亡后需要等待多少秒才能[开始倒计时]
       
        //这里是防止玩家第一次进入服务器,会被spawn_cg参数复活坐标设置到0坐标的问题
        //这里的变量只会更新一次
        if(KillCount < 1) KillCount = 1
       
        //如果玩家的Flags是蹲着的,那么Ducking变量改成1
        if(pev(vic, pev_flags) & FL_DUCKING) Ducking = 1
       
        pev(vic, pev_origin, saveorg) //获取玩家当前位置(死亡的位置)
}

//玩家选择阵营触发事件
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 = get_pcvar_num(spawn_count) //让tdos变量更新为需要多久才能复活
                waitime = get_gametime() + get_pcvar_float(waitime2) //存储变量为多久开始倒计时复活
        }
}

tly111222 发表于 2016-11-3 15:32:37

论坛上好像有这个插件,搜索先

raprush 发表于 2016-11-4 17:15:25

感谢朋友的提醒 找到了 不过有些小bug   帮忙改为不提示直接3秒后复活的好不
#include <amxmod>
#include <fun>

/*
*
* Set Cvar 'amx_respawn' 1 or 0
*
*/
new gmsgResetHUD

public death_msg()
{      
      if (get_cvar_num("amx_respawn") == 1)
      {
                new vIndex = read_data(2)
                new svIndex
                num_to_str(vIndex,svIndex,32)
                set_task(2.0,"respawn",0,svIndex,32)
      }
      return PLUGIN_CONTINUE
}

public respawn(svIndex[])
{
      new vIndex = str_to_num(svIndex)
      user_spawn(vIndex)
      message_begin(MSG_ONE,gmsgResetHUD,{0,0,0},vIndex)
      message_end()
      
}



public plugin_init()
{
      gmsgResetHUD = get_user_msgid("ResetHUD")
      register_plugin("amx_respawn","0.2","f117bomb")
      register_event("DeathMsg","death_msg","a")
      register_cvar("amx_respawn","0")
      return PLUGIN_CONTINUE
}

tly111222 发表于 2016-11-5 11:43:24

raprush 发表于 2016-11-4 17:15
感谢朋友的提醒 找到了 不过有些小bug   帮忙改为不提示直接3秒后复活的好不
#include
#include


{:6_172:}改插件能力有限,还是等大神改吧!

raprush 发表于 2016-11-5 22:05:49

感谢!      还有注释!   这个够我慢慢研究了!{:6_195:}
页: [1]
查看完整版本: 请帮忙写个无限复活到出生点间隔3秒一次的小插件