Dispenser new

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
31
Реакции
-4
Помог
3 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Ошибка
ошибка снизу.
Компилятор
Локальный
Amx Mod X
1.10.0
Исходный код
/*
- Отключено:
1. Лечение дружеских строений
2. Возможность постройки более 1 раздатчика
3. Заморозка раздатчика на определенное время
4. Улучшение раздатчика до раздатчика денег
5. Эффект постройки раздатчика
6. Вознограждение за разрушение раздатчика
7. Работа с достижениями
- Можно изменить эффект раздатчика при пополнении здоровья
- Количество уровней можно регулировать в данный момент 4 уровня
- Изменен эффект взрыва раздатчика
- Добавлено меню раздатчика
- Разделен на VIP игроков и обычных:
1. Для VIP постройка дешевле
2. Для VIP улучшение дешевле
3. VIP могут прокачивать свой раздатчик сколько угодно
- Цвет луча лечения зеленого цвета
- При полном здоровье игрока луч пропадает
- Дружественные раздатчики могут лечить друг друга
- Раздатчик повернут в ту сторону, куда смотрит игрока
- Соотношение размеров учтено, можно забираться на раздатчик
- Уничтожение раздатчика подправлено
*/

#include < amxmodx >
#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < cstrike >
#include < engine >
#include < hamsandwich >
#include < xs >
#include < dhudmessage >
//#include <mission_inc>

#define BREAK_COMPUTER 6
#define MAX_PLAYERS 32 + 1

#define is_valid_player(%1) ( 1 <= %1 <= gMaxPlayers )

new const gDamageSounds[ ][ ] =
{
"debris/metal1.wav",
"debris/metal2.wav",
"debris/metal3.wav"
};

set_player_bonus(id, bonus) return 0 // native set_player_bonus(id, bonus)
// native get_sentry_team(ent)
get_bariga(id) return 0 //native get_bariga(id) - функция делалась для моего сервера
//native get_SentryLevel(ent)

new const gDispenserClassname[ ] = "NiceDispenser";
new const gDispenserActive[ ] = "disp_csdm/dispenser.wav";
new const gDispenserMdl[ ] = "models/new_dispkk.mdl";
new const gHealingSprite[ ] = "sprites/dispenser.spr";
new gSpr_regeneration
enum
{
x,
y,
z
}
new g_iSPR_Smoke3;
new gHealingBeam;
new gMaxPlayers;
new g_iPlayerDispenser[33]
new ExplSpr
new Float:flood_disptouch[33]
#define DISPENSER_COST 3000
#define DISPENSER_COST_VIP 2000
new const moneytraf[2] = {3000, 8000}
new const d_upgcost[4] = {3000,2000,2500,6000}
new const d_upgcost_vip[4] = {2000,1000,1500,4500}
new const d_enthp[4] = {3000,4500,6000,8000}
new const Float:d_radius[4] = {600.0,750.0,900.0,1100.0}
new const d_hp[4] = {100,200,300,400}
new const Float:g_HEALTHSS[5] = {3000.0, 4000.0, 5000.0, 6000.0, 7000.0}
new const d_ap[4] = {100,200,300,400}
new const Float:d_takehp[4] = {1.0,1.5,2.0,2.5}
new const Float:d_takehpabjects[4] = {1.0,2.0,3.0,4.0}
new const Float:d_takeap[4] = {1.0,1.5,2.0,2.5}
// new Float:gDispenserOrigin[ MAX_PLAYERS ][ 3 ];
new gBeamcolor[ MAX_PLAYERS ][ 3 ];
new bool:bDispenserBuild[ MAX_PLAYERS ];
new touchdisp[33]
//native dips_balanced(id, amount)
new Disp_balance[1000]
new dispFreez[1000]
new updatingdisp[1000]
public plugin_init( )
{
register_plugin( "Build Dispenser", "0.1", "pro100iweb" );

register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );
register_logevent( "LOG_RoundEnd", 2, "1=Round_End" );
register_event ( "Spectator", "ev_Spectation", "a" )
register_forward ( FM_TraceLine, "fw_TraceLine_Post", 1 )
RegisterHam( Ham_TakeDamage, "func_breakable", "bacon_TakeDamage", 1 );
RegisterHam( Ham_TakeDamage, "func_breakable", "bacon_TakeDamagePre", 0 );
register_think( gDispenserClassname, "DispenserThink" );
register_touch ( gDispenserClassname, "player", "fw_DispenserTouch" )
register_clcmd( "build_dispenser", "CommandDispenserBuild" );
//register_clcmd( "setf", "setf" );
//register_clcmd( "setddd", "show_updatemenu" );
register_clcmd( "say dispstats", "dispstats" );
register_clcmd( "detonate_dispenser", "disppp_menu" );
gMaxPlayers = get_maxplayers( );
}

/* public plugin_natives ()
{
register_native ( "set_freezDispenser", "nativeget_setfreezDispenser", 1)
}

public nativeget_setfreezDispenser(sentry)
{
if(dispFreez[sentry]) return 1
new iEntity = create_entity("info_target")
new Float: Origin[3]
entity_get_vector(sentry, EV_VEC_origin, Origin)
entity_set_string(iEntity, EV_SZ_classname, "Shield_Ent")
entity_set_vector(iEntity,EV_VEC_origin, Origin)
entity_set_model(iEntity, "models/great_sentries/PFG_BLOCKS.mdl")
set_pev(iEntity, pev_solid, SOLID_TRIGGER );
set_pev(iEntity, pev_body, 1);
set_pev(sentry,pev_euser4,iEntity)
set_task ( 15.0, "DelayRemoveFreezD", sentry+2000)
return dispFreez[sentry] = 1
}

public DelayRemoveFreezD(entoff){
new sentry = entoff-2000
new iceCub = pev(sentry,pev_euser4)
if(pev_valid(sentry)){
dispFreez[sentry] = 0
}
if(pev_valid(iceCub)){
remove_entity(iceCub)
}
} */

/* public setf(id){
cs_set_user_money(id, cs_get_user_money(id) + 1000)
} */

public DeleteEntity( entity ){
new iceCub = pev(entity,pev_euser4)
if(pev_valid(iceCub) && dispFreez[entity]){
remove_entity(iceCub)
set_pev(iceCub,pev_euser4, 0)
dispFreez[entity] = 0
}
iceCub = pev(entity,pev_euser3)
if(pev_valid(iceCub)){
remove_entity(iceCub)
set_pev(iceCub,pev_euser3, 0)
}
if(task_exists(entity+3000)){
remove_task(entity+3000)
}
if(task_exists(entity+2000)){
remove_task(entity+2000)
}
if(pev_valid(entity)){
remove_entity(entity)
}
}

public ev_Spectation ()
{
new id = read_data ( 1 )
BreakAllPlayerDispensers(id)
}

public show_updatemenu(id){
new szItem[128]
format(szItem, 127, "\wУстановить способность^nРаздатчик \rДенег \wHP \r%d", moneytraf[0])
new menu = menu_create(szItem,"touchdispc");
format(szItem, 127, "\r[\wДа \r%d\y$!\r]", moneytraf[1])
menu_additem( menu, szItem)
menu_additem( menu, "\r[\wНет\r]")
menu_display(id,menu)
return PLUGIN_HANDLED
}

public touchdispc(id, menu, key){
key++
menu_destroy(menu)
if(key==1){
if(!pev_valid(touchdisp[id]))
return;

if ( pev ( touchdisp[id], pev_iuser4 ) != _:cs_get_user_team ( id ) )
return;

if(cs_get_user_money(id)<moneytraf[1])
return;

cs_set_user_money(id,cs_get_user_money(id)-moneytraf[1]);
//set_bankmoney(id,moneytraf[1])
set_pev( touchdisp[id], pev_health, float(moneytraf[0]) );
set_pev( touchdisp[id], pev_iuser1, 1 );
} else {
return
}
}

public disppp_menu(id)
{
if(g_iPlayerDispenser[id] == 0){
ChatColor ( id, "^4У тебя нет раздатчика")
return HAM_IGNORED
}

new szItem[128];
new szItem1[128];
new msentry_item = menu_create("\yВыберите раздатчик!", "cl_mendisp")
static ent = -1
while ((ent = find_ent_by_class(ent, gDispenserClassname)))
{
if( pev( ent, pev_iuser2) != id) continue;

if(pev_valid(ent))
{
new iLevel = pev ( ent, pev_iuser3 )
new iHealth = pev ( ent, pev_health )
format(szItem, 127, "%d", ent)
format(szItem1, 127, "\wID \r%d \w| уровень \r%d \w[HP \y%d\w]", ent, iLevel, iHealth)
menu_additem( msentry_item, szItem1, szItem, 0)
}
}

menu_setprop(msentry_item, MPROP_EXIT, MEXIT_ALL)
menu_setprop(msentry_item, MPROP_EXITNAME, "\yВыход")
menu_display(id, msentry_item, 0)

return PLUGIN_HANDLED
}

public cl_mendisp(id, menu, item) {
new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)
menu_destroy(menu)
if(i_Key == 0) return 0
if ( !is_valid_ent ( i_Key ) ) return 0
touchdisp[id] = i_Key
disp_menu_func(id)
return 1
}

public disp_menu_func(id)
{
if(g_iPlayerDispenser[id] == 0){
ChatColor ( id, "^4У тебя нет раздатчика")
return HAM_IGNORED
}
new szItem[128];
new szItem1[128];
new ent = touchdisp[id];
if(ent==0) return PLUGIN_HANDLED
new msentry_item = menu_create("\yЧто делать с раздатчиком?!", "cl_mend");
if(pev_valid(ent))
{
new iLevel = pev ( ent, pev_iuser3 )
new iHealth = pev ( ent, pev_health )
format(szItem, 127, "%d", ent)
menu_additem( msentry_item, "\wУничтожить")
//menu_additem( msentry_item, "\wУлучшить до раздатчика денег")
//menu_additem( msentry_item, "\wПоложить в раздатчик 10000$ НДС \r1000\y$")
menu_addblank( msentry_item, 0)
menu_addblank( msentry_item, 0)
menu_addblank( msentry_item, 0)
format(szItem1, 127, "\wID \r%d", ent)
menu_addtext( msentry_item, szItem1)
format(szItem1, 127, "Уровень \r%d", iLevel)
menu_addtext( msentry_item, szItem1)
format(szItem1, 127, "\w[HP \y%d\w]", iHealth)
menu_addtext( msentry_item, szItem1)
}
menu_setprop(msentry_item, MPROP_EXIT, MEXIT_ALL)
menu_setprop(msentry_item, MPROP_EXITNAME, "\yВыход")
menu_display(id, msentry_item, 0)
return PLUGIN_HANDLED
}

public cl_mend(id, menu, item) {
item++
new ent = touchdisp[id]
new iLevel = pev ( ent, pev_iuser3 )
menu_destroy(menu)
if(item == 0) return 0
if(pev_valid(ent)){
switch(item){
case 1:{
if ( !is_valid_ent ( ent ) ) return 0
DeleteEntity( ent )
g_iPlayerDispenser[ id ]--;
if(g_iPlayerDispenser[ id ] == 0)
bDispenserBuild[ id ] = false;
}
case 2:{
if ( !is_valid_ent ( ent ) )
return 0;

if ( iLevel != 4 ){
ChatColor ( id, "^1Только на 4 уровне!");
return 0;
}

if ( pev ( ent, pev_iuser4 ) != _:cs_get_user_team ( id ) )
return 0;

if(cs_get_user_money(id)<moneytraf[1]){
ChatColor ( id, "^1Не достаточно средств! Стоимость %d", moneytraf[1]);
return 0;
}

cs_set_user_money(id,cs_get_user_money(id)-moneytraf[1]);
//set_bankmoney(id,moneytraf[1])
set_pev( ent, pev_health, float(moneytraf[0]) );
set_pev( ent, pev_iuser1, 1 );
}
case 3:{
if(cs_get_user_money(id)<11000)
return 0;

cs_set_user_money(id,cs_get_user_money(id)-11000);
//set_bankmoney(id,11000)
//set_pev( ent, pev_fuser1, 10000.0 );
Disp_balance[ent] = 10000;
}
}
}
return 1
}

public dispstats(id)
{
ChatColor ( id, "^1У вас [ ^4%d ^1] раздатчик(ов)!", g_iPlayerDispenser[id])
}

public client_connect( id )
{
bDispenserBuild[ id ] = false;
g_iPlayerDispenser[id] = 0
}

public client_disconnect( id )
{
BreakAllPlayerDispensers(id)
g_iPlayerDispenser[id] = 0
}

public plugin_precache( )
{
gHealingBeam = precache_model( gHealingSprite );
g_iSPR_Smoke3 = precache_model("sprites/black_smoke4.spr")
precache_model( gDispenserMdl );
precache_sound( gDispenserActive );
gSpr_regeneration = precache_model("sprites/th_jctf_heal.spr")
new i;
for( i = 0; i < sizeof gDamageSounds; i++ )
{
precache_sound( gDamageSounds[ i ] );
}
ExplSpr = precache_model("sprites/gp_1.spr");
// precache_model("models/great_sentries/PFG_BLOCKS.mdl")
// precache_model("models/great_sentries/PFG_SENTRIES_OLD2.mdl")
}

public fw_TraceLine_Post ( Float:v1[3], Float:v2[3], noMonsters, id )
{
if ( !is_valid_player ( id ) || is_user_bot ( id ) || !is_user_alive ( id ) )
return FMRES_IGNORED

new iHitEnt = get_tr ( TR_pHit )

if ( iHitEnt <= gMaxPlayers || !pev_valid ( iHitEnt ) )
return FMRES_IGNORED

new sClassname[32]
pev ( iHitEnt, pev_classname, sClassname, charsmax ( sClassname ) )

if ( !equal ( sClassname, gDispenserClassname ) )
return FMRES_IGNORED

new iTeam = pev ( iHitEnt, pev_iuser4 )

if ( _:cs_get_user_team ( id ) != iTeam )
return FMRES_IGNORED

new iHealth = pev ( iHitEnt, pev_health )

if ( iHealth <= 0 )
return FMRES_IGNORED

new iOwner = pev ( iHitEnt, pev_iuser2 )

if ( !is_user_connected ( iOwner ) )
return FMRES_IGNORED

new sName[33]
get_user_name ( iOwner, sName, charsmax ( sName ) )
new iLevel = pev ( iHitEnt, pev_iuser3 )

set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:", sName, iHitEnt, iHealth, d_enthp[iLevel-1], iLevel )
set_dhudmessage ( 255, 0, 0, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "^n^n OFF")
/* switch(pev( iHitEnt, pev_iuser1)){
case 0:{
set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:", sName, iHitEnt, iHealth, d_enthp[iLevel-1], iLevel )
set_dhudmessage ( 255, 0, 0, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "^n^n OFF")
}
case 1:{
set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:^nОбъем: %d", sName, iHitEnt, iHealth, moneytraf[0], iLevel, Disp_balance[iHitEnt] )
set_dhudmessage ( 0, 0, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
show_dhudmessage ( id, "^n^n ON")
}
} */

return FMRES_IGNORED
}
public bacon_TakeDamagePre( ent, idinflictor, idattacker, Float:damage, damagebits )
{
new szClassname[ 32 ];
pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
if(updatingdisp[ent])
return HAM_SUPERCEDE

new iOwner = pev( ent, pev_iuser2 );
if(!is_user_connected(iOwner) || 1 > iOwner > 32 || !is_user_connected(idattacker) || 1 > idattacker > 32)
return HAM_SUPERCEDE

if(cs_get_user_team(iOwner)==cs_get_user_team(idattacker) && idattacker != iOwner)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}

public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
{
if ( !pev_valid ( ent ) )
return HAM_IGNORED

new szClassname[ 32 ];
pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

if( equal( szClassname, gDispenserClassname ) )
{
if(updatingdisp[ent])
return HAM_SUPERCEDE

new iOwner = pev( ent, pev_iuser2 );
if(!is_user_connected(iOwner) || 1 > iOwner > 32 || !is_user_connected(idattacker) || 1 > idattacker > 32)
return HAM_SUPERCEDE

if(cs_get_user_team(iOwner)==cs_get_user_team(idattacker) && idattacker != iOwner)
return HAM_SUPERCEDE

if( pev( ent, pev_health ) <= 0.0 )
{
new szName[ 32 ];
get_user_name( idattacker, szName, charsmax( szName ) );
if( idattacker == iOwner )
{
ChatColor ( iOwner, "^3[^4Действие^3]^1 Вы уничтожили собственный раздатчик!")
} else {
ChatColor ( iOwner, "^3[^4Действие^3]^1 %s уничтожил ваш раздатчик!", szName)
ChatColor ( idattacker, "^3[^4Раздатчик^3]^1 Вам начислено 15 бонусов!", szName)
/*код достижения*/
/* if(get_player_type(idattacker) == 1){
if(get_kill_disp(idattacker) == 0){
if(get_player_expmm(idattacker) < 300){
set_player_expmm(idattacker, 1);
if(get_player_expmm(idattacker) >= 300){
set_kill_disp(idattacker, 1);
set_player_type(idattacker, 0)
}
} else if(get_player_expmm(idattacker) >= 300){
set_kill_disp(idattacker, 1);
set_player_type(idattacker, 0)
}
}
} */
/*код достижения*/
}
}
emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
return HAM_IGNORED
}

stock create_explosion(Float:origin_[3]) {
new origin[3]
FVecIVec(origin_, origin)

message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0})
write_byte(TE_SPRITETRAIL) //Спрайт захвата
write_coord((origin[0]))
write_coord((origin[1]))
write_coord((origin[2])+20)
write_coord((origin[0]))
write_coord((origin[1]))
write_coord((origin[2])+80)
write_short(ExplSpr)
write_byte(20)
write_byte(20)
write_byte(4)
write_byte(20)
write_byte(10)
message_end()
}

public CommandDispenserBuild( id )
{
if( !is_user_alive( id ) )
{
return PLUGIN_CONTINUE;
}

if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
{
ChatColor ( id, "^3[^4Информация^3]^1 Вы можете построить раздатчик только на земле!")
return PLUGIN_HANDLED;
}

if ( g_iPlayerDispenser[id] == 2 && get_bariga(id))
{
ChatColor ( id, "^3[^4Информация^3]^1 Вы уже построили 2 раздатчика!")
return PLUGIN_HANDLED;
} else if(!get_bariga(id)){
if( bDispenserBuild[ id ] == true )
{
ChatColor ( id, "^3[^4Информация^3]^1 Вы уже построили раздатчик!")
return PLUGIN_HANDLED;
}
}

new iMoney = cs_get_user_money( id );

if (get_user_flags(id) & ADMIN_LEVEL_B)
{
if( iMoney < d_upgcost_vip[0] )
{
ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost_vip[0] )
return PLUGIN_HANDLED;
}
}
else
{
if( iMoney < d_upgcost[0] )
{
ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost[0] )
return PLUGIN_HANDLED;
}
}
new Float:playerOrigin[3]
entity_get_vector(id, EV_VEC_origin, playerOrigin)

new Float:vNewOrigin[3]
new Float:vTraceDirection[3]
new Float:vTraceEnd[3]
new Float:vTraceResult[3]
velocity_by_aim(id, 64, vTraceDirection) // get a velocity in the directino player is aiming, with a multiplier of 64...
vTraceEnd[0] = vTraceDirection[0] + playerOrigin[0] // find the new max end position
vTraceEnd[1] = vTraceDirection[1] + playerOrigin[1]
vTraceEnd[2] = vTraceDirection[2] + playerOrigin[2]
trace_line(id, playerOrigin, vTraceEnd, vTraceResult) // trace, something can be in the way, use hitpoint from vTraceResult as new origin, if nothing's in the way it should be same as vTraceEnd
vNewOrigin[0] = vTraceResult[0]// just copy the new result position to new origin
vNewOrigin[1] = vTraceResult[1]// just copy the new result position to new origin
vNewOrigin[2] = playerOrigin[2] // always build in the same height as player.

if (CreateDispanser(vNewOrigin, id))
{
if (get_user_flags(id) & ADMIN_LEVEL_B)
{
cs_set_user_money(id, cs_get_user_money(id) - d_upgcost_vip[0])
//set_bankmoney(id,d_upgcost_vip[0])
g_iPlayerDispenser[id]++
}
else
{
cs_set_user_money(id, cs_get_user_money(id) - d_upgcost[0])
//set_bankmoney(id,d_upgcost[0])
g_iPlayerDispenser[id]++
}
}
else
{
ChatColor ( id, "^3[^4Информация^3]^1 Здесь не получается установить раздатчик!")
}
return PLUGIN_HANDLED;
}


stock bool:CreateDispanser(Float:origin[3], creator)
{
if (point_contents(origin) != CONTENTS_EMPTY || TraceCheckCollides(origin, 35.0))
{
return false
}

new Float:hitPoint[3], Float:originDown[3]
originDown = origin
originDown[2] = -5000.0 // dunno the lowest possible height...
trace_line(0, origin, originDown, hitPoint)
new Float:baDistanceFromGround = vector_distance(origin, hitPoint)

new Float:difference = 20.0 - baDistanceFromGround
if (difference < -1 * 20.0 || difference > 20.0) return false

new iEntity = create_entity( "func_breakable" );

if( !pev_valid( iEntity ) )
return false

set_pev( iEntity, pev_classname, gDispenserClassname );
new Float:flAngles[ 3 ];
new Float:flAnglesF[ 3 ];
pev( creator, pev_angles, flAngles );
pev( iEntity, pev_angles, flAnglesF );
flAnglesF[1] = flAngles[1]+90.0
set_pev( iEntity, pev_angles, flAnglesF );
engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
engfunc( EngFunc_SetSize, iEntity, Float:{ -20.0, -10.0, 0.0 }, Float:{ 20.0, 10.0, 50.0 } );
set_pev( iEntity, pev_origin, origin );
set_pev( iEntity, pev_solid, SOLID_BBOX );
set_pev( iEntity, pev_movetype, MOVETYPE_FLY );
set_pev( iEntity, pev_health, float(d_enthp[0]) );
set_pev( iEntity, pev_takedamage, 2.0 );
set_pev( iEntity, pev_iuser1, 0 );
//set_pev( iEntity, pev_fuser1, float(moneytraf[1]) );
Disp_balance[iEntity] = 1000;
set_pev( iEntity, pev_iuser2, creator );
set_pev( iEntity, pev_iuser3, 1 );
set_pev( iEntity, pev_iuser4, get_user_team(creator) );
set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 );
engfunc( EngFunc_DropToFloor, iEntity );
dispFreez[iEntity] = 0
updatingdisp[iEntity] = 0

// gDispenserOrigin[ creator ][ 0 ] = origin[ 0 ];
// gDispenserOrigin[ creator ][ 1 ] = origin[ 1 ];
// gDispenserOrigin[ creator ][ 2 ] = origin[ 2 ];

bDispenserBuild[ creator ] = true;

switch( cs_get_user_team( creator ) )
{
case CS_TEAM_T:
{
gBeamcolor[ creator ][ 0 ] = 0, gBeamcolor[ creator ][ 1 ] = 255, gBeamcolor[ creator ][ 2 ] = 0;
set_pev(iEntity, pev_body, 4);
}

case CS_TEAM_CT:
{
gBeamcolor[ creator ][ 0 ] = 0, gBeamcolor[ creator ][ 1 ] = 255, gBeamcolor[ creator ][ 2 ] = 0;
set_pev(iEntity, pev_body, 0);
}
}

emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

return true;
}

public DispenserThink( iEnt )
{
if( pev_valid( iEnt ) )
{
static iOwner; iOwner = pev( iEnt, pev_iuser2 )
if(get_user_team(iOwner) != pev( iEnt, pev_iuser4)){
BreakAllPlayerDispensers(iOwner)
return PLUGIN_CONTINUE
}
if ( !is_user_connected ( iOwner ) )
return PLUGIN_CONTINUE

if( pev( iEnt, pev_health ) <= 0.0 )
{
new Float:origin[3]
entity_get_vector(iEnt, EV_VEC_origin, origin)
DeleteEntity( iEnt )
create_explosion(origin)
g_iPlayerDispenser[iOwner]--
client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
if(g_iPlayerDispenser[iOwner]==0)
bDispenserBuild[ iOwner ] = false;
return PLUGIN_CONTINUE
}

new id, iLevel = pev ( iEnt, pev_iuser3 )
new Float:fRadius = d_radius[iLevel-1]
new Float:origin[ 3 ];
pev( iEnt, pev_origin, origin );
if(!dispFreez[iEnt]){
for( id = 1; id <= gMaxPlayers; id++ )
{
if( !is_user_bot(id) && is_user_connected ( id ) && is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ))
{
new Float:flOrigin[ 3 ];
pev( id, pev_origin, flOrigin );
if( get_distance_f( origin, flOrigin ) <= floatround(fRadius))
{
//if( UTIL_IsVisible( id, iEnt ) && ((cs_get_user_money(id) < 100000 && iOwner == id && Disp_balance[iEnt]>0) || pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]))
if( UTIL_IsVisible( id, iEnt ) && (pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]))
{
if( pev(id, pev_health) < d_hp[iLevel - 1] )
{
set_pev(id, pev_health, floatmin(pev(id, pev_health) + d_takehp[iLevel-1], float(d_hp[iLevel - 1])) );
//if(pev( iEnt, pev_iuser1)==1) cs_set_user_money(id, cs_get_user_money(id) - 1 );
}
if( pev(id, pev_armorvalue) < d_ap[iLevel - 1] )
{
set_pev(id, pev_armorvalue, floatmin(pev(id, pev_armorvalue) + d_takeap[iLevel-1], float(d_ap[iLevel - 1])) );
//if(pev( iEnt, pev_iuser1)==1) cs_set_user_money(id, cs_get_user_money(id) - 1 );
}
/* if(cs_get_user_money(id)>0 && pev( iEnt, pev_iuser1)==1 && iOwner != id){
Disp_balance[iEnt]+=1
dips_balanced(id, 1)
} else if( cs_get_user_money(id) < 100000 && Disp_balance[iEnt] > 0 && pev( iEnt, pev_iuser1)==1 && iOwner == id)
{
cs_set_user_money(id, cs_get_user_money(id) + 1 );
//set_pev( iEnt, pev_fuser1, pev( iEnt, pev_fuser1) - 1.0 );
Disp_balance[iEnt]-=1
dips_balanced(id, -1)
} else if( pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]){ if(pev( iEnt, pev_iuser1)==1 && iOwner != id) cs_set_user_money(id, cs_get_user_money(id) - 1 );}
*/
//player_healingEffect(id)
new bool:BigBeam = pev(id, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(id, pev_health) < float(d_hp[iLevel - 1]) ? true : false
UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
}
}
}
}
new ent = -1, sClassName[32]
while ( ( ent = engfunc ( EngFunc_FindEntityInSphere, ent, origin, fRadius ) ) != 0 ) {
pev ( ent, pev_classname, sClassName, charsmax ( sClassName ) )
if(pev_valid(ent)){
new Float:flOrigin[ 3 ];
pev( ent, pev_origin, flOrigin );
if(equal(sClassName,gDispenserClassname)){
if(get_user_team(iOwner) == pev( ent, pev_iuser4)){
if(ent != iEnt){
flOrigin[2]+=20.0
if( UTIL_IsVisible( ent, iEnt ) && pev(ent, pev_health) < d_enthp[pev(ent, pev_iuser3)-1])
{
set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
}
}
}
} /*else if(equal(sClassName,"lasermine")){
if( UTIL_IsVisible( ent, iEnt ) && pev(ent, pev_health) < 400)
{
set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
}
} else if(equal(sClassName,"sentry")){
if(cs_get_user_team(iOwner)==get_sentry_team(ent)){
if(pev(ent, pev_health)<g_HEALTHSS[get_SentryLevel(ent)]){
if(UTIL_IsVisible(ent,iEnt))
{
set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
}
}
}
} */
}
}
}
new Float:entorigin[3]
pev( iEnt, pev_origin, entorigin )
new HP = pev ( iEnt, pev_health )
if(HP<=600.0){
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_SMOKE)
engfunc(EngFunc_WriteCoord, entorigin[0]+random_float(-8.0, 8.0))
engfunc(EngFunc_WriteCoord, entorigin[1]+random_float(-8.0, 8.0))
engfunc(EngFunc_WriteCoord, entorigin[2]+random_float(25.0, 35.0))
write_short(g_iSPR_Smoke3)
write_byte(random_num(3,7))
write_byte(30)
message_end()
}
if(get_user_team(iOwner) != pev( iEnt, pev_iuser4))
{
BreakAllPlayerDispensers(iOwner);
g_iPlayerDispenser[id] = 0
return PLUGIN_CONTINUE;
}
set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 );
}
return PLUGIN_CONTINUE;
}
// updatingdisp[ent]
public fw_DispenserTouch ( ent, id )
{
if(updatingdisp[ent])
return

new iLevel = pev ( ent, pev_iuser3 );
static Float:time;time=get_gametime()
if(flood_disptouch[id] > time)
return

flood_disptouch[id] = time+2.0

if ( !pev_valid ( ent ) )
return

if ( !is_user_connected ( id ) || !is_user_alive ( id ) )
return

if ( pev ( ent, pev_iuser4 ) != _:cs_get_user_team ( id ) )
return

// if ( iLevel == 4 && pev( ent, pev_iuser1) == 0){
// touchdisp[id] = ent
// show_updatemenu(id)
// return
// }

if(iLevel == 4)
return

new iOwner = pev ( ent, pev_iuser2 )
new money = cs_get_user_money ( id )
if (get_user_flags(id) & ADMIN_LEVEL_B && money < d_upgcost_vip[iLevel])
{
ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost_vip[iLevel] )
return;
}
else if( money < d_upgcost[iLevel] )
{
ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost[iLevel] )
return;
}

if ( !is_user_connected ( iOwner ) )
return

if (get_user_flags(id) & ADMIN_LEVEL_B)
{
cs_set_user_money(id, money - d_upgcost_vip[iLevel-1])
//set_bankmoney(id,d_upgcost_vip[iLevel-1])
}
else
{
cs_set_user_money(id, money - d_upgcost[iLevel-1])
//set_bankmoney(id,d_upgcost[iLevel-1])
}

new sUpgraderName[32]
get_user_name ( id, sUpgraderName, charsmax ( sUpgraderName ) )
client_print ( iOwner, print_center, "%s прокачал твой раздатчик", sUpgraderName )
set_player_bonus(id, 15)
gBeamcolor[ id ][ 0 ] = 0, gBeamcolor[ id ][ 1 ] = 255, gBeamcolor[ id ][ 2 ] = 0;
/*код достижения*/
/* if(iOwner != id){
if(get_player_type(id) == 2){
if(get_upd_disp(id) == 0){
if(get_player_expmm(id) < 650){
set_player_expmm(id, 1);
if(get_player_expmm(id) >= 650){
set_upd_disp(id, 1);
set_player_type(id, 0)
}
} else if(get_player_expmm(id) >= 650){
set_upd_disp(id, 1);
set_player_type(id, 0)
}
}
}
} */
/*код достижения*/
updatingdisp[ent] = 1
/* new iEntity = create_entity("info_target")
new Float: Origin[3]
entity_get_vector(ent, EV_VEC_origin, Origin)
Origin[0]-=30.0
Origin[1]+=5.0
Origin[2]+=70.0
entity_set_string(iEntity, EV_SZ_classname, "Shield_Ent")
entity_set_vector(iEntity,EV_VEC_origin, Origin)
entity_set_model(iEntity, "models/great_sentries/PFG_SENTRIES_OLD2.mdl")
set_pev(iEntity, pev_solid, SOLID_TRIGGER );
set_pev(iEntity, pev_body, 8);
set_pev(iEntity, pev_sequence, 9)
set_pev(iEntity, pev_framerate, 1.0)
switch( pev ( ent, pev_iuser4 ) )
{
case CS_TEAM_T:
{
set_pev(iEntity, pev_skin, 3);
}
case CS_TEAM_CT:
{
set_pev(iEntity, pev_skin, 2);
}
}
set_pev(ent,pev_euser3,iEntity) */
fw_DispenserTouchTwo(ent+3000)
//set_task ( 3.0, "fw_DispenserTouchTwo",ent+3000)
}

public fw_DispenserTouchTwo (entoff){
new ent = entoff-3000
/* new iceCub = pev(ent,pev_euser3)
if(pev_valid(iceCub)){
remove_entity(iceCub)
set_pev(ent,pev_euser3, 0)
} */
new iLevel = pev ( ent, pev_iuser3 );
iLevel++
set_pev ( ent, pev_iuser3, iLevel )
set_pev ( ent, pev_health, float ( d_enthp[iLevel-1] ) )
engfunc( EngFunc_SetModel, ent, gDispenserMdl )
engfunc( EngFunc_SetSize, ent, Float:{ -20.0, -10.0, 0.0 }, Float:{ 20.0, 10.0, 50.0 } )
emit_sound( ent, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
switch( pev ( ent, pev_iuser4 ) )
{
case CS_TEAM_T:
{
switch(iLevel)
{
case 2: set_pev(ent, pev_body, 5);
case 3: set_pev(ent, pev_body, 6);
case 4: set_pev(ent, pev_body, 7);
}
}
case CS_TEAM_CT:
{
switch(iLevel)
{
case 2: set_pev(ent, pev_body, 1);
case 3: set_pev(ent, pev_body, 2);
case 4: set_pev(ent, pev_body, 3);
}
}
}

updatingdisp[ent] = 0
}

public EVENT_TextMsg( )
{
UTIL_DestroyDispensers( );
}

public LOG_RoundEnd( )
{
UTIL_DestroyDispensers( );
}

stock UTIL_DestroyDispensers( )
{
new iEnt = FM_NULLENT;

while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
{
if(is_valid_ent ( iEnt )){
new iOwner = pev( iEnt, pev_iuser2 );
bDispenserBuild[ iOwner ] = false;
g_iPlayerDispenser[ iOwner ]--;
DeleteEntity( iEnt )
}
}
}

stock UTIL_BeamEnts( Float:flStart[ 3 ], Float:flEnd[ 3 ], r, g, b, sprite, width, ampl )
{
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flStart );
write_byte( TE_BEAMPOINTS );
engfunc( EngFunc_WriteCoord, flStart[ 0 ] );
engfunc( EngFunc_WriteCoord, flStart[ 1 ] );
engfunc( EngFunc_WriteCoord, flStart[ 2 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 0 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 1 ] );
engfunc( EngFunc_WriteCoord, flEnd[ 2 ] );
write_short( sprite );
write_byte( 5 );
write_byte( 2 );
write_byte( 1 );
write_byte( width );
write_byte( ampl );
write_byte( r );
write_byte( g );
write_byte( b );
write_byte( 130 );
write_byte( 30 );
message_end( );
}

stock bool:UTIL_IsVisible( index, entity, ignoremonsters = 0 )
{
new Float:flStart[ 3 ], Float:flDest[ 3 ];
pev( index, pev_origin, flStart );
pev( index, pev_view_ofs, flDest );

xs_vec_add( flStart, flDest, flStart );

pev( entity, pev_origin, flDest );
engfunc( EngFunc_TraceLine, flStart, flDest, ignoremonsters, index, 0 );

new Float:flFraction;
get_tr2( 0, TR_flFraction, flFraction );

if( flFraction == 1.0 || get_tr2( 0, TR_pHit) == entity )
{
return true;
}

return false;
}

public BreakAllPlayerDispensers(id)
{
static ent = -1
while ((ent = find_ent_by_class(ent, gDispenserClassname)))
{
if(pev( ent, pev_iuser2 ) != id)
continue

if(pev_valid(ent))
{
DeleteEntity( ent )
//set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );
}
}
bDispenserBuild[ id ] = false;
g_iPlayerDispenser[ id ] = 0;
}


bool:TraceCheckCollides(Float:origin[3], const Float:BOUNDS)
{
new Float:traceEnds[8][3], Float:traceHit[3], hitEnt
traceEnds[0][0] = origin[0] - BOUNDS
traceEnds[0][1] = origin[1] - BOUNDS
traceEnds[0][2] = origin[2] - BOUNDS
traceEnds[1][0] = origin[0] - BOUNDS
traceEnds[1][1] = origin[1] - BOUNDS
traceEnds[1][2] = origin[2] + BOUNDS
traceEnds[2][0] = origin[0] + BOUNDS
traceEnds[2][1] = origin[1] - BOUNDS
traceEnds[2][2] = origin[2] + BOUNDS
traceEnds[3][0] = origin[0] + BOUNDS
traceEnds[3][1] = origin[1] - BOUNDS
traceEnds[3][2] = origin[2] - BOUNDS
traceEnds[4][0] = origin[0] - BOUNDS
traceEnds[4][1] = origin[1] + BOUNDS
traceEnds[4][2] = origin[2] - BOUNDS
traceEnds[5][0] = origin[0] - BOUNDS
traceEnds[5][1] = origin[1] + BOUNDS
traceEnds[5][2] = origin[2] + BOUNDS
traceEnds[6][0] = origin[0] + BOUNDS
traceEnds[6][1] = origin[1] + BOUNDS
traceEnds[6][2] = origin[2] + BOUNDS
traceEnds[7][0] = origin[0] + BOUNDS
traceEnds[7][1] = origin[1] + BOUNDS
traceEnds[7][2] = origin[2] - BOUNDS

for (new i = 0; i < 8; i++)
{
if (point_contents(traceEnds[i]) != CONTENTS_EMPTY)
return true

hitEnt = trace_line(0, origin, traceEnds[i], traceHit)
if (hitEnt != 0)
return true
for (new j = 0; j < 3; j++)
{
if (traceEnds[i][j] != traceHit[j])
return true
}
}

return false
}

stock ChatColor(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)

replace_all(msg, 190, "!g", "^4") // Green Color
replace_all(msg, 190, "!y", "^1") // Default Color
replace_all(msg, 190, "!team", "^3") // Team Color
replace_all(msg, 190, "!team2", "^0") // Team2 Color

if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}

player_healingEffect(id)
{
new iOrigin[3]

get_user_origin(id, iOrigin)

message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
write_byte(TE_PROJECTILE)
write_coord(iOrigin[x] + random_num(-10, 10))
write_coord(iOrigin[y] + random_num(-10, 10))
write_coord(iOrigin[z] + random_num(0, 30))
write_coord(0)
write_coord(0)
write_coord(15)
write_short(gSpr_regeneration)
write_byte(1)
write_byte(id)
message_end()
}
ошибка на скрине, можете исправить ошибки? заранее благодарю.
1519388216792.png



Код:
/*
- Отключено:
1. Лечение дружеских строений
2. Возможность постройки более 1 раздатчика
3. Заморозка раздатчика на определенное время
4. Улучшение раздатчика до раздатчика денег
5. Эффект постройки раздатчика
6. Вознограждение за разрушение раздатчика
7. Работа с достижениями
- Можно изменить эффект раздатчика при пополнении здоровья
- Количество уровней можно регулировать в данный момент 4 уровня
- Изменен эффект взрыва раздатчика
- Добавлено меню раздатчика
- Разделен на VIP игроков и обычных:
1. Для VIP постройка дешевле
2. Для VIP улучшение дешевле
3. VIP могут прокачивать свой раздатчик сколько угодно
- Цвет луча лечения зеленого цвета
- При полном здоровье игрока луч пропадает
- Дружественные раздатчики могут лечить друг друга
- Раздатчик повернут в ту сторону, куда смотрит игрока
- Соотношение размеров учтено, можно забираться на раздатчик
- Уничтожение раздатчика подправлено
*/

#include < amxmodx >
#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < cstrike >
#include < engine >
#include < hamsandwich >
#include < xs >
#include < dhudmessage >
//#include <mission_inc>

#define BREAK_COMPUTER 6
#define MAX_PLAYERS 32 + 1

#define is_valid_player(%1) ( 1 <= %1 <= gMaxPlayers )

new const gDamageSounds[ ][ ] =
{
    "debris/metal1.wav",
    "debris/metal2.wav",
    "debris/metal3.wav"
};

set_player_bonus(id, bonus) return 0 // native set_player_bonus(id, bonus)
// native get_sentry_team(ent)
get_bariga(id) return 0 //native get_bariga(id) - функция делалась для моего сервера
//native get_SentryLevel(ent)

new const gDispenserClassname[ ] = "NiceDispenser";
new const gDispenserActive[ ] = "disp_csdm/dispenser.wav";
new const gDispenserMdl[ ] = "models/new_dispkk.mdl";
new const gHealingSprite[ ] = "sprites/dispenser.spr";
new gSpr_regeneration
enum
{
    x,
    y,
    z
}
new g_iSPR_Smoke3;
new gHealingBeam;
new gMaxPlayers;
new g_iPlayerDispenser[33]
new ExplSpr
new Float:flood_disptouch[33]
#define DISPENSER_COST 3000
#define DISPENSER_COST_VIP 2000
new const moneytraf[2] = {3000, 8000}
new const d_upgcost[4] = {3000,2000,2500,6000}
new const d_upgcost_vip[4] = {2000,1000,1500,4500}
new const d_enthp[4] = {3000,4500,6000,8000}
new const Float:d_radius[4] = {600.0,750.0,900.0,1100.0}
new const d_hp[4] = {100,200,300,400}
new const Float:g_HEALTHSS[5] = {3000.0, 4000.0, 5000.0, 6000.0, 7000.0}
new const d_ap[4] = {100,200,300,400}
new const Float:d_takehp[4] = {1.0,1.5,2.0,2.5}
new const Float:d_takehpabjects[4] = {1.0,2.0,3.0,4.0}
new const Float:d_takeap[4] = {1.0,1.5,2.0,2.5}
// new Float:gDispenserOrigin[ MAX_PLAYERS ][ 3 ];
new gBeamcolor[ MAX_PLAYERS ][ 3 ];
new bool:bDispenserBuild[ MAX_PLAYERS ];
new touchdisp[33]
//native dips_balanced(id, amount)
new Disp_balance[1000]
new dispFreez[1000]
new updatingdisp[1000]
public plugin_init( )
{
    register_plugin( "Build Dispenser", "0.1", "pro100iweb" );

    register_event( "TextMsg", "EVENT_TextMsg", "a", "2&#Game_C", "2&#Game_w", "2&#Game_will_restart_in" );
    register_logevent( "LOG_RoundEnd", 2, "1=Round_End" );
    register_event ( "Spectator", "ev_Spectation", "a" )
    register_forward ( FM_TraceLine, "fw_TraceLine_Post", 1 )
    RegisterHam( Ham_TakeDamage, "func_breakable", "bacon_TakeDamage", 1 );
    RegisterHam( Ham_TakeDamage, "func_breakable", "bacon_TakeDamagePre", 0 );
    register_think( gDispenserClassname, "DispenserThink" );
    register_touch ( gDispenserClassname, "player", "fw_DispenserTouch" )
    register_clcmd( "build_dispenser", "CommandDispenserBuild" );
    //register_clcmd( "setf", "setf" );
    //register_clcmd( "setddd", "show_updatemenu" );
    register_clcmd( "say dispstats", "dispstats" );
    register_clcmd( "detonate_dispenser", "disppp_menu" );
    gMaxPlayers = get_maxplayers( );
}

/* public plugin_natives ()
{
    register_native ( "set_freezDispenser", "nativeget_setfreezDispenser", 1)
}

public nativeget_setfreezDispenser(sentry)
{
    if(dispFreez[sentry]) return 1
    new iEntity = create_entity("info_target")
    new Float: Origin[3]
    entity_get_vector(sentry, EV_VEC_origin, Origin)
    entity_set_string(iEntity, EV_SZ_classname, "Shield_Ent")
    entity_set_vector(iEntity,EV_VEC_origin, Origin)
    entity_set_model(iEntity, "models/great_sentries/PFG_BLOCKS.mdl")
    set_pev(iEntity, pev_solid, SOLID_TRIGGER );
    set_pev(iEntity, pev_body, 1);
    set_pev(sentry,pev_euser4,iEntity)
    set_task ( 15.0, "DelayRemoveFreezD", sentry+2000)
    return dispFreez[sentry] = 1
}

public DelayRemoveFreezD(entoff){
    new sentry = entoff-2000
    new iceCub = pev(sentry,pev_euser4)
    if(pev_valid(sentry)){
        dispFreez[sentry] = 0
    }
    if(pev_valid(iceCub)){
        remove_entity(iceCub)
    }
} */

/* public setf(id){
    cs_set_user_money(id, cs_get_user_money(id) + 1000)
} */

public DeleteEntity( entity ){
    new iceCub = pev(entity,pev_euser4)
    if(pev_valid(iceCub) && dispFreez[entity]){
        remove_entity(iceCub)
        set_pev(iceCub,pev_euser4, 0)
        dispFreez[entity] = 0
    }
    iceCub = pev(entity,pev_euser3)
    if(pev_valid(iceCub)){
        remove_entity(iceCub)
        set_pev(iceCub,pev_euser3, 0)
    }
    if(task_exists(entity+3000)){
        remove_task(entity+3000)
    }
    if(task_exists(entity+2000)){
        remove_task(entity+2000)
    }
    if(pev_valid(entity)){
        remove_entity(entity)
    }
}

public ev_Spectation ()
{
    new id = read_data ( 1 )
    BreakAllPlayerDispensers(id)
}

public show_updatemenu(id){
    new szItem[128]
    format(szItem, 127, "\wУстановить способность^nРаздатчик \rДенег \wHP \r%d", moneytraf[0])
    new menu = menu_create(szItem,"touchdispc");
    format(szItem, 127, "\r[\wДа \r%d\y$!\r]", moneytraf[1])
    menu_additem( menu, szItem)
    menu_additem( menu, "\r[\wНет\r]")
    menu_display(id,menu)
    return PLUGIN_HANDLED
}

public touchdispc(id, menu, key){
    key++
    menu_destroy(menu)
    if(key==1){
        if(!pev_valid(touchdisp[id]))
            return;

        if ( pev ( touchdisp[id], pev_iuser4 ) != _:cs_get_user_team ( id ) )
            return;

        if(cs_get_user_money(id)<moneytraf[1])
            return;

        cs_set_user_money(id,cs_get_user_money(id)-moneytraf[1]);
        //set_bankmoney(id,moneytraf[1])
        set_pev( touchdisp[id], pev_health, float(moneytraf[0]) );
        set_pev( touchdisp[id], pev_iuser1, 1 );
    } else {
        return
    }
}

public disppp_menu(id)
{
    if(g_iPlayerDispenser[id] == 0){
        ChatColor ( id, "^4У тебя нет раздатчика")
        return HAM_IGNORED
    }

    new szItem[128];
    new szItem1[128];
    new msentry_item = menu_create("\yВыберите раздатчик!", "cl_mendisp")
    static ent = -1
    while ((ent = find_ent_by_class(ent, gDispenserClassname)))
    {
        if( pev( ent, pev_iuser2) != id) continue;

        if(pev_valid(ent))
        {
            new iLevel = pev ( ent, pev_iuser3 )
            new iHealth = pev ( ent, pev_health )
            format(szItem, 127, "%d", ent)
            format(szItem1, 127, "\wID \r%d \w| уровень \r%d \w[HP \y%d\w]", ent, iLevel, iHealth)
            menu_additem( msentry_item, szItem1, szItem, 0)
        }
    }

    menu_setprop(msentry_item, MPROP_EXIT, MEXIT_ALL)
    menu_setprop(msentry_item, MPROP_EXITNAME, "\yВыход")
    menu_display(id, msentry_item, 0)

    return PLUGIN_HANDLED
}

public cl_mendisp(id, menu, item) {
    new s_Data[6], s_Name[64], i_Access, i_Callback
    menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
    new i_Key = str_to_num(s_Data)
    menu_destroy(menu)
    if(i_Key == 0) return 0
    if ( !is_valid_ent ( i_Key ) ) return 0
    touchdisp[id] = i_Key
    disp_menu_func(id)
    return 1
}

public disp_menu_func(id)
{
    if(g_iPlayerDispenser[id] == 0){
        ChatColor ( id, "^4У тебя нет раздатчика")
        return HAM_IGNORED
    }
    new szItem[128];
    new szItem1[128];
    new ent = touchdisp[id];
    if(ent==0) return PLUGIN_HANDLED
    new msentry_item = menu_create("\yЧто делать с раздатчиком?!", "cl_mend");
    if(pev_valid(ent))
    {
        new iLevel = pev ( ent, pev_iuser3 )
        new iHealth = pev ( ent, pev_health )
        format(szItem, 127, "%d", ent)
        menu_additem( msentry_item, "\wУничтожить")
        //menu_additem( msentry_item, "\wУлучшить до раздатчика денег")
        //menu_additem( msentry_item, "\wПоложить в раздатчик 10000$ НДС \r1000\y$")
        menu_addblank( msentry_item, 0)
        menu_addblank( msentry_item, 0)
        menu_addblank( msentry_item, 0)
        format(szItem1, 127, "\wID \r%d", ent)
        menu_addtext( msentry_item, szItem1)
        format(szItem1, 127, "Уровень \r%d", iLevel)
        menu_addtext( msentry_item, szItem1)
        format(szItem1, 127, "\w[HP \y%d\w]", iHealth)
        menu_addtext( msentry_item, szItem1)
    }
    menu_setprop(msentry_item, MPROP_EXIT, MEXIT_ALL)
    menu_setprop(msentry_item, MPROP_EXITNAME, "\yВыход")
    menu_display(id, msentry_item, 0)
    return PLUGIN_HANDLED
}

public cl_mend(id, menu, item) {
    item++
    new ent = touchdisp[id]
    new iLevel = pev ( ent, pev_iuser3 )
    menu_destroy(menu)
    if(item == 0) return 0
    if(pev_valid(ent)){
        switch(item){
            case 1:{
                if ( !is_valid_ent ( ent ) ) return 0
                DeleteEntity( ent )
                g_iPlayerDispenser[ id ]--;
                if(g_iPlayerDispenser[ id ] == 0)
                    bDispenserBuild[ id ] = false;
            }
            case 2:{
                if ( !is_valid_ent ( ent ) )
                    return 0;

                if ( iLevel != 4 ){
                    ChatColor ( id, "^1Только на 4 уровне!");
                    return 0;
                }

                if ( pev ( ent, pev_iuser4 ) != _:cs_get_user_team ( id ) )
                    return 0;

                if(cs_get_user_money(id)<moneytraf[1]){
                    ChatColor ( id, "^1Не достаточно средств! Стоимость %d", moneytraf[1]);
                    return 0;
                }

                cs_set_user_money(id,cs_get_user_money(id)-moneytraf[1]);
                //set_bankmoney(id,moneytraf[1])
                set_pev( ent, pev_health, float(moneytraf[0]) );
                set_pev( ent, pev_iuser1, 1 );
            }
            case 3:{
                if(cs_get_user_money(id)<11000)
                    return 0;

                cs_set_user_money(id,cs_get_user_money(id)-11000);
                //set_bankmoney(id,11000)
                //set_pev( ent, pev_fuser1, 10000.0 );
                Disp_balance[ent] = 10000;
            }
        }
    }
    return 1
}

public dispstats(id)
{
    ChatColor ( id, "^1У вас [ ^4%d ^1] раздатчик(ов)!", g_iPlayerDispenser[id])
}

public client_connect( id )
{
    bDispenserBuild[ id ] = false;
    g_iPlayerDispenser[id] = 0
}

public client_disconnect( id )
{
    BreakAllPlayerDispensers(id)
    g_iPlayerDispenser[id] = 0
}

public plugin_precache( )
{
    gHealingBeam = precache_model( gHealingSprite );
    g_iSPR_Smoke3 = precache_model("sprites/black_smoke4.spr")
    precache_model( gDispenserMdl );
    precache_sound( gDispenserActive );
    gSpr_regeneration = precache_model("sprites/th_jctf_heal.spr")
    new i;
    for( i = 0; i < sizeof gDamageSounds; i++ )
    {
        precache_sound( gDamageSounds[ i ] );
    }
    ExplSpr = precache_model("sprites/gp_1.spr");
    // precache_model("models/great_sentries/PFG_BLOCKS.mdl")
    // precache_model("models/great_sentries/PFG_SENTRIES_OLD2.mdl")
}

public fw_TraceLine_Post ( Float:v1[3], Float:v2[3], noMonsters, id )
{
    if ( !is_valid_player ( id ) || is_user_bot ( id ) || !is_user_alive ( id ) )
    return FMRES_IGNORED

    new iHitEnt = get_tr ( TR_pHit )

    if ( iHitEnt <= gMaxPlayers || !pev_valid ( iHitEnt ) )
    return FMRES_IGNORED

    new sClassname[32]
    pev ( iHitEnt, pev_classname, sClassname, charsmax ( sClassname ) )

    if ( !equal ( sClassname, gDispenserClassname ) )
    return FMRES_IGNORED

    new iTeam = pev ( iHitEnt, pev_iuser4 )

    if ( _:cs_get_user_team ( id ) != iTeam )
    return FMRES_IGNORED

    new iHealth = pev ( iHitEnt, pev_health )

    if ( iHealth <= 0 )
    return FMRES_IGNORED

    new iOwner = pev ( iHitEnt, pev_iuser2 )

    if ( !is_user_connected ( iOwner ) )
    return FMRES_IGNORED

    new sName[33]
    get_user_name ( iOwner, sName, charsmax ( sName ) )
    new iLevel = pev ( iHitEnt, pev_iuser3 )

    set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
    show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:", sName, iHitEnt, iHealth, d_enthp[iLevel-1], iLevel )
    set_dhudmessage ( 255, 0, 0, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
    show_dhudmessage ( id, "^n^n                             OFF")
    /* switch(pev( iHitEnt, pev_iuser1)){
        case 0:{
            set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
            show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:", sName, iHitEnt, iHealth, d_enthp[iLevel-1], iLevel )
            set_dhudmessage ( 255, 0, 0, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
            show_dhudmessage ( id, "^n^n                             OFF")
        }
        case 1:{
            set_dhudmessage ( 255, 255, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
            show_dhudmessage ( id, "Установил: %s^nID %d HP: %d/%d^nLevel: %d Coins:^nОбъем: %d", sName, iHitEnt, iHealth, moneytraf[0], iLevel, Disp_balance[iHitEnt] )
            set_dhudmessage ( 0, 0, 255, -1.0, 0.80, 0, 0.0, 0.6, 0.0, 0.0 )
            show_dhudmessage ( id, "^n^n                             ON")
        }
    } */

    return FMRES_IGNORED
}
public bacon_TakeDamagePre( ent, idinflictor, idattacker, Float:damage, damagebits )
{
    new szClassname[ 32 ];
    pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

    if( equal( szClassname, gDispenserClassname ) )
    {
        if(updatingdisp[ent])
            return HAM_SUPERCEDE
        
        new iOwner = pev( ent, pev_iuser2 );
        if(!is_user_connected(iOwner) || 1 > iOwner > 32 || !is_user_connected(idattacker) || 1 > idattacker > 32)
            return HAM_SUPERCEDE

        if(cs_get_user_team(iOwner)==cs_get_user_team(idattacker) && idattacker != iOwner)
            return HAM_SUPERCEDE
    }
    return HAM_IGNORED
}

public bacon_TakeDamage( ent, idinflictor, idattacker, Float:damage, damagebits )
{   
    if ( !pev_valid ( ent ) )
    return HAM_IGNORED

    new szClassname[ 32 ];
    pev( ent, pev_classname, szClassname, charsmax( szClassname ) );

    if( equal( szClassname, gDispenserClassname ) )
    {
        if(updatingdisp[ent])
            return HAM_SUPERCEDE
        
        new iOwner = pev( ent, pev_iuser2 );
        if(!is_user_connected(iOwner) || 1 > iOwner > 32 || !is_user_connected(idattacker) || 1 > idattacker > 32)
            return HAM_SUPERCEDE

        if(cs_get_user_team(iOwner)==cs_get_user_team(idattacker) && idattacker != iOwner)
            return HAM_SUPERCEDE
        
        if( pev( ent, pev_health ) <= 0.0 )
        {
            new szName[ 32 ];
            get_user_name( idattacker, szName, charsmax( szName ) );
            if( idattacker == iOwner )
            {
                ChatColor ( iOwner, "^3[^4Действие^3]^1 Вы уничтожили собственный раздатчик!")
            } else {
                ChatColor ( iOwner, "^3[^4Действие^3]^1 %s уничтожил ваш раздатчик!", szName)
                ChatColor ( idattacker, "^3[^4Раздатчик^3]^1 Вам начислено 15 бонусов!", szName)
                /*код достижения*/
                /* if(get_player_type(idattacker) == 1){
                    if(get_kill_disp(idattacker) == 0){
                        if(get_player_expmm(idattacker) < 300){
                            set_player_expmm(idattacker, 1);
                            if(get_player_expmm(idattacker) >= 300){
                                set_kill_disp(idattacker, 1);
                                set_player_type(idattacker, 0)
                            }
                        } else if(get_player_expmm(idattacker) >= 300){
                            set_kill_disp(idattacker, 1);
                            set_player_type(idattacker, 0)
                        }
                    }
                } */
                /*код достижения*/
            }
        }
        emit_sound( ent, CHAN_STATIC, gDamageSounds[ random_num( 0, charsmax( gDamageSounds ) ) ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
    }
    return HAM_IGNORED
}

stock create_explosion(Float:origin_[3]) {
    new origin[3]
    FVecIVec(origin_, origin)
    
    message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0})
    write_byte(TE_SPRITETRAIL) //Спрайт захвата
    write_coord((origin[0]))
    write_coord((origin[1]))
    write_coord((origin[2])+20)
    write_coord((origin[0]))
    write_coord((origin[1]))
    write_coord((origin[2])+80)
    write_short(ExplSpr)
    write_byte(20)
    write_byte(20)
    write_byte(4)
    write_byte(20)
    write_byte(10)
    message_end()
}

public CommandDispenserBuild( id )
{
    if( !is_user_alive( id ) )
    {
        return PLUGIN_CONTINUE;
    }

    if( !( pev( id, pev_flags ) & FL_ONGROUND ) )
    {
        ChatColor ( id, "^3[^4Информация^3]^1 Вы можете построить раздатчик только на земле!")
        return PLUGIN_HANDLED;
    }

    if ( g_iPlayerDispenser[id] == 2 && get_bariga(id))
    {
        ChatColor ( id, "^3[^4Информация^3]^1 Вы уже построили 2 раздатчика!")
        return PLUGIN_HANDLED;
    } else if(!get_bariga(id)){
        if( bDispenserBuild[ id ] == true )
        {
            ChatColor ( id, "^3[^4Информация^3]^1 Вы уже построили раздатчик!")
            return PLUGIN_HANDLED;
        }
    }

    new iMoney = cs_get_user_money( id );

    if (get_user_flags(id) & ADMIN_LEVEL_B)
    {
        if( iMoney < d_upgcost_vip[0] )
        {
            ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost_vip[0] )
            return PLUGIN_HANDLED;
        }
    }
    else
    {
        if( iMoney < d_upgcost[0] )
        {
            ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost[0] )
            return PLUGIN_HANDLED;
        }
    }
    new Float:playerOrigin[3]
    entity_get_vector(id, EV_VEC_origin, playerOrigin)

    new Float:vNewOrigin[3]
    new Float:vTraceDirection[3]
    new Float:vTraceEnd[3]
    new Float:vTraceResult[3]
    velocity_by_aim(id, 64, vTraceDirection) // get a velocity in the directino player is aiming, with a multiplier of 64...
    vTraceEnd[0] = vTraceDirection[0] + playerOrigin[0] // find the new max end position
    vTraceEnd[1] = vTraceDirection[1] + playerOrigin[1]
    vTraceEnd[2] = vTraceDirection[2] + playerOrigin[2]
    trace_line(id, playerOrigin, vTraceEnd, vTraceResult) // trace, something can be in the way, use hitpoint from vTraceResult as new origin, if nothing's in the way it should be same as vTraceEnd
    vNewOrigin[0] = vTraceResult[0]// just copy the new result position to new origin
    vNewOrigin[1] = vTraceResult[1]// just copy the new result position to new origin
    vNewOrigin[2] = playerOrigin[2] // always build in the same height as player.

    if (CreateDispanser(vNewOrigin, id))
    {
        if (get_user_flags(id) & ADMIN_LEVEL_B)
        {
            cs_set_user_money(id, cs_get_user_money(id) - d_upgcost_vip[0])
            //set_bankmoney(id,d_upgcost_vip[0])
            g_iPlayerDispenser[id]++
        }
        else
        {
            cs_set_user_money(id, cs_get_user_money(id) - d_upgcost[0])
            //set_bankmoney(id,d_upgcost[0])
            g_iPlayerDispenser[id]++
        }
    }
    else
    {
        ChatColor ( id, "^3[^4Информация^3]^1 Здесь не получается установить раздатчик!")
    }
    return PLUGIN_HANDLED;
}


stock bool:CreateDispanser(Float:origin[3], creator)
{
    if (point_contents(origin) != CONTENTS_EMPTY || TraceCheckCollides(origin, 35.0))
    {
        return false
    }

    new Float:hitPoint[3], Float:originDown[3]
    originDown = origin
    originDown[2] = -5000.0 // dunno the lowest possible height...
    trace_line(0, origin, originDown, hitPoint)
    new Float:baDistanceFromGround = vector_distance(origin, hitPoint)

    new Float:difference = 20.0 - baDistanceFromGround
    if (difference < -1 * 20.0 || difference > 20.0) return false

    new iEntity = create_entity( "func_breakable" );

    if( !pev_valid( iEntity ) )
    return false

    set_pev( iEntity, pev_classname, gDispenserClassname );
    new Float:flAngles[ 3 ];
    new Float:flAnglesF[ 3 ];
    pev( creator, pev_angles, flAngles );
    pev( iEntity, pev_angles, flAnglesF );
    flAnglesF[1] = flAngles[1]+90.0
    set_pev( iEntity, pev_angles, flAnglesF );
    engfunc( EngFunc_SetModel, iEntity, gDispenserMdl );
    engfunc( EngFunc_SetSize, iEntity, Float:{ -20.0, -10.0, 0.0 }, Float:{ 20.0, 10.0, 50.0 } );
    set_pev( iEntity, pev_origin, origin );
    set_pev( iEntity, pev_solid, SOLID_BBOX );
    set_pev( iEntity, pev_movetype, MOVETYPE_FLY );
    set_pev( iEntity, pev_health, float(d_enthp[0]) );
    set_pev( iEntity, pev_takedamage, 2.0 );
    set_pev( iEntity, pev_iuser1, 0 );
    //set_pev( iEntity, pev_fuser1, float(moneytraf[1]) );
    Disp_balance[iEntity] = 1000;
    set_pev( iEntity, pev_iuser2, creator );
    set_pev( iEntity, pev_iuser3, 1 );
    set_pev( iEntity, pev_iuser4, get_user_team(creator) );
    set_pev( iEntity, pev_nextthink, get_gametime( ) + 0.1 );
    engfunc( EngFunc_DropToFloor, iEntity );
    dispFreez[iEntity] = 0
    updatingdisp[iEntity] = 0

    // gDispenserOrigin[ creator ][ 0 ] = origin[ 0 ];
    // gDispenserOrigin[ creator ][ 1 ] = origin[ 1 ];
    // gDispenserOrigin[ creator ][ 2 ] = origin[ 2 ];

    bDispenserBuild[ creator ] = true;

    switch( cs_get_user_team( creator ) )
    {
        case CS_TEAM_T:
        {
            gBeamcolor[ creator ][ 0 ] = 0, gBeamcolor[ creator ][ 1 ] = 255, gBeamcolor[ creator ][ 2 ] = 0;
            set_pev(iEntity, pev_body, 4);
        }

        case CS_TEAM_CT:
        {
            gBeamcolor[ creator ][ 0 ] = 0, gBeamcolor[ creator ][ 1 ] = 255, gBeamcolor[ creator ][ 2 ] = 0;
            set_pev(iEntity, pev_body, 0);
        }
    }

    emit_sound( iEntity, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

    return true;
}

public DispenserThink( iEnt )
{
    if( pev_valid( iEnt ) )
    {
        static iOwner; iOwner = pev( iEnt, pev_iuser2 )
        if(get_user_team(iOwner) != pev( iEnt, pev_iuser4)){
            BreakAllPlayerDispensers(iOwner)
            return PLUGIN_CONTINUE
        }
        if ( !is_user_connected ( iOwner ) )
            return PLUGIN_CONTINUE
        
        if( pev( iEnt, pev_health ) <= 0.0 )
        {
            new Float:origin[3]
            entity_get_vector(iEnt, EV_VEC_origin, origin)
            DeleteEntity( iEnt )
            create_explosion(origin)
            g_iPlayerDispenser[iOwner]--
            client_cmd( iOwner, "speak ^"vox/bizwarn computer destroyed^"" );
            if(g_iPlayerDispenser[iOwner]==0)
                bDispenserBuild[ iOwner ] = false;
            return PLUGIN_CONTINUE
        }
        
        new id, iLevel = pev ( iEnt, pev_iuser3 )
        new Float:fRadius = d_radius[iLevel-1]
        new Float:origin[ 3 ];
        pev( iEnt, pev_origin, origin );
        if(!dispFreez[iEnt]){
            for( id = 1; id <= gMaxPlayers; id++ )
            {
                if( !is_user_bot(id) && is_user_connected ( id ) && is_user_alive( id ) && cs_get_user_team( id ) == cs_get_user_team( iOwner ))
                {
                    new Float:flOrigin[ 3 ];
                    pev( id, pev_origin, flOrigin );
                    if( get_distance_f( origin, flOrigin ) <= floatround(fRadius))
                    {
                        //if( UTIL_IsVisible( id, iEnt ) && ((cs_get_user_money(id) < 100000 && iOwner == id && Disp_balance[iEnt]>0) || pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]))
                        if( UTIL_IsVisible( id, iEnt ) && (pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]))
                        {
                            if( pev(id, pev_health) < d_hp[iLevel - 1] )
                            {
                                set_pev(id, pev_health, floatmin(pev(id, pev_health) + d_takehp[iLevel-1], float(d_hp[iLevel - 1])) );
                                //if(pev( iEnt, pev_iuser1)==1) cs_set_user_money(id, cs_get_user_money(id) - 1 );
                            }
                            if( pev(id, pev_armorvalue) < d_ap[iLevel - 1] )
                            {
                                set_pev(id, pev_armorvalue, floatmin(pev(id, pev_armorvalue) + d_takeap[iLevel-1], float(d_ap[iLevel - 1])) );
                                //if(pev( iEnt, pev_iuser1)==1) cs_set_user_money(id, cs_get_user_money(id) - 1 );
                            }
                            /* if(cs_get_user_money(id)>0 && pev( iEnt, pev_iuser1)==1 && iOwner != id){
                                Disp_balance[iEnt]+=1
                                dips_balanced(id, 1)
                            } else if( cs_get_user_money(id) < 100000 && Disp_balance[iEnt] > 0 && pev( iEnt, pev_iuser1)==1 && iOwner == id)
                            {
                                cs_set_user_money(id, cs_get_user_money(id) + 1 );
                                //set_pev( iEnt, pev_fuser1, pev( iEnt, pev_fuser1) - 1.0 );
                                Disp_balance[iEnt]-=1
                                dips_balanced(id, -1)
                            } else if( pev(id, pev_health) < d_hp[iLevel - 1] || pev(id, pev_armorvalue) < d_ap[iLevel - 1]){ if(pev( iEnt, pev_iuser1)==1 && iOwner != id) cs_set_user_money(id, cs_get_user_money(id) - 1 );}
                            */
                            //player_healingEffect(id)
                            new bool:BigBeam = pev(id, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(id, pev_health) < float(d_hp[iLevel - 1]) ? true : false
                            UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
                        }
                    }
                }
            }
            new ent = -1, sClassName[32]
            while ( ( ent = engfunc ( EngFunc_FindEntityInSphere, ent, origin, fRadius ) ) != 0 ) {
                pev ( ent, pev_classname, sClassName, charsmax ( sClassName ) )
                if(pev_valid(ent)){
                    new Float:flOrigin[ 3 ];
                    pev( ent, pev_origin, flOrigin );
                    if(equal(sClassName,gDispenserClassname)){
                        if(get_user_team(iOwner) == pev( ent, pev_iuser4)){
                            if(ent != iEnt){
                                flOrigin[2]+=20.0
                                if( UTIL_IsVisible( ent, iEnt ) && pev(ent, pev_health) < d_enthp[pev(ent, pev_iuser3)-1])
                                {
                                    set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
                                    new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
                                    UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
                                }
                            }
                        }
                    } /*else if(equal(sClassName,"lasermine")){
                        if( UTIL_IsVisible( ent, iEnt ) && pev(ent, pev_health) < 400)
                        {
                            set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
                            new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
                            UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
                        }
                    } else if(equal(sClassName,"sentry")){
                        if(cs_get_user_team(iOwner)==get_sentry_team(ent)){
                            if(pev(ent, pev_health)<g_HEALTHSS[get_SentryLevel(ent)]){
                                if(UTIL_IsVisible(ent,iEnt))
                                {
                                    set_pev(ent, pev_health, pev(ent, pev_health) + d_takehpabjects[iLevel-1]);
                                    new bool:BigBeam = pev(ent, pev_armorvalue) < float(d_ap[iLevel - 1]) || pev(ent, pev_health) < float(d_enthp[iLevel - 1]) ? true : false
                                    UTIL_BeamEnts( flOrigin, origin, gBeamcolor[ iOwner ][ 0 ], gBeamcolor[ iOwner ][ 1 ], gBeamcolor[ iOwner ][ 2 ], gHealingBeam, BigBeam ? 60 : 20, BigBeam ? 1 : 11);
                                }
                            }
                        }
                    } */
                }
            }
        }
        new Float:entorigin[3]
        pev( iEnt, pev_origin, entorigin )
        new HP = pev ( iEnt, pev_health )
        if(HP<=600.0){
            message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
            write_byte(TE_SMOKE)
            engfunc(EngFunc_WriteCoord, entorigin[0]+random_float(-8.0, 8.0))
            engfunc(EngFunc_WriteCoord, entorigin[1]+random_float(-8.0, 8.0))
            engfunc(EngFunc_WriteCoord, entorigin[2]+random_float(25.0, 35.0))
            write_short(g_iSPR_Smoke3)
            write_byte(random_num(3,7))
            write_byte(30)
            message_end()
        }
        if(get_user_team(iOwner) != pev( iEnt, pev_iuser4))
        {
            BreakAllPlayerDispensers(iOwner);
            g_iPlayerDispenser[id] = 0
            return PLUGIN_CONTINUE;
        }
        set_pev( iEnt, pev_nextthink, get_gametime( ) + 0.1 );
    }
    return PLUGIN_CONTINUE;
}
// updatingdisp[ent]
public fw_DispenserTouch ( ent, id )
{
    if(updatingdisp[ent])
        return
    
    new iLevel = pev ( ent, pev_iuser3 );
    static Float:time;time=get_gametime()
    if(flood_disptouch[id] > time)
        return

    flood_disptouch[id] = time+2.0

    if ( !pev_valid ( ent ) )
        return

    if ( !is_user_connected ( id ) || !is_user_alive ( id ) )
        return

    if ( pev ( ent, pev_iuser4 ) != _:cs_get_user_team ( id ) )
        return

    // if ( iLevel == 4 && pev( ent, pev_iuser1) == 0){
        // touchdisp[id] = ent
        // show_updatemenu(id)
        // return
    // }

    if(iLevel == 4)
        return

    new iOwner = pev ( ent, pev_iuser2 )
    new money = cs_get_user_money ( id )
    if (get_user_flags(id) & ADMIN_LEVEL_B && money < d_upgcost_vip[iLevel])
    {
        ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost_vip[iLevel] )
        return;
    }
    else if( money < d_upgcost[iLevel] )
    {
        ChatColor ( id, "^3[^4Информация^3]^1 У тебя не хватает денег! (нужно %d$)", d_upgcost[iLevel] )
        return;
    }
    
    if ( !is_user_connected ( iOwner ) )
        return

    if (get_user_flags(id) & ADMIN_LEVEL_B)
    {
        cs_set_user_money(id, money - d_upgcost_vip[iLevel-1])
        //set_bankmoney(id,d_upgcost_vip[iLevel-1])
    }
    else
    {
        cs_set_user_money(id, money - d_upgcost[iLevel-1])
        //set_bankmoney(id,d_upgcost[iLevel-1])
    }

    new sUpgraderName[32]
    get_user_name ( id, sUpgraderName, charsmax ( sUpgraderName ) )
    client_print ( iOwner, print_center, "%s прокачал твой раздатчик", sUpgraderName )
    set_player_bonus(id, 15)
    gBeamcolor[ id ][ 0 ] = 0, gBeamcolor[ id ][ 1 ] = 255, gBeamcolor[ id ][ 2 ] = 0;
    /*код достижения*/
     /* if(iOwner != id){
        if(get_player_type(id) == 2){
            if(get_upd_disp(id) == 0){
                if(get_player_expmm(id) < 650){
                    set_player_expmm(id, 1);
                    if(get_player_expmm(id) >= 650){
                        set_upd_disp(id, 1);
                        set_player_type(id, 0)
                    }
                } else if(get_player_expmm(id) >= 650){
                    set_upd_disp(id, 1);
                    set_player_type(id, 0)
                }
            }
        }
    } */
    /*код достижения*/
    updatingdisp[ent] = 1
    /* new iEntity = create_entity("info_target")
    new Float: Origin[3]
    entity_get_vector(ent, EV_VEC_origin, Origin)
    Origin[0]-=30.0
    Origin[1]+=5.0
    Origin[2]+=70.0
    entity_set_string(iEntity, EV_SZ_classname, "Shield_Ent")
    entity_set_vector(iEntity,EV_VEC_origin, Origin)
    entity_set_model(iEntity, "models/great_sentries/PFG_SENTRIES_OLD2.mdl")
    set_pev(iEntity, pev_solid, SOLID_TRIGGER );
    set_pev(iEntity, pev_body, 8);
    set_pev(iEntity, pev_sequence, 9)
    set_pev(iEntity, pev_framerate, 1.0)
    switch( pev ( ent, pev_iuser4 ) )
    {
        case CS_TEAM_T:
        {
            set_pev(iEntity, pev_skin, 3);
        }
        case CS_TEAM_CT:
        {
            set_pev(iEntity, pev_skin, 2);
        }
    }
    set_pev(ent,pev_euser3,iEntity) */
    fw_DispenserTouchTwo(ent+3000)
    //set_task ( 3.0, "fw_DispenserTouchTwo",ent+3000)
}

public fw_DispenserTouchTwo (entoff){
    new ent = entoff-3000
    /* new iceCub = pev(ent,pev_euser3)
    if(pev_valid(iceCub)){
        remove_entity(iceCub)
        set_pev(ent,pev_euser3, 0)
    } */
    new iLevel = pev ( ent, pev_iuser3 );
    iLevel++
    set_pev ( ent, pev_iuser3, iLevel )
    set_pev ( ent, pev_health, float ( d_enthp[iLevel-1] ) )
    engfunc( EngFunc_SetModel, ent, gDispenserMdl )
    engfunc( EngFunc_SetSize, ent, Float:{ -20.0, -10.0, 0.0 }, Float:{ 20.0, 10.0, 50.0 } )
    emit_sound( ent, CHAN_STATIC, gDispenserActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
    switch( pev ( ent, pev_iuser4 ) )
    {
        case CS_TEAM_T:
        {
            switch(iLevel)
            {
                case 2: set_pev(ent, pev_body, 5);
                case 3: set_pev(ent, pev_body, 6);
                case 4: set_pev(ent, pev_body, 7);
            }
        }
        case CS_TEAM_CT:
        {
            switch(iLevel)
            {
                case 2: set_pev(ent, pev_body, 1);
                case 3: set_pev(ent, pev_body, 2);
                case 4: set_pev(ent, pev_body, 3);
            }
        }
    }
    
    updatingdisp[ent] = 0
}

public EVENT_TextMsg( )
{
    UTIL_DestroyDispensers( );
}

public LOG_RoundEnd( )
{
    UTIL_DestroyDispensers( );
}

stock UTIL_DestroyDispensers( )
{
    new iEnt = FM_NULLENT;

    while( ( iEnt = find_ent_by_class( iEnt, gDispenserClassname ) ) )
    {
        if(is_valid_ent ( iEnt )){
            new iOwner = pev( iEnt, pev_iuser2 );
            bDispenserBuild[ iOwner ] = false;
            g_iPlayerDispenser[ iOwner ]--;
            DeleteEntity( iEnt )
        }
    }
}

stock UTIL_BeamEnts( Float:flStart[ 3 ], Float:flEnd[ 3 ], r, g, b, sprite, width, ampl )
{
    engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flStart );
    write_byte( TE_BEAMPOINTS );
    engfunc( EngFunc_WriteCoord, flStart[ 0 ] );
    engfunc( EngFunc_WriteCoord, flStart[ 1 ] );
    engfunc( EngFunc_WriteCoord, flStart[ 2 ] );
    engfunc( EngFunc_WriteCoord, flEnd[ 0 ] );
    engfunc( EngFunc_WriteCoord, flEnd[ 1 ] );
    engfunc( EngFunc_WriteCoord, flEnd[ 2 ] );
    write_short( sprite );
    write_byte( 5 );
    write_byte( 2 );
    write_byte( 1 );
    write_byte( width );
    write_byte( ampl );
    write_byte( r );
    write_byte( g );
    write_byte( b );
    write_byte( 130 );
    write_byte( 30 );
    message_end( );
}

stock bool:UTIL_IsVisible( index, entity, ignoremonsters = 0 )
{
    new Float:flStart[ 3 ], Float:flDest[ 3 ];
    pev( index, pev_origin, flStart );
    pev( index, pev_view_ofs, flDest );

    xs_vec_add( flStart, flDest, flStart );

    pev( entity, pev_origin, flDest );
    engfunc( EngFunc_TraceLine, flStart, flDest, ignoremonsters, index, 0 );

    new Float:flFraction;
    get_tr2( 0, TR_flFraction, flFraction );

    if( flFraction == 1.0 || get_tr2( 0, TR_pHit) == entity )
    {
        return true;
    }

    return false;
}

public BreakAllPlayerDispensers(id)
{
    static ent = -1
    while ((ent = find_ent_by_class(ent, gDispenserClassname)))
    {
        if(pev( ent, pev_iuser2 ) != id)
            continue

        if(pev_valid(ent))
        {
            DeleteEntity( ent )
            //set_pev( ent, pev_flags, pev( ent, pev_flags ) | FL_KILLME );
        }
    }
    bDispenserBuild[ id ] = false;
    g_iPlayerDispenser[ id ] = 0;
}


bool:TraceCheckCollides(Float:origin[3], const Float:BOUNDS)
{
    new Float:traceEnds[8][3], Float:traceHit[3], hitEnt
    traceEnds[0][0] = origin[0] - BOUNDS
    traceEnds[0][1] = origin[1] - BOUNDS
    traceEnds[0][2] = origin[2] - BOUNDS
    traceEnds[1][0] = origin[0] - BOUNDS
    traceEnds[1][1] = origin[1] - BOUNDS
    traceEnds[1][2] = origin[2] + BOUNDS
    traceEnds[2][0] = origin[0] + BOUNDS
    traceEnds[2][1] = origin[1] - BOUNDS
    traceEnds[2][2] = origin[2] + BOUNDS
    traceEnds[3][0] = origin[0] + BOUNDS
    traceEnds[3][1] = origin[1] - BOUNDS
    traceEnds[3][2] = origin[2] - BOUNDS
    traceEnds[4][0] = origin[0] - BOUNDS
    traceEnds[4][1] = origin[1] + BOUNDS
    traceEnds[4][2] = origin[2] - BOUNDS
    traceEnds[5][0] = origin[0] - BOUNDS
    traceEnds[5][1] = origin[1] + BOUNDS
    traceEnds[5][2] = origin[2] + BOUNDS
    traceEnds[6][0] = origin[0] + BOUNDS
    traceEnds[6][1] = origin[1] + BOUNDS
    traceEnds[6][2] = origin[2] + BOUNDS
    traceEnds[7][0] = origin[0] + BOUNDS
    traceEnds[7][1] = origin[1] + BOUNDS
    traceEnds[7][2] = origin[2] - BOUNDS

    for (new i = 0; i < 8; i++)
    {
        if (point_contents(traceEnds[i]) != CONTENTS_EMPTY)
        return true

        hitEnt = trace_line(0, origin, traceEnds[i], traceHit)
        if (hitEnt != 0)
        return true
        for (new j = 0; j < 3; j++)
        {
            if (traceEnds[i][j] != traceHit[j])
            return true
        }
    }

    return false
}

stock ChatColor(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)

    replace_all(msg, 190, "!g", "^4") // Green Color
    replace_all(msg, 190, "!y", "^1") // Default Color
    replace_all(msg, 190, "!team", "^3") // Team Color
    replace_all(msg, 190, "!team2", "^0") // Team2 Color

    if (id) players[0] = id; else get_players(players, count, "ch")
    {
        for (new i = 0; i < count; i++)
        {
            if (is_user_connected(players[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                write_byte(players[i]);
                write_string(msg);
                message_end();
            }
        }
    }
}

player_healingEffect(id)
{
    new iOrigin[3]

    get_user_origin(id, iOrigin)

    message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
    write_byte(TE_PROJECTILE)
    write_coord(iOrigin[x] + random_num(-10, 10))
    write_coord(iOrigin[y] + random_num(-10, 10))
    write_coord(iOrigin[z] + random_num(0, 30))
    write_coord(0)
    write_coord(0)
    write_coord(15)
    write_short(gSpr_regeneration)
    write_byte(1)
    write_byte(id)
    message_end()
}
 
В этой теме было размещено решение! Перейти к решению.

Download all Attachments

Последнее редактирование модератором:
Сообщения
198
Реакции
273
Помог
5 раз(а)
Ошибок нет. Это предупреждения, что ты завёл переменные, которые потом не используешь.
 
Сообщения
31
Реакции
-4
Помог
3 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Ошибок нет. Это предупреждения, что ты завёл переменные, которые потом не используешь.
да я уже понял что используемые нативы с переменными закоментены (то есть отключены) написал автору, он включил все переменные все нормуль)
 
Сообщения
2,713
Реакции
2,993
Помог
59 раз(а)
Такой плагин лучше на сервер не ставить. Код писал не то, что бы не понимающий человек, а вообще не знакомый с AMXX и программированием... :negative:

Именно в этом плагине раскрыта вся сила привата...
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу