Русское сообщество по скриптингу

[ZP] Confused Bomb: Invalid Entity  [Решено]

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

[ZP] Confused Bomb: Invalid Entity

Сообщение Flomaster_prm » 22 май 2017, 01:45

Доброго времени суток :-) столкнулся с проблемой, и не могу найти ответов и решения, я не очень хорошо разбираюсь в этом деле, поэтому обращаюсь с отчаянием именно сюда. Плагин собственно, в котором нашлась проблема, стоит на zp моде, и исполняет роль "Галлюциногенной гранаты", для зомби. При её попадании в людей, она заставляет их(людей) видеть зомби как людей, т.е. меняет модели зомби на модели людей от их глаз(в кого попала граната). Вроде понятно объяснил :dntknw: Проблема состоит в моменте самой замены моделей, они конечно меняются, и плагин работает вроде нормально, но пинг подпрыгивает на 500+ и это не нормально. Ошибки в логах такие:

Код: Выделить всё
L 05/22/2017 - 02:28:55: [FAKEMETA] Invalid entity
L 05/22/2017 - 02:28:55: [AMXX] Displaying debug trace (plugin "zp_extra_grenade_conf.amxx")
L 05/22/2017 - 02:28:55: [AMXX] Run time error 10: native error (native "pev")
L 05/22/2017 - 02:28:55: [AMXX]    [0] zp_extra_grenade_conf.sma::Forward_AddToFullPack_Post (line 217)

Решить проблему собственноручно не получилось, так как не хватает опыта. Вот исходник:

Код: Выделить всё
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <cstrike>
#include <hamsandwich>
#include <zombieplague>
#include <fun>
#include <chatcolor>

#define PLUGIN "[ZP] Extra Item: Confused Bomb (for Zombie)"
#define VERSION "1.3"
#define AUTHOR "Dias" // Special Thank to sontung0 (For help me about the AddToFullPack forward)

#define CLASSNAME_FAKE_PLAYER "fake_player"
#define TASK_REMOVE_ILLUSION 111111
#define TASK_CONFUSED_SPR 434343

#define pev_nade_type        pev_flTimeStepSound
#define NADE_TYPE_CONFUSED    121314

new g_iEntFake[33]
new g_confusing[33]
new bool:has_confused_bomb[33]
new g_exploSpr

new cvar_distance
, cvar_time_hit

new g_confusedbomb

new const v_model
[] = "models/umbrella_grenades/v_grenade_infect.mdl"
new const p_model[] = "models/umbrella_grenades/p_grenade_infect.mdl"

new const confusion_exp[] = "grenades/conf_exp.wav"
new const confusing[] = "grenades/conf_banshee.wav"
new const confusion_spr[] = "sprites/effects/confuse.spr"

new g_iCurrentWeapon[33]
new confuse_spr_id

public plugin_init
()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event
("HLTV", "event_newround", "a", "1=0", "2=0")
    register_forward(FM_AddToFullPack, "Forward_AddToFullPack_Post", 1)
    
    register_event
("CurWeapon", "EV_CurWeapon", "be", "1=1")
    register_event("DeathMsg", "EV_DeathMsg", "a")
    
    register_forward
(FM_SetModel, "fw_SetModel")
    RegisterHam(Ham_Think, "grenade", "fw_GrenadeThink")
    RegisterHam(Ham_Touch, "grenade", "fw_GrenadeTouch")
    
    g_confusedbomb 
= zp_register_extra_item("EXTRA_CONF", 0, ZP_TEAM_ZOMBIE)
    
    cvar_distance 
= register_cvar("zp_confused_bomb_distance", "200.0")
    cvar_time_hit = register_cvar("zp_confused_bomb_time_hit", "15.0")
}

public plugin_precache()
{
    precache_model(v_model)
    precache_model(p_model)
    
    precache_sound
(confusion_exp)
    precache_sound(confusing)
    
    confuse_spr_id 
= precache_model(confusion_spr)
    
    g_exploSpr 
= engfunc(EngFunc_PrecacheModel, "sprites/effects/infect_explode.spr")
}

public EV_CurWeapon(id)
{
    if (!is_user_alive ( id ) || !zp_get_user_zombie(id))
        return PLUGIN_CONTINUE
    
    g_iCurrentWeapon
[id] = read_data(2)
    
    if 
(has_confused_bomb[id] && g_iCurrentWeapon[id] == CSW_SMOKEGRENADE)
    {
        set_pev (id, pev_viewmodel2, v_model)
        set_pev (id, pev_weaponmodel2, p_model)
    }
    
    return PLUGIN_CONTINUE
}

public EV_DeathMsg()
{
    new iVictim = read_data(2)
    
    if 
(!is_user_connected(iVictim))
        return
    
    has_confused_bomb
[iVictim] = false
}

public fw_SetModel(ent, const Model[])
{
    if (ent < 0)
        return FMRES_IGNORED
    
    if 
(pev(ent, pev_dmgtime) == 0.0)
        return FMRES_IGNORED
    
    new iOwner 
= pev(ent, pev_owner)
    
    if 
(has_confused_bomb[iOwner] && equal(Model[7], "w_sm", 4))
    {
        // Reset any other nade
        set_pev (ent, pev_nade_type, 0 )
        set_pev (ent, pev_nade_type, NADE_TYPE_CONFUSED)
    
        return FMRES_SUPERCEDE
    
}
    return FMRES_IGNORED
}

public zp_extra_item_selected(id, item)
{
    if(item == g_confusedbomb)
    {
        has_confused_bomb[id] = true
        give_item
(id, "weapon_smokegrenade")
        
        ChatColor
(id, "%L", id, "BUY_CONF")
    }
}

public event_newround(id)
{
    g_confusing[id] = false
    
    if
(task_exists(id+TASK_REMOVE_ILLUSION)) remove_task(id+TASK_REMOVE_ILLUSION)
    if(task_exists(id+TASK_CONFUSED_SPR)) remove_task(id+TASK_CONFUSED_SPR)
}

public fw_GrenadeThink(ent)
{
    if(!pev_valid(ent))
        return HAM_IGNORED
    
    static Float
:dmg_time
    pev
(ent, pev_dmgtime, dmg_time)
    
    if
(dmg_time > get_gametime())
        return HAM_IGNORED
    
    static id
    id 
= pev(ent, pev_owner)
    
    if
(pev(ent, pev_nade_type) == NADE_TYPE_CONFUSED)
    { 
        if
(has_confused_bomb[id])
        {
            has_confused_bomb[id] = false
            confuse_bomb_exp
(ent, id)
            
            engfunc
(EngFunc_RemoveEntity, ent)
            
            return HAM_SUPERCEDE
        
}
    }

    return HAM_HANDLED
}

public fw_GrenadeTouch(bomb)
{
    if(!pev_valid(bomb))
        return HAM_IGNORED
    
    static id
    id 
= pev(bomb, pev_owner)
    
    if
(zp_get_user_zombie(id) && pev(bomb, pev_nade_type) == NADE_TYPE_CONFUSED)
    { 
        if
(has_confused_bomb[id])
        {
            set_pev(bomb, pev_dmgtime, 0.0)
        }
    }

    return HAM_HANDLED    
}

public Forward_AddToFullPack_Post(es_handled, inte, ent, host, hostflags, player, pSet)
{
    if (!is_user_alive(host))
        return FMRES_IGNORED

    if
(!g_confusing[host])
        return FMRES_IGNORED

    if 
((< ent < 32))
    {
        if(is_user_connected(ent) && zp_get_user_zombie(ent))
        {
            set_es(es_handled, ES_RenderMode, kRenderTransAdd)
            set_es(es_handled, ES_RenderAmt, 0.0)
            
            new iEntFake 
= find_ent_by_owner(-1, CLASSNAME_FAKE_PLAYER, ent)
            if(!iEntFake || !pev_valid(ent))
            {
                iEntFake = create_fake_player(ent)
            }
            
            g_iEntFake
[ent] = iEntFake
        
}
    }
    
    else if 
(ent >= g_iEntFake[32])
    {
        static ent_owner
        ent_owner 
= pev(ent, pev_owner)
        
        if
((< ent_owner < 32) && zp_get_user_zombie(ent_owner))
        {
            set_es(es_handled, ES_RenderMode, kRenderNormal)
            set_es(es_handled, ES_RenderAmt, 255.0)

            set_es(es_handled, ES_ModelIndex, pev(host, pev_modelindex))
        }
    }
    
    return FMRES_IGNORED
}

public zp_user_infected_post(id)
{
    if(g_confusing[id])
    {
        g_confusing[id] = false
        if
(task_exists(id+TASK_REMOVE_ILLUSION)) remove_task(id+TASK_REMOVE_ILLUSION)
    }
}

public confuse_bomb_exp(ent, owner)
{
    static Float:Origin[3]
    pev(ent, pev_origin, Origin)
    
    EffectZombieBomExp
(ent)
    emit_sound(ent, CHAN_VOICE, confusion_exp, 1.0, ATTN_NORM, 0, PITCH_NORM)
    
    
// Make Hit Human
    static victim = -1
    while 
((victim = engfunc(EngFunc_FindEntityInSphere, victim, Origin, get_pcvar_float(cvar_distance))) != 0)
    {
        if(!is_user_alive(victim) || !is_user_connected(victim) || g_confusing[victim])
            continue
        
        if
(is_user_alive(victim) && is_user_connected(victim) && !zp_get_user_zombie(victim))
        {
            g_confusing[victim] = 1
            
            set_task
(0.1, "makespr", victim+TASK_CONFUSED_SPR)
            
            message_begin
(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), _, victim)
            write_short(10)
            write_short(10)
            write_short(0x0000)
            write_byte(100)
            write_byte(100)
            write_byte(100)
            write_byte(255)
            message_end()
            
            emit_sound
(victim, CHAN_VOICE, confusing, 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task
(get_pcvar_float(cvar_time_hit), "remove_confuse", victim+TASK_REMOVE_ILLUSION)
        }
    }
}

EffectZombieBomExp(id)
{
    static Float:origin[3];
    pev(id,pev_origin,origin);
    
    message_begin
(MSG_BROADCAST,SVC_TEMPENTITY); 
    write_byte
(TE_EXPLOSION); // TE_EXPLOSION
    write_coord(floatround(origin[0])); // origin x
    write_coord(floatround(origin[1])); // origin y
    write_coord(floatround(origin[2])); // origin z
    write_short(g_exploSpr); // sprites
    write_byte(40); // scale in 0.1's
    write_byte(30); // framerate
    write_byte(14); // flags 
    message_end(); // message end
}

public remove_confuse(taskid)
{
    new id = taskid - TASK_REMOVE_ILLUSION
    g_confusing
[id] = 0
    
    if
(task_exists(id+TASK_CONFUSED_SPR)) remove_task(id+TASK_CONFUSED_SPR)
}

public makespr(taskid)
{
    new id = taskid - TASK_CONFUSED_SPR
    
    if
(zp_get_user_zombie(id) || !is_user_alive(id))
        return
    
    static Float
:Origin[3]
    pev(id, pev_origin, Origin)
    
    engfunc
(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0)
    write_byte(TE_SPRITE)
    engfunc(EngFunc_WriteCoord,Origin[0])
    engfunc(EngFunc_WriteCoord,Origin[1])
    engfunc(EngFunc_WriteCoord,Origin[2]+25.0)
    write_short(confuse_spr_id)
    write_byte(8)
    write_byte(255)
    message_end()
    
    set_task
(0.1,"makespr",id+TASK_CONFUSED_SPR)
}

create_fake_player(id)
{
    new iEntFake = create_entity("info_target")
    set_pev(iEntFake, pev_classname, CLASSNAME_FAKE_PLAYER)
    set_pev(iEntFake, pev_modelindex, pev(id, pev_modelindex) )
    set_pev(iEntFake, pev_movetype, MOVETYPE_FOLLOW)
    set_pev(iEntFake, pev_solid, SOLID_NOT)
    set_pev(iEntFake, pev_aiment, id)
    set_pev(iEntFake, pev_owner, id)

    // an? fake player
    set_pev(iEntFake, pev_rendermode, kRenderTransAdd)
    set_pev(iEntFake, pev_renderamt, 0.0)

    return iEntFake

Надеюсь на вашу помощь :-)

Название темы скорректировано // Subb98
Последний раз редактировалось Flomaster_prm 22 май 2017, 10:03, всего редактировалось 1 раз.
Аватара пользователя
Flomaster_prm
 
Сообщения: 4
Зарегистрирован: 22 май 2017, 01:32
Откуда: г. Пермь
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Re: [ZP] Confused Bomb: Invalid Entity

Сообщение Subb98 » 22 май 2017, 08:56

Flomaster_prm, добрый вечер. Пожалуйста, измените название темы на информативное, в соответствии Вы должны зарегистрироваться, чтобы видеть ссылки.. Если Вы не сделаете этого в течение суток, я изменю название темы сам, однако в этом случае Вам будет выдано предупреждение в профиль.

П.с.: Вы должны зарегистрироваться, чтобы видеть ссылки.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [ZP] Confused Bomb: Invalid Entity

Сообщение Flomaster_prm » 22 май 2017, 11:07

Subb98 писал(а):Flomaster_prm, добрый вечер. Пожалуйста, измените название темы на информативное, в соответствии Вы должны зарегистрироваться, чтобы видеть ссылки.. Если Вы не сделаете этого в течение суток, я изменю название темы сам, однако в этом случае Вам будет выдано предупреждение в профиль.

Так лучше?


Боюсь в моем случае это не так просто, как в простых плагинах на паблики, пожалуйста дайте больше подробностей, я по-прежнему не могу решить эту проблему :zzz:

Код: Выделить всё
public Forward_AddToFullPack_Post(es_handledinteenthosthostflagsplayerpSet)
{
    if (!
is_user_alive(host))
        return 
FMRES_IGNORED

    
if(!g_confusing[host])
        return 
FMRES_IGNORED

    
if ((ent 32))
    {
        if(
is_user_connected(ent) && zp_get_user_zombie(ent))
        {
            
set_es(es_handledES_RenderModekRenderTransAdd)
            
set_es(es_handledES_RenderAmt0.0)
            
            new 
iEntFake find_ent_by_owner(-1CLASSNAME_FAKE_PLAYERent)
            if(!
iEntFake || !pev_valid(ent))
            {
                
iEntFake create_fake_player(ent)
            }
            
            
g_iEntFake[ent] = iEntFake
        
}
    }
    
    else if (
ent >= g_iEntFake[32])
    {
        static 
ent_owner
        ent_owner 
pev(entpev_owner)
        
        if((
ent_owner 32) && zp_get_user_zombie(ent_owner))
        {
            
set_es(es_handledES_RenderModekRenderNormal)
            
set_es(es_handledES_RenderAmt255.0)

            
set_es(es_handledES_ModelIndexpev(hostpev_modelindex))
        }
    }
    
    return 
FMRES_IGNORED
Последний раз редактировалось Subb98 22 май 2017, 11:41, всего редактировалось 1 раз.
Причина: для вставки исходного кода нужно использовать кнопку "Код / Исходник"
Аватара пользователя
Flomaster_prm
 
Сообщения: 4
Зарегистрирован: 22 май 2017, 01:32
Откуда: г. Пермь
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Re: [ZP] Confused Bomb: Invalid Entity  [Решено]

Сообщение Subb98 » 22 май 2017, 11:47

Flomaster_prm писал(а):Так лучше?

К сожалению, нет, название я скорректировал сам. Учитывая, что Вы откликнулись на замечание, никакого предупреждения не будет.

Flomaster_prm писал(а):Боюсь в моем случае это не так просто, как в простых плагинах на паблики, пожалуйста дайте больше подробностей, я по-прежнему не могу решить эту проблему :zzz:

Замените этот участок кода

Код: Выделить всё
if (!is_user_alive(host))
        return 
FMRES_IGNORED

этим

Код: Выделить всё
if (!is_user_alive(host) || pev_valid(ent) < 2)
        return 
FMRES_IGNORED
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [ZP] Confused Bomb: Invalid Entity

Сообщение Flomaster_prm » 22 май 2017, 12:12

Так всё просто было о_О Благодарю за помощь, проблема решена. Только кости моделей зомби остаются, и анимации заменяющей модели становятся ужасным зрелищем :-D
Аватара пользователя
Flomaster_prm
 
Сообщения: 4
Зарегистрирован: 22 май 2017, 01:32
Откуда: г. Пермь
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.


Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 10

cron