failed to load: Plugin uses an unknown function (name "geoip_country") - check your modules.ini.

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
31
Реакции
1
Помог
1 раз(а)
Неверный раздел форума
Ошибка
[AMXX] Plugin "KZ_Engine.amxx" failed to load: Plugin uses an unknown function (name "geoip_country") - check your modules.ini.
Компилятор
Локальный
Amx Mod X
1.9.0
Исходный код
/*
v0.01 = KZ Mod
v0.02 = Убраны разделение игроков со Steam и Nonsteam
v0.03 = Sound при #1 PRO & NUB_TOP
v0.04 = KZ Menu
v0.05 = Drop Weapon (исчезание сразу)
v0.06 = Block Scout
v0.07 = say /weapons
v0.08 = Game name
v0.09 = /about /version
v0.10 = Stats online menu
v0.11 = Сохранение виапона после того, как перешел в спек
v0.12 = /kzpl, посмотреть профиль пользователя, который сейчас в онлайне
v0.13 = /savestart - сохраняет текущую позицию для старта
v0.14 = 3 вида таймера (TXT,HUD,ROUND)
v0.15 = Teleport Player Menu
v0.16 = Invis (Player/Water/Full)
v0.17 = new Semiclip
v0.18 = Hook + Menu + Icon
v0.19 = fix pause + Screenfade effect
v0.20 = fix noclip
v0.21 = Убраны все разбивающиеся объекты
v0.22 = При первом старте сервера, random map из allmaps.txt
v0.23 = Climb Menu
v0.24 = Config Menu
v0.25 = при наведение на игрока, показывает его инфу task 0.1 HUD
v0.26 = Console Info
v0.27 = Исправлен Godmode (Если есть на мапе HP Booster, то GodMode = true)
v0.28 = Убраны элементы на экране (Радар, хп, армор, деньги)
v0.29 = Добавлена картинка при загрузки топа (в режиме ожидания)
v0.30 = Команда /speclist + строка в Config Menu
v0.31 = (VIP+) /specadm - скрывает пресутствие админа в спеках
v0.32 = Новые Motd окна у Pro15 и Nub15 в стиле Kreedz stats v2
v0.33 = HP выведено в Timer // При старте выдача 100hp
v0.34 = HUD Damage при падении
v0.35 = Добавлена возможность /tp до 10 точек назад
v0.36 = Slot Reservation
v0.37 = Console Info
v0.38 = Fix CP/TP и Savepos. Weapons /USP /Knife
v0.39 = Server info motd
v0.40 = KZ Profile /mystats /me & Info connect Rank nad Point
v0.41 = Player Connect Chat info
v0.42 = Фонарик, который виден только самому себе + настройки
v0.43 = SQL Уникальный идентефикатор пользователя
v0.44 = SQL Config, подгрузка при коннекте, настроек пользователя.
v0.45 = Исправлен Full invisible (Если юзер смотрит, черный экран и надпись)
v0.46 = Auto CT spawn
v0.47 = Admins respawn Terrorist
v0.48 = ScoreBoard (title) + Frags = points | death = rank
v0.49 = Replay bot top 1 record
v0.50 = Checker Map (Bhop, Gravity, Slide, Allmaps)
v0.51 = Timer обновляется с частатой 0.01с
v0.52 = Переписаны все SQL запросы, на более правильные, исправлены баги
v0.53 = my time in top15
v0.54 = Урон не наносится, включаются холостые потроны
v0.55 = Добавлена спрайт иконка для KZRU Бота && Пофикшен показ спрайта
v0.56 = Переписаны финишные сообщения
v0.57 = Weapon top SQL + motd
v0.58 = Fix блокировки урона, блокируется все, кроме урон от падения
v0.59 = New Semiclip / Invis / Water Invis
v0.60 = /speed с обновлением как у таймера
v0.61 = Orpheu AXN
v0.62 = Hud Name + Time Bot
v0.63 = Исправлен возврат оружия игроку при переходе в spec или при смерти
v0.64 = KZRU Bot теперь прыгает со 100 fps стабильно, не зависимо от загружености сервера
v0.65 = За неделю был найден баг который крашил сервер с ошибкой | FATAL ERROR (shutting down): User Msg 'ScreenFade': 8 bytes written, expected 10 |
запихал код screenfade в зацикленную функцию spec из-за чего сообщения не доходили до игрока и сервер крашился, однако если sys_ticrate > 1000, то сервер забивал буфер и swap в unix переполнялся.
v0.66 = Отредачил код малеха
v0.67 = SQL Map type, данные о типы карты берутся из базы, убран весь лишний код
v0.68 = SQL Delete entity, удаление энтити теперь настраивается тоже через sql
v0.69 = KZRU Умерло, изменено название на Cosy-Climbing (СС)
v0.70 = New Showkeys
v0.71 = Test new bot frame
v0.72 = REC Bot set_task(0.1) - сосет, сделал через nextthink + адаптация к нагрузки сервера.
v0.73 = Переделан SQL_Maplist, чтоб сервер не зависал при sql запросе.
v0.74 = Убрал Kr1zo semiclip, т.к. он лагал (на сервере вместо 80 пинга, было 100+), естественно это под нагрузкой.
v0.75 = Сделал упрощенный connect REC бота, вылетала ошибка сигментации
v0.76 = Оказалось из-за semiclipa, сделал проверки
v0.77 = Fix, если кикнуть бота не через меню, сервер крашился.
v0.78 = После перезаписи рекорда Top1 бота больше не кикает, а изменяет ник
v0.79 = У REC бота показывает Button
v0.80 = При переходе в spec, показывает от первого лица автоматически
v0.81 = При смерти, не обнуляет очки, а возвращает.
v0.82 = Исправление бага при коннекте бота он не подключался доконца, застревал на меню выбора.
v0.83 = После savepos топ1 рекорд не будет записан для бота.
v0.84 = Исправление Savepos SQL части / Преобразование таблицы баз данных
v0.85 = Исправление всех функций SQL части, выпилил говнокод.
v0.86 = KZ Config переехал в базу uq_players и автоапдейт после выхода с сервера.
v0.87 = Переписаны все INSERTы и UPDATEы под потоковые запросы
v0.88 = My time в top15 с проверкой на прохождение с лучшим временем, а не каждый раз запросом.
v0.89 = Переписаны все SELECTы под потоковые запросы, оптимизирован код + получения данных идет после выполнения запроса
v0.90 = Для VIP новые правила, 500, 800, 1200 pts
v0.91 = Savepos оптимизирован под потоковые запросы
v0.92 = В savepos добавлено Velocity | оптимизирован код, добавлены условия
v0.93 = Full invise теперь работает корректно.
v0.94 = Start/Finish Position in SQL
v0.95 = FPS all players + Server FPS check and show.
v0.96 = Fix savepos exploit../
v0.97 = Добавлен Measure
v0.98 = Добавлен KZ ADD Spawns
v0.99 = Добавлены spawn для теров (фикс краш сервера)
v1.00 = Переход на REHLDS, orpheu более не может работать
v1.01 = Меню savepos открывается, по нажатию кнопки.
*/
#include <amxmodx>
#include <engine>
#include <cstrike>
#include <colorchat>
#include <amxmisc>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
//#include <hudmessage>
#include <sqlx>
#include <geoip>
#include <kz>

//#include <orpheu>
//#include <orpheu_advanced>
//#include <orpheu_stocks>
//#include <orpheu_memory>

#define PLUGIN "KZ[L]MOD"
#define VERSION "1.01"
#define AUTHOR "`L."

#define pgL_sql_files "https://domain-name/"
#define ALLMAPS "addons/amxmodx/configs/allmaps.txt"
#define KZ_LEVEL_1 ADMIN_CFG

#define SCOREATTRIB_NONE 0
#define SCOREATTRIB_DEAD ( 1 << 0 )
#define SCOREATTRIB_BOMB ( 1 << 1 )
#define SCOREATTRIB_VIP ( 1 << 2 )
// Drop weapon
#define WBOX "models/w_weaponbox.mdl"
#define BOMB "models/w_backpack.mdl"
#define SHLD "models/w_shield.mdl"
// Spec list
#define UPDATEINTERVAL 0.1
#define SR 0
#define SG 50
#define SB 255
// Screen fade PAUSE
#define PAUSE_RED 176
#define PAUSE_GREEN 226
#define PAUSE_BLUE 255
// Убран Фонарик
#define HUD_HIDE_FLASH (1<<1)
// Убран радар, хп, армор
#define HUD_HIDE_RHA (1<<3)
// Убран Таймер
#define HUD_HIDE_TIMER (1<<4)
// Убраны деньги
#define HUD_HIDE_MONEY (1<<5)
// Максимальное число сохраняемых в кеше CP
#define MAX_CPS 10

#pragma tabsize 0

new const FL_ONGROUND2 = ( FL_ONGROUND | FL_PARTIALGROUND | FL_INWATER | FL_CONVEYOR | FL_FLOAT )

new kz_authid[33][35];
new kz_ip[33][16];

#define IsOnLadder(%1) (pev(%1, pev_movetype) == MOVETYPE_FLY)
new Float:Checkpoints[33][MAX_CPS][3]
new Float:SaveStarts[33][2][3]
new Float:g_pausetime[33]
new Float:SpecLoc[33][3]
new Float:NoclipPos[33][3]
new Float:PauseOrigin[33][3]
new Float:SavedStart[33][3]
new Float:DefaultStartPos[3]
new Float:DefaultFinishPos[3]
new Float:gCheckpointAngle[33][3];
new Float:gSaveStartsAngle[33][3];
//*********** Savepos **********************************************//
new Float:SavedTime[33], SavedTimeConvert[33], SavedChecks[33], SavedGoChecks[33], SavedWeapon[33], SavedHp[33], SavedDate[33], SavedOrigins[33][3], SavedVelocity[33][3]
new bool:Savepos_activated[33], bool:Savepos_have[33], bool:Savepos_exploit[33];

new bool:g_bStart[33]
new bool:g_bCpAlternate[33]
new bool:timer_started[33]
new bool:IsPaused[33]
new bool:WasPaused[33]
new bool:firstspawn[33]

// Check Tips bool
new bool:mapIsAXN
new bool:mapIsSlide
new bool:mapIsGravity

//*********** Награды **************************************************///
#define KZ_R 0
#define KZ_G 150
#define KZ_B 0
// Noclip
new bool:canusenoclip[33]
new bool:isnocliped[33]
// Hook
new bool:canusehook[33]
new bool:ishooked[33]
new hookorigin[33][3]
new Float:antihookcheat[33]
// Для меню
new g_rewardsPosition[33]
new g_rewardsPlayers[33][32]
new g_rewardsPlayersNum[33]
new g_rewardsOption[33]
new g_rewardsSettings[33]

//*********** Teleport Player **************************************************///
new g_teleportPosition[33]
new g_teleportPlayers[33][32]
new g_teleportPlayersNum[33]
new g_teleportOption[33]
new g_teleportSettings[33]

//*********** Режим бессмертия **************************************************///
new GodModeOn[33]

//*********** Invis & Semiclip **************************************************///
new g_iPlayers[32], g_iNum, g_iPlayer

new maxplayers
#define DISTANCE 500.0
#define UPDATE_FREQ 0.1
#define ENTITY_MAX 2048
new const invis_class[][] = {
"func_water"
}

new bool:theWaterInvis
new bool:invis_entity[ENTITY_MAX]
new bool:specInvis_U[33]
new bool:specInvis_W[33]
new bool:Screen_fade[33];

new bool:NightVisionUse[33]
new bool:Default_SF[2]
new bool:AutoStart[33]

new Trie:g_tStarts
new Trie:g_tStops;
// HP Booster
new g_bHealsOnMap
new g_nHP[33]

// Скрывание HP, armor и т.д.
new g_msgHideWeapon
// Player Connect
new bool:gIsUserConnected[33];
// Фонарик
new bool:g_bFlashLight[33]
new g_iFlashBattery[33]
new Float:g_flFlashLightTime[33]
new g_iColor[33][3]
new g_iTeamColor[2][3]
new g_msgidFlashlight
new g_bEnabled = true
new g_iRadius = 9
new g_iAttenuation = 1
new g_iDistanceMax = 2000
new Float:g_flDrain = 1.2
new Float:g_flCharge = 0.2

// nightvision
new g_nightvision[33]
new g_default_map_light[32]
new g_fwLightStyle
new g_msgScreenFade

// SHOWKEYS
new g_iPlayerKeys[33];
new bool:g_bShowKeys[33];
new Float:fShowKeyTime = 0.0;
new g_SyncShowKeys;

// DEMO BOT
new Array:g_DemoPlaybot[1];
new Array:g_DemoReplay[33];
enum _:DemoData {
Float:flBotAngle[2],
Float:flBotPos[3],
Float:flBotVel[3],
iButton
};
new g_Bot_Icon_ent
new Float:g_ReplayBestRunTime;
new g_ReplayName[32];
new g_bBestTimer[14];
new bool:g_fileRead;
new g_bot_enable;
new g_bot_frame;
new g_bot_id;
new g_szMapName[32];
new Float:nExttHink = 0.009;

// Scoreboard Title
new g_szTitle[64];
enum _:ScoreInfo_Args {
PlayerID = 1,
Frags,
Deaths,
ClassID,
TeamID
}
//new Float:g_flOldMaxSpeed;
//new OrpheuStruct:g_ppmove;
// SPEED
new Float:speedshowing[33]
new movetype[33]
new bool:show_speed[33]
//
new checknumbers[33]
new gochecknumbers[33]
new sz_HP[33]
new chatorhud[33]
new DATADIR[128]

new g_MsgStatusText
new SyncHudTimer
new SyncHudSpeed
new hud_message
new Sbeam = 0
new g_entid[33]
new g_maxents
new spec_wpn[33][33]
// FPS
new g_iPlayerFps[33];
new g_iServerFps;
// measure
#define TASK_BEAM 45896
new Float:g_vFirstLoc[33][3];
new Float:g_vSecondLoc[33][3];
new bool:g_bReturnFloat[33];
new bool:g_bShowBeams[33];
new bool:g_bDetailedResults[33];
new bool:g_bAutoSetting[33];
#define DIST_R 0
#define DIST_G 87
#define DIST_B 65
new g_flBeam;
// KZ ADD SPAWNS
new g_pCvarMapsSpawns

enum {
Red,
Green,
Blue
}

new const other_weapons[8] =
{
CSW_P90, CSW_FAMAS, CSW_SG552, CSW_AWP,
CSW_M4A1, CSW_M249, CSW_AK47, CSW_AWP
}

new const g_block_commands[][]=
{
"buy", "buyammo1", "buyammo2", "buyequip",
"cl_autobuy", "cl_rebuy", "cl_setautobuy", "cl_setrebuy"

}

new const g_remove_ent[][] =
{
"func_bomb_target", "info_bomb_target", "hostage_entity", "func_breakable",
"monster_scientist", "func_hostage_rescue", "info_hostage_rescue",
"info_vip_start", "func_vip_safetyzone", "func_escapezone",
"armoury_entity", "game_player_equip", "player_weaponstrip",
"info_deathmatch_start"
}

// =================================================================================================
#include <kz_sql>
// =================================================================================================



//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INITIAL PLUGIN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

get_mapname(MapName, 63)

if(get_cvar_float("kz_uptime") == 0.0)
{
register_cvar("kz_uptime", "0.000001")
set_task(0.5, "ChangeRandom")
return PLUGIN_HANDLED
}

SyncHudTimer = CreateHudSyncObj()
SyncHudSpeed = CreateHudSyncObj()
hud_message = CreateHudSyncObj()

//register_srvcmd("amx_addmaps", "SQL_Maplist")

kz_register_saycmd("fps", "cmdFps", 0);
// Команды для Award
kz_register_saycmd("noclip","noclip",0)
kz_register_saycmd("nc","noclip",0)
register_clcmd("+hook","hook_on")
register_clcmd("-hook","hook_off")
register_clcmd("amx_hook","cmdRewardsMenu")
//register_clcmd("+noclip", "noclip_on")
//register_clcmd("-noclip", "noclip_off")

// CheckPoint && TP Checkpoint
register_clcmd("/cp","CheckPoint")
register_clcmd("/tp", "goto_checkpoint")
register_clcmd("/gc", "goto_checkpoint")
register_clcmd("say", "goto_checkpoint_say")
kz_register_saycmd("cp","CheckPoint",0)
kz_register_saycmd("tp", "goto_checkpoint",0)
kz_register_saycmd("stuck", "goto_stuck", 0)
kz_register_saycmd("reset", "reset_checkpoints", 0)

// Default keys block
register_clcmd("drop", "BlockDrop")
register_clcmd("kill", "client_kill")
register_clcmd("radio1", "BlockRadio")
register_clcmd("radio2", "BlockRadio")
register_clcmd("radio3", "BlockRadio")
// Block Vote
register_clcmd("vote","vote_block")
register_clcmd("votekick","vote_block")
register_clcmd("voteban","vote_block")
register_clcmd("votemap","vote_block")
// Native commands
register_clcmd("chooseteam", "kz_menu")

kz_register_saycmd("pause", "Pause", 0)
kz_register_saycmd("teleport","cmdTeleportMenu",0)
//kz_register_saycmd("kzpl","kzplmenu",0)
kz_register_saycmd("speed", "cmdShow_speed",0)

// Weapons
kz_register_saycmd("knife", "give_usp_and_knife", 0)
kz_register_saycmd("usp", "give_usp_and_knife", 0)
kz_register_saycmd("weapons", "weapons", 0)
kz_register_saycmd("guns", "weapons", 0)
// Info Msg
kz_register_saycmd("help", "jumphelp", 0)
kz_register_saycmd("version", "cmdVersion",0)
kz_register_saycmd("about", "cmdVersion",0)
kz_register_saycmd("uptime", "cmdUptime",0)
// Spec List
kz_register_saycmd("spec","ct",0)
kz_register_saycmd("ct","ct",0)
register_clcmd("/ct","ct")
kz_register_saycmd("speclist", "cmdSpeclist", 0)
kz_register_saycmd("specadm", "cmdSpeclistAdm", 0);
// Start Command
register_clcmd("/start","goStart")
kz_register_saycmd("start", "goStart", 0)
kz_register_saycmd("respawn", "goStart", 0)
kz_register_saycmd("savestart","SaveStart",0)
kz_register_saycmd("savepos", "SQL_Savepos", 0)
kz_register_saycmd("setstart", "setStart", KZ_LEVEL_1)
kz_register_saycmd("finish", "loadFinish", 0)
// ConfigMenu команды
kz_register_saycmd("god", "ConfigMenu",0)
kz_register_saycmd("godmode", "ConfigMenu", 0)
kz_register_saycmd("invis", "ConfigMenu", 0)
kz_register_saycmd("noteleport", "ConfigMenu",0)
kz_register_saycmd("icons", "ConfigMenu",0)
// Top 15
kz_register_saycmd("kz", "kz_menu", 0)
kz_register_saycmd("menu","kz_menu", 0)
kz_register_saycmd("mystats", "kz_profile", 0)
kz_register_saycmd("me", "kz_profile", 0)
kz_register_saycmd("noob10", "stats_show", 0)
kz_register_saycmd("noob15", "stats_show", 0)
kz_register_saycmd("nub15", "stats_show", 0)
kz_register_saycmd("pro15", "stats_show", 0)
kz_register_saycmd("top15", "top15menu",0)
kz_register_saycmd("top", "top15menu",0)
kz_register_saycmd("top10", "top15menu",0)
// Measure
kz_register_saycmd("measure", "cmdMeasure", 0)
kz_register_saycmd("distance", "cmdMeasure", 0)
register_menucmd( register_menuid( "\wMeasure Menu^n^n" ), 1023, "menuAction" );

// Develop режим
register_concmd("amx_addsavepos", "give_savepos", _, "<#userid> <timer> <cp> <tp>")

register_event("CurWeapon", "curweapon", "be", "1=1")
// Показ дамага
register_event("Damage", "Event_Damage", "b", "1=0", "2>0", "3=0", "4=0", "5=0", "6=0")

register_forward(FM_PlayerPreThink, "fwdPlayerPreThink", 0)
// Иконки наград
register_message(get_user_msgid("StatusIcon"), "msgStatusIcon")
// Обновление этих иконок
register_event("ResetHUD", "resethud", "be")
//Блокировка Scout
RegisterHam(Ham_Touch, "weapon_scout", "Ham_HookScout", false);
// Отлов нанесения урона противнику
RegisterHam ( Ham_TakeDamage, "player", "UserBeforeDamage", 0)
// Оружие больше не подбирается
register_forward(FM_Touch, "fwdTouch")
// Изменение типа игры
register_forward(FM_GetGameDescription, "fwGetGameDescription")
// Исчезновение оружия
register_forward(FM_SetModel, "forward_set_model")
g_maxents = get_global_int(GL_maxEntities)
// Показ hp
register_message(get_user_msgid("Health") , "msgHealth")
// Прозрачность игроков Semiclip
maxplayers = get_maxplayers()
register_forward(FM_AddToFullPack, "addToFullPack", 1)
register_forward(FM_PlayerPreThink, "semiclip_preThink")
register_forward(FM_PlayerPostThink, "semiclip_postThink")
build_entitymap()

// Скрывание Radar, HP, Armor, money
g_msgHideWeapon = get_user_msgid("HideWeapon")
register_event("ResetHUD", "onResetHUD", "b")
register_message(g_msgHideWeapon, "msgHideWeapon")

// Таск на показ Spec Info
set_task(UPDATEINTERVAL, "tskShowSpec", 123094, "", 0, "b", 0);
// Showkeys
register_clcmd( "say /showkeys", "ClientShowKeys");
register_forward(FM_StartFrame, "fw_StartFrame");
g_SyncShowKeys = CreateHudSyncObj();
// Фонарик
register_impulse(100, "Impulse_100")
register_event("DeathMsg", "Event_DeathMsg", "a")
g_iTeamColor[1] = {SR,SG,SB}
g_iTeamColor[0] = {SR,SG,SB}
g_msgidFlashlight = get_user_msgid("Flashlight")
// Nightvision
unregister_forward(FM_LightStyle, g_fwLightStyle)
g_msgScreenFade = get_user_msgid("ScreenFade")
register_message(g_msgScreenFade, "message_screenfade")
register_message(get_user_msgid("NVGToggle"), "message_nvgtoggle")

// Эвенты
RegisterHam( Ham_Use, "func_button", "fwdUse", 0)
RegisterHam( Ham_Killed, "player", "Ham_beforekill", 0)
RegisterHam( Ham_Killed, "player", "Ham_afterkill", 1)
RegisterHam( Ham_Touch, "weaponbox", "FwdSpawnWeaponbox" )
RegisterHam( Ham_Spawn, "player", "FwdHamPlayerSpawn", 1 )
RegisterHam( Ham_Touch, "weaponbox", "GroundWeapon_Touch")

// Менюшки
register_menucmd(register_menuid("Rewards Menu"), 1023, "actionRewardsMenu")
register_menucmd(register_menuid("Teleport Menu"), 1023, "actionTeleportMenu")
register_menucmd(register_menuid("KZ Profile"), (1<<0)|(1<<1)|(1<<9), "kz_profileHandle")
// DEMO BOT
register_clcmd("amx_botmenu", "ClCmd_ReplayMenu");
RegisterHam(Ham_Player_PreThink, "player", "Ham_PlayerPreThink", false);

get_mapname(g_szMapName, sizeof(g_szMapName) - 1);
strtolower(g_szMapName);
// Обновление бота больше чем 0.1с
register_forward(FM_Think, "fwd_Think", 1 );
new Ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"));
set_pev(Ent, pev_classname, "bot_record");
set_pev(Ent, pev_nextthink, 0.01);
// Цикл создание array для записи рекорда
for(new i; i < sizeof g_DemoReplay; i++)
g_DemoReplay[i] = ArrayCreate(DemoData, 1);
// Cоздание array для проигрывания рекорда
g_DemoPlaybot[0] = ArrayCreate(DemoData, 1);

g_MsgStatusText = get_user_msgid("StatusText")
// ScoreBoard, таблица со списком игроков
register_message( get_user_msgid( "ScoreAttrib" ), "MessageScoreAttrib" )
register_message( get_user_msgid( "ServerName" ), "MessageServerName" );
format( g_szTitle, charsmax( g_szTitle ), "Map: %s", MapName );
// Обновление таймера
new iTimer = create_entity("info_target")
entity_set_float(iTimer, EV_FL_nextthink, get_gametime() + 0.05)
entity_set_string(iTimer, EV_SZ_classname, "hud_update")
register_think("hud_update", "timer_task")

// Цикл для блокировки покупки оружия
for(new i = 0; i < sizeof(g_block_commands) ; i++)
register_clcmd(g_block_commands[i], "BlockBuy")

g_tStarts = TrieCreate( )
g_tStops = TrieCreate( )

new const szStarts[ ][ ] =
{
"counter_start", "clockstartbutton", "firsttimerelay", "but_start", "counter_start_button",
"multi_start", "timer_startbutton", "start_timer_emi", "gogogo"
}

new const szStops[ ][ ] =
{
"counter_off", "clockstopbutton", "clockstop", "but_stop", "counter_stop_button",
"multi_stop", "stop_counter", "m_counter_end_emi"
}

for( new i = 0; i < sizeof szStarts; i++ )
TrieSetCell( g_tStarts, szStarts[ i ], 1 )

for( new i = 0; i < sizeof szStops; i++ )
TrieSetCell( g_tStops, szStops[ i ], 1 )

// SQL Connect
g_SqlTuple = SQL_MakeStdTuple();
plugin_sql();
// AXN
/*OrpheuRegisterHook(OrpheuGetFunction("PM_Move"), "OR_PMMove");
new OrpheuFunction:orPMJump = OrpheuGetFunction("PM_Jump");
OrpheuRegisterHook(orPMJump, "OR_PMJump");
OrpheuRegisterHook(orPMJump, "OR_PMJump_P", OrpheuHookPost);*/
// KZ ADD SPAWNS
new iEnt = FM_NULLENT, iCount
while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "info_player_deathmatch")) )
{
//engfunc(EngFunc_RemoveEntity, iEnt)
++iCount
}

new szCvarValue[19]
get_pcvar_string(g_pCvarMapsSpawns, szCvarValue, charsmax(szCvarValue))
format(szCvarValue, charsmax(szCvarValue), "%s T:0(%d)", szCvarValue, iCount)
set_pcvar_string(g_pCvarMapsSpawns, szCvarValue)

// Получения ID мапы и проверка со списком карт
SQL_MapID()

return PLUGIN_CONTINUE
}

public plugin_cfg()
{
// global path to /addons/amxmodx/data
get_localinfo("amxx_datadir", DATADIR, charsmax(DATADIR));
// getting information on server config
sv_airaccelerate = get_cvar_pointer("sv_airaccelerate");
sv_gravity = get_cvar_pointer("sv_gravity");

server_print("[KZ] Airaccelerate = %d", get_pcvar_num(sv_airaccelerate))
server_print("[KZ] Gravity = %d", get_pcvar_num(sv_gravity))

// Load best run
ReadBestRunFile()
}

public plugin_end()
{
new Float:totalup = get_cvar_float("kz_uptime") + halflife_time()
set_cvar_float("kz_uptime", totalup)
}

public ChangeRandom()
{
if(file_exists(ALLMAPS))
{
new mapname[64], txtsize, line = random_num(0, file_size(ALLMAPS, 1) - 2)
read_file(ALLMAPS, line, mapname, 63, txtsize)
server_cmd("changelevel %s", mapname)
}
}

public detect_cheat(id,reason[])
{
if(timer_started[id])
{
txtTimerReset(id)
timer_started[id] = false
if(IsPaused[id])
{
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
IsPaused[id] = false
}
ColorChat(id, RED, "%s^x01 Timer stoped. ^3%s^1 detected.", prefix, reason)
}
}

public fwGetGameDescription()
{
forward_return(FMV_STRING, "Cosy-Climbing.net");
return FMRES_SUPERCEDE;
}

public cmdVersion(id)
{
ColorChat(id, RED, "^x03%s^x01 Plugin: ^x03%s^x01 VERSION: ^x03%s^x01 Author by^x03 %s", prefix, PLUGIN, VERSION, AUTHOR)
return PLUGIN_HANDLED_MAIN;
}

public ServerInfo_Console(id)
{
new name[ 32 ], hostname[ 64 ], thetime[ 32 ]
get_user_name( id, name, 31 )
get_user_authid( id, kz_authid[id], 34 )
get_user_ip( id, kz_ip[id], 15, 0 )
get_cvar_string( "hostname", hostname, 63 )
get_time( "%m/%d/%Y - %H:%M:%S", thetime, 31 )

client_cmd(id, "echo ^"=========================================^"")
client_cmd(id, "echo ^"Welcome on %s ! ^"", hostname)
client_cmd(id, "echo ^"The time is now: %s ^"", thetime)
client_cmd(id, "echo ^"-------------------------------------^"")
client_cmd(id, "echo ^" Your Information: ^"")
client_cmd(id, "echo ^"-------------------------------------^"")
client_cmd(id, "echo ^"Name: %s ^"", name)
client_cmd(id, "echo ^"SteamID: %s ^"", kz_authid[id])
client_cmd(id, "echo ^"IP: %s ^"", kz_ip[id])
client_cmd(id, "echo ^"-------------------------------------^"")
client_cmd(id, "echo ^"Contact administrator `L. ^"")
client_cmd(id, "echo ^"-------------------------------------^"")
client_cmd(id, "echo ^" Site: Cosy-Climbing.net ^"")
client_cmd(id, "echo ^" Skype: MihaeLVC ^"")
client_cmd(id, "echo ^" ICQ: 634-364-729 ^"")
client_cmd(id, "echo ^" Mail: [email protected] ^"")
client_cmd(id, "echo ^"=========================================^"")
}

public cmdUptime(id) {
new timeunit_seconds = floatround(get_cvar_float("kz_uptime") + halflife_time(), floatround_floor)
new timeunit_minutes
new timeunit_hours
new timeunit_days

if((timeunit_seconds / 60.0) >= 1) {
timeunit_days = floatround(timeunit_seconds / 86400.0, floatround_floor)
timeunit_seconds -= timeunit_days * 86400

timeunit_hours = floatround(timeunit_seconds / 3600.0, floatround_floor)
timeunit_seconds -= timeunit_hours * 3600

timeunit_minutes = floatround(timeunit_seconds / 60.0, floatround_floor)
timeunit_seconds -= timeunit_minutes * 60
}

if(timeunit_days > 0) ColorChat(id, BLUE, "^x01%s^x03 Server uptime is %d day%s and %s%d:%s%d:%s%d second%s", prefix, timeunit_days, timeunit_days > 1 ? "s" : "", timeunit_hours < 10 ? "0" : "", timeunit_hours, timeunit_minutes < 10 ? "0" : "", timeunit_minutes, timeunit_seconds < 10 ? "0" : "", timeunit_seconds, timeunit_seconds > 1 ? "s" : "")
else if(timeunit_hours > 0) ColorChat(id, BLUE, "^x01%s^x03 Server uptime is %s%d:%s%d:%s%d second%s", prefix, timeunit_hours < 10 ? "0" : "", timeunit_hours, timeunit_minutes < 10 ? "0" : "", timeunit_minutes, timeunit_seconds < 10 ? "0" : "", timeunit_seconds, timeunit_seconds > 1 ? "s" : "")
else if(timeunit_minutes > 0) ColorChat(id, BLUE, "^x01%s^x03 Server uptime is %s%d:%s%d second%s", prefix, timeunit_minutes < 10 ? "0" : "", timeunit_minutes, timeunit_seconds < 10 ? "0" : "", timeunit_seconds, timeunit_seconds > 1 ? "s" : "")
else ColorChat(id, BLUE, "^x01%s^x03 Server uptime is %d second%s", prefix, timeunit_seconds, timeunit_seconds > 1 ? "s" : "")

return PLUGIN_CONTINUE
}

public plugin_precache()
{
kz_add_spawn()
g_fwLightStyle = register_forward(FM_LightStyle, "fw_LightStyle")
RegisterHam(Ham_Spawn, "func_door", "Ham_DoorSpawn_P", true);
Sbeam = precache_model("sprites/laserbeam.spr")
precache_sound("kzvc.wav")
precache_sound("give_hook.wav")
precache_sound("misc/woohoo.wav")
g_flBeam = precache_model( "sprites/zbeam4.spr" );
}

kz_add_spawn()
{
enum _:SpawnsDatas
{
m_szAngles[64],
m_szOrigins[64]
}
new Array:aSpawns = ArrayCreate(SpawnsDatas)
new mTempDatas[SpawnsDatas]

enum
{
iAngles,
iOrigins,
iClassName
}
new Trie:tKeyType = TrieCreate()
TrieSetCell(tKeyType, "angles", iAngles)
TrieSetCell(tKeyType, "origin", iOrigins)
TrieSetCell(tKeyType, "classname", iClassName)

new szMapFile[64]
get_mapname(szMapFile, charsmax(szMapFile))
format(szMapFile, charsmax(szMapFile), "maps/%s.bsp", szMapFile)

new szBuffer[64], szKey[16], szValue[32], iType
new bool:bInEntityDatas, bool:bIsInfoPlayerStartEntity
new fp = fopen(szMapFile, "rb")

new iOffset, iLength, iMaxPos
fseek(fp, 4, SEEK_SET)
fread(fp, iOffset, BLOCK_INT)
fread(fp, iLength, BLOCK_INT)
iMaxPos = iOffset + iLength
fseek(fp, iOffset, SEEK_SET)

while( ftell(fp) < iMaxPos )
{
fgets(fp, szBuffer, charsmax(szBuffer))
trim(szBuffer)

if( bInEntityDatas )
{
if( szBuffer[0] == '}' )
{
bInEntityDatas = false
if( bIsInfoPlayerStartEntity )
{
ArrayPushArray(aSpawns, mTempDatas)
}
}
else
{
parse(szBuffer, szKey, charsmax(szKey), szValue, charsmax(szValue))
if( TrieGetCell(tKeyType, szKey, iType) )
{
switch( iType )
{
case iAngles:
{
copy(mTempDatas[m_szAngles], charsmax(mTempDatas[m_szAngles]), szValue)
}
case iOrigins:
{
copy(mTempDatas[m_szOrigins], charsmax(mTempDatas[m_szOrigins]), szValue)
}
case iClassName:
{
if( equal(szValue, "info_player_start") )
{
bIsInfoPlayerStartEntity = true
}
}
}
}
}
}
else if( szBuffer[0] == '{' )
{
bInEntityDatas = true
bIsInfoPlayerStartEntity = false
}
}
fclose(fp)

new iSpawnsNum = ArraySize( aSpawns )
/* if( iSpawnsNum == 1 )
{
log_to_file("OnSpawns.log", "%s has only 1 spawn", szMapFile)
}*/
new iNeededSpawns = max(get_maxplayers() - iSpawnsNum, 0)

new szCvarValue[19]
formatex(szCvarValue, charsmax(szCvarValue), "CT:%d(%d)", iSpawnsNum + iNeededSpawns, iSpawnsNum)
g_pCvarMapsSpawns = register_cvar("map_spawns", "", FCVAR_SERVER)
set_pcvar_string(g_pCvarMapsSpawns, szCvarValue)

if( iSpawnsNum > 0 && iNeededSpawns > 0 )
{
new iFactor = (iNeededSpawns / iSpawnsNum) + _:!!(iNeededSpawns % iSpawnsNum)
new iszClassName = engfunc(EngFunc_AllocString, "info_player_start")

set_kvd(0, KV_ClassName, "info_player_start")
set_kvd(0, KV_fHandled, 0)
for(new i, j, iEnt; i<iSpawnsNum; i++)
{
ArrayGetArray(aSpawns, i, mTempDatas)

for(j=0; j<iFactor; j++)
{
iEnt = engfunc(EngFunc_CreateNamedEntity, iszClassName)
DispatchKeyValueCustom(iEnt, "angles", mTempDatas[m_szAngles])
DispatchKeyValueCustom(iEnt, "origin", mTempDatas[m_szOrigins])
dllfunc(DLLFunc_Spawn, iEnt)

//if( --iNeededSpawns == 0 )
//{
//goto delete_datas
//}
}

}
}

new iszClassName2 = engfunc(EngFunc_AllocString, "info_player_deathmatch")

set_kvd(0, KV_ClassName, "info_player_deathmatch")
set_kvd(0, KV_fHandled, 0)
for(new i, iEnt2; i <= 3; i++)
{
if(i < iSpawnsNum) ArrayGetArray(aSpawns, i, mTempDatas)

iEnt2 = engfunc(EngFunc_CreateNamedEntity, iszClassName2)
DispatchKeyValueCustom(iEnt2, "angles", mTempDatas[m_szAngles])
DispatchKeyValueCustom(iEnt2, "origin", mTempDatas[m_szOrigins])
dllfunc(DLLFunc_Spawn, iEnt2)

if( --iNeededSpawns == 0 )
{
goto delete_datas
}
}


delete_datas:
ArrayDestroy( aSpawns )
TrieDestroy( tKeyType )
}

DispatchKeyValueCustom(iEntity, szKey[], szValue[])
{
set_kvd(0, KV_KeyName, szKey)
set_kvd(0, KV_Value, szValue)
dllfunc(DLLFunc_KeyValue, iEntity, 0)
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONNECT USER ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public client_authorized(id)
{
new maxplayers = get_maxplayers()
new players = get_playersnum(1)
new limit = maxplayers - 1

if (access(id, ADMIN_RESERVATION) || (players <= limit))
{
return PLUGIN_CONTINUE
}

new lReason[64]
format(lReason, 63, "Reserved slot for VIP")
server_cmd("kick #%d ^"%s^"", get_user_userid(id), lReason)

return PLUGIN_HANDLED
}


public client_connect(id)
{
if(is_user_bot(id))
return

new ip[32], country[3]
get_user_ip (id, ip, 31, 1)
geoip_code2_ex( ip, country)

client_cmd(id, "clear")
client_cmd(id, "hud_centerid 0")
client_cmd(id, "cl_download_ingame 1")
client_cmd(id, "cl_allowdownload 1")
client_cmd(id, "cl_allowupload 0")
client_cmd(id, "cl_minmodels 1")

ServerInfo_Console(id)
}

public kz_connect(id)
{
if (is_user_connected(id) && !is_user_bot(id))
{
if(gIsUserConnected[id])
{
SQL_Config(id)
SQL_profile(id)
SQL_Check_Savepos(id)
}

new cszName[32], country[46]
get_user_name(id, cszName, 31);
geoip_country ( kz_ip[id], country, 45 )

if( !(get_user_flags(id) & ACCESS_0)) {
ColorChat( 0, RED, "^x01[^x03%s^x01]^x03 %s^x01 %s [Country:^x03%s^x01]^x01.", VIP_ACCESS(id), cszName, (gIsUserConnected[id] ? "Connect" : "Disconnect"), country );
} else {
ColorChat( 0, BLUE, "^x03 %s^x01 %s [Country:^x03%s^x01]^x01.", cszName, (gIsUserConnected[id] ? "Connect" : "Disconnect"), country );
}
}
}

public client_disconnect(id)
{
if( id == g_bot_id )
{
g_bot_id = 0;
g_bot_enable = 0;
g_bot_frame = 0;
}

SQL_Savepos(id)
checknumbers[id] = 0
gochecknumbers[id] = 0
antihookcheat[id] = 0.0
chatorhud[id] = -1
timer_started[id] = false
ShowTime[id] = 1
firstspawn[id] = true
IsPaused[id] = false
WasPaused[id] = false
NightVisionUse[id] = false
remove_hook(id)
//hide_icon_noclip(id)
canusenoclip[id] = false
noTeleport[id] = false
icons[id] = true
TP_MODE[id] = false
SpecList[id] = true
SpecAdmImm[id] = false
show_speed[id] = false
Screen_fade[id] = false;

gIsUserConnected[id] = false
kz_connect(id)
// Очистка координат игрока для демобота
ArrayClear(g_DemoReplay[id]);
}

public client_putinserver(id)
{
if(is_user_bot(id)) return;

gIsUserConnected[id] = true
Savepos_activated[id] = false;
Savepos_exploit[id] = false;
checknumbers[id] = 0
gochecknumbers[id] = 0
antihookcheat[id] = 0.0
chatorhud[id] = -1
timer_started[id] = false
NightVisionUse[id] = false
firstspawn[id] = true
IsPaused[id] = false
WasPaused[id] = false
show_speed[id] = false;
Screen_fade[id] = false;
remove_hook(id)
//canusenoclip[id] = false
g_bShowBeams[id] = true;
g_bReturnFloat[id] = true;
g_bDetailedResults[id] = false;
g_bAutoSetting[id] = false;

// Режим бессмертия
if(mapIsSlide || g_bHealsOnMap)
GodModeOn[id] = 1
else
GodModeOn[id] = 0

// Connect сообщение
kz_connect(id)
// Обнуление фонаря
flashlight_reset(id)
set_task(0.5, "ct_resp", id)

// SQL функция, Для Menu top15 time на карте
mytime(id, PRO_TOP)
mytime(id, NUB_TOP)
}

public CmdRespawn(id)
{
if ( get_user_team(id) == 3 )
return PLUGIN_HANDLED
else
if (cs_get_user_team(id) == CS_TEAM_CT) ExecuteHamB(Ham_CS_RoundRespawn, id)

return PLUGIN_HANDLED
}

public FirstMsgProfile(id, result)
{
if (is_user_connected(id))
{
update_score(id)
if(result) {
ColorChat(id, RED, "%s^1 You have ^x03%d points^1 and you need ^3%d points to access the next rank", prefix, kz_point[id], kzneed[id])
ColorChat(id, RED, "%s^1 Your rank is ^3#%d^1 from ^3#%d^1 of the top players.", prefix, kz_hash[id], all_rank)
} else {
ColorChat(id, RED, "%s^1 Your status ^3UNRANKED^1 since the number of 0 points.", prefix)
}
}
}

public FwdHamPlayerSpawn( id )
{
if(!is_user_alive(id) || is_user_bot(id) )
return;

if(g_bHealsOnMap)
set_pev(id, pev_health, 100.0);

if(firstspawn[id])
{
//ColorChat(id, BLUE, "%s^1 Please, visit ^3http://cosy-climbing.net ^1", prefix)
ColorChat(id, BLUE, "%s^1 Server settings:^3 %daa^1 &^3 %d^1 gravity.", prefix, get_pcvar_num(sv_airaccelerate), get_pcvar_num(sv_gravity))

if (is_user_admin(id))
ColorChat(id, RED, "%s^1 You are ^3%s^1, VIP menu: ^3/v", prefix, VIP_ACCESS(id))

kz_menu(id)
}
firstspawn[id] = false
// Nightvision
cs_set_user_nvg(id,1)

if( !user_has_weapon(id,CSW_KNIFE) )
give_item( id,"weapon_knife" )

if( IsPaused[id] )
{
set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
set_pev(id, pev_origin, PauseOrigin[id])
}

// Блокировка радио
set_pdata_int(id, 192, 0, 5)
}

public ct_resp(id)
{
if(is_user_connected(id))
{
if(!is_user_alive(id))
spawn(id)

if(containi(spec_wpn[id], "weapon_") == -1) {
format(spec_wpn[id], 32, "weapon_knife")
}

give_wpn(id)
}
}

public ct(id)
{
if(get_user_noclip(id) || Savepos_exploit[id]) {
ColorChat(id, RED, "^x01%s^x03 You can not use mode Noclip", prefix)
return PLUGIN_HANDLED
}

new CsTeams:team = cs_get_user_team(id)
if (team == CS_TEAM_CT || team == CS_TEAM_T)
{
new clip, ammo, wpn_num
wpn_num = get_user_weapon(id, clip, ammo)
if(wpn_num) {
get_weaponname(wpn_num, spec_wpn[id], 32)
} else {
format(spec_wpn[id], 32, "weapon_knife")
}

if( !( pev( id, pev_flags ) & FL_ONGROUND2 ) && timer_started[id] )
return PLUGIN_HANDLED

pev(id, pev_origin, SpecLoc[id])

if ( timer_started[id] )
{
if ( IsPaused[id] )
{
Pause(id)
WasPaused[id]=true
}

g_pausetime[id] = get_gametime() - timer_time[id]
timer_time[id] = 0.0
kz_chat(id, "Your timer is paused.")
}

if(InvisUser[id]) {
InvisUser[id] = false
specInvis_U[id] = true
}
if(InvisWater[id]) {
InvisWater[id] = false
specInvis_W[id] = true
}

client_cmd(id, ";specmode 4") //first person
sz_HP[id] = get_user_health(id)
cs_set_user_team(id,CS_TEAM_SPECTATOR)
set_pev(id, pev_solid, SOLID_NOT)
set_pev(id, pev_movetype, MOVETYPE_FLY)
set_pev(id, pev_effects, EF_NODRAW)
set_pev(id, pev_deadflag, DEAD_DEAD)
}
else
{
if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)
{
if(specInvis_U[id]) {
InvisUser[id] = true
specInvis_U[id] = false
}
if(specInvis_W[id]) {
InvisWater[id] = true
specInvis_W[id] = false
}
}
set_pev(id, pev_effects, 0)
set_pev(id, pev_movetype, MOVETYPE_WALK)
set_pev(id, pev_deadflag, DEAD_NO)
set_pev(id, pev_takedamage, DAMAGE_AIM)
cs_set_user_team(id,CS_TEAM_CT)
CmdRespawn(id)

if( get_user_flags(id) & ADMIN_IMMUNITY )
cs_set_user_team(id,CS_TEAM_T,CS_CT_URBAN)
else
cs_set_user_team(id,CS_TEAM_CT)
// Возвращение оружия в спеках
strip_user_weapons(id)

if(containi(spec_wpn[id], "weapon_") == -1) {
format(spec_wpn[id], 32, "weapon_knife")
}
give_wpn(id)

if( user_has_weapon(id, CSW_USP) || user_has_weapon(id, CSW_KNIFE))
{
give_item(id,"weapon_knife")
give_item(id,"weapon_usp")
}

set_pev(id, pev_origin, SpecLoc[id])
set_user_health(id, sz_HP[id])

if ( timer_started [id] )
timer_time[id] = get_gametime() - g_pausetime[id] + timer_time[id]

if( WasPaused[id] )
{
Pause(id)
WasPaused[id]=false
}

Screen_fade[id] = false;
}
return PLUGIN_HANDLED
}
/*
public kzplmenu(id)
{
new plmenu = menu_create ("\wView Player Stats:", "kzplhandlemenu")

new num, players[32], tempid, szTempID [10], tempname [32]
get_players (players, num, "ch")

for (new i = 0; i < num; i++)
{
tempid = players [ i ]

get_user_name(tempid, tempname, 31)
num_to_str(tempid, szTempID, 9)
menu_additem(plmenu, tempname, szTempID, 0)
}

menu_display (id, plmenu)
return PLUGIN_HANDLED
}

public kzplhandlemenu(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}

new data[6], name[64]
new access, callback
menu_item_getinfo (menu, item, access, data, 5, name, 63, callback)
new tempid = str_to_num(data)

kz_profile(tempid)

return PLUGIN_CONTINUE
}*/

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Teleport Player ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public actionTeleportMenu(id,key) {
switch(key) {
case 7: {
++g_teleportOption[id]
g_teleportOption[id] %= 2
switch (g_teleportOption[id]) {
case 1: g_teleportSettings[id] = 1
}
displayTeleportMenu(id, g_teleportPosition[id])
}
case 8: displayTeleportMenu(id,++g_teleportPosition[id])
case 9: displayTeleportMenu(id,--g_teleportPosition[id])
default: {
new player = g_teleportPlayers[id][g_teleportPosition[id] * 7 + key]
new name[32], name2[32]
get_user_name(player,name,31)
get_user_name(id,name2,31)
if(g_teleportOption[id]) {
if(g_teleportSettings[id] == 1) {
if(IsPaused[player] == true) {
ColorChat(id, RED, "%s^1 You can not use teleport to pause..", prefix)
return PLUGIN_HANDLED
}
new origin[3]

set_user_gravity(player)
get_user_origin(id, origin)
set_user_origin(player, origin)
set_pev(player, pev_flags, pev(player, pev_flags) | FL_DUCKING)

if(is_user_connected(player)) ColorChat(player, RED, "^x01%s^x03 Teleported to^x04 %s", prefix, name2)
if(is_user_connected(id)) ColorChat(id, BLUE, "^x01%s^x04 %s^x03 teleported to you", prefix, name)
detect_cheat(player,"Teleport")
antihookcheat[id] = get_gametime()
cmdTeleportMenu(id)
}
}
else {
if(IsPaused[id] == true) {
ColorChat(id, RED, "%s^1 You can not use teleport to pause..", prefix)
return PLUGIN_HANDLED
}
new origin[3]

set_user_gravity(id)
get_user_origin(player, origin)
set_user_origin(id, origin)
set_pev(id, pev_flags, pev(id, pev_flags) | FL_DUCKING)

if(is_user_connected(id)) ColorChat(id, RED, "^x01%s^x03 Teleported to^x04 %s", prefix, name)
if(is_user_connected(player)) ColorChat(player, BLUE, "^x01%s^x04 %s^x03 teleported to you", prefix, name2)
detect_cheat(id,"Teleport")
antihookcheat[id] = get_gametime()
cmdTeleportMenu(id)
}
}
}
return PLUGIN_HANDLED
}

displayTeleportMenu(id,pos) {
if(pos < 0)
return

get_players(g_teleportPlayers[id],g_teleportPlayersNum[id])

new menuBody[512]
new b = 0
new i
new name[32]
new start = pos * 7

if(start >= g_teleportPlayersNum[id])
start = pos = g_teleportPosition[id] = 0

new len = format(menuBody,511,"\yTeleport Menu\R%d/%d^n\r^n",pos + 1,(g_teleportPlayersNum[id] / 7 + ((g_teleportPlayersNum[id] % 7) ? 1 : 0)))
new end = start + 7
new keys = MENU_KEY_0

if(end > g_teleportPlayersNum[id])
end = g_teleportPlayersNum[id]

new userTime = get_user_time(id)

if(userTime < 60)
len += format(menuBody[len],511-len,"You can't use teleport in 1 minute af` joined the game^nPlease wait %d seconds...^n^n",(60-userTime))

for (new a = start; a < end; ++a) {
i = g_teleportPlayers[id][a]
get_user_name(i,name,31)

if(userTime < 60 || noTeleport[i] || cs_get_user_team(i) == CS_TEAM_SPECTATOR) {
++b

if(is_user_admin(i)) {
len += format(menuBody[len],511-len,"\d%d. %s \r*^n",b,name)
}
else {
len += format(menuBody[len],511-len,"\d%d. %s^n\r",b,name)
}
}
else {
keys |= (1<<b)

if(is_user_admin(i)) {
len += format(menuBody[len],511-len,"%d.\w %s \r*^n",++b,name)
}
else {
len += format(menuBody[len],511-len,"%d.\w %s^n\r",++b,name)
}
}
}

if(access(id,ADMIN_CHAT)) {
if(g_teleportOption[id]) {
keys |= MENU_KEY_8
if(g_teleportSettings[id] == 1) {
len += format(menuBody[len],511-len,"^n\y8. To You^n\r")
}
}
else {
keys |= MENU_KEY_8
len += format(menuBody[len],511-len,"^n\y8. To Player^n\r")
}
}
else {
len += format(menuBody[len],511-len,"^n\d8. To Player^n\r")
}

if(end != g_teleportPlayersNum[id]) {
format(menuBody[len],511-len,"^n9.\w More...^n\r0.\w %s",pos ? "Back" : "Exit")
keys |= MENU_KEY_9
}
else
format(menuBody[len],511-len,"^n0.\w %s",pos ? "Back" : "Exit")

show_menu(id,keys,menuBody,-1,"Teleport Menu")
}

public cmdTeleportMenu(id) {
if(!is_user_connected(id)) {
return PLUGIN_HANDLED
}

if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED) {
client_print(id, print_chat, "%s You can't execute teleport, you are UNASSIGNED", prefix)
return PLUGIN_HANDLED
}
if(access(id,ADMIN_CHAT)) {
g_teleportOption[id] = 0
g_teleportSettings[id] = 0
}
if(access(id,ADMIN_ALL)) {
g_teleportOption[id] = 0
g_teleportSettings[id] = 0
displayTeleportMenu(id,g_teleportPosition[id] = 0)
}
return PLUGIN_HANDLED
}

public cmdNoTeleport(id) {
if(!noTeleport[id]) {
noTeleport[id] = true
ColorChat(id, BLUE, "^x01%s^x03 NoTeleport has been enabled!", prefix)
}
else {
noTeleport[id] = false
ColorChat(id, RED, "^x01%s^x03 NoTeleport has been disabled!", prefix)
}
return PLUGIN_CONTINUE
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Timer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public Pause(id)
{
if(! is_user_alive(id) )
{
kz_chat(id, "You have to be alive.")

return PLUGIN_HANDLED
}

if(!IsPaused[id])
{
if(! timer_started[id])
{
kz_chat(id, "The timer is not running.")
return PLUGIN_HANDLED
}

if(entity_get_int(id,EV_INT_flags)&FL_ONGROUND) {
g_pausetime[id] = get_gametime() - timer_time[id]
timer_time[id] = 0.0
IsPaused[id] = true
kz_chat(id, "Timer paused")
set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
pev(id, pev_origin, PauseOrigin[id])

/*message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
write_short(~0)
write_short(~0)
write_short(0x0004)
write_byte(PAUSE_RED)
write_byte(PAUSE_GREEN)
write_byte(PAUSE_BLUE)
write_byte(50)
message_end()*/
}
}
else
{
if(timer_started[id])
{
kz_chat(id, "Timer unpause")
if(get_user_noclip(id))
noclip(id)
timer_time[id] = get_gametime() - g_pausetime[id]
}
IsPaused[id] = false
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
/*message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
write_short(1<<10)
write_short(1<<10)
write_short(0x0000)
write_byte(PAUSE_RED)
write_byte(PAUSE_GREEN)
write_byte(PAUSE_BLUE)
write_byte(65)
message_end()*/
}

return PLUGIN_HANDLED
}

public timer_task(iTimer)
{
new Alive[32], Dead[32], alivePlayers, deadPlayers, txt[12];
get_players(Alive, alivePlayers, "ah")
get_players(Dead, deadPlayers, "bh")
for(new i=0;i<alivePlayers;i++)
{
if (!GodModeOn[Alive[i]])
{
formatex(txt, charsmax(txt), "%d", get_user_health(Alive[i]))
g_nHP = txt;
} else {
g_nHP = "Godmode";
}


if( timer_started[Alive[i]])
{
new Float:kreedztime = get_gametime() - (IsPaused[Alive[i]] ? get_gametime() - g_pausetime[Alive[i]] : timer_time[Alive[i]])

if (kreedztime < 0.0 && kreedztime > 2.0) // проверка на отрицательный таймер
{
txtTimerReset(Alive[i])
timer_started[Alive[i]] = false
if(IsPaused[Alive[i]])
{
set_pev(Alive[i], pev_flags, pev(Alive[i], pev_flags) & ~FL_FROZEN)
IsPaused[Alive[i]] = false
}
}
new imin = floatround( kreedztime / 60.0, floatround_floor );
new isec = floatround( kreedztime - imin * 60, floatround_floor );
new mili = floatround( ( kreedztime - ( imin * 60 + isec ) ) * 100, floatround_floor );

if( ShowTime[Alive[i]] == 1 )
{
client_cmd(Alive[i], ";^"hud_centerid^" 0")
show_status(Alive[i], "[ %02i:%02i.%02i | %d/%d | HP: %s %s ]",imin, isec, mili, checknumbers[Alive[i]], gochecknumbers[Alive[i]], g_nHP, IsPaused[Alive[i]] ? "| *Paused*" : "");
}
else if (ShowTime[Alive[i]] == 2 )
{
set_hudmessage(255, 255, 255, -1.0, 0.3, 0, 0.0, 1.0, 0.0, 0.0, 1)
ShowSyncHudMsg(Alive[i], SyncHudTimer, "[ %02i:%02i.%02i | %d/%d | HP: %s %s ]",imin, isec, mili, checknumbers[Alive[i]], gochecknumbers[Alive[i]], g_nHP, IsPaused[Alive[i]] ? "| *Paused*" : "")
}

if(Savepos_exploit[Alive[i]] && !IsPaused[Alive[i]])
Savepos_exploit[Alive[i]] = false; // Savepos Exploit fix
} else {
show_status(Alive[i], "[ OFF | %d/%d | HP: %s ]", checknumbers[Alive[i]], gochecknumbers[Alive[i]], g_nHP);
}

if (show_speed[Alive[i]])
{
set_hudmessage(255, 255, 255, -1.0, 0.83, 0, 0.0, 0.2, 0.0, 0.0, 1);
ShowSyncHudMsg(Alive[i], SyncHudSpeed, "%.2f units/sec", speedshowing[Alive[i]]);
}
}
for(new i=0;i<deadPlayers;i++)
{
if (!GodModeOn[Alive[i]])
{
formatex(txt, charsmax(txt), "%d", get_user_health(Alive[i]))
g_nHP = txt;
} else {
g_nHP = "Godmode";
}

new specmode = pev(Dead[i], pev_iuser1)
if(specmode == 2 || specmode == 4)
{
new target = pev(Dead[i], pev_iuser2)
if(target != Dead[i])
if(is_user_alive(target) && timer_started[target])
{

new Float:kreedztime = get_gametime() - (IsPaused[target] ? get_gametime() - g_pausetime[target] : timer_time[target])
new imin = floatround( kreedztime / 60.0, floatround_floor );
new isec = floatround( kreedztime - imin * 60, floatround_floor );
new mili = floatround( ( kreedztime - ( imin * 60 + isec ) ) * 100, floatround_floor );
client_print(Dead[i], print_center , "[ %02i:%02i.%02i | %d/%d | HP: %s %s ]",imin, isec, mili, checknumbers[target], gochecknumbers[target], g_nHP, IsPaused[target] ? "| *Paused*" : "")
}

if (show_speed[Dead[i]])
{
set_hudmessage(255, 255, 255, -1.0, 0.83, 0, 0.0, 0.2, 0.0, 0.0, 1);
ShowSyncHudMsg(Dead[i], SyncHudSpeed, "%.2f units/sec", speedshowing[target]);
}
}
}
entity_set_float(iTimer, EV_FL_nextthink, get_gametime() + 0.07)
}

stock show_status(id, const szMsg[], any:...)
{
static szStatus[128];
vformat(szStatus, 127, szMsg, 3);

message_begin(MSG_ONE_UNRELIABLE, g_MsgStatusText, _, id);
write_byte(0);
write_string(szStatus);
message_end();
}

// Сброс TXT таймера.
public txtTimerReset(id)
{
message_begin(MSG_ONE_UNRELIABLE, g_MsgStatusText, _, id);
write_byte(0);
message_end();
}

public ShowTimer_Menu(id)
{
new menu = menu_create("\yTimer Menu\w", "TimerHandler")

new hudtimer[64], notimer[64], shudtimer[64];

formatex(hudtimer, 63, "TXT Timer %s", ShowTime[id] == 1 ? "\y ON" : "\r OFF" )
formatex(shudtimer, 63, "HUD Timer %s^n", ShowTime[id] == 2 ? "\y ON" : "\r OFF" )
formatex(notimer, 63, "No Timer %s", ShowTime[id] == 0 ? "\y ON" : "\r OFF" )

menu_additem( menu, hudtimer, "1" )
menu_additem( menu, shudtimer, "2" )
menu_additem( menu, notimer, "3" )

menu_setprop(menu, MPROP_EXITNAME, "Back")
menu_display(id, menu, 0)

return PLUGIN_HANDLED
}

public TimerHandler (id, menu, item)
{
if( item == MENU_EXIT )
{
ConfigMenu(id)
return PLUGIN_HANDLED
}

switch(item)
{
case 0:
{
ShowTime[id]= 1
ShowTimer_Menu(id)
}
case 1:
{
ShowTime[id]= 2
txtTimerReset(id)
ShowTimer_Menu(id)
}
case 2:
{
ShowTime[id]= 0
txtTimerReset(id)
ShowTimer_Menu(id)
}
}
return PLUGIN_HANDLED
}

public cmdShow_speed(id)
{
if(!show_speed[id])
{
show_speed[id] = true
ColorChat(id, BLUE, "^x01%s^x03 Speed has been enabled!", prefix)
}
else
{
show_speed[id] = false
ColorChat(id, RED, "^x01%s^x03 Speed has been disabled!", prefix)
}
return PLUGIN_CONTINUE
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Block function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public sx_remove_entity(classname[], type[], _pev, _targetname[]) {
new ent = engfunc(EngFunc_FindEntityByString, -1, type, classname)
new targetname[32]

while(ent > 0) {
if(_targetname[0]) {
pev(ent, _pev, targetname, 31)
if(containi(targetname, _targetname) != -1) {
engfunc(EngFunc_RemoveEntity, ent)
}
}
else {
engfunc(EngFunc_RemoveEntity, ent)
}
ent = engfunc(EngFunc_FindEntityByString, ent, type, classname)
}
}

public BlockRadio(id)
{
return PLUGIN_HANDLED
}

public BlockDrop(id)
{
return PLUGIN_HANDLED
}

public BlockBuy(id)
{
return PLUGIN_CONTINUE
}

public client_kill(id) {
console_print(id,"[KZ] You can't kill yourself. This is blocked!")
return PLUGIN_HANDLED
}

public fwdTouch(pToucher,pTouched)
{
if(!pev_valid(pToucher)||!pev_valid(pTouched))

return FMRES_IGNORED

if(!is_user_connected(pTouched))

return FMRES_IGNORED

new cl[32]
pev(pToucher,pev_classname,cl,31)
if(equal(cl,"weaponbox")||equal(cl,"armoury_entity")||equal(cl,"weapon_shield"))

return FMRES_SUPERCEDE

return FMRES_IGNORED
}

public FwdSpawnWeaponbox( iEntity )
{
set_pev( iEntity, pev_flags, FL_KILLME )
dllfunc( DLLFunc_Think, iEntity )

return HAM_IGNORED
}

public GroundWeapon_Touch(iWeapon, id)
{
if( is_user_alive(id) && timer_started[id])
return HAM_SUPERCEDE

return HAM_IGNORED
}

public MessageTextMsg()
{
new szArg2[32];

get_msg_arg_string(2, szArg2, 31);

if (!equal(szArg2, "#Game_unknown_command"))
return PLUGIN_CONTINUE;

return PLUGIN_HANDLED;
}

public msgStatusIcon(msgid, msgdest, id) {
static szIcon[8];
get_msg_arg_string(2, szIcon, 7);

if(equal(szIcon, "buyzone")) {
set_pdata_int(id, 235, get_pdata_int(id, 235) & ~(1<<0));
return PLUGIN_HANDLED;
}

return PLUGIN_CONTINUE;
}

public Ham_HookScout(ent, id)
{
ExecuteHamB(Ham_Item_Kill, ent);
}

public vote_block(id)
{
console_print(id,"[KZ] Command blocked.!")
return PLUGIN_HANDLED
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Weapons ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public curweapon(id)
{
static last_weapon[33];
static weapon_active, weapon_num
weapon_active = read_data(1)
weapon_num = read_data(2)

if( ( weapon_num != last_weapon[id] ) && weapon_active)
{
last_weapon[id] = weapon_num;

static Float:maxspeed;
pev(id, pev_maxspeed, maxspeed );

if( maxspeed < 0.0 )
maxspeed = 250.0;

kz_hud_message(id,"Speed of this weapon %d",floatround( maxspeed, floatround_floor ));
}
return PLUGIN_HANDLED
}

public weapons(id)
{
if(!is_user_alive(id))
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if(get_user_noclip(id)) {
ColorChat(id, RED, "^x01%s^x03 You can not use mode Noclip", prefix)
return PLUGIN_HANDLED
}

detect_cheat(id,"Weapons")

for(new i = 0; i < 8; i++)
if( !user_has_weapon(id, other_weapons[i]) )
{
new item;
item = give_item(id, other_weapons_name[i] );
cs_set_weapon_ammo(item, 0);
}

return PLUGIN_HANDLED
}

public give_wpn(id) {
strip_user_weapons(id)

if(equali(spec_wpn[id], "weapon_knife") || equali(spec_wpn[id], "weapon_usp")) {
give_usp_and_knife(id)
} else {
give_item(id,spec_wpn[id])
}

format(spec_wpn[id], 32, "wpn")

return PLUGIN_HANDLED
}


public give_usp_and_knife(id) {
new clip, ammo, wpn_num, wpn[32]
wpn_num = get_user_weapon(id, clip, ammo)

if(wpn_num) {
get_weaponname(wpn_num, wpn, 31)
} else {
format(wpn, 31, "weapon_knife")
}

strip_user_weapons(id)
give_item(id, wpn)

if(equali(wpn, "weapon_knife") || equali(wpn, "weapon_usp"))
{
give_item(id,"weapon_knife")
give_item(id,"weapon_usp")
cs_set_user_bpammo(id, CSW_USP, 250)
}

return PLUGIN_HANDLED
}

// ========================== Start location =================
public SaveStart(id)
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}
if( !( pev( id, pev_flags ) & FL_ONGROUND2 ))
{
kz_chat(id, "You can not do checkpoints in flight.")
return PLUGIN_HANDLED
}

if( IsPaused[id] )
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}
timer_started[id] = false
pev(id, pev_origin, SaveStarts[id][g_bStart[id] ? 1 : 0])
pev(id, pev_v_angle, gSaveStartsAngle[id])
g_bStart[id] = !g_bStart[id]
ColorChat(id, RED, "^x01%s^x03 Set point. CLICK button to confirm", prefix)

return PLUGIN_HANDLED
}

public goStart(id)
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if (IsPaused[id])
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}
if(g_bStart[id])
{
timer_started[id] = false
set_pev( id, pev_velocity, Float:{0.0, 0.0, 0.0} );
set_pev( id, pev_view_ofs, Float:{ 0.0, 0.0, 12.0 } );
set_pev( id, pev_flags, pev(id, pev_flags) | FL_DUCKING );
set_pev( id, pev_fuser2, 0.0 );
engfunc( EngFunc_SetSize, id, {-16.0, -16.0, -18.0 }, { 16.0, 16.0, 32.0 } );
set_pev(id, pev_origin, SaveStarts[id][ !g_bStart[id] ] )
set_pev(id, pev_angles, gSaveStartsAngle[id]);
set_pev(id, pev_fixangle, 1);
}
else if(AutoStart[id])
{
set_pev(id, pev_velocity, Float:{0.0, 0.0, 0.0})
set_pev( id, pev_flags, pev(id, pev_flags) | FL_DUCKING )
set_pev(id, pev_origin, SavedStart [id] )

}
else if ( Default_SF[0] )
{
set_pev(id, pev_velocity, Float:{0.0, 0.0, 0.0})
set_pev(id, pev_origin, DefaultStartPos)
}
else
{
CmdRespawn(id)
}

return PLUGIN_HANDLED
}

public loadFinish(id)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED

if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR || IsPaused[id] == true)
{
ColorChat(id, RED, "^x01%s^x03 You can not currently use the command", prefix)
return PLUGIN_HANDLED
}

if(Default_SF[1] == false)
{
ColorChat(id, RED, "^x01%s^x03 The finish position is unknown.", prefix)
return PLUGIN_HANDLED
}

reset_checkpoints(id)

set_pev(id, pev_origin, DefaultFinishPos)
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})

ColorChat(id, RED, "%s^1 Moved to finish position", prefix)

return PLUGIN_HANDLED
}

public setStart(id)
{
if((get_user_flags( id ) & KZ_LEVEL_1 ))
{
new Float:origin[3]
pev(id, pev_origin, origin)
DefaultStartPos = origin;
SQL_StartFinish(true, origin)
AutoStart[id] = false;
ColorChat(id, GREEN, "%s^x01 Established the starting position on the map.", prefix)
}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USER KILLED ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public Ham_beforekill(id)
{
new clip, ammo, wpn_num
wpn_num = get_user_weapon(id, clip, ammo)

if(wpn_num)
get_weaponname(wpn_num, spec_wpn[id], 32)
else
format(spec_wpn[id], 32, "weapon_knife")

if(!(cs_get_user_team(id) == CS_TEAM_SPECTATOR))
{
if (cs_get_user_team(id) == CS_TEAM_T)
cs_set_user_team(id,CS_TEAM_CT)
else
cs_set_user_team(id,CS_TEAM_CT)
}
}

public Ham_afterkill(id)
{
set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)

if(containi(spec_wpn[id], "weapon_") == -1)
format(spec_wpn[id], 32, "weapon_knife")

new MyDeaths[32]
//Получаем количество смертей для игрока
MyDeaths[id] = cs_get_user_deaths(id)
cs_set_user_deaths(id, MyDeaths[id] - 1)

set_task(0.1, "goStart", id)
set_task(0.1, "give_wpn", id)
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USER TAKE DMG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public UserBeforeDamage ( victim, weapon, attacker, Float:damage, damagebits )
{
// Условия урона от падения
if ( damagebits & DMG_FALL )
{
return PLUGIN_HANDLED
}
else
{
// Если игроки из разных команд, блокировать урон
if (get_user_team ( attacker ) != get_user_team ( victim ))
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NightVision ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public fw_LightStyle(style, const val[])
{
if (!style)
copy(g_default_map_light, charsmax(g_default_map_light), val)
}

public message_screenfade(msg_id, msg_dest, msg_entity)
{
if (!g_nightvision[msg_entity])
return PLUGIN_CONTINUE;

if (get_msg_arg_int(4) != 255 || get_msg_arg_int(5) != 255 || get_msg_arg_int(6) != 255 || get_msg_arg_int(7) < 200)
return PLUGIN_CONTINUE;

remove_task(msg_entity)
set_task(get_msg_arg_int(1) / 4096.0, "task_restore_screenfade", msg_entity)

return PLUGIN_CONTINUE;
}

public message_nvgtoggle(msg_id, msg_dest, msg_entity)
{
static flag
flag = get_msg_arg_int(1)

message_begin(MSG_ONE_UNRELIABLE, SVC_LIGHTSTYLE, _, msg_entity)
write_byte(0)

if (flag)
write_string("#")
else
write_string(g_default_map_light)

message_end()

if (!task_exists(msg_entity))
{
message_begin(MSG_ONE, g_msgScreenFade, _, msg_entity)
write_short((1<<12))
write_short(0)
write_short(0x0004)

if (flag)
{
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(1)
}
else
{
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(0)
}

message_end()
}

g_nightvision[msg_entity] = flag

return PLUGIN_HANDLED;
}

public task_restore_screenfade(id)
{
if (!g_nightvision[id])
return;

message_begin(MSG_ONE, g_msgScreenFade, _, id)
write_short((1<<12))
write_short(0)
write_short(0x0004)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(1)
message_end()
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ProKreedzHook ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public hook_on(id)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED

if((cs_get_user_team(id) != CS_TEAM_CT) && (cs_get_user_team(id) != CS_TEAM_T))
return PLUGIN_HANDLED

if(!is_user_alive(id))
return PLUGIN_HANDLED

if(!canusehook[id] && !(get_user_flags(id)&KZ_LEVEL_1)) {
ColorChat(id,RED,"%s^1 Go through the map to get the Hook.", prefix)
return PLUGIN_HANDLED
}

get_user_origin(id,hookorigin[id],3)

// Проверка на hook + 3 sec not use start
antihookcheat[id] = get_gametime()
detect_cheat(id,"Hook")

ishooked[id] = true

flash_icon_hook(id)
set_task(0.1,"hook_task",id,"",0,"ab")
hook_task(id)

return PLUGIN_HANDLED
}

public is_hooked(id)
{
return ishooked[id]
}

public hook_off(id)
{
if(!is_user_connected(id))
return PLUGIN_HANDLED

if(((cs_get_user_team(id) != CS_TEAM_CT) && (cs_get_user_team(id) != CS_TEAM_T)) || !ishooked[id])
return PLUGIN_HANDLED

remove_hook(id)
return PLUGIN_HANDLED
}

public hook_task(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
remove_hook(id)

new origin[3], Float:velocity[3]
get_user_origin(id,origin)

new distance = get_distance(hookorigin[id],origin)
if(distance > 50)
{
//draw hook
Create_TE_BEAMENTPOINT(id, hookorigin[id])

set_rendering(id, kRenderFxGlowShell, random_num(1,255), random_num(1,255), random_num(1,255), kRenderNormal, 16)

// hook_sec[id]++
// if(hook_sec[id] >= 3) {
// Create_TE_SPRITETRAIL(id, origin, hookorigin[id])
// hook_sec[id] = 0
// }

velocity[0] = (hookorigin[id][0] - origin[0]) * (700.0 / distance)
velocity[1] = (hookorigin[id][1] - origin[1]) * (700.0 / distance)
velocity[2] = (hookorigin[id][2] - origin[2]) * (700.0 / distance)

entity_set_vector(id,EV_VEC_velocity,velocity)
entity_set_int(id, EV_INT_gaitsequence, 6)
}
else
{
entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
remove_hook(id)
}
}

stock Create_TE_BEAMENTPOINT(id, origin[3])
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMENTPOINT)
write_short(id)
write_coord(origin[0])
write_coord(origin[1])
write_coord(origin[2])
write_short(Sbeam)
write_byte(0)
write_byte(0)
write_byte(1)
write_byte(30)
write_byte(0)
write_byte(random_num(1,255))
write_byte(random_num(1,255))
write_byte(random_num(1,255))
write_byte(75)
write_byte(0)
message_end()

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMENTPOINT)
write_short(id)
write_coord(origin[0])
write_coord(origin[1])
write_coord(origin[2])
write_short(Sbeam)
write_byte(0)
write_byte(0)
write_byte(1)
write_byte(10)
write_byte(0)
write_byte(random_num(1,255))
write_byte(random_num(1,255))
write_byte(random_num(1,255))
write_byte(150)
write_byte(0)
message_end()
}

stock Create_TE_SPRITETRAIL(id, start[3], end[3] )
{
message_begin( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, .player = id )
write_byte( TE_SPRITETRAIL )
write_coord( start[0] ) // start position (X)
write_coord( start[1] ) // start position (Y)
write_coord( start[2] ) // start position (Z)
write_coord( end[0] ) // end position (X)
write_coord( end[1] ) // end position (Y)
write_coord( end[2] ) // end position (Z)
write_short( g_sShadow ) // sprite index
write_byte( 50 ) // count
write_byte( 15 ) // life in 0.1's
write_byte( 1 ) // scale in 0.1's
write_byte( 2 ) // velocity along vector in 10's
write_byte( 6 ) // randomness of velocity in 10's
message_end()
}

public remove_hook(id)
{
if(task_exists(id))
remove_task(id)

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_KILLBEAM)
write_short(id)
message_end()

set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)

if(get_user_flags(id) & KZ_LEVEL_1)
show_icon_hook(id)
else if(canusehook[id])
show_icon_hook(id)
else
hide_icon_hook(id)

ishooked[id] = false
}

public remove_hook_2(id)
{
if(task_exists(id))
remove_task(id)

ishooked[id] = false
}

public give_hook_finish(id)
{
if(access(id,KZ_LEVEL_1))
return PLUGIN_HANDLED

canusehook[id] = true

set_hudmessage(KZ_R, KZ_G, KZ_B, -0.2, 0.1, 0, 0.0, 10.0, 0.4, 0.4, 4)
show_hudmessage(id, "Rewards:^n- Hook (Just bind '+hook' on a key)")

client_cmd(id, "speak give_hook")
show_icon_hook(id)
//show_icon_noclip(id)

return PLUGIN_HANDLED
}

public remove_hook_complete(id)
{
if(task_exists(id))
remove_task(id)

ishooked[id] = false
canusehook[id] = false
remove_hook(id)
hide_icon_hook(id)
}

public hide_icon_hook(id)
{
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(0)
write_string("dmg_shock")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}

public show_icon_hook(id)
{
if(icons[id]) {
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(1)
write_string("dmg_shock")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}
}

public flash_icon_hook(id)
{
if(icons[id]) {
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(2)
write_string("dmg_shock")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}
}

public resethud(id)
{
if(is_user_admin(id))
{
if(get_user_flags(id) & KZ_LEVEL_1)
{
//show_icon_noclip(id)
show_icon_hook(id)
}
}


/*if(canusenoclip[id]) {
show_icon_noclip(id)
}*/

if(canusehook[id])
show_icon_hook(id)

if(GodModeOn[id] == 1)
set_user_godmode(id,1)
else
set_user_godmode(id,0)
}

public cmdIcons(id)
{
if(!icons[id]) {
icons[id] = true
ColorChat(id, BLUE, "^x01%s^x03 Rewards Icons has been enabled!", prefix)
if(get_user_flags(id) & KZ_LEVEL_1) {
//show_icon_noclip(id)
show_icon_hook(id)
}
else {
//if(canusenoclip[id]) show_icon_noclip(id)
if(canusehook[id]) show_icon_hook(id)
}
}
else {
icons[id] = false
ColorChat(id, RED, "^x01%s^x03 Rewards Icons has been disabled!", prefix)
//hide_icon_noclip(id)
hide_icon_hook(id)
}
return PLUGIN_CONTINUE
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ProKreedz Noclip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
public noclip_on(id) {
if(!is_user_connected(id)) {
return PLUGIN_HANDLED
}

if((cs_get_user_team(id) != CS_TEAM_CT) && (cs_get_user_team(id) != CS_TEAM_T))
return PLUGIN_HANDLED

if(!is_user_alive(id))
return PLUGIN_HANDLED

isnocliped[id] = true

// NOCLIP только для VIP
if(get_user_flags(id) & KZ_LEVEL_1) {
canusenoclip[id] = true
}

if(!canusenoclip[id] || !isnocliped[id]) {
ColorChat(id,RED,"%s^1 Пройдите карт, чтобы получить NoClip.", prefix)
return PLUGIN_HANDLED
}

new noclip = set_user_noclip(id,1)
flash_icon_noclip(id)

if(IsPaused[id] && (get_pcvar_num(kz_noclip_pause) == 1))
{
if(noclip)
{
pev(id, pev_origin, NoclipPos[id])
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
}
}

//Проверка на Noclip + 3 sec not use start
antihookcheat[id] = get_gametime()
if( !IsPaused[id] ) detect_cheat(id,"NoClip")

set_rendering(id, kRenderFxGlowShell, 0, 255, 100, kRenderNormal, 16)

return PLUGIN_HANDLED
}

public noclip_off(id) {
if(!is_user_connected(id)) {
return PLUGIN_HANDLED
}

if((cs_get_user_team(id) != CS_TEAM_CT) && (cs_get_user_team(id) != CS_TEAM_T))
return PLUGIN_HANDLED

isnocliped[id] = false
new noclip = set_user_noclip(id,0)
if(IsPaused[id] && (get_pcvar_num(kz_noclip_pause) == 1))
{
if(noclip)
{
set_pev(id, pev_origin, NoclipPos[id])
set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
}
}


set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)

if(get_user_flags(id) & KZ_LEVEL_1) {
show_icon_noclip(id)
}
if(canusenoclip[id]) {
show_icon_noclip(id)
}

return PLUGIN_HANDLED
}

public hide_icon_noclip(id) {
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(0)
write_string("dmg_rad")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}

public show_icon_noclip(id) {
if(icons[id]) {
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(1)
write_string("dmg_rad")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}
}

public flash_icon_noclip(id) {
if(icons[id]) {
message_begin(MSG_ONE,get_user_msgid("StatusIcon"),{0,0,0},id)
write_byte(2)
write_string("dmg_rad")
write_byte(KZ_R)
write_byte(KZ_G)
write_byte(KZ_B)
message_end()
}
}*/

public noclip(id)
{
if(!is_user_alive(id) || Savepos_exploit[id])
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if(timer_started[id] && !IsPaused[id]) Pause(id);

new noclip = !get_user_noclip(id)

if(IsPaused[id])
{
set_user_noclip(id, noclip)
antihookcheat[id] = get_gametime()

if(noclip)
{
pev(id, pev_origin, NoclipPos[id])
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
}
else
{
set_pev(id, pev_origin, NoclipPos[id])
set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
}

kz_chat(id, "Noclip %s", noclip ? "ON" : "OFF")
}
else
{
ColorChat(id, RED, "^x01%s^x03 Noclip can not be activated now!!", prefix)
}

return PLUGIN_HANDLED
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cursor view stats ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public fwdPlayerPreThink(id)
{
if(!is_user_connected(id) || is_user_bot(id))
return

if((cs_get_user_team(id) == CS_TEAM_SPECTATOR) || (cs_get_user_team(id) == CS_TEAM_UNASSIGNED))
{
if(is_user_alive(id)) user_kill(id);
}

if(pev(id, pev_deadflag) == DEAD_DYING)
set_pev(id, pev_framerate, 2000.0)

new bool:alive = true
new player, body
get_user_aiming(id, player, body)

if(!is_user_alive(id) || !is_user_alive(player))
alive = false

if(!InvisUser[id])
{
if(alive)
{
new name[32]
get_user_name(player, name, 31)
set_hudmessage(KZ_R, KZ_G, KZ_B, -1.0, 0.60, 0, 0.01, 0.1, 0.01, 0.01, 4)

if(IsPaused[player] == true)
show_hudmessage(id, "%s^n[ PAUSED | %d/%d ]", name, checknumbers[player], gochecknumbers[player])
else if(timer_started[player])
{
new Float:playersec = halflife_time() - timer_time[player], playermin

if((playersec / 60.000000) >= 1)
{
playermin = floatround(playersec / 60.000000,floatround_floor)
playersec -= (floatround(playersec / 60.000000,floatround_floor) * 60)
}

show_hudmessage(id, "%s^n[ %s%d:%s%.1f | %d/%d ]", name, playermin >= 10 ? "" : "0", playermin, playersec >= 10 ? "" : "0", playersec, checknumbers[player], gochecknumbers[player])
}
else
show_hudmessage(id, "%s^n[ OFF | %d/%d ]", name, checknumbers[player], gochecknumbers[player])
}
}

if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)
{
new target = pev(id, pev_iuser2)

if(full_Invisible[target])
if(!Screen_fade[id]) Screen(id, true)
else
if(Screen_fade[id]) Screen(id, false)
}

if(is_user_alive(id))
{
if(g_bFlashLight[id])
Make_FlashLight(id)

// Speed
new Float:velocity[3], Float:speed
pev(id, pev_velocity, velocity);
movetype[id] = pev(id, pev_movetype);

if( velocity[2] != 0 )
velocity[2]-=velocity[2];

speed = vector_length(velocity);
speedshowing[id]=speed;

if(!mapIsGravity && is_user_alive(id) && get_user_gravity(id) != 1.0)
{
detect_cheat(id, "Gravity")
set_user_gravity(id)
}
}

if (get_user_flags(id) & ADMIN_IMMUNITY && is_user_connected(id) && cs_get_user_team(id) != CS_TEAM_SPECTATOR && cs_get_user_team(id) != CS_TEAM_UNASSIGNED)
{
cs_set_user_team(id,CS_TEAM_T,CS_CT_URBAN)
}

static Float:last_check[33], Float:game_time;
static frames[33];

game_time = get_gametime( );

if( game_time - last_check[id] > 1.0 )
{
g_iPlayerFps[id] = frames[id];
frames[id] = 0;
last_check[id] = game_time;
}

frames[id]++;
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CheckPoint ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public CheckPoint(id)
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if( !( pev( id, pev_flags ) & FL_ONGROUND2 ) && !IsOnLadder(id))
{
kz_chat(id, "You can not do checkpoints in flight.")
return PLUGIN_HANDLED
}

if( IsPaused[id] )
{
kz_chat(id, "Checkpoint is not possible because of the pause.")
return PLUGIN_HANDLED
}
// Проверка на bhop блоки
new entclassname[33];
pev(pev(id, pev_groundentity), pev_classname, entclassname, 32);

if(equal(entclassname, "func_door"))
{
kz_chat(id, "You can not do checkpoints on bhop block.")
return PLUGIN_HANDLED
}

for(new i=MAX_CPS-1;i>0;i--) {
Checkpoints[id][i][0] = Checkpoints[id][i-1][0]
Checkpoints[id][i][1] = Checkpoints[id][i-1][1]
Checkpoints[id][i][2] = Checkpoints[id][i-1][2]
}

new Float:origin[3]
pev(id, pev_origin, origin)

Checkpoints[id][0][0] = origin[0]
Checkpoints[id][0][1] = origin[1]
Checkpoints[id][0][2] = origin[2]

pev(id, pev_origin, Checkpoints[id][g_bCpAlternate[id] ? 1 : 0])
pev(id, pev_v_angle, gCheckpointAngle[id])
g_bCpAlternate[id] = !g_bCpAlternate[id]
checknumbers[id]++

return PLUGIN_HANDLED
}

public goto_checkpoint(id)
{
if( IsPaused[id] || !is_user_alive( id ))
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}

if(checknumbers[id] > 0)
{
if(read_argc() == 2)
{
new szcp[8], cpnum

read_argv(1,szcp,8)
cpnum = str_to_num(szcp) - 1

if(cpnum >= 0 && cpnum < MAX_CPS)
{
if(cpnum < checknumbers[id])
GoCheck(id,cpnum)
else
ColorChat(id, RED, "^x01%s^x03 You have not created as many checkpoints!", prefix)
}
else
GoCheck(id,0)
}
else
GoCheck(id,0)
}
else
ColorChat(id, RED, "^x01%s^x03 You have no checkpoints!", prefix)

return PLUGIN_HANDLED
}

public GoCheck(id,cp)
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if( checknumbers[id] == 0 )
{
kz_chat(id, "You don't have enough checkpoints.")
return PLUGIN_HANDLED
}

if( IsPaused[id] )
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}

engfunc(EngFunc_SetOrigin, id, Checkpoints[id][cp])
set_pev( id, pev_velocity, Float:{0.0, 0.0, 0.0} );
set_pev( id, pev_flags, pev(id, pev_flags) | FL_DUCKING );

if (TP_MODE[id])
{
set_pev(id, pev_angles, gCheckpointAngle[id]);
set_pev(id, pev_fixangle, 1);
}

gochecknumbers[id]++
return PLUGIN_HANDLED
}

public goto_checkpoint_say(id)
{
if(read_argc() == 2)
{
new szarg1[32], args1[16], args2[16]
read_argv(1,szarg1,32)
copyc(args1,16,szarg1,32)
copy(args2,16,szarg1[strlen(args1)+1])
if(equal(args1,".tp") || equal(args1,"/tp") || equal(args1,"/gc") || equal(args1,".gc") || equal(args1,".gocheck") || equal(args1,"/gocheck"))
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}
if( IsPaused[id] )
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}

if(checknumbers[id] > 0)
{
new cpnum = str_to_num(args2) - 1
if(cpnum >= 0 && cpnum < MAX_CPS)
{
if(cpnum < checknumbers[id])
GoCheck(id,cpnum)
else
ColorChat(id, RED, "^x01%s^x03 You have not created as many checkpoints!", prefix)
}
else
GoCheck(id,0)
}
else
ColorChat(id, RED, "^x01%s^x03 You have no checkpoints!", prefix)

return PLUGIN_HANDLED
}
}

return PLUGIN_CONTINUE
}

public goto_stuck(id)
{
if(is_user_alive(id))
{
if(checknumbers[id] > 1)
GoCheck(id,1)
else
ColorChat(id, RED, "^x01%s^x03 You have no checkpoints!", prefix)
}
return PLUGIN_HANDLED
}

public cmdCheckFix(id)
{
if(!TP_MODE[id])
{
TP_MODE[id] = true
ColorChat(id, BLUE, "^x01%s^x03 CheckPoint Fix has been enabled!", prefix)
}
else
{
TP_MODE[id] = false
ColorChat(id, RED, "^x01%s^x03 CheckPoint Fix has been disabled!", prefix)
}
return PLUGIN_CONTINUE
}

public reset_checkpoints(id)
{
if( !is_user_alive( id ) )
{
kz_chat(id, "You have to be alive.")
return PLUGIN_HANDLED
}

if( IsPaused[id] )
{
kz_chat(id, "You can't teleport to pause.")
return PLUGIN_HANDLED
}

checknumbers[id] = 0
gochecknumbers[id] = 0
timer_started[id] = false
timer_time[id] = 0.0
message_begin(MSG_ONE_UNRELIABLE, g_MsgStatusText, _, id);
write_byte(0);
message_end();

give_item(id,"weapon_knife")
give_item(id,"weapon_usp")
cs_set_user_bpammo(id, CSW_USP, 250)

Savepos_exploit[id] = false;

if(IsPaused[id])
{
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN)
IsPaused[id] = false
}

return PLUGIN_HANDLED
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Semiclip & Invis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build_entitymap()
{
new ent, classname[32], j

for(ent = maxplayers + 1; ent < ENTITY_MAX; ent++)
{
if(!pev_valid(ent))
continue

pev(ent, pev_classname, classname, 31)
for(j=0; j < sizeof invis_class; j++)
{
if(equal(classname, invis_class[j], strlen(classname)))
{
invis_entity[ent] = true
theWaterInvis = true
}
}
}
}

public addToFullPack(es, e, ent, host, hostflags, player, pSet)
{
if(!is_user_connected(host))
return

if(NightVisionUse[host]) {
if(1 <= host <= 32 && get_orig_retval()) {
if(player) {
if(host == ent) {
set_es(es, ES_Effects, (get_es(es, ES_Effects)|EF_BRIGHTLIGHT))
}
}
}
}

if(InvisWater[host]) {
if(invis_entity[ent]) {
set_es(es, ES_Effects, EF_NODRAW)
return
}
}

if( player )
{
if(host != ent && get_orig_retval() && is_user_alive(host) )
{
set_es(es, ES_Solid, SOLID_NOT)
set_es(es, ES_RenderMode, kRenderTransAdd) // подсвеченная моделька как голограмма.
set_es(es, ES_RenderAmt, 50)
}

if(InvisUser[host])
{
set_es(es, ES_RenderMode, kRenderTransTexture)
set_es(es, ES_RenderAmt, 0)
set_es(es, ES_Origin, { 999999999.0, 999999999.0, 999999999.0 } )
}

if(full_Invisible[ent])
{
set_es(es, ES_Effects, EF_NODRAW)
set_es(es, ES_Origin, {-10000.0, -10000.0, -10000.0})
return
}
}
}

public semiclip_preThink(id)
{
if(!is_user_alive(id))
return

get_players(g_iPlayers, g_iNum, "a")

for(new i = 0; i<g_iNum; i++)
{
g_iPlayer = g_iPlayers[i]
if( id != g_iPlayer )
set_pev(g_iPlayer, pev_solid, SOLID_NOT)
}
}

public semiclip_postThink(id)
{
if( !is_user_alive(id) )
return

get_players(g_iPlayers, g_iNum, "a")

for(new i = 0; i<g_iNum; i++)
{
g_iPlayer = g_iPlayers[i]
if( g_iPlayer != id )
set_pev(g_iPlayer, pev_solid, SOLID_SLIDEBOX)
}
}

public Invis_User(id)
{
if(InvisUser[id])
{
InvisUser[id] = false
ColorChat(id, RED, "^x01%s^x03 The invisibility of disabled players!", prefix)
}
else
{
InvisUser[id] = true
ColorChat(id, BLUE, "^x01%s^x03 Visibility enabled players!", prefix)
}
}
public Invis_Water(id)
{
if(theWaterInvis)
{
if(InvisWater[id])
{
InvisWater[id] = false
ColorChat(id, RED, "^x01%s^x03 Invisibility water turned off!", prefix)
}
else
{
InvisWater[id] = true
ColorChat(id, BLUE, "^x01%s^x03 Visibility of water included!", prefix)
}
}
}

public Invis_Full(id) {
if(full_Invisible[id]) {
ColorChat(id, RED, "^x01%s^x03 You all see!", prefix)
full_Invisible[id] = false
}
else {
ColorChat(id, BLUE, "^x01%s^x03 Your model is not visible and off spec!", prefix)
full_Invisible[id] = true
}
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GOD MODE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public GodMode(id)
{
if(is_user_alive(id))
{
if(!GodModeOn[id])
{
GodModeOn[id] = 1
set_user_godmode(id,1)
ColorChat(id, BLUE, "^x01%s^x03 God Mode has been enabled!", prefix)
if(!mapIsSlide && !g_bHealsOnMap)
{
detect_cheat(id, "GodMode")
ColorChat(id, RED, "%s^1 Godmode activated.", prefix)
}
}
else
{
GodModeOn[id] = 0
set_user_godmode(id,0)
ColorChat(id, RED, "^x01%s^x03 God Mode has been disabled!", prefix)

set_hudmessage(KZ_R, KZ_G, KZ_B, -1.0, 0.88, 0, 0.0, 5.0, 0.0, 1.5)
show_hudmessage(id, "%d HP", get_user_health(id))
}
}
else
{
ColorChat(id,RED,"%s^1 You are in Spector.", prefix)
}
return PLUGIN_HANDLED
}

public Ham_DoorSpawn_P(ent)
{
static const szNull[] = "common/null.wav";

new Float:flDamage;
pev(ent, pev_dmg, flDamage);

if(flDamage < -999.0)
{
set_pev(ent, pev_noise1, szNull);
set_pev(ent, pev_noise2, szNull);
set_pev(ent, pev_noise3, szNull);

if(!g_bHealsOnMap)
g_bHealsOnMap = true;
}
}

public Event_Damage(id)
{
set_hudmessage(255, 80, 80, -1.0, 0.83, 0, 0.0, 0.0, 0.0, 2.0)
show_hudmessage(id, "-%d HP", read_data(2))
set_hudmessage(KZ_R, KZ_G, KZ_B, -1.0, 0.88, 0, 0.0, 0.0, 0.0, 2.0)
show_hudmessage(id, "%d HP", get_user_health(id))
}

public msgHealth(msgid, msgdest, id)
{
new hp = get_msg_arg_int(1)

if(!GodModeOn[id] && (0 < hp < 100))
{
set_hudmessage(KZ_R, KZ_G, KZ_B, -1.0, 0.88, 0, 0.0, 0.5, 0.0, 0.0)
show_hudmessage(id, "%d HP", hp)
}

return PLUGIN_CONTINUE;
}

///////////////////////////////////////////////

public forward_set_model(entid, model[])
{
if (!is_valid_ent(entid) || !equal(model, WBOX, 9))
return FMRES_IGNORED

new id = entity_get_edict(entid, EV_ENT_owner)
if (!id || !is_user_connected(id) || is_user_alive(id))
return FMRES_IGNORED

if (equal(model, SHLD))
{
kill_entity(entid)
return FMRES_IGNORED
}

if (equal(model, WBOX))
{
g_entid[id] = entid
return FMRES_IGNORED
}

if (entid != g_entid[id])
return FMRES_IGNORED

g_entid[id] = 0

if (equal(model, BOMB))
return FMRES_IGNORED

for (new i = 1; i <= g_maxents; ++i)
{
if (is_valid_ent(i) && entid == entity_get_edict(i, EV_ENT_owner))
{
kill_entity(entid)
kill_entity(i)
}
}

return FMRES_IGNORED
}

stock kill_entity(id)
{
entity_set_int(id, EV_INT_flags, entity_get_int(id, EV_INT_flags)|FL_KILLME)
}

stock kz_chat(id, const message[], {Float,Sql,Result,_}:...)
{
new msg[180]
vformat(msg, 179, message, 3)
replace_all(msg, 191, "^x01", "")
replace_all(msg, 191, "^x03", "")
replace_all(msg, 191, "^x04", "")
replace_all(msg, 191, ".", "")
kz_hud_message(id, "%s", msg)
}

stock kz_remplace_colors(message[], len)
{
replace_all(message, len, "!g", "^x04")
replace_all(message, len, "!t", "^x03")
replace_all(message, len, "!y", "^x01")
}

stock kz_hud_message(id, const message[], {Float,Sql,Result,_}:...)
{
static msg[192];
vformat(msg, 191, message, 3);

set_hudmessage(SR, SG, SB, -1.0, 0.74, 2, 0.1, 2.5, 0.01, 0.01, -1);
ShowSyncHudMsg(id, hud_message, msg);
}

stock kz_register_saycmd(const saycommand[], const function[], flags)
{
new temp[64]
formatex(temp, 63, "say /%s", saycommand)
register_clcmd(temp, function, flags)
formatex(temp, 63, "say .%s", saycommand)
register_clcmd(temp, function, flags)
formatex(temp, 63, "say_team /%s", saycommand)
register_clcmd(temp, function, flags)
formatex(temp, 63, "say_team .%s", saycommand)
register_clcmd(temp, function, flags)
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ KZ MENU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public kz_menu(id)
{
new title[256];
new CurrentTime[32];
new timeleft = get_timeleft();
new seconds = timeleft % 60;
new minutes = floatround((timeleft - seconds) / 60.0);
get_time("%d/%m/%Y - %H:%M:%S",CurrentTime,31);

formatex(title, 200, "\dVisit to \rCosy-Climbing.net | KreedZ.ru^n\dCreated \rby `L.^n^n\dPresent time %s^nMap \y%s\d & Timeleft \y%d:%02d\d^nType map \y%s\d", CurrentTime, MapName, minutes,seconds, kz_maptype)

new menu = menu_create(title, "MenuHandler")

menu_additem( menu, "Climb Menu^n", "1" )
menu_additem( menu, "Tops Menu", "2")
menu_additem( menu, "\dKZ Duel Menu\w", "3" )
menu_additem( menu, "Config Menu", "4" )
menu_additem( menu, "Teleport Menu^n", "5" )
menu_additem( menu, "Spectator^n", "6")
menu_additem( menu, "Measure Menu", "7" )

menu_display(id, menu, 0)
return PLUGIN_HANDLED
}

public MenuHandler(id , menu, item)
{
if( item == MENU_EXIT )
return PLUGIN_HANDLED

switch(item)
{
case 0: ClimbMenu(id)
case 1: kz_top_menu(id)
case 2: client_cmd(id,"say /duel")
case 3: ConfigMenu(id)
case 4: cmdTeleportMenu(id)
case 5:
{
ct(id)
kz_menu(id)
}
case 6: client_cmd(id,"say /measure")
}
return PLUGIN_HANDLED
}

public ConfigMenu(id)
{
new menu = menu_create("\yConfig Menu^n\rAuto updatable configuration\w", "ConfigMenuHandler")
new msginvis[64], msgwaterinvis[64], msgfull[64], noteleport[64], god[64], icon[64], checkmode[64], speclist[64],specadm[64], savemenu[64]

formatex(msginvis, 63, "Invisible Players - %s", InvisUser[id] ? "\yON" : "\rOFF" )
if(theWaterInvis)
formatex(msgwaterinvis, 63, "Invisible Water - %s", InvisWater[id] ? "\yON" : "\rOFF" )
else
formatex(msgwaterinvis, 63, "\dInvisible Water - %s", InvisWater[id] ? "\yON" : "\rOFF" )

formatex(msgfull, 63, "Full Invisible - %s^n", full_Invisible[id] ? "\yON" : "\rOFF" )
formatex(god, 63, "GodMode - %s", GodModeOn[id] ? "\yON" : "\rOFF" )
formatex(noteleport, 63, "Block Teleport - %s", noTeleport[id] ? "\yON" : "\rOFF" )
formatex(icon, 63, "Icons - %s^n^n", icons[id] ? "\yON" : "\rOFF" )
formatex(checkmode, 63, "CheckPoint Mode - %s^n", TP_MODE[id] ? "\yON" : "\rOFF" )
formatex(speclist, 63, "Spectator List - %s", SpecList[id] ? "\yON" : "\rOFF" )
formatex(savemenu, 63, "Save Config \d[\r%s\d]", SaveCfgDate[id] ? SaveCfgDate[id] : "n/a")

if (get_user_flags(id) & KZ_LEVEL_1)
formatex(specadm, 63, "Admin Invisible Spec - %s^n", SpecAdmImm[id] ? "\yON" : "\rOFF" )
else
formatex(specadm, 63, "\dAdmin Invisible Spec - %s^n", SpecAdmImm[id] ? "\yON" : "\rOFF" )

menu_additem( menu, msginvis, "1" )
menu_additem( menu, msgwaterinvis, "2" )
menu_additem( menu, msgfull, "3" )
menu_additem( menu, god, "4" )
menu_additem( menu, noteleport, "5" )
menu_additem( menu, icon, "6" )

menu_additem( menu, savemenu, "7")

menu_additem( menu, checkmode, "8" )
menu_additem( menu, speclist, "9" )
menu_additem( menu, specadm, "10" )
menu_additem( menu, "ShowTimer Menu \y[>]^n^n", "10")

menu_addblank( menu, 1)
menu_addblank( menu, 1)
menu_additem( menu, savemenu, "12")

menu_setprop(menu, MPROP_NEXTNAME, "Next")
menu_setprop(menu, MPROP_BACKNAME, "Back")
menu_setprop(menu, MPROP_EXITNAME, "Exit")

menu_display(id, menu, 0)
return PLUGIN_HANDLED
}

public ConfigMenuHandler(id, menu, item)
{
if( item == MENU_EXIT )
{
kz_menu(id)
return PLUGIN_HANDLED
}

switch(item)
{
case 0:
{
Invis_User(id)
ConfigMenu(id)
}
case 1:
{
Invis_Water(id)
ConfigMenu(id)
}
case 2:
{
Invis_Full(id)
ConfigMenu(id)
}
case 3:
{
GodMode(id)
ConfigMenu(id)
}
case 4:
{
cmdNoTeleport(id)
ConfigMenu(id)
}
case 5:
{
cmdIcons(id)
ConfigMenu(id)
}
case 6:
{
SQL_ConfigSave(id);
ConfigMenu(id);
}
case 7:
{
cmdCheckFix(id)
ConfigMenu(id)

}
case 8:
{
cmdSpeclist(id)
ConfigMenu(id)
}
case 9:
{
cmdSpeclistAdm(id)
ConfigMenu(id)
}
case 10:
{
ShowTimer_Menu(id)
}
case 11:
{
SQL_ConfigSave(id);
ConfigMenu(id)
}
}
return PLUGIN_CONTINUE
}


public ClimbMenu(id)
{
new menu = menu_create("\yClimb Menu\w", "ClimbMenuHandler")

new msgcheck[64], msggocheck[64], msgpause[64]
formatex(msgcheck, 63, "Checkpoint - \y#%i", checknumbers[id])
formatex(msggocheck, 63, "Gocheck - \y#%i", gochecknumbers[id])
formatex(msgpause, 63, "Pause - %s^n", IsPaused[id] ? "\yON" : "\rOFF" )

menu_additem( menu, msgcheck, "1" )
menu_additem( menu, msggocheck, "2" )
menu_additem( menu, "Stuck^n", "3")
menu_additem( menu, msgpause, "4" )
menu_additem( menu, "Start", "5")
menu_additem( menu, "Save Start^n", "6")
menu_additem( menu, "Usp", "7")
menu_additem( menu, "Weapons", "8")
menu_display(id, menu, 0)
return PLUGIN_HANDLED
}

public ClimbMenuHandler (id, menu, item)
{
if( item == MENU_EXIT )
{
kz_menu(id)
return PLUGIN_HANDLED
}

switch(item)
{
case 0:{
CheckPoint(id)
ClimbMenu(id)
}
case 1:
{
if(checknumbers[id] > 0)
GoCheck(id, 0)
else
ColorChat(id, RED, "^x01%s^x03 You have no checkpoints!", prefix);

ClimbMenu(id)
}
case 2:{
goto_stuck(id)
ClimbMenu(id)
}
case 3:{
Pause(id)
ClimbMenu(id)
}
case 4:{
goStart(id)
ClimbMenu(id)
}
case 5:{
SaveStart(id)
ClimbMenu(id)
}
case 6:{
give_usp_and_knife(id)
ClimbMenu(id)
}
case 7:{
weapons(id)
ClimbMenu(id)
}
}
return PLUGIN_HANDLED
}


public kz_top_menu(id)
{
new menu = menu_create("\wKZ Tops Menu\w", "kz_top_menuHandler")

menu_additem( menu, "KreedZ Top Menu", "1")
menu_additem( menu, "LongJump Top Menu", "2")

menu_display(id, menu, 0)
return PLUGIN_HANDLED
}

public kz_top_menuHandler (id, menu, item)
{
if( item == MENU_EXIT )
{
kz_menu(id)
return PLUGIN_HANDLED
}

switch(item)
{
case 0:{
top15menu(id)
}
case 1:{
client_cmd(id,"say /ljtop")
}
}
return PLUGIN_HANDLED
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Award Menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public actionRewardsMenu(id,key)
{
switch(key)
{
case 7:
{
++g_rewardsOption[id]
g_rewardsOption[id] %= 2

switch (g_rewardsOption[id])
{
case 1: g_rewardsSettings[id] = 1
case 2: g_rewardsSettings[id] = 2
}

displayRewardsMenu(id, g_rewardsPosition[id])
}
case 8: displayRewardsMenu(id,++g_rewardsPosition[id])
case 9: displayRewardsMenu(id,--g_rewardsPosition[id])
default:
{
new player = g_rewardsPlayers[id][g_rewardsPosition[id] * 7 + key]

if(g_rewardsOption[id]) {
if(g_rewardsSettings[id] == 1) {
if(canusenoclip[player]) {
isnocliped[player] = false
canusenoclip[player] = false
//hide_icon_noclip(player)
}
else {
canusenoclip[player] = true
emit_sound(player,CHAN_STATIC,"give_hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
//show_icon_noclip(player)
}
}
}
else {
if(canusehook[player]) {
ishooked[player] = false
canusehook[player] = false
hide_icon_hook(player)
}
else {
canusehook[player] = true
emit_sound(player,CHAN_STATIC,"give_hook.wav",1.0,ATTN_NORM,0,PITCH_NORM)
show_icon_hook(player)
}
}

displayRewardsMenu(id,g_rewardsPosition[id])
}
}
return PLUGIN_HANDLED
}

displayRewardsMenu(id,pos) {
if(pos < 0)
return

get_players(g_rewardsPlayers[id],g_rewardsPlayersNum[id])

new menuBody[512]
new b = 0
new i
new name[32]
new start = pos * 7

if(start >= g_rewardsPlayersNum[id])
start = pos = g_rewardsPosition[id] = 0

new len = format(menuBody,511,"\yRewards Menu\R%d/%d^n\w^n",pos + 1,(g_rewardsPlayersNum[id] / 7 + ((g_rewardsPlayersNum[id] % 7) ? 1 : 0)))
new end = start + 7
new keys = MENU_KEY_0

if(end > g_rewardsPlayersNum[id])
end = g_rewardsPlayersNum[id]

for (new a = start; a < end; ++a) {
i = g_rewardsPlayers[id][a]
get_user_name(i,name,31)

if(access(i,KZ_LEVEL_1)) {
++b

len += format(menuBody[len],511-len,"\d%d. %s \r*^n\w",b,name)

}
else {
keys |= (1<<b)

if(g_rewardsOption[id]) {
if(g_rewardsSettings[id] == 1) {
if(canusenoclip[i])
len += format(menuBody[len],511-len,"\r%d. %s^n\w",++b,name)
else
len += format(menuBody[len],511-len,"%d. %s^n",++b,name)
}
}
else {
if(canusehook[i])
len += format(menuBody[len],511-len,"\r%d. %s^n\w",++b,name)
else
len += format(menuBody[len],511-len,"%d. %s^n",++b,name)
}
}
}

if(g_rewardsOption[id]) {
keys |= MENU_KEY_8
if(g_rewardsSettings[id] == 1) {
len += format(menuBody[len],511-len,"^n8. NoClip^n")
}
}
else {
keys |= MENU_KEY_8
len += format(menuBody[len],511-len,"^n8. Hook^n")
}

if(end != g_rewardsPlayersNum[id]) {
format(menuBody[len],511-len,"^n9. More...^n0. %s",pos ? "Back" : "Exit")
keys |= MENU_KEY_9
}
else
format(menuBody[len],511-len,"^n0. %s",pos ? "Back" : "Exit")

show_menu(id,keys,menuBody,-1,"Rewards Menu")
}

public cmdRewardsMenu(id)
{
if(access(id,KZ_LEVEL_1))
{
g_rewardsOption[id] = 0
g_rewardsSettings[id] = 0
displayRewardsMenu(id,g_rewardsPosition[id] = 0)
}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Top 15 Menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public top15menu(id)
{
new szTimerPro[14], szTimerNub[14]
StringTimer(kz_my_protime[id], szTimerPro, sizeof(szTimerPro) - 1);
StringTimer(kz_my_nubtime[id], szTimerNub, sizeof(szTimerNub) - 1);

new title[512];
formatex(title, 500, "\dCosy-Climbing Top15^nWebstats - \rKreedZ.ru^n\dMap: \y%s\d^n^n\dMy Pro time: \w%s^n\dMy Nub time: \w%s", MapName, szTimerPro, szTimerNub)

new menu = menu_create(title, "top15handler")

menu_additem(menu, "\rPRO\d/\yNUB \wMap Top", "1", 0)
menu_additem(menu, "\wMy Stats","2")
menu_additem(menu, "\wPlayers Top15^n","3")

menu_display(id, menu, 0);
}

public top15handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
switch(item)
{
case 0:
{
stats_show(id)
}
case 1:
{
kz_profile(id)
}
case 2:
{
kz_showhtml_motd(id, PLAYERS_RANKING)
}
}

return PLUGIN_HANDLED;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Timer Funct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public fwdUse(ent, id)
{
if( !ent || id > 32 )
{
return HAM_IGNORED;
}

if( !is_user_alive(id) || get_user_noclip(id) || ishooked[id])
{
return HAM_IGNORED;
}

if(Savepos_have[id])
{
SQL_Savepos_menu(id);
return HAM_IGNORED
}

if(!g_bHealsOnMap)
{
set_pev(id, pev_health, 100.0);
}

new szTarget[32]
pev(ent, pev_target, szTarget, 31);

if( TrieKeyExists( g_tStarts, szTarget ) )
{
if ( get_gametime() - antihookcheat[id] < 3.0 )
{
kz_hud_message( id, "Wait 3 seconds after using the hook.");
return PLUGIN_HANDLED
}

if(!mapIsSlide && !g_bHealsOnMap && GodModeOn[id]) {
ColorChat(id, RED, "^x01%s^x03 Start impossible because enabled GodMode!", prefix)
return PLUGIN_HANDLED
}

if ( reset_checkpoints(id) && !timer_started[id] )
{
start_climb(id)
// Обновляет массив с координатами для бота
ArrayClear(g_DemoReplay[id]);

new clip, ammo, wpn_num, wpn[32]
wpn_num = get_user_weapon(id, clip, ammo)
if(wpn_num) {
get_weaponname(wpn_num, wpn, 31)
} else {
format(wpn, 31, "weapon_knife")
}
strip_user_weapons(id)
give_item(id, wpn)

if(equali(wpn, "weapon_knife") || equali(wpn, "weapon_usp")) {
give_usp_and_knife(id)
engclient_cmd(id, wpn)
}

pev(id, pev_origin, SavedStart[id])
AutoStart[id] = true;

if( !Default_SF[0] )
{
SQL_StartFinish(true, SavedStart[id] )
ColorChat(id, GREEN, "%s^x01 Established the starting position on the map.", prefix)
}

remove_hook(id)
}

}


if( TrieKeyExists( g_tStops, szTarget ) )
{
if( timer_started[id] )
{
if(get_user_noclip(id))
return PLUGIN_HANDLED

if( !Default_SF[1] )
{
pev(id, pev_origin, DefaultFinishPos)
SQL_StartFinish(false, DefaultFinishPos)
ColorChat(id, GREEN, "%s^x01 Established the position of the finish on the map.", prefix)
}

finish_climb(id)
// После завершения карты, дарит hook, noclip
give_hook_finish(id)
canusenoclip[id] = true
canusehook[id] = true

if (id == g_bot_id)
Start_Bot();
}
else
kz_hud_message(id, "The timer is not running.")

}
return HAM_IGNORED
}

public start_climb(id)
{
set_pev(id, pev_gravity, 1.0);
set_pev(id, pev_movetype, MOVETYPE_WALK)
reset_checkpoints(id)
IsPaused[id] = false
timer_started[id] = true
timer_time[id] = get_gametime()
Savepos_activated[id] = false;
}

public finish_climb(id)
{
if (!is_user_alive(id) || is_user_bot(id)) return;

new Float: time, wpn
time = get_gametime() - timer_time[id]

if (time < 0.0)
{
ColorChat(id, RED, "%s ^3 CRITICAL ERROR: The timer has a negative time", prefix)
return;
}
// Массив с временем для Бота
Update_timer[id] = time
show_finish_message(id, time, true, false) // Сообщение после нажатия на финиш
timer_started[id] = false

wpn = get_user_weapon( id )

new cData[5], createinto[1001]
// Массивы с данными которые идут для SQL_ThreadQuery
cData[0] = id
//cData[2] = time
cData[3] = checknumbers[id]
cData[4] = gochecknumbers[id]
// условия, было ли оружие в руках
new bool:user_weapon = false;
new weapon = get_user_weapon(id)
get_weaponname(weapon, weapon_name, charsmax(weapon_name))
// Сравнивание оружия с константами
for(new i = 0; i < 8; i++)
{
if(equali(other_weapons_name[i], weapon_name))
{
user_weapon = true;
}
}

if (gochecknumbers[id] == 0 )
cData[1] = PRO_TOP
else
cData[1] = NUB_TOP

if (user_weapon && get_pcvar_num(sv_airaccelerate) == 10)
{
formatex(createinto, sizeof createinto - 1, "SELECT time FROM `%s` WHERE map_id='%d' AND authid='%s' AND weapon='%s'", gochecknumbers[id] == 0 ? "kz_weapon_pro" : "kz_weapon_nub", kz_mapID, kz_authid[id], g_weaponsnames[wpn])
SQL_ThreadQuery(g_SqlTuple, "SQL_StatsAdd", createinto, cData, 6)
} else {
formatex(createinto, sizeof createinto - 1, "SELECT time FROM `%s%s` WHERE map_id='%d' AND authid='%s'", gochecknumbers[id] == 0 ? "kz_pro15" : "kz_nub15", get_pcvar_num(sv_airaccelerate) == 100 ? "_100aa" : "", kz_mapID, kz_authid[id])
SQL_ThreadQuery(g_SqlTuple, "SQL_StatsAdd", createinto, cData, 6)
}
}

public show_finish_message(id, Float:kreedztime, bool:szfinish, bool:record)
{
new name[32], szTime[14]
new wpn = get_user_weapon(id)
new speed = str_to_num(g_weaponsnames[wpn])
get_user_name(id, name, 31)
StringTimer(kreedztime, szTime, sizeof(szTime) - 1);
if (szfinish)
{
ColorChat(0, BLUE, "^x01%s^x03 %s^x01 finished the map in^x03 %s ^x01( CPs: ^x03%d^x01 | TPs: ^x03%d^x01 | Weapon: ^x03%s^x01)", prefix, name, szTime, checknumbers[id], gochecknumbers[id], Weapon_Converter(speed))
} else
{
if (record) {
ColorChat(id, RED, "^x01%s^x03 You have improved your time by^x04 %s^x03 in the ^x04%s", prefix, szTime, gochecknumbers[id] == 0 ? "Professional Top" : "General Top")
} else {
ColorChat(id, GREY, "^x01%s^x03 You missed your best time by^x04 %s^x03 in the ^x04%s", prefix, szTime, gochecknumbers[id] == 0 ? "Professional Top" : "General Top")
}
}
}

//==========================================================

public jumphelp(id) {
kz_showhtml_motd(id, HELP)
return PLUGIN_CONTINUE
}

public stats_show(id)
{
kz_showhtml_motd(id, STATS_TOP)

return PLUGIN_HANDLED
}

stock kz_showhtml_motd(id, type)
{
new buffer[1001], namebuffer[64]

switch( type )
{
case STATS_TOP:
{
formatex(namebuffer, 63, "Stats of %s", MapName)
formatex(buffer, 1000, "<html><head><meta http-equiv=^"Refresh^" content=^"0;url=%s/stats15/%s/?&authid=%s^"></head><body><p>LOADING...</p></body></html>", pgL_sql_files, MapName, kz_authid[id])
}
case PLAYERS_RANKING:
{
formatex(namebuffer, 63, "KZ Top15")
formatex(buffer, 1000, "<html><head><meta http-equiv=^"Refresh^" content=^"0;url=%s/motdtop/1^"></head><body><p>LOADING...</p></body></html>", pgL_sql_files)
}
case HELP:
{
formatex(namebuffer, 63, "Server Info / Help")
formatex(buffer, 1000, "<html><head><meta http-equiv=^"Refresh^" content=^"0;url=%s/info.php^"></head><body><p>LOADING...</p></body></html>", pgL_sql_files)
}
}

show_motd(id, buffer, namebuffer)
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SPEC INFO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public tskShowSpec()
{
static szHud[1102];//32*33+45
static szName[34];
static bool:send;

for( new alive = 1; alive <= 32; alive++ )
{
new bool:sendTo[33];
send = false;

if( !is_user_alive(alive) )
{
continue;
}

sendTo[alive] = true;

get_user_name(alive, szName, 32);
format(szHud, 45, "Spectating %s:^n", szName);

for( new dead = 1; dead <= 32; dead++ )
{
if( is_user_connected(dead) )
{
if (is_user_alive(dead))
{
continue;
}

if( pev(dead, pev_iuser2) == alive )
{
if (full_Invisible[alive] && !is_user_bot(alive))
{
if(cs_get_user_team(dead) == CS_TEAM_SPECTATOR)
{
if(!(get_user_flags(dead) & ADMIN_IMMUNITY) || !(get_user_flags(dead) & ACCESS_3))
{
set_hudmessage(255, 0, 0, -1.0, 0.3, 1, 0.2, 0.1, 0.1, 0.1, -1)
show_hudmessage(dead, "It has enabled the user FULL INVISIBLE")
}
}
}

if( !SpecAdmImm[dead])
{
get_user_name(dead, szName, 32);
add(szName, 33, "^n", 0);
add(szHud, 1101, szName, 0);
send = true;
}
sendTo[dead] = true;

}
}
}

if( send == true )
{
for( new i = 1; i <= 32; i++ )
{
if( sendTo[i] == true && SpecList[i] == 1 )
{
set_hudmessage(SR, SG, SB, 0.85, 0.15, 0, 0.0, UPDATEINTERVAL, 0.2, 0.2, 4);
show_hudmessage(i, szHud);
}
}
}
}

return PLUGIN_CONTINUE;
}

public Screen(id, bool:fade)
{
if(is_user_connected(id))
{
message_begin(MSG_ONE_UNRELIABLE, 98, _, id);
write_short(1<<0);
write_short(1<<0);
if(fade)
write_short(1<<2);
else
write_short(1<<1);
write_byte(0);
write_byte(0);
write_byte(0);
if (fade)
write_byte(255);
else
write_byte(0);
message_end();

if(fade)
Screen_fade[id] = true;
else
Screen_fade[id] = false;
}
}

public cmdSpeclist(id) {
if(!SpecList[id]) {
SpecList[id] = true
ColorChat(id, BLUE, "^x01%s^x03 Speclist has been enabled!", prefix)
}
else {
SpecList[id] = false
ColorChat(id, RED, "^x01%s^x03 Speclist has been disabled!", prefix)
}
return PLUGIN_CONTINUE
}

public cmdSpeclistAdm(id) {
if (! (get_user_flags( id ) & KZ_LEVEL_1 ))
{
ColorChat(id, RED, "^x01%s^x03 Not access", prefix)
return PLUGIN_HANDLED
}

if(!SpecAdmImm[id]) {
SpecAdmImm[id] = true
ColorChat(id, BLUE, "^x01%s^x03 You not be displayed in the Speclist!", prefix)
}
else {
SpecAdmImm[id] = false
ColorChat(id, RED, "^x01%s^x03 You displays in a Speclist!", prefix)
}
return PLUGIN_CONTINUE
}

public fw_StartFrame()
{
static Float:fGameTime, Float:fDelay, Float:last_check, frames;
fGameTime = get_gametime();
fDelay = 0.1;

if((fShowKeyTime + fDelay) <= fGameTime)
{
show_keyinfo();
fShowKeyTime = fGameTime;
}
static id;
for(id = 1; id <= maxplayers; id++)
{
if(is_user_alive(id))
{
new Button = pev(id, pev_button);
if(Button & IN_FORWARD)
g_iPlayerKeys[id] |= IN_FORWARD;
if(Button & IN_BACK)
g_iPlayerKeys[id] |= IN_BACK;
if(Button & IN_MOVELEFT)
g_iPlayerKeys[id] |= IN_MOVELEFT;
if(Button & IN_MOVERIGHT)
g_iPlayerKeys[id] |= IN_MOVERIGHT;
if(Button & IN_DUCK)
g_iPlayerKeys[id] |= IN_DUCK;
if(Button & IN_JUMP )
g_iPlayerKeys[id] |= IN_JUMP;
}
}

if( fGameTime - last_check > 1.0 )
{
g_iServerFps = frames;
frames = 0;
last_check = fGameTime;
}

frames++;
return FMRES_IGNORED;
}

stock show_keyinfo()
{
static id;
for(id = 1; id <= maxplayers; id++)
{
if(!is_user_alive(id))
{
new specmode = pev(id, pev_iuser1);
if(specmode == 2 || specmode == 4)
{
new target = pev(id, pev_iuser2);

if(target != id)
{
if(!is_user_alive(target))
g_iPlayerKeys[target] = 0;

static plr_key[64]
set_hudmessage(0, 50, 255, -1.0, -0.40, 0, _, 0.1, _, _, 3);
formatex(plr_key, 63, "%s^n %s %s %s %s ^n %s",
g_iPlayerKeys[target] & IN_FORWARD ? "W" : " .",
g_iPlayerKeys[target] & IN_MOVELEFT ? "A" : ".",
g_iPlayerKeys[target] & IN_BACK ? "S" : ".",
g_iPlayerKeys[target] & IN_MOVERIGHT ? "D" : ".",
g_iPlayerKeys[target] & IN_DUCK ? "DUCK" : "- ",
g_iPlayerKeys[target] & IN_JUMP ? "JUMP" : " . ");
ShowSyncHudMsg(id, g_SyncShowKeys, "%s", plr_key);
}
}
}
else if(is_user_alive(id) && g_bShowKeys[id])
{
static plr_key[64]
set_hudmessage(0, 50, 255, -1.0, -0.40, 0, _, 0.1, _, _, 3);
formatex(plr_key, 63, "%s^n %s %s %s %s ^n %s",
g_iPlayerKeys[id] & IN_FORWARD ? "W" : " .",
g_iPlayerKeys[id] & IN_MOVELEFT ? "A" : ".",
g_iPlayerKeys[id] & IN_BACK ? "S" : ".",
g_iPlayerKeys[id] & IN_MOVERIGHT ? "D" : ".",
g_iPlayerKeys[id] & IN_DUCK ? "DUCK" : "- ",
g_iPlayerKeys[id] & IN_JUMP ? "JUMP" : " . ");
ShowSyncHudMsg(id, g_SyncShowKeys, "%s", plr_key);
}
}
for(id = 1; id <= maxplayers; id++)
{
g_iPlayerKeys[id] = 0;
}
return PLUGIN_CONTINUE;
}

public ClientShowKeys(id)
{
g_bShowKeys[id] = !g_bShowKeys[id];
set_hudmessage(0, 100, 255, -1.0, 0.74, 2, 0.1, 2.5, 0.01, 0.01, 3);
if (g_bShowKeys[id])
show_hudmessage( id, "Showkeys: ON" );
else
show_hudmessage( id, "Showkeys: OFF" );
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Reset HUD (armor,hp,radar) ~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public onResetHUD(id)
{
new iHideFlags = GetHudHideFlags()
if(iHideFlags)
{
message_begin(MSG_ONE, g_msgHideWeapon, _, id)
write_byte(iHideFlags)
message_end()
}
}

public msgHideWeapon()
{
new iHideFlags = GetHudHideFlags()
if(iHideFlags)
set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1) | iHideFlags)
}

GetHudHideFlags()
{
new iFlags

//iFlags |= HUD_HIDE_CAL
iFlags |= HUD_HIDE_FLASH
iFlags |= HUD_HIDE_RHA
iFlags |= HUD_HIDE_TIMER
iFlags |= HUD_HIDE_MONEY

return iFlags
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FLASHLIGHT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public Event_DeathMsg()
{
flashlight_reset(read_data(2))
}

flashlight_reset(id)
{
if( 1 <= id <= maxplayers )
{
g_iFlashBattery[id] = 100
g_bFlashLight[id] = false
g_flFlashLightTime[id] = 0.0
}
}

public Impulse_100( id )
{
if( g_bEnabled )
{
if(is_user_alive(id))
{
if( g_bFlashLight[id] )
{
FlashlightTurnOff(id)
}
else
{
FlashlightTurnOn(id)
}
}
return PLUGIN_HANDLED_MAIN
}
return PLUGIN_CONTINUE
}

Make_FlashLight(id)
{
static iOrigin[3], iAim[3], iDist
get_user_origin(id, iOrigin, 1)
get_user_origin(id, iAim, 3)

iDist = get_distance(iOrigin, iAim)

if( iDist > g_iDistanceMax )
return

static iDecay, iAttn

iDecay = iDist * 255 / g_iDistanceMax
iAttn = 256 + iDecay * g_iAttenuation // barney/dontaskme

message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
write_byte( TE_DLIGHT )
write_coord( iAim[0] )
write_coord( iAim[1] )
write_coord( iAim[2] )
write_byte( g_iRadius )
write_byte( (g_iColor[id][Red]<<8) / iAttn )
write_byte( (g_iColor[id][Green]<<8) / iAttn )
write_byte( (g_iColor[id][Blue]<<8) / iAttn )
write_byte( 1 )
write_byte( iDecay )
message_end()
}

FlashlightTurnOff(id)
{
g_bFlashLight[id] = false

FlashlightHudDraw(id, 0)

g_flFlashLightTime[id] = g_flCharge + get_gametime()
}

FlashlightTurnOn(id)
{
g_bFlashLight[id] = true

FlashlightHudDraw(id, 1)

g_iColor[id] = g_iTeamColor[2-get_user_team(id)]

g_flFlashLightTime[id] = g_flDrain + get_gametime()
}

FlashlightHudDraw(id, iFlag)
{
message_begin(MSG_ONE_UNRELIABLE, g_msgidFlashlight, _, id)
write_byte(iFlag)
write_byte(g_iFlashBattery[id])
message_end()
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RECORD REPLAY ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ReadBestRunFile()
{
new ArrayData[DemoData]

new szFile[128], len
format(szFile, sizeof(szFile) - 1, "%s/records", DATADIR) // Идем в дерикторию /configs/kz/records
if( !dir_exists(szFile) ) mkdir(szFile); // Если нету дериктории, создаем

format(szFile, sizeof(szFile) - 1, "%s/%s.txt", szFile, g_szMapName) // Конечный формат /configs/kz/records/<map>.txt

if (file_exists(szFile)) // Делаем проверку на наличие файла
{
g_fileRead = true
read_file(szFile,1,g_ReplayName,63,len)
}
else
return PLUGIN_HANDLED;

new hFile = fopen(szFile, "r"); // Открываем файл с рекордом
new szData[1024];
new szBotAngle[2][40], szBotPos[3][60], szBotVel[3][60], szBotButtons[12];

new line;

while(!feof(hFile))
{
fgets(hFile, szData, charsmax(szData));

if(!szData[0] || szData[0] == '^n')
continue;

if(!line)
{
g_ReplayBestRunTime = str_to_float(szData);
line++;
continue;
}

strtok(szData, szBotAngle[0], charsmax(szBotAngle[]), szData, charsmax(szData), ' ', true)
strtok(szData, szBotAngle[1], charsmax(szBotAngle[]), szData, charsmax(szData), ' ', true)

strtok(szData, szBotPos[0], charsmax(szBotPos[]), szData, charsmax(szData), ' ', true)
strtok(szData, szBotPos[1], charsmax(szBotPos[]), szData, charsmax(szData), ' ', true)
strtok(szData, szBotPos[2], charsmax(szBotPos[]), szData, charsmax(szData), ' ', true)

strtok(szData, szBotVel[0], charsmax(szBotVel[]), szData, charsmax(szData), ' ', true)
strtok(szData, szBotVel[1], charsmax(szBotVel[]), szData, charsmax(szData), ' ', true)
strtok(szData, szBotVel[2], charsmax(szBotVel[]), szData, charsmax(szData), ' ', true)

strtok(szData, szBotButtons, charsmax(szBotButtons), szData, charsmax(szData), ' ', true)

ArrayData[flBotAngle][0] = _:str_to_float(szBotAngle[0]);
ArrayData[flBotAngle][1] = _:str_to_float(szBotAngle[1]);

ArrayData[flBotPos][0] = _:str_to_float(szBotPos[0]);
ArrayData[flBotPos][1] = _:str_to_float(szBotPos[1]);
ArrayData[flBotPos][2] = _:str_to_float(szBotPos[2]);

ArrayData[flBotVel][0] = _:str_to_float(szBotVel[0]);
ArrayData[flBotVel][1] = _:str_to_float(szBotVel[1]);
ArrayData[flBotVel][2] = _:str_to_float(szBotVel[2]);

ArrayData[iButton] = _: str_to_num(szBotButtons);

ArrayPushArray(g_DemoPlaybot[0], ArrayData);
line++;
}
fclose(hFile);
bot_restart();

return PLUGIN_HANDLED;
}

public ClCmd_UpdateReplay(id, Float:timer)
{
new szName[32];
get_user_name(id, szName, 31)
g_ReplayBestRunTime = timer;
new szFile[128], szData[128];
format(szFile, sizeof(szFile) - 1, "%s/records/%s.txt", DATADIR, g_szMapName)
delete_file(szFile)
new hFile = fopen(szFile, "wt");
ArrayClear(g_DemoPlaybot[0]);
new str[25], nick[64];
formatex(str, charsmax(str), "%f^n", g_ReplayBestRunTime);
formatex(nick, charsmax(nick), "%s^n", szName);
fputs(hFile, str);
fputs(hFile, nick);
new ArrayData[DemoData], ArrayData2[DemoData];
for(new i; i < ArraySize(g_DemoReplay[id]); i++)
{
ArrayGetArray(g_DemoReplay[id], i, ArrayData);
ArrayData2[flBotAngle][0] = _:ArrayData[flBotAngle][0]
ArrayData2[flBotAngle][1] = _:ArrayData[flBotAngle][1]
ArrayData2[flBotVel][0] = _:ArrayData[flBotVel][0]
ArrayData2[flBotVel][1] = _:ArrayData[flBotVel][1]
ArrayData2[flBotVel][2] = _:ArrayData[flBotVel][2]
ArrayData2[flBotPos][0] = _:ArrayData[flBotPos][0]
ArrayData2[flBotPos][1] = _:ArrayData[flBotPos][1]
ArrayData2[flBotPos][2] = _:ArrayData[flBotPos][2]
ArrayData2[iButton] = ArrayData[iButton]
if(i >= ArraySize(g_DemoReplay[id]))
{
ArrayPushArray(g_DemoReplay[id], ArrayData2);
}
else
{
ArraySetArray(g_DemoReplay[id], i, ArrayData2);
}
formatex(szData, sizeof(szData) - 1, "%f %f %f %f %f %f %f %f %d^n", ArrayData2[flBotAngle][0], ArrayData2[flBotAngle][1],
ArrayData2[flBotPos][0], ArrayData2[flBotPos][1], ArrayData2[flBotPos][2], ArrayData2[flBotVel][0], ArrayData2[flBotVel][1], ArrayData2[flBotVel][2], ArrayData2[iButton]);
fputs(hFile, szData);
}
fclose(hFile);

set_task(2.0, "bot_overwriting")
}

public bot_restart()
{
if (g_fileRead)
{
if(!g_bot_id)
g_bot_id = Create_Bot(); // Создает бота с id
else
Start_Bot();
}
}

public fwd_Think( Ent )
{
if ( !pev_valid( Ent ) )
return(FMRES_IGNORED);

static className[32];
pev( Ent, pev_classname, className, 31 );

if ( equal( className, "bot_record" ) )
{
BotThink( g_bot_id );
set_pev( Ent, pev_nextthink, get_gametime() + nExttHink );
}

return(FMRES_IGNORED);
}

public BotThink( id )
{
static Float:last_check, Float:game_time, nFrame;
game_time = get_gametime();

if( game_time - last_check > 1.0 )
{
if (nFrame < 100)
nExttHink = nExttHink - 0.0001
else if (nFrame > 100)
nExttHink = nExttHink + 0.0001

nFrame = 0;
last_check = game_time;
}

if(g_bot_enable == 1 && g_bot_id)
{
g_bot_frame++;
if ( g_bot_frame < ArraySize( g_DemoPlaybot[0] ) )
{
new ArrayData[DemoData], Float:ViewAngles[3];
ArrayGetArray(g_DemoPlaybot[0], g_bot_frame, ArrayData);

ViewAngles[0] = ArrayData[flBotAngle][0];
ViewAngles[1] = ArrayData[flBotAngle][1];
ViewAngles[2] = 0.0;

if(ArrayData[iButton]&IN_ALT1) ArrayData[iButton]|=IN_JUMP;
if(ArrayData[iButton]&IN_RUN) ArrayData[iButton]|=IN_DUCK;

if(ArrayData[iButton]&IN_RIGHT)
{
engclient_cmd(id, "weapon_usp");
ArrayData[iButton]&=~IN_RIGHT;
}
if(ArrayData[iButton]&IN_LEFT)
{
engclient_cmd(id, "weapon_knife");
ArrayData[iButton]&=~IN_LEFT;
}
//if ( ArrayData[iButton] & IN_USE )
//{
// Ham_ButtonUse( id );
// ArrayData[iButton] &= ~IN_USE;
//}
engfunc(EngFunc_RunPlayerMove, id, ViewAngles, ArrayData[flBotVel][0], ArrayData[flBotVel][1], 0.0, ArrayData[iButton], 0, 10);
set_pev(id, pev_v_angle, ViewAngles );
ViewAngles[0] /= -3.0;
set_pev(id, pev_velocity, ArrayData[flBotVel]);
set_pev(id, pev_angles, ViewAngles);
set_pev(id, pev_origin, ArrayData[flBotPos]);
set_pev(id, pev_button, ArrayData[iButton] );
set_pev(id, pev_health, 999.0);

if( pev( id, pev_gaitsequence ) == 4 && ~pev( id, pev_flags ) & FL_ONGROUND )
set_pev( id, pev_gaitsequence, 6 );

if(nFrame == ArraySize( g_DemoPlaybot[0] ) - 1)
Start_Bot();

} else {
g_bot_frame = 0;
}
}
nFrame++;
}

public Ham_PlayerPreThink(id)
{
if(is_user_alive(id))
{
if(timer_started[id] && gochecknumbers[id] == 0)
{
if(!IsPaused[id])
{
new ArrayData[DemoData];
pev(id, pev_origin, ArrayData[flBotPos]);
new Float:angle[3];
pev(id, pev_v_angle, angle)
pev(id, pev_velocity, ArrayData[flBotVel]);
ArrayData[flBotAngle][0] = _:angle[0];
ArrayData[flBotAngle][1] = _:angle[1];
ArrayData[iButton] = get_user_button(id)
ArrayPushArray(g_DemoReplay[id], ArrayData);
}
}
}
}

public ClCmd_ReplayMenu(id)
{
if (!(get_user_flags( id ) & KZ_LEVEL_1 ))
return PLUGIN_HANDLED

ReadBestRunFile();
new title[512], szTimer[14];
StringTimer(g_ReplayBestRunTime, szTimer, sizeof(szTimer) - 1);

formatex(title, 500, "\wAdmin Setting Bot Replay Menu^nRecord: \y%s", szTimer)

new menu = menu_create(title, "ReplayMenu_Handler")

menu_additem(menu, "Start/Reset^n", "1");
if (g_bot_enable == 1)
menu_additem(menu, "Pause^n", "2");
else
menu_additem(menu, "Play^n", "2");
menu_additem(menu, "Kick bot", "3");

menu_display(id, menu, 0);

return PLUGIN_HANDLED;
}

public ReplayMenu_Handler(id, menu, item)
{
if(item == MENU_EXIT)
{
return PLUGIN_HANDLED;
}

switch(item)
{
case 0:
{
if(!g_bot_id)
g_bot_id = Create_Bot();
else
Start_Bot();
}
case 1:
{
if (g_bot_enable == 1)
{
Pause(g_bot_id)
g_bot_enable = 2;
}
else
{
Pause(g_bot_id)
g_bot_enable = 1;
}
}
case 2: Remove_Bot();
}
ClCmd_ReplayMenu(id);
return PLUGIN_HANDLED;
}

public bot_overwriting()
{
ArrayClear(g_DemoPlaybot[0]);
ReadBestRunFile();

new txt[64]
StringTimer(g_ReplayBestRunTime, g_bBestTimer, sizeof(g_bBestTimer) - 1);
formatex(txt, charsmax(txt), "[REC] %s %s", g_ReplayName, g_bBestTimer);
set_user_info(g_bot_id, "name", txt)
}

Create_Bot()
{
new txt[64]
StringTimer(g_ReplayBestRunTime, g_bBestTimer, sizeof(g_bBestTimer) - 1);
formatex(txt, charsmax(txt), "[REC] %s %s", g_ReplayName, g_bBestTimer);
new id = engfunc(EngFunc_CreateFakeClient, txt);
if(pev_valid(id))
{
set_user_info(id, "rate", "10000");
set_user_info(id, "cl_updaterate", "60");
set_user_info(id, "cl_cmdrate", "60");
set_user_info(id, "cl_lw", "1");
set_user_info(id, "cl_lc", "1");
set_user_info(id, "cl_dlmax", "128");
set_user_info(id, "cl_righthand", "1");
set_user_info(id, "_vgui_menus", "0");
set_user_info(id, "_ah", "0");
set_user_info(id, "dm", "0");
set_user_info(id, "tracker", "0");
set_user_info(id, "friends", "0");
set_user_info(id, "*bot", "1");

set_pev(id, pev_flags, pev(id, pev_flags) | FL_FAKECLIENT);
set_pev(id, pev_colormap, id);

dllfunc(DLLFunc_ClientConnect, id, "BOT DEMO", "127.0.0.1");
dllfunc(DLLFunc_ClientPutInServer, id);

cs_set_user_team(id, CS_TEAM_CT);
cs_set_user_model(id, "sas");

if(!is_user_alive(id))
dllfunc(DLLFunc_Spawn, id);

set_pev(id, pev_takedamage, DAMAGE_NO);

g_bot_enable = 1;
return id;
}
return 0;
}

Remove_Bot()
{
server_cmd("kick #%d", get_user_userid(g_bot_id))
//destroy_bot_icon(g_bot_id)
g_bot_id = 0;
g_bot_enable = 0;
g_bot_frame = 0;
ArrayClear(g_DemoPlaybot[0]);
}

Start_Bot()
{
g_bot_frame = 0;
start_climb(g_bot_id)
}

public create_bot_icon(id)
{
g_Bot_Icon_ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))

set_pev(g_Bot_Icon_ent, pev_solid, SOLID_NOT)
set_pev(g_Bot_Icon_ent, pev_movetype, MOVETYPE_FLYMISSILE)
set_pev(g_Bot_Icon_ent, pev_iuser2, id)
set_pev(g_Bot_Icon_ent, pev_scale, 0.5)
engfunc(EngFunc_SetModel, g_Bot_Icon_ent, "sprites/kzru/kzrubot.spr")
}

public destroy_bot_icon(id)
{
if(g_Bot_Icon_ent)
engfunc(EngFunc_RemoveEntity, g_Bot_Icon_ent)

g_Bot_Icon_ent = 0
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ScoreBoard ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public MessageScoreAttrib( iMsgID, iDest, iReceiver )
{
new iPlayer = get_msg_arg_int( 1 )
if( is_user_alive( iPlayer ) && ( get_user_flags( iPlayer ) & KZ_LEVEL_1 ) )
{
set_msg_arg_int( 2, ARG_BYTE, SCOREATTRIB_VIP );
}
}

public MessageServerName( )
{
set_msg_arg_string( 1, g_szTitle );
}


public update_score(id)
{
if(is_user_connected(id))
{
set_user_frags(id, kz_point[id])
cs_set_user_deaths(id, kz_hash[id])
}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FPS CHECK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public get_fps( id )
{
if( id > 32 ) return -1;
if( !id ) return g_iServerFps;

return g_iPlayerFps[id];
}

public cmdFps(id)
{
static Players[32], PlayersNum, Name[32];
static HudBuffer[1024], TempBuffer[64];

set_hudmessage( 0, 255, 100, 0.02, 0.20, 0, 1.0, 8.0, 1.0, 1.0, 3 );

format( TempBuffer, sizeof( TempBuffer ) - 1, "Server FPS: %d^n^n", get_fps( 0 ) );
add( HudBuffer, sizeof( HudBuffer ) - 1, TempBuffer );

get_players( Players, PlayersNum );

for( new i = 0; i < PlayersNum; i++ )
{
get_user_info( Players[i], "name", Name, sizeof( Name ) - 1 );

format( TempBuffer, sizeof( TempBuffer ) - 1, "%s (%d fps)^n", Name, get_fps( Players[i] ) );
add( HudBuffer, sizeof( HudBuffer ) - 1, TempBuffer );
}

show_hudmessage( id, HudBuffer );

format( TempBuffer, sizeof( TempBuffer ) - 1, "" );
format( HudBuffer, sizeof( HudBuffer ) - 1, "" );

return PLUGIN_CONTINUE;
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MEASURE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public cmdMeasure( plr )
{
pev( plr, pev_origin, g_vFirstLoc[plr] );
g_vFirstLoc[plr][2] -= is_user_ducking( plr ) ? 18 : 36;
g_vSecondLoc[plr] = g_vFirstLoc[plr];

if( g_bShowBeams[plr] && !task_exists( plr + TASK_BEAM ) )
set_task( 0.1, "tskBeam", plr + TASK_BEAM, _, _, "ab" );

menuDisplay( plr );
}


public menuDisplay( plr )
{
static menu[2048];

new len = format( menu, 2047, "\wMeasure Menu^n^n" );

if( g_bReturnFloat[plr] )
{
len += format( menu[len], 2047 - len, "\d[\r1\d]\w \wSet Loc #1 \d< %.03f | %.03f | %.03f >^n", g_vFirstLoc[plr][0], g_vFirstLoc[plr][1], g_vFirstLoc[plr][2] );
len += format( menu[len], 2047 - len, "\d[\r2\d]\w \wSet Loc #2 \d< %.03f | %.03f | %.03f >^n^n", g_vSecondLoc[plr][0], g_vSecondLoc[plr][1], g_vSecondLoc[plr][2] );
len += format( menu[len], 2047 - len, "\d[\r3\d]\w \wAutomatical setting of the other Loc: \d%s^n^n", g_bAutoSetting[plr] ? "on" : "off" );
len += format( menu[len], 2047 - len, "\d[\r4\d]\w \wDetailed results: \d%s^n", g_bDetailedResults[plr] ? "on" : "off" );
len += format( menu[len], 2047 - len, "\d[\r5\d]\w \wReturned values: \ddecimal^n^n" );
len += format( menu[len], 2047 - len, "\r \wResults:^n" );

if( g_bDetailedResults[plr] )
{
len += format( menu[len], 2047 - len, "\r \wX-Distance: \d%f^n", floatabs( g_vFirstLoc[plr][0] - g_vSecondLoc[plr][0] ) );
len += format( menu[len], 2047 - len, "\r \wY-Distance: \d%f^n", floatabs( g_vFirstLoc[plr][1] - g_vSecondLoc[plr][1] ) );
}

len += format( menu[len], 2047 - len, "\r \wHeight difference: \d%f^n", floatabs( g_vFirstLoc[plr][2] - g_vSecondLoc[plr][2] ) );
len += format( menu[len], 2047 - len, "\r \wReal distance: \d%f^n^n", get_distance_f( g_vFirstLoc[plr], g_vSecondLoc[plr] ) );
}
else
{
len += format( menu[len], 2047 - len, "\d[\r1\d]\w \wSet Loc #1 \d< %i | %i | %i >^n", floatround( g_vFirstLoc[plr][0], floatround_round ), floatround( g_vFirstLoc[plr][1], floatround_round ), floatround( g_vFirstLoc[plr][2], floatround_round ) );
len += format( menu[len], 2047 - len, "\d[\r2\d]\w \wSet Loc #2 \d< %i | %i | %i >^n^n", floatround( g_vSecondLoc[plr][0], floatround_round ), floatround( g_vSecondLoc[plr][1], floatround_round ), floatround( g_vSecondLoc[plr][2], floatround_round ) );
len += format( menu[len], 2047 - len, "\d[\r3\d]\w \wAutomatical setting of the other Loc: \d%s^n^n", g_bAutoSetting[plr] ? "on" : "off" );
len += format( menu[len], 2047 - len, "\d[\r4\d]\w \wDetailed results: \d%s^n", g_bDetailedResults[plr] ? "on" : "off" );
len += format( menu[len], 2047 - len, "\d[\r5\d]\w \wReturned values: \drounded^n^n" );
len += format( menu[len], 2047 - len, "\r \wResults:^n" );

if( g_bDetailedResults[plr] )
{
len += format( menu[len], 2047 - len, "\r \wX-Distance: \d%i^n", floatround( floatabs( g_vFirstLoc[plr][0] - g_vSecondLoc[plr][0] ), floatround_round ) );
len += format( menu[len], 2047 - len, "\r \wY-Distance: \d%i^n", floatround( floatabs( g_vFirstLoc[plr][1] - g_vSecondLoc[plr][1] ), floatround_round ) );
}

len += format( menu[len], 2047 - len, "\r \wHeight difference: \d%i^n", floatround( floatabs( g_vFirstLoc[plr][2] - g_vSecondLoc[plr][2] ), floatround_round ) );
len += format( menu[len], 2047 - len, "\r \wReal distance: \d%i^n^n", floatround( get_distance_f( g_vFirstLoc[plr], g_vSecondLoc[plr] ), floatround_round ) );

}

len += format( menu[len], 2047 - len, "\d[\r6\d]\w \wShow beams: \d%s^n^n", g_bShowBeams[plr] ? "on" : "off" );
len += format( menu[len], 2047 - len, "\d[\r0\d]\w \wExit" );

show_menu( plr, ( 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<9 ), menu, -1 );
}

public menuAction( plr, key )
{
switch( key )
{
case 0:
{
fm_get_aim_origin( plr, g_vFirstLoc[plr] );

if( g_bAutoSetting[plr] )
{
get_tr2( 0, TR_vecPlaneNormal, g_vSecondLoc[plr] );

kz_vecotr_mul_scalar( g_vSecondLoc[plr], 9999.0, g_vSecondLoc[plr] );
kz_vector_add( g_vFirstLoc[plr], g_vSecondLoc[plr], g_vSecondLoc[plr] );

fm_trace_line( plr, g_vFirstLoc[plr], g_vSecondLoc[plr], g_vSecondLoc[plr] );
}

menuDisplay( plr );
}
case 1:
{
fm_get_aim_origin( plr, g_vSecondLoc[plr] );

if( g_bAutoSetting[plr] )
{
get_tr2( 0, TR_vecPlaneNormal, g_vFirstLoc[plr] );

kz_vecotr_mul_scalar( g_vFirstLoc[plr], 9999.0, g_vFirstLoc[plr] );
kz_vector_add( g_vFirstLoc[plr], g_vSecondLoc[plr], g_vFirstLoc[plr] );

fm_trace_line( plr, g_vSecondLoc[plr], g_vFirstLoc[plr], g_vFirstLoc[plr] );
}

menuDisplay( plr );
}
case 2:
{
g_bAutoSetting[plr] = !g_bAutoSetting[plr];
menuDisplay( plr );
}
case 3:
{
g_bDetailedResults[plr] = !g_bDetailedResults[plr];
menuDisplay( plr );
}
case 4:
{
g_bReturnFloat[plr] = !g_bReturnFloat[plr];
menuDisplay( plr );
}
case 5:
{
g_bShowBeams[plr] = !g_bShowBeams[plr];

if( !g_bShowBeams[plr] && task_exists( plr + TASK_BEAM ) )
{
remove_task( plr + TASK_BEAM );
}
else
{
set_task( 0.1, "tskBeam", plr + TASK_BEAM, _, _, "ab" );
}

menuDisplay( plr );
}
case 9:
{
remove_task( plr + TASK_BEAM );
show_menu( plr, 0, "" );
}
}
}

public tskBeam( plr )
{
plr -= TASK_BEAM;

draw_beam( plr, g_vFirstLoc[plr], g_vSecondLoc[plr], DIST_R, DIST_G, DIST_B );

if( floatabs( g_vFirstLoc[plr][2] - g_vSecondLoc[plr][2] ) >= 2 )
{
static Float:temp[3];
temp[0] = g_vSecondLoc[plr][0];
temp[1] = g_vSecondLoc[plr][1];
temp[2] = g_vFirstLoc[plr][2];

draw_beam( plr, g_vFirstLoc[plr], temp, DIST_R, DIST_G, DIST_B );
draw_beam( plr, temp, g_vSecondLoc[plr], DIST_R, DIST_G, DIST_B );
}
}

public draw_beam( plr, Float:aorigin[3], Float:borigin[3], r, g, b )
{

message_begin( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, { 0.0, 0.0, 0.0 }, plr );
write_byte( TE_BEAMPOINTS );
engfunc( EngFunc_WriteCoord, aorigin[0] );
engfunc( EngFunc_WriteCoord, aorigin[1] );
engfunc( EngFunc_WriteCoord, aorigin[2] );
engfunc( EngFunc_WriteCoord, borigin[0] );
engfunc( EngFunc_WriteCoord, borigin[1] );
engfunc( EngFunc_WriteCoord, borigin[2] );
write_short( g_flBeam );
write_byte( 0 );
write_byte( 0 );
write_byte( 2 );
write_byte( 20 );
write_byte( 0 );
write_byte( r );
write_byte( g );
write_byte( b );
write_byte( 150 );
write_byte( 0 );
message_end( );
}

is_user_ducking( plr )
{
if( !pev_valid( plr ) )
{
return 0;
}

new Float:abs_min[3], Float:abs_max[3];
pev( plr, pev_absmin, abs_min );
pev( plr, pev_absmax, abs_max );

abs_min[2] += 64.0;

if( abs_min[2] < abs_max[2] )
{
return 0;
}

return 1;
}

fm_get_aim_origin( plr, Float:origin[3] )
{
new Float:start[3], Float:view_ofs[3];
pev( plr, pev_origin, start );
pev( plr, pev_view_ofs, view_ofs );
kz_vector_add( start, view_ofs, start );

new Float:dest[3];
pev( plr, pev_v_angle, dest );
engfunc( EngFunc_MakeVectors, dest);
global_get( glb_v_forward, dest );
kz_vecotr_mul_scalar( dest, 9999.0, dest );
kz_vector_add( start, dest, dest );

engfunc( EngFunc_TraceLine, start, dest, 0, plr, 0 );
get_tr2( 0, TR_vecEndPos, origin );

return 1;
}

fm_trace_line( ignoreent, const Float:start[3], const Float:end[3], Float:ret[3] )
{
engfunc( EngFunc_TraceLine, start, end, ignoreent == -1 ? 1 : 0, ignoreent, 0 );

new ent = get_tr2( 0, TR_pHit );
get_tr2( 0, TR_vecEndPos, ret );

return pev_valid( ent ) ? ent : 0;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEVELOPER ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public give_savepos(id)
{
if(!access(id,ADMIN_IMMUNITY))
return PLUGIN_HANDLED;

new arg1[33], arg2[33], arg3[33], arg4[33], save_data[64], createinto[256]
new origin[3]

read_argv(1, arg1, 31)
read_argv(2, arg2, 31)
read_argv(3, arg3, 31)
read_argv(4, arg4, 31)

new target = cmd_target(id, arg1, 1)

pev(target, pev_origin, origin)
new wpn = get_user_weapon( target )
new hp = get_user_health(target)
get_time("%Y%m%d%H%M%S", save_data, sizeof save_data - 1)

formatex(createinto, sizeof createinto - 1, "REPLACE INTO `kz_savepos` (`map_id`, `authid`, `time`, `x`, `y`, `z`, `weapon`, `cp`, `tp`, `hp`, `date`) VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%s', '%s', '%s', '%d', '%s');", kz_mapID, kz_authid[id], arg2, origin[0], origin[1], origin[2], g_weaponsnames[wpn], arg3, arg4, hp, save_data)
SQL_ThreadQuery(g_SqlTuple, "SQL_WorkHandle", createinto)

return PLUGIN_HANDLED;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Orpheu AXN ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/*public OR_PMMove(OrpheuStruct:pmove, server)
{
if(mapIsAXN)
{
g_ppmove = pmove;
}
}

public OR_PMJump()
{
if(mapIsAXN)
{
g_flOldMaxSpeed = Float:OrpheuGetStructMember(g_ppmove, "maxspeed");
OrpheuSetStructMember(g_ppmove, "maxspeed", 0.0);
}
}

public OR_PMJump_P()
{
if(mapIsAXN)
{
OrpheuSetStructMember(g_ppmove, "fuser2", 0.0);
OrpheuSetStructMember(g_ppmove, "maxspeed", g_flOldMaxSpeed);
}
}*/
в modules.ini включил, geoip все равно ошибка
 

Вложения

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
Это не проблема с компиляцией.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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