Диспенсер Model внутри пола

  • Автор темы Автор темы yRestrict
  • Дата начала Дата начала
Сообщения
1
Реакции
0
Ошибка
Модель внутри хаоса
AMX Mod X
1.10
Билд сервера
L 10/03/2025 - 17:59:40: Server cvar "allow_spectators" = "1.0"
L 10/03/2025 - 17:59:40: Server cvar "amx_client_languages" = "1"
L 10/03/2025 - 17:59:40: Server cvar "amx_language" = "bp"
L 10/03/2025 - 17:59:40: Server cvar "amx_nextmap" = "de_dust2"
L 10/03/2025 - 17:59:40: Server cvar "amx_timeleft" = "00:09"
L 10/03/2025 - 17:59:40: Server cvar "amxmodx_version" = "1.10.0.5461"
L 10/03/2025 - 17:59:40: Server cvar "coop" = "0"
L 10/03/2025 - 17:59:40: Server cvar "deathmatch" = "1"
L 10/03/2025 - 17:59:40: Server cvar "decalfrequency" = "120"
L 10/03/2025 - 17:59:40: Server cvar "edgefriction" = "2"
L 10/03/2025 - 17:59:40: Server cvar "ff_damage_reduction_bullets" = "0.35"
L 10/03/2025 - 17:59:40: Server cvar "ff_damage_reduction_grenade" = "0.25"
L 10/03/2025 - 17:59:40: Server cvar "ff_damage_reduction_grenade_self" = "1.0"
L 10/03/2025 - 17:59:40: Server cvar "ff_damage_reduction_other" = "0.35"
L 10/03/2025 - 17:59:40: Server cvar "game_version" = "5.26.0.668-dev"
L 10/03/2025 - 17:59:40: Server cvar "humans_join_team" = "any"
L 10/03/2025 - 17:59:40: Server cvar "jctf_version" = "10.1b"
L 10/03/2025 - 17:59:40: Server cvar "max_queries_sec" = "3.0"
L 10/03/2025 - 17:59:40: Server cvar "max_queries_sec_global" = "30"
L 10/03/2025 - 17:59:40: Server cvar "max_queries_window" = "60"
L 10/03/2025 - 17:59:40: Server cvar "metamod_version" = "1.3.0.86"
L 10/03/2025 - 17:59:40: Server cvar "mp_afk_bomb_drop_time" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_autokick" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_autokick_timeout" = "-1"
L 10/03/2025 - 17:59:40: Server cvar "mp_autoteambalance" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_buy_anywhere" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_buytime" = "-1"
L 10/03/2025 - 17:59:40: Server cvar "mp_c4timer" = "40"
L 10/03/2025 - 17:59:40: Server cvar "mp_chattime" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_consistency" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_fadetoblack" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_falldamage" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_flashlight" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_footsteps" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_forcecamera" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_forcechasecam" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_forcerespawn" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_fraglimit" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_fragsleft" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_freeforall" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_freezetime" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_friendlyfire" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_give_player_c4" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_hostage_hurtable" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_hostagepenalty" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_infinite_ammo" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_infinite_grenades" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_item_staytime" = "15"
L 10/03/2025 - 17:59:40: Server cvar "mp_kickpercent" = "0.66"
L 10/03/2025 - 17:59:40: Server cvar "mp_limitteams" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_logdetail" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_logfile" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_logmessages" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_mapvoteratio" = "0.66"
L 10/03/2025 - 17:59:40: Server cvar "mp_maxmoney" = "66000"
L 10/03/2025 - 17:59:40: Server cvar "mp_maxrounds" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_playerid" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_radio_maxinround" = "60"
L 10/03/2025 - 17:59:40: Server cvar "mp_radio_timeout" = "1.5"
L 10/03/2025 - 17:59:40: Server cvar "mp_respawn_immunity_effects" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_respawn_immunity_force_unset" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_respawn_immunitytime" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_round_infinite" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_round_restart_delay" = "5"
L 10/03/2025 - 17:59:40: Server cvar "mp_roundover" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_roundtime" = "6"
L 10/03/2025 - 17:59:40: Server cvar "mp_scoreboard_showdefkit" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_scoreboard_showhealth" = "3"
L 10/03/2025 - 17:59:40: Server cvar "mp_scoreboard_showmoney" = "3"
L 10/03/2025 - 17:59:40: Server cvar "mp_show_scenarioicon" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_startmoney" = "800"
L 10/03/2025 - 17:59:40: Server cvar "mp_timeleft" = "00:08"
L 10/03/2025 - 17:59:40: Server cvar "mp_timelimit" = "10"
L 10/03/2025 - 17:59:40: Server cvar "mp_tkpunish" = "0"
L 10/03/2025 - 17:59:40: Server cvar "mp_weapons_allow_map_placed" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_windifference" = "1"
L 10/03/2025 - 17:59:40: Server cvar "mp_winlimit" = "0"
L 10/03/2025 - 17:59:40: Server cvar "pausable" = "0"
L 10/03/2025 - 17:59:40: Server cvar "reu_version" = "0.1.0.95c"
L 10/03/2025 - 17:59:40: Server cvar "revoice_version" = "0.1.0.34"
L 10/03/2025 - 17:59:40: Server cvar "sv_accelerate" = "5"
L 10/03/2025 - 17:59:40: Server cvar "sv_aim" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_airaccelerate" = "10"
L 10/03/2025 - 17:59:40: Server cvar "sv_allowupload" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_alltalk" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_bounce" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_cheats" = "0"
L 10/03/2025 - 17:59:40: Server cvar "sv_clienttrace" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_contact" = ""
L 10/03/2025 - 17:59:40: Server cvar "sv_friction" = "4"
L 10/03/2025 - 17:59:40: Server cvar "sv_gravity" = "800"
L 10/03/2025 - 17:59:40: Server cvar "sv_logblocks" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_maxrate" = "100000"
L 10/03/2025 - 17:59:40: Server cvar "sv_maxspeed" = "320"
L 10/03/2025 - 17:59:40: Server cvar "sv_minrate" = "50000"
L 10/03/2025 - 17:59:40: Server cvar "sv_password" = ""
L 10/03/2025 - 17:59:40: Server cvar "sv_proxies" = "0"
L 10/03/2025 - 17:59:40: Server cvar "sv_restart" = "0"
L 10/03/2025 - 17:59:40: Server cvar "sv_restartround" = "0"
L 10/03/2025 - 17:59:40: Server cvar "sv_stepsize" = "18"
L 10/03/2025 - 17:59:40: Server cvar "sv_stopspeed" = "75"
L 10/03/2025 - 17:59:40: Server cvar "sv_uploadmax" = "0.5"
L 10/03/2025 - 17:59:40: Server cvar "sv_version" = "1.1.2.7/Stdio,48,3378"
L 10/03/2025 - 17:59:40: Server cvar "sv_voiceenable" = "1"
L 10/03/2025 - 17:59:40: Server cvar "sv_wateraccelerate" = "10"
L 10/03/2025 - 17:59:40: Server cvar "sv_waterfriction" = "1"
L 10/03/2025 - 17:59:40: Server cvars end
ReGameDLL
ReGameDLL version: 5.26.0.668-dev
Metamod версия
Metamod-r version 1.3.0.86
Metamod плагины
[ 1] Reunion          RUN   -    reunion_mm.dll    v0.1.92d  ini   Start Never
[ 2] Revoice RUN - revoice_mm.dll v0.1.0.3 ini Start Never
[ 3] AMX Mod X RUN - amxmodx_mm.dll v1.10.0. ini Start ANY
[ 4] MySQL RUN - mysql_amxx.dll v1.10.0. pl3 ANY ANY
[ 5] SQLite RUN - sqlite_amxx.dll v1.10.0. pl3 ANY ANY
[ 6] Fun RUN - fun_amxx.dll v1.10.0. pl3 ANY ANY
[ 7] Engine RUN - engine_amxx.dll v1.10.0. pl3 ANY ANY
[ 8] FakeMeta RUN - fakemeta_amxx.dl v1.10.0. pl3 ANY ANY
[ 9] GeoIP RUN - geoip_amxx.dll v1.10.0. pl3 ANY ANY
[10] CStrike RUN - cstrike_amxx.dll v1.10.0. pl3 ANY ANY
[11] CSX RUN - csx_amxx.dll v1.10.0. pl3 ANY ANY
[12] Ham Sandwich RUN - hamsandwich_amxx v1.10.0. pl3 ANY ANY
[13] ReAPI RUN - reapi_amxx.dll v5.24.0. pl3 ANY Never
Список плагинов
[  1] 0   Admin Base              1.10.0.546  AMXX Dev Team                                      admin.amxx   running  
[ 2] 1 Admin Commands 1.10.0.546 AMXX Dev Team admincmd.am running
[ 3] 2 Admin Help 1.10.0.546 AMXX Dev Team adminhelp.a running
[ 4] 3 Slots Reservation 1.10.0.546 AMXX Dev Team adminslots. running
[ 5] 4 Multi-Lingual System 1.10.0.546 AMXX Dev Team multilingua running
[ 6] 5 Menus Front-End 1.10.0.546 AMXX Dev Team menufront.a running
[ 7] 6 Commands Menu 1.10.0.546 AMXX Dev Team cmdmenu.amx running
[ 8] 7 Players Menu 1.10.0.546 AMXX Dev Team plmenu.amxx running
[ 9] 8 Teleport Menu 1.10.0.546 AMXX Dev Team telemenu.am running
[ 10] 9 Maps Menu 1.10.0.546 AMXX Dev Team mapsmenu.am running
[ 11] 10 Plugin Menu 1.10.0.546 AMXX Dev Team pluginmenu. running
[ 12] 11 Admin Chat 1.10.0.546 AMXX Dev Team adminchat.a running
[ 13] 12 Anti Flood 1.10.0.546 AMXX Dev Team antiflood.a running
[ 14] 13 Scrolling Message 1.10.0.546 AMXX Dev Team scrollmsg.a running
[ 15] 14 Info. Messages 1.10.0.546 AMXX Dev Team imessage.am running
[ 16] 15 Admin Votes 1.10.0.546 AMXX Dev Team adminvote.a running
[ 17] 16 NextMap 1.10.0.546 AMXX Dev Team nextmap.amx running
[ 18] 17 Nextmap Chooser 1.10.0.546 AMXX Dev Team mapchooser. running
[ 19] 18 TimeLeft 1.10.0.546 AMXX Dev Team timeleft.am running
[ 20] 19 Pause Plugins 1.10.0.546 AMXX Dev Team pausecfg.am running
[ 21] 20 Stats Configuration 1.10.0.546 AMXX Dev Team statscfg.am running
[ 22] 21 Restrict Weapons 1.10.0.546 AMXX Dev Team restmenu.am running
[ 23] 22 Base Captura Bandeira 10.1b yRestrict || Ada jctf.amxx debug
[ 24] 23 CTF Cash System 1.0 Tornado systemcash. debug
[ 25] 24 Weapons System 1.0 yRestrict weapon.amxx debug
[ 26] 25 Menu Pega Bandeira 1.0.0 yRestrict menubandeir debug
[ 27] 26 SHOP 1.0.2 GetPEsT ShopMenu.am debug
[ 28] 27 Build Dispenser 0.1b pro100iweb disp_mod.am debug
[ 29] 28 [TP] Granada de Teletr 1.0 Custom greetest.am debug
Исходный код плагина
C-подобный:
/* Anti Decompiler :) */
#pragma compress 1

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>
#include <cstrike>
#include <engine>
#include <hamsandwich>
#include <xs>
#include <fun>
#include <shudmessage>

#define PLUGIN  "CS Revo: Dispenser"
#define VERSION "1.5"
#define AUTHOR  "Wilian M."

#define PREFIX_CHAT "^1[^4P4E^1]"
#define PREFIX_MENUS "\r[\wCSZ TEAM\r]"

#define dispenser_classname "bdispenser"
#define dispenser_classmove "dispenser_move"

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

#define TASK_ANIM 4875154
#define ID_ANIM (iTaskID - TASK_ANIM)

new const Float:xStuckSize[][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}
}

enum _:g_MaxCvars
{
	CVAR_LVL1_PRICE,
	CVAR_LVL2_PRICE,
	CVAR_LVL3_PRICE,
	CVAR_LVL4_PRICE,
	CVAR_DISTANCE_LIFE,
	CVAR_DISTANCE_LIFE_VIP,
	CVAR_BONUS_DESTROY,
	CVAR_GLOW,
	CVAR_HP_LVL1,
	CVAR_HP_LVL2,
	CVAR_HP_LVL3,
	CVAR_HP_LVL4,
	CVAR_DISP_HP_LVL1,
	CVAR_DISP_HP_LVL2,
	CVAR_DISP_HP_LVL3,
	CVAR_DISP_HP_LVL4,
	CVAR_GIVE_MONEY_TIME,
	CVAR_GIVE_MONEY_DISTANCE,
	CVAR_GIVE_MONEY_MIN,
	CVAR_GIVE_MONEY_MAX,
	CVAR_LIMIT_PER_PLAYER,
	CVAR_REMOVE_ROUND_RESTART,
	CVAR_AP_LVL1,
	CVAR_AP_LVL2,
	CVAR_AP_LVL3,
	CVAR_AP_LVL4,
	CVAR_LIGHT,
	CVAR_LIMIT_GLOBAL,
	CVAR_AUTOMATIC_STUCK,
	CVAR_SHOW_LIFE_SPRITE,
	CVAR_IDLE_SOUND,
	CVAR_GIVE_AMMO_MIN,
	CVAR_GIVE_AMMO_MAX,
	CVAR_GIVE_AMMO_TIME,
	CVAR_GIVE_AMMO_DISTANCE,
	CVAR_EFFECT_LVL_4,
	CVAR_ONEMODEL,
	CVAR_USE_DROP_TO_BUY,
	CVAR_SHOW_LINE_LIFE,
	CVAR_ALL_LVL_GIVE_AMMO,
	CVAR_INSTANT_PLANT
}

new g_DamageSounds[][] =
{
	"debris/metal1.wav",
	"debris/metal2.wav",
	"debris/metal3.wav"
}

new xBulletsSounds[][] =
{
	"csr/dispenser_bullet_chain.wav",
	"csr/dispenser_bullet_chain2.wav"
}

enum
{
	ANIM_LVL1_IDLE,
	ANIM_LVL1_BUILD,
	ANIM_LVL2_IDLE,
	ANIM_LVL2_BUILD,
	ANIM_LVL3_IDLE,
	ANIM_LVL3_BUILD
}

enum
{
	BUILD_DISPENSER_YES,
	BUILD_DISPENSER_NO,
}

new g_DispActive[] = "csr/dispenser_generate_metal.wav"
new g_DispSndFail[] = "csr/dispenser_fail.wav"
new g_DispSndDestroy[] = "csr/dispenser_explode.wav"
new g_DispSndIdle[] = "csr/dispenser_idle.wav"

new g_DispModelPrint[] = "models/csr/dispenser_blueprint.mdl"
new g_DispModel[] = "models/csr/dispenser_normal.mdl"
new g_DispModelVip[] = "models/csr/dispenser_vip.mdl"
new g_DispModelGibsR[] = "models/csr/dispenser_gibs_r.mdl"
new g_DispModelGibsB[] = "models/csr/dispenser_gibs_b.mdl"
new g_DispSprSmoke[] = "sprites/csr/dispenser_smoke.spr"
new g_DispSprHealLifeB[] = "sprites/csr/healbeam_blue.spr"
new g_DispSprHealLifeR[] = "sprites/csr/healbeam_red.spr"

new Float:g_DispOrigin[33][3], Float:f_TimeFloodDispTouch[33], Float:f_TimeGiveMoney[33], g_BeamColor[33][3], g_DispPlayerCount[33]
new g_PrecSprLife, g_PrecSprSmoke, g_Cvar[g_MaxCvars], g_PrecSprFlare3, g_PrecSprHealLifeB, g_PrecSprHealLifeR, g_PrecDispModelGibsR, g_PrecDispModelGibsB
new g_PlayerMovingDisp[33], g_IsVip[33], Float:f_TimePostThink[33], g_iPlantOk[33], Float:f_TimePlantHud[33], Float:f_TimeGiveAmmo[33]
new xStuck[33], xModelIndex[2]

#define DISPENSER_VIP pev_iuser1
#define DISPENSER_OWNER pev_iuser2
#define DISPENSER_LEVEL pev_iuser3
#define DISPENSER_TEAM pev_iuser4

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_forward(FM_TraceLine, "fw_TraceLinePost", true)
	register_think(dispenser_classname, "tk_Dispenser")
	register_touch(dispenser_classname, "player", "fw_DispenserTouch")
	register_event("HLTV", "xEventNewRound", "a", "1=0", "2=0")
	register_forward(FM_CmdStart, "fw_CmdStart")

	RegisterHam(Ham_TakeDamage, "func_breakable", "ham_TakeDamagePost", true)
	RegisterHam(Ham_TakeDamage, "func_breakable", "ham_TakeDamagePre", false)
	RegisterHam(Ham_TraceAttack, "func_breakable", "ham_TraceAttackPre", false)

	g_Cvar[CVAR_INSTANT_PLANT] = create_cvar("csr_disp_instant_plant", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_ALL_LVL_GIVE_AMMO] = create_cvar("csr_disp_all_lvl_give_ammo", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_SHOW_LINE_LIFE] = create_cvar("csr_disp_show_line_life", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_USE_DROP_TO_BUY] = create_cvar("csr_disp_use_drop_to_buy", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_ONEMODEL] = create_cvar("csr_disp_onemodel", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_DISTANCE_LIFE] = create_cvar("csr_disp_dist_life", "500")
	g_Cvar[CVAR_DISTANCE_LIFE_VIP] = create_cvar("csr_disp_dist_life_vip", "1200")
	g_Cvar[CVAR_BONUS_DESTROY] = create_cvar("csr_disp_bonus_destroy", "1000")
	g_Cvar[CVAR_GLOW] = create_cvar("csr_disp_glow", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)

	g_Cvar[CVAR_LVL1_PRICE] = create_cvar("csr_disp_lvl1_price", "1000")
	g_Cvar[CVAR_LVL2_PRICE] = create_cvar("csr_disp_lvl2_price", "2000")
	g_Cvar[CVAR_LVL3_PRICE] = create_cvar("csr_disp_lvl3_price", "3000")
	g_Cvar[CVAR_LVL4_PRICE] = create_cvar("csr_disp_lvl4_price", "4000")

	g_Cvar[CVAR_HP_LVL1] = create_cvar("csr_disp_lvl1_give_hp", "110")
	g_Cvar[CVAR_HP_LVL2] = create_cvar("csr_disp_lvl2_give_hp", "120")
	g_Cvar[CVAR_HP_LVL3] = create_cvar("csr_disp_lvl3_give_hp", "130")
	g_Cvar[CVAR_HP_LVL4] = create_cvar("csr_disp_lvl4_give_hp", "150")

	g_Cvar[CVAR_AP_LVL1] = create_cvar("csr_disp_lvl1_give_ap", "0")
	g_Cvar[CVAR_AP_LVL2] = create_cvar("csr_disp_lvl2_give_ap", "20")
	g_Cvar[CVAR_AP_LVL3] = create_cvar("csr_disp_lvl3_give_ap", "30")
	g_Cvar[CVAR_AP_LVL4] = create_cvar("csr_disp_lvl4_give_ap", "80")

	g_Cvar[CVAR_DISP_HP_LVL1] = create_cvar("csr_disp_hp_lvl1", "800")
	g_Cvar[CVAR_DISP_HP_LVL2] = create_cvar("csr_disp_hp_lvl2", "1400")
	g_Cvar[CVAR_DISP_HP_LVL3] = create_cvar("csr_disp_hp_lvl3", "2100")
	g_Cvar[CVAR_DISP_HP_LVL4] = create_cvar("csr_disp_hp_lvl4", "3200")

	g_Cvar[CVAR_GIVE_MONEY_TIME] = create_cvar("csr_disp_give_money_time", "5", .has_min = true, .min_val = 0.0)
	g_Cvar[CVAR_GIVE_MONEY_DISTANCE] = create_cvar("csr_disp_give_money_dist", "200")
	g_Cvar[CVAR_GIVE_MONEY_MIN] = create_cvar("csr_disp_give_money_min", "10")
	g_Cvar[CVAR_GIVE_MONEY_MAX] = create_cvar("csr_disp_give_money_max", "50")

	g_Cvar[CVAR_LIMIT_PER_PLAYER] = create_cvar("csr_disp_limit_per_player", "3")
	g_Cvar[CVAR_REMOVE_ROUND_RESTART] = create_cvar("csr_disp_remove_on_rr", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_LIGHT] = create_cvar("csr_disp_light", "0", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_LIMIT_GLOBAL] = create_cvar("csr_disp_limit_global", "5")
	g_Cvar[CVAR_AUTOMATIC_STUCK] = create_cvar("csr_disp_automatic_stuck", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_SHOW_LIFE_SPRITE] = create_cvar("csr_disp_show_life_sprite", "0", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)
	g_Cvar[CVAR_IDLE_SOUND] = create_cvar("csr_disp_idle_sound", "1", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0)

	g_Cvar[CVAR_GIVE_AMMO_MIN] = create_cvar("csr_disp_give_ammo_min", "1")
	g_Cvar[CVAR_GIVE_AMMO_MAX] = create_cvar("csr_disp_give_ammo_max", "1")
	g_Cvar[CVAR_GIVE_AMMO_DISTANCE] = create_cvar("csr_disp_give_ammo_dist", "400")
	g_Cvar[CVAR_GIVE_AMMO_TIME] = create_cvar("csr_disp_give_ammo_time", "1", .has_min = true, .min_val = 0.0)
	g_Cvar[CVAR_EFFECT_LVL_4] = create_cvar("csr_disp_effect_lvl4", "0")
	

	xRegisterSay("disp", "xBuyDispenser")
	xRegisterSay("dispenser", "xBuyDispenser")
	xRegisterSay("destroy", "xDestroyDispenser")
	xRegisterSay("destruir", "xDestroyDispenser")
	xRegisterSay("distruir", "xDestroyDispenser")

	register_clcmd("drop", "xHookDrop")

	set_task(0.1, "xCheckStuck", _, _, _, "b")
	//set_task(500.0, "xSitePub", _, _, _, "b")
}

public xHookDrop(id)
{
	static weapon

	weapon = get_user_weapon(id)

	if(weapon == CSW_KNIFE && get_pcvar_num(g_Cvar[CVAR_USE_DROP_TO_BUY]))
	{
		xBuyDispenser(id)
		return PLUGIN_HANDLED
	}
	
	return PLUGIN_CONTINUE
}

/*
public xSitePub()
{
	client_print_color(0, print_team_red, "%s ^3Acesse: ^4www.CSZTEAM.com.br", PREFIX_CHAT)
}*/

public xCheckStuck()
{
	if(get_pcvar_num(g_Cvar[CVAR_AUTOMATIC_STUCK]))
	{
		static players[32], pnum, player
		get_players(players, pnum)
		static  Float:origin[3], Float:mins[3], hull, Float:vec[3], 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) && !get_user_noclip(player) && !(pev(player,pev_solid) & SOLID_NOT))
				{
					xStuck[player] ++

					if(xStuck[player] >= 7)
					{
						pev(player, pev_mins, mins)
						vec[2] = origin[2]

						for(o=0; o < sizeof(xStuckSize); ++o)
						{
							vec[0] = origin[0] - mins[0] * xStuckSize[o][0]
							vec[1] = origin[1] - mins[1] * xStuckSize[o][1]
							vec[2] = origin[2] - mins[2] * xStuckSize[o][2]

							if(is_hull_vacant(vec, hull,player))
							{
								engfunc(EngFunc_SetOrigin, player, vec)
								set_pev(player,pev_velocity,{0.0,0.0,0.0})
								o = sizeof(xStuckSize)
							}
						}
					}
				}
				else
				{
					xStuck[player] = 0
				}
			}
		}
	}
}

public client_putinserver(id)
{
	if(get_user_flags(id) & ADMIN_RESERVATION)
		g_IsVip[id] = true
	else
		g_IsVip[id] = false
}

public client_disconnected(id)
{
	RemoveEntMovePlayer(id)
	BreakAllPlayerDispensers(id)

	g_DispOrigin[id][0] = 0.0
	g_DispOrigin[id][1] = 0.0
	g_DispOrigin[id][2] = 0.0
	g_BeamColor[id][0] = false
	g_BeamColor[id][1] = false
	g_BeamColor[id][2] = false
	g_DispPlayerCount[id] = false
	g_IsVip[id] = false
	g_PlayerMovingDisp[id] = false
	f_TimeFloodDispTouch[id] = 0.0
	f_TimeGiveMoney[id] = 0.0
	f_TimePostThink[id] = 0.0
	f_TimePlantHud[id] = 0.0
	f_TimeGiveAmmo[id] = 0.0
	g_iPlantOk[id] = false
	xStuck[id] = false
}

public plugin_cfg()
{
	static cfgdir[32]
	get_configsdir(cfgdir, charsmax(cfgdir))
	
	server_cmd("exec %s/csr_dispenser.cfg", cfgdir)
}

public plugin_precache()
{
	g_PrecSprFlare3 = precache_model("sprites/flare3.spr")
	g_PrecSprLife = precache_model("sprites/laserbeam.spr")
	
	g_PrecSprSmoke = precache_model(g_DispSprSmoke)
	g_PrecSprHealLifeB = precache_model(g_DispSprHealLifeB)
	g_PrecSprHealLifeR = precache_model(g_DispSprHealLifeR)
	g_PrecDispModelGibsR = precache_model(g_DispModelGibsR)
	g_PrecDispModelGibsB = precache_model(g_DispModelGibsB)
	xModelIndex[0] = precache_model(g_DispModelVip)
	xModelIndex[1] = precache_model(g_DispModel)

	precache_model(g_DispModelPrint)
	precache_model(g_DispModel)
	precache_model(g_DispModelVip)
	precache_sound(g_DispActive)
	precache_sound(g_DispSndFail)
	precache_sound(g_DispSndDestroy)
	precache_sound(g_DispSndIdle)

	static i
	for(i = 0; i < sizeof(g_DamageSounds);i++) 
		engfunc(EngFunc_PrecacheSound, g_DamageSounds[i])

	for(i = 0; i < sizeof(xBulletsSounds);i++) 
		engfunc(EngFunc_PrecacheSound, xBulletsSounds[i])
}

public xEventNewRound()
{
	if(get_pcvar_num(g_Cvar[CVAR_REMOVE_ROUND_RESTART]))
		UTIL_DestroyDispensers()
}

public client_PreThink(id)
{
	static Float:ftime
	ftime = get_gametime()

	if(ftime - 0.05 > f_TimePostThink[id]) // sem spamar o think
	{
		if(g_PlayerMovingDisp[id] && is_user_alive(id))
		{
			static iEnt; iEnt = FM_NULLENT

			while((iEnt = find_ent_by_class(iEnt, dispenser_classmove)))
			{
				if(entity_get_int(iEnt, EV_INT_iuser2) != id)
					continue

				if(pev_valid(iEnt))
				{
					static Float:fOrigin[3]
					xGetOriginFromDistPlayer(id, 125.0, fOrigin)
					entity_set_origin(iEnt, fOrigin)
					drop_to_floor(iEnt)

					static entlist[3]
					if(find_sphere_class(iEnt, dispenser_classname, 100.0, entlist, 2) || find_sphere_class(iEnt, "player", 20.0, entlist, 2) || TraceCheckCollides(fOrigin, 35.0))
					{
						entity_set_int(iEnt, EV_INT_sequence, BUILD_DISPENSER_NO)
						g_iPlantOk[id] = false
					}
					else
					{
						entity_set_int(iEnt, EV_INT_sequence, BUILD_DISPENSER_YES)
						g_iPlantOk[id] = true
					}
				}
			}

			if(ftime - 1.2 > f_TimePlantHud[id])
			{
				set_shudmessage
				(
					0, // r
					150, // g
					255, // b
					100, // alpha
					0.04, 0.60,
					1.1, // holdtime (tempo exibido na tela)
					0.04, // fade in time
					0.04, // fade out time
					-1, // channel
					2, // effect
					255, // effect_R
					255, // effect_G
					255, // effect_B
					255, // effect_alpha
					0.07 // effect time
				)
				show_shudmessage(id, "Aperte [E] para plantar^n^t^t^t^t^tO dispenser!")

				f_TimePlantHud[id] = ftime
			}
		}

		f_TimePostThink[id] = ftime
	}
}

public xBuyDispenser(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE

	if(!(pev(id, pev_flags) & FL_ONGROUND))
	{
		client_print_color(id, print_team_default, "%s ^3Tente ficar em um chão ^1PLANO ^3para poder comprar um ^4Dispenser^3.", PREFIX_CHAT)
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}

	if(g_DispPlayerCount[id] >= get_pcvar_num(g_Cvar[CVAR_LIMIT_PER_PLAYER]))
	{
		client_print_color(id, print_team_default, "%s ^3Você já atingiu o limite de ^4Dispenser ^3.", PREFIX_CHAT)
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}

	/*if((xLimitGlobal[0] >= get_pcvar_num(g_Cvar[CVAR_LIMIT_GLOBAL]) && get_user_team(id) == 1) || (xLimitGlobal[1] >= get_pcvar_num(g_Cvar[CVAR_LIMIT_GLOBAL]) && get_user_team(id) == 2))
	{
		client_print_color(id, print_team_default, "%s ^3Sua equipe atingiu o limite de ^4Dispenser^3.", PREFIX_CHAT)
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}*/

	static iMoney; iMoney = cs_get_user_money(id)
	static iPriceDisp; iPriceDisp = get_pcvar_num(g_Cvar[CVAR_LVL1_PRICE])

	if(iMoney < iPriceDisp)
	{
		client_print_color(id, print_team_default, "%s ^3Você não possui dinheiro suficiente! ^4$: %s^3.", PREFIX_CHAT, xAddPoint(iPriceDisp))
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}

	if(g_PlayerMovingDisp[id])
	{
		client_print_color(id, print_team_default, "%s ^3Você já está com um ^4Dispenser ^3ativado, coloque-o para comprar mais.", PREFIX_CHAT)
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}
	else
	{
		if(get_pcvar_num(g_Cvar[CVAR_INSTANT_PLANT]))
		{
			static Float:fOrigin[3]
			get_origin_from_dist_player(id, 100.0, fOrigin)

			if(xCreateDispanser(fOrigin, id))
			{
				client_print_color(id, print_team_default, "%s ^4Dispenser ^3plantado!", PREFIX_CHAT)
				cs_set_user_money(id, iMoney - iPriceDisp)
			}
			else
			{
				client_cmd(id, "spk %s", g_DispSndFail)
			}
		}
		else
		{
			CreateDispMoveEffect(id)
			cs_set_user_money(id, iMoney - iPriceDisp)
		}
	}

	return PLUGIN_HANDLED
}

public xDestroyDispenser(id)
{
	if(!g_DispPlayerCount[id])
	{
		client_print_color(id, print_team_default, "%s ^3Você não possui nenhum ^4Dispenser ^3para ser destruído.", PREFIX_CHAT)
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_HANDLED
	}

	static ent; ent = FM_NULLENT

	while((ent = find_ent_by_class(ent, dispenser_classname)))
	{
		if(pev(ent, DISPENSER_OWNER) != id) 
			continue

		if(pev_valid(ent)) 
		{
			static iLevel, xGiveMoney
			iLevel = pev(ent, DISPENSER_LEVEL)

			xGiveMoney = 0

			switch(iLevel)
			{
				case 1: { xGiveMoney = (get_pcvar_num(g_Cvar[CVAR_LVL1_PRICE])) / 2; }
				case 2: { xGiveMoney = (get_pcvar_num(g_Cvar[CVAR_LVL2_PRICE])) / 2; }
				case 3: { xGiveMoney = (get_pcvar_num(g_Cvar[CVAR_LVL3_PRICE])) / 2; }
				case 4: { xGiveMoney = (get_pcvar_num(g_Cvar[CVAR_LVL4_PRICE])) / 2; }
			}

			g_DispPlayerCount[id] --
			//xLimitTeamAtt(id)

			cs_set_user_money(id, cs_get_user_money(id) + xGiveMoney)
			client_print_color(id, print_team_default, "%s ^3Você obteve: ^4$: %s ^3de dinheiro por destruír seu ^4Dispenser ^3Lvl: ^4%d^3.", PREFIX_CHAT,
			xAddPoint(xGiveMoney), iLevel)
			xRemoveEntFix(ent)
		}
	}

	return PLUGIN_HANDLED
}

/*
public xLimitTeamAtt(id)
{
	static xMyTeam; xMyTeam = get_user_team(id)

	if(xMyTeam == 1)
		xLimitGlobal[0] --
	else
		xLimitGlobal[1] --
}*/


public xRemoveEntFix(ent)
{
	set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
	set_pev(ent, pev_nextthink, get_gametime() + 0.5)
}

public CreateDispMoveEffect(id)
{
	static Float:fOrigin[3]
	entity_get_vector(id, EV_VEC_origin, fOrigin)
	get_origin_from_dist_player(id, 128.0, fOrigin)

	new iEnt

	iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))

	if(!pev_valid(iEnt))
		return false
	
	entity_set_string(iEnt, EV_SZ_classname, dispenser_classmove)
	entity_set_model(iEnt, g_DispModelPrint)
	entity_set_vector(iEnt, EV_VEC_origin, fOrigin)
	entity_set_int(iEnt, EV_INT_solid, SOLID_NOT)
	entity_set_int(iEnt, EV_INT_iuser2, id)
	entity_set_float(iEnt, EV_FL_framerate, 0.0)
	entity_set_float(iEnt, EV_FL_animtime, get_gametime())
	entity_set_int(iEnt, EV_INT_sequence, BUILD_DISPENSER_NO)
	fm_set_rendering(iEnt, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 255)
	entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + 0.1)

	g_PlayerMovingDisp[id] = true

	return true
}

public fw_CmdStart(id, uc_handle, randseed)
{
	if(!is_user_connected(id) || !is_user_alive(id))
		return FMRES_IGNORED

	static button; button = get_uc(uc_handle , UC_Buttons)
	static oldbutton; oldbutton = pev(id, pev_oldbuttons)

	if(button & IN_USE && !(oldbutton & IN_USE) && g_PlayerMovingDisp[id] && g_iPlantOk[id])
		xDispFinalCheck(id)

	return FMRES_IGNORED
}

public xDispFinalCheck(id)
{
	static Float:fOrigin[3]
	get_origin_from_dist_player(id, 128.0, fOrigin)

	if(xCreateDispanser(fOrigin, id))
	{
		client_print_color(id, print_team_default, "%s ^4Dispenser ^3plantado!", PREFIX_CHAT)
		RemoveEntMovePlayer(id)

		g_PlayerMovingDisp[id] = false
	}
}

public xAllowPlant(id)
{
	static Float:vTraceDirection[3], Float:vTraceEnd[3],Float:vOrigin[3];
	
	pev(id, pev_origin, vOrigin)
	vOrigin[2] += 15
	velocity_by_aim(id, 128, vTraceDirection)
	xs_vec_add(vTraceDirection, vOrigin, vTraceEnd)
	
	engfunc(EngFunc_TraceLine, vOrigin, vTraceEnd, DONT_IGNORE_MONSTERS, id, 0)
	
	static Float:fFraction
	get_tr2(0, TR_flFraction, fFraction)
	
	// -- We hit something!
	if(fFraction < 1.0)
		return true

	return false
}

public RemoveEntMovePlayer(id)
{
	static ent; ent = FM_NULLENT

	while((ent = find_ent_by_class(ent, dispenser_classmove)))
	{
		if(entity_get_int(ent, EV_INT_iuser2) != id)
			continue

		if(pev_valid(ent))
		{
			xRemoveEntFix(ent)
		}
	}
}

public fw_DispenserTouch(ent, id)
{
	static Float:time
	time = get_gametime()

	if(f_TimeFloodDispTouch[id] > time)
		return PLUGIN_CONTINUE

	f_TimeFloodDispTouch[id] = time + 2.5
    
	if(!pev_valid(ent))
		return PLUGIN_CONTINUE

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

	static iTeam
	iTeam = pev(ent, DISPENSER_TEAM)

	static iLevel
	iLevel = pev(ent, DISPENSER_LEVEL)

	if(iLevel == 4)
		return PLUGIN_CONTINUE

	if(iTeam != get_user_team(id))
		return PLUGIN_CONTINUE

	static iOwner
	iOwner = pev(ent, DISPENSER_OWNER)

	if(!g_IsVip[id])
	{
		if(iOwner == id)
		{
			client_print_color(id, print_team_default, "%s ^3Você não pode upar o level do seu proprio ^4Dispenser ^3apenas ^1V.I.P^3.", PREFIX_CHAT)
			client_cmd(id, "spk %s", g_DispSndFail)

			return PLUGIN_CONTINUE
		}
	}
	
	static iMoney
	iMoney = cs_get_user_money(id)

	static iDispBuy, iDispHpUp

	switch(iLevel + 1)
	{
		case 1: iDispBuy = get_pcvar_num(g_Cvar[CVAR_LVL1_PRICE]), iDispHpUp = get_pcvar_num(g_Cvar[CVAR_DISP_HP_LVL1])
		case 2: iDispBuy = get_pcvar_num(g_Cvar[CVAR_LVL2_PRICE]), iDispHpUp = get_pcvar_num(g_Cvar[CVAR_DISP_HP_LVL2])
		case 3: iDispBuy = get_pcvar_num(g_Cvar[CVAR_LVL3_PRICE]), iDispHpUp = get_pcvar_num(g_Cvar[CVAR_DISP_HP_LVL3])
		case 4: iDispBuy = get_pcvar_num(g_Cvar[CVAR_LVL4_PRICE]), iDispHpUp = get_pcvar_num(g_Cvar[CVAR_DISP_HP_LVL4])
	}

	if(iMoney < iDispBuy)
	{
		client_print_color(id, print_team_default, "%s ^3Você não possui ^4dinheiro ^3para subir o ^4Dispenser ^3de level. ^1Preço: ^4$: %s^3.", PREFIX_CHAT, xAddPoint(iDispBuy))
		client_cmd(id, "spk %s", g_DispSndFail)

		return PLUGIN_CONTINUE
	}

	iLevel ++
	cs_set_user_money(id, iMoney - iDispBuy)

	if(task_exists(ent+TASK_ANIM))
		remove_task(ent+TASK_ANIM)

	set_pev(ent, DISPENSER_LEVEL, iLevel)
	set_pev(ent, pev_health, float(iDispHpUp))

	static iDispVip
	iDispVip = pev(ent, DISPENSER_VIP)

	if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
	{
		engfunc(EngFunc_SetModel, ent, g_DispModelVip)
		set_pev(ent, pev_modelindex, xModelIndex[0])
	}
	else
	{
		engfunc(EngFunc_SetModel, ent, g_DispModel)
		set_pev(ent, pev_modelindex, xModelIndex[1])
	}

	engfunc(EngFunc_SetSize, ent, Float:{ -20.0, -20.0, 0.0 }, Float:{ 20.0, 20.0, 80.0 })
	emit_sound(ent, CHAN_STATIC, g_DispActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
	switch(cs_get_user_team(id))
	{
		case CS_TEAM_T:
		{
			g_BeamColor[id][0] = 255
			g_BeamColor[id][1] = 0
			g_BeamColor[id][2] = 0

			switch(iLevel)
			{
				case 2:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL2_BUILD, 1.0)
						set_task(1.4, "Model_IdleLvl2", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 5)
					}
				}

				case 3:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL3_BUILD, 1.0)
						set_task(0.9, "Model_IdleLvl3", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 6)
					}
				}

				case 4:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL3_BUILD, 1.0)
						set_task(0.9, "Model_IdleLvl3", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 7)
					}
				}
			}

			set_pev(ent, pev_skin, get_user_team(id))
		}

		case CS_TEAM_CT:
		{
			g_BeamColor[id][0] = 0
			g_BeamColor[id][1] = 0
			g_BeamColor[id][2] = 255

			switch(iLevel)
			{
				case 2:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL2_BUILD, 1.0)
						set_task(1.4, "Model_IdleLvl2", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 1)
					}
				}

				case 3:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL3_BUILD, 1.0)
						set_task(0.9, "Model_IdleLvl3", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 2)
					}
				}

				case 4:
				{
					if(iDispVip && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
					{
						UTIL_SetAnim(ent, ANIM_LVL3_BUILD, 1.0)
						set_task(0.9, "Model_IdleLvl3", ent+TASK_ANIM)
					}
					else
					{
						set_pev(ent, pev_body, 3)
					}
				}
			}

			set_pev(ent, pev_skin, get_user_team(id))
		}
	}
    
	if(!is_user_connected(iOwner))
		return PLUGIN_CONTINUE
    
	static szName[32]
	get_user_name(id, szName, charsmax(szName))

	if(iOwner == id)
		client_print_color(id, print_team_default, "%s ^3Você subiu o level do seu ^4Dispenser ^3para o level: ^4%d^3.", PREFIX_CHAT, iLevel)
	else
		client_print_color(iOwner, print_team_default, "%s ^1%s ^3subiu o level do seu ^4Dispenser ^3para o level: ^4%d^3.", PREFIX_CHAT, szName, iLevel)

	return PLUGIN_CONTINUE
}

public tk_Dispenser(iEnt)
{
	if(pev_valid(iEnt))
	{
		static iOwner
		iOwner = pev(iEnt, DISPENSER_OWNER)

		if(!is_user_connected(iOwner))
			return PLUGIN_CONTINUE

		static id, fRadius, iDispHp, iLevel, iDispAp, Float:iTakeApHp
		iLevel = pev(iEnt, DISPENSER_LEVEL)

		if(get_pcvar_num(g_Cvar[CVAR_EFFECT_LVL_4]))
		{
			if(iLevel == 4)
			{
				if(!(pev(iEnt, pev_effects) & EF_BRIGHTFIELD))
					set_pev(iEnt, pev_effects, pev(iEnt, pev_effects) | EF_BRIGHTFIELD)
			}
		}
		
		switch(iLevel)
		{
			case 1:
			{
				iDispHp = get_pcvar_num(g_Cvar[CVAR_HP_LVL1])
				iDispAp = get_pcvar_num(g_Cvar[CVAR_AP_LVL1])
				iTakeApHp = 1.0
			}

			case 2:
			{
				iDispHp = get_pcvar_num(g_Cvar[CVAR_HP_LVL2])
				iDispAp = get_pcvar_num(g_Cvar[CVAR_AP_LVL2])
				iTakeApHp = 1.5
			}

			case 3:
			{
				iDispHp = get_pcvar_num(g_Cvar[CVAR_HP_LVL3])
				iDispAp = get_pcvar_num(g_Cvar[CVAR_AP_LVL3])
				iTakeApHp = 2.0
			}

			case 4:
			{
				iDispHp = get_pcvar_num(g_Cvar[CVAR_HP_LVL4])
				iDispAp = get_pcvar_num(g_Cvar[CVAR_AP_LVL4])
				iTakeApHp = 2.5
			}
		}
        
		static Float:time
		time = get_gametime()

		for(id = 1; id <= MaxClients; id++)
		{
			static iTeam
			iTeam = get_user_team(id)

			if(is_user_alive(id) && get_user_team(id) == get_user_team(iOwner))
			{
				if(g_IsVip[id])
					fRadius = get_pcvar_num(g_Cvar[CVAR_DISTANCE_LIFE_VIP])
				else
					fRadius = get_pcvar_num(g_Cvar[CVAR_DISTANCE_LIFE])

				static Float:flOrigin[3]
				pev(id, pev_origin, flOrigin)

				if(get_distance_f(g_DispOrigin[iOwner], flOrigin) <= fRadius)
				{
					if(UTIL_IsVisible(id, iEnt, 1))
					{
						if(get_user_health(id) < iDispHp)
						{
							if(pev(id, pev_health) < iDispHp)
							{
								set_pev(id, pev_health, floatmin(pev(id, pev_health) + iTakeApHp, float(iDispHp)))
								
								if(get_pcvar_num(g_Cvar[CVAR_SHOW_LIFE_SPRITE]))
								{
									static iOrigin[3]
									get_user_origin(id, iOrigin)

									message_begin(MSG_PVS, SVC_TEMPENTITY, iOrigin)
									write_byte(TE_PROJECTILE)
									write_coord(iOrigin[0] + random_num(-10, 15))
									write_coord(iOrigin[1] + random_num(-10, 15))
									write_coord(iOrigin[2] + random_num(5, 30))
									write_coord(10)
									write_coord(15)
									write_coord(20)
									write_short(iTeam == 1 ? g_PrecSprHealLifeR : g_PrecSprHealLifeB)
									write_byte(1)
									write_byte(id)
									message_end()
								}
							}
							if(get_pcvar_num(g_Cvar[CVAR_SHOW_LINE_LIFE]))
								UTIL_BeamEnts(flOrigin, g_DispOrigin[iOwner], g_BeamColor[iOwner][0], g_BeamColor[iOwner][1], g_BeamColor[iOwner][2], g_PrecSprLife, 40, 0, 1)
						}
					}

					if(UTIL_IsVisible(id, iEnt, 1) && get_user_armor(id) < iDispAp)
					{                                                             
						if(pev(id, pev_armorvalue) < iDispAp)
						{
							set_pev(id, pev_armorvalue, floatmin(pev(id, pev_armorvalue) + iTakeApHp, float(iDispAp)))
						}
					
						if(get_pcvar_num(g_Cvar[CVAR_SHOW_LINE_LIFE]))
							UTIL_BeamEnts(flOrigin, g_DispOrigin[iOwner], g_BeamColor[iOwner][0], g_BeamColor[iOwner][1], g_BeamColor[iOwner][2], g_PrecSprLife, 40, 0, 1)
					}
				}

				if(UTIL_IsVisible(id, iEnt, 1) && get_distance_f(g_DispOrigin[iOwner], flOrigin) <= float(get_pcvar_num(g_Cvar[CVAR_GIVE_MONEY_DISTANCE])) && iLevel == 4 && get_pcvar_num(g_Cvar[CVAR_GIVE_MONEY_TIME]))
				{
					if(time - float(get_pcvar_num(g_Cvar[CVAR_GIVE_MONEY_TIME])) > f_TimeGiveMoney[id])
					{
						cs_set_user_money(id, cs_get_user_money(id) + random_num(get_pcvar_num(g_Cvar[CVAR_GIVE_MONEY_MIN]), get_pcvar_num(g_Cvar[CVAR_GIVE_MONEY_MAX])))

						f_TimeGiveMoney[id] = time
					}
				}

				if(UTIL_IsVisible(id, iEnt, 1) && get_distance_f(g_DispOrigin[iOwner], flOrigin) <= float(get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_DISTANCE])) && get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_TIME]))
				{
					if(get_pcvar_num(g_Cvar[CVAR_ALL_LVL_GIVE_AMMO]) || iLevel == 4)
					{
						if(time - float(get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_TIME])) > f_TimeGiveAmmo[id])
						{
							static fammo, fbammo, xUserGetWpn
							xUserGetWpn = get_user_weapon(id)

							switch(xUserGetWpn)
							{
								case CSW_P228 : fammo = 13, fbammo = 52;
								case CSW_SCOUT : fammo = 10, fbammo = 90;
								case CSW_MAC10 : fammo = 30, fbammo = 100;
								case CSW_AUG : fammo = 30, fbammo = 90;
								case CSW_ELITE : fammo = 30, fbammo = 120;
								case CSW_FIVESEVEN : fammo = 20, fbammo = 100;
								case CSW_UMP45 : fammo = 25, fbammo = 100;
								case CSW_SG550 : fammo = 30, fbammo = 90;
								case CSW_GALI : fammo = 35, fbammo = 90;
								case CSW_FAMAS : fammo = 25, fbammo = 90;
								case CSW_USP : fammo = 12, fbammo = 100;
								case CSW_GLOCK18 : fammo = 20, fbammo = 120;
								case CSW_AWP : fammo = 10, fbammo = 30;
								case CSW_MP5NAVY : fammo = 30, fbammo = 120;
								case CSW_M249 : fammo = 100, fbammo = 200;
								case CSW_M3 : fammo = 8, fbammo = 32;
								case CSW_M4A1 : fammo = 30, fbammo = 90;
								case CSW_TMP : fammo = 30, fbammo = 120;
								case CSW_G3SG1 : fammo = 20, fbammo = 90;
								case CSW_SG552 : fammo = 30, fbammo = 90;
								case CSW_AK47 : fammo = 30, fbammo = 90;
								case CSW_P90 : fammo = 50, fbammo = 100;
								default: continue
							}

							if(pev_valid(id) == 2)
							{
								static xUserWpn, currentAmmo, currentBammo, newAmmo, newBAmmo

								xUserWpn = get_pdata_cbase(id, 373)
								currentAmmo = cs_get_weapon_ammo(xUserWpn)
								currentBammo = cs_get_user_bpammo(id, xUserGetWpn)
								newAmmo = currentAmmo + random_num(get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_MIN]), get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_MAX]))
								newBAmmo = currentBammo + random_num(get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_MIN]), get_pcvar_num(g_Cvar[CVAR_GIVE_AMMO_MAX]))
								
								if(currentAmmo == fammo && currentBammo == fbammo)
									continue

								if(newAmmo <= fammo)
								{
									cs_set_weapon_ammo(xUserWpn, newAmmo)
									emit_sound(id, CHAN_ITEM, xBulletsSounds[random_num(0, charsmax(xBulletsSounds))], 0.3, ATTN_NORM, 0, PITCH_NORM)
								}
								else
								{
									if(newBAmmo <= fbammo)
										cs_set_user_bpammo(id, xUserGetWpn, newBAmmo)
									else
										cs_set_user_bpammo(id, xUserGetWpn, fbammo)

									emit_sound(id, CHAN_ITEM, xBulletsSounds[random_num(0, charsmax(xBulletsSounds))], 0.3, ATTN_NORM, 0, PITCH_NORM)
								}
							}

							f_TimeGiveAmmo[id] = time
						}
					}
					
				}
			}
        }

		static Float:entorigin[3]
		pev(iEnt, pev_origin, entorigin)

		static xHP
		xHP = pev(iEnt, pev_health)

		if(xHP <= 350.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, 50.0))
			write_short(g_PrecSprSmoke)
			write_byte(random_num(3,10))
			write_byte(30) //def: 30
			message_end()
		}

		if(get_user_team(iOwner) != pev(iEnt, DISPENSER_TEAM)) // remove o dispenser se eu mudar de time :)
		{
			BreakAllPlayerDispensers(iOwner) // remove todos dispensers da PESSOA

			return PLUGIN_CONTINUE
		}

		set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
    }
	
	return PLUGIN_CONTINUE
}

public BreakAllPlayerDispensers(id)
{
	static ent; ent = FM_NULLENT

	while((ent = find_ent_by_class(ent, dispenser_classname)))
	{
		if(pev(ent, DISPENSER_OWNER) != id)
			continue
		
		if(pev_valid(ent))
		{
			//xLimitTeamAtt(id)
			xRemoveEntFix(ent)
			g_DispPlayerCount[id] --
		}
	}
}

public fw_TraceLinePost(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
	iHitEnt = get_tr(TR_pHit)

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

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

	if(!equal(szClassname, dispenser_classname))
		return FMRES_IGNORED

	new iTeam; iTeam = pev(iHitEnt, DISPENSER_TEAM)

	if(get_user_team(id) != iTeam)
		return FMRES_IGNORED

	new iHealth
	iHealth = pev(iHitEnt, pev_health)

	if(iHealth <= 0)
		return FMRES_IGNORED

	new iOwner; iOwner = pev(iHitEnt, DISPENSER_OWNER)

	if(!is_user_connected(iOwner))
		return FMRES_IGNORED

	new szName[32]
	get_user_name(iOwner, szName, charsmax(szName))

	new iLevel; iLevel = pev(iHitEnt, DISPENSER_LEVEL)

	set_dhudmessage(255, 255, 255, -1.0, 0.65, 0, 0.1, 1.1, 0.0, 0.0)
	show_dhudmessage(id, "Proprietário: %s^nVida: %s^nLevel: %d", szName, xAddPoint(iHealth), iLevel)
	
	return FMRES_IGNORED
}

public ham_TraceAttackPre(ent, iAttacker, Float:flDamage, Float:flDirection[3], iTr, iDamageBits)
{
	if(!pev_valid(ent))
		return HAM_IGNORED
		
	new szClassname[32]
	pev(ent, pev_classname, szClassname, charsmax(szClassname))
	
	if(equal(szClassname, dispenser_classname))
	{
		new iOwner; iOwner = pev(ent, DISPENSER_OWNER)

		if(!is_user_connected(iOwner) || !is_user_connected(iAttacker) || !is_valid_player(iOwner) || !is_valid_player(iAttacker))
			return HAM_SUPERCEDE

		new Float:flEndOrigin[3]
		get_tr2(iTr, TR_vecEndPos, flEndOrigin)
	
		UTIL_Sparks(flEndOrigin)
	}

	return HAM_IGNORED
}

public ham_TakeDamagePre(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, dispenser_classname))
	{
		new iOwner; iOwner = pev(ent, DISPENSER_OWNER)

		if(!is_user_connected(iOwner) || !is_user_connected(idattacker) || !is_valid_player(iOwner) || !is_valid_player(idattacker))
			return HAM_SUPERCEDE

		if(get_user_team(iOwner) == get_user_team(idattacker) && idattacker != iOwner)
			return HAM_SUPERCEDE
	}

	return HAM_IGNORED 
}

public ham_TakeDamagePost(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, dispenser_classname))
	{
		if(!pev_valid(ent))
			return HAM_IGNORED

		new iOwner; iOwner = pev(ent, DISPENSER_OWNER)

		if(!is_user_connected(iOwner) || !is_user_connected(idattacker) || !is_valid_player(iOwner) || !is_valid_player(idattacker))
			return HAM_SUPERCEDE

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

		if(pev(ent, pev_health) <= 0.0)
		{
			new iTeam; iTeam = pev(ent, DISPENSER_TEAM)

			new Float:originF[3]
			pev(ent, pev_origin, originF)

			new szName[32]
			get_user_name(idattacker, szName, charsmax(szName))

			new szNameOwner[32]
			get_user_name(iOwner, szNameOwner, charsmax(szNameOwner))

			UTIL_BreakModel(originF, iTeam == 1 ? g_PrecDispModelGibsR : g_PrecDispModelGibsB, 2)
			DispenserExplode(originF, 10, 50, 50, 2, 35, 50)

			if(idattacker == iOwner)
			{
				client_print_color(iOwner, print_team_default, "%s ^3Você destruiu seu próprio ^4Dispenser^3.", PREFIX_CHAT)
			}
			else
			{
				client_print_color(0, print_team_default, "%s ^1%s ^3destruiu o ^4Dispenser ^3de ^1%s ^3e ganhou ^4$: %s ^3de dinheiro.", PREFIX_CHAT, szName, szNameOwner, xAddPoint(get_pcvar_num(g_Cvar[CVAR_BONUS_DESTROY])))
				cs_set_user_money(idattacker, cs_get_user_money(idattacker) + get_pcvar_num(g_Cvar[CVAR_BONUS_DESTROY]))
			}

			emit_sound(ent, CHAN_ITEM, g_DispSndDestroy, VOL_NORM, ATTN_NORM, 0, PITCH_HIGH)
			g_DispPlayerCount[iOwner] --
			//xLimitTeamAtt(iOwner)

			xRemoveEntFix(ent)
		}

		if(pev_valid(ent))
			emit_sound(ent, CHAN_STATIC, g_DamageSounds[random_num(0, charsmax(g_DamageSounds))], 0.3, ATTN_NORM, 0, PITCH_NORM)
	}

	return HAM_IGNORED
}

stock bool:xCreateDispanser(Float:origin[3], creator)
{
	if(get_pcvar_num(g_Cvar[CVAR_INSTANT_PLANT]))
	{
		static xEntList[3]

		if(find_sphere_class(creator, dispenser_classname, 130.0, xEntList, charsmax(xEntList)) || TraceCheckCollides(origin, 35.0) || !(pev(creator, pev_flags) & FL_ONGROUND))
		{
			client_print_color(creator, print_team_default, "%s ^3Adicione o ^4dispenser ^3longe dos outros e não o encoste em paredes.", PREFIX_CHAT)
			//client_cmd(creator, "spk %s", g_DispSndFail)
			
			return false
		}
	}
	else
	{
		if(!xAllowPlant(creator))
		{
			client_print_color(creator, print_team_default, "%s ^3Mire para o chão ^1PLANO ^3e perto para poder adicionar o ^4Dispenser^3.", PREFIX_CHAT)
			//client_cmd(creator, "spk %s", g_DispSndFail)

			return false
		}
	}

	if(point_contents(origin) != CONTENTS_EMPTY)
		return false

	new ent; ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_breakable"))

	if(!pev_valid(ent))
		return false

	new iLevel; iLevel = 1

	set_pev(ent, pev_classname, dispenser_classname)

	if(g_IsVip[creator] && !get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
	{
		engfunc(EngFunc_SetModel, ent, g_DispModelVip)
		set_pev(ent, pev_modelindex, xModelIndex[0])
		set_pev(ent, pev_skin, get_user_team(creator))
		UTIL_SetAnim(ent, ANIM_LVL1_BUILD, 1.0)
		set_task(10.0, "Model_IdleLvl1", ent+TASK_ANIM)
	}
	else
	{
		engfunc(EngFunc_SetModel, ent, g_DispModel)
		set_pev(ent, pev_modelindex, xModelIndex[1])
	}

	engfunc(EngFunc_SetSize, ent, Float:{ -20.0, -20.0, 0.0 }, Float:{ 20.0, 20.0, 80.0 })
	set_pev(ent, pev_origin, origin)
	set_pev(ent, pev_solid, SOLID_BBOX)
	set_pev(ent, pev_movetype, MOVETYPE_TOSS)
	set_pev(ent, pev_health, float(get_pcvar_num(g_Cvar[CVAR_DISP_HP_LVL1])))
	set_pev(ent, pev_takedamage, 1.0)
	set_pev(ent, DISPENSER_VIP, g_IsVip[creator])
	set_pev(ent, DISPENSER_OWNER, creator)
	set_pev(ent, DISPENSER_LEVEL, iLevel)
	set_pev(ent, DISPENSER_TEAM, get_user_team(creator))
	

	if(get_pcvar_num(g_Cvar[CVAR_IDLE_SOUND]))
	{
		xDispenserSndIdle(ent)
		set_task(1.9, "xDispenserSndIdle", ent, _, _, "b")
	}

	if(get_pcvar_num(g_Cvar[CVAR_LIGHT]))
		set_task(0.1, "xDispenserLight", ent, _, _, "b")

	g_DispOrigin[creator][0] = origin[0]
	g_DispOrigin[creator][1] = origin[1]
	g_DispOrigin[creator][2] = origin[2]

	switch(cs_get_user_team(creator))
	{
		case CS_TEAM_T:
		{
			g_BeamColor[creator][0] = 255
			g_BeamColor[creator][1] = 0
			g_BeamColor[creator][2] = 0

			if(get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
				set_pev(ent, pev_body, 4)
			else
			{
				if(!g_IsVip[creator])
					set_pev(ent, pev_body, 4)
			}

			if(get_pcvar_num(g_Cvar[CVAR_GLOW]))
				fm_set_rendering(ent, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 10)
			
			//xLimitGlobal[0]++
		}

		case CS_TEAM_CT:
		{
			g_BeamColor[creator][0] = 0
			g_BeamColor[creator][1] = 0
			g_BeamColor[creator][2] = 255
		
			if(get_pcvar_num(g_Cvar[CVAR_ONEMODEL]))
				set_pev(ent, pev_body, 0)
			else
			{
				if(!g_IsVip[creator])
					set_pev(ent, pev_body, 0)
			}

			if(get_pcvar_num(g_Cvar[CVAR_GLOW]))
				fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 10)
			
			//xLimitGlobal[1]++
		}
	}

	emit_sound(ent, CHAN_STATIC, g_DispActive, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

	g_DispPlayerCount[creator] ++
	
	set_pev(ent, pev_nextthink, get_gametime() + 0.1)

	return true
}

public Model_IdleLvl1(iTaskID)
{
	if(!pev_valid(ID_ANIM))
	{
		if(task_exists(ID_ANIM))
			remove_task(ID_ANIM)

		return
	}

	UTIL_SetAnim(ID_ANIM, ANIM_LVL1_IDLE, 1.0)
}

public Model_IdleLvl2(iTaskID)
{
	if(!pev_valid(ID_ANIM))
	{
		if(task_exists(ID_ANIM))
			remove_task(ID_ANIM)

		return
	}

	UTIL_SetAnim(ID_ANIM, ANIM_LVL2_IDLE, 1.0)
}

public Model_IdleLvl3(iTaskID)
{
	if(!pev_valid(ID_ANIM))
	{
		if(task_exists(ID_ANIM))
			remove_task(ID_ANIM)

		return
	}

	UTIL_SetAnim(ID_ANIM, ANIM_LVL3_IDLE, 1.0)
}

public xDispenserSndIdle(ent)
{
	if(!pev_valid(ent))
	{
		if(task_exists(ent))
			remove_task(ent)

		return
	}

	emit_sound(ent, CHAN_ITEM, g_DispSndIdle, 0.35, ATTN_IDLE, 0, PITCH_NORM)
}

public xDispenserLight(ent)
{
	if(!pev_valid(ent))
	{
		if(task_exists(ent))
			remove_task(ent)

		return
	}

	static Float:origin[3]
	pev(ent, pev_origin, origin)
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
	write_byte(TE_DLIGHT)
	engfunc(EngFunc_WriteCoord, origin[0])
	engfunc(EngFunc_WriteCoord, origin[1])
	engfunc(EngFunc_WriteCoord, origin[2])
	write_byte(3) // radius
	write_byte(100) // r
	write_byte(100) // g
	write_byte(100) // b
	write_byte(20) // life 10 = 1seg
	write_byte(0) // decay
	message_end()
}

stock UTIL_BreakModel(Float:flOrigin[3], model, flags)
{
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0)
	write_byte(TE_BREAKMODEL)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2])
	write_coord(16)
	write_coord(16)
	write_coord(16)
	write_coord(random_num(-20, 20))
	write_coord(random_num(-20, 20))
	write_coord(10)
	write_byte(10)
	write_short(model)
	write_byte(10)
	write_byte(50) // time = 10 = 1 segundo
	write_byte(flags)
	message_end()
}

stock UTIL_SetAnim(ent, anim, Float:framerate)
{
	if(!pev_valid(ent))
		return
	
	set_pev(ent, pev_animtime, get_gametime())
	set_pev(ent, pev_framerate, framerate)
	set_pev(ent, pev_sequence, anim)
	
}

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
}

stock UTIL_BeamEnts(Float:flStart[3], Float:flEnd[3], r, g, b, sprite, width, ampl, speed)
{
	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(1) // start frame
	write_byte(1) // frame rate
	write_byte(1) // life
	write_byte(width) // widh
	write_byte(ampl) // noise
	write_byte(r)
	write_byte(g)
	write_byte(b)
	write_byte(255) // def: 130
	write_byte(speed) // def: 30
	message_end()
}

stock bool:TraceCheckCollides(Float:origin[3], const Float:BOUNDS)
{
	static 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

	static i, j
	for(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(j = 0; j < 3; j++)
		{
			if(traceEnds[i][j] != traceHit[j])
				return true
		}
	}

	return false
}

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
}

stock DispenserExplode(const Float:originF[3], head, sprites, life, tamanho, velo, decals)
{	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
	write_byte(TE_SPRITETRAIL)
	engfunc(EngFunc_WriteCoord, originF[0]) // X
	engfunc(EngFunc_WriteCoord, originF[1]) // Y
	engfunc(EngFunc_WriteCoord, originF[2]+head) // Z
	engfunc(EngFunc_WriteCoord, originF[0]) // X
	engfunc(EngFunc_WriteCoord, originF[1]) // Y
	engfunc(EngFunc_WriteCoord, originF[2]+head) // Z
	write_short(g_PrecSprFlare3)
	write_byte(sprites) // quantas sprites vai sair...
	write_byte(life) // life
	write_byte(tamanho) // tamanho
	write_byte(velo) // velo
	write_byte(decals) // decals
	message_end()
}

stock UTIL_DestroyDispensers()
{
	static ent; ent = FM_NULLENT

	while((ent = find_ent_by_class(ent, dispenser_classname)))
	{
		if(pev_valid(ent))
		{
			static id; id = pev(ent, DISPENSER_OWNER)

			g_DispPlayerCount[id] = 0

			xRemoveEntFix(ent)
		}
	}

	//xLimitGlobal[0] = 0
	//xLimitGlobal[1] = 0
}

stock UTIL_Sparks(Float:flOrigin[3])
{
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0)
	write_byte(TE_SPARKS)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2])
	message_end()
}

stock get_origin_from_dist_player(id, Float:dist, Float:origin[3], s3d = 1) 
{
	static Float:idorigin[3]
	entity_get_vector(id, EV_VEC_origin, idorigin)
	
	if(dist == 0)
	{
		origin = idorigin
		return
	}
	
	static Float:idvangle[3]
	entity_get_vector(id, EV_VEC_v_angle, idvangle)
	idvangle[0] *= -1
	
	origin[0] = idorigin[0] + dist * floatcos(idvangle[1], degrees) * ((s3d) ? floatabs(floatcos(idvangle[0], degrees)) : 1.0)
	origin[1] = idorigin[1] + dist * floatsin(idvangle[1], degrees) * ((s3d) ? floatabs(floatcos(idvangle[0], degrees)) : 1.0)
	origin[2] = idorigin[2]
}

stock xRegisterSay(szsay[], szfunction[])
{
	static sztemp[64]
	formatex(sztemp, 63 , "say /%s", szsay)
	register_clcmd(sztemp, szfunction)
	
	formatex(sztemp, 63 , "say .%s", szsay)
	register_clcmd(sztemp, szfunction)
	
	formatex(sztemp, 63 , "say_team /%s", szsay)
	register_clcmd(sztemp, szfunction )
	
	formatex(sztemp, 63 , "say_team .%s", szsay)
	register_clcmd(sztemp, szfunction)
}

stock xAddPoint(number)
{
	new count, i, str[29], str2[35], len
	num_to_str(number, str, charsmax(str))
	len = strlen(str)

	for (i = 0; i < len; i++)
	{
		if(i != 0 && ((len - i) %3 == 0))
		{
			add(str2, charsmax(str2), ".", 1)
			count++
			add(str2[i+count], 1, str[i], 1)
		}
		else add(str2[i+count], 1, str[i], 1)
	}
	
	return str2
}

// PEGA ORIGIN DA FRENTE
stock xGetOriginFromDistPlayer(id, Float:dist, Float:origin[3], s3d = 1) 
{
	static Float:idorigin[3]
	pev(id, pev_origin, idorigin)
	
	if(dist == 0)
	{
		origin = idorigin
		return
	}
	
	static Float:idvangle[3]
	pev(id, pev_v_angle, idvangle)
	idvangle[0] *= -1
	
	origin[0] = idorigin[0] + dist * floatcos(idvangle[1], degrees) * ((s3d) ? floatabs(floatcos(idvangle[0], degrees)) : 1.0)
	origin[1] = idorigin[1] + dist * floatsin(idvangle[1], degrees) * ((s3d) ? floatabs(floatcos(idvangle[0], degrees)) : 1.0)
	origin[2] = idorigin[2]
}
У меня небольшая проблема с диспенсером, я не могу настроить модель диспенсера. Кто-нибудь может мне помочь?
 
Обратите внимание, что если вы хотите заключить сделку с этим пользователем, он заблокирован.

Кто просматривает тему

Назад
Верх