Код:
/*
v0.1 - [31.08.2011] First release
v0.1a - [07.09.2011] 1)Added cvar 2)Bug fix 3)Block tripmine added 4)Code optimizations
v0.1b - [27.10.2011] 1)Code optimizations 2)Bug fix 3)Removed tripmine block
v0.1c - [08.11.2011] 1)Fixed support & hl_weapon_physics
v0.2 - [02.03.2012] 1)Optimizations 2)Fixed bugs
special thanks to - KORD_12.7
http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
*/
#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#define PLUGIN "hl_wp_floating_NEW!"
#define VERSION "0.2"
#define AUTHOR "Turanga_Leela"
#define Weapon_Marker 911911
#define Velocity_Vector pev_iuser2
#define Ent_Filter pev_iuser1
#define None 0
#define Timer 3.0
enum _:Velocity_Mode
{
Velocity_Up = 1,
Velocity_Down
}
enum _:Plugin_Events
{
event_Spawn = 1,
event_Touch
}
enum _:Plugin_Data
{
_bit_Flags,
_Max_Players
}
enum _:enum_Plugin_Flags(<<= 1)
{
flag_Weapon_Fix = 1,
flag_Displancer_Fix
}
new const Float:direction[][] =
{
{0.0, 0.0, 20.0},
{0.0, 0.0, -20.0}
}
new
g_plugin_data[Plugin_Data],
Trie:g_trie_sorting
new gFloatingWeaponsGlow;
public plugin_cfg()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
gFloatingWeaponsGlow = register_cvar( "hl_fw_glow", "1" );
if(get_cvar_pointer("displacer_version"))
{
g_plugin_data[_bit_Flags] |= flag_Displancer_Fix
}
g_trie_sorting = TrieCreate()
g_plugin_data[_Max_Players] = get_maxplayers()
new const g_enum[][] =
{
"ammo_357",
"ammo_9mmAR",
"ammo_9mmbox",
"ammo_9mmclip",
"ammo_ARgrenades",
"ammo_buckshot",
"ammo_crossbow",
"ammo_gaussclip",
"ammo_rpgclip",
"item_antidote",
"item_security",
"item_suit",
"item_battery",
"item_healthkit",
"item_longjump",
"weapon_crowbar",
"weapon_9mmhandgun",
"weapon_357",
"weapon_9mmAR",
"weapon_shotgun",
"weapon_crossbow",
"weapon_rpg",
"weapon_gauss",
"weapon_egon",
"weapon_hornetgun",
"weapon_handgrenade",
"weapon_satchel",
"weapon_tripmine",
"weapon_snark"
}
new ent = -1
for(new i; i < sizeof g_enum; i++)
{
while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", g_enum[i])))
{
if(pev_valid(ent))
{
engfunc(EngFunc_DropToFloor, ent)
switch(g_enum[i][None])
{
case 'w':
{
if(TrieKeyExists(g_trie_sorting, g_enum[i]))
{
ExecuteHamB(Ham_Touch, ent, None)
continue
}
TrieSetString(g_trie_sorting, g_enum[i], "")
RegisterHam(Ham_Touch, g_enum[i], "ham_touch_post", 1)
ExecuteHamB(Ham_Touch, ent, None)
}
default:
{
change_ent(ent, event_Spawn)
}
}
}
}
ent = -1
}
set_task(Timer, "change_plugin")
}
public change_plugin()
{
g_plugin_data[_bit_Flags] |= flag_Weapon_Fix
TrieDestroy(g_trie_sorting)
}
public ham_touch_post(ent, touched)
{
if(!touched || (touched > g_plugin_data[_Max_Players] && pev_valid(touched) && pev(touched, pev_solid) & SOLID_BSP) && pev_valid(ent))
{
set_pev(ent, Ent_Filter, Weapon_Marker)
set_task(1.0, "after_touch", ent)
}
}
public after_touch(ent)
{
switch(g_plugin_data[_bit_Flags] & flag_Weapon_Fix)
{
case None:
{
change_ent(ent, event_Touch)
}
default:
{
if(!pev_valid(ent) || EF_NODRAW & ~pev(ent, pev_effects))
{
return
}
change_ent(ent, event_Touch)
}
}
velocity_ent(ent)
}
bool:change_ent(ent, mode)
{
new
Float:origin[3],
Float:origin_change[] =
{
12.0,
20.0
},
Float:a_velocity[][] =
{
{0.0, 50.0, 0.0},
{0.0, -50.0, 0.0}
}
set_pev(ent, pev_movetype, MOVETYPE_NOCLIP)
pev(ent, pev_origin, origin)
origin[2] += origin_change[mode - 1]
set_pev(ent, pev_origin, origin)
static Float:fColor[3]
fColor[0] = random_float(50.0,255.0)
fColor[1] = random_float(0.0,255.0)
fColor[2] = random_float(0.0,255.0)
fm_set_rendering(ent, kRenderFxStrobeSlow)
set_pev(ent, pev_avelocity, a_velocity[random(2)])
if( get_pcvar_num( gFloatingWeaponsGlow ) == 1 )
{
static Float:fColor[3]
fColor[0] = random_float(50.0,255.0)
fColor[1] = random_float(0.0,255.0)
fColor[2] = random_float(0.0,255.0)
set_pev(ent, pev_renderfx, kRenderFxGlowShell)
set_pev(ent, pev_rendercolor, fColor)
}
if(flag_Weapon_Fix & ~g_plugin_data[_bit_Flags])
{
new
string[32],
bool:Angles_Fix
pev(ent, pev_model, string, charsmax(string))
origin = Float:{0.0, 0.0, 0.0}
switch(mode)
{
case event_Spawn:
{
switch(string[10])
{
case 'm', 'r':
{
origin[0] = -90.0
origin[2] = -90.0
Angles_Fix = true
}
case 'e':
{
if(string[11] == 'c')
{
origin[0] = -45.0
origin[2] = -90.0
Angles_Fix = true
}
}
}
}
case event_Touch:
{
switch(string[12])
{
case 't', 'h':
{
origin[2] = -90.0
Angles_Fix = true
}
case '.':
{
origin[2] = -82.5
Angles_Fix = true
}
case 'w':
{
origin[0] = 90.0
Angles_Fix = true
}
case 'A':
{
origin[0] = -90.0
origin[2] = -90.0
Angles_Fix = true
}
case 'p':
{
if(g_plugin_data[_bit_Flags] & flag_Displancer_Fix && string[13] == 'l')
{
origin[0] = 8.5
origin[2] = 27.5
Angles_Fix = true
}
}
}
}
}
if(Angles_Fix)
{
set_pev(ent, pev_angles, origin)
}
}
return true
}
public bool:velocity_ent(ent)
{
static mode
if(pev_valid(ent) && pev(ent, Ent_Filter) == Weapon_Marker)
{
switch(pev(ent, Velocity_Vector))
{
case None, Velocity_Up:
{
mode = Velocity_Up
}
case Velocity_Down:
{
mode = Velocity_Down
}
default:
{
return false
}
}
set_pev(ent, Velocity_Vector, mode ^ Velocity_Mode)
set_pev(ent, pev_velocity, direction[mode - 1])
set_task(1.0, "velocity_ent", ent)
return true
}
return false
}