Advertisement
FlacoBey

Untitled

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