| Advanced |
08-21-2013 04:14 |
Improve plugin and fix something
This plugin displays sprites on players HUD (using AddToFullPack and creating a new entity in front of a player). Please tell me how can I improve the code and fix one existing bug. When you go forward or back, entity is following you too slow, like its speed is too slow, so it is not fixed on your screen, when you go forward, you dont see the entity, when you stop and wait for 1s it shows again, like I have to increase entity's speed somehow. Please HELP!
PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <xs>
// Distance at which the sprite is placed from the users screen
// DO NOT EDIT UNNECESSARILY!
#define DISTANCE 12
new g_player_ent[33], g_bit_connected_user, g_stop_frame[33]
// Connected players macros
#define player_is_connected(%1) (g_bit_connected_user |= (1 << (%1 & 31)))
#define player_disconnected(%1) (g_bit_connected_user &= ~(1 << (%1 & 31)))
#define is_player_connected(%1) ((1 <= %1 <= 32) && (g_bit_connected_user & (1 << (%1 & 31))))
public plugin_init()
{
// Register the plugin and the main forward
register_plugin("[ZP] Addon: Sprites On HUD", "1.0", "@bdul!");
register_forward(FM_AddToFullPack, "fm_add_to_fullpack", 1)
}
public plugin_natives()
{
// Lets register some natives
register_native("DisplayHudSprite", "native_display_hud_sprite", 1)
register_native("RemoveHudSprite", "native_remove_hud_sprite", 1)
}
public fm_add_to_fullpack(es, e, ent, host, host_flags, player, p_set)
{
// Valid player ?
if (!is_player_connected(host))
return FMRES_IGNORED;
// Player haves a valid sprite entity
if (ent == g_player_ent[host])
{
static Float:origin[3], Float:forvec[3], Float:voffsets[3]
// Retrieve player's origin
pev(host, pev_origin, origin)
pev(host, pev_view_ofs, voffsets)
xs_vec_add(origin, voffsets, origin)
// Get a forward vector in the direction of player's aim
velocity_by_aim(host, DISTANCE, forvec)
// Set the sprite on the new origin
xs_vec_add(origin, forvec, origin)
engfunc(EngFunc_SetOrigin, ent, origin)
set_es(es, ES_Origin, origin)
// Make the sprite visible
set_es(es, ES_RenderMode, kRenderNormal)
set_es(es, ES_RenderAmt, 200)
// Sprite animation already stopped ?
if (!g_stop_frame[host])
return FMRES_IGNORED
// Stop the animation at the desired frame
if (pev(ent, pev_frame) == g_stop_frame[host])
{
set_pev(ent, pev_framerate, 0.0)
g_stop_frame[host] = 0
}
}
// Stupid compiler !!
return FMRES_IGNORED
}
public client_putinserver(id)
{
// Player connected
player_is_connected(id)
// Marks bots as disconnected players (so sprites are'nt displayed to them)
if (is_user_bot(id)) player_disconnected(id)
// Remove sprite entity if present
if (pev_valid(g_player_ent[id]))
remove_sprite_entity(id)
}
public client_disconnect(id)
{
// Player disconnected
player_disconnected(id)
// Remove sprite entity if present
if (pev_valid(g_player_ent[id]))
remove_sprite_entity(id)
}
public native_display_hud_sprite(id, const sprite_name[], Float:sprite_size, sprite_stopframe, Float:sprite_framerate)
{
// Invalid player ?
if (!is_player_connected(id))
return -1;
// Already haves a sprite on his hud
if (g_player_ent[id])
return -1;
// Strings passed byref
param_convert(2)
// Invalid sprite ?
if (!sprite_name[0])
return -1;
// Create an entity for the player
g_player_ent[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
// Invalid entity ?
if (!pev_valid(g_player_ent[id]))
return -1;
// Set some basic properties
set_pev(g_player_ent[id], pev_takedamage, 0.0)
set_pev(g_player_ent[id], pev_solid, SOLID_NOT)
set_pev(g_player_ent[id], pev_movetype, MOVETYPE_NONE)
// Set the sprite model
engfunc(EngFunc_SetModel, g_player_ent[id], sprite_name)
// Set the rendering on the entity
set_pev(g_player_ent[id], pev_rendermode, kRenderTransAlpha)
set_pev(g_player_ent[id], pev_renderamt, 0.0)
// Set the sprite size
set_pev(g_player_ent[id], pev_scale, sprite_size)
// Update sprite's stopping frame
g_stop_frame[id] = sprite_stopframe
// Allow animation of sprite ?
if (g_stop_frame[id] && sprite_framerate > 0.0)
{
// Set the sprites animation time, framerate and stop frame
set_pev(g_player_ent[id], pev_animtime, get_gametime())
set_pev(g_player_ent[id], pev_framerate, sprite_framerate)
// Spawn the sprite entity (necessary to play the sprite animations)
set_pev(g_player_ent[id], pev_spawnflags, SF_SPRITE_STARTON)
dllfunc(DLLFunc_Spawn, g_player_ent[id])
}
return g_player_ent[id];
}
public native_remove_hud_sprite(id)
{
// Invalid player ?
if (!is_player_connected(id))
return -1;
// Doesnt haves any sprite on his screen ?
if (!pev_valid(g_player_ent[id]))
return -1;
// Remove sprite entity
remove_sprite_entity(id)
return 1;
}
// Removes a sprite entity from world
remove_sprite_entity(id)
{
engfunc(EngFunc_RemoveEntity, g_player_ent[id])
g_player_ent[id] = 0
g_stop_frame[id] = 0
}
Also I am using Connors code for my ZP, it is working fine and nothing disapears, everything working perfect :
PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>
#include <xs>
#pragma semicolon 1
#define PLUGIN "[ZP] Addon: Infect-Effect"
#define VERSION "2.0.2"
new const INFECT_EFFECT_MODEL[] = "sprites/infect-effect.spr";
new const INFECT_EFFECT_CLASS[] = "env_infect_effect";
new const ENV_SPRITE_CLASS[] = "env_sprite"; // don't change
#define MaskEnt(%0) ( 1<<(%0 & 31) )
new g_bitSpriteEffectsEnts[64];
#define MarkSpriteEffect(%0) g_bitSpriteEffectsEnts[%0>>5] |= MaskEnt(%0)
#define ClearSpriteEffect(%0) g_bitSpriteEffectsEnts[%0>>5] &= ~MaskEnt(%0)
#define IsSpriteEffect(%0) ( g_bitSpriteEffectsEnts[%0>>5] & MaskEnt(%0) )
new cvar_scale, cvar_showtime, cvar_lightlevel;
new g_iPlayerEntEffectIndex[33];
new g_iszEnvSprite, g_iszCustomClass, g_iszModel;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, "ConnorMcLeod");
cvar_scale = register_cvar("zp_in-ef_scale", "0.035");
cvar_showtime = register_cvar("zp_in-ef_showtime", "2.0");
cvar_lightlevel = register_cvar("zp_in-ef_lightlevel", "100");
g_iszEnvSprite = engfunc(EngFunc_AllocString, ENV_SPRITE_CLASS);
g_iszCustomClass = engfunc(EngFunc_AllocString, INFECT_EFFECT_CLASS);
g_iszModel = engfunc(EngFunc_AllocString, INFECT_EFFECT_MODEL);
register_think(INFECT_EFFECT_CLASS, "Think_InfectEffect");
RegisterHam(Ham_Spawn, "player", "OnCBasePlayer_Spawn_P", true);
register_forward(FM_AddToFullPack, "OnAddToFullPack", false);
RegisterHam(Ham_CS_Restart, ENV_SPRITE_CLASS, "OnCSprite_Restart", false);
}
public plugin_precache()
{
precache_model(INFECT_EFFECT_MODEL);
}
public OnCBasePlayer_Spawn_P(id)
{
new ent = g_iPlayerEntEffectIndex[id];
if( ent )
{
if( pev_valid(ent) )
{
remove_entity(ent);
ClearSpriteEffect(ent);
}
g_iPlayerEntEffectIndex[id] = 0;
}
}
public zp_user_infected_post(id, attacker)
{
if(is_user_alive(attacker))
{
new ent = engfunc(EngFunc_CreateNamedEntity, g_iszEnvSprite);
if( ent <= 0 )
{
return;
}
set_pev_string(ent, pev_model, g_iszModel);
entity_set_int(ent, EV_INT_spawnflags, SF_SPRITE_STARTON);
if( DispatchSpawn(ent) == -1 )
{
remove_entity(ent);
}
entity_set_int(ent, EV_INT_rendermode, kRenderTransAdd);
entity_set_float(ent, EV_FL_renderamt, 200.0);
entity_set_float(ent, EV_FL_scale, get_pcvar_float(cvar_scale));
entity_set_int(ent, EV_INT_light_level, get_pcvar_num(cvar_lightlevel));
set_pev_string(ent, pev_classname, g_iszCustomClass);
entity_set_float(ent, EV_FL_nextthink, get_gametime() + get_pcvar_float(cvar_showtime));
MarkSpriteEffect(ent);
g_iPlayerEntEffectIndex[id] = ent;
entity_set_edict(ent, EV_ENT_euser1, id);
}
}
public OnAddToFullPack(es, e, ent, id, hostflags, player, pSet)
{
if( player || !IsSpriteEffect(ent) )
{
return FMRES_IGNORED;
}
if( g_iPlayerEntEffectIndex[id] != ent )
{
forward_return(0);
return FMRES_SUPERCEDE;
}
static Float:origin[3], Float:v_forward[3], Float:angles[3];
velocity_by_aim(id, 10, v_forward);
entity_get_vector(id, EV_VEC_origin, origin);
origin[2] += entity_get_int(id, EV_INT_flags) & FL_DUCKING ? 12.0 : 18.0;
xs_vec_add(origin, v_forward, origin);
engfunc(EngFunc_SetOrigin, ent, origin);
entity_get_vector(id, EV_VEC_angles, angles);
entity_set_vector(ent, EV_VEC_angles, angles);
return FMRES_HANDLED;
}
public OnCSprite_Restart( ent )
{
if( IsSpriteEffect(ent) )
{
Think_InfectEffect( ent );
}
}
public Think_InfectEffect( ent )
{
new id = entity_get_edict(ent, EV_ENT_euser1);
g_iPlayerEntEffectIndex[id] = 0;
remove_entity(ent);
ClearSpriteEffect(ent);
return PLUGIN_HANDLED;
}
|