> > > > >

Не работает плагин mode 2x2 2.5re

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
4
Рейтинг
-3
#1
Ошибка
в логах пусто
C++
ОС
Linux
Amx Mod X
1.9.0
C++
Билд
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.4.0.668-dev+myarena.ru
Build date: 14:05:09 Jan 23 2019 (1747)
Build from: https://github.com/dreamstalker/rehlds/commit/89be216
C++
ReGamedll
ReGameDLL version: 5.7.0.310-dev
Build date: 05:50:50 May 24 2018
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/8e3b6f4
C++
Версия Metamod
Metamod-r v1.3.0.128, API (5:13)
Metamod-r build: 17:47:54 Aug 24 2018
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/0cf2f70
C++
Список метамодулей
Currently loaded plugins:
description stat pend file vers src load unload
[ 1] VoiceTranscoder RUN - VoiceTranscoder.so v2017RC3 ini ANY ANY
[ 2] Reunion RUN - reunion_mm_i386.so v0.1.75 ini Start Never
[ 3] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5235 ini Start ANY
[ 4] ReAuthCheck RUN - reauthcheck_mm_i386.so v0.1.5 ini Start Never
[ 5] Rechecker RUN - rechecker_mm_i386.so v2.5 ini Chlvl ANY
[ 6] ReSemiclip RUN - resemiclip_mm_i386.so v2.3.9 ini Chlvl ANY
[ 7] WHBlocker RUN - whblocker_mm_i386.so v1.5.695 ini Chlvl ANY
[ 8] MySQL RUN - mysql_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[ 9] CSX RUN - csx_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[10] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.1.1 pl3 ANY Never
[11] Fun RUN - fun_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[12] FakeMeta RUN - fakemeta_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[13] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[14] Engine RUN - engine_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
[15] ReAPI RUN - reapi_amxx_i386.so v5.8.0.163-dev pl3 ANY Never
[16] CStrike RUN - cstrike_amxx_i386.so v1.9.0.5235 pl3 ANY ANY
16 plugins, 16 running
C++
Список плагинов
Currently loaded plugins:
name version author file status
[ 1] AMXBans: Core MA 1.6.9 Larte Team amxbans_core.am running
[ 2] FreshBan 1.0.98b kanagava fresh_bans.amxx running
[ 3] fb_forwards 0.1.4 Kanagava & Realu fb_forwards.amx running
[ 4] ReChecker Logging freesrv AMXX rc_logging.amxx running
[ 5] RC BaseChanger freesrv AMXX rc_basechanger. running
[ 6] Rock to Ban 1.02 Safety1st rock2ban.amxx running
[ 7] Mode 2x2 2.5re s1lent mode.amxx running
[ 8] block ip 0.2 legenda amx_blockip.amx running
[ 9] Voice Flood Blocker 1.0.1 d3m37r4 voice_flood_blo running
[ 10] Ban Sound: Fresh Bans 1.0 Leo_[BH] fb_ban_sound.am running
[ 11] Advanced Gag 1.9.0 neygomon amx_gag1.amxx running
[ 12] DayNight Mode Switcher 1.0.6 the_hunter daynight_switch running
[ 13] Auto-Give Privileges 1.0 SerGrib night_vip.amxx stopped
[ 14] [182] Army Ranks Ultim 18.05.15 SKAJIbnEJIb army_ranks_ulti running
[ 15] Admin Commands 1.9.0.5235 AMXX Dev Team admincmd.amxx running
[ 16] Slots Reservation 1.9.0.5235 AMXX Dev Team adminslots.amxx running
[ 17] Multi-Lingual System 1.9.0.5235 AMXX Dev Team multilingual.am running
[ 18] Menus Front-End 1.9.0.5235 AMXX Dev Team menufront.amxx running
[ 19] Commands Menu 1.9.0.5235 AMXX Dev Team cmdmenu.amxx running
[ 20] Players Menu 1.9.0.5235 AMXX Dev Team plmenu.amxx running
[ 21] Maps Menu 1.9.0.5235 AMXX Dev Team mapsmenu.amxx running
[ 22] Plugin Menu 1.9.0.5235 AMXX Dev Team pluginmenu.amxx running
[ 23] Admin Chat 1.9.0.5235 AMXX Dev Team adminchat.amxx running
[ 24] Info. Messages 1.9.0.5235 AMXX Dev Team imessage.amxx running
[ 25] Admin Votes 1.9.0.5235 AMXX Dev Team adminvote.amxx running
[ 26] TimeLeft 1.9.0.5235 AMXX Dev Team timeleft.amxx running
[ 27] Pause Plugins 1.9.0.5235 AMXX Dev Team pausecfg.amxx running
[ 28] Restrict Weapons 1.9.0.5235 AMXX Dev Team restmenu.amxx running
[ 29] Custom Models 1.3.2 neugomon custom_models.a running
[ 30] Menu 1.0 WaT_1 menu.amxx running
[ 31] Reklama 06.04.18 mx?! reklama.amxx running
[ 32] Spam & Mat Control 0.4 Freedo.m sm_control.amxx running
[ 33] Steam Bonus 1.3e Gudaus steam_bonus.amx running
[ 34] Team Balancer 1.8b3 Ptahhotep ptb_rus.amxx running
[ 35] Quake Sounds 4.0 Hattrick QuakeSounds.amx running
[ 36] V.I.P Custom Weapons 1.0.0 Vaqtincha vip_custom.amxx running
[ 37] V.I.P Custom M4A1 1.0.0 Vaqtincha custom_m4a1.amx running
[ 38] V.I.P Custom KNIFE 1.0.0 Vaqtincha custom_knife.am running
[ 39] V.I.P Custom DEAGLE 1.0.0 Vaqtincha custom_deagle.a running
[ 40] V.I.P Custom AWP 1.0.0 Vaqtincha custom_awp.amxx running
[ 41] V.I.P Custom AK-47 1.0.0 Vaqtincha custom_ak47.amx running
[ 42] Block Pickup Gold 0.1 Vaqtincha BlockPickupGold running
[ 43] c4 timer 1.1 cheap_suit c4timer.amxx running
[ 44] Game Namer 1.1 NeuroToxin gamenamechanger running
[ 45] Players Menu 1.7 neugomon players_menu.am running
[ 46] [ReAPI] Block 'Fire in 0.0.1 sergrib reapi_block_FIT running
[ 47] mute 1.0 Aziz mute.amxx running
[ 48] Ping Checker 26.0.1 RC1 h1k3 ping_checker.am running
[ 49] AFK Control 1.4.1 [Rnd neygomon afk_control.amx running
[ 50] Nade Health 1.2 medusa NadeHealth.amxx running
[ 51] Auto recording demo 2.0 IzI | Bonaqua (R amx_autodemorec running
[ 52] Multiplication Kill Mo 0.0.2 Vaqtincha multiplication_ running
[ 53] KnifeRound 1.1 pUzzlik knife_round.amx running
[ 54] [ReAMX] No Team Flash 17.10.30 SKAJIbnEJIb NoTeamFlash.amx running
[ 55] Stats Configuration 18.05.15 SKAJIbnEJIb & AM statscfg_rbs.am running
[ 56] [ReAMX] StatsX RBS 18.03.24 SKAJIbnEJIb & AM statsx_rbs.amxx running
[ 57] [ReAMX] Top Award RBS 17.10.30 SKAJIbnEJIb topaward_rbs.am running
[ 58] Lite Admin ESP 1.0 neygomon admin_esp.amxx running
[ 59] Lite Parachute 1.1 AcE, Leo_[BH] lite_parachute. running
[ 60] Check Admin & Vip 2.0 Leo_[BH] check_admin_vip running
[ 61] Reset Score 1.0 SKAJIbnEJIb resetscore_rbs. running
[ 62] unknown unknown unknown test_parachute. running
[ 63] Lite Translit 2.8 neygomon lite_translit.a running
[ 64] AMXBans: Screens Gm 1.6 Larte Team amxbans_ssban.a running
[ 65] Map Manager: Core 3.0.2 Mistrick map_manager_cor running
[ 66] Map Manager: Scheduler 0.1.1 Mistrick map_manager_sch running
[ 67] Map Manager: Rtv 0.0.4 Mistrick map_manager_rtv running
[ 68] Map Manager: Nominatio 0.1.0 Mistrick map_manager_nom running
[ 69] Map Manager: BlockList 0.0.3 Mistrick map_manager_blo running
[ 70] Map Manager: Online so 0.0.2 Mistrick map_manager_onl running
[ 71] Map Manager: Effects 0.0.8 Mistrick map_manager_eff running
[ 72] Map Manager: Informer 0.0.5 Mistrick map_manager_inf running
72 plugins, 71 running
Список модулей
Currently loaded modules:
name version author status
[ 1] MySQL 1.9.0.5235 AMX Mod X Dev Team running
[ 2] CSX 1.9.0.5235 AMX Mod X Dev Team running
[ 3] ReAimDetector 0.1.1 ReHLDS Team running
[ 4] Fun 1.9.0.5235 AMX Mod X Dev Team running
[ 5] FakeMeta 1.9.0.5235 AMX Mod X Dev Team running
[ 6] nVault 1.9.0.5235 AMX Mod X Dev Team running
[ 7] Ham Sandwich 1.9.0.5235 AMX Mod X Dev Team running
[ 8] Engine 1.9.0.5235 AMX Mod X Dev Team running
[ 9] ReAPI 5.8.0.163- Asmodai & s1lent running
[10] CStrike 1.9.0.5235 AMX Mod X Dev Team running
[11] Sockets2 1.8.1.3746 HLSW Dev Team running
[12] RegEx 1.9.0.5235 AMX Mod X Dev Team running
12 modules, 12 correct
C++
Автор плагина
s1lent
Версия плагина
2.5re
Исходник
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <engine>
#include <reapi>

#define PLUGIN_VERSION "2.5re"

#if (AMXX_VERSION_NUM < 183) || defined NO_NATIVE_COLORCHAT
#include <colorchat>
#include <dhudmessage>
#else
#define DontChange print_team_default
#define client_disconnect client_disconnected
#endif

#pragma ctrlchar '\'
#pragma semicolon 1

#define ID_KEY_WALL 54345678

//x //y
#define MESSAGE_MAP_STATUS -1.0, 0.8 // Позиция сообщении о Закрытии/Открытии карты.


//r //green //blue
#define COLOR_MAP_CLOSE 255, 0, 0 // Цвет сообщения, когда низкий онлайн и карта закрывается. Тип цвета RGB, http://www.colorschemer.com/online.html
#define COLOR_MAP_OPEN 0, 255, 0 // Цвет сообщения, когда онлайн выше требуемого и карта открывается. Тип цвета RGB, http://www.colorschemer.com/online.html

#define MODE_TIME_START 10.0 // Через сколько начать голосование, после нужного количества голосов.
#define MODE_COUNT_START 5 // Отчет до начала голосования
#define VOTE_TIMEWAIT 3 // Через сколько минут после голосования /mode, будет снова доступно.
#define VOTE_RATIO 0.5 // Погрешность для количество голосов, Пример: (Ratio: 0.5, требуется 0.5 * 32 = 16 голосов из 32 игроков)

#define STRONG_PUSH 15.0 // Сила толчка weaponbox (оружия, C4) от стенки
#define MAX_CLIENTS 32

#define PREFIX "\1[\4Mode\1]"
#define CLASSNAME_WALL "test_effect" // unused classname in the game
#define SPRITE_WALL "sprites/mode/next21_wall2.spr"

#define Vector(%0,%1,%2) (Float:{%0,%1,%2})
#define VectorCompare(%0,%1) (%0[x] == %1[x] && %0[y] == %1[y] && %0[z] == %1[z])
#define VectorDT(%0,%1,%2,%3) (!(%0[x] > %3[x] || %1[x] < %2[x]) && !(%0[y] > %3[y] || %1[y] < %2[y]) && !(%0[z] > %3[z] || %1[z] < %2[z]))

enum (+= 256222)
{
TASK_MODE_VOTE = 256222,
TASK_MODE_START,
TASK_MODE_INIT,
TASK_MODE_NOTIFY,
TASK_MODE_AUTO_MAPCLOSE
};

enum _:coord_s
{
Float:x,
Float:y,
Float:z
};

enum status_s
{
map_open,
map_close,
};

enum _:blocked_s
{
block_none = 0,
block_vote,
block_start_vote,
block_success_vote,
block_roundnew,
block_commencing,
block_admin_change,
block_permament
};

enum _:vote_s
{
vote_no,
vote_yes
};

enum _:server_info_s
{
status_s:m_iStatus,
status_s:m_iStatusLast,
blocked_s:m_iBlocked,
m_szFile[64],
m_iAll,
m_iMaxpl,
m_iCount,
m_LoadBox,
bool:m_bAdvanced,
bool:m_bInitialized,
m_iClosedIndex,
m_iOnline_High,
m_iOnline_Low,
m_szMap[32],
m_iVoting[vote_s],
m_iVote[MAX_CLIENTS + 1],
Float:m_fNext,
Float:m_fWait[MAX_CLIENTS + 1],
};

new g_pServerVar[server_info_s];

enum _:box_data_s
{
m_iBox,
m_iCopy,
m_iType,
m_iEntid,
m_iSetting,
m_iSolid,
m_iSprite,
m_iBeamSprite,

Float:m_fScale
};

new g_pBoxVar[box_data_s];

enum box_vector_s
{
m_fOrigin,
m_fAngles,
m_fMins,
m_fMaxs
};

new Float:g_pBoxVector[box_vector_s][coord_s];
new HamHook:g_pForwardThink;

// CVars
new pcvar_mode_admin_only,
pcvar_mode_allow_vote,
pcvar_mode_allow_change,
pcvar_mode_force_check_online,
pcvar_mode_block_startgame,
pcvar_mode_push_weaponbox,
pcvar_mode_message_on_touch,
pcvar_mode_touch_wait,
pcvar_mode_changemapname;

public plugin_precache()
{
precache_model(SPRITE_WALL);
g_pBoxVar[m_iBeamSprite] = precache_model("sprites/smoke.spr");
get_mapname(g_pServerVar[m_szMap], charsmax(g_pServerVar[m_szMap]));
}

public plugin_init()
{
register_plugin("Mode 2x2", PLUGIN_VERSION, "s1lent");
register_cvar("mode2x2_version", PLUGIN_VERSION, FCVAR_SERVER | FCVAR_SPONLY);

register_menucmd(register_menuid("Main Edit Menu"), 0x3FF, "MainEdit_Handler");
register_menucmd(register_menuid("Settings Menu"), 0x23F, "Settings_Handler");
register_menucmd(register_menuid("Properties Menu"), 0x3FF, "Properties_Handler");

DisableHamForward((g_pForwardThink = RegisterHam(Ham_Think, CLASSNAME_WALL, "CTestEffect__ThinkWall")));

pcvar_mode_admin_only = register_cvar("mode_admin_only", "0"); // Запрещает второму админу использовать команду "/change", если первый админ его уже использовал для открытия карты и если админ который активировал "/change" - активный и находится в команде.
pcvar_mode_allow_vote = register_cvar("mode_allow_vote", "1"); // Разрешить использовать команду "/mode"
pcvar_mode_allow_change = register_cvar("mode_allow_change", "1"); // Разрешить использовать команду "/change"
pcvar_mode_force_check_online = register_cvar("mode_force_check_online", "1"); // Заставлять проверять онлайн даже при /change, если нет действующих админов в игре, кроме админов в спектаторе, при mode_admin_only, проверяет только одного активного админа.
pcvar_mode_block_startgame = register_cvar("mode_block_startgame", "0"); // Никогда не ставить стенки при "GameCommencing" или "Restart"
pcvar_mode_push_weaponbox = register_cvar("mode_push_weaponbox", "1"); // Толкать weaponbox (оружия, C4) от стенки

pcvar_mode_message_on_touch = register_cvar("mode_messagetouch", "0"); // Сообщать игроку при касании стены о том, что проход закрыт.
pcvar_mode_touch_wait = register_cvar("mode_messagetouch_time", "5.5"); // Задержка для повторного сообщения при касании стенки игроком.
pcvar_mode_changemapname = register_cvar("mode_changemapname", "1");

Load_Config();

register_clcmd("say /mode", "CMD_Mode", 0, "<Голосование за открытие/закрытие карты>");
register_clcmd("say /change", "CMD_ModeChange", ADMIN_VOTE, "<Смена режима Mode 2x2, Открыть/Закрыть карту>");

register_clcmd("say /box", "CMD_MenuBox", ADMIN_RCON, "<Управление объектами, Создание/Изменение/Удаление>");
register_dictionary("mode.txt");

// initialized vars
g_pServerVar[m_iMaxpl] = get_maxplayers();
g_pServerVar[m_fNext] = _:(get_gametime() + (VOTE_TIMEWAIT * 60.0));
}

public Task_Initialized()
{
g_pServerVar[m_bInitialized] = true;
UTIL__ChangeNameOfMap(g_pServerVar[m_iStatus]);
}

public Task_AutoMapClose()
{
new nActivePlayers = UTIL__GetActivePlayers();
if (nActivePlayers <= 0)
{
DrawBox(g_pServerVar[m_iStatus] = map_close, false);
}
}

// ready config file
stock Load_Config()
{
new szCfgDir[128];
get_configsdir(szCfgDir, charsmax(szCfgDir));
get_localinfo("amxx_configsdir", g_pServerVar[m_szFile], charsmax(g_pServerVar[m_szFile]));

add(g_pServerVar[m_szFile], charsmax(g_pServerVar[m_szFile]), "/mode/");
add(szCfgDir, charsmax(szCfgDir), "/mode.cfg");
mkdir(g_pServerVar[m_szFile]);

server_cmd("exec %s", szCfgDir);
server_exec();

formatex(g_pServerVar[m_szFile], charsmax(g_pServerVar[m_szFile]), "%s%s.ini", g_pServerVar[m_szFile], g_pServerVar[m_szMap]);

if (file_exists(g_pServerVar[m_szFile]))
{
if (!(g_pServerVar[m_LoadBox] = LoadBox()))
return;

DrawBox(g_pServerVar[m_iStatus] = map_open);

if (get_pcvar_num(pcvar_mode_message_on_touch))
{
RegisterHam(Ham_Touch, "player", "CBasePlayer__Touch");
}

if (get_pcvar_num(pcvar_mode_push_weaponbox))
{
RegisterHam(Ham_Touch, "weaponbox", "CWeaponBox__Touch");
}

register_event("HLTV", "EventRoundNew", "a", "1=0", "2=0");
register_menucmd(register_menuid("Mode Menu"), MENU_KEY_1 | MENU_KEY_2, "Mode_Handler");
register_event("TextMsg", "EventStartGame", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");

// when all the configs with 3-rd party plugins already loaded
if (get_pcvar_num(pcvar_mode_changemapname))
{
set_task(3.0, "Task_Initialized", TASK_MODE_INIT);
}

// To check if the game is in idle state, no active players.
// So close the map over time.
set_task(15.0, "Task_AutoMapClose", TASK_MODE_AUTO_MAPCLOSE);
}
}

public plugin_end()
{
// reset mapname
UTIL__ChangeNameOfMap(map_open);

remove_task(TASK_MODE_VOTE);
remove_task(TASK_MODE_START);
remove_task(TASK_MODE_INIT);
remove_task(TASK_MODE_NOTIFY);
remove_task(TASK_MODE_AUTO_MAPCLOSE);
}

public plugin_pause()
{
// hide wall
if (g_pServerVar[m_iStatus] == map_close)
DrawBox(g_pServerVar[m_iStatus] = map_open, false);

// reset mapname
UTIL__ChangeNameOfMap(map_open);

remove_task(TASK_MODE_VOTE);
remove_task(TASK_MODE_START);
remove_task(TASK_MODE_INIT);
remove_task(TASK_MODE_NOTIFY);
remove_task(TASK_MODE_AUTO_MAPCLOSE);
}

public client_disconnect(id)
{
if (!g_pServerVar[m_LoadBox])
return;

if (g_pServerVar[m_iClosedIndex] == id)
g_pServerVar[m_iClosedIndex] = 0;

if (g_pServerVar[m_iVote][id])
{
--g_pServerVar[m_iAll];
g_pServerVar[m_iVote][id] = 0;
}
}

public EventStartGame()
{
if (!get_pcvar_num(pcvar_mode_block_startgame))
return;

g_pServerVar[m_iBlocked] = blocked_s:block_commencing;
DrawBox(g_pServerVar[m_iStatus] = map_open, false);
}

public EventRoundNew()
{
new bool:bCvarChange = get_pcvar_num(pcvar_mode_allow_change) != 0;
new bool:bCvarVote = get_pcvar_num(pcvar_mode_allow_vote) != 0;
new bool:bCvarStartGame = get_pcvar_num(pcvar_mode_block_startgame) != 0;

if (bCvarChange && get_pcvar_num(pcvar_mode_force_check_online) != 0 && g_pServerVar[m_iBlocked] > blocked_s:block_admin_change)
{
new bool:bBlocked = false;

new iPlayers[32], iNum, p;
get_players(iPlayers, iNum, "ch");

for (new a = 0; a < iNum; ++a)
{
p = iPlayers[a];

if ((get_user_flags(p) & ADMIN_VOTE) && (1 <= get_member(p, m_iTeam) <= 2))
{
// if exists admin initiator closed map, trying block is changed mode
if (get_pcvar_num(pcvar_mode_admin_only) != 0 && g_pServerVar[m_iClosedIndex] != a)
{
continue;
}

bBlocked = true;
break;
}
}

if (!bBlocked && g_pServerVar[m_iOnline_Low] >= UTIL__GetActivePlayers())
{
g_pServerVar[m_iBlocked] = blocked_s:block_none;
DrawBox(g_pServerVar[m_iStatus] = map_close);
}
}
else if (!bCvarChange && !bCvarVote && bCvarStartGame)
{
if (g_pServerVar[m_iBlocked] == blocked_s:block_commencing)
g_pServerVar[m_iBlocked] = blocked_s:block_none;
}
/*else if (bCvarChange || bCvarVote)*/
{
switch (g_pServerVar[m_iBlocked])
{
case block_success_vote:
{
DrawBox(g_pServerVar[m_iStatus]);
g_pServerVar[m_iBlocked] = blocked_s:block_roundnew;
}
case block_commencing:
{
g_pServerVar[m_iBlocked] = blocked_s:block_none;
}
case block_admin_change:
{
DrawBox(g_pServerVar[m_iStatus]);
g_pServerVar[m_iBlocked] = blocked_s:block_permament;
}
case block_none:
{
new nActivePlayers = UTIL__GetActivePlayers();

// check condition for open map
if (nActivePlayers >= g_pServerVar[m_iOnline_High])
{
if (g_pServerVar[m_iStatus] == map_close)
DrawBox(g_pServerVar[m_iStatus] = map_open);
}
// check condition for close map
else if (nActivePlayers <= g_pServerVar[m_iOnline_Low])
{
if (g_pServerVar[m_iStatus] == map_open)
DrawBox(g_pServerVar[m_iStatus] = map_close);
}
}
}
}
}

public CTestEffect__ThinkWall(const this)
{
if (g_pBoxVar[m_iEntid] != this)
return HAM_IGNORED;

new Float:mins[coord_s], Float:maxs[coord_s], Float:pos[coord_s];

entity_get_vector(this, EV_VEC_origin, pos);
entity_get_vector(this, EV_VEC_mins, mins);
entity_get_vector(this, EV_VEC_maxs, maxs);

mins[x] += pos[x];
mins[y] += pos[y];
mins[z] += pos[z];

maxs[x] += pos[x];
maxs[y] += pos[y];
maxs[z] += pos[z];

new const color[] = { 255, 0, 0 }; // red
UTIL_DrawLine(maxs[0], maxs[1], maxs[2], mins[0], mins[1], mins[2], { 0, 255, 0 }); // green

UTIL_DrawLine(maxs[0], maxs[1], maxs[2], mins[0], maxs[1], maxs[2], color);
UTIL_DrawLine(maxs[0], maxs[1], maxs[2], maxs[0], mins[1], maxs[2], color);
UTIL_DrawLine(maxs[0], maxs[1], maxs[2], maxs[0], maxs[1], mins[2], color);

UTIL_DrawLine(mins[0], mins[1], mins[2], maxs[0], mins[1], mins[2], color);
UTIL_DrawLine(mins[0], mins[1], mins[2], mins[0], maxs[1], mins[2], color);
UTIL_DrawLine(mins[0], mins[1], mins[2], mins[0], mins[1], maxs[2], color);

UTIL_DrawLine(mins[0], maxs[1], maxs[2], mins[0], maxs[1], mins[2], color);
UTIL_DrawLine(mins[0], maxs[1], mins[2], maxs[0], maxs[1], mins[2], color);
UTIL_DrawLine(maxs[0], maxs[1], mins[2], maxs[0], mins[1], mins[2], color);
UTIL_DrawLine(maxs[0], mins[1], mins[2], maxs[0], mins[1], maxs[2], color);
UTIL_DrawLine(maxs[0], mins[1], maxs[2], mins[0], mins[1], maxs[2], color);
UTIL_DrawLine(mins[0], mins[1], maxs[2], mins[0], maxs[1], maxs[2], color);

entity_set_float(this, EV_FL_nextthink, get_gametime() + 0.155);
return HAM_IGNORED;
}

stock UTIL_DrawLine(const Float:x1, const Float:y1, const Float:z1, const Float:x2, const Float:y2, const Float:z2, const color[3])
{
new vecStart[3], vecEnd[3];

vecStart[0] = floatround(x1);
vecStart[1] = floatround(y1);
vecStart[2] = floatround(z1);

vecEnd[0] = floatround(x2);
vecEnd[1] = floatround(y2);
vecEnd[2] = floatround(z2);

UTIL_DrawBeamPoints(vecStart, vecEnd, 2, color);
return 0;
}

stock UTIL_DrawBeamPoints(const vecStart[3], const vecEnd[3], lifetime, const color[3])
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMPOINTS);
write_coord(vecStart[0]);
write_coord(vecStart[1]);
write_coord(vecStart[2]);
write_coord(vecEnd[0]);
write_coord(vecEnd[1]);
write_coord(vecEnd[2]);
write_short(g_pBoxVar[m_iBeamSprite]);
write_byte(0);
write_byte(0);
write_byte(lifetime);
write_byte(10);
write_byte(0);
write_byte(color[0]); // red
write_byte(color[1]); // green
write_byte(color[2]); // blue
write_byte(255);
write_byte(0);
message_end();
}

public CWeaponBox__Touch(const this, const other)
{
if (!is_valid_ent(other) || entity_get_int(other, EV_INT_impulse) != ID_KEY_WALL)
return HAM_IGNORED;

new Float:flAngles[3], Float:flVelocity[3];

entity_get_vector(other, EV_VEC_angles, flAngles);
angle_vector(flAngles, ANGLEVECTOR_FORWARD, flVelocity);

flVelocity[x] = -flVelocity[x] * STRONG_PUSH;
flVelocity[y] = -flVelocity[y] * STRONG_PUSH;
flVelocity[z] = -flVelocity[z] * STRONG_PUSH;

entity_set_vector(this, EV_VEC_velocity, flVelocity);
return HAM_IGNORED;
}

public CBasePlayer__Touch(const this, const other)
{
if (!is_valid_ent(other) || entity_get_int(other, EV_INT_impulse) != ID_KEY_WALL)
{
return HAM_IGNORED;
}

new Float:flCurrentTime = get_gametime();

if (flCurrentTime > g_pServerVar[m_fWait][this])
{
g_pServerVar[m_fWait][this] = _:(flCurrentTime + get_pcvar_float(pcvar_mode_touch_wait));
client_print_color(this, DontChange, "%L %L", this, "MODE_PREFIX", this, "MODE_MESSAGE_TOUCH");
return HAM_IGNORED;
}

return HAM_IGNORED;
}

public CMD_ModeChange(id, level, cid)
{
if (!get_pcvar_num(pcvar_mode_allow_change))
return PLUGIN_CONTINUE;

if (!cmd_access(id, level, cid, 2))
return PLUGIN_CONTINUE;

if (!g_pServerVar[m_LoadBox])
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_NOT_USED");
return PLUGIN_HANDLED;
}

new szName[32];
get_user_name(id, szName, charsmax(szName));

if (g_pServerVar[m_iClosedIndex] != id && is_user_connected(g_pServerVar[m_iClosedIndex]))
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_ADMIN_BUSY_CHANGE", szName);
return PLUGIN_HANDLED;
}

switch (g_pServerVar[m_iBlocked])
{
case block_vote:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_VOTE");
return PLUGIN_HANDLED;
}
case block_start_vote:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_START_VOTE");
return PLUGIN_HANDLED;
}
case block_success_vote:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_WAIT_NEW_ROUND");
return PLUGIN_HANDLED;
}
case block_admin_change:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_ADMIN_CHANGED", id, (g_pServerVar[m_iStatus] == map_close) ? "MODE_ADMIN_CLOSED" : "MODE_ADMIN_OPENED");
return PLUGIN_HANDLED;
}
}

g_pServerVar[m_iBlocked] = blocked_s:block_admin_change;
g_pServerVar[m_fNext] = _:(get_gametime() + (VOTE_TIMEWAIT * 60.0));
g_pServerVar[m_iStatus] ^= map_close;

if (get_pcvar_num(pcvar_mode_admin_only) != 0)
{
g_pServerVar[m_iClosedIndex] = (g_pServerVar[m_iStatus] == map_open) ? id : 0;
}

new iPlayers[32], iNum, p;
get_players(iPlayers, iNum, "ch");

for (new a = 0; a < iNum; ++a)
{
p = iPlayers[a];

if (get_user_flags(p) & ADMIN_VOTE)
{
client_print_color(p, DontChange + id, "%L %L", p, "MODE_PREFIX", p, "MODE_ADMIN_CHANGED_ADMINS", szName, p, (g_pServerVar[m_iStatus] == map_close) ? "MODE_ADMIN_CLOSED" : "MODE_ADMIN_OPENED");
}
}

return PLUGIN_HANDLED;
}

public CMD_Mode(id)
{
if (!get_pcvar_num(pcvar_mode_allow_vote))
return PLUGIN_CONTINUE;

if (!g_pServerVar[m_LoadBox])
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_NOT_USED");
return PLUGIN_HANDLED;
}

switch (g_pServerVar[m_iBlocked])
{
case block_vote:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_VOTE");
return PLUGIN_HANDLED;
}
case block_start_vote:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_START_VOTE");
return PLUGIN_HANDLED;
}
case block_admin_change:
{
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_ADMIN_CHANGED", id, (g_pServerVar[m_iStatus] == map_close) ? "MODE_ADMIN_CLOSED" : "MODE_ADMIN_OPENED");
return PLUGIN_HANDLED;
}
}

new Float:flCurrent = get_gametime();
if (g_pServerVar[m_fNext] > flCurrent)
{
new szBuffer[64];
getChangeleft(id, floatround(g_pServerVar[m_fNext] - flCurrent), szBuffer, charsmax(szBuffer));
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_VOTE_LEFT", szBuffer);
return PLUGIN_HANDLED;
}
else
{
new iNumRatio = floatround(VOTE_RATIO * UTIL__GetActivePlayers());
if (g_pServerVar[m_iVote][id])
client_print_color(id, DontChange, "%L %L", id, "MODE_PREFIX", id, "MODE_VOTE_ALREADY", g_pServerVar[m_iAll], iNumRatio);

else
{
++g_pServerVar[m_iAll];
g_pServerVar[m_iVote][id] = 1;

new iPlayers[32], szName[32], iNum;

get_players(iPlayers, iNum, "ch");
get_user_name(id, szName, charsmax(szName));

for (new a = 0; a < iNum; ++a)
{
client_print_color(iPlayers[a], DontChange + id, "%L %L", id, "MODE_PREFIX", id, "MODE_VOTED", szName, id, (g_pServerVar[m_iStatus] == map_close) ? "MODE_VOTE_OPENED" : "MODE_VOTE_CLOSED", g_pServerVar[m_iAll], iNumRatio);
}

if (iNumRatio <= g_pServerVar[m_iAll])
{
g_pServerVar[m_iCount] = MODE_COUNT_START;
g_pServerVar[m_iBlocked] = blocked_s:block_vote;

set_task(MODE_TIME_START, "Task_ModeVote", TASK_MODE_START);
client_print_color(0, DontChange, "%L %L", LANG_PLAYER, "MODE_PREFIX", LANG_PLAYER, "MODE_MESSAGE_VOTE_START", 10);
}
}
}

return 1;
}

public Task_ModeVote()
{
new szBuffer[128];

if (0 < g_pServerVar[m_iCount]--)
{
new szSpeak[24];
num_to_word(g_pServerVar[m_iCount] + 1, szSpeak, charsmax(szSpeak));
client_cmd(0, "spk \"fvox/%s\"", szSpeak);

formatex(szBuffer, charsmax(szBuffer), "%L", LANG_PLAYER, "MODE_VOTE_PRESTART_MENU", LANG_PLAYER, (g_pServerVar[m_iStatus] == map_close) ? "MODE_TITLE_OPENED" : "MODE_TITLE_CLOSED", g_pServerVar[m_iCount] + 1);
show_menu(0, 0x3FF, szBuffer, 2, "Mode Menu");
set_task(1.0, "Task_ModeVote", TASK_MODE_START);
}
else
{
g_pServerVar[m_iBlocked] = blocked_s:block_start_vote;
formatex(szBuffer, charsmax(szBuffer), "%L", LANG_PLAYER, "MODE_VOTE_POSTSTART_MENU", LANG_PLAYER, (g_pServerVar[m_iStatus] == map_close) ? "MODE_TITLE_OPENED" : "MODE_TITLE_CLOSED");
show_menu(0, MENU_KEY_1 | MENU_KEY_2, szBuffer, 18, "Mode Menu");
set_task(20.0, "Task_ResultVote", TASK_MODE_VOTE);
}
}

public Mode_Handler(id, key)
{
if (!get_pcvar_num(pcvar_mode_allow_vote))
return PLUGIN_CONTINUE;

if (g_pServerVar[m_iBlocked] == blocked_s:block_vote)
{
client_cmd(id, "slot%d", key + 1);
return PLUGIN_HANDLED;
}

new szName[32];
get_user_name(id, szName, charsmax(szName));

client_print_color(0, DontChange + id, "%L", id, "MODE_VOTE_FORMAT", szName, id, key ? "MODE_VOTE_NO" : "MODE_VOTE_YES");
++g_pServerVar[m_iVoting][key];

return PLUGIN_HANDLED;
}

public Task_ResultVote()
{
g_pServerVar[m_iAll] = 0;
g_pServerVar[m_fNext] = _:(get_gametime() + (VOTE_TIMEWAIT * 60.0));

arrayset(g_pServerVar[m_iVote], 0, g_pServerVar[m_iMaxpl]);

if (g_pServerVar[m_iVoting][vote_no] > g_pServerVar[m_iVoting][vote_yes])
{
g_pServerVar[m_iBlocked] = blocked_s:block_success_vote;
g_pServerVar[m_iStatus] ^= map_close;

client_print_color(0, DontChange, "%L %L", LANG_PLAYER, "MODE_PREFIX", LANG_PLAYER, "MODE_VOTE_RESULT",
g_pServerVar[m_iVoting][vote_no],
g_pServerVar[m_iVoting][vote_yes],
g_pServerVar[m_iVoting][vote_no] + g_pServerVar[m_iVoting][vote_yes]);

client_print_color(0,DontChange, "%L %L",
LANG_PLAYER, "MODE_PREFIX",
LANG_PLAYER, "MODE_VOTE_SUCCESS",
LANG_PLAYER, (g_pServerVar[m_iStatus] == map_close) ? "MODE_RESULT_CLOSED" : "MODE_RESULT_OPENED");
}
else if (g_pServerVar[m_iVoting][vote_no] < g_pServerVar[m_iVoting][vote_yes])
{
g_pServerVar[m_iBlocked] = blocked_s:block_none;

client_print_color(0, DontChange, "%L %L", LANG_PLAYER, "MODE_PREFIX", LANG_PLAYER, "MODE_VOTE_RESULT",
g_pServerVar[m_iVoting][vote_no],
g_pServerVar[m_iVoting][vote_yes],
g_pServerVar[m_iVoting][vote_no] + g_pServerVar[m_iVoting][vote_yes]);

client_print_color(0, DontChange, "%L %L", LANG_PLAYER, "MODE_PREFIX", LANG_PLAYER, "MODE_VOTE_FAILED");
}
else
{
g_pServerVar[m_iBlocked] = blocked_s:block_none;
client_print_color(0, DontChange, "%L %L", LANG_PLAYER, "MODE_PREFIX", LANG_PLAYER, "MODE_VOTE_FAILED");
}
}

public CMD_MenuBox(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_CONTINUE;

if (g_pForwardThink)
EnableHamForward(g_pForwardThink);

return Menu_MainEdit(id);
}

stock Menu_MainEdit(id)
{
new szBuffer[512];
formatex(szBuffer, charsmax(szBuffer),
"%L", id, "MODE_DEV_MENU_MAIN",
g_pBoxVar[m_iBox],
g_pBoxVar[m_iEntid] > 0 ? "\\d" : "\\w",
g_pBoxVar[m_iBox] == 0 ? "\\d" : "\\w",
g_pBoxVar[m_iBox] == 0 ? "\\d" : "\\w",
id, (g_pBoxVar[m_iEntid] == 0) ? "MODE_DEV_CHANGE" : "MODE_DEV_SAVE",
(g_pBoxVar[m_iEntid] == 0) ? "\\d" : "\\w",
(g_pBoxVar[m_iBox] == 0 || g_pBoxVar[m_iEntid] > 0) ? "\\d" : "\\w",
(g_pBoxVar[m_iCopy] == 0) ? "\\d" : "\\w",
(g_pBoxVar[m_iBox] == 0 || g_pBoxVar[m_iEntid] > 0) ? "\\d" : "\\w"
);

return show_menu(id, 0x3FF, szBuffer, -1, "Main Edit Menu");
}

public MainEdit_Handler(id, key)
{
switch (key)
{
case 0:
{
if (g_pBoxVar[m_iEntid] > 0)
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_5");
return Menu_MainEdit(id);
}

new Float:p_origin[coord_s], pEnt = CreateBox();
entity_get_vector(id, EV_VEC_origin, p_origin);

++g_pBoxVar[m_iBox];
g_pBoxVar[m_iEntid] = pEnt;
p_origin[z] += 32.0;

EnableHamForward(g_pForwardThink);
entity_set_vector(pEnt, EV_VEC_origin, p_origin);
entity_set_vector(pEnt, EV_VEC_rendercolor, Vector(255.0, 100.0, 100.0));
}
case 1:
{
new pEnt, dummy;
get_user_aiming(id, pEnt, dummy);

if (is_valid_ent(pEnt))
{
new szClassname[32];
entity_get_string(pEnt, EV_SZ_classname, szClassname, charsmax(szClassname));
if (!strcmp(szClassname, CLASSNAME_WALL))
{
if (--g_pBoxVar[m_iBox] < 0)
g_pBoxVar[m_iBox] = 0;

if (g_pBoxVar[m_iEntid] == pEnt)
g_pBoxVar[m_iEntid] = 0;

remove_entity(pEnt);
client_print(id, print_center, "%L", id, "MODE_DEV_SUCCESS_1", "SOLID_BBOX");
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");
}
else if (is_valid_ent(g_pBoxVar[m_iEntid]))
{
pEnt = g_pBoxVar[m_iEntid];
new Float:v_absmins[coord_s], Float:v_absmaxs[coord_s], Float:e_absmin[coord_s], Float:e_absmax[coord_s];

entity_get_vector(id, EV_VEC_absmin, v_absmins);
entity_get_vector(id, EV_VEC_absmax, v_absmaxs);

v_absmins[x] += 1.0;
v_absmins[y] += 1.0;
v_absmins[z] += 3.0;

v_absmaxs[x] -= 1.0;
v_absmaxs[y] -= 1.0;
v_absmaxs[z] -= 17.0;

entity_get_vector(pEnt, EV_VEC_absmin, e_absmin);
entity_get_vector(pEnt, EV_VEC_absmax, e_absmax);

if (VectorDT(e_absmin, e_absmax, v_absmins, v_absmaxs))
{
--g_pBoxVar[m_iBox];
g_pBoxVar[m_iEntid] = 0;
client_print(id, print_center, "%L", id, "MODE_DEV_SUCCESS_1", (entity_get_int(pEnt, EV_INT_solid) == SOLID_NOT) ? "SOLID_NOT" : "SOLID_BBOX");
remove_entity(pEnt);
}
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");

if (!g_pBoxVar[m_iEntid])
{
DisableHamForward(g_pForwardThink);
}
}
case 2:
{
if (is_valid_ent(g_pBoxVar[m_iEntid]))
{
entity_set_int(g_pBoxVar[m_iEntid], EV_INT_solid, SOLID_BBOX);
entity_set_vector(g_pBoxVar[m_iEntid], EV_VEC_rendercolor, Vector(0.0, 0.0, 0.0));
entity_set_size(g_pBoxVar[m_iEntid], g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);
entity_set_float(g_pBoxVar[m_iEntid], EV_FL_nextthink, 0.0);

g_pBoxVar[m_iEntid] = 0;
g_pBoxVar[m_fScale] = _:0.250;

g_pBoxVector[m_fMaxs][x] = 32.0;
g_pBoxVector[m_fMaxs][y] = 32.0;
g_pBoxVector[m_fMaxs][z] = 32.0;

g_pBoxVector[m_fMins][x] = -32.0;
g_pBoxVector[m_fMins][y] = -32.0;
g_pBoxVector[m_fMins][z] = -32.0;

g_pBoxVector[m_fOrigin][x] = 0.0;
g_pBoxVector[m_fOrigin][y] = 0.0;
g_pBoxVector[m_fOrigin][z] = 0.0;

g_pBoxVector[m_fAngles][x] = 0.0;
g_pBoxVector[m_fAngles][y] = 0.0;
g_pBoxVector[m_fAngles][z] = 0.0;

DisableHamForward(g_pForwardThink);
client_print(id, print_center, "%L", id, "MODE_DEV_SUCCESS_4");
}
else
{
new pEnt,body;
get_user_aiming(id, pEnt, body);

if (is_valid_ent(pEnt))
{
new szClassname[32];
entity_get_string(pEnt, EV_SZ_classname, szClassname, charsmax(szClassname));
if (!strcmp(szClassname, CLASSNAME_WALL))
{
g_pBoxVar[m_iEntid] = pEnt;

entity_get_vector(pEnt, EV_VEC_mins, g_pBoxVector[m_fMins]);
entity_get_vector(pEnt, EV_VEC_maxs, g_pBoxVector[m_fMaxs]);

entity_get_vector(pEnt, EV_VEC_origin, g_pBoxVector[m_fOrigin]);
entity_get_vector(pEnt, EV_VEC_angles, g_pBoxVector[m_fAngles]);

g_pBoxVar[m_fScale] = _:(entity_get_float(pEnt, EV_FL_scale));

EnableHamForward(g_pForwardThink);
entity_set_int(pEnt, EV_INT_solid, SOLID_NOT);
entity_set_float(pEnt, EV_FL_nextthink, get_gametime() + 0.1);
entity_set_vector(pEnt, EV_VEC_rendercolor, Vector(255.0, 100.0, 100.0));
entity_set_size(pEnt, g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);
client_print(id, print_center, "%L", id, "MODE_DEV_SUCCESS_5");
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");
}
}
case 3:
{
if (!g_pBoxVar[m_iEntid])
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_4");
return Menu_MainEdit(id);
}

return showPropertiesMenu(id);
}
case 4:
{
return Menu_Settings(id);
}
case 5:
{
if (g_pBoxVar[m_iEntid] > 0)
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_5");
return Menu_MainEdit(id);
}

new pEnt, dummy;
get_user_aiming(id, pEnt, dummy);

if (is_valid_ent(pEnt))
{
new szClassname[32];
entity_get_string(pEnt, EV_SZ_classname, szClassname, charsmax(szClassname));
if (!strcmp(szClassname, CLASSNAME_WALL))
{
if (g_pBoxVar[m_iCopy] == pEnt)
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_2");
return Menu_MainEdit(id);
}

g_pBoxVar[m_iCopy] = pEnt;
client_print(id, print_center, "%L", id, "MODE_DEV_SUCCESS_2");
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");
}
else client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_1");
}
case 6:
{
if (g_pBoxVar[m_iEntid] > 0)
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_5");
return Menu_MainEdit(id);
}

if (!is_valid_ent(g_pBoxVar[m_iCopy]))
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_3");
return Menu_MainEdit(id);
}

new Float:p_origin[coord_s], pEnt = CreateBox();
entity_get_vector(id, EV_VEC_origin, p_origin);

++g_pBoxVar[m_iBox];
g_pBoxVar[m_iEntid] = pEnt;
p_origin[z] += 32.0;

entity_get_vector(g_pBoxVar[m_iCopy], EV_VEC_mins, g_pBoxVector[m_fMins]);
entity_get_vector(g_pBoxVar[m_iCopy], EV_VEC_maxs, g_pBoxVector[m_fMaxs]);
entity_get_vector(g_pBoxVar[m_iCopy], EV_VEC_angles, g_pBoxVector[m_fAngles]);

g_pBoxVar[m_fScale] = _:(entity_get_float(g_pBoxVar[m_iCopy], EV_FL_scale));
g_pBoxVar[m_iSprite] = floatround(entity_get_float(g_pBoxVar[m_iCopy], EV_FL_frame));

entity_set_vector(pEnt, EV_VEC_origin, p_origin);
entity_set_vector(pEnt, EV_VEC_rendercolor, Vector(255.0, 100.0, 100.0));

entity_set_vector(pEnt, EV_VEC_mins, g_pBoxVector[m_fMins]);
entity_set_vector(pEnt, EV_VEC_maxs, g_pBoxVector[m_fMaxs]);
entity_set_vector(pEnt, EV_VEC_angles, g_pBoxVector[m_fAngles]);

new iFlags = entity_get_int(g_pBoxVar[m_iCopy], EV_INT_effects);

entity_set_int(pEnt, EV_INT_effects, iFlags);
entity_set_float(pEnt, EV_FL_scale, g_pBoxVar[m_fScale]);
entity_set_float(pEnt, EV_FL_frame, float(g_pBoxVar[m_iSprite]));
}
case 8:
{
if (!g_pBoxVar[m_iBox])
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_4");

else if (g_pBoxVar[m_iEntid])
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_5");

else boxSave(id);
}
case 9:
{
return PLUGIN_HANDLED;
}
}

return Menu_MainEdit(id);
}

stock showPropertiesMenu(id)
{
new szBuffer[512];
new iLen = formatex(szBuffer, charsmax(szBuffer), "%L", id, "MODE_DEV_MENU_TITLE");

switch (g_pBoxVar[m_iSetting])
{
case 0:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 10.0 : (g_pBoxVar[m_iType] == 1) ? 5.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.1;
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_COORD",
g_pBoxVector[m_fOrigin][x],
g_pBoxVector[m_fOrigin][y],
g_pBoxVector[m_fOrigin][z], iSize);
}
case 1:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 45.0 : (g_pBoxVar[m_iType] == 1) ? 15.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.5;
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_ANGLES",
g_pBoxVector[m_fAngles][x],
g_pBoxVector[m_fAngles][y],
g_pBoxVector[m_fAngles][z], iSize);
}
case 2,3:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 10.0 : (g_pBoxVar[m_iType] == 1) ? 5.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.5;
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_SIZE",
g_pBoxVector[m_fMins][x],
g_pBoxVector[m_fMins][y],
g_pBoxVector[m_fMins][z],
g_pBoxVector[m_fMaxs][x],
g_pBoxVector[m_fMaxs][y],
g_pBoxVector[m_fMaxs][z], iSize);
}
case 4:
{
new Float:iSize = ((g_pBoxVar[m_iType] == 0) ? 0.5 : (g_pBoxVar[m_iType] == 1) ? 0.1 : (g_pBoxVar[m_iType] == 2) ? 0.0101 : 0.0051);
switch (g_pBoxVar[m_iType])
{
case 0,1:
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_SCALE_1",
g_pBoxVar[m_fScale], iSize, iSize, iSize);
case 2:
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_SCALE_2",
g_pBoxVar[m_fScale], iSize, iSize, iSize);

case 3:
iLen += formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id,"MODE_DEV_MENU_SCALE_3",
g_pBoxVar[m_fScale], iSize, iSize, iSize);
}
}
}

formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%L", id, "MODE_DEV_MENU_ADDON", id,
(g_pBoxVar[m_iSetting] == 0) ?
"MODE_DEV_COORD"
:
(g_pBoxVar[m_iSetting] == 1) ?
"MODE_DEV_ANGLES"
:
(g_pBoxVar[m_iSetting] == 2 && g_pServerVar[m_bAdvanced]) ?
"MODE_DEV_MINS"
:
(g_pBoxVar[m_iSetting] == 3 && g_pServerVar[m_bAdvanced]) ?
"MODE_DEV_MAXS"
:
(g_pBoxVar[m_iSetting] == 3) ?
"MODE_DEV_SIZE"
:
"MODE_DEV_SPRITE",
id,(g_pBoxVar[m_iSprite] == 0) ?
"MODE_DEV_TITLE"
:
(g_pBoxVar[m_iSprite] == 1) ?
"MODE_DEV_WALL"
:
"MODE_DEV_NULL"
);

return show_menu(id, (g_pBoxVar[m_iSetting] < 4) ? 0x3FF : 0x3C3, szBuffer, -1, "Properties Menu");
}

public Properties_Handler(id, key)
{
if (key == 9)
{
return Menu_MainEdit(id);
}

entity_get_vector(g_pBoxVar[m_iEntid], EV_VEC_origin, g_pBoxVector[m_fOrigin]);
entity_get_vector(g_pBoxVar[m_iEntid], EV_VEC_angles, g_pBoxVector[m_fAngles]);
entity_get_vector(g_pBoxVar[m_iEntid], EV_VEC_maxs, g_pBoxVector[m_fMaxs]);
g_pBoxVar[m_fScale] = _:(entity_get_float(g_pBoxVar[m_iEntid], EV_FL_scale));

switch (g_pBoxVar[m_iSetting])
{
case 0:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 10.0 : (g_pBoxVar[m_iType] == 1) ? 5.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.1;

switch (key)
{
case 0: g_pBoxVector[m_fOrigin][x] += iSize;
case 1: g_pBoxVector[m_fOrigin][y] += iSize;
case 2: g_pBoxVector[m_fOrigin][z] += iSize;
case 3: g_pBoxVector[m_fOrigin][x] -= iSize;
case 4: g_pBoxVector[m_fOrigin][y] -= iSize;
case 5: g_pBoxVector[m_fOrigin][z] -= iSize;
case 6:
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;
}
case 7:
{
if (++g_pBoxVar[m_iSetting] > 4)
g_pBoxVar[m_iSetting] = 0;

g_pBoxVar[m_iSetting] = (g_pBoxVar[m_iSprite] > 1 && g_pBoxVar[m_iSetting] == 1) ? 2 + ((g_pServerVar[m_bAdvanced] == false) ? 1 : 0) : g_pBoxVar[m_iSetting];
}
}
}
case 1:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 45.0 : (g_pBoxVar[m_iType] == 1) ? 15.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.5;

switch (key)
{
case 0: g_pBoxVector[m_fAngles][x] += iSize;
case 1: g_pBoxVector[m_fAngles][y] += iSize;
case 2: g_pBoxVector[m_fAngles][z] += iSize;
case 3: g_pBoxVector[m_fAngles][x] -= iSize;
case 4: g_pBoxVector[m_fAngles][y] -= iSize;
case 5: g_pBoxVector[m_fAngles][z] -= iSize;
case 6:
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;
}
case 7:
{
if (++g_pBoxVar[m_iSetting] > 4)
g_pBoxVar[m_iSetting] = 0;

g_pBoxVar[m_iSetting] = (g_pBoxVar[m_iSetting] == 2 && g_pServerVar[m_bAdvanced] == false) ? 3 : g_pBoxVar[m_iSetting];
}
}
}
case 2:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 10.0 : (g_pBoxVar[m_iType] == 1) ? 5.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.5;

switch (key)
{
case 0: g_pBoxVector[m_fMins][x] -= iSize;
case 1: g_pBoxVector[m_fMins][y] -= iSize;
case 2: g_pBoxVector[m_fMins][z] -= iSize;
case 3: g_pBoxVector[m_fMins][x] += iSize;
case 4: g_pBoxVector[m_fMins][y] += iSize;
case 5: g_pBoxVector[m_fMins][z] += iSize;
case 6:
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;
}
case 7:
{
if (++g_pBoxVar[m_iSetting] > 4)
g_pBoxVar[m_iSetting] = 0;
}
}
}
case 3:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 10.0 : (g_pBoxVar[m_iType] == 1) ? 5.0 : (g_pBoxVar[m_iType] == 2) ? 1.0 : 0.5;

switch (key)
{
case 0: g_pBoxVector[m_fMaxs][x] += iSize;
case 1: g_pBoxVector[m_fMaxs][y] += iSize;
case 2: g_pBoxVector[m_fMaxs][z] += iSize;
case 3: g_pBoxVector[m_fMaxs][x] -= iSize;
case 4: g_pBoxVector[m_fMaxs][y] -= iSize;
case 5: g_pBoxVector[m_fMaxs][z] -= iSize;
case 6:
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;
}
case 7:
{
if (++g_pBoxVar[m_iSetting] > 4)
g_pBoxVar[m_iSetting] = 0;

g_pBoxVar[m_iSetting] = (g_pBoxVar[m_iSprite] > 1 && g_pBoxVar[m_iSetting] == 4) ? 0 : g_pBoxVar[m_iSetting];
}
}
}
case 4:
{
new Float:iSize = (g_pBoxVar[m_iType] == 0) ? 0.5 : (g_pBoxVar[m_iType] == 1) ? 0.1 : (g_pBoxVar[m_iType] == 2) ? 0.0101 : 0.0051;

if (iSize > g_pBoxVar[m_fScale])
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;

iSize = (g_pBoxVar[m_iType] == 0) ? 0.5 : (g_pBoxVar[m_iType] == 1) ? 0.1 : (g_pBoxVar[m_iType] == 2) ? 0.0101 : 0.0051;
}
switch (key)
{
case 0: g_pBoxVar[m_fScale] += iSize;
case 1: g_pBoxVar[m_fScale] -= iSize;
case 6:
{
if (++g_pBoxVar[m_iType] > 3)
g_pBoxVar[m_iType] = 0;
}
case 7:
{
if (++g_pBoxVar[m_iSetting] > 4)
g_pBoxVar[m_iSetting] = 0;
}
}
}
}
switch (key)
{
case 8:
{
if (is_valid_ent(g_pBoxVar[m_iEntid]))
{
if (++g_pBoxVar[m_iSprite] > 2)
g_pBoxVar[m_iSprite] = 0;

new iFlags = entity_get_int(g_pBoxVar[m_iEntid], EV_INT_effects);

if (g_pBoxVar[m_iSprite] > 1)
entity_set_int(g_pBoxVar[m_iEntid], EV_INT_effects, iFlags | EF_NODRAW);

else if (iFlags & EF_NODRAW)
entity_set_int(g_pBoxVar[m_iEntid], EV_INT_effects, iFlags &~ EF_NODRAW);

entity_set_float(g_pBoxVar[m_iEntid], EV_FL_frame, float(g_pBoxVar[m_iSprite]));
}
}
}
if (g_pBoxVar[m_fScale] < 0.0051)
g_pBoxVar[m_fScale] = _:0.0051;

if (g_pServerVar[m_bAdvanced])
{
if (g_pBoxVector[m_fMins][x] > 0.0)
g_pBoxVector[m_fMins][x] = 0.0;

else if (g_pBoxVector[m_fMins][y] > 0.0)
g_pBoxVector[m_fMins][y] = 0.0;

else if (g_pBoxVector[m_fMins][z] > 0.0)
g_pBoxVector[m_fMins][z] = 0.0;

if (g_pBoxVector[m_fMaxs][x] < 0.0)
g_pBoxVector[m_fMaxs][x] = 0.0;

else if (g_pBoxVector[m_fMaxs][y] < 0.0)
g_pBoxVector[m_fMaxs][y] = 0.0;

else if (g_pBoxVector[m_fMaxs][z] < 0.0)
g_pBoxVector[m_fMaxs][z] = 0.0;

}
else
{
if (g_pBoxVector[m_fMaxs][x] < 1.0)
g_pBoxVector[m_fMaxs][x] = 1.0;

else if (g_pBoxVector[m_fMaxs][y] < 1.0)
g_pBoxVector[m_fMaxs][y] = 1.0;

else if (g_pBoxVector[m_fMaxs][z] < 1.0)
g_pBoxVector[m_fMaxs][z] = 1.0;
}

if (g_pBoxVector[m_fAngles][x] >= 360.0 || g_pBoxVector[m_fAngles][x] <= -360.0)
g_pBoxVector[m_fAngles][x] = 0.0;

if (g_pBoxVector[m_fAngles][y] >= 360.0 || g_pBoxVector[m_fAngles][y] <= -360.0)
g_pBoxVector[m_fAngles][y] = 0.0;

if (g_pBoxVector[m_fAngles][z] >= 360.0 || g_pBoxVector[m_fAngles][z] <= -360.0)
g_pBoxVector[m_fAngles][z] = 0.0;

if (!g_pServerVar[m_bAdvanced])
{
g_pBoxVector[m_fMins][x] = -g_pBoxVector[m_fMaxs][x];
g_pBoxVector[m_fMins][y] = -g_pBoxVector[m_fMaxs][y];
g_pBoxVector[m_fMins][z] = -g_pBoxVector[m_fMaxs][z];
}

entity_set_float(g_pBoxVar[m_iEntid], EV_FL_scale, g_pBoxVar[m_fScale]);
entity_set_vector(g_pBoxVar[m_iEntid], EV_VEC_angles, g_pBoxVector[m_fAngles]);
entity_set_float(g_pBoxVar[m_iEntid], EV_FL_nextthink, get_gametime() + 0.1);
entity_set_int(g_pBoxVar[m_iEntid], EV_INT_solid, g_pBoxVar[m_iSolid] ? SOLID_BBOX : SOLID_NOT);

entity_set_size(g_pBoxVar[m_iEntid], g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);
entity_set_vector(g_pBoxVar[m_iEntid], EV_VEC_origin, g_pBoxVector[m_fOrigin]);

return showPropertiesMenu(id);
}

stock Menu_Settings(id)
{
new szMenu[512];
formatex(szMenu, charsmax(szMenu), "%L", id, "MODE_DEV_MENU_CONFIG",
id, (g_pBoxVar[m_iEntid] == 0) ? "MODE_DEV_SOLID_D" : "MODE_DEV_SOLID",
g_pBoxVar[m_iSolid] ? "SOLID_BBOX" : "SOLID_NOT",
(g_pBoxVar[m_iBox] == 0) ? "\\d" : "\\w",
id, (g_pServerVar[m_iStatus] == map_close) ? "MODE_DEV_HIDE" : "MODE_DEV_SHOW",
g_pServerVar[m_iOnline_Low], g_pServerVar[m_iOnline_High],
id, entity_get_int(id, EV_INT_movetype) == MOVETYPE_NOCLIP ? "MODE_DEV_YES" : "MODE_DEV_NO",
id, g_pServerVar[m_bAdvanced] ? "MODE_DEV_YES" : "MODE_DEV_NO");

return show_menu(id, 0x23F, szMenu, -1, "Settings Menu");
}

public Settings_Handler(id, key)
{
switch (key)
{
case 0:
{
if (!g_pBoxVar[m_iEntid])
{
client_print(id, print_center, "%L", id, "MODE_DEV_FAILED_4");
return Menu_Settings(id);
}

entity_set_float(g_pBoxVar[m_iEntid], EV_FL_nextthink, get_gametime() + 0.1);
entity_set_int(g_pBoxVar[m_iEntid], EV_INT_solid, (g_pBoxVar[m_iSolid] ^= 1) ? SOLID_BBOX : SOLID_NOT);
entity_set_size(g_pBoxVar[m_iEntid], g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);

client_print(id,print_center, "%L", id, "MODE_DEV_SUCCESS_6", g_pBoxVar[m_iSolid] ? "SOLID_BBOX" : "SOLID_NOT");
}
case 1:
{
if (g_pBoxVar[m_iBox])
DrawBoxDev((g_pServerVar[m_iStatus] ^= map_close));
}
case 2:
{
if (++g_pServerVar[m_iOnline_Low] > g_pServerVar[m_iOnline_High])
g_pServerVar[m_iOnline_Low] = 0;
}
case 3:
{
if (++g_pServerVar[m_iOnline_High] > g_pServerVar[m_iMaxpl])
g_pServerVar[m_iOnline_High] = g_pServerVar[m_iOnline_Low];
}
case 4:
{
if (is_user_alive(id))
{
entity_set_int(id, EV_INT_movetype, (entity_get_int(id, EV_INT_movetype) == MOVETYPE_NOCLIP) ? MOVETYPE_WALK : MOVETYPE_NOCLIP);
}
}
case 5: g_pServerVar[m_bAdvanced] ^= true;
case 9: return Menu_MainEdit(id);
}

return Menu_Settings(id);
}

stock getChangeleft(id, time, output[], lenght)
{
if (time > 0)
{
new minute = 0, second = 0;

second = time;

minute = second / 60;
second -= (minute * 60);

new szBuffer[2][33], ending[22], num = -1;

if (minute > 0)
{
getEnding(minute, "MODE_MINUT", "MODE_MINUTE", "MODE_MINUTES", 21, ending);
formatex(szBuffer[++num], charsmax(szBuffer[]), "%i %L", minute, id, ending);
}
if (second > 0)
{
getEnding(second, "MODE_SECOND", "MODE_SECUNDE", "MODE_SECONDS", 21, ending);
formatex(szBuffer[++num], charsmax(szBuffer[]), "%i %L", second, id, ending);
}
switch (num)
{
case 0: formatex(output, lenght, "%s", szBuffer[0]);
case 1: formatex(output, lenght, "%L", id, "MODE_AND", szBuffer[0], szBuffer[1]);
}
}
else formatex(output, lenght, "0 %L", id, "MODE_SECOND");
}

stock getEnding(num, const a[], const b[], const c[], lenght, output[])
{
new num100 = num % 100, num10 = num % 10, szBuffer[22];
if (num100 >= 5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9)
copy(szBuffer, 21, a);

else if (num10 == 1)
copy(szBuffer, 21, b);

else if (num10 >= 2 && num10 <= 4)
copy(szBuffer, 21, c);

return formatex(output, lenght, "%s", szBuffer);
}

stock boxSave(id)
{
delete_file(g_pServerVar[m_szFile]);

new szBuffer[1024], Float:frame, Float:p_origin[coord_s], Float:p_angles[coord_s], Float:p_mins[coord_s], Float:p_maxs[coord_s], Float:p_scale, p_sprite, count, pEnt = -1;
if (g_pServerVar[m_iOnline_High] != 0)
formatex(szBuffer, charsmax(szBuffer),"ONLINE=%d,%d", g_pServerVar[m_iOnline_Low], g_pServerVar[m_iOnline_High]);
else
formatex(szBuffer, charsmax(szBuffer),"ONLINE=%d", g_pServerVar[m_iOnline_Low]);

write_file(g_pServerVar[m_szFile], szBuffer, 0);

while ((pEnt = find_ent_by_class(pEnt, CLASSNAME_WALL)))
{
if (g_pBoxVar[m_iEntid] == pEnt)
continue;

entity_get_vector(pEnt, EV_VEC_origin, p_origin);
entity_get_vector(pEnt, EV_VEC_angles, p_angles);
entity_get_vector(pEnt, EV_VEC_mins, p_mins);
entity_get_vector(pEnt, EV_VEC_maxs, p_maxs);

p_scale = entity_get_float(pEnt, EV_FL_scale);
frame = entity_get_float(pEnt, EV_FL_frame);

p_sprite = floatround(frame);

formatex(szBuffer, charsmax(szBuffer),
"\"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%f\" \"%d\"",
p_origin[x], p_origin[y], p_origin[z],
p_angles[x], p_angles[y], p_angles[z],
p_mins[x], p_mins[y], p_mins[z],
p_maxs[x], p_maxs[y], p_maxs[z],
p_scale,
p_sprite
);

write_file(g_pServerVar[m_szFile], szBuffer, -1);
++count;
}

if (id && count > 0)
{
client_print(id,print_center, "%L", id, "MODE_DEV_SUCCESS_3");
}
}

stock bool:LoadBox()
{
new szBuffer[2048], szKey[32], szValue[32], p_origin[coord_s][6], p_angles[coord_s][6], p_mins[coord_s][6], p_maxs[coord_s][6], p_scale[6], p_sprite[6];
new file = fopen(g_pServerVar[m_szFile], "r");
if (!file)
{
return false;
}

while (!feof(file))
{
fgets(file, szBuffer, charsmax(szBuffer));

if (szBuffer[0] == EOS || szBuffer[0] == ';')
continue;

trim(szBuffer);
strtok(szBuffer, szKey, charsmax(szKey), szValue, charsmax(szValue), '=');

if (!strcmp(szKey, "ONLINE"))
{
new szOnlineLow[5], szOnlineHigh[5];
strtok(szValue, szOnlineLow, charsmax(szOnlineLow), szOnlineHigh, charsmax(szOnlineHigh), ',');

g_pServerVar[m_iOnline_Low] = str_to_num(szOnlineLow);
g_pServerVar[m_iOnline_High] = str_to_num(szOnlineHigh);

if (g_pServerVar[m_iOnline_High] == 0)
g_pServerVar[m_iOnline_High] = g_pServerVar[m_iOnline_Low];

if (g_pServerVar[m_iOnline_Low] > g_pServerVar[m_iOnline_High])
g_pServerVar[m_iOnline_Low] = g_pServerVar[m_iOnline_High];

continue;
}

// parse data on line
parse(szBuffer,
p_origin[x], 5, p_origin[y], 5, p_origin[z], 5, // origin
p_angles[x], 5, p_angles[y], 5, p_angles[z], 5, // angles
p_mins[x], 5, p_mins[y], 5, p_mins[z], 5, // mins
p_maxs[x], 5, p_maxs[y], 5, p_maxs[z], 5, // maxs
p_scale, 5, // scale
p_sprite, 5); // sprite

g_pBoxVector[m_fOrigin][x] = str_to_float(p_origin[x]);
g_pBoxVector[m_fOrigin][y] = str_to_float(p_origin[y]);
g_pBoxVector[m_fOrigin][z] = str_to_float(p_origin[z]);

g_pBoxVector[m_fAngles][x] = str_to_float(p_angles[x]);
g_pBoxVector[m_fAngles][y] = str_to_float(p_angles[y]);
g_pBoxVector[m_fAngles][z] = str_to_float(p_angles[z]);

g_pBoxVector[m_fMins][x] = str_to_float(p_mins[x]);
g_pBoxVector[m_fMins][y] = str_to_float(p_mins[y]);
g_pBoxVector[m_fMins][z] = str_to_float(p_mins[z]);

g_pBoxVector[m_fMaxs][x] = str_to_float(p_maxs[x]);
g_pBoxVector[m_fMaxs][y] = str_to_float(p_maxs[y]);
g_pBoxVector[m_fMaxs][z] = str_to_float(p_maxs[z]);

g_pBoxVar[m_fScale] = _:(str_to_float(p_scale));
g_pBoxVar[m_iSprite] = str_to_num(p_sprite);

CreateBox(true);
++g_pBoxVar[m_iBox];
}

fclose(file);
return g_pBoxVar[m_iBox] > 0 ? true : false;
}

stock UTIL__GetActivePlayers()
{
new iNum = 0;
for (new nIndex = 1; nIndex <= g_pServerVar[m_iMaxpl]; ++nIndex)
{
if (!is_user_connected(nIndex) || !(1 <= get_member(nIndex, m_iTeam) <= 2))
continue;

++iNum;
}

return iNum;
}

stock DrawBoxDev(status_s:st)
{
new pEnt = -1;
while ((pEnt = find_ent_by_class(pEnt, CLASSNAME_WALL)))
{
entity_set_int(pEnt, EV_INT_solid, st == map_close ? SOLID_BBOX : SOLID_NOT);

if (g_pBoxVar[m_iEntid] == pEnt || entity_get_float(pEnt, EV_FL_frame) > 1.0)
continue;

new iFlags = entity_get_int(pEnt, EV_INT_effects);
entity_set_int(pEnt, EV_INT_effects, st == map_close ? (iFlags &~ EF_NODRAW) : (iFlags | EF_NODRAW));
}
}

stock DrawBox(status_s:st, bool:bShow = true)
{
new pEnt = -1;
while ((pEnt = find_ent_by_class(pEnt, CLASSNAME_WALL)))
{
entity_set_int(pEnt, EV_INT_solid, (st == map_close) ? SOLID_BBOX : SOLID_NOT);

if (entity_get_float(pEnt, EV_FL_frame) > 1)
continue;

new iFlags = entity_get_int(pEnt, EV_INT_effects);
entity_set_int(pEnt, EV_INT_effects, (st == map_close) ? iFlags &~ EF_NODRAW : iFlags | EF_NODRAW);
}

if (g_pServerVar[m_bInitialized])
{
UTIL__ChangeNameOfMap(st);
}

new arg[2];
arg[0] = _:st;

switch (st)
{
case map_open:
{
g_pServerVar[m_iAll] = 0;
arrayset(g_pServerVar[m_iVote], 0, g_pServerVar[m_iMaxpl]);

if (bShow)
{
g_pServerVar[m_iAll] = 0;
set_task(0.7, "Task_NotifyStatusMap", TASK_MODE_NOTIFY, arg, sizeof(arg));
}
}
case map_close:
{
if (bShow)
{
g_pServerVar[m_iAll] = 0;
set_task(0.7, "Task_NotifyStatusMap", TASK_MODE_NOTIFY, arg, sizeof(arg));
}
}
}

UTIL__MoveSpawnSpot(st);
g_pServerVar[m_iStatusLast] = st;
}

public Task_NotifyStatusMap(arg[])
{
if (arg[0] == any:map_open)
{
set_dhudmessage(COLOR_MAP_OPEN, MESSAGE_MAP_STATUS, 2, 0.1, 2.0, 0.05, 0.2);
show_dhudmessage(0, "%L", LANG_PLAYER, "MODE_MESSAGE_MAP_OPENED");
}
else
{
set_dhudmessage(COLOR_MAP_CLOSE, MESSAGE_MAP_STATUS, 2, 0.1, 2.0, 0.05, 0.2);
show_dhudmessage(0, "%L", LANG_PLAYER, "MODE_MESSAGE_MAP_CLOSED");
}
}

stock CreateBox(bool:bParse = false)
{
new pEnt = create_entity(CLASSNAME_WALL);

if (!pEnt)
{
return 0;
}

entity_set_int(pEnt, EV_INT_movetype, MOVETYPE_FLY);
entity_set_int(pEnt, EV_INT_impulse, ID_KEY_WALL);

if (bParse)
{
entity_set_model(pEnt, SPRITE_WALL);
entity_set_size(pEnt, g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);

entity_set_float(pEnt, EV_FL_scale, g_pBoxVar[m_fScale]);
entity_set_vector(pEnt, EV_VEC_angles, g_pBoxVector[m_fAngles]);
entity_set_int(pEnt, EV_INT_solid, SOLID_BBOX);

if (g_pBoxVar[m_iSprite] > 1)
entity_set_int(pEnt, EV_INT_effects, entity_get_int(pEnt, EV_INT_effects) | EF_NODRAW);

entity_set_float(pEnt, EV_FL_frame, float(g_pBoxVar[m_iSprite]));
entity_set_int(pEnt, EV_INT_rendermode, kRenderTransAdd);
entity_set_float(pEnt, EV_FL_renderamt, 175.0);
entity_set_vector(pEnt, EV_VEC_origin, g_pBoxVector[m_fOrigin]);
}
else
{
g_pBoxVector[m_fAngles][x] = 0.0;
g_pBoxVector[m_fAngles][y] = 0.0;
g_pBoxVector[m_fAngles][z] = 0.0;

g_pBoxVector[m_fMaxs][x] = 32.0;
g_pBoxVector[m_fMaxs][y] = 32.0;
g_pBoxVector[m_fMaxs][z] = 32.0;

g_pBoxVector[m_fMins][x] = -32.0;
g_pBoxVector[m_fMins][y] = -32.0;
g_pBoxVector[m_fMins][z] = -32.0;

g_pBoxVar[m_fScale] = _:0.250;

entity_set_model(pEnt, SPRITE_WALL);
entity_set_size(pEnt, g_pBoxVector[m_fMins], g_pBoxVector[m_fMaxs]);

entity_set_float(pEnt, EV_FL_scale, g_pBoxVar[m_fScale]);
entity_set_vector(pEnt, EV_VEC_angles, g_pBoxVector[m_fAngles]);
entity_set_int(pEnt, EV_INT_solid, SOLID_NOT);

entity_set_float(pEnt, EV_FL_frame, float(g_pBoxVar[m_iSprite]));

entity_set_int(pEnt, EV_INT_rendermode, kRenderTransAdd);
entity_set_float(pEnt, EV_FL_renderamt, 175.0);

entity_set_float(pEnt, EV_FL_nextthink, get_gametime() + 0.1);

return pEnt;
}

return 0;
}

stock UTIL__ChangeNameOfMap(status_s:st)
{
if (!get_pcvar_num(pcvar_mode_changemapname))
return;

switch (st)
{
// reset mapname
case map_open:
rh_reset_mapname();
case map_close:
{
new szPrefix2x2[32];
formatex(szPrefix2x2, charsmax(szPrefix2x2), "%s_2x2", g_pServerVar[m_szMap]);
rh_set_mapname(szPrefix2x2);
}
}
}

new const Float:g_vecSpawnSpot[][coord_s] =
{
// original spot spawn
{-1024.0, -800.0, 176.0},
{-1024.0, -704.0, 176.0},
{-1024.0, -896.0, 192.0},

{-826.0, -970.0, 200.0},
{-726.0, -970.0, 200.0},
{-626.0, -970.0, 200.0}
};

stock UTIL__MoveSpawnSpot(status_s:st)
{
// If the status has not changed
if (g_pServerVar[m_iStatusLast] == st)
return;

// To move the origin of the T spawn on de_dust2, which are beyond the arch.
if (!strcmp(g_pServerVar[m_szMap], "de_dust2"))
{
new ent = -1;
new direction = (st == map_open) ? -1 : 1;
new index = (st == map_open) ? 3 : 0;

while ((ent = find_ent_by_class(ent, "info_player_deathmatch")))
{
new Float:vecSpot[3];
entity_get_vector(ent, EV_VEC_origin, vecSpot);

for (new i = 0 + index; i < 3 + index; ++i)
{
if (VectorCompare(vecSpot, g_vecSpawnSpot[i]))
{
entity_set_vector(ent, EV_VEC_origin, g_vecSpawnSpot[i + 3 * direction]);
break;
}
}
}
}
}
C++
Не закрывает карты при малом онлайне , ошибок в логах нет
 
В этой теме было размещено решение! Перейти к решению.

Вложения

 
Сообщения
59
Рейтинг
6
#4
Все там работает. Может, вы не залили конфиги карт или не установили блоки вручную?
Снимок1.PNG
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.

Members, viewing this thread

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

Похожие темы

> > > > >