Advertisement
FlacoBey

Untitled

Jul 17th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.21 KB | None | 0 0
  1. #pragma newdecls required
  2. #pragma semicolon 1
  3.  
  4. #define CONFIGS_SPAWN       "data/builder/items_positions.cfg"
  5.  
  6. #define MAXENTITIES 128
  7. #define MAXLIST 26
  8.  
  9. #include <sourcemod>
  10. #include <sdktools>
  11.  
  12. static const char gItemsList[MAXLIST + 11][] =
  13. {
  14.     "weapon_autoshotgun",      
  15.     "weapon_first_aid_kit",    
  16.     "weapon_pipe_bomb",        
  17.     "weapon_molotov",          
  18.     "weapon_rifle",            
  19.     "weapon_hunting_rifle",    
  20.     "weapon_pain_pills",       
  21.     "weapon_pistol",           
  22.     "weapon_adrenaline",       
  23.     "weapon_smg_mp5",          
  24.     "weapon_smg",              
  25.     "weapon_smg_silenced",     
  26.     "weapon_pumpshotgun",      
  27.     "weapon_shotgun_chrome",   
  28.     "weapon_rifle_m60",        
  29.     "weapon_shotgun_spas",     
  30.     "weapon_sniper_military",  
  31.     "weapon_rifle_ak47",       
  32.     "weapon_rifle_desert",     
  33.     "weapon_sniper_awp",       
  34.     "weapon_rifle_sg552",      
  35.     "weapon_sniper_scout",     
  36.     "weapon_grenade_launcher"
  37.     "weapon_pistol_magnum",    
  38.     "weapon_vomitjar",         
  39.     "weapon_defibrillator",    
  40.     "fireaxe",
  41.     "frying_pan",
  42.     "machete",
  43.     "baseball_bat",
  44.     "crowbar",
  45.     "cricket_bat",
  46.     "tonfa",
  47.     "katana",
  48.     "electric_guitar",
  49.     "golfclub",
  50.     "knife"
  51. };
  52.  
  53. static const char gModelsItemsList[MAXLIST + 11][] =
  54. {
  55.     "models/w_models/weapons/w_autoshot_m4super.mdl",   //0
  56.     "models/w_models/weapons/w_eq_Medkit.mdl",          //1
  57.     "models/w_models/weapons/w_eq_pipebomb.mdl",        //2
  58.     "models/w_models/weapons/w_eq_molotov.mdl",         //3
  59.     "models/w_models/weapons/w_rifle_m16a2.mdl",        //4
  60.     "models/w_models/weapons/w_sniper_mini14.mdl",      //5
  61.     "models/w_models/weapons/w_eq_painpills.mdl",       //6
  62.     "models/w_models/weapons/w_pistol_a.mdl",           //7
  63.     "models/w_models/weapons/w_eq_adrenaline.mdl",      //8
  64.     "models/w_models/weapons/w_smg_mp5.mdl",            //9
  65.     "models/w_models/weapons/w_smg_uzi.mdl",            //10
  66.     "models/w_models/weapons/w_smg_a.mdl",              //11
  67.     "models/w_models/weapons/w_shotgun.mdl",            //12
  68.     "models/w_models/weapons/w_pumpshotgun_a.mdl",      //13
  69.     "models/w_models/weapons/w_m60.mdl",                //14
  70.     "models/w_models/weapons/w_shotgun_spas.mdl",       //15
  71.     "models/w_models/weapons/w_sniper_military.mdl",    //16
  72.     "models/w_models/weapons/w_rifle_ak47.mdl",         //17
  73.     "models/w_models/weapons/w_desert_rifle.mdl",       //18
  74.     "models/w_models/weapons/w_sniper_awp.mdl",         //19
  75.     "models/w_models/weapons/w_rifle_sg552.mdl",        //20
  76.     "models/w_models/weapons/w_sniper_scout.mdl",       //21
  77.     "models/w_models/weapons/w_grenade_launcher.mdl",   //22
  78.     "models/w_models/weapons/w_desert_eagle.mdl",       //23
  79.     "models/w_models/weapons/w_eq_bile_flask.mdl",      //24
  80.     "models/w_models/weapons/w_eq_defibrillator.mdl",   //25
  81.     "models/weapons/melee/v_fireaxe.mdl",               //26
  82.     "models/weapons/melee/v_frying_pan.mdl",            //27
  83.     "models/weapons/melee/v_machete.mdl",               //28
  84.     "models/weapons/melee/v_bat.mdl",                   //29
  85.     "models/weapons/melee/v_crowbar.mdl",               //30
  86.     "models/weapons/melee/v_cricket_bat.mdl",           //31
  87.     "models/weapons/melee/v_tonfa.mdl",                 //32
  88.     "models/weapons/melee/v_katana.mdl",                //33
  89.     "models/weapons/melee/v_electric_guitar.mdl",       //34
  90.     "models/weapons/melee/v_golfclub.mdl",              //35
  91.     "models/v_models/v_knife_t.mdl"                     //36
  92. };
  93.  
  94. int g_iBuilds[MAXENTITIES];
  95. float g_vPos[MAXENTITIES][3], g_vAng[MAXENTITIES][3];
  96. Menu g_hMainMenu, g_hCategories, g_hRemoveMenu, g_hRotateMenu, g_hMoveMenu, g_hChanceMenu;
  97. bool g_bLoaded;
  98.  
  99.  
  100. public void OnPluginStart()
  101. {
  102.     char szBuffer[36];
  103.     g_hCategories = new Menu(VCategoryHandler);
  104.     for(int i; i < sizeof gItemsList; i++)
  105.     {
  106.         Format(szBuffer, sizeof(gItemsList), "%s", gItemsList[i]);
  107.         ReplaceString(szBuffer, sizeof(szBuffer) - 1, "weapon_", "");
  108.         g_hCategories.AddItem("", szBuffer);
  109.     }
  110.  
  111.     g_hCategories.SetTitle("Меню спавна: Выбор");
  112.     g_hCategories.ExitBackButton = true;
  113.    
  114.     g_hMainMenu = new Menu(VMainMenuHandler);
  115.     g_hMainMenu.AddItem("", "Создать");
  116.     g_hMainMenu.AddItem("", "Удалить");
  117.     g_hMainMenu.AddItem("", "Повернуть");
  118.     g_hMainMenu.AddItem("", "Передвинуть");
  119.     g_hMainMenu.AddItem("", "Шанс");
  120.     g_hMainMenu.SetTitle("Основне Меню: Выбор");
  121.     g_hMainMenu.ExitButton = true;
  122.    
  123.     g_hRotateMenu = new Menu(VRotateHandler);
  124.     g_hRotateMenu.AddItem("", "X + 1.0");
  125.     g_hRotateMenu.AddItem("", "Y + 1.0");
  126.     g_hRotateMenu.AddItem("", "Z + 1.0");
  127.     g_hRotateMenu.AddItem("", "X - 1.0");
  128.     g_hRotateMenu.AddItem("", "Y - 1.0");
  129.     g_hRotateMenu.AddItem("", "Z - 1.0");
  130.     g_hRotateMenu.SetTitle("Меню поворота: Выбор");
  131.     g_hRotateMenu.ExitBackButton = true;
  132.    
  133.     g_hMoveMenu = new Menu(VMoveHandler);
  134.     g_hMoveMenu.AddItem("", "X + 1.0");
  135.     g_hMoveMenu.AddItem("", "Y + 1.0");
  136.     g_hMoveMenu.AddItem("", "Z + 1.0");
  137.     g_hMoveMenu.AddItem("", "X - 1.0");
  138.     g_hMoveMenu.AddItem("", "Y - 1.0");
  139.     g_hMoveMenu.AddItem("", "Z - 1.0");
  140.     g_hMoveMenu.SetTitle("Меню передвижения: Выбор");
  141.     g_hMoveMenu.ExitBackButton = true;
  142.    
  143.     g_hChanceMenu = new Menu(VChanceHandler);
  144.     g_hChanceMenu.AddItem("", "1");
  145.     g_hChanceMenu.AddItem("", "1/2");
  146.     g_hChanceMenu.AddItem("", "1/4");
  147.     g_hChanceMenu.SetTitle("Меню шанса: Инфо");
  148.     g_hChanceMenu.ExitBackButton = true;
  149.    
  150.     RegConsoleCmd("sm_b", cBuildMenu);
  151. }
  152.  
  153. public void OnMapStart()
  154. {
  155.     HookEvent("round_start", eStart, EventHookMode_PostNoCopy);
  156.     LoadModels();
  157. }
  158.  
  159. public Action eStart(Event event, const char[] name, bool dontbroadcast)
  160. {
  161.     g_bLoaded = false;
  162.     LoadModels();
  163. }
  164.  
  165. public int VChanceHandler(Menu menu, MenuAction action, int client, int index)
  166. {
  167.     if( action == MenuAction_Cancel )
  168.     {
  169.         if( index == MenuCancel_ExitBack )
  170.             g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  171.     }
  172.     else if( action == MenuAction_Select )
  173.     {
  174.         int iModel = GetClientAimTarget(client, false);
  175.         int g_iBuild;
  176.         for(int i; i < MAXENTITIES; i++)
  177.         {
  178.             if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
  179.             {
  180.                 iModel = EntRefToEntIndex(g_iBuilds[i]);
  181.                 g_iBuild = i;
  182.                 break;
  183.             }
  184.         }
  185.        
  186.         if(index == 0)
  187.             SaveModel(g_iBuild, "chance", 1, _, 100);
  188.         else if(index == 1)
  189.             SaveModel(g_iBuild, "chance", 1, _, 50);
  190.         else if(index == 2)
  191.             SaveModel(g_iBuild, "chance", 1, _, 25);
  192.         g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  193.     }
  194. }
  195.  
  196. public int VMoveHandler(Menu menu, MenuAction action, int client, int index)
  197. {
  198.     if( action == MenuAction_Cancel )
  199.     {
  200.         if( index == MenuCancel_ExitBack )
  201.             g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  202.     }
  203.     else if( action == MenuAction_Select )
  204.     {
  205.    
  206.         int iModel = GetClientAimTarget(client, false);
  207.         int g_iBuild;
  208.         for(int i; i < MAXENTITIES; i++)
  209.         {
  210.             if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
  211.             {
  212.                 iModel = EntRefToEntIndex(g_iBuilds[i]);
  213.                 g_iBuild = i;
  214.                 break;
  215.             }
  216.         }
  217.        
  218.         float vPos[3];
  219.         GetEntPropVector(iModel, Prop_Send, "m_vecOrigin", vPos);
  220.  
  221.         if( index == 0 )
  222.             vPos[0] += 1.0;
  223.         else if( index == 1 )
  224.             vPos[1] += 1.0;
  225.         else if( index == 2 )
  226.             vPos[2] += 1.0;
  227.         else if( index == 3 )
  228.             vPos[0] -= 1.0;
  229.         else if( index == 4 )
  230.             vPos[1] -= 1.0;
  231.         else if( index == 5 )
  232.             vPos[2] -= 1.0;
  233.            
  234.         TeleportEntity(iModel, vPos, NULL_VECTOR, NULL_VECTOR);
  235.         SaveModel(g_iBuild, "vpos", 0, vPos);
  236.         g_hMoveMenu.Display(client, MENU_TIME_FOREVER);
  237.     }
  238. }
  239.  
  240. public int VRotateHandler(Menu menu, MenuAction action, int client, int index)
  241. {
  242.     if( action == MenuAction_Cancel )
  243.     {
  244.         if( index == MenuCancel_ExitBack )
  245.             g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  246.     }
  247.     else if( action == MenuAction_Select )
  248.     {
  249.         int iModel = GetClientAimTarget(client, false);
  250.         int g_iBuild;
  251.         for(int i; i < MAXENTITIES; i++)
  252.         {
  253.             if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
  254.             {
  255.                 iModel = EntRefToEntIndex(g_iBuilds[i]);
  256.                 g_iBuild = i;
  257.                 break;
  258.             }
  259.         }
  260.        
  261.         float vAng[3];
  262.         GetEntPropVector(iModel, Prop_Send, "m_angRotation", vAng);
  263.  
  264.         if( index == 0 )
  265.             vAng[0] += 1.0;
  266.         else if( index == 1 )
  267.             vAng[1] += 1.0;
  268.         else if( index == 2 )
  269.             vAng[2] += 1.0;
  270.         else if( index == 3 )
  271.             vAng[0] -= 1.0;
  272.         else if( index == 4 )
  273.             vAng[1] -= 1.0;
  274.         else if( index == 5 )
  275.             vAng[2] -= 1.0;
  276.            
  277.         TeleportEntity(iModel, NULL_VECTOR, vAng, NULL_VECTOR);
  278.         SaveModel(g_iBuild, "vang", 0, vAng);
  279.        
  280.         g_hRotateMenu.Display(client, MENU_TIME_FOREVER);
  281.     }
  282. }
  283.  
  284. public int VMainMenuHandler(Menu menu, MenuAction action, int client, int index)
  285. {
  286.     if( action == MenuAction_Select )
  287.     {
  288.         switch (index)
  289.         {
  290.             case 0:
  291.             {
  292.                 g_hCategories.Display(client, MENU_TIME_FOREVER);
  293.             }
  294.             case 1:
  295.             {
  296.                 DeleteWeapon(client);
  297.             }
  298.             case 2:
  299.             {
  300.                 g_hRotateMenu.Display(client, MENU_TIME_FOREVER);
  301.             }
  302.             case 3:
  303.             {
  304.                 g_hMoveMenu.Display(client, MENU_TIME_FOREVER);
  305.             }
  306.             case 4:
  307.             {
  308.                 g_hChanceMenu.Display(client, MENU_TIME_FOREVER);
  309.             }
  310.         }
  311.     }
  312. }
  313.  
  314. public int VCategoryHandler(Menu menu, MenuAction action, int client, int index)
  315. {
  316.     if( action == MenuAction_Cancel )
  317.     {
  318.         if( index == MenuCancel_ExitBack )
  319.             g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  320.     }
  321.     else if( action == MenuAction_Select )
  322.     {
  323.         float vPos[3], vAng[3];
  324.        
  325.         GetClientEyePosition(client, vPos);
  326.         GetClientEyeAngles(client, vAng);
  327.         Handle hTrace = TR_TraceRayFilterEx(vPos, vAng, MASK_SHOT, RayType_Infinite, TraceFilter);
  328.         if( TR_DidHit(hTrace) )
  329.         {
  330.             float vEndPos[3];
  331.             TR_GetEndPosition(vEndPos, hTrace);
  332.             vEndPos[2] += 5.0;
  333.             GetVectorAngles(vAng, vAng);
  334.             if(index > 25)
  335.                 CreateBuild("weapon_melee", gModelsItemsList[index], -1, vEndPos, vAng, client, true, 50);
  336.             else
  337.                 CreateBuild(gItemsList[index], gModelsItemsList[index], -1, vEndPos, vAng, client, false, 50);
  338.         }
  339.         g_hCategories.Display(client, MENU_TIME_FOREVER);
  340.         delete hTrace;
  341.     }
  342. }
  343.  
  344.  
  345. public int VRemoveHandler(Menu menu, MenuAction action, int client, int index)
  346. {
  347.     if( action == MenuAction_Cancel )
  348.     {
  349.         if( index == MenuCancel_ExitBack )
  350.             g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  351.     }
  352.     else if( action == MenuAction_Select )
  353.     {
  354.         char szMenuItem[128];
  355.         GetMenuItem(menu, index, szMenuItem, sizeof szMenuItem);
  356.         index = StringToInt(szMenuItem);
  357.         DeleteModel(client, index + 1);
  358.         g_hRemoveMenu.Display(client, MENU_TIME_FOREVER);
  359.     }
  360. }
  361.  
  362. public void OnPluginEnd()
  363. {
  364.     ResetPlugin();
  365. }
  366.  
  367. void ResetPlugin()
  368. {
  369.     g_bLoaded = false;
  370.  
  371.     for( int i = 0; i < MAXENTITIES; i++ )
  372.     {
  373.         g_vPos[i] = view_as<float>({0.0, 0.0, 0.0});
  374.  
  375.         if( IsValidEntRef(g_iBuilds[i]) )
  376.             AcceptEntityInput(g_iBuilds[i], "Kill");
  377.         g_iBuilds[i] = 0;
  378.     }
  379. }
  380.  
  381. void LoadModels()
  382. {
  383.     if(g_bLoaded)
  384.         return;
  385.     g_bLoaded = true;
  386.    
  387.     char sPath[PLATFORM_MAX_PATH];
  388.     BuildPath(Path_SM, sPath, sizeof(sPath), CONFIGS_SPAWN);
  389.     if( !FileExists(sPath) )
  390.         return;
  391.  
  392.     KeyValues hFile = new KeyValues("items_redactor");
  393.     hFile.ImportFromFile(sPath);
  394.  
  395.     char sMap[64];
  396.     GetCurrentMap(sMap, sizeof(sMap));
  397.     if( !hFile.JumpToKey(sMap) )
  398.     {
  399.         delete hFile;
  400.         return;
  401.     }
  402.  
  403.     char sTemp[16], szModel[128], szWeaponClassname[56];
  404.     float vPos[3], vAng[3];
  405.     int iChanceKv, melee;
  406.     for( int i = 0; i <= MAXENTITIES; i++ )
  407.     {
  408.         IntToString(i, sTemp, sizeof(sTemp));
  409.  
  410.         if( hFile.JumpToKey(sTemp, false) )
  411.         {
  412.             hFile.GetVector("vpos", vPos);
  413.             hFile.GetVector("vang", vAng);
  414.             hFile.GetString("model", szModel, sizeof szModel);
  415.             hFile.GetString("weapon_classname", szWeaponClassname, sizeof szWeaponClassname);
  416.             iChanceKv = hFile.GetNum("chance");
  417.             melee = hFile.GetNum("melee");
  418.             g_vPos[i] = vPos;
  419.             g_vAng[i] = vAng;
  420.  
  421.             if( vPos[0] != 0.0 && vPos[1] != 0.0 && vPos[2] != 0.0 )
  422.             {
  423.                 if(GetRandomInt(1, 100) <= iChanceKv)
  424.                 {
  425.                     if(melee)
  426.                         CreateWeapon(szWeaponClassname, szModel, i, vPos, vAng, 1);
  427.                     else
  428.                         CreateWeapon(szWeaponClassname, szModel, i, vPos, vAng, 0);
  429.                 }
  430.             }
  431.             hFile.GoBack();
  432.         }
  433.     }
  434.  
  435.     delete hFile;
  436. }
  437.  
  438. // ====================================================================================================
  439. //                  CREATING
  440. // ====================================================================================================
  441.  
  442. void CreateBuild(char[] WeaponName, char[] szModel, int index = -1, float vPos[3], float vAng[3], int client = -1, int melee, int iChanceKv)
  443. {
  444.     if( index == -1 )
  445.     {
  446.         for( int i = 0; i < MAXENTITIES; i++ )
  447.         {
  448.             if(g_vAng[i][0] == 0.0 && g_vAng[i][1] == 0.0 && g_vAng[i][2] == 0.0 && g_vPos[i][0] == 0.0 && g_vPos[i][1] == 0.0 && g_vPos[i][2] == 0.0 && !IsValidEntRef(g_iBuilds[i]))
  449.             {
  450.                 index = i;
  451.                 break;
  452.             }
  453.         }
  454.     }
  455.     if( index == -1 )
  456.     {
  457.         if(client) PrintToChat(client, "[Build Menu] Error: not enough space");
  458.         return;
  459.     }
  460.    
  461.     CreateWeapon(WeaponName, szModel, index, vPos, vAng, melee);
  462.  
  463.     SaveModel(index, "vpos", 0, vPos);
  464.     SaveModel(index, "vang", 0, vAng);
  465.     SaveModel(index, "model", 2, _, _, szModel);
  466.     SaveModel(index, "weapon_classname", 2, _, _, WeaponName);
  467.     SaveModel(index, "chance", 1, _, iChanceKv);
  468.     if(melee) SaveModel(index, "melee", 1, _, 1);
  469.     else SaveModel(index, "melee", 1, _, 0);
  470.     g_vPos[index] = vPos;
  471.     g_vAng[index] = vAng;
  472. }
  473.  
  474. void SaveModel(int index, char[] sKey, int state, float vVec[3] = {0.0, 0.0, 0.0}, int iNum = 0, char[] string = "")
  475. {
  476.     KeyValues hFile = ConfigOpen();
  477.  
  478.     if( hFile != null )
  479.     {
  480.         char sTemp[64];
  481.         GetCurrentMap(sTemp, sizeof(sTemp));
  482.         if( hFile.JumpToKey(sTemp, true) )
  483.         {
  484.             IntToString(index, sTemp, sizeof(sTemp));
  485.  
  486.             if( hFile.JumpToKey(sTemp, true) )
  487.             {
  488.                 switch (state)
  489.                 {
  490.                     case 0:
  491.                     {
  492.                         hFile.SetVector(sKey, vVec);
  493.                     }
  494.                     case 1:
  495.                     {
  496.                         hFile.SetNum(sKey, iNum);
  497.                     }
  498.                     case 2:
  499.                     {
  500.                         hFile.SetString(sKey, string);
  501.                     }
  502.                 }
  503.                
  504.                 ConfigSave(hFile);
  505.             }
  506.         }
  507.  
  508.         delete hFile;
  509.     }
  510. }
  511.  
  512. void DeleteModel(int client, int cfgindex)
  513. {
  514.     KeyValues hFile = ConfigOpen();
  515.  
  516.     if( hFile != null )
  517.     {
  518.         char sMap[64];
  519.         GetCurrentMap(sMap, sizeof(sMap));
  520.  
  521.         if( hFile.JumpToKey(sMap) )
  522.         {
  523.             char sTemp[16];
  524.             IntToString(cfgindex - 1, sTemp, sizeof(sTemp));
  525.             if( hFile.JumpToKey(sTemp) )
  526.             {
  527.                 if( IsValidEntRef(g_iBuilds[cfgindex - 1]) )
  528.                     AcceptEntityInput(g_iBuilds[cfgindex - 1], "Kill");
  529.                 g_iBuilds[cfgindex - 1] = 0;
  530.  
  531.                 hFile.DeleteKey("vpos");
  532.                 hFile.DeleteKey("vang");
  533.                 hFile.DeleteKey("model");
  534.                 hFile.DeleteKey("weapon_classname");
  535.                 hFile.DeleteKey("melee");
  536.                 hFile.DeleteKey("chance");
  537.  
  538.                 float vPos[3];
  539.                 hFile.GetVector("pos", vPos);
  540.  
  541.  
  542.                 hFile.GoBack();
  543.  
  544.                 if( vPos[0] == 0.0 && vPos[1] == 0.0 && vPos[2] == 0.0 )
  545.                 {
  546.                     for( int i = cfgindex; i < MAXENTITIES; i++ )
  547.                     {
  548.                         g_iBuilds[i - 1] = g_iBuilds[i];
  549.                         g_iBuilds[i] = 0;
  550.  
  551.                         g_vPos[i - 1] = g_vPos[i];
  552.                         g_vPos[i] = view_as<float>({ 0.0, 0.0, 0.0 });
  553.  
  554.                         g_vAng[i - 1] = g_vAng[i];
  555.                         g_vAng[i] = view_as<float>({ 0.0, 0.0, 0.0 });
  556.  
  557.                         IntToString(i, sTemp, sizeof(sTemp));
  558.                         if( hFile.JumpToKey(sTemp) )
  559.                         {
  560.                             IntToString(i - 1, sTemp, sizeof(sTemp));
  561.                             hFile.SetSectionName(sTemp);
  562.                             hFile.GoBack();
  563.                         }
  564.                     }
  565.                 }
  566.                 PrintToChat(client, "\x03[Build Menu] \x05 weapon has been deleted.");
  567.                 ConfigSave(hFile);
  568.  
  569.             }
  570.         }
  571.  
  572.         delete hFile;
  573.     }
  574. }
  575.  
  576. void CreateWeapon(char[] sWeapon, char[] szModel, int index, float vPos[3], float vAng[3], int melee)
  577. {
  578.     if(!melee)
  579.     {
  580.         int iWeapon = CreateEntityByName(sWeapon);
  581.         if(IsValidEntity(iWeapon))
  582.         {
  583.             DispatchKeyValue(iWeapon, "model", szModel);
  584.             TeleportEntity(iWeapon, vPos, vAng, NULL_VECTOR);
  585.             DispatchSpawn(iWeapon);
  586.             g_iBuilds[index] = EntIndexToEntRef(iWeapon);
  587.         }
  588.     }
  589.     else
  590.     {
  591.         char sExplodeString[MAXLIST][64];
  592.         int iNum;
  593.        
  594.         iNum = ExplodeString(szModel, "/", sExplodeString, sizeof sExplodeString, sizeof sExplodeString[]);
  595.         ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "v_", "");
  596.         if(StrContains(sExplodeString[iNum - 1], "knife") > 0)
  597.             ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "_t.mdl", "");
  598.         else
  599.             ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], ".mdl", "");
  600.         TrimString(sExplodeString[iNum - 1]);
  601.         SpawnMelee(sExplodeString[iNum - 1], vPos, vAng, index);
  602.     }
  603. }
  604.  
  605. void SpawnMelee(const char[] Melee, float origin[3], float vAng[3], int index)
  606. {
  607.     int iWeapon = CreateEntityByName("weapon_melee");
  608.  
  609.     if (IsValidEntity(iWeapon))
  610.     {
  611.         DispatchKeyValue(iWeapon, "melee_script_name", Melee);
  612.  
  613.         DispatchSpawn(iWeapon);
  614.  
  615.         TeleportEntity(iWeapon, origin, vAng, NULL_VECTOR);
  616.        
  617.         char ModelName[128];
  618.         GetEntPropString(iWeapon, Prop_Data, "m_ModelName", ModelName, sizeof ModelName);
  619.        
  620.         if (StrContains( ModelName, "hunter", false ) != -1)
  621.             AcceptEntityInput(iWeapon, "kill");
  622.        
  623.         g_iBuilds[index] = EntIndexToEntRef(iWeapon);
  624.     }
  625. }
  626.  
  627. void DeleteWeapon(int client)
  628. {
  629.     int count;
  630.     char szTemp[4];
  631.     g_hRemoveMenu = new Menu(VRemoveHandler);
  632.    
  633.     for( int i = 0; i < MAXENTITIES; i++ )
  634.     {
  635.         if( g_vPos[i][0] != 0.0 && g_vPos[i][1] != 0.0 && g_vPos[i][2] != 0.0 && IsValidEntRef(g_iBuilds[i]) == true)
  636.         {
  637.             count++;
  638.             IntToString(i, szTemp, sizeof szTemp);
  639.             g_hRemoveMenu.AddItem(szTemp, szTemp);
  640.         }
  641.     }
  642.    
  643.     if(!count)
  644.     {
  645.         PrintToChat(client, "\x03[Build Menu] \x05Error: Config didnt have any weapon in config");
  646.         return;
  647.     }
  648.    
  649.     g_hRemoveMenu.SetTitle("Меню удаления: Инфо");
  650.     g_hRemoveMenu.Display(client, MENU_TIME_FOREVER);
  651. }
  652.  
  653. // ====================================================================================================
  654. //                  STUFF
  655. // ====================================================================================================
  656.  
  657. public Action cBuildMenu (int client, int args)
  658. {
  659.     g_hMainMenu.Display(client, MENU_TIME_FOREVER);
  660. }
  661.  
  662. public bool TraceFilter(int entity, int contentsMask)
  663. {
  664.     return entity > MaxClients;
  665. }
  666.  
  667. KeyValues ConfigOpen()
  668. {
  669.     char sPath[PLATFORM_MAX_PATH];
  670.     BuildPath(Path_SM, sPath, sizeof(sPath), "%s", CONFIGS_SPAWN);
  671.  
  672.     if( !FileExists(sPath) )
  673.     {
  674.         File hCfg = OpenFile(sPath, "w");
  675.         hCfg.WriteLine("");
  676.         delete hCfg;
  677.     }
  678.  
  679.     KeyValues hFile = new KeyValues("items_redactor");
  680.     if( !hFile.ImportFromFile(sPath) )
  681.     {
  682.         delete hFile;
  683.         return null;
  684.     }
  685.  
  686.     return hFile;
  687. }
  688.  
  689. void ConfigSave(KeyValues hFile)
  690. {
  691.     char sPath[PLATFORM_MAX_PATH];
  692.     BuildPath(Path_SM, sPath, sizeof(sPath), "%s", CONFIGS_SPAWN);
  693.  
  694.     if( !FileExists(sPath) )
  695.         return;
  696.  
  697.     hFile.Rewind();
  698.     hFile.ExportToFile(sPath);
  699. }
  700.  
  701. bool IsValidEntRef(int entity)
  702. {
  703.     if( entity && EntRefToEntIndex(entity) != INVALID_ENT_REFERENCE )
  704.         return true;
  705.     return false;
  706. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement