Спрайт вокруг оружия

Сообщения
67
Реакции
28
Помог
1 раз(а)
Очень не хотелось просить помощи и показывать свои "творения" дабы не позорится, но я никак не могу подружиться с entity, прощу помощи.

Увидел интересную идею в теме Weapons Float Effect, начал пробовать реализовывать и столкнулся с трудностями.
ID armoury_entity на спавне отличается от id, которого касается игрок через различные хуки touch'a и от id entity при использовании AddPlayerItem.
При различных попытках (коих было с десяток) всегда были какие-то проблемы, то спрайт спавнился, но не удалялся при поднятии оружия, то он спавнился в слишком большом количестве и накладывался на предыдущий спрайт и т.д. Единственное, что я придумал и что более менее работает это при спавне спрайта записывать координаты в виде ключа и ID entity спрайта в trie массив для последующего удаления при поднятии оружия, я понимаю, что реализация плохая, но я уже отчаялся.
Помогите светлые умы (скриптеры) не вывожу.

P.S. файл .spr прикрепить нельзя, но если что можно скачать тут (спасибо MayroN)

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

#pragma semicolon 1

new const sprite[] = "sprites/Ring.spr";

new const Float:WEAPON_HEIGHT = 30.0;
new const Float:WEAPON_MINS[3] = { -8.0, -8.0, -8.0 };
new const Float:WEAPON_MAXS[3] = { 8.0, 8.0, 8.0 };

new const BAD_MODEL_ANGLE = (1<<CSW_MP5NAVY) | (1<<CSW_MAC10) | (1<<CSW_XM1014);
new const HORIZONTAL_ANGLE[MAX_WEAPONS + 1] =
{
    0, // WEAPON_NONE
    -61, // WEAPON_P228
    0, // WEAPON_GLOCK
    -68, // WEAPON_SCOUT
    0, // WEAPON_HEGRENADE
    -187, // WEAPON_XM1014
    90, // WEAPON_C4
    90, // WEAPON_MAC10
    -119, // WEAPON_AUG
    0, // WEAPON_SMOKEGRENADE
    -87, // WEAPON_ELITE
    -51, // WEAPON_FIVESEVEN
    -67, // WEAPON_UMP45
    -115, // WEAPON_SG550
    16, // WEAPON_GALIL
    -28, // WEAPON_FAMAS
    -63, // WEAPON_USP
    -107, // WEAPON_GLOCK18
    -107, // WEAPON_AWP
    -172, // WEAPON_MP5N
    -95, // WEAPON_M249
    -123, // WEAPON_M3
    -58, // WEAPON_M4A1
    -132, // WEAPON_TMP
    -107, // WEAPON_G3SG1
    0, // WEAPON_FLASHBANG
    -107, // WEAPON_DEAGLE
    -129, // WEAPON_SG552
    -103, // WEAPON_AK47
    0, // WEAPON_KNIFE
    -124, // WEAPON_P90
};

new const ARMOURY_MAPPER[MAX_WEAPONS + 1] = { CSW_MP5NAVY, CSW_TMP, CSW_P90,
    CSW_MAC10, CSW_AK47, CSW_SG552, CSW_M4A1, CSW_AUG, CSW_SCOUT, CSW_G3SG1, CSW_AWP,
    CSW_M3, CSW_XM1014, CSW_M249, CSW_FLASHBANG, CSW_HEGRENADE, CSW_VEST, CSW_VESTHELM,
    CSW_SMOKEGRENADE, CSW_SHIELDGUN, CSW_FAMAS, CSW_SG550, CSW_GALIL, CSW_UMP45,
    CSW_GLOCK18, CSW_USP, CSW_ELITE, CSW_FIVESEVEN, CSW_P228, CSW_DEAGLE, };

enum
{
    WEAPONSTATE_DEFAULT,
    WEAPONSTATE_CALCULATIONS,
    WEAPONSTATE_FADEIN,
}

const PRIMARY_WEAPONS_BIT_SUM =
(
    (1<<_:WEAPON_SCOUT)|(1<<_:WEAPON_XM1014)|(1<<_:WEAPON_MAC10)|(1<<_:WEAPON_AUG)|(1<<_:WEAPON_UMP45)|(1<<_:WEAPON_SG550)
    |(1<<_:WEAPON_GALIL)|(1<<_:WEAPON_FAMAS)|(1<<_:WEAPON_AWP)|(1<<_:WEAPON_MP5N)|(1<<_:WEAPON_M249)|(1<<_:WEAPON_M3)
    |(1<<_:WEAPON_M4A1)|(1<<_:WEAPON_TMP)|(1<<_:WEAPON_G3SG1)|(1<<_:WEAPON_SG552)|(1<<_:WEAPON_AK47)|(1<<_:WEAPON_P90)
);

#define IsPrimaryWeaponID(%1)         (PRIMARY_WEAPONS_BIT_SUM & (1 << any:%1))

new Trie:g_TrieTest;

public plugin_precache()
{
    g_TrieTest = TrieCreate();

    register_plugin("Weapons Float Effect (Like in GTA: SA)", "1.0.0", "fl0wer");

    RegisterHam(Ham_Spawn, "armoury_entity", "@CArmoury_Spawn_Post", true);
    RegisterHam(Ham_CS_Restart, "armoury_entity", "@CArmoury_Restart_Post", true);
    RegisterHam(Ham_SetObjectCollisionBox, "armoury_entity", "@CArmoury_SetObjectCollisionBox_Pre", false);

    precache_model(sprite);
}

public plugin_init()
{
    RegisterHookChain(RG_CWeaponBox_SetModel, "@CWeaponBox_SetModel_Post", true);

    RegisterHam(Ham_Think, "weaponbox", "@CWeaponBox_Think_Pre", false);
    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Pre", false);
    RegisterHam(Ham_SetObjectCollisionBox, "weaponbox", "@CWeaponBox_SetObjectCollisionBox_Pre", false);

    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Post", true);
    RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "@CBasePlayer_AddPlayerItem", false);

    // Для дебага, не тыкайте носом!!!
    register_clcmd("respawn_weapons", "ClCmd_RespawnWeapons");
    register_clcmd("delete_weapons", "ClCmd_DeleteWeapons");
}
public ClCmd_DeleteWeapons(iPlayer)
{
    new iWeaponEntity;

    while((iWeaponEntity = rg_find_ent_by_class(iWeaponEntity, "armoury_entity")))
    {
        if(is_entity(iWeaponEntity))
        {
            RemoveSpriteEntity(iWeaponEntity);
        }
        else continue;
    }
}
public ClCmd_RespawnWeapons(iPlayer)
{
    new iEntity;

    while((iEntity = rg_find_ent_by_class(iEntity, "armoury_entity")))
    {
        if(is_entity(iEntity))
        {
            ExecuteHam(Ham_CS_Restart, iEntity);
            ExecuteHam(Ham_Spawn, iEntity);
            @CArmoury_Spawn_Post(iEntity);
        }
        else continue;
    }
}

@CWeaponBox_SetModel_Post(iEntity, model[])
{
    if (rg_get_weaponbox_id(iEntity) == WEAPON_NONE)
        return;

    set_entvar(iEntity, var_iuser1, WEAPONSTATE_CALCULATIONS);
    set_entvar(iEntity, var_gravity, 2.0);
    set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) | EF_NODRAW);
    set_entvar(iEntity, var_fuser1, Float:get_entvar(iEntity, var_nextthink));
    set_entvar(iEntity, var_nextthink, get_gametime() + 0.3);
}

@CWeaponBox_Think_Pre(iEntity)
{
    switch (get_entvar(iEntity, var_iuser1))
    {
        case WEAPONSTATE_CALCULATIONS:
        {
            set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);

            if (~get_entvar(iEntity, var_flags) & FL_ONGROUND)
                return HAM_SUPERCEDE;

            new weaponId = any:rg_get_weaponbox_id(iEntity);
            new Float:vecOrigin[3];
            new Float:vecAngles[3];

            get_entvar(iEntity, var_origin, vecOrigin);
            get_entvar(iEntity, var_angles, vecAngles);

            vecOrigin[2] += WEAPON_HEIGHT;

            vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);
            vecAngles[1] += 90.0;
            vecAngles[2] = 90.0;

            // Flip Models with Wrong Angle
            if ((1<<weaponId) & BAD_MODEL_ANGLE)
                vecAngles[1] += 180.0;

            set_entvar(iEntity, var_iuser1, WEAPONSTATE_FADEIN);
            set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) & ~EF_NODRAW);
            set_entvar(iEntity, var_rendermode, kRenderTransTexture);

            SetFloatEffect(iEntity, vecOrigin, vecAngles);
            
            CreateEntity(iEntity);

            return HAM_SUPERCEDE;
        }
        case WEAPONSTATE_FADEIN: // Fade in
        {
            new Float:renderamt = Float:get_entvar(iEntity, var_renderamt);

            if (renderamt >= 255.0)
            {
                set_entvar(iEntity, var_iuser1, WEAPONSTATE_DEFAULT);
                set_entvar(iEntity, var_nextthink, get_entvar(iEntity, var_fuser1));
            }
            else
            {
                set_entvar(iEntity, var_renderamt, floatmin(renderamt + 64.0, 255.0));
                set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);
            }

            return HAM_SUPERCEDE;
        }
    }
    return HAM_IGNORED;
}

@CWeaponBox_Touch_Pre(iEntity, other)
{
    if (get_entvar(iEntity, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    // Allow weapon boxes to pick up
    set_entvar(iEntity, var_flags, get_entvar(iEntity, var_flags) | FL_ONGROUND);
}

@CWeaponBox_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

@CArmoury_Spawn_Post(iEntity)
{
    new weaponId = ARMOURY_MAPPER[get_member(iEntity, m_Armoury_iItem)];
    new Float:vecOrigin[3];
    new Float:vecAngles[3];

    engfunc(EngFunc_DropToFloor, iEntity);

    get_entvar(iEntity, var_origin, vecOrigin);
    get_entvar(iEntity, var_angles, vecAngles);

    vecOrigin[2] += WEAPON_HEIGHT;

    if ((1<<weaponId) & ((1<<CSW_VEST) | (1<<CSW_VESTHELM)))
        vecAngles[0] = -90.0;
    else
    {
        vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);

        // Flip Models with Wrong Angle
        if ((1<<weaponId) & BAD_MODEL_ANGLE)
            vecAngles[1] += 180.0;
    }

    vecAngles[1] += 90.0;
    vecAngles[2] = 90.0;

    SetFloatEffect(iEntity, vecOrigin, vecAngles);

    CreateEntity(iEntity);
}

@CArmoury_Restart_Post(iEntity)
{
    if(get_entvar(iEntity, var_effects) & EF_NODRAW)
        return;

    new Float:vecOrigin[3];
    get_entvar(iEntity, var_origin, vecOrigin);

    vecOrigin[2] += WEAPON_HEIGHT;

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CArmoury_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

SetObjectCollisionBox(iEntity)
{
    new Float:vecOrigin[3];
    new Float:vecAbsMin[3];
    new Float:vecAbsMax[3];

    get_entvar(iEntity, var_origin, vecOrigin);

    for (new i = 0; i < 3; i++)
    {
        vecAbsMin[i] = vecOrigin[i] + WEAPON_MINS[i];
        vecAbsMax[i] = vecOrigin[i] + WEAPON_MAXS[i];
    }

    set_entvar(iEntity, var_absmin, vecAbsMin);
    set_entvar(iEntity, var_absmax, vecAbsMax);
}

SetFloatEffect(iEntity, Float:vecOrigin[3], Float:vecAngles[3])
{
    set_entvar(iEntity, var_angles, vecAngles);
    set_entvar(iEntity, var_avelocity, Float:{ 0.0, -90.0, 0.0 });

    // Allow rotation by physics calls
    set_entvar(iEntity, var_gravity, 0.000000001);
    set_entvar(iEntity, var_velocity, Float:{ 0.0, 0.0, 0.000000001 });

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CWeaponBox_Touch_Post(id, other)
{
    if(get_entvar(id, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    if(is_entity(id) && is_entity(other) && !is_user_alive(id))
        return;

    RemoveSpriteByOrigin(id);
}


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@CBasePlayer_AddPlayerItem(iPlayer, iEntity)
{
    new szWeapon[32];
    get_entvar(iEntity, var_classname, szWeapon, charsmax(szWeapon));

    if(equal(szWeapon, "weapon_knife"))
        return;

    RemoveSpriteByOrigin(iEntity);
}

public CreateEntity(iWeaponEnt)
{
    if(get_entvar(iWeaponEnt, var_iuser2))
        return 0;
    
    new iSprEntity = rg_create_entity("env_sprite");

    if (!iSprEntity)
    {
        log_error(AMX_ERR_NATIVE, "Failed to create sprite entity");
        return 0;
    }

    new Float:flOrigin[3];
    get_entvar(iWeaponEnt, var_origin, flOrigin);

    set_entvar(iWeaponEnt, var_iuser2, iSprEntity);
    set_entvar(iSprEntity, var_vuser1, flOrigin);
    entity_set_model(iSprEntity, sprite);
    entity_set_origin(iSprEntity, flOrigin);
    entity_set_float(iSprEntity, EV_FL_scale, 0.65);

    //entity_set_int(iSprEntity, EV_INT_rendermode, kRenderTransAdd);
    //entity_set_float(iSprEntity, EV_FL_renderamt, 50.0);
    entity_set_vector(iSprEntity, EV_VEC_rendercolor, Float:{175.0, 75.0, 0.0});
    
    new szKey[64];

    formatex(szKey, charsmax(szKey), "%f %f %f", flOrigin[0], flOrigin[1], flOrigin[2]);

    TrieSetCell(g_TrieTest, szKey, iSprEntity);

    return 1;
}

public RemoveSpriteByOrigin(iEntity)
{
    new Float:flOrigin[3];
    get_entvar(iEntity, var_origin, flOrigin);

    new iSprite;

    while((iSprite = find_ent_in_sphere(iSprite, flOrigin, 0.5)))// (iEntity "armoury_entity")))
    {
        new Float:flOriginSprite[3];
        get_entvar(iSprite, var_origin, flOriginSprite);

        new szKey[64];
        formatex(szKey, charsmax(szKey), "%f %f %f", flOriginSprite[0], flOriginSprite[1], flOriginSprite[2]);

        if(TrieKeyExists(g_TrieTest, szKey))
        {
            TrieGetCell(g_TrieTest, szKey, iSprite);

            if(iSprite)
            {
                set_entvar(iSprite, var_iuser2, 0);
                remove_entity(iSprite);
            }
            else continue;
        }
        else continue;
    }

    
}
public RemoveSpriteEntity(iWeaponEntity)
{
    new iSpriteEntity = get_entvar(iWeaponEntity, var_iuser2);
    
    if(!is_valid_ent(iSpriteEntity))
    {
        return;
    }

    set_entvar(iWeaponEntity, var_iuser2, 0);

    remove_entity(iSpriteEntity);
}

public plugin_end()
{
    TrieDestroy(g_TrieTest);
}
 
Сообщения
1,618
Реакции
1,651
unreal fart,
Там я нашёл где-то второе кольцо
На мой взгляд мне приглянулось получше

Я поставил именно на тёмные карты его + рендер модели
И оно выглядит вот так

Сделаешь что-то вроде этого + покрасишь кодом само кольцо в нужные цвета

Код:
if(map_type == 2) /// ну там свой список тёмных карт
{
     if(iFrame == 1) // второй фрейм кольца у спрайте
     {
         set_ent_rendering(iBombEntity, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 125); // рендер твоего обьекта
     }
}
1.jpg2.jpg3.jpg
 

Download all Attachments

Сообщения
67
Реакции
28
Помог
1 раз(а)
MayroN, выглядит пушечно, вечером попробую этот спрайт поставить, спасибо!
Но у меня основная проблема в энтити, не получается ее правильно удалять в нужные моменты
 
Сообщения
294
Реакции
143
Помог
15 раз(а)
unreal fart, пробуй :

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

#pragma semicolon 1

new const sprite[] = "sprites/Ring.spr";

new const Float:WEAPON_HEIGHT = 30.0;
new const Float:WEAPON_MINS[3] = { -8.0, -8.0, -8.0 };
new const Float:WEAPON_MAXS[3] = { 8.0, 8.0, 8.0 };

new const BAD_MODEL_ANGLE = (1<<CSW_MP5NAVY) | (1<<CSW_MAC10) | (1<<CSW_XM1014);
new const HORIZONTAL_ANGLE[MAX_WEAPONS + 1] =
{
    0, // WEAPON_NONE
    -61, // WEAPON_P228
    0, // WEAPON_GLOCK
    -68, // WEAPON_SCOUT
    0, // WEAPON_HEGRENADE
    -187, // WEAPON_XM1014
    90, // WEAPON_C4
    90, // WEAPON_MAC10
    -119, // WEAPON_AUG
    0, // WEAPON_SMOKEGRENADE
    -87, // WEAPON_ELITE
    -51, // WEAPON_FIVESEVEN
    -67, // WEAPON_UMP45
    -115, // WEAPON_SG550
    16, // WEAPON_GALIL
    -28, // WEAPON_FAMAS
    -63, // WEAPON_USP
    -107, // WEAPON_GLOCK18
    -107, // WEAPON_AWP
    -172, // WEAPON_MP5N
    -95, // WEAPON_M249
    -123, // WEAPON_M3
    -58, // WEAPON_M4A1
    -132, // WEAPON_TMP
    -107, // WEAPON_G3SG1
    0, // WEAPON_FLASHBANG
    -107, // WEAPON_DEAGLE
    -129, // WEAPON_SG552
    -103, // WEAPON_AK47
    0, // WEAPON_KNIFE
    -124, // WEAPON_P90
};

new const ARMOURY_MAPPER[MAX_WEAPONS + 1] = { CSW_MP5NAVY, CSW_TMP, CSW_P90,
    CSW_MAC10, CSW_AK47, CSW_SG552, CSW_M4A1, CSW_AUG, CSW_SCOUT, CSW_G3SG1, CSW_AWP,
    CSW_M3, CSW_XM1014, CSW_M249, CSW_FLASHBANG, CSW_HEGRENADE, CSW_VEST, CSW_VESTHELM,
    CSW_SMOKEGRENADE, CSW_SHIELDGUN, CSW_FAMAS, CSW_SG550, CSW_GALIL, CSW_UMP45,
    CSW_GLOCK18, CSW_USP, CSW_ELITE, CSW_FIVESEVEN, CSW_P228, CSW_DEAGLE, };

enum
{
    WEAPONSTATE_DEFAULT,
    WEAPONSTATE_CALCULATIONS,
    WEAPONSTATE_FADEIN,
}

const PRIMARY_WEAPONS_BIT_SUM =
(
    (1<<_:WEAPON_SCOUT)|(1<<_:WEAPON_XM1014)|(1<<_:WEAPON_MAC10)|(1<<_:WEAPON_AUG)|(1<<_:WEAPON_UMP45)|(1<<_:WEAPON_SG550)
    |(1<<_:WEAPON_GALIL)|(1<<_:WEAPON_FAMAS)|(1<<_:WEAPON_AWP)|(1<<_:WEAPON_MP5N)|(1<<_:WEAPON_M249)|(1<<_:WEAPON_M3)
    |(1<<_:WEAPON_M4A1)|(1<<_:WEAPON_TMP)|(1<<_:WEAPON_G3SG1)|(1<<_:WEAPON_SG552)|(1<<_:WEAPON_AK47)|(1<<_:WEAPON_P90)
);

#define IsPrimaryWeaponID(%1)         (PRIMARY_WEAPONS_BIT_SUM & (1 << any:%1))

public plugin_precache()
{
    register_plugin("Weapons Float Effect (Like in GTA: SA)", "1.0.0", "fl0wer");

    RegisterHam(Ham_Spawn, "armoury_entity", "@CArmoury_Spawn_Post", true);
    RegisterHam(Ham_CS_Restart, "armoury_entity", "@CArmoury_Restart_Post", true);
    RegisterHam(Ham_SetObjectCollisionBox, "armoury_entity", "@CArmoury_SetObjectCollisionBox_Pre", false);

    precache_model(sprite);
}

public plugin_init()
{
    RegisterHookChain(RG_CWeaponBox_SetModel, "@CWeaponBox_SetModel_Post", true);

    RegisterHam(Ham_Think, "weaponbox", "@CWeaponBox_Think_Pre", false);
    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Pre", false);
    RegisterHam(Ham_SetObjectCollisionBox, "weaponbox", "@CWeaponBox_SetObjectCollisionBox_Pre", false);

    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Post", true);
    RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "@CBasePlayer_AddPlayerItem", false);
}

@CWeaponBox_SetModel_Post(iEntity, model[])
{
    if (rg_get_weaponbox_id(iEntity) == WEAPON_NONE)
        return;

    set_entvar(iEntity, var_iuser1, WEAPONSTATE_CALCULATIONS);
    set_entvar(iEntity, var_gravity, 2.0);
    set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) | EF_NODRAW);
    set_entvar(iEntity, var_fuser1, Float:get_entvar(iEntity, var_nextthink));
    set_entvar(iEntity, var_nextthink, get_gametime() + 0.3);
}

@CWeaponBox_Think_Pre(iEntity)
{
    switch (get_entvar(iEntity, var_iuser1))
    {
        case WEAPONSTATE_CALCULATIONS:
        {
            set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);

            if (~get_entvar(iEntity, var_flags) & FL_ONGROUND)
                return HAM_SUPERCEDE;

            new weaponId = any:rg_get_weaponbox_id(iEntity);
            new Float:vecOrigin[3];
            new Float:vecAngles[3];

            get_entvar(iEntity, var_origin, vecOrigin);
            get_entvar(iEntity, var_angles, vecAngles);

            vecOrigin[2] += WEAPON_HEIGHT;

            vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);
            vecAngles[1] += 90.0;
            vecAngles[2] = 90.0;

            // Flip Models with Wrong Angle
            if ((1<<weaponId) & BAD_MODEL_ANGLE)
                vecAngles[1] += 180.0;

            set_entvar(iEntity, var_iuser1, WEAPONSTATE_FADEIN);
            set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) & ~EF_NODRAW);
            set_entvar(iEntity, var_rendermode, kRenderTransTexture);

            SetFloatEffect(iEntity, vecOrigin, vecAngles);
            
            @CreateEntity(iEntity);

            return HAM_SUPERCEDE;
        }
        case WEAPONSTATE_FADEIN: // Fade in
        {
            new Float:renderamt = Float:get_entvar(iEntity, var_renderamt);

            if (renderamt >= 255.0)
            {
                set_entvar(iEntity, var_iuser1, WEAPONSTATE_DEFAULT);
                set_entvar(iEntity, var_nextthink, get_entvar(iEntity, var_fuser1));
            }
            else
            {
                set_entvar(iEntity, var_renderamt, floatmin(renderamt + 64.0, 255.0));
                set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);
            }

            return HAM_SUPERCEDE;
        }
    }
    return HAM_IGNORED;
}

@CWeaponBox_Touch_Pre(iEntity, other)
{
    if (get_entvar(iEntity, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    // Allow weapon boxes to pick up
    set_entvar(iEntity, var_flags, get_entvar(iEntity, var_flags) | FL_ONGROUND);
}

@CWeaponBox_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

@CArmoury_Spawn_Post(iEntity)
{
    new weaponId = ARMOURY_MAPPER[get_member(iEntity, m_Armoury_iItem)];
    new Float:vecOrigin[3];
    new Float:vecAngles[3];

    engfunc(EngFunc_DropToFloor, iEntity);

    get_entvar(iEntity, var_origin, vecOrigin);
    get_entvar(iEntity, var_angles, vecAngles);

    vecOrigin[2] += WEAPON_HEIGHT;

    if ((1<<weaponId) & ((1<<CSW_VEST) | (1<<CSW_VESTHELM)))
        vecAngles[0] = -90.0;
    else
    {
        vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);

        // Flip Models with Wrong Angle
        if ((1<<weaponId) & BAD_MODEL_ANGLE)
            vecAngles[1] += 180.0;
    }

    vecAngles[1] += 90.0;
    vecAngles[2] = 90.0;

    SetFloatEffect(iEntity, vecOrigin, vecAngles);

    @CreateEntity(iEntity);
}

@CArmoury_Restart_Post(iEntity)
{
    if(get_entvar(iEntity, var_effects) & EF_NODRAW)
        return;

    new Float:vecOrigin[3];
    get_entvar(iEntity, var_origin, vecOrigin);

    vecOrigin[2] += WEAPON_HEIGHT;

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CArmoury_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

SetObjectCollisionBox(iEntity)
{
    new Float:vecOrigin[3];
    new Float:vecAbsMin[3];
    new Float:vecAbsMax[3];

    get_entvar(iEntity, var_origin, vecOrigin);

    for (new i = 0; i < 3; i++)
    {
        vecAbsMin[i] = vecOrigin[i] + WEAPON_MINS[i];
        vecAbsMax[i] = vecOrigin[i] + WEAPON_MAXS[i];
    }

    set_entvar(iEntity, var_absmin, vecAbsMin);
    set_entvar(iEntity, var_absmax, vecAbsMax);
}

SetFloatEffect(iEntity, Float:vecOrigin[3], Float:vecAngles[3])
{
    set_entvar(iEntity, var_angles, vecAngles);
    set_entvar(iEntity, var_avelocity, Float:{ 0.0, -90.0, 0.0 });

    // Allow rotation by physics calls
    set_entvar(iEntity, var_gravity, 0.000000001);
    set_entvar(iEntity, var_velocity, Float:{ 0.0, 0.0, 0.000000001 });

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CWeaponBox_Touch_Post(id, other)
{
    if(get_entvar(id, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    if(is_entity(id) && is_entity(other) && !is_user_alive(id))
        return;
}


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@CBasePlayer_AddPlayerItem(iPlayer, iEntity)
{
    new szWeapon[32];
    get_entvar(iEntity, var_classname, szWeapon, charsmax(szWeapon));

    if(equal(szWeapon, "weapon_knife"))
        return;
}

@CreateEntity(iWeaponEnt)
{
    if(get_entvar(iWeaponEnt, var_iuser2))
       return;
    
    new iSprEntity = rg_create_entity("env_sprite");

    if(is_nullent(iSprEntity))
        return;

    new Float:flOrigin[3];
    get_entvar(iWeaponEnt, var_origin, flOrigin);
    
    set_entvar(iWeaponEnt, var_iuser2, iSprEntity);
    set_entvar(iSprEntity, var_owner, iWeaponEnt);
    set_entvar(iSprEntity, var_origin, flOrigin);
    set_entvar(iSprEntity, var_scale, 0.65);
    engfunc(EngFunc_SetModel, iSprEntity, sprite);

    //set_entvar(iSprEntity, var_rendermode, kRenderTransAdd);
    //set_entvar(iSprEntity, var_renderamt, 50.0);
    set_entvar(iSprEntity, var_rendercolor, Float:{175.0, 75.0, 0.0});
    
    SetThink(iSprEntity, "@Sprite_Think");
    set_entvar(iSprEntity, var_nextthink, get_gametime() + 0.2);
    
    return;
}

@Sprite_Think(const iEnt) {
    if(is_nullent(get_entvar(iEnt, var_owner))) {
        set_entvar(iEnt, var_flags, FL_KILLME);
        return;
    }
    set_entvar(iEnt, var_nextthink, get_gametime() + 0.2);
}
 
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
Код:
// ReGameDLL feature, hack to be able to use CBaseEntity::OnDestroy() (by s1lent)
const Ham:Ham_OnDestroy = Ham_StopSneaking;
Я не уверен что подойдёт, но можно почитать регейм/попробовать
 
Сообщения
67
Реакции
28
Помог
1 раз(а)
murlemur, вечером попробую, спасибо!
11 Апр 2025
BlackSignature, пока что ничего особо не нашел об этом. Можешь описать как ты видишь использование этой функции со своей стороны? А я пока что еще поищу инфу
 
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
unreal fart,

Код:
#include amxmodx
#include hamsandwich

// ReGameDLL feature, hack to be able to use CBaseEntity::OnDestroy() (by s1lent)
const Ham:Ham_OnDestroy = Ham_StopSneaking;

public plugin_init() {
    RegisterHam(Ham_OnDestroy, "weaponbox", "OnDestroy_Pre")
}

public OnDestroy_Pre(pEnt) {
    server_print("Destroy %i", pEnt)
}
Для weaponbox ("контейнер" оружия брошенного игроком) должно работать, по идее. Т.е. покроет как подбор "контейнера", так и его удаление (staytime/newround).
 
Сообщения
95
Реакции
7
Предупреждения
5
unreal fart,

Код:
#include amxmodx
#include hamsandwich

// ReGameDLL feature, hack to be able to use CBaseEntity::OnDestroy() (by s1lent)
const Ham:Ham_OnDestroy = Ham_StopSneaking;

public plugin_init() {
    RegisterHam(Ham_OnDestroy, "weaponbox", "OnDestroy_Pre")
}

public OnDestroy_Pre(pEnt) {
    server_print("Destroy %i", pEnt)
}
Для weaponbox ("контейнер" оружия брошенного игроком) должно работать, по идее. Т.е. покроет как подбор "контейнера", так и его удаление (staytime/newround).
Здравствуйте, я пытался добавить эту функцию, но не смог. Не могли бы вы это добавить?

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

#pragma semicolon 1

new const sprite[] = "sprites/Ring.spr";

new const Float:WEAPON_HEIGHT = 30.0;
new const Float:WEAPON_MINS[3] = { -8.0, -8.0, -8.0 };
new const Float:WEAPON_MAXS[3] = { 8.0, 8.0, 8.0 };

new const BAD_MODEL_ANGLE = (1<<CSW_MP5NAVY) | (1<<CSW_MAC10) | (1<<CSW_XM1014);
new const HORIZONTAL_ANGLE[MAX_WEAPONS + 1] =
{
    0, // WEAPON_NONE
    -61, // WEAPON_P228
    0, // WEAPON_GLOCK
    -68, // WEAPON_SCOUT
    0, // WEAPON_HEGRENADE
    -187, // WEAPON_XM1014
    90, // WEAPON_C4
    90, // WEAPON_MAC10
    -119, // WEAPON_AUG
    0, // WEAPON_SMOKEGRENADE
    -87, // WEAPON_ELITE
    -51, // WEAPON_FIVESEVEN
    -67, // WEAPON_UMP45
    -115, // WEAPON_SG550
    16, // WEAPON_GALIL
    -28, // WEAPON_FAMAS
    -63, // WEAPON_USP
    -107, // WEAPON_GLOCK18
    -107, // WEAPON_AWP
    -172, // WEAPON_MP5N
    -95, // WEAPON_M249
    -123, // WEAPON_M3
    -58, // WEAPON_M4A1
    -132, // WEAPON_TMP
    -107, // WEAPON_G3SG1
    0, // WEAPON_FLASHBANG
    -107, // WEAPON_DEAGLE
    -129, // WEAPON_SG552
    -103, // WEAPON_AK47
    0, // WEAPON_KNIFE
    -124, // WEAPON_P90
};

new const ARMOURY_MAPPER[MAX_WEAPONS + 1] = { CSW_MP5NAVY, CSW_TMP, CSW_P90,
    CSW_MAC10, CSW_AK47, CSW_SG552, CSW_M4A1, CSW_AUG, CSW_SCOUT, CSW_G3SG1, CSW_AWP,
    CSW_M3, CSW_XM1014, CSW_M249, CSW_FLASHBANG, CSW_HEGRENADE, CSW_VEST, CSW_VESTHELM,
    CSW_SMOKEGRENADE, CSW_SHIELDGUN, CSW_FAMAS, CSW_SG550, CSW_GALIL, CSW_UMP45,
    CSW_GLOCK18, CSW_USP, CSW_ELITE, CSW_FIVESEVEN, CSW_P228, CSW_DEAGLE, };

enum
{
    WEAPONSTATE_DEFAULT,
    WEAPONSTATE_CALCULATIONS,
    WEAPONSTATE_FADEIN,
}

const PRIMARY_WEAPONS_BIT_SUM =
(
    (1<<_:WEAPON_SCOUT)|(1<<_:WEAPON_XM1014)|(1<<_:WEAPON_MAC10)|(1<<_:WEAPON_AUG)|(1<<_:WEAPON_UMP45)|(1<<_:WEAPON_SG550)
    |(1<<_:WEAPON_GALIL)|(1<<_:WEAPON_FAMAS)|(1<<_:WEAPON_AWP)|(1<<_:WEAPON_MP5N)|(1<<_:WEAPON_M249)|(1<<_:WEAPON_M3)
    |(1<<_:WEAPON_M4A1)|(1<<_:WEAPON_TMP)|(1<<_:WEAPON_G3SG1)|(1<<_:WEAPON_SG552)|(1<<_:WEAPON_AK47)|(1<<_:WEAPON_P90)
);

#define IsPrimaryWeaponID(%1)         (PRIMARY_WEAPONS_BIT_SUM & (1 << any:%1))

public plugin_precache()
{
    register_plugin("Weapons Float Effect (Like in GTA: SA)", "1.0.0", "fl0wer");

    RegisterHam(Ham_Spawn, "armoury_entity", "@CArmoury_Spawn_Post", true);
    RegisterHam(Ham_CS_Restart, "armoury_entity", "@CArmoury_Restart_Post", true);
    RegisterHam(Ham_SetObjectCollisionBox, "armoury_entity", "@CArmoury_SetObjectCollisionBox_Pre", false);

    precache_model(sprite);
}

public plugin_init()
{
    RegisterHookChain(RG_CWeaponBox_SetModel, "@CWeaponBox_SetModel_Post", true);

    RegisterHam(Ham_Think, "weaponbox", "@CWeaponBox_Think_Pre", false);
    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Pre", false);
    RegisterHam(Ham_SetObjectCollisionBox, "weaponbox", "@CWeaponBox_SetObjectCollisionBox_Pre", false);

    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Post", true);
    RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "@CBasePlayer_AddPlayerItem", false);
}

@CWeaponBox_SetModel_Post(iEntity, model[])
{
    if (rg_get_weaponbox_id(iEntity) == WEAPON_NONE)
        return;

    set_entvar(iEntity, var_iuser1, WEAPONSTATE_CALCULATIONS);
    set_entvar(iEntity, var_gravity, 2.0);
    set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) | EF_NODRAW);
    set_entvar(iEntity, var_fuser1, Float:get_entvar(iEntity, var_nextthink));
    set_entvar(iEntity, var_nextthink, get_gametime() + 0.3);
}

@CWeaponBox_Think_Pre(iEntity)
{
    switch (get_entvar(iEntity, var_iuser1))
    {
        case WEAPONSTATE_CALCULATIONS:
        {
            set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);

            if (~get_entvar(iEntity, var_flags) & FL_ONGROUND)
                return HAM_SUPERCEDE;

            new weaponId = any:rg_get_weaponbox_id(iEntity);
            new Float:vecOrigin[3];
            new Float:vecAngles[3];

            get_entvar(iEntity, var_origin, vecOrigin);
            get_entvar(iEntity, var_angles, vecAngles);

            vecOrigin[2] += WEAPON_HEIGHT;

            vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);
            vecAngles[1] += 90.0;
            vecAngles[2] = 90.0;

            // Flip Models with Wrong Angle
            if ((1<<weaponId) & BAD_MODEL_ANGLE)
                vecAngles[1] += 180.0;

            set_entvar(iEntity, var_iuser1, WEAPONSTATE_FADEIN);
            set_entvar(iEntity, var_effects, get_entvar(iEntity, var_effects) & ~EF_NODRAW);
            set_entvar(iEntity, var_rendermode, kRenderTransTexture);

            SetFloatEffect(iEntity, vecOrigin, vecAngles);
            
            @CreateEntity(iEntity);

            return HAM_SUPERCEDE;
        }
        case WEAPONSTATE_FADEIN: // Fade in
        {
            new Float:renderamt = Float:get_entvar(iEntity, var_renderamt);

            if (renderamt >= 255.0)
            {
                set_entvar(iEntity, var_iuser1, WEAPONSTATE_DEFAULT);
                set_entvar(iEntity, var_nextthink, get_entvar(iEntity, var_fuser1));
            }
            else
            {
                set_entvar(iEntity, var_renderamt, floatmin(renderamt + 64.0, 255.0));
                set_entvar(iEntity, var_nextthink, get_gametime() + 0.1);
            }

            return HAM_SUPERCEDE;
        }
    }
    return HAM_IGNORED;
}

@CWeaponBox_Touch_Pre(iEntity, other)
{
    if (get_entvar(iEntity, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    // Allow weapon boxes to pick up
    set_entvar(iEntity, var_flags, get_entvar(iEntity, var_flags) | FL_ONGROUND);
}

@CWeaponBox_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

@CArmoury_Spawn_Post(iEntity)
{
    new weaponId = ARMOURY_MAPPER[get_member(iEntity, m_Armoury_iItem)];
    new Float:vecOrigin[3];
    new Float:vecAngles[3];

    engfunc(EngFunc_DropToFloor, iEntity);

    get_entvar(iEntity, var_origin, vecOrigin);
    get_entvar(iEntity, var_angles, vecAngles);

    vecOrigin[2] += WEAPON_HEIGHT;

    if ((1<<weaponId) & ((1<<CSW_VEST) | (1<<CSW_VESTHELM)))
        vecAngles[0] = -90.0;
    else
    {
        vecAngles[0] = float(HORIZONTAL_ANGLE[weaponId]);

        // Flip Models with Wrong Angle
        if ((1<<weaponId) & BAD_MODEL_ANGLE)
            vecAngles[1] += 180.0;
    }

    vecAngles[1] += 90.0;
    vecAngles[2] = 90.0;

    SetFloatEffect(iEntity, vecOrigin, vecAngles);

    @CreateEntity(iEntity);
}

@CArmoury_Restart_Post(iEntity)
{
    if(get_entvar(iEntity, var_effects) & EF_NODRAW)
        return;

    new Float:vecOrigin[3];
    get_entvar(iEntity, var_origin, vecOrigin);

    vecOrigin[2] += WEAPON_HEIGHT;

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CArmoury_SetObjectCollisionBox_Pre(iEntity)
{
    SetObjectCollisionBox(iEntity);
    return HAM_SUPERCEDE;
}

SetObjectCollisionBox(iEntity)
{
    new Float:vecOrigin[3];
    new Float:vecAbsMin[3];
    new Float:vecAbsMax[3];

    get_entvar(iEntity, var_origin, vecOrigin);

    for (new i = 0; i < 3; i++)
    {
        vecAbsMin[i] = vecOrigin[i] + WEAPON_MINS[i];
        vecAbsMax[i] = vecOrigin[i] + WEAPON_MAXS[i];
    }

    set_entvar(iEntity, var_absmin, vecAbsMin);
    set_entvar(iEntity, var_absmax, vecAbsMax);
}

SetFloatEffect(iEntity, Float:vecOrigin[3], Float:vecAngles[3])
{
    set_entvar(iEntity, var_angles, vecAngles);
    set_entvar(iEntity, var_avelocity, Float:{ 0.0, -90.0, 0.0 });

    // Allow rotation by physics calls
    set_entvar(iEntity, var_gravity, 0.000000001);
    set_entvar(iEntity, var_velocity, Float:{ 0.0, 0.0, 0.000000001 });

    engfunc(EngFunc_SetOrigin, iEntity, vecOrigin);
}

@CWeaponBox_Touch_Post(id, other)
{
    if(get_entvar(id, var_iuser1) != WEAPONSTATE_DEFAULT)
        return;

    if(is_entity(id) && is_entity(other) && !is_user_alive(id))
        return;
}


//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@CBasePlayer_AddPlayerItem(iPlayer, iEntity)
{
    new szWeapon[32];
    get_entvar(iEntity, var_classname, szWeapon, charsmax(szWeapon));

    if(equal(szWeapon, "weapon_knife"))
        return;
}

@CreateEntity(iWeaponEnt)
{
    if(get_entvar(iWeaponEnt, var_iuser2))
       return;
    
    new iSprEntity = rg_create_entity("env_sprite");

    if(is_nullent(iSprEntity))
        return;

    new Float:flOrigin[3];
    get_entvar(iWeaponEnt, var_origin, flOrigin);
    
    set_entvar(iWeaponEnt, var_iuser2, iSprEntity);
    set_entvar(iSprEntity, var_owner, iWeaponEnt);
    set_entvar(iSprEntity, var_origin, flOrigin);
    set_entvar(iSprEntity, var_scale, 0.65);
    engfunc(EngFunc_SetModel, iSprEntity, sprite);

    //set_entvar(iSprEntity, var_rendermode, kRenderTransAdd);
    //set_entvar(iSprEntity, var_renderamt, 50.0);
    set_entvar(iSprEntity, var_rendercolor, Float:{175.0, 75.0, 0.0});
    
    SetThink(iSprEntity, "@Sprite_Think");
    set_entvar(iSprEntity, var_nextthink, get_gametime() + 0.2);
    
    return;
}

@Sprite_Think(const iEnt) {
    if(is_nullent(get_entvar(iEnt, var_owner))) {
        set_entvar(iEnt, var_flags, FL_KILLME);
        return;
    }
    set_entvar(iEnt, var_nextthink, get_gametime() + 0.2);
}
 
Сообщения
67
Реакции
28
Помог
1 раз(а)
murlemur, с weaponbox'ом работает прекрасно, но у armoury_entity не удаляется спрайт вообще(
Скорее всего это происходит из-за совсем другого ID entity при спавне armoury_entity, который записывается в var_owner,в моей реализации точно такая же проблема и мне никак не удалось ее победить
12 Апр 2025
BlackSignature, твой вариант работает, но к сожалению только для weaponbox'a, с armoury_entity не срабатывает
 
Сообщения
294
Реакции
143
Помог
15 раз(а)
Ну я так накидал на скорую руку - даже не смотрел что там еще и armoury_entity есть ... Вот поправил немного :

Код:
@Sprite_Think(const iEnt) {
    static owner;
    owner = get_entvar(iEnt, var_owner);
    if(is_nullent(owner) || get_entvar(owner, var_solid) == SOLID_NOT) {
        set_entvar(iEnt, var_flags, FL_KILLME);
        return;
    }
    set_entvar(iEnt, var_nextthink, get_gametime() + 0.2);
}
 
Сообщения
67
Реакции
28
Помог
1 раз(а)
murlemur, честь тебе и хвала, все работает. Сколько же я времени на это убил 🙄
 
Сообщения
723
Реакции
610
Помог
13 раз(а)
murlemur, ну отдельный цинк в байдкоде не самый оптимальный вариант когда есть готовый item_airbox (как раз его и использую)
 
Сообщения
723
Реакции
610
Помог
13 раз(а)
fl0wer, хз. других эффектов то не было. Учту
 
Сообщения
67
Реакции
28
Помог
1 раз(а)
Vaqtincha, с glow эффектом смотрится красиво, тоже сделаю себе. Я цвет спрайта сделал не рандомный, а в зависимости от типа оружия.
Поделишься своей версией или эти приват? :D
 

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

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