设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 470|回复: 4

[求助] [ZP] Healing Zombie debug error [复制链接]

Modchina声望-尊敬

百贴杀阵!

Rank: 7Rank: 7Rank: 7

帖子
379
精华
0
声望
3092 点
金币
371 Mold
被赞许
10 次
注册时间
2007-5-2
发表于 2011-7-15 15:42:24 |显示全部楼层
本帖最后由 Osker Lee 于 2011-7-15 18:30 编辑

网上找到的一个僵尸插件,按R键可以治疗自身和队友,有治疗的音效和spr图标,同时支援BOT使用。不过在游戏的控制台老是出现debug error信息,大家知道怎么解决吗?

L 07/11/2011 - 18:34:34: [AMXX] Displaying debug trace (plugin "zp_zclass_healer.amxx")
L 07/11/2011 - 18:34:34: [AMXX] Run time error 10: native error (native "zp_get_zombie_maxhealth")
L 07/11/2011 - 18:34:34: [AMXX]    [0]zp_zclass_healer.sma::fw_CmdStart (line 125)
L 07/11/2011 - 18:34:34: [ZP] Player not a normal zombie (4)
......

下面是插件的源代码:

#include <amxmodx>
#include <xs>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>

#define SUPPORT_BOT_TO_USE               

new const zclass_name[] = { "Healing Zombie" }
new const zclass_info[] = { "Press button 'R' to heal" }
new const zclass_model[] = { "zombie_source" }
new const zclass_clawmodel[] = { "v_knife_source.mdl" }
const zclass_health = 5000
const zclass_speed = 260
const Float:zclass_gravity = 0.8
const Float:zclass_knockback = 1.0

new const HealSound[] = { "zombie_plague/td_debuff.wav" }                

new g_zclass_kuca
new kuca_skill_cooldown, kuca_skill_range, kuca_skill_heal_point
new Float:eyes_skill[33]
new heal_spr

public plugin_init()
{
        register_plugin("[ZP] Class: Healing Zombie", "1.0", "AMXX")
       
        kuca_skill_cooldown = register_cvar("zp_kuca_cooldown", "20")
        kuca_skill_range = register_cvar("zp_kuca_heal_range", "9999")
        kuca_skill_heal_point = register_cvar("zp_kuca_heal_hp_percentage", "10")
       
        register_forward(FM_CmdStart, "fw_CmdStart")
        register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
       
        register_event("ResetHUD","NewRound","be")
        register_event("DeathMsg", "Death", "a")
}

public plugin_precache()
{
        precache_sound(HealSound)
        heal_spr = precache_model("sprites/zombie_plague/zombie_healer.spr")
        g_zclass_kuca = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}

public zp_user_infected_post(id, infector)
{
        if (zp_get_user_zombie_class(id) == g_zclass_kuca)
        {
                client_print(id, print_chat, "", get_pcvar_float(kuca_skill_range), get_pcvar_num(kuca_skill_heal_point), get_pcvar_float(kuca_skill_cooldown))
        }
}

public zp_user_humanized_post(id)
{
        clear(id)
}

public Death()
{
        new id = read_data(2)
        clear(id)
}

public NewRound(id)
{
        clear(id)
}

public client_connect(id)
{
        clear(id)
}

public client_disconnect(id)
{
        clear(id)
}

public clear(id)
{
        eyes_skill[id] = 0.0
}

public fw_CmdStart(id, uc_handle, seed)
{
        if (!is_user_alive(id))
                return FMRES_IGNORED;
       
        if (!zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclass_kuca)
                return FMRES_IGNORED;
       
        if (zp_get_user_nemesis(id))
                return FMRES_IGNORED;
       
        static button, oldbutton, i
        button = get_uc(uc_handle, UC_Buttons)
        oldbutton = pev(id, pev_oldbuttons)
       
        if ((button & IN_RELOAD) && !(oldbutton & IN_RELOAD))
        {
                if (get_gametime() - eyes_skill[id] < get_pcvar_float(kuca_skill_cooldown))
                {
                        client_print(id, print_chat, "During the cooldown,You can't use this skill!")
                        return FMRES_IGNORED;
                }
               
                for(i = 1; i <= get_playersnum(); i++)
                        if(id != i && is_user_alive(i) && zp_get_user_zombie(i) && !zp_get_user_nemesis(i))
                                if (is_in_view(id, i) && get_range(id, i) <= get_pcvar_float(kuca_skill_range))
                                        heal_zombie(i)
                heal_zombie(id)
                eyes_skill[id] = get_gametime()
        }
       
        #if defined SUPPORT_BOT_TO_USE
        if (is_user_bot(id))
        {
                if (get_gametime() - eyes_skill[id] < get_pcvar_float(kuca_skill_cooldown))
                        return FMRES_IGNORED;
               
                static bool:need_heal_in_view[33]
                for(i = 1; i <= get_playersnum(); i++)
                        if (pev(i, pev_health) <= float(zp_get_zombie_maxhealth(i))*(100-get_pcvar_float(kuca_skill_heal_point))/100)
                                if(id != i && is_user_alive(i) && zp_get_user_zombie(i) && !zp_get_user_nemesis(i))
                                        if (is_in_view(id, i) && get_range(id, i) <= get_pcvar_float(kuca_skill_range))
                                                need_heal_in_view[id] = true
               
                if (need_heal_in_view[id] || pev(id, pev_health) <= float(zp_get_zombie_maxhealth(id))*(100-get_pcvar_float(kuca_skill_heal_point))/100)
                {
                        for(i = 1; i <= get_playersnum(); i++)
                                if(id != i && is_user_alive(i) && zp_get_user_zombie(i) && !zp_get_user_nemesis(i))
                                        if (is_in_view(id, i) && get_range(id, i) <= get_pcvar_float(kuca_skill_range))
                                                heal_zombie(i)
                        heal_zombie(id)
                        need_heal_in_view[id] = false
                        eyes_skill[id] = get_gametime()
                }
        }
        #endif
       
        return FMRES_HANDLED;
}

public heal_zombie(id)
{
        show_spr(id)
        engfunc(EngFunc_EmitSound, id, CHAN_AUTO, HealSound, 1.0, ATTN_NORM, 0, PITCH_NORM)
        if (pev(id, pev_health) < float(zp_get_zombie_maxhealth(id)))
                set_pev(id, pev_health, floatmin(pev(id, pev_health) + float(zp_get_zombie_maxhealth(id))*get_pcvar_float(kuca_skill_heal_point)/100, float(zp_get_zombie_maxhealth(id))))
}

public fw_PlayerPreThink(id)
{
        if (!is_user_alive(id)) return FMRES_IGNORED;
       
        if (zp_get_user_nemesis(id)) return FMRES_IGNORED;
       
        if (!zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclass_kuca) return FMRES_IGNORED;
       
        if (get_gametime() - eyes_skill[id] >= get_pcvar_float(kuca_skill_cooldown) && get_gametime() - eyes_skill[id] < get_pcvar_float(kuca_skill_cooldown)+0.1)
                client_print(id, print_chat, "You can use the skills now!", get_pcvar_float(kuca_skill_cooldown))
       
        return FMRES_IGNORED;
}

stock Float:get_range(index, target)
{
        static Float:origin1[3], Float:origin2[3]
        pev(index, pev_origin, origin1)
        pev(target, pev_origin, origin2)
       
        return get_distance_f(origin1,origin2)
}

stock show_spr(id)
{
        static Float:origin[3]
        pev(id, pev_origin, origin)
        engfunc(EngFunc_MessageBegin,MSG_BROADCAST,SVC_TEMPENTITY,origin,0)
        write_byte(TE_SPRITE)
        engfunc(EngFunc_WriteCoord,origin[0])
        engfunc(EngFunc_WriteCoord,origin[1])
        engfunc(EngFunc_WriteCoord,origin[2]+16)
        write_short(heal_spr)
        write_byte(10)
        write_byte(255)
        message_end()
}

stock bool:is_in_view(index, target, ignoremonsters = 1)
{
        if (index == target) return false;

        new Float:angles[3];
        pev(index, pev_angles, angles);
        engfunc(EngFunc_MakeVectors, angles);
        global_get(glb_v_forward, angles);
        angles[2] = 0.0;

        new Float:origin[3], Float:point[3], Float:diff[3], Float:norm[3], Float:view_ofs[3];
        pev(index, pev_origin, origin);
        pev(target, pev_origin, point);
        xs_vec_sub(point, origin, diff);
        diff[2] = 0.0;
        xs_vec_normalize(diff, norm);

        pev(index, pev_view_ofs, view_ofs);
        xs_vec_add(origin, view_ofs, origin);

        engfunc(EngFunc_TraceLine, origin, point, ignoremonsters, index, 0);

        new Float:dot, Float:fov;
        dot = xs_vec_dot(norm, angles);
        pev(index, pev_fov, fov);

        new Float:fraction;
        get_tr2(0, TR_flFraction, fraction);

        if (dot >= floatcos(fov * M_PI / 360) && fraction == 1.0)
                return true;

        return false;
}
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 10Rank: 10Rank: 10

帖子
3735
精华
1
声望
5900 点
金币
2148 Mold
被赞许
47 次
注册时间
2009-12-20

优秀版主奖 Modchina灌水王 星界财团 可爱小猫

发表于 2011-7-15 15:56:21 |显示全部楼层
本帖最后由 programe 于 2011-7-15 15:57 编辑

似乎"zp_get_zombie_maxhealth"有问题
至于你信不信,我反正信了

使用道具 举报

Modchina声望-崇拜

在逃模客

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

帖子
2536
精华
0
声望
8050 点
金币
1500 Mold
被赞许
120 次
注册时间
2010-2-7

懒人勋章

发表于 2011-7-15 16:20:48 |显示全部楼层
刚学插件,看这些是在头疼啊....看不出来哪有错
その一   いつもと违う髪形に気が付くこと
その二   ちゃんと靴まで见ること   いいね?
その三   わたしの一言には三つの言叶で返

使用道具 举报

Rank: 5Rank: 5

帖子
131
精华
0
声望
867 点
金币
133 Mold
被赞许
10 次
注册时间
2010-12-31
发表于 2011-7-15 17:20:39 |显示全部楼层
for(i = 1; i <= get_playersnum(); i++)
  if (pev(i, pev_health) <= float(zp_get_zombie_maxhealth(i))*(100-get_pcvar_float(kuca_skill_heal_point))/100)
  if(id != i && is_user_alive(i) && zp_get_user_zombie(i) && !zp_get_user_nemesis(i))
   if (is_in_view(id, i) && get_range(id, i) <= get_pcvar_float(kuca_skill_range))
   need_heal_in_view[id] = true
貌似是这一段出了问题
代码先获取了值,然后再进行 是否为当前玩家 是否为活着的玩家 和 是否为将是 和 是否不为复仇天神的判断
应当把第二个判断语句放到前面去,如果不事先加以判断而用针对实体获取数值类函数,比如说pev,cs_get_user_health之类的就会出错
此时错误提示一般是XX is not a valid entity
zp_gei_zombie_maxhealth这个函数同理

个人意见,没自己看,仅供参考
I am the bone of my Scripts,
So I pray, Unlimited Code Works.

使用道具 举报

Modchina声望-尊敬

百贴杀阵!

Rank: 7Rank: 7Rank: 7

帖子
379
精华
0
声望
3092 点
金币
371 Mold
被赞许
10 次
注册时间
2007-5-2
发表于 2011-7-16 11:19:50 |显示全部楼层
嗯,厉害!这都被你看出来了,我对这段代码倒是纠结了半天也没看出个所以然。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部