Проблема с поведением entity.

Сообщения
31
Реакции
-1
Здравствуйте. Пытался создать оружие, которое требует наличие энтити, прикрепленного к игроку [Dual Beretta Gunslinger], но столкнулся с проблемой: когда происходит смена углов или ориджина игрока, то передвижения и повороты энтити идут с задержкой и это все выглядит криво, учитывая, что сам энтити тут не при чем. У людей наподобие AsdianDX и Aoki Melodia [Пользователи ютуб] таких проблем нет, но и они не смогли решить мою проблему. Позже, я использовал их версию оружия, но проблема абсолютно такая же. С чем это может быть связано? [Я могу записать видео, показав проблему, но не уверен, разрешено ли это]
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Код давай.
 
Сообщения
31
Реакции
-1
fl0wer,
Код:
stock Func_CreateAnEntity(iPlayer)
{
    static iEntity; iEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    if(!IsValidPev(iEntity)) return;

    static Float: flStartOrigin[3]; pev(iPlayer, pev_origin, flStartOrigin);
    static Float: flEntAngles[3]; pev(iPlayer, pev_v_angle, flAngle); flEntAngles[0] = -flEntAngles[0];
    static Float: flGameTime; flGameTime = get_gametime();

    set_pev(iEntity, pev_classname, WEAPON_ENTITY2_CLASSNAME);
    set_pev(iEntity, pev_solid, SOLID_NOT);

    set_pev(iEntity, pev_movetype, MOVETYPE_FLY);
    set_pev(iEntity, pev_owner, iPlayer);

    engfunc(EngFunc_SetOrigin, iEntity, flStartOrigin);
    set_pev(iEntity, pev_angles, flEntAngles);

    engfunc(EngFunc_SetModel, iEntity, WEAPON_ENTITY2_MODEL);
    set_pev(iEntity, pev_sequence, random_num(0, 4))
    set_pev(iEntity, pev_animtime, flGameTime);
    set_pev(iEntity, pev_framerate, 1.0);

    set_pev(iEntity, pev_mins, Float: {-1.0, -1.0, -1.0});
    set_pev(iEntity, pev_maxs, Float: {1.0, 1.0, 1.0});
    set_pev(iEntity, pev_nextthink, flGameTime + 0.01);
}

public FM_EntityThink2(iEntity)
{
    if(!IsValidPev(iEntity))
    return FMRES_IGNORED;

    static iOwner; iOwner = pev(iEntity, pev_owner);
    if(!is_user_alive(iOwner) || zp_get_user_zombie(iOwner))
    {
        set_pev(iEntity, pev_flags, FL_KILLME);
        return FMRES_IGNORED;
    }
    static Float: flGameTime; flGameTime = get_gametime();
    static Float: flDestOrigin[3]; pev(iPlayer, pev_origin, flDestOrigin);
    static Float: flEntAngles[3]; pev(iPlayer, pev_v_angle, flEntAngles); flEntAngles[0] = -flEntAngles[0];
    set_pev(iEntity, pev_origin, flDestOrigin);
    set_pev(iEntity, pev_angles, flEntAngles);

    set_pev(iEntity, pev_nexthink, flGameTime + 0.01);
    return FMRES_IGNORED;
}
14 Янв 2020
fl0wer, сперва я попробовал выставить энтити скорость с направлением к ориджину игрока, но был тот же результат. Сейчас остановился на коде выше.
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
zNeks, значит они тебя обманули.
 
Сообщения
31
Реакции
-1
fl0wer, в каком плане? Я сначала сам создал свою версию, на которой была такая же проблема, а позже обратился к ним. У других людей все впорядке.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
zNeks, как одинаковый код может по-разному работать?
 
Сообщения
31
Реакции
-1
fl0wer, я показал тебе свой код. У них он следующий:
Код:
stock DPS_Entites(id, models[], Float:Start[3], Float:End[3], Float:speed, solid, seq, move=MOVETYPE_FLY)
{
    new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));

    // Set info for ent
    set_pev(pEntity, pev_movetype, move);
    set_pev(pEntity, pev_owner, id);
    engfunc(EngFunc_SetModel, pEntity, models);
    set_pev(pEntity, pev_classname, "dbg_fakehand");
    set_pev(pEntity, pev_mins, Float:{-1.0, -1.0, -1.0});
    set_pev(pEntity, pev_maxs, Float:{1.0, 1.0, 1.0});
    set_pev(pEntity, pev_origin, Start);
    set_pev(pEntity, pev_gravity, 0.01);
    set_pev(pEntity, pev_solid, solid);

    static Float:Velocity[3];
    Stock_Get_Speed_Vector(Start, End, speed, Velocity);
    set_pev(pEntity, pev_velocity, Velocity);

    new Float:vecVAngle[3]; pev(id, pev_v_angle, vecVAngle);
    vector_to_angle(Velocity, vecVAngle)

    if(vecVAngle[0] > 90.0) vecVAngle[0] = -(360.0 - vecVAngle[0]);
    set_pev(pEntity, pev_angles, vecVAngle);
    set_pev(pEntity, pev_sequence, seq)
    set_pev(pEntity, pev_animtime, get_gametime());
    set_pev(pEntity, pev_framerate, 1.0)
    return pEntity;
}

public Entity_Think(iEnt)
{
    if (!pev_valid(iEnt))
        return;
    if (pev(iEnt, pev_flags) & FL_KILLME)
        return;

    new classname[32], iOwner, Float:fEndTime, Float:fRenderAmount, Float:fFrame, Float:fOrigin[3];
    pev(iEnt, pev_classname, classname, 31);

    if(equal(classname, EXP_CLASSNAME))
    {
        fm_remove_entity(iEnt)
        return
    }

    if(equal(classname, "dbg_fakehand"))
    {
        iOwner = pev(iEnt, pev_owner)
        pev(iEnt, pev_fuser3, fEndTime)

        if(!is_user_alive(iOwner) || !is_user_connected(iOwner) || zp_get_user_zombie(iOwner) || get_user_weapon(iOwner) != CSW_GUNKATA || fEndTime == get_gametime())
        {
            fm_remove_entity(iEnt)
            return
        }

        new Float:vecAngle[3];
        Stock_Get_Postion(iOwner, 0.0, 0.0, 0.0, fOrigin);

        pev(iOwner, pev_v_angle, vecAngle);
        vecAngle[0] = -vecAngle[0];

        set_pev(iEnt, pev_origin, fOrigin);
        set_pev(iEnt, pev_angles, vecAngle);

        set_pev(iEnt, pev_nextthink, get_gametime() + 0.01)
    }
}
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
zNeks, в этом проблема значит.
 
Сообщения
31
Реакции
-1
fl0wer, в чем именно?
14 Янв 2020
fl0wer, кстати такое происходит не только с этим энтити, но и со всеми другими. Даже с trigger_camera [Не мой плагин]:

Код:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>

/* The info of this plugin */
#define PLUGIN_VERSION "0.7"
#define PLUGIN_TAG "CAM"

/* Just dont touch it */
#define CAMERA_OWNER EV_INT_iuser1
#define CAMERA_CLASSNAME "trigger_camera"
#define CAMERA_MODEL "models/rpgrocket.mdl"

new bool:g_bInThirdPerson[33] = false;
new g_pCvar_fCameraDistance, g_pCvar_iCameraForced;

public plugin_init()
{
    register_plugin("Obscura Cam", PLUGIN_VERSION, "Nani (SkumTomteN@Alliedmodders)")

    register_think(CAMERA_CLASSNAME, "FW_CameraThink")
   
    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled_Post", 1)
    RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
   
    g_pCvar_iCameraForced = register_cvar("cam_forced", "0")
    g_pCvar_fCameraDistance = register_cvar("cam_distance", "150.0")
   
    register_clcmd("say /cam", "CMD_ToggleCam")
    register_clcmd("sayteam /cam", "CMD_ToggleCam")
    register_clcmd("cam", "CMD_ToggleCam")
}

public plugin_precache()
{
    precache_model(CAMERA_MODEL)
}

public plugin_natives()
{
    register_native("set_user_camera", "Native_SetCamera", 1)
    register_native("get_user_camera", "Native_GetCamera", 1)
}

public Native_SetCamera(iPlayer, Thirdperson)
{
    if(!is_user_alive(iPlayer))
        return;
   
    if(!Thirdperson)
    {
        Set_CameraEnt(iPlayer)
    }
    else
    {
        Remove_CameraEnt(iPlayer, 1)
    }
}

public Native_GetCamera(iPlayer)
{
    if(!is_user_connected(iPlayer) || !g_bInThirdPerson[iPlayer])
        return 0;
   
    return 1;
}

public client_disconnected(iPlayer)
{
    Remove_CameraEnt(iPlayer, 0)
}

public fw_PlayerSpawn_Post(iPlayer)
{
    if(!is_user_alive(iPlayer))
        return HAM_IGNORED;
   
    if(g_bInThirdPerson[iPlayer] || get_pcvar_num(g_pCvar_iCameraForced))
    {
        Set_CameraEnt(iPlayer)
    }
    else
    {
        Remove_CameraEnt(iPlayer, 1)
    }
    return HAM_HANDLED;
} 

public fw_PlayerKilled_Post(iVictim, iKiller, iShouldGIB)
{   
    if(!is_user_connected(iVictim) || is_user_alive(iVictim))
        return HAM_IGNORED;
   
    if(g_bInThirdPerson[iVictim])
    {
        Remove_CameraEnt(iVictim, 0)
    }
    return HAM_HANDLED;
}

public CMD_ToggleCam(iPlayer)
{
    if(get_pcvar_num(g_pCvar_iCameraForced))
    {
        client_printc(iPlayer, "!g[%s]!n Camera is forced on !t3rd person!n by server manager!", PLUGIN_TAG)
        return;
    }
    
    g_bInThirdPerson[iPlayer] = ~g_bInThirdPerson[iPlayer]
    
    if(is_user_alive(iPlayer))
    {
        if(g_bInThirdPerson[iPlayer])
        {
            Set_CameraEnt(iPlayer)

            client_print(0, print_center, "3rd Person Mode")
        }
        else 
        {
            Remove_CameraEnt(iPlayer, 1)
            
            client_print(0, print_center, "1st Person Mode")
        }
    }
    else /* He toggles when not alive */
    {
        client_printc(iPlayer, "!g[%s]!n Your camera will be !t%s!n when you spawn!", PLUGIN_TAG, g_bInThirdPerson[iPlayer] ? "3rd Person" : "1st Person")
    }
} 

public Set_CameraEnt(iPlayer)
{
    new iEntity = create_entity(CAMERA_CLASSNAME);
    if(!is_valid_ent(iEntity)) return;

    entity_set_model(iEntity, CAMERA_MODEL)
    entity_set_int(iEntity, CAMERA_OWNER, iPlayer)
    entity_set_string(iEntity, EV_SZ_classname, CAMERA_CLASSNAME)
    entity_set_int(iEntity, EV_INT_solid, SOLID_NOT)
    entity_set_int(iEntity, EV_INT_movetype, MOVETYPE_FLY)
    entity_set_int(iEntity, EV_INT_rendermode, kRenderTransTexture)

    attach_view(iPlayer, iEntity)

    entity_set_float(iEntity, EV_FL_nextthink, get_gametime())
}

public Remove_CameraEnt(iPlayer, AttachView)
{
    if(AttachView) attach_view(iPlayer, iPlayer)

    new iEntity = -1;
    while((iEntity = find_ent_by_class(iEntity, CAMERA_CLASSNAME)))
    {
        if(!is_valid_ent(iEntity))
            continue;
       
        if(entity_get_int(iEntity, CAMERA_OWNER) == iPlayer)
        {
            entity_set_int(iEntity, EV_INT_flags, FL_KILLME)
            dllfunc(DLLFunc_Think, iEntity)
        }
    }
}

public FW_CameraThink(iEntity)
{
    new iOwner = entity_get_int(iEntity, CAMERA_OWNER);
    if(!is_user_alive(iOwner) || is_user_bot(iOwner))
        return;
    if(!is_valid_ent(iEntity))
        return;

    new Float:fPlayerOrigin[3], Float:fCameraOrigin[3], Float:vAngles[3], Float:vBack[3];

    entity_get_vector(iOwner, EV_VEC_origin, fPlayerOrigin)
    entity_get_vector(iOwner, EV_VEC_view_ofs, vAngles)
       
    fPlayerOrigin[2] += vAngles[2];
           
    entity_get_vector(iOwner, EV_VEC_v_angle, vAngles)

    angle_vector(vAngles, ANGLEVECTOR_FORWARD, vBack)

    fCameraOrigin[0] = fPlayerOrigin[0] + (-vBack[0] * get_pcvar_float(g_pCvar_fCameraDistance))
    fCameraOrigin[1] = fPlayerOrigin[1] + (-vBack[1] * get_pcvar_float(g_pCvar_fCameraDistance))
    fCameraOrigin[2] = fPlayerOrigin[2] + (-vBack[2] * get_pcvar_float(g_pCvar_fCameraDistance))

    engfunc(EngFunc_TraceLine, fPlayerOrigin, fCameraOrigin, IGNORE_MONSTERS, iOwner, 0)
   
    new Float:flFraction; get_tr2(0, TR_flFraction, flFraction)
    if(flFraction != 1.0)
    {
        flFraction *= get_pcvar_float(g_pCvar_fCameraDistance); /* Automatic :) */
   
        fCameraOrigin[0] = fPlayerOrigin[0] + (-vBack[0] * flFraction)
        fCameraOrigin[1] = fPlayerOrigin[1] + (-vBack[1] * flFraction)
        fCameraOrigin[2] = fPlayerOrigin[2] + (-vBack[2] * flFraction)
    }
   
    entity_set_vector(iEntity, EV_VEC_origin, fCameraOrigin)
    entity_set_vector(iEntity, EV_VEC_angles, vAngles)

    entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + 0.01)
}
   
stock client_printc(index, const text[], any:...)
{
    static szMsg[128]; vformat(szMsg, sizeof(szMsg) - 1, text, 3)
   
    replace_all(szMsg, sizeof(szMsg) - 1, "!g", "^x04")
    replace_all(szMsg, sizeof(szMsg) - 1, "!n", "^x01")
    replace_all(szMsg, sizeof(szMsg) - 1, "!t", "^x03")
   
    static g_MsgSayText; if(!g_MsgSayText) g_MsgSayText = get_user_msgid("SayText")
    static MaxPlayers; MaxPlayers = get_maxplayers();

    if(!index)
    {
        for(new i = 1; i <= MaxPlayers; i++)
        {
            if(!is_user_connected(i))
                continue;
           
            message_begin(MSG_ONE_UNRELIABLE, g_MsgSayText, _, i);
            write_byte(i);
            write_string(szMsg);
            message_end();   
        }       
    }
    else
    {
        message_begin(MSG_ONE_UNRELIABLE, g_MsgSayText, _, index);
        write_byte(index);
        write_string(szMsg);
        message_end();
    }
}
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
А почему это не должно происходить? Пинг.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
zNeks, ну харашо, задержка.
 
Сообщения
31
Реакции
-1
fl0wer, вот и вопрос: какая причина может быть возникновения задержки?
 
Сообщения
31
Реакции
-1
fl0wer, я создал эту тему, чтобы получить прямой и нормальный ответ на вопрос.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
zNeks, ой ой ой, может тебе ещё прямой и нормальный ответ на вопрос дать?
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Еще кроме пинга влияет то, что задержка между обновлениями стоит 0.01 секунды. Ради теста можно попробовать поставить обновление в следующем кадре (вместо 0.01 установить get_gametime()) и глянуть какой sys_ticrate стоит, потому что в случае с покадровым обновлением плавность будет напрямую влиять от FPS сервера.
 
Последнее редактирование:
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Код:
#pragma semicolon 1

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <reapi>

new const VIEW_MODEL[] = "models/v_ak47.mdl";

new g_iViewEntity = NULLENT;

public plugin_init()
{
    RegisterHookChain(RG_CBasePlayer_Spawn, "@CBasePlayer__Spawn_Post", true);
    RegisterHookChain(RG_CBasePlayer_PreThink, "@CBasePlayer__PreThink_Post", true);
}

public plugin_precache()
{
    precache_model(VIEW_MODEL);
}

@CBasePlayer__Spawn_Post(id)
{
    if (!is_user_alive(id))
        return;

    new entity = rg_create_entity("info_target", true);

    if (!is_nullent(entity))
    {
        g_iViewEntity = entity;

        set_entvar(entity, var_movetype, MOVETYPE_NONE);
        set_entvar(entity, var_solid, SOLID_NOT);

        engfunc(EngFunc_SetModel, entity, VIEW_MODEL);
    }
}

@CBasePlayer__PreThink_Post(id)
{
    if (!is_user_alive(id))
        return;

    new entity = g_iViewEntity;

    if (!is_nullent(entity))
    {
        new Float:vecSrc[3];
        new Float:vecAngles[3];

        ExecuteHam(Ham_Player_GetGunPosition, id, vecSrc);
        get_entvar(id, var_angles, vecAngles);

        engfunc(EngFunc_SetOrigin, entity, vecSrc);
        set_entvar(entity, var_angles, vecAngles);
    }
}
Ок, вот вам код. На локалке (естественно) всё хорошо один в один обновляется, пока не начинаешь идти, начинается рассинхрон.
Не на локалке естественно задержка, задержка проявляется и без ходьбы.
 
Сообщения
31
Реакции
-1
Xelson, sys_ticrate 10000; изменение кадрового обновления не помогло.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу