Участник
Пользователь
- Сообщения
- 107
- Реакции
- 10
Можете помочь, что я делаю не так, указать на ошибки и предложить более рациональные варианты.
Надо что бы при покупке появлялась Фейковая модель (Проекция) и следовала за тем куда я смотрю (Aim), после чего на Е ставилась адекватно и проходить что бы никто не мог! я уже устал... Меню сделано для теста.
Проблема в том, что при покупке объект появляется передо мной там куда смотрю и всё, то есть регается на полу сразу за моим курсором не ходит.
<Код>
Надо что бы при покупке появлялась Фейковая модель (Проекция) и следовала за тем куда я смотрю (Aim), после чего на Е ставилась адекватно и проходить что бы никто не мог! я уже устал... Меню сделано для теста.
Проблема в том, что при покупке объект появляется передо мной там куда смотрю и всё, то есть регается на полу сразу за моим курсором не ходит.
<Код>
Код:
#include < amxmodx >
#include < amxmisc >
#include < fun >
#include < cstrike >
#include < engine >
#include < fakemeta_util >
#include < zombienightmare >
// 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 MAX_COUNT 2 // макс количество барикад для обычного игрока
#define MAX_COUNT_V 3 // макс количество барикад для VIP игрока
#define FLAG_V ADMIN_LEVEL_H // Флаг VIP игрока (t)
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
new const Float: BARICADE_MINSIZE[] = { -30.0, -30.0, -30.0 };
new const Float: BARICADE_MAXSIZE[] = { 30.0, 30.0, 30.0 };
new const Float: HealthBr[] = { 550.0 };
new szModels[][] =
{
"models/ls_sandbags.mdl"
}
new const Class_Name[] = "Barricade"
new const Class_Name_Fake[] = "Barricade_fake"
new CanBePlaced[33], szBarricade[33], PlayerOwner[33], sz_Br[33], szItem, g_iMaxPlayers;
new Float:szOrigin[3];
public plugin_precache() {
for( new i;i < sizeof szModels;i++ )
engfunc( EngFunc_PrecacheModel, szModels[i] );
}
public plugin_init() {
register_plugin(
"[ZN] Addon: Barricade",
"0.1 (Beta)",
"Kulogram"
);
register_menu( "clcmd_Menu_Spawn", KEYSMENU, "function" );
register_clcmd( "say /br", "clcmd_Menu_Spawn" );
register_logevent("RoundEnd",2,"1=Round_End");
register_think( Class_Name_Fake, "ThinkBarricade" );
register_forward(FM_OnFreeEntPrivateData, "OnFreeEntPrivateData");
//BarTime = get_user_msgid( "BarTime" );
szItem = zp_register_extra_item( "Barricade", 10, ZP_TEAM_HUMAN );
}
public RoundEnd() {
new Ent
while( ( Ent = find_ent_by_class( Ent, Class_Name) ) )
if( is_valid_ent( Ent ) )
remove_allpalletswbags();
}
public zp_user_infected_post( pPlayer ){
if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
remove_entity( sz_Br[ pPlayer ] );
}
public client_disconnected( pPlayer ) {
if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
remove_entity( sz_Br[ pPlayer ] );
}
public zp_fw_core_infect(pPlayer) {
if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
remove_entity( sz_Br[ pPlayer ] );
}
public OnFreeEntPrivateData(pPlayer)
{
if (!FClassnameIs(pPlayer, Class_Name_Fake) )
return FMRES_IGNORED;
new pOwner = pev(pPlayer, pev_owner);
if ((1 <= pOwner <= g_iMaxPlayers))
sz_Br[pOwner] = 0;
return FMRES_IGNORED;
}
public client_PreThink( pPlayer ) {
if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) || szBarricade[ pPlayer ] < 0 ) return;
if( get_user_button( pPlayer ) & IN_USE ) {
szBarricade[ pPlayer ]-= 1
HologramCreate( pPlayer );
}
}
public clcmd_Menu_Spawn( pPlayer ) {
if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
return PLUGIN_HANDLED;
}
static Menu[ 650 ], iLen
iLen = 0
iLen = formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y[*] \wZombieNightmare^n\y[*] \wМеню барьеров^n\y[*] \d(Барикад - %d шт.)^n^n", szBarricade[pPlayer] );
if( szBarricade[ pPlayer ] > 0 )
iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \wПоставить палет с мешками^n" );
else
iLen += formatex( Menu[ iLen ], charsmax( Menu ) - iLen, "\y1. \dПоставить палет с мешками \r(У тебя их нет!)^n" );
show_menu( pPlayer , KEYSMENU , Menu , -1 , "clcmd_Menu_Spawn" );
return PLUGIN_HANDLED;
}
public function( pPlayer, key ) {
switch( key ) {
case 0: {
if( !is_user_alive( pPlayer ) || zp_get_user_zombie( pPlayer ) ) {
client_printcolor( pPlayer, "!t[!gZP!t] !yДоступно только живым игрокам. (Зомби тоже недоступно)" );
return PLUGIN_HANDLED;
}
if( szBarricade[ pPlayer ] < 1 ) {
set_hudmessage( 100, 100, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
show_hudmessage( pPlayer, "У тебя нет^nкупленных барикад" );
} else {
szBarricade[pPlayer] -= 1 ;
HologramCreate( pPlayer );
clcmd_Menu_Spawn( pPlayer );
if(PlayerOwner[ pPlayer ] > 0 ) {
PlayerOwner[ pPlayer ] -= 1
}
}
}
}
return PLUGIN_HANDLED;
}
public HologramCreate( pPlayer ) {
if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
remove_entity( sz_Br[ pPlayer ] );
new Int = create_entity( "info_target" );
if( !Int )
return PLUGIN_HANDLED;
static Float:vecAngles[3]
GetOriginAimEndEyes( pPlayer, 128, szOrigin, vecAngles )
engfunc( EngFunc_SetModel, Int,szModels[ random( sizeof szModels ) ] );
engfunc( EngFunc_SetOrigin, Int, szOrigin );
set_pev( Int, pev_classname, Class_Name_Fake );
set_pev( Int, pev_owner, pPlayer );
set_pev( Int, pev_rendermode, kRenderTransAdd );
set_pev( Int, pev_renderamt, 200.0 );
set_pev( Int, pev_body, 1 );
set_pev( Int, pev_nextthink, get_gametime() );
set_pev( Int, pev_solid, SOLID_NOT );
set_pev( Int, pev_movetype, MOVETYPE_FLY ); // Movestep <- for Preview
sz_Br[ pPlayer ] = Int;
}
public ThinkBarricade( Barricade ) {
if (pev_valid( Barricade ) != 2)
return PLUGIN_CONTINUE;
static pOwner;
pOwner = pev( Barricade, pev_owner );
if (!(1 <= pOwner <= g_iMaxPlayers) || !is_user_alive(pOwner))
return PLUGIN_HANDLED;
static iBody, Float:vecColor[3], Float:vecAngles[3];
GetOriginAimEndEyes( pOwner, 128, szOrigin, vecAngles );
iBody = 2
xs_vec_set( vecColor, 100.0, 100.0, 100.0 );
engfunc( EngFunc_SetOrigin, Barricade, szOrigin );
if ( !IsHullVacant( szOrigin, HULL_HEAD, Barricade ) ) {
if( Check_CreateBr() || Check_HologramBr() ) {
iBody = 1
xs_vec_set( vecColor, 0.0, 250.0, 0.0 );
}
}
CanBePlaced[ pOwner ] = iBody;
set_pev( Barricade, pev_angles, vecAngles );
set_pev( Barricade, pev_body, iBody );
set_pev( Barricade, pev_nextthink, get_gametime() + 0.01 );
return PLUGIN_HANDLED;
}
public CreateEntity( pPlayer ) {
new Ent = engfunc( EngFunc_CreateNamedEntity, engfunc( EngFunc_AllocString, "func_wall" ) );
set_pev( Ent , pev_classname , Class_Name )
engfunc( EngFunc_SetModel, Ent,szModels[ random( sizeof szModels ) ] )
new Float:a_Maxs[ 3 ], Float:a_Mins[ 3 ], Float:vecOrigin[3], Float:vecAngles[3];
a_Mins = BARICADE_MINSIZE;
a_Maxs = BARICADE_MAXSIZE;
engfunc( EngFunc_SetSize, Ent, a_Mins, a_Maxs );
set_pev( Ent, pev_mins, a_Mins );
set_pev( Ent, pev_maxs, a_Maxs );
set_pev( Ent, pev_absmin, a_Mins );
set_pev( Ent, pev_absmax, a_Maxs );
set_pev( Ent, pev_body, 3 );
GetOriginAimEndEyes( Ent, 128, vecOrigin, vecAngles );
engfunc( EngFunc_SetOrigin, Ent, vecOrigin );
set_pev( Ent , pev_solid, SOLID_BBOX );
set_pev( Ent , pev_movetype , MOVETYPE_FLY );
//new Float:p_cvar_health = float(HealthBr[pPlayer]);
set_pev( Ent, pev_health, HealthBr );
set_pev( Ent, pev_takedamage, DAMAGE_YES );
static Float:rvec[3];
pev( pPlayer, pev_v_angle, rvec );
rvec[0] = 0.0;
set_pev( Ent, pev_angles, rvec );
set_pev( Ent, pev_owner, pPlayer );
fm_drop_to_floor( Ent );
if ( sz_Br[pPlayer] && is_valid_ent( sz_Br[ pPlayer ] ) )
remove_entity( sz_Br[ pPlayer ] );
}
public Check_CreateBr() {
static victim
victim = -1
while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
new sz_classname[32];
entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
if( !equali( sz_classname, Class_Name ) )
{
//our dude has sandbags and wants to place them near to him
if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
return false;
}
}
return true
}
public Check_HologramBr() {
static victim
victim = -1
while ( ( victim = find_ent_in_sphere( victim, szOrigin, 200.0 ) ) != 0 ) {
new sz_classname[32];
entity_get_string( victim , EV_SZ_classname , sz_classname, 31 );
if( !equali( sz_classname, Class_Name_Fake ) ) {
//our dude has sandbags and wants to place them near to him
if( is_user_connected( victim ) && is_user_alive( victim ) && PlayerOwner[ victim ] == 0 )
return PLUGIN_HANDLED;
}
}
return true
}
public zp_extra_item_selected( pPlayer, itemid ) {
if ( itemid == szItem ) {
if( szBarricade[ pPlayer ] > 3 && get_user_flags( pPlayer ) & FLAG_V ) {
client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
return PLUGIN_HANDLED;
}
else
if( szBarricade[ pPlayer ] > 2 ) {
client_printcolor( pPlayer, "!y[!gZP!y] Максbмальное кол-во барикад достигнуто." )
return PLUGIN_HANDLED;
}
szBarricade[ pPlayer ]+= 1
PlayerOwner[ pPlayer ]+= 1
//set_task( 0.3, "clcmd_Menu_Spawn", pPlayer )
set_hudmessage( 0, 0, 100, 0.80, 0.80, 0, 6.0, 2.0, 1.0, 1.0 );
show_hudmessage( pPlayer, "Ты купил барикаду^nЧто бы установить нажми Е");
}
return PLUGIN_HANDLED;
}
bool:IsHullVacant( const Float:vecSrc[3], iHull, pEntToSkip = 0 ) {
engfunc( EngFunc_TraceHull, vecSrc, vecSrc, DONT_IGNORE_MONSTERS, iHull, pEntToSkip, 0 );
return bool:( !get_tr2( 0, TR_AllSolid ) && !get_tr2( 0, TR_StartSolid ) && get_tr2( 0, TR_InOpen ) );
}
GetOriginAimEndEyes( ent, iDistance, Float:vecOut[3], Float:vecAngles[3] ) {
static Float:vecSrc[3], Float:vecEnd[3], Float:vecViewOfs[3], Float:vecVelocity[3];
static Float:flFraction;
pev( ent, pev_origin, vecSrc );
pev( ent, pev_view_ofs, vecViewOfs );
xs_vec_add( vecSrc, vecViewOfs, vecSrc );
velocity_by_aim( ent, iDistance, vecVelocity );
xs_vec_add( vecSrc, vecVelocity, vecEnd );
engfunc( EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, ent, 0 );
get_tr2(0, TR_flFraction, flFraction);
if (flFraction < 1.0)
{
static Float:vecPlaneNormal[3];
get_tr2(0, TR_PlaneNormal, vecPlaneNormal);
get_tr2(0, TR_vecEndPos, vecOut);
xs_vec_mul_scalar(vecPlaneNormal, 1.0, vecPlaneNormal);
xs_vec_add(vecOut, vecPlaneNormal, vecOut);
}
else
{
xs_vec_copy(vecEnd, vecOut);
}
vecVelocity[2] = 0.0;
vector_to_angle(vecVelocity, vecAngles);
}
FClassnameIs(Ent, const szClassName[]) {
if ( pev_valid( Ent ) != 2 )
return 0;
new szpClassName[ 32 ];
pev( Ent, pev_classname, szpClassName, charsmax( szpClassName ) );
return equal( szClassName, szpClassName );
}
stock remove_allpalletswbags() {
new pallets = -1;
while( ( pallets = fm_find_ent_by_class( pallets, Class_Name ) ) )
fm_remove_entity( pallets );
}
stock client_printcolor( pPlayer, iInput[], any:... ) {
new iCount = 1, Players[ 32 ]
static iMsg[ 191 ]
vformat( iMsg, 190, iInput, 3 )
replace_all( iMsg, 190, "!g", "^4" )
replace_all( iMsg, 190, "!y", "^1" )
replace_all( iMsg, 190, "!t", "^3" )
if( pPlayer ) Players[ 0 ] = pPlayer; else get_players( Players, iCount, "ch" )
{
for( new i = 0; i < iCount; i++ ) {
if( is_user_connected( Players[ i ] ) ) {
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, Players[ i ] )
write_byte( Players[ i ] )
write_string( iMsg )
message_end( )
}
}
}
}
Вложения
-
11.5 KB Просмотры: 3