FlacoBey

Untitled

Mar 5th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. #include <sourcemod>
  2. #include <sdktools>
  3. #include <sdkhooks>
  4.  
  5. #define MAXBOX 12
  6.  
  7. char sCharMap[64];
  8. char sDataFilePath[PLATFORM_MAX_PATH];
  9. KeyValues kv;
  10. int vNum;
  11.  
  12. public OnPluginStart()
  13. {
  14.     PrecacheModel("models/props_junk/wood_crate001a.mdl", true);
  15.    
  16.     RegAdminCmd("sm_boxmenu", BoxRedactor, ADMFLAG_ROOT);
  17.    
  18.     RegAdminCmd("sm_boxcount", BoxCount, ADMFLAG_ROOT);
  19.    
  20.     BuildPath(Path_SM, sDataFilePath, sizeof(sDataFilePath), "data/box_position.ini");
  21.     if (!FileExists(sDataFilePath))
  22.     {
  23.         new Handle:open_path = OpenFile(sDataFilePath, "w");
  24.         WriteFileLine(open_path, "");
  25.         CloseHandle(open_path);
  26.         PrintToServer("Error Code: WSP-EC-01A");
  27.     }
  28. }
  29.  
  30. public OnMapStart()
  31. {
  32.     kv = CreateKeyValues("PosionsFake");
  33.     GetCurrentMap(sCharMap, sizeof(sCharMap));
  34.     if (KvJumpToKey(kv, sCharMap, true))
  35.     {
  36.         KeyValuesToFile(kv, sDataFilePath);
  37.     }
  38.     LoadBox()
  39.     vNum = BoxCountCheck();
  40. }
  41.  
  42. LoadBox()
  43. {
  44.     char sBuffer[32];
  45.     float vPos[3];
  46.    
  47.     for(int i = 0; i < MAXBOX; i++)
  48.     {
  49.         Format(sBuffer, sizeof(sBuffer), "Crate %d", i);
  50.         KvGetVector(kv, sBuffer, vPos)
  51.         if(IsVectorEmpty(vPos))
  52.         {
  53.             new karobka = CreateEntityByName("prop_physics");
  54.             if (karobka > MaxClients)
  55.             {
  56.                 DispatchKeyValueVector(karobka, "origin", vPos);
  57.                 SetEntityModel(karobka, "models/props_junk/wood_crate001a.mdl");
  58.                 DispatchSpawn(karobka);
  59.             }
  60.         }
  61.     }
  62. }
  63.  
  64. public Action:BoxCount(client, args)
  65. {
  66.     PrintToChatAll("Boxes - %i", BoxCountCheck())
  67. }
  68.  
  69. bool:IsVectorEmpty(float pos[3])
  70. {
  71.     for(int i = 0; i < 2; i++)
  72.     {
  73.         if(pos[i] != 0.0)
  74.         {
  75.             return true;
  76.         }
  77.     }
  78.     return false;
  79. }
  80.  
  81. public Action:BoxRedactor(client, args)
  82. {
  83.     DisplayBoxMenu(client)
  84. }
  85.  
  86. public MenuBox(Handle:menu, MenuAction:action, client, symbol)
  87. {
  88.     if (action == MenuAction_Select)
  89.     {
  90.         if(symbol == 0)
  91.         {
  92.             DisplayAddBox(client);
  93.         }
  94.         else if(symbol == 1)
  95.         {
  96.             DisplayRemoveBox(client)
  97.         }
  98.     }
  99.     else if (action == MenuAction_End)
  100.     {      
  101.         CloseHandle(menu);
  102.     }
  103. }
  104.  
  105. DisplayBoxMenu(client)
  106. {  
  107.     new Handle:menu = CreateMenu(MenuBox); 
  108.     SetMenuTitle(menu, "Редактор ящиков:");
  109.     AddMenuItem(menu, "0", "Добавить ящик");
  110.     AddMenuItem(menu, "1", "Удалить");
  111.     DisplayMenu(menu, client, MENU_TIME_FOREVER);
  112. }
  113.  
  114. DisplayAddBox(client)
  115. {
  116.     new Handle:menu = CreateMenu(MenuAddBox);  
  117.     SetMenuTitle(menu, "Добавление ящика:");
  118.     AddMenuItem(menu, "0", "По вашему местоположению.");
  119.     AddMenuItem(menu, "1", "Место, куда направлен ваш прицел.");
  120.     DisplayMenu(menu, client, MENU_TIME_FOREVER);
  121. }
  122.  
  123. DisplayRemoveBox(client)
  124. {
  125.     new Handle:menu2 = CreateMenu(MenuRemoveBox);
  126.     SetMenuTitle(menu2, "Удаление ящиков:");
  127.     float vPos[3]
  128.     char sBuffer[32];
  129.     //char siEx[15];
  130.     int BoxsCount = BoxCountCheck()
  131.    
  132.     if(BoxsCount >= 0)
  133.     {
  134.         for (new i = 0; i <= MAXBOX; i++)
  135.         {
  136.             Format(sBuffer, 16, "Crate %d", i);
  137.             KvGetVector(kv, sBuffer, vPos)
  138.             if(IsVectorEmpty(vPos))
  139.             {
  140.                 AddMenuItem(menu2, sBuffer, sBuffer);
  141.             }
  142.         }
  143.     }
  144.     else
  145.     {
  146.         PrintToChat(client, "Для этой карты нету ящиков.")
  147.         CloseHandle(menu2);
  148.     }
  149.     DisplayMenu(menu2, client, MENU_TIME_FOREVER);
  150. }
  151.  
  152. public MenuAddBox(Handle:menu, MenuAction:action, client, symbol)
  153. {
  154.     if (action == MenuAction_Select)
  155.     {
  156.         int BoxsCount = BoxCountCheck()
  157.         if(BoxsCount < MAXBOX)
  158.         {
  159.             if(symbol == 0)
  160.             {
  161.                 float vPos[3]
  162.                 GetClientAbsOrigin(client, vPos);
  163.                 vPos[2] += 25.0;
  164.                 char sBuffer[32]
  165.                 FormatEx(sBuffer, sizeof(sBuffer), "Crate %i", vNum);
  166.                 KvSetVector(kv, sBuffer, vPos)
  167.                 DisplayAddBox(client);
  168.                 KeyValuesToFile(kv, sDataFilePath);
  169.                 vNum++;
  170.                 PrintToChat(client, "Ящик был добавлен и сохранён.")
  171.             }
  172.             else if(symbol == 1)
  173.             {
  174.                 float vPos[3]
  175.                 GetLookPos(client, vPos)
  176.                 vPos[2] += 20;
  177.                 char sBuffer[32]
  178.                 FormatEx(sBuffer, sizeof(sBuffer), "Crate %i", vNum);
  179.                 KvSetVector(kv, sBuffer, vPos)
  180.                 DisplayAddBox(client);
  181.                 KeyValuesToFile(kv, sDataFilePath);
  182.                 vNum++;
  183.                 PrintToChat(client, "Ящик был добавлен и сохранён.")
  184.             }
  185.         }
  186.         else
  187.         {
  188.             PrintToChat(client, "Достигнут лимит ящиков.")
  189.         }
  190.     }
  191.     else if (action == MenuAction_End)
  192.     {      
  193.         CloseHandle(menu);
  194.     }
  195. }
  196.  
  197. public MenuRemoveBox(Handle:menu2, MenuAction:action, client, symbol)
  198. {
  199.     if (action == MenuAction_End)
  200.     {
  201.         CloseHandle(menu2);
  202.         return;
  203.     }
  204.     if (action != MenuAction_Select) return;
  205.    
  206.     char sMenuEx[16];
  207.     GetMenuItem(menu2, symbol, sMenuEx, 16)
  208.     PrintToChatAll("%s", sMenuEx)
  209.     KvDeleteKey(kv, sMenuEx)
  210.     vNum--;
  211.     KeyValuesToFile(kv, sDataFilePath);
  212. }
  213.  
  214.  
  215. public BoxCountCheck()
  216. {
  217.     float vPos[3];
  218.     KvRewind(kv);
  219.     int iNum = 0;
  220.     char sBuffer[32];
  221.     if (KvJumpToKey(kv, sCharMap))
  222.     {
  223.         for(int i = 0; i < MAXBOX; i++)
  224.         {
  225.             Format(sBuffer, sizeof(sBuffer), "Crate %d", i+1);
  226.             KvGetVector(kv, sBuffer, vPos)
  227.             if(IsVectorEmpty(vPos))
  228.             {
  229.                 iNum++;
  230.             }
  231.         }
  232.     }
  233.     return iNum;
  234. }
  235.  
  236. stock GetLookPos(client, Float:v[3])
  237. {
  238.      decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace;
  239.      GetClientEyePosition(client, EyePosition);
  240.      GetClientEyeAngles(client, EyeAngles);
  241.      h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, GetLookPos_Filter, client);
  242.      TR_GetEndPosition(v, h_trace);
  243.      CloseHandle(h_trace);
  244. }
  245.  
  246. public bool:GetLookPos_Filter(ent, mask, any:client)
  247. {
  248.       return client != ent;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment