Участник
Пользователь
- Сообщения
- 67
- Реакции
- 28
- Помог
- 1 раз(а)
Очень не хотелось просить помощи и показывать свои "творения" дабы не позорится, но я никак не могу подружиться с entity, прощу помощи.
Увидел интересную идею в теме Weapons Float Effect, начал пробовать реализовывать и столкнулся с трудностями.
ID armoury_entity на спавне отличается от id, которого касается игрок через различные хуки touch'a и от id entity при использовании AddPlayerItem.
При различных попытках (коих было с десяток) всегда были какие-то проблемы, то спрайт спавнился, но не удалялся при поднятии оружия, то он спавнился в слишком большом количестве и накладывался на предыдущий спрайт и т.д. Единственное, что я придумал и что более менее работает это при спавне спрайта записывать координаты в виде ключа и ID entity спрайта в trie массив для последующего удаления при поднятии оружия, я понимаю, что реализация плохая, но я уже отчаялся.
Помогите светлые умы (скриптеры) не вывожу.
P.S. файл .spr прикрепить нельзя, но если что можно скачать тут (спасибо MayroN)
Увидел интересную идею в теме 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);
}