Скачать плагин Blocking Zones для CS:GO
Скриншоты
Плагин Blocking Zones для CS:GO, по вашей инициативе вы можете ограничить место на карте с помощью установки новых объектов. Так вы сможете разнообразить игру на вашем сервере и удивить ваших игроков. Полезный плагин который никак не повредит вашему серверу а только поможет вам его модернизировать.
CMDS:
Code:
CMDS:
sm_bz - показывает главное меню плагина
Code:
#include <sdktools>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo = {name = "BlockingZones | Блокирующие зоны", author = "Drumanid", version = "1.3", url = "http://vk.com/drumanid"}
KeyValues g_hKv;
ArrayList g_hArray;
bool g_bActive, g_bUsePlayers;
int g_iPlayers, g_iNowPlayers, g_iMessage;
char g_sTranslite[256], g_sCfg[128];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Загрузка плагина | Регистрация событий, команды(sm_bz) и кваров | Загрузка перевода
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void OnPluginStart()
{
ConVar cv;
(cv = CreateConVar("ActiveBZ", "1", "1 - включить | 0 - выключить плагин")).AddChangeHook(Cvar_Active);
g_bActive = cv.BoolValue;
(cv = CreateConVar("PlayersBZ", "10", "Стандартное кол-во игроков необходимое для того чтобы разблокировать заблокированные зоны | Минимально - 4 / Максимально - 64 игрока", _, true, 4.0, true, 64.0)).AddChangeHook(Cvar_Players);
g_iPlayers = cv.IntValue;
(cv = CreateConVar("MessageBZ", "1", "1 - уведомление в худе | 2 - в чате | 0 - выключить уведомление", _, true, 0.0, true, 2.0)).AddChangeHook(Cvar_Message);
g_iMessage = cv.IntValue;
(cv = CreateConVar("UsePlayersBZ", "1", "1 - включить | 0 - выключит подсчет игроков\nДля тех кто хочет просто заблокировать зоны на карте\nПеременные PlayersBZ и MessageBZ будут неактивными")).AddChangeHook(Cvar_UsePlayers);
g_bUsePlayers = cv.BoolValue;
HookEvent("round_freeze_end", RoundFreezeEnd, EventHookMode_PostNoCopy);
RegAdminCmd("sm_bz", BzCmd, ADMFLAG_ROOT);
LoadTranslations("BlockingZones.phrases.txt");
AutoExecConfig(true, "BlockingZones");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Загрузка карты | Загрузка конфигов
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void OnMapStart()
{
BuildPath(Path_SM, g_sCfg, sizeof(g_sCfg), "configs/blockingzones");
g_hKv = new KeyValues("Maps");
char sBuffer[128];
GetPathCfg(sBuffer, sizeof(sBuffer));
if(!g_hKv.ImportFromFile(sBuffer)) g_hKv.ExportToFile(sBuffer);
g_hArray = new ArrayList();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Конец карты | Удаляем сохраненные данные
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void OnMapEnd()
{
if(g_hKv != null) delete g_hKv;
if(g_hArray != null) delete g_hArray;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Хук кваров
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void Cvar_Active(ConVar cv, const char[] oldValue, const char[] newValue)
{
g_bActive = cv.BoolValue;
}
public void Cvar_Players(ConVar cv, const char[] oldValue, const char[] newValue)
{
g_iPlayers = cv.IntValue;
}
public void Cvar_Message(ConVar cv, const char[] oldValue, const char[] newValue)
{
g_iMessage = cv.IntValue;
}
public void Cvar_UsePlayers(ConVar cv, const char[] oldValue, const char[] newValue)
{
g_bUsePlayers = cv.BoolValue;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Выполнение команды sm_bz
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Action BzCmd(int iClient, int iArgs)
{
if(iClient)
{
if(g_bActive) MenuZones(iClient);
else PrintToChat(iClient, "%t", "Plugin is off");
}
return Plugin_Handled;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Событие 'разморозка игроков' | Подсчет игроков | Спавн предметов | Уведомление в худе
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void RoundFreezeEnd(Event event, const char[] name, bool dbc)
{
if(!g_bActive) return;
else if(GetEngineVersion() == Engine_CSGO) if(GameRules_GetProp("m_bWarmupPeriod")) return;
if(g_bUsePlayers)
{
int iTt = 0, iCt = 0;
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && IsPlayerAlive(i))
{
switch(GetClientTeam(i))
{
case 2: iTt++;
case 3: iCt++;
}
}
}
g_iNowPlayers = iTt + iCt;
SpawnItems();
if(g_hArray.Length > 0)
{
switch(g_iMessage)
{
case 1:
{
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Notification in hud");
SetHudTextParams(0.005, 0.45, 5.0, 255, 255, 255, 255, 0, 1.0, 1.0, 1.0);
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i)) ShowHudText(i, -1, g_sTranslite);
}
}
case 2: PrintToChatAll("%t", "Notification in chat");
}
}
}
else SpawnItems();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню зон
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuZones(int iClient)
{
Menu hMenu = new Menu(MenuZonesItem);
hMenu.ExitButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Zones blocking menu");
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Create item");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Delete item");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Item settings");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Auxiliary menu");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Save items");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Delete all items");
hMenu.AddItem("", g_sTranslite);
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuZonesItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
switch(iItem)
{
case 0: MenuItems(iClient);
case 1:
{
int iEntity = GetClientAimTarget(iClient, false);
if(iEntity > 0)
{
int iIndex = g_hArray.FindValue(iEntity);
if(iIndex != -1)
{
g_hArray.Erase(iIndex);
AcceptEntityInput(iEntity, "Kill");
PrintToChat(iClient, "%t", "Item successfully deleted");
}
else PrintToChat(iClient, "%t", "The item was not created by the player");
}
else PrintToChat(iClient, "%t", "Item no found");
MenuZones(iClient);
}
case 2: MenuItemSettings(iClient);
case 3: MenuAuxiliary(iClient);
case 4: SaveItems(iClient);
case 5: MenuDeleteItems(iClient);
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню предметов | Получаем информацию из конфигруационного файла предметов
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuItems(int iClient)
{
Menu hMenu = new Menu(MenuItemsItem);
hMenu.ExitButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Items menu");
KeyValues kv = new KeyValues("Items");
char sBuffer[128];
if(GetEngineVersion() == Engine_CSGO) FormatEx(sBuffer, sizeof(sBuffer), "%s/items_csgo.ini", g_sCfg);
else FormatEx(sBuffer, sizeof(sBuffer), "%s/items_css.ini", g_sCfg);
if(!kv.ImportFromFile(sBuffer)) SetFailState("No found: %s", sBuffer);
if(kv.GotoFirstSubKey())
{
char sModelName[64], sModel[128];
do
{
kv.GetSectionName(sModelName, sizeof(sModelName));
kv.GetString("model", sModel, sizeof(sModel));
hMenu.AddItem(sModel, sModelName);
}
while(kv.GotoNextKey());
}
delete kv;
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuItemsItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
char sModel[128];
hMenu.GetItem(iItem, sModel, sizeof(sModel));
float fPos[3], fAng[3];
GetClientEyePosition(iClient, fPos);
GetClientEyeAngles(iClient, fAng);
TR_TraceRayFilter(fPos, fAng, MASK_SOLID, RayType_Infinite, TR_Filter, iClient);
TR_GetEndPosition(fPos);
if(TR_DidHit(null)) TR_GetPlaneNormal(null, fAng);
CreateItem(sModel, fPos, fAng, 255, g_iPlayers, iClient);
MenuZones(iClient);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню настройки предметов
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuItemSettings(int iClient)
{
Menu hMenu = new Menu(MenuItemSettingsItem);
hMenu.ExitBackButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Item settings menu");
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Make transparent");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Edit quota");
hMenu.AddItem("", g_sTranslite);
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuItemSettingsItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) MenuZones(iClient);
case MenuAction_Select:
{
switch(iItem)
{
case 0: MenuRotation(iClient);
case 1: MenuInvisibility(iClient);
case 2: MenuQuota(iClient);
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню ротации предмета
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuRotation(int iClient)
{
Menu hMenu = new Menu(MenuRotationItem);
hMenu.ExitBackButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Rotation menu");
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate x+");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate x-");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate y+");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate y-");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate z+");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Rotate z-");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Set to 0");
hMenu.AddItem("", g_sTranslite);
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuRotationItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) MenuZones(iClient);
case MenuAction_Select:
{
int iEntity = GetClientAimTarget(iClient, false);
if(iEntity > 0)
{
float fVec[3];
GetEntPropVector(iEntity, Prop_Send, "m_angRotation", fVec);
switch(iItem)
{
case 0: fVec[0] = fVec[0] + 45.0;
case 1: fVec[0] = fVec[0] - 45.0;
case 2: fVec[1] = fVec[1] + 45.0;
case 3: fVec[1] = fVec[1] - 45.0;
case 4: fVec[2] = fVec[2] + 45.0;
case 5: fVec[2] = fVec[2] - 45.0;
case 6: for(int i; i < 3; i++) fVec[i] = 0.0;
}
TeleportEntity(iEntity, NULL_VECTOR, fVec, NULL_VECTOR);
}
else PrintToChat(iClient, "%t", "Item no found");
MenuRotation(iClient);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню видимости предмета
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuInvisibility(int iClient)
{
Menu hMenu = new Menu(MenuInvisibilityItem);
hMenu.ExitBackButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Item transparency menu");
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 100");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 80");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 60");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 40");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 20");
hMenu.AddItem("", g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Visibility is 0");
hMenu.AddItem("", g_sTranslite);
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuInvisibilityItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) MenuZones(iClient);
case MenuAction_Select:
{
int iEntity = GetClientAimTarget(iClient, false);
if(iEntity > 0)
{
int iNum;
switch(iItem)
{
case 0: iNum = 255;
case 1: iNum = 204;
case 2: iNum = 153;
case 3: iNum = 102;
case 4: iNum = 51;
case 5: iNum = 0;
}
SetEntityRenderMode(iEntity, RENDER_TRANSCOLOR);
SetEntityRenderColor(iEntity, 255, 255, 255, iNum);
}
else PrintToChat(iClient, "%t", "Item no found");
MenuInvisibility(iClient);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню квоты
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuQuota(int iClient)
{
int iEntity = GetClientAimTarget(iClient, false);
if(iEntity > 0)
{
char sBuffer[32];
GetEntPropString(iEntity, Prop_Data, "m_iName", sBuffer, sizeof(sBuffer));
if(StrContains(sBuffer, "BZMODELID", true) != -1)
{
char sExplodeBuffer[2][8];
ExplodeString(sBuffer, "_", sExplodeBuffer, 2, 16, false);
Menu hMenu = new Menu(MenuQuotaItem);
hMenu.ExitBackButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Quota menu", StringToInt(sExplodeBuffer[1]));
hMenu.AddItem("++", "+1");
hMenu.AddItem("--", "-1\n ");
hMenu.AddItem("4", "4");
hMenu.AddItem("5", "5");
hMenu.AddItem("8", "8");
hMenu.AddItem("10", "10");
hMenu.AddItem("12", "12");
hMenu.AddItem("14", "14");
hMenu.AddItem("16", "16");
hMenu.AddItem("18", "18");
hMenu.AddItem("20", "20");
hMenu.AddItem("24", "24");
hMenu.AddItem("28", "28");
hMenu.AddItem("32", "32");
hMenu.AddItem("64", "64");
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
else
{
MenuItemSettings(iClient);
PrintToChat(iClient, "%t", "The item was not created by the player");
}
}
else
{
MenuItemSettings(iClient);
PrintToChat(iClient, "%t", "Item no found");
}
}
public int MenuQuotaItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) MenuZones(iClient);
case MenuAction_Select:
{
int iEntity = GetClientAimTarget(iClient, false);
if(iEntity > 0)
{
char sBuffer[32];
GetEntPropString(iEntity, Prop_Data, "m_iName", sBuffer, sizeof(sBuffer));
if(StrContains(sBuffer, "BZMODELID", true) != -1)
{
char sIndex[8]; int iQuota;
hMenu.GetItem(iItem, sIndex, sizeof(sIndex));
if(!StrEqual(sIndex, "++", false) && !StrEqual(sIndex, "--", false))
{
iQuota = StringToInt(sIndex);
FormatEx(sBuffer, sizeof(sBuffer), "BZMODELID%i_%i", iEntity, iQuota);
DispatchKeyValue(iEntity, "targetname", sBuffer);
}
else
{
char sExplodeBuffer[2][8];
ExplodeString(sBuffer, "_", sExplodeBuffer, 2, 16);
if(StrEqual(sIndex, "++", false)) iQuota = StringToInt(sExplodeBuffer[1]) + 1;
else if(StrEqual(sIndex, "--", false)) iQuota = StringToInt(sExplodeBuffer[1]) - 1;
FormatEx(sBuffer, sizeof(sBuffer), "BZMODELID%i_%i", iEntity, iQuota);
DispatchKeyValue(iEntity, "targetname", sBuffer);
}
}
else PrintToChat(iClient, "%t", "The item was not created by the player");
}
else PrintToChat(iClient, "%t", "Item no found");
MenuQuota(iClient);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Меню удаления всех предметов
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuDeleteItems(int iClient)
{
Panel hPanel = new Panel();
SetGlobalTransTarget(iClient);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Menu the confirmation");
hPanel.SetTitle(g_sTranslite);
hPanel.DrawItem("", ITEMDRAW_NOTEXT), hPanel.DrawItem("", ITEMDRAW_NOTEXT), hPanel.DrawItem("", ITEMDRAW_NOTEXT), hPanel.DrawItem("", ITEMDRAW_NOTEXT);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Confirmation yes");
hPanel.DrawItem(g_sTranslite);
FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Confirmation no");
hPanel.DrawItem(g_sTranslite);
hPanel.Send(iClient, MenuDeleteItemsItem, 0);
}
public int MenuDeleteItemsItem(Menu hPanel, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hPanel;
case MenuAction_Select:
{
if(iItem == 5) DeleteSaveItems(iClient);
else PrintToChat(iClient, "%t", "No confirmation, message");
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Вспомогательное меню(настройки)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MenuAuxiliary(int iClient)
{
Menu hMenu = new Menu(MenuAuxiliaryItem);
hMenu.ExitBackButton = true;
SetGlobalTransTarget(iClient);
hMenu.SetTitle("%t", "Auxiliary menu");
switch(g_iMessage)
{
case 0: FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Notification - disabled");
case 1: FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Notification - in hud");
case 2: FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Notification - in chat");
}
hMenu.AddItem("", g_sTranslite);
if(g_bUsePlayers) FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Players check - enable");
else FormatEx(g_sTranslite, sizeof(g_sTranslite), "%t", "Players check - disable");
hMenu.AddItem("", g_sTranslite);
hMenu.Display(iClient, MENU_TIME_FOREVER);
}
public int MenuAuxiliaryItem(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Cancel: if(iItem == MenuCancel_ExitBack) MenuZones(iClient);
case MenuAction_Select:
{
switch(iItem)
{
case 0:
{
switch(g_iMessage)
{
case 0:
{
g_iMessage = 1;
PrintToChat(iClient, "%t", "Notification - in hud, message");
}
case 1:
{
g_iMessage = 2;
PrintToChat(iClient, "%t", "Notification - in chat, message");
}
case 2:
{
g_iMessage = 0;
PrintToChat(iClient, "%t", "Notification - disabled, message");
}
}
}
case 1:
{
if(g_bUsePlayers)
{
g_bUsePlayers = false;
PrintToChat(iClient, "%t", "Players check - disable, message");
}
else
{
g_bUsePlayers = true;
PrintToChat(iClient, "%t", "Players check - enable, message");
}
}
}
MenuAuxiliary(iClient);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Фильтер | Более подробно смотрите в паблике 'MenuItemsItem'
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool TR_Filter(int iEnt, int iMask, any iEntity)
{
return iEnt != iEntity;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Сохранение предметов в конфигурационный файл
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SaveItems(int iClient = -1)
{
KvDeleteItems();
int iIndex = 1, iEntity, iColors[4];
char sBuffer[128], sIndex[4], sExplodeBuffer[2][8]; float fPos[3], fAng[3];
for(int i, num = g_hArray.Length; i < num; i++)
{
iEntity = g_hArray.Get(i);
if(iEntity > 0 && IsValidEntity(iEntity))
{
GetEntPropString(iEntity, Prop_Data, "m_ModelName", sBuffer, sizeof(sBuffer));
GetEntPropVector(iEntity, Prop_Send, "m_vecOrigin", fPos);
GetEntPropVector(iEntity, Prop_Send, "m_angRotation", fAng);
GetEntityRenderColor(iEntity, iColors[0], iColors[1], iColors[2], iColors[3]);
IntToString(iIndex, sIndex, sizeof(sIndex));
g_hKv.JumpToKey(sIndex, true);
g_hKv.SetVector("Pos", fPos);
g_hKv.SetVector("Ang", fAng);
g_hKv.SetNum("Invisibility", iColors[3]);
g_hKv.SetString("Model", sBuffer);
GetEntPropString(iEntity, Prop_Data, "m_iName", sBuffer, sizeof(sBuffer));
ExplodeString(sBuffer, "_", sExplodeBuffer, 2, 16, false);
g_hKv.SetNum("Quota", StringToInt(sExplodeBuffer[1]));
g_hKv.Rewind();
iIndex++;
}
}
GetPathCfg(sBuffer, sizeof(sBuffer));
g_hKv.ExportToFile(sBuffer);
if(iClient != -1)
{
if(g_hArray.Length > 0) PrintToChat(iClient, "%t", "Message saved", iIndex - 1);
else PrintToChat(iClient, "%t", "No items");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Удаляем предметы
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DeleteItems()
{
int iSize = g_hArray.Length;
if(iSize > 0)
{
for(int i, iEntity; i < iSize; i++)
{
iEntity = g_hArray.Get(i);
if(iEntity > 0 && IsValidEntity(iEntity)) AcceptEntityInput(iEntity, "Kill");
}
}
}
void KvDeleteItems()
{
g_hKv.Rewind();
if(g_hKv.GotoFirstSubKey())
{
do
{
g_hKv.DeleteThis();
g_hKv.Rewind();
}
while(g_hKv.GotoFirstSubKey());
}
g_hKv.Rewind();
}
void DeleteSaveItems(int iClient)
{
if(g_hArray.Length > 0)
{
DeleteItems();
g_hArray.Clear();
KvDeleteItems();
char sBuffer[128];
GetPathCfg(sBuffer, sizeof(sBuffer));
g_hKv.ExportToFile(sBuffer);
PrintToChat(iClient, "%t", "Deleted all items save");
}
else PrintToChat(iClient, "%t", "Denial in remove save items");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Спавн предметов
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SpawnItems()
{
g_hArray.Clear();
if(g_hKv.GotoFirstSubKey())
{
char sModel[128]; float fPos[3], fAng[3]; int iColor, iQuota;
do
{
g_hKv.GetVector("Pos", fPos);
g_hKv.GetVector("Ang", fAng);
iColor = g_hKv.GetNum("Invisibility");
g_hKv.GetString("Model", sModel, sizeof(sModel));
iQuota = g_hKv.GetNum("Quota");
CreateItem(sModel, fPos, fAng, iColor, iQuota, _);
}
while(g_hKv.GotoNextKey());
}
g_hKv.Rewind();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Создание предмета и добавляем в массив данные
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CreateItem(const char[] sModel, float fPos[3], float fAng[3], int iColor, int iQuota, int iClient = -1)
{
if(g_bUsePlayers && iQuota <= g_iNowPlayers) return;
if(!IsModelPrecached(sModel)) PrecacheModel(sModel, true);
int iEntity = CreateEntityByName("prop_dynamic_override");
if(iEntity > 0)
{
char sBuffer[32];
FormatEx(sBuffer, sizeof(sBuffer), "BZMODELID%i_%i", iEntity, iQuota);
DispatchKeyValue(iEntity, "targetname", sBuffer);
DispatchKeyValue(iEntity, "model", sModel);
DispatchKeyValue(iEntity, "solid", "6");
DispatchSpawn(iEntity);
TeleportEntity(iEntity, fPos, fAng, NULL_VECTOR);
SetEntityRenderMode(iEntity, RENDER_TRANSCOLOR);
SetEntityRenderColor(iEntity, 255, 255, 255, iColor);
g_hArray.Push(iEntity);
if(iClient != -1) PrintToChat(iClient, "%t", "Item successfully created");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Получаем путь конфигурационного файла (ту что является нашей базой)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void GetPathCfg(char[] sBuffer, int iSize)
{
char sMap[64], sId[64];
GetCurrentMap(sMap, sizeof(sMap));
if(StrContains(sMap, "workshop", false) != -1)
{
GetCurrentWorkshopMap(sMap, sizeof(sMap), sId, sizeof(sId));
FormatEx(sBuffer, iSize, "%s/workshop/%s", g_sCfg, sId);
if(!FileExists(sBuffer)) CreateDirectory(sBuffer, 511);
FormatEx(sBuffer, iSize, "%s/workshop/%s/%s.txt", g_sCfg, sId, sMap);
}
else FormatEx(sBuffer, iSize, "%s/maps/%s.txt", g_sCfg, sMap);
}
void GetCurrentWorkshopMap(char[] sMap, int iSize, char[] sId, int iSizeId)
{
char sBuffer[128], sExplodeBuffer[2][64];
GetCurrentMap(sBuffer, sizeof(sBuffer));
ReplaceString(sBuffer, sizeof(sBuffer), "workshop/", "", false);
Ctrl
Enter
Заметили ошЫбку
Выделите текст и нажмите Ctrl+EnterЧитайте также:
Комментарии (0)
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.