Member
|
02-15-2019
, 11:10
Making a preview of an entity
|
#1
|
Hey, I was trying to make a preview of an entity before placing it, I tried to fake it and then when the player chooses to place it from the menu. the fake one disappears. I've set the fake entity to spawn once the player opens the menu but once it spawns it doesn't move with the mouse/aim movement, how can I solve this? or what did I do wrong?
Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <xs>
#include <fun>
#include <zombieplague>
#include <zp50_items>
#include <zp50_gamemodes>
#include <zmvip>
// The sizes of models
#define PALLET_MINS Float:{ -27.260000, -22.280001, -22.290001 }
#define PALLET_MAXS Float:{ 27.340000, 26.629999, 29.020000 }
// from fakemeta util by VEN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
#define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1)
// this is mine
#define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1)
#define fm_get_user_noclip(%1) (pev(%1, pev_movetype) == MOVETYPE_NOCLIP)
// cvars
new pnumplugin, remove_nrnd, maxpallets, phealth;
new g_MaxSBs[33], g_MaxSBs_VIP[33]
new g_GameModeInfectionID
new g_GameModeMultiID
// num of pallets with bags
new palletscout = 0;
new bool:done[33]
/* Models for pallets with bags .
Are available 2 models, will be set a random of them */
new g_models[][] =
{
"models/pallet_with_bags2.mdl",
"models/pallet_with_bags.mdl"
}
new stuck[33]
new g_bolsas[33];
new cvar[3]
new const Float:size[][3] = {
{0.0, 0.0, 1.0}, {0.0, 0.0, -1.0}, {0.0, 1.0, 0.0}, {0.0, -1.0, 0.0}, {1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0}, {-1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0},
{0.0, 0.0, 2.0}, {0.0, 0.0, -2.0}, {0.0, 2.0, 0.0}, {0.0, -2.0, 0.0}, {2.0, 0.0, 0.0}, {-2.0, 0.0, 0.0}, {-2.0, 2.0, 2.0}, {2.0, 2.0, 2.0}, {2.0, -2.0, 2.0}, {2.0, 2.0, -2.0}, {-2.0, -2.0, 2.0}, {2.0, -2.0, -2.0}, {-2.0, 2.0, -2.0}, {-2.0, -2.0, -2.0},
{0.0, 0.0, 3.0}, {0.0, 0.0, -3.0}, {0.0, 3.0, 0.0}, {0.0, -3.0, 0.0}, {3.0, 0.0, 0.0}, {-3.0, 0.0, 0.0}, {-3.0, 3.0, 3.0}, {3.0, 3.0, 3.0}, {3.0, -3.0, 3.0}, {3.0, 3.0, -3.0}, {-3.0, -3.0, 3.0}, {3.0, -3.0, -3.0}, {-3.0, 3.0, -3.0}, {-3.0, -3.0, -3.0},
{0.0, 0.0, 4.0}, {0.0, 0.0, -4.0}, {0.0, 4.0, 0.0}, {0.0, -4.0, 0.0}, {4.0, 0.0, 0.0}, {-4.0, 0.0, 0.0}, {-4.0, 4.0, 4.0}, {4.0, 4.0, 4.0}, {4.0, -4.0, 4.0}, {4.0, 4.0, -4.0}, {-4.0, -4.0, 4.0}, {4.0, -4.0, -4.0}, {-4.0, 4.0, -4.0}, {-4.0, -4.0, -4.0},
{0.0, 0.0, 5.0}, {0.0, 0.0, -5.0}, {0.0, 5.0, 0.0}, {0.0, -5.0, 0.0}, {5.0, 0.0, 0.0}, {-5.0, 0.0, 0.0}, {-5.0, 5.0, 5.0}, {5.0, 5.0, 5.0}, {5.0, -5.0, 5.0}, {5.0, 5.0, -5.0}, {-5.0, -5.0, 5.0}, {5.0, -5.0, -5.0}, {-5.0, 5.0, -5.0}, {-5.0, -5.0, -5.0}
}
const g_item_bolsas = 30
new g_itemid_bolsas, g_itemid_bolsas_VIP
new ZPSTUCK
new g_PlacingSB[33]
new g_iSpriteLaser
/*************************************************************
************************* AMXX PLUGIN *************************
**************************************************************/
public plugin_init()
{
/* Register the plugin */
register_plugin("[ZP] Extra: SandBags", "1.1", "LARP")
g_itemid_bolsas = zp_items_register("Sandbags", 0)
g_itemid_bolsas_VIP = zv_register_extra_item("Sandbags","Discount",15,ZP_TEAM_HUMAN)
/* Register the cvars */
ZPSTUCK = register_cvar("zp_pb_stuck","1")
pnumplugin = register_cvar("zp_pb_enable","1"); // 1 = ON ; 0 = OFF
remove_nrnd = register_cvar("zp_pb_remround","1");
maxpallets = register_cvar("zp_pb_limit","8"); // max number of pallets with bags
phealth = register_cvar("zp_pb_health","650"); // set the health to a pallet with bags
/* Game Events */
register_event("HLTV","event_newround", "a","1=0", "2=0"); // it's called every on new round
/* This is for menuz: */
register_menucmd(register_menuid("\ySand Bags:"), 1023, "menu_command" );
register_clcmd("say /sb","show_the_menu");
register_clcmd("say_team /sb","show_the_menu");
register_clcmd("say /buy_sb","gbuy");
register_clcmd("say_team /buy_sb","gbuy");
//RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage");
//cvar[0] = register_cvar("zp_autounstuck","1")
cvar[1] = register_cvar("zp_pb_stuckeffects","1")
cvar[2] = register_cvar("zp_pb_stuckwait","7")
register_forward( FM_CmdStart, "fw_CmdStart" )
RegisterHam(Ham_TakeDamage,"func_wall","fw_TakeDamage");
RegisterHam(Ham_Killed, "func_wall", "fw_PlayerKilled", 1)
}
//Here is what I am tryin to make just owner and zombie to be able to destroy sandbags
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
//Victim is not lasermine.
new sz_classname[32]
entity_get_string( victim , EV_SZ_classname , sz_classname, 31 )
new iHealth = pev( victim, pev_health );
if( !equali(sz_classname,"amxx_pallets") )
return HAM_IGNORED;
if( iHealth < 200 ) // less than 200 glow red
{
set_rendering ( victim, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16)
}
else if( iHealth < 400 ) // more than 200 glow a bit blue
{
set_rendering ( victim, kRenderFxGlowShell, 0, 200, 200, kRenderNormal, 16)
}
else if( iHealth < 600 ) // More than 400 glow green
{
set_rendering ( victim, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)
}
//Attacker is zombie
if( zp_get_user_zombie( attacker ) )
return HAM_IGNORED;
//Block Damage
return HAM_SUPERCEDE;
}
public fw_PlayerKilled(victim, attacker, shouldgib)
{
new sz_classname[32], Float: health
entity_get_string( victim , EV_SZ_classname , sz_classname, charsmax(sz_classname))
health = entity_get_float(victim, EV_FL_health)
if(equal(sz_classname, "amxx_pallets") && is_valid_ent(victim) && zp_get_user_zombie(attacker) && health <= 0.0)
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + 5)
client_print(attacker, print_chat, "[ZP] You earned 5 ammopacks by destroy sandbag!")
return HAM_IGNORED;
}
return HAM_IGNORED;
}
public plugin_precache()
{
for(new i;i < sizeof g_models;i++)
engfunc(EngFunc_PrecacheModel,g_models[i]);
g_iSpriteLaser = precache_model( "sprites/Newlightning.spr");
}
public show_the_menu(id,level,cid)
{
// check if user doesen't have admin
/*if( ! cmd_access( id,level, cid , 0 ))
return PLUGIN_HANDLED;
*/
// check if the plugin cvar is turned off
if( ! get_pcvar_num( pnumplugin ) )
return PLUGIN_HANDLED;
// check if user isn't alive
if( ! is_user_alive( id ) )
{
client_print( id, print_chat, "" ); //msg muerto
return PLUGIN_HANDLED;
}
if ( !zp_get_user_zombie(id) )
{
new szMenuBody[256];
new keys;
new nLen = format( szMenuBody, 255, "\ySand Bags:^n" );
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w1. Place a Sandbags" );
nLen += format( szMenuBody[nLen], 255-nLen, "^n\w2. Remove Preview" );
nLen += format( szMenuBody[nLen], 255-nLen, "^n^n\w0. Exit" );
keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9)
show_menu( id, keys, szMenuBody, -1 );
// depends what you want, if is continue will appear on chat what the admin sayd
g_PlacingSB[id] = 1
create_fake(id)
preview(id)
return PLUGIN_HANDLED;
}
client_print(id, print_chat, "[ZP] The zombies can not use this command!")
return PLUGIN_HANDLED;
}
public menu_command(id,key,level,cid)
{
switch( key )
{
// place a pallet with bags
case 0:
{
if ( !zp_get_user_zombie(id) )
{
new money = g_bolsas[id]
if ( money < 1 )
{
client_print(id, print_chat, "[ZP] You do not have to place sandbags!")
return PLUGIN_CONTINUE
}
g_bolsas[id]-= 1
place_palletwbags(id);
show_the_menu(id,level,cid);
return PLUGIN_CONTINUE
}
client_print(id, print_chat, "[ZP] The zombies can not use this!!")
return PLUGIN_CONTINUE
}
// remove a pallet with bags
case 1:
{
remove_fake_pallet(id)
g_PlacingSB[id] =0
}
// remove all pallets with bags
/*case 2:
{
g_bolsas[id]= 0
remove_allpalletswbags();
client_print(id,print_chat,"[AMXX] You removed all pallets with bags !");
show_the_menu(id,level,cid);
}
*/
}
return PLUGIN_HANDLED;
}
public place_palletwbags(id)
{
if( palletscout == get_pcvar_num(maxpallets) )
{
client_print(id,print_chat,"[ZP] For security reasons only allow %d Sandbags on the server!",get_pcvar_num
(maxpallets));
return PLUGIN_HANDLED;
}
// create a new entity
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
// set a name to the entity
set_pev(ent,pev_classname,"amxx_pallets");
// set model
engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]);
// register a new var. for origin
static Float:xorigin[3];
get_user_hitpoint(id,xorigin);
// check if user is aiming at the air
if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY)
{
client_print(id,print_chat,"[ZP] You can not put sandbags in the sky!");
return PLUGIN_HANDLED;
}
// set sizes
static Float:p_mins[3], Float:p_maxs[3];
p_mins = PALLET_MINS;
p_maxs = PALLET_MAXS;
engfunc(EngFunc_SetSize, ent, p_mins, p_maxs);
set_pev(ent, pev_mins, p_mins);
set_pev(ent, pev_maxs, p_maxs );
set_pev(ent, pev_absmin, p_mins);
set_pev(ent, pev_absmax, p_maxs );
// set the rock of origin where is user placed
engfunc(EngFunc_SetOrigin, ent, xorigin);
// make the rock solid
set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block
new iHealth = pev( ent, pev_health );
set_rendering ( ent, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)
// set the movetype
set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff
// now the damage stuff, to set to take it or no
// if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags
// else, if you want to make it destroyable, just set the health > 0 and will be
// destroyable.
new Float:p_cvar_health = get_pcvar_float(phealth);
switch(p_cvar_health)
{
case 0.0 :
{
set_pev(ent,pev_takedamage,DAMAGE_NO);
}
default :
{
set_pev(ent,pev_health,p_cvar_health);
set_pev(ent,pev_takedamage,DAMAGE_YES);
}
}
static Float:rvec[3];
pev(id,pev_v_angle,rvec);
rvec[0] = 0.0;
set_pev(ent,pev_angles,rvec);
// drop entity to floor
fm_drop_to_floor(ent);
set_pev(ent, pev_owner, id);
// num ..
palletscout++;
// confirm message
client_print(id, print_chat, "[ZP] You have placed a Sandbags, you have %i remaining", g_bolsas[id])
remove_2(id)
return PLUGIN_HANDLED;
}
/* ====================================================
get_user_hitpoin stock . Was maked by P34nut, and is
like get_user_aiming but is with floats and better :o
====================================================*/
stock get_user_hitpoint(id, Float:hOrigin[3])
{
if ( ! is_user_alive( id ))
return 0;
new Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3];
new Float:fTemp[3];
pev(id, pev_origin, fOrigin);
pev(id, pev_v_angle, fvAngle);
pev(id, pev_view_ofs, fvOffset);
xs_vec_add(fOrigin, fvOffset, fvOrigin);
engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp);
xs_vec_mul_scalar(feOrigin, 9999.9, feOrigin);
xs_vec_add(fvOrigin, feOrigin, feOrigin);
engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id);
global_get(glb_trace_endpos, hOrigin);
return 1;
}
/* ====================================================
This is called on every round, at start up,
with HLTV logevent. So if the "pallets_wbags_nroundrem"
cvar is set to 1, all placed pallets with bugs will be
removed.
====================================================*/
public event_newround()
{
for ( new id; id <= get_maxplayers(); id++)
{
if( get_pcvar_num ( remove_nrnd ) == 1)
remove_allpalletswbags();
done[id] = false
g_bolsas[id] = 0
g_MaxSBs[id] = 0
g_MaxSBs_VIP[id] = 0
g_PlacingSB[id] = 0
}
}
/* ====================================================
This is a stock to help for remove all pallets with
bags placed . Is called on new round if the cvar
"pallets_wbags_nroundrem" is set 1.
====================================================*/
stock remove_allpalletswbags()
{
new pallets = -1;
while((pallets = fm_find_ent_by_class(pallets, "amxx_pallets")))
fm_remove_entity(pallets);
palletscout = 0;
}
public checkstuck() {
if ( get_pcvar_num(ZPSTUCK) == 1 )
{
static players[32], pnum, player
get_players(players, pnum)
static Float:origin[3]
static Float:mins[3], hull
static Float:vec[3]
static o,i
for(i=0; i<pnum; i++){
player = players[i]
if (is_user_connected(player) && is_user_alive(player)) {
pev(player, pev_origin, origin)
hull = pev(player, pev_flags) & FL_DUCKING ? HULL_HEAD : HULL_HUMAN
if (!is_hull_vacant(origin, hull,player) && !fm_get_user_noclip(player) && !(pev(player,pev_solid) &
SOLID_NOT)) {
++stuck[player]
if(stuck[player] >= get_pcvar_num(cvar[2])) {
pev(player, pev_mins, mins)
vec[2] = origin[2]
for (o=0; o < sizeof size; ++o) {
vec[0] = origin[0] - mins[0] * size[o][0]
vec[1] = origin[1] - mins[1] * size[o][1]
vec[2] = origin[2] - mins[2] * size[o][2]
if (is_hull_vacant(vec, hull,player)) {
engfunc(EngFunc_SetOrigin, player, vec)
effects(player)
set_pev(player,pev_velocity,{0.0,0.0,0.0})
o = sizeof size
}
}
}
}
else
{
stuck[player] = 0
}
}
}
}
}
stock bool:is_hull_vacant(const Float:origin[3], hull,id) {
static tr
engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr)
if (!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid)) //get_tr2(tr, TR_InOpen))
return true
return false
}
public effects(id) {
if(get_pcvar_num(cvar[1])) {
set_hudmessage(255,150,50, -1.0, 0.65, 0, 6.0, 1.5,0.1,0.7) // HUDMESSAGE
show_hudmessage(id,"Automatic Unstuck!") // HUDMESSAGE
message_begin(MSG_ONE_UNRELIABLE,105,{0,0,0},id )
write_short(1<<10) // fade lasts this long duration
write_short(1<<10) // fade lasts this long hold time
write_short(1<<1) // fade type (in / out)
write_byte(20) // fade red
write_byte(255) // fade green
write_byte(255) // fade blue
write_byte(255) // fade alpha
message_end()
client_cmd(id,"spk fvox/blip.wav")
}
}
public plugin_cfg()
{
g_GameModeInfectionID = zp_gamemodes_get_id("Infection Mode")
g_GameModeMultiID = zp_gamemodes_get_id("Multiple Infection Mode")
}
public zv_extra_item_selected(id, itemid)
{
// This is not our item
if (itemid != g_itemid_bolsas_VIP)
return;
if(g_MaxSBs_VIP[id] >= 1)
return;
g_bolsas[id]+= 2
set_task(0.3,"show_the_menu",id)
client_print(id, print_chat, "[ZP] You have %i sandbags, to use type 'say / sb'", g_bolsas[id])
g_MaxSBs_VIP[id] += 1
}
public zp_fw_items_select_pre(id, itemid, ignorecost)
{
// This is not our item
if (itemid != g_itemid_bolsas)
return ZP_ITEM_AVAILABLE;
// Antidote only available to zombies
if (zp_core_is_zombie(id))
return ZP_ITEM_DONT_SHOW;
//Antidote only available during infection modes
new current_mode = zp_gamemodes_get_current()
if (current_mode != g_GameModeInfectionID && current_mode != g_GameModeMultiID)
return ZP_ITEM_DONT_SHOW;
// Display remaining item count for this round
static text[32]
formatex(text, charsmax(text), "[%d/1]", g_MaxSBs[id])
zp_items_menu_text_add(text)
// Reached antidote limit for this round
if (g_MaxSBs[id] >= 1)
return ZP_ITEM_NOT_AVAILABLE;
if(done[id])
return ZP_ITEM_NOT_AVAILABLE;
return ZP_ITEM_AVAILABLE;
}
public zp_fw_items_select_post(id, itemid, ignorecost)
{
// This is not our item
if (itemid != g_itemid_bolsas)
return;
g_bolsas[id]+= 2
set_task(0.3,"show_the_menu",id)
client_print(id, print_chat, "[ZP] You have %i sandbags, to use type 'say / sb'", g_bolsas[id])
g_MaxSBs[id] += 1
done[id] = true
}
public gbuy(id)
{
if ( zp_get_user_zombie(id) || !is_user_alive(id) ){
return PLUGIN_HANDLED
}
if (zp_get_user_ammo_packs(id) < g_item_bolsas) {
client_print(id, print_chat, "You don't have enough ammo pack.")
return PLUGIN_HANDLED
}
//if(!zp_core_is_zombie(id) && is_user_alive(id))
{
if(!done[id])
{
g_bolsas[id]+= 2
set_task(0.3,"show_the_menu",id)
client_print(id, print_chat, "[ZP] You have %i sandbags, to use type 'say / sb'", g_bolsas[id])
done[id] = true
zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - g_item_bolsas)
return PLUGIN_CONTINUE
}
else {
client_print(id, print_chat, "Max Sandbags reached !!!")
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
stock create_tracer_water(id, Float:fVec1[3], Float:fVec2[3])
{
static iVec1[3]
FVecIVec(fVec1, iVec1)
static Float:origin[3], Float:vSrc[3], Float:angles[3], Float:v_forward[3], Float:v_right[3], Float:v_up[3], Float:gun_position[3], Float:player_origin[3], Float:player_view_offset[3]
pev(id, pev_v_angle, angles)
engfunc(EngFunc_MakeVectors, angles)
global_get(glb_v_forward, v_forward)
global_get(glb_v_right, v_right)
global_get(glb_v_up, v_up)
//m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
pev(id, pev_origin, player_origin)
pev(id, pev_view_ofs, player_view_offset)
xs_vec_add(player_origin, player_view_offset, gun_position)
xs_vec_mul_scalar(v_forward, 24.0, v_forward)
xs_vec_mul_scalar(v_right, 3.0, v_right)
if ((pev(id, pev_flags) & FL_DUCKING) == FL_DUCKING)
xs_vec_mul_scalar(v_up, 6.0, v_up)
else
xs_vec_mul_scalar(v_up, -2.0, v_up)
xs_vec_add(gun_position, v_forward, origin)
xs_vec_add(origin, v_right, origin)
xs_vec_add(origin, v_up, origin)
vSrc[0] = origin[0]
vSrc[1] = origin[1]
vSrc[2] = origin[2]
message_begin(MSG_PAS, SVC_TEMPENTITY, iVec1)
write_byte(TE_BEAMPOINTS)
engfunc(EngFunc_WriteCoord, fVec2[0])
engfunc(EngFunc_WriteCoord, fVec2[1])
engfunc(EngFunc_WriteCoord, fVec2[2])
engfunc(EngFunc_WriteCoord, vSrc[0])
engfunc(EngFunc_WriteCoord, vSrc[1])
engfunc(EngFunc_WriteCoord, vSrc[2])
write_short(g_iSpriteLaser)
write_byte(6)
write_byte(200)
write_byte(1)
write_byte(100)
write_byte(0)
write_byte(0); write_byte(255); write_byte(0);
write_byte(192)
write_byte(250)
message_end()
}
public create_fake(id)
{
// create a new entity
new pent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));
// set a name to the entity
set_pev(pent,pev_classname,"fake_pallets");
// set model
engfunc(EngFunc_SetModel,pent,g_models[random(sizeof g_models)]);
// register a new var. for origin
static Float:xorigin[3];
get_user_hitpoint(id,xorigin);
// set sizes
static Float:p_mins[3], Float:p_maxs[3];
p_mins = PALLET_MINS;
p_maxs = PALLET_MAXS;
engfunc(EngFunc_SetSize, pent, p_mins, p_maxs);
set_pev(pent, pev_mins, p_mins);
set_pev(pent, pev_maxs, p_maxs );
set_pev(pent, pev_absmin, p_mins);
set_pev(pent, pev_absmax, p_maxs );
// set the rock of origin where is user placed
engfunc(EngFunc_SetOrigin, pent, xorigin);
// glow it
if(g_bolsas[id] >= 1)
set_rendering ( pent, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)
else set_rendering ( pent, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16)
// set the movetype
set_pev(pent,pev_movetype,MOVETYPE_FOLLOW); // no gravity, but still collides with stuff
static Float:rvec[3];
pev(id,pev_v_angle,rvec);
rvec[0] = 0.0;
set_pev(pent,pev_angles,rvec);
// drop entity to floor
set_pev(pent, pev_owner, id);
}
public preview(Player)
{
static Float:plrViewAngles[3], Float:VecEnd[3], Float:VecDir[3], Float:PlrOrigin[3]
pev(Player, pev_v_angle, plrViewAngles)
static Float:VecSrc[3], Float:VecDst[3]
//VecSrc = pev->origin + pev->view_ofs
pev(Player, pev_origin, PlrOrigin)
pev(Player, pev_view_ofs, VecSrc)
xs_vec_add(VecSrc, PlrOrigin, VecSrc)
//VecDst = VecDir * 8192.0
angle_vector(plrViewAngles, ANGLEVECTOR_FORWARD, VecDir);
xs_vec_mul_scalar(VecDir, 8192.0, VecDst);
xs_vec_add(VecDst, VecSrc, VecDst);
new hTrace = create_tr2()
engfunc(EngFunc_TraceLine, VecSrc, VecDst, 0, Player, hTrace)
get_tr2(hTrace, TR_vecEndPos, VecEnd);
create_tracer_water(Player, VecSrc, VecEnd)
client_print(Player,print_chat,"debug")
}
public remove_2(id)
{
if(g_bolsas[id] == 0) remove_fake_pallet(id)
}
public fw_CmdStart( id, uc_handle, seed )
{
if(g_PlacingSB[id] == 1)
{
preview(id)
}
}
stock remove_fake_pallet(id)
{
if(!zp_core_is_zombie(id))
{
new ent, body, class[32];
get_user_aiming(id, ent, body);
if(pev_valid(ent))
{
pev(ent, pev_classname, class, 31);
if (equal(class, "fake_pallets"))
{
fm_remove_entity(ent);
}
}
}
}
This is what I tried to make the fake entity move with my aim, but it doesn't
Code:
set_pev(pent,pev_movetype,MOVETYPE_FOLLOW); // no gravity, but still collides with stuff
|
|