Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma newdecls required
- #pragma semicolon 1
- #define CONFIGS_SPAWN "data/builder/items_positions.cfg"
- #define MAXENTITIES 128
- #define MAXLIST 26
- #include <sourcemod>
- #include <sdktools>
- static const char gItemsList[MAXLIST + 11][] =
- {
- "weapon_autoshotgun",
- "weapon_first_aid_kit",
- "weapon_pipe_bomb",
- "weapon_molotov",
- "weapon_rifle",
- "weapon_hunting_rifle",
- "weapon_pain_pills",
- "weapon_pistol",
- "weapon_adrenaline",
- "weapon_smg_mp5",
- "weapon_smg",
- "weapon_smg_silenced",
- "weapon_pumpshotgun",
- "weapon_shotgun_chrome",
- "weapon_rifle_m60",
- "weapon_shotgun_spas",
- "weapon_sniper_military",
- "weapon_rifle_ak47",
- "weapon_rifle_desert",
- "weapon_sniper_awp",
- "weapon_rifle_sg552",
- "weapon_sniper_scout",
- "weapon_grenade_launcher",
- "weapon_pistol_magnum",
- "weapon_vomitjar",
- "weapon_defibrillator",
- "fireaxe",
- "frying_pan",
- "machete",
- "baseball_bat",
- "crowbar",
- "cricket_bat",
- "tonfa",
- "katana",
- "electric_guitar",
- "golfclub",
- "knife"
- };
- static const char gModelsItemsList[MAXLIST + 11][] =
- {
- "models/w_models/weapons/w_autoshot_m4super.mdl", //0
- "models/w_models/weapons/w_eq_Medkit.mdl", //1
- "models/w_models/weapons/w_eq_pipebomb.mdl", //2
- "models/w_models/weapons/w_eq_molotov.mdl", //3
- "models/w_models/weapons/w_rifle_m16a2.mdl", //4
- "models/w_models/weapons/w_sniper_mini14.mdl", //5
- "models/w_models/weapons/w_eq_painpills.mdl", //6
- "models/w_models/weapons/w_pistol_a.mdl", //7
- "models/w_models/weapons/w_eq_adrenaline.mdl", //8
- "models/w_models/weapons/w_smg_mp5.mdl", //9
- "models/w_models/weapons/w_smg_uzi.mdl", //10
- "models/w_models/weapons/w_smg_a.mdl", //11
- "models/w_models/weapons/w_shotgun.mdl", //12
- "models/w_models/weapons/w_pumpshotgun_a.mdl", //13
- "models/w_models/weapons/w_m60.mdl", //14
- "models/w_models/weapons/w_shotgun_spas.mdl", //15
- "models/w_models/weapons/w_sniper_military.mdl", //16
- "models/w_models/weapons/w_rifle_ak47.mdl", //17
- "models/w_models/weapons/w_desert_rifle.mdl", //18
- "models/w_models/weapons/w_sniper_awp.mdl", //19
- "models/w_models/weapons/w_rifle_sg552.mdl", //20
- "models/w_models/weapons/w_sniper_scout.mdl", //21
- "models/w_models/weapons/w_grenade_launcher.mdl", //22
- "models/w_models/weapons/w_desert_eagle.mdl", //23
- "models/w_models/weapons/w_eq_bile_flask.mdl", //24
- "models/w_models/weapons/w_eq_defibrillator.mdl", //25
- "models/weapons/melee/v_fireaxe.mdl", //26
- "models/weapons/melee/v_frying_pan.mdl", //27
- "models/weapons/melee/v_machete.mdl", //28
- "models/weapons/melee/v_bat.mdl", //29
- "models/weapons/melee/v_crowbar.mdl", //30
- "models/weapons/melee/v_cricket_bat.mdl", //31
- "models/weapons/melee/v_tonfa.mdl", //32
- "models/weapons/melee/v_katana.mdl", //33
- "models/weapons/melee/v_electric_guitar.mdl", //34
- "models/weapons/melee/v_golfclub.mdl", //35
- "models/v_models/v_knife_t.mdl" //36
- };
- int g_iBuilds[MAXENTITIES];
- float g_vPos[MAXENTITIES][3], g_vAng[MAXENTITIES][3];
- Menu g_hMainMenu, g_hCategories, g_hRemoveMenu, g_hRotateMenu, g_hMoveMenu, g_hChanceMenu;
- bool g_bLoaded;
- public void OnPluginStart()
- {
- char szBuffer[36];
- g_hCategories = new Menu(VCategoryHandler);
- for(int i; i < sizeof gItemsList; i++)
- {
- Format(szBuffer, sizeof(gItemsList), "%s", gItemsList[i]);
- ReplaceString(szBuffer, sizeof(szBuffer) - 1, "weapon_", "");
- g_hCategories.AddItem("", szBuffer);
- }
- g_hCategories.SetTitle("Меню спавна: Выбор");
- g_hCategories.ExitBackButton = true;
- g_hMainMenu = new Menu(VMainMenuHandler);
- g_hMainMenu.AddItem("", "Создать");
- g_hMainMenu.AddItem("", "Удалить");
- g_hMainMenu.AddItem("", "Повернуть");
- g_hMainMenu.AddItem("", "Передвинуть");
- g_hMainMenu.AddItem("", "Шанс");
- g_hMainMenu.SetTitle("Основне Меню: Выбор");
- g_hMainMenu.ExitButton = true;
- g_hRotateMenu = new Menu(VRotateHandler);
- g_hRotateMenu.AddItem("", "X + 1.0");
- g_hRotateMenu.AddItem("", "Y + 1.0");
- g_hRotateMenu.AddItem("", "Z + 1.0");
- g_hRotateMenu.AddItem("", "X - 1.0");
- g_hRotateMenu.AddItem("", "Y - 1.0");
- g_hRotateMenu.AddItem("", "Z - 1.0");
- g_hRotateMenu.SetTitle("Меню поворота: Выбор");
- g_hRotateMenu.ExitBackButton = true;
- g_hMoveMenu = new Menu(VMoveHandler);
- g_hMoveMenu.AddItem("", "X + 1.0");
- g_hMoveMenu.AddItem("", "Y + 1.0");
- g_hMoveMenu.AddItem("", "Z + 1.0");
- g_hMoveMenu.AddItem("", "X - 1.0");
- g_hMoveMenu.AddItem("", "Y - 1.0");
- g_hMoveMenu.AddItem("", "Z - 1.0");
- g_hMoveMenu.SetTitle("Меню передвижения: Выбор");
- g_hMoveMenu.ExitBackButton = true;
- g_hChanceMenu = new Menu(VChanceHandler);
- g_hChanceMenu.AddItem("", "1");
- g_hChanceMenu.AddItem("", "1/2");
- g_hChanceMenu.AddItem("", "1/4");
- g_hChanceMenu.SetTitle("Меню шанса: Инфо");
- g_hChanceMenu.ExitBackButton = true;
- RegConsoleCmd("sm_b", cBuildMenu);
- }
- public void OnMapStart()
- {
- HookEvent("round_start", eStart, EventHookMode_PostNoCopy);
- LoadModels();
- }
- public Action eStart(Event event, const char[] name, bool dontbroadcast)
- {
- g_bLoaded = false;
- LoadModels();
- }
- public int VChanceHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Cancel )
- {
- if( index == MenuCancel_ExitBack )
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- else if( action == MenuAction_Select )
- {
- int iModel = GetClientAimTarget(client, false);
- int g_iBuild;
- for(int i; i < MAXENTITIES; i++)
- {
- if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
- {
- iModel = EntRefToEntIndex(g_iBuilds[i]);
- g_iBuild = i;
- break;
- }
- }
- if(index == 0)
- SaveModel(g_iBuild, "chance", 1, _, 100);
- else if(index == 1)
- SaveModel(g_iBuild, "chance", 1, _, 50);
- else if(index == 2)
- SaveModel(g_iBuild, "chance", 1, _, 25);
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- }
- public int VMoveHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Cancel )
- {
- if( index == MenuCancel_ExitBack )
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- else if( action == MenuAction_Select )
- {
- int iModel = GetClientAimTarget(client, false);
- int g_iBuild;
- for(int i; i < MAXENTITIES; i++)
- {
- if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
- {
- iModel = EntRefToEntIndex(g_iBuilds[i]);
- g_iBuild = i;
- break;
- }
- }
- float vPos[3];
- GetEntPropVector(iModel, Prop_Send, "m_vecOrigin", vPos);
- if( index == 0 )
- vPos[0] += 1.0;
- else if( index == 1 )
- vPos[1] += 1.0;
- else if( index == 2 )
- vPos[2] += 1.0;
- else if( index == 3 )
- vPos[0] -= 1.0;
- else if( index == 4 )
- vPos[1] -= 1.0;
- else if( index == 5 )
- vPos[2] -= 1.0;
- TeleportEntity(iModel, vPos, NULL_VECTOR, NULL_VECTOR);
- SaveModel(g_iBuild, "vpos", 0, vPos);
- g_hMoveMenu.Display(client, MENU_TIME_FOREVER);
- }
- }
- public int VRotateHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Cancel )
- {
- if( index == MenuCancel_ExitBack )
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- else if( action == MenuAction_Select )
- {
- int iModel = GetClientAimTarget(client, false);
- int g_iBuild;
- for(int i; i < MAXENTITIES; i++)
- {
- if(IsValidEntRef(g_iBuilds[i]) && EntRefToEntIndex(g_iBuilds[i]) == iModel)
- {
- iModel = EntRefToEntIndex(g_iBuilds[i]);
- g_iBuild = i;
- break;
- }
- }
- float vAng[3];
- GetEntPropVector(iModel, Prop_Send, "m_angRotation", vAng);
- if( index == 0 )
- vAng[0] += 1.0;
- else if( index == 1 )
- vAng[1] += 1.0;
- else if( index == 2 )
- vAng[2] += 1.0;
- else if( index == 3 )
- vAng[0] -= 1.0;
- else if( index == 4 )
- vAng[1] -= 1.0;
- else if( index == 5 )
- vAng[2] -= 1.0;
- TeleportEntity(iModel, NULL_VECTOR, vAng, NULL_VECTOR);
- SaveModel(g_iBuild, "vang", 0, vAng);
- g_hRotateMenu.Display(client, MENU_TIME_FOREVER);
- }
- }
- public int VMainMenuHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Select )
- {
- switch (index)
- {
- case 0:
- {
- g_hCategories.Display(client, MENU_TIME_FOREVER);
- }
- case 1:
- {
- DeleteWeapon(client);
- }
- case 2:
- {
- g_hRotateMenu.Display(client, MENU_TIME_FOREVER);
- }
- case 3:
- {
- g_hMoveMenu.Display(client, MENU_TIME_FOREVER);
- }
- case 4:
- {
- g_hChanceMenu.Display(client, MENU_TIME_FOREVER);
- }
- }
- }
- }
- public int VCategoryHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Cancel )
- {
- if( index == MenuCancel_ExitBack )
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- else if( action == MenuAction_Select )
- {
- float vPos[3], vAng[3];
- GetClientEyePosition(client, vPos);
- GetClientEyeAngles(client, vAng);
- Handle hTrace = TR_TraceRayFilterEx(vPos, vAng, MASK_SHOT, RayType_Infinite, TraceFilter);
- if( TR_DidHit(hTrace) )
- {
- float vEndPos[3];
- TR_GetEndPosition(vEndPos, hTrace);
- vEndPos[2] += 5.0;
- GetVectorAngles(vAng, vAng);
- if(index > 25)
- CreateBuild("weapon_melee", gModelsItemsList[index], -1, vEndPos, vAng, client, true, 50);
- else
- CreateBuild(gItemsList[index], gModelsItemsList[index], -1, vEndPos, vAng, client, false, 50);
- }
- g_hCategories.Display(client, MENU_TIME_FOREVER);
- delete hTrace;
- }
- }
- public int VRemoveHandler(Menu menu, MenuAction action, int client, int index)
- {
- if( action == MenuAction_Cancel )
- {
- if( index == MenuCancel_ExitBack )
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- else if( action == MenuAction_Select )
- {
- char szMenuItem[128];
- GetMenuItem(menu, index, szMenuItem, sizeof szMenuItem);
- index = StringToInt(szMenuItem);
- DeleteModel(client, index + 1);
- g_hRemoveMenu.Display(client, MENU_TIME_FOREVER);
- }
- }
- public void OnPluginEnd()
- {
- ResetPlugin();
- }
- void ResetPlugin()
- {
- g_bLoaded = false;
- for( int i = 0; i < MAXENTITIES; i++ )
- {
- g_vPos[i] = view_as<float>({0.0, 0.0, 0.0});
- if( IsValidEntRef(g_iBuilds[i]) )
- AcceptEntityInput(g_iBuilds[i], "Kill");
- g_iBuilds[i] = 0;
- }
- }
- void LoadModels()
- {
- if(g_bLoaded)
- return;
- g_bLoaded = true;
- char sPath[PLATFORM_MAX_PATH];
- BuildPath(Path_SM, sPath, sizeof(sPath), CONFIGS_SPAWN);
- if( !FileExists(sPath) )
- return;
- KeyValues hFile = new KeyValues("items_redactor");
- hFile.ImportFromFile(sPath);
- char sMap[64];
- GetCurrentMap(sMap, sizeof(sMap));
- if( !hFile.JumpToKey(sMap) )
- {
- delete hFile;
- return;
- }
- char sTemp[16], szModel[128], szWeaponClassname[56];
- float vPos[3], vAng[3];
- int iChanceKv, melee;
- for( int i = 0; i <= MAXENTITIES; i++ )
- {
- IntToString(i, sTemp, sizeof(sTemp));
- if( hFile.JumpToKey(sTemp, false) )
- {
- hFile.GetVector("vpos", vPos);
- hFile.GetVector("vang", vAng);
- hFile.GetString("model", szModel, sizeof szModel);
- hFile.GetString("weapon_classname", szWeaponClassname, sizeof szWeaponClassname);
- iChanceKv = hFile.GetNum("chance");
- melee = hFile.GetNum("melee");
- g_vPos[i] = vPos;
- g_vAng[i] = vAng;
- if( vPos[0] != 0.0 && vPos[1] != 0.0 && vPos[2] != 0.0 )
- {
- if(GetRandomInt(1, 100) <= iChanceKv)
- {
- if(melee)
- CreateWeapon(szWeaponClassname, szModel, i, vPos, vAng, 1);
- else
- CreateWeapon(szWeaponClassname, szModel, i, vPos, vAng, 0);
- }
- }
- hFile.GoBack();
- }
- }
- delete hFile;
- }
- // ====================================================================================================
- // CREATING
- // ====================================================================================================
- void CreateBuild(char[] WeaponName, char[] szModel, int index = -1, float vPos[3], float vAng[3], int client = -1, int melee, int iChanceKv)
- {
- if( index == -1 )
- {
- for( int i = 0; i < MAXENTITIES; i++ )
- {
- 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]))
- {
- index = i;
- break;
- }
- }
- }
- if( index == -1 )
- {
- if(client) PrintToChat(client, "[Build Menu] Error: not enough space");
- return;
- }
- CreateWeapon(WeaponName, szModel, index, vPos, vAng, melee);
- SaveModel(index, "vpos", 0, vPos);
- SaveModel(index, "vang", 0, vAng);
- SaveModel(index, "model", 2, _, _, szModel);
- SaveModel(index, "weapon_classname", 2, _, _, WeaponName);
- SaveModel(index, "chance", 1, _, iChanceKv);
- if(melee) SaveModel(index, "melee", 1, _, 1);
- else SaveModel(index, "melee", 1, _, 0);
- g_vPos[index] = vPos;
- g_vAng[index] = vAng;
- }
- void SaveModel(int index, char[] sKey, int state, float vVec[3] = {0.0, 0.0, 0.0}, int iNum = 0, char[] string = "")
- {
- KeyValues hFile = ConfigOpen();
- if( hFile != null )
- {
- char sTemp[64];
- GetCurrentMap(sTemp, sizeof(sTemp));
- if( hFile.JumpToKey(sTemp, true) )
- {
- IntToString(index, sTemp, sizeof(sTemp));
- if( hFile.JumpToKey(sTemp, true) )
- {
- switch (state)
- {
- case 0:
- {
- hFile.SetVector(sKey, vVec);
- }
- case 1:
- {
- hFile.SetNum(sKey, iNum);
- }
- case 2:
- {
- hFile.SetString(sKey, string);
- }
- }
- ConfigSave(hFile);
- }
- }
- delete hFile;
- }
- }
- void DeleteModel(int client, int cfgindex)
- {
- KeyValues hFile = ConfigOpen();
- if( hFile != null )
- {
- char sMap[64];
- GetCurrentMap(sMap, sizeof(sMap));
- if( hFile.JumpToKey(sMap) )
- {
- char sTemp[16];
- IntToString(cfgindex - 1, sTemp, sizeof(sTemp));
- if( hFile.JumpToKey(sTemp) )
- {
- if( IsValidEntRef(g_iBuilds[cfgindex - 1]) )
- AcceptEntityInput(g_iBuilds[cfgindex - 1], "Kill");
- g_iBuilds[cfgindex - 1] = 0;
- hFile.DeleteKey("vpos");
- hFile.DeleteKey("vang");
- hFile.DeleteKey("model");
- hFile.DeleteKey("weapon_classname");
- hFile.DeleteKey("melee");
- hFile.DeleteKey("chance");
- float vPos[3];
- hFile.GetVector("pos", vPos);
- hFile.GoBack();
- if( vPos[0] == 0.0 && vPos[1] == 0.0 && vPos[2] == 0.0 )
- {
- for( int i = cfgindex; i < MAXENTITIES; i++ )
- {
- g_iBuilds[i - 1] = g_iBuilds[i];
- g_iBuilds[i] = 0;
- g_vPos[i - 1] = g_vPos[i];
- g_vPos[i] = view_as<float>({ 0.0, 0.0, 0.0 });
- g_vAng[i - 1] = g_vAng[i];
- g_vAng[i] = view_as<float>({ 0.0, 0.0, 0.0 });
- IntToString(i, sTemp, sizeof(sTemp));
- if( hFile.JumpToKey(sTemp) )
- {
- IntToString(i - 1, sTemp, sizeof(sTemp));
- hFile.SetSectionName(sTemp);
- hFile.GoBack();
- }
- }
- }
- PrintToChat(client, "\x03[Build Menu] \x05 weapon has been deleted.");
- ConfigSave(hFile);
- }
- }
- delete hFile;
- }
- }
- void CreateWeapon(char[] sWeapon, char[] szModel, int index, float vPos[3], float vAng[3], int melee)
- {
- if(!melee)
- {
- int iWeapon = CreateEntityByName(sWeapon);
- if(IsValidEntity(iWeapon))
- {
- DispatchKeyValue(iWeapon, "model", szModel);
- TeleportEntity(iWeapon, vPos, vAng, NULL_VECTOR);
- DispatchSpawn(iWeapon);
- g_iBuilds[index] = EntIndexToEntRef(iWeapon);
- }
- }
- else
- {
- char sExplodeString[MAXLIST][64];
- int iNum;
- iNum = ExplodeString(szModel, "/", sExplodeString, sizeof sExplodeString, sizeof sExplodeString[]);
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "v_", "");
- if(StrContains(sExplodeString[iNum - 1], "knife") > 0)
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], "_t.mdl", "");
- else
- ReplaceString(sExplodeString[iNum - 1], sizeof sExplodeString[], ".mdl", "");
- TrimString(sExplodeString[iNum - 1]);
- SpawnMelee(sExplodeString[iNum - 1], vPos, vAng, index);
- }
- }
- void SpawnMelee(const char[] Melee, float origin[3], float vAng[3], int index)
- {
- int iWeapon = CreateEntityByName("weapon_melee");
- if (IsValidEntity(iWeapon))
- {
- DispatchKeyValue(iWeapon, "melee_script_name", Melee);
- DispatchSpawn(iWeapon);
- TeleportEntity(iWeapon, origin, vAng, NULL_VECTOR);
- char ModelName[128];
- GetEntPropString(iWeapon, Prop_Data, "m_ModelName", ModelName, sizeof ModelName);
- if (StrContains( ModelName, "hunter", false ) != -1)
- AcceptEntityInput(iWeapon, "kill");
- g_iBuilds[index] = EntIndexToEntRef(iWeapon);
- }
- }
- void DeleteWeapon(int client)
- {
- int count;
- char szTemp[4];
- g_hRemoveMenu = new Menu(VRemoveHandler);
- for( int i = 0; i < MAXENTITIES; i++ )
- {
- if( g_vPos[i][0] != 0.0 && g_vPos[i][1] != 0.0 && g_vPos[i][2] != 0.0 && IsValidEntRef(g_iBuilds[i]) == true)
- {
- count++;
- IntToString(i, szTemp, sizeof szTemp);
- g_hRemoveMenu.AddItem(szTemp, szTemp);
- }
- }
- if(!count)
- {
- PrintToChat(client, "\x03[Build Menu] \x05Error: Config didnt have any weapon in config");
- return;
- }
- g_hRemoveMenu.SetTitle("Меню удаления: Инфо");
- g_hRemoveMenu.Display(client, MENU_TIME_FOREVER);
- }
- // ====================================================================================================
- // STUFF
- // ====================================================================================================
- public Action cBuildMenu (int client, int args)
- {
- g_hMainMenu.Display(client, MENU_TIME_FOREVER);
- }
- public bool TraceFilter(int entity, int contentsMask)
- {
- return entity > MaxClients;
- }
- KeyValues ConfigOpen()
- {
- char sPath[PLATFORM_MAX_PATH];
- BuildPath(Path_SM, sPath, sizeof(sPath), "%s", CONFIGS_SPAWN);
- if( !FileExists(sPath) )
- {
- File hCfg = OpenFile(sPath, "w");
- hCfg.WriteLine("");
- delete hCfg;
- }
- KeyValues hFile = new KeyValues("items_redactor");
- if( !hFile.ImportFromFile(sPath) )
- {
- delete hFile;
- return null;
- }
- return hFile;
- }
- void ConfigSave(KeyValues hFile)
- {
- char sPath[PLATFORM_MAX_PATH];
- BuildPath(Path_SM, sPath, sizeof(sPath), "%s", CONFIGS_SPAWN);
- if( !FileExists(sPath) )
- return;
- hFile.Rewind();
- hFile.ExportToFile(sPath);
- }
- bool IsValidEntRef(int entity)
- {
- if( entity && EntRefToEntIndex(entity) != INVALID_ENT_REFERENCE )
- return true;
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement