BlockingZones  [На сервере]

Плагины и дополнения / Plugins and add-ons

Модераторы: Dame-danners, Longipongeoos

Аватар пользователя
Longipongeoos
Сообщений: 199
Зарегистрирован: 12 апр 2017, 16:50

BlockingZones  [На сервере]

Сообщение Longipongeoos » 04 июн 2024, 10:33

Версия 1.3
Описание
Позволяет расставить предметы на карте | Запретить проход в какую-то зону, например на вышку awp_lego_2 > поставьте забор и выключите подсчет игроков.
Добавить новые предметы(пропы) можно в файле...

addons/sourcemod/configs/blockingzones/

items_csgo.ini - для игры CS:GO
items_css.ini - для игры CSS

Код: Выбрать все

"Items"
{
    "Сетка" // Имя отображаемое в меню
    {
        "model"        "models/props_c17/fence03a.mdl" // Путь к файлу
    }
}

addons/sourcemod/configs/тип_карт/название_карты.txt - ваша база, где хранятся ваши сохраненные предметы на конкретной карте.

Код: Выбрать все

"1" // Порядковый номер
    {
        "Pos"        "-241.504898 2270.163818 -127.968765" // Позиция в мире
        "Ang"        "-180.000000 0.000000 -89.000000" // Углы
        "Invisibility"        "255" // Прозрачность 255 - виден полностью, 0 - невидим
        "Model"        "models/props_c17/fence03a.mdl" // Сохраненный предмет на координатах написанные выше
        "Quota"        "10" // Значение онлайна, если онлайн игроков будет выше или равен - предмет не будет создан.
    }

Флаг доступа к команде: ROOT > Z
Изменить можно на строке 34.

Пример

Код: Выбрать все

RegAdminCmd("sm_bz", BzCmd, ADMFLAG_ROOT); // z

Код: Выбрать все

RegAdminCmd("sm_bz", BzCmd, ADMFLAG_BAN); // d

ADMFLAG_RESERVATION (ФЛАГ A) - Доступ к резервному слоту
ADMFLAG_GENERIC (ФЛАГ B) - Добавление и изменение администраторов
ADMFLAG_KICK (ФЛАГ C) - Кик любых игроков
ADMFLAG_BAN (ФЛАГ D) - Бан любых игроков
ADMFLAG_UNBAN (ФЛАГ E) - Разбан любых игроков
ADMFLAG_SLAY (ФЛАГ F) - Слей и слеп любых игроков
ADMFLAG_CHANGEMAP (ФЛАГ G) - Смена карты или типа карты
ADMFLAG_CVAR (ФЛАГ H) - Изменение дополнительных переменных
ADMFLAG_CONFIG (ФЛАГ I) - Загрузка дополнительных конфигов
ADMFLAG_CHAT (ФЛАГ J) - Специальные привилегии чата
ADMFLAG_VOTE (ФЛАГ K) - Запуск и создание голосований
ADMFLAG_PASSWORD (ФЛАГ L) - Создания пароля на сервер
ADMFLAG_RCON (ФЛАГ M) - Использование RCON команд
ADMFLAG_CHEATS (ФЛАГ N) - Изменение читерских команд
ADMFLAG_ROOT (ФЛАГ Z) - Полный доступ
ADMFLAG_CUSTOM1 (ФЛАГ O) - Дополнительный флаг 1
ADMFLAG_CUSTOM2 (ФЛАГ P) - Дополнительный флаг 2
ADMFLAG_CUSTOM3 (ФЛАГ Q) - Дополнительный флаг 3
ADMFLAG_CUSTOM4 (ФЛАГ R) - Дополнительный флаг 4
ADMFLAG_CUSTOM5 (ФЛАГ S) - Дополнительный флаг 5
ADMFLAG_CUSTOM6 (ФЛАГ T) - Дополнительный флаг 6

Требования:
sourcemod
Переменные

Код: Выбрать все

   
// 1 - включить | 0 - выключить плагин
ActiveBZ "1"

// 1 - включить | 0 - выключить уведомление в худе
MessageBZ "1"

// Кол-во игроков необходимое для того чтобы разблокировать заблокированные зоны | Минимально - 4 / Максимально - 64 игрока
PlayersBZ "10"

// 1 - включить | 0 - выключит подсчет игроков
// Для тех кто хочет просто заблокировать зоны на карте
// Переменные PlayersBZ и MessageBZ будут неактивными
UsePlayersBZ "1"

Команды:
Команда вызова меню: sm_bz, !bz
Исходный код

Код: Выбрать все

#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;
static const char g_sCfg[] = "addons/sourcemod/configs/blockingzones";

ArrayList g_hArray;

bool g_bActive, g_bUsePlayers;
int g_iPlayers, g_iNowPlayers, g_iMessage;
char g_sTranslite[256];

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Загрузка плагина | Регистрация событий, команды(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()
{
   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);
   ExplodeString(sBuffer, "/", sExplodeBuffer, 2, 64);
   
   strcopy(sMap, iSize, sExplodeBuffer[1]);
   strcopy(sId, iSizeId, sExplodeBuffer[0]);
}
Вложения
BlockingZones.7z
(25.21 KiB) Загружено 259 раз

Вернуться в «SourceMod»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 1 гость