#include #include #include #pragma semicolon 1 #pragma newdecls required #define DEBUG 0 #define GETVERSION "3.4" #define ARRAY_SIZE 5000 #define MAX_PATHS 30 #define DESIRED_ADM_FLAGS ADMFLAG_UNBAN //Edit here the flags to fit your needs! #define RouteType_Easy 0 #define RouteType_Medium 1 #define RouteType_Hard 2 char FolderNames[][] = { "addons/stripper", "addons/stripper/maps", "addons/stripper/routing", "addons/stripper/plugin_cache" }; TopMenu g_TopMenuHandle; int g_iCategory[MAXPLAYERS+1] = 0; int g_iSubCategory[MAXPLAYERS+1] = 0; int g_iFileCategory[MAXPLAYERS+1] = 0; int g_iMoveCategory[MAXPLAYERS+1] = 0; int g_iLastObject[MAXPLAYERS+1] = -1; int g_iLastGrabbedObject[MAXPLAYERS+1] = -1; bool g_bSpawned[ARRAY_SIZE] = false; bool g_bGrabbed[ARRAY_SIZE] = false; bool g_bGrab[MAXPLAYERS+1] = false; bool g_bUnsolid[ARRAY_SIZE] = false; bool g_bLoaded = false; float g_vecEntityAngles[ARRAY_SIZE][3]; float g_vecLastEntityAngles[MAXPLAYERS+1][3]; char g_sPath[128]; // Global variables to hold menu position int g_iRotateMenuPosition[MAXPLAYERS+1] = 0; int g_iMoveMenuPosition[MAXPLAYERS+1] = 0; int g_iVehiclesMenuPosition[MAXPLAYERS+1] = 0; int g_iFoliageMenuPosition[MAXPLAYERS+1] = 0; int g_iFurnitureMenuPosition[MAXPLAYERS+1] = 0; int g_iFurnishingsMenuPosition[MAXPLAYERS+1] = 0; int g_iAppliancesMenuPosition[MAXPLAYERS+1] = 0; int g_iBuildingsMenuPosition[MAXPLAYERS+1] = 0; int g_iScaffoldingMenuPosition[MAXPLAYERS+1] = 0; int g_iDoorsMenuPosition[MAXPLAYERS+1] = 0; int g_iWindowsMenuPosition[MAXPLAYERS+1] = 0; int g_iLightsMenuPosition[MAXPLAYERS+1] = 0; int g_iSignssMenuPosition[MAXPLAYERS+1] = 0; int g_iFencingMenuPosition[MAXPLAYERS+1] = 0; int g_iRailingMenuPosition[MAXPLAYERS+1] = 0; int g_iStairsMenuPosition[MAXPLAYERS+1] = 0; int g_iOfficeMenuPosition[MAXPLAYERS+1] = 0; int g_iStreetsMenuPosition[MAXPLAYERS+1] = 0; int g_iFairgroundsMenuPosition[MAXPLAYERS+1] = 0; int g_iMallMenuPosition[MAXPLAYERS+1] = 0; int g_iConstructionMenuPosition[MAXPLAYERS+1] = 0; int g_iGeneralMiscMenuPosition[MAXPLAYERS+1] = 0; int g_iExteriorMiscMenuPosition[MAXPLAYERS+1] = 0; int g_iInteriorMiscMenuPosition[MAXPLAYERS+1] = 0; int g_iDebrisMenuPosition[MAXPLAYERS+1] = 0; int g_iJunkMenuPosition[MAXPLAYERS+1] = 0; int g_iPipesMenuPosition[MAXPLAYERS+1] = 0; int g_iBodiesGenericMenuPosition[MAXPLAYERS+1] = 0; int g_iBodiesSwampMenuPosition[MAXPLAYERS+1] = 0; int g_iBodiesSugarMillMenuPosition[MAXPLAYERS+1] = 0; int g_iBodiesCemetaryMenuPosition[MAXPLAYERS+1] = 0; int g_iInfectedMenuPosition[MAXPLAYERS+1] = 0; int g_iSkyboxMenuPosition[MAXPLAYERS+1] = 0; ConVar g_cvarPhysics; ConVar g_cvarDynamic; ConVar g_cvarStatic; ConVar g_cvarVehicles; ConVar g_cvarFoliage; ConVar g_cvarFurniture; ConVar g_cvarFurnishings; ConVar g_cvarAppliances; ConVar g_cvarBuildings; ConVar g_cvarScaffolding; ConVar g_cvarDoors; ConVar g_cvarWindows; ConVar g_cvarLights; ConVar g_cvarSigns; ConVar g_cvarFencing; ConVar g_cvarRailing; ConVar g_cvarStairs; ConVar g_cvarOffice; ConVar g_cvarStreets; ConVar g_cvarFairgrounds; ConVar g_cvarMall; ConVar g_cvarConstruction; ConVar g_cvarGeneralMisc; ConVar g_cvarExteriorMisc; ConVar g_cvarInteriorMisc; ConVar g_cvarDebris; ConVar g_cvarJunk; ConVar g_cvarPipes; ConVar g_cvarBodiesGeneric; ConVar g_cvarBodiesSwamp; ConVar g_cvarBodiesSugarMill; ConVar g_cvarBodiesCemetary; ConVar g_cvarInfected; ConVar g_cvarSkybox; ConVar g_cvarLog; ConVar g_cvarAutoload; ConVar g_cvarAutoloadType; public Plugin myinfo = { name = "[L4D1/2] Objects Spawner", author = "honorcode23 & $atanic $pirit & HarryPotter", description = "Let admins spawn any kind of objects", version = GETVERSION, url = "http://forums.alliedmods.net/showthread.php?p=1186503" } bool L4D2Version; public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { EngineVersion test = GetEngineVersion(); if( test == Engine_Left4Dead ) { L4D2Version = false; } else if( test == Engine_Left4Dead2 ) { L4D2Version = true; } else { strcopy(error, err_max, "Plugin only supports Left 4 Dead 1 & 2."); return APLRes_SilentFailure; } return APLRes_Success; } public void OnPluginStart() { LoadTranslations("l4d2_spawn_props.phrases"); CreateConVar("l4d2_spawn_props_version", GETVERSION, "Version of the Plugin", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY); //Version g_cvarPhysics = CreateConVar("l4d2_spawn_props_physics", "1", "Enable the Physics Objects in the menu"); g_cvarDynamic = CreateConVar("l4d2_spawn_props_dynamic", "1", "Enable the Dynamic (Non-solid) Objects in the menu"); g_cvarStatic = CreateConVar("l4d2_spawn_props_static", "1", "Enable the Static (Solid) Objects in the menu"); g_cvarVehicles = CreateConVar("l4d2_spawn_props_category_vehicles", "1", "Enable the Vehicles category"); g_cvarFoliage = CreateConVar("l4d2_spawn_props_category_foliage", "1", "Enable the Foliage category"); g_cvarFurniture = CreateConVar("l4d2_spawn_props_category_furniture", "1", "Enable the Furniture category"); g_cvarFurnishings = CreateConVar("l4d2_spawn_props_category_furnishings", "1", "Enable the Furnishings category"); g_cvarAppliances = CreateConVar("l4d2_spawn_props_category_appliances", "1", "Enable the appliances category"); g_cvarBuildings = CreateConVar("l4d2_spawn_props_category_buildings", "1", "Enable the Buildings category"); g_cvarScaffolding = CreateConVar("l4d2_spawn_props_category_scaffolding", "1", "Enable the Scaffolding category"); g_cvarDoors = CreateConVar("l4d2_spawn_props_category_doors", "1", "Enable the Doors category"); g_cvarWindows = CreateConVar("l4d2_spawn_props_category_windows", "1", "Enable the Windows category"); g_cvarLights = CreateConVar("l4d2_spawn_props_category_lights", "1", "Enable the Lights category"); g_cvarSigns = CreateConVar("l4d2_spawn_props_category_signs", "1", "Enable the Signs category"); g_cvarFencing = CreateConVar("l4d2_spawn_props_category_fencing", "1", "Enable the Fencing category"); g_cvarRailing = CreateConVar("l4d2_spawn_props_category_railing", "1", "Enable the Railing category"); g_cvarStairs = CreateConVar("l4d2_spawn_props_category_stairs", "1", "Enable the Stairs category"); g_cvarOffice = CreateConVar("l4d2_spawn_props_category_office", "1", "Enable the Office category"); g_cvarStreets = CreateConVar("l4d2_spawn_props_category_streets", "1", "Enable the Streets category"); g_cvarFairgrounds = CreateConVar("l4d2_spawn_props_category_fairgrounds", "1", "Enable the Fairgrounds category"); g_cvarMall = CreateConVar("l4d2_spawn_props_category_mall", "1", "Enable the Mall category"); g_cvarConstruction = CreateConVar("l4d2_spawn_props_category_construction", "1", "Enable the Construction category"); g_cvarGeneralMisc = CreateConVar("l4d2_spawn_props_category_generalmisc", "1", "Enable the GeneralMisc category"); g_cvarExteriorMisc = CreateConVar("l4d2_spawn_props_category_exteriormisc", "1", "Enable the ExteriorMisc category"); g_cvarInteriorMisc = CreateConVar("l4d2_spawn_props_category_interiormisc", "1", "Enable the InteriorMisc category"); g_cvarDebris = CreateConVar("l4d2_spawn_props_category_debris", "1", "Enable the Debris category"); g_cvarJunk = CreateConVar("l4d2_spawn_props_category_junk", "1", "Enable the Junk category"); g_cvarPipes = CreateConVar("l4d2_spawn_props_category_pipes", "1", "Enable the Pipes category"); g_cvarBodiesGeneric = CreateConVar("l4d2_spawn_props_category_bodiesgeneric", "1", "Enable the BodiesGeneric category"); g_cvarBodiesSwamp = CreateConVar("l4d2_spawn_props_category_bodiesswamp", "1", "Enable the BodiesSwamp category"); g_cvarBodiesSugarMill = CreateConVar("l4d2_spawn_props_category_bodiessugarmill", "1", "Enable the BodiesSugarMill category"); g_cvarBodiesCemetary = CreateConVar("l4d2_spawn_props_category_bodiescemetary", "1", "Enable the BodiesCemetary category"); g_cvarInfected = CreateConVar("l4d2_spawn_props_category_infected", "1", "Enable the Infected category"); g_cvarSkybox = CreateConVar("l4d2_spawn_props_category_skybox", "1", "Enable the Skybox category"); g_cvarLog = CreateConVar("l4d2_spawn_props_log_actions", "0", "Log if an admin spawns an object?"); g_cvarAutoload = CreateConVar("l4d2_spawn_props_autoload", "0", "Enable the plugin to auto load the cache?"); g_cvarAutoloadType = CreateConVar("l4d2_spawn_props_autoload_different", "1", "Should the paths be different for the teams or not?"); RegAdminCmd("sm_spawnprop", CmdSpawnProp, DESIRED_ADM_FLAGS, "Spawns an object with the given information"); RegAdminCmd("sm_savemap", CmdSaveMap, DESIRED_ADM_FLAGS, "Save all the spawned object in a stripper file"); RegAdminCmd("sm_prop_rotate", CmdRotate, DESIRED_ADM_FLAGS, "Rotates the last spawned object with the desired angles"); RegAdminCmd("sm_prop_removelast", CmdRemoveLast, DESIRED_ADM_FLAGS, "Remove last spawned object"); RegAdminCmd("sm_prop_removelook", CmdRemoveLook, DESIRED_ADM_FLAGS, "Remove the looking object"); RegAdminCmd("sm_prop_removeall", CmdRemoveAll, DESIRED_ADM_FLAGS, "Remove all objects"); RegAdminCmd("sm_prop_move", CmdMove, DESIRED_ADM_FLAGS, "Move an object with the desired movement type"); RegAdminCmd("sm_prop_setang", CmdSetAngles, DESIRED_ADM_FLAGS, "Forces an object angles"); RegAdminCmd("sm_prop_setpos", CmdSetPosition, DESIRED_ADM_FLAGS, "Sets the last object position"); RegAdminCmd("sm_debugprop", CmdDebugProp, ADMFLAG_ROOT, "DEBUG"); AutoExecConfig(true, "l4d2_spawn_props"); TopMenu topMenu; if (LibraryExists("adminmenu") && ((topMenu = GetAdminTopMenu()) != null)) { OnAdminMenuReady(topMenu); } //DEV RegAdminCmd("sm_spload", CmdLoad, DESIRED_ADM_FLAGS, "Load map"); //Events if(L4D2Version) { HookEvent("survival_round_start", Event_SurvivalRoundStart); HookEvent("scavenge_round_start", Event_ScavengeRoundStart); } HookEvent("round_start_post_nav", Event_RoundStart); HookEvent("round_end", Event_RoundEnd); //Create required folders BuildFileDirectories(); } public Action CmdDebugProp(int client, int args) { char name[256]; int Object = g_iLastObject[client]; if(Object > 0 && IsValidEntity(Object)) { GetEntPropString(Object, Prop_Data, "m_iName", name, sizeof(name)); PrintToChat(client, "prop: %s", name); } return Plugin_Handled; } public void Event_SurvivalRoundStart(Event hEvent, const char[] sEventName, bool bDontBroadcast) { if(g_cvarAutoload.BoolValue && !g_bLoaded) { g_bLoaded = true; SpawnObjects(); } } public void Event_ScavengeRoundStart(Event hEvent, const char[] sEventName, bool bDontBroadcast) { LogSpawn("Scavenge Round Has Started"); if(g_cvarAutoload.BoolValue && !g_bLoaded) { g_bLoaded = true; SpawnObjects(); } } public void Event_RoundStart(Event hEvent, const char[] sEventName, bool bDontBroadcast) { if(g_cvarAutoload.BoolValue && g_cvarAutoloadType.BoolValue) { GetRandomMapPath(g_sPath, sizeof(g_sPath)); } LogSpawn("Normal Round Has Started"); if(g_cvarAutoload.BoolValue && !g_bLoaded) { g_bLoaded = true; SpawnObjects(); } } public void Event_RoundEnd(Event hEvent, const char[] sEventName, bool bDontBroadcast) { g_bLoaded = false; } public void OnMapEnd() { g_bLoaded = false; } public void OnMapStart() { for(int i=MaxClients; i < ARRAY_SIZE; i++) { g_bSpawned[i] = false; g_bUnsolid[i] = false; g_vecEntityAngles[i][0] = 0.0; g_vecEntityAngles[i][1] = 0.0; g_vecEntityAngles[i][2] = 0.0; } if(g_cvarAutoload.BoolValue && !g_cvarAutoloadType.BoolValue) { GetRandomMapPath(g_sPath, sizeof(g_sPath)); } } public Action CmdSpawnProp(int client, int args) { if(args < 3) { PrintToChat(client, "[SM] Usage: sm_spawnprop [static | dynamic | physics] [cursor | origin]"); return Plugin_Handled; } char arg1[256]; char arg2[256]; char arg3[256]; GetCmdArg(1, arg1, sizeof(arg1)); GetCmdArg(2, arg2, sizeof(arg2)); GetCmdArg(3, arg3, sizeof(arg3)); char model[256]; strcopy(model, sizeof(model), arg1); if(!IsModelPrecached(model)) { if(PrecacheModel(model) <= 0) { PrintToChat(client, "[SM] There was a problem spawning the selected model [ERROR: Invalid Model]"); return Plugin_Handled; } } if(StrContains(arg2, "static") >= 0) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); SetEntProp(prop, Prop_Send, "m_nSolidType", 6); if(strcmp(arg3, "cursor") == 0) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, client); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(client, "[SM] Vector out of world geometry. Spawning on current position instead"); } } else if(strcmp(arg3, "origin") == 0) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); } else { PrintToChat(client, "[SM] Invalid spawn method specified. Use: [cursor | origin]"); return Plugin_Handled; } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[client][0] = VecAngles[0]; g_vecLastEntityAngles[client][1] = VecAngles[1]; g_vecLastEntityAngles[client][2] = VecAngles[2]; g_iLastObject[client] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(client, name, sizeof(name)); LogSpawn("%s spawned a static object with model <%s>", name, model); } else if(StrContains(arg2, "dynamic") >= 0) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); if(strcmp(arg3, "cursor") == 0 ) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, client); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(client, "[SM] Vector out of world geometry. Spawning on current position instead"); } } else if(strcmp(arg3, "origin")== 0) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); } else { PrintToChat(client, "[SM] Invalid spawn method specified. Use: [cursor | origin]"); return Plugin_Handled; } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[client][0] = VecAngles[0]; g_vecLastEntityAngles[client][1] = VecAngles[1]; g_vecLastEntityAngles[client][2] = VecAngles[2]; g_iLastObject[client] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; g_bUnsolid[prop] = true; char name[256]; GetClientName(client, name, sizeof(name)); LogSpawn("%s spawned a dynamic object with model <%s>", name, model); } else if(StrContains(arg2, "physics") >= 0) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_physics_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); if(strcmp(arg3, "cursor")== 0) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, client); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(client, "[SM] Vector out of world geometry. Spawning on current position instead"); } } else if(strcmp(arg3, "origin")== 0) { GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); } else { PrintToChat(client, "[SM] Invalid spawn method specified. Use: [cursor | origin]"); return Plugin_Handled; } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[client][0] = VecAngles[0]; g_vecLastEntityAngles[client][1] = VecAngles[1]; g_vecLastEntityAngles[client][2] = VecAngles[2]; g_iLastObject[client] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(client, name, sizeof(name)); LogSpawn("%s spawned a physics object with model <%s>", name, model); } else { PrintToChat(client, "[SM] Invalid render mode. Use: [static | dynamic | physics]"); return Plugin_Handled; } return Plugin_Handled; } //Admin Menu ready public void OnAdminMenuReady(Handle topmenu) { if (topmenu == g_TopMenuHandle) { return; } g_TopMenuHandle = view_as(topmenu); TopMenuObject menu_category_prop = g_TopMenuHandle.AddCategory("Object Spawner", Category_Handler); if (menu_category_prop != INVALID_TOPMENUOBJECT) { g_TopMenuHandle.AddItem("sm_spdelete", AdminMenu_Delete, menu_category_prop, "sm_spdelete", DESIRED_ADM_FLAGS); //Delete g_TopMenuHandle.AddItem("sm_spedit", AdminMenu_Edit, menu_category_prop, "sm_spedit", DESIRED_ADM_FLAGS); //Edit g_TopMenuHandle.AddItem("sm_spspawn", AdminMenu_Spawn, menu_category_prop, "sm_spspawn", DESIRED_ADM_FLAGS); //Spawn g_TopMenuHandle.AddItem("sm_spsave", AdminMenu_Save, menu_category_prop, "sm_spsave", DESIRED_ADM_FLAGS); //Save g_TopMenuHandle.AddItem("sm_spload", AdminMenu_Load, menu_category_prop, "sm_spload", DESIRED_ADM_FLAGS); //Load } } //Admin Category Name public int Category_Handler(TopMenu topmenu, TopMenuAction action, TopMenuObject topobj_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayTitle) { Format(buffer, maxlength, Translate(param, "%t", "Select a task:")); } else if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, "Spawn Objects (Old)"); } } /* ////////////////////////////////////////////////////////////////////////////| D E L E T E M E N U | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void AdminMenu_Delete(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, Translate(param, "%t", "Delete Object")); } else if(action == TopMenuAction_SelectOption) { BuildDeleteMenu(param); } } Menu BuildDeleteMenu(int client) { Menu menu = new Menu(MenuHandler_Delete); menu.SetTitle("%T", "Select the delete task", client); menu.AddItem("sm_spdeleteall", Translate(client, "%t", "Delete All Objects")); menu.AddItem("sm_spdeletelook", Translate(client, "%t", "Delete Looking Object")); menu.AddItem("sm_spdeletelast", Translate(client, "%t", "Delete Last Object")); menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } Menu BuildDeleteAllAskMenu(int client) { Menu menu = new Menu(MenuHandler_DA_Ask); menu.SetTitle("%T", "Are you sure(Delete All)?", client); menu.AddItem("sm_spyes", Translate(client, "%t", "Yes")); menu.AddItem("sm_spno", Translate(client, "%t", "No")); menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_DA_Ask(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spyes")== 0) { DeleteAllProps(); PrintToChat(param1, "[SM] %T", "Successfully deleted all spawned objects", param1); } else { PrintToChat(param1, "[SM] %T", "Canceled", param1); } BuildDeleteMenu(param1); } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_Delete(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spdeleteall")== 0) { BuildDeleteAllAskMenu(param1); PrintToChat(param1, "[SM] %T", "delete all the spawned objects?", param1); } else if(strcmp(menucmd, "sm_spdeletelook")== 0) { DeleteLookingEntity(param1); BuildDeleteMenu(param1); } else if(strcmp(menucmd, "sm_spdeletelast")== 0) { DeleteLastProp(param1); BuildDeleteMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } /* ////////////////////////////////////////////////////////////////////////////| E D I T M E N U | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void AdminMenu_Edit(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, Translate(param, "%t", "Edit Object")); } else if(action == TopMenuAction_SelectOption) { BuildEditPropMenu(param); } } /* ////////////////////////////////////////////////////////////////////////////| S P A W N M E N U | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void AdminMenu_Spawn(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, Translate(param, "%t", "Spawn Objects")); } else if(action == TopMenuAction_SelectOption) { ConVar cheats = FindConVar("sm_cheats"); if(cheats != null && !cheats.BoolValue) { ReplyToCommand(param, "Set sm_cheats to 1 to use the prop spawner"); return; } BuildSpawnMenu(param); } } Menu BuildSpawnMenu(int client) { Menu menu = new Menu(MenuHandler_Spawn); menu.SetTitle("%T", "Select the spawn method", client); if(g_cvarPhysics.BoolValue) { menu.AddItem("sm_spawnpc", Translate(client, "%t", "Spawn Physics On Cursor")); menu.AddItem("sm_spawnpo", Translate(client, "%t", "Spawn Physics On Origin")); } if(g_cvarDynamic.BoolValue) { menu.AddItem("sm_spawndc", Translate(client, "%t", "Spawn Non-solid On Cursor")); menu.AddItem("sm_spawndo", Translate(client, "%t", "Spawn Non-solid On Origin")); } if(g_cvarStatic.BoolValue) { menu.AddItem("sm_spawnsc", Translate(client, "%t", "Spawn Solid On Cursor")); menu.AddItem("sm_spawnso", Translate(client, "%t", "Spawn Solid On Origin")); } menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_Spawn(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spawnpc")== 0) { BuildPhysicsCursorMenu(param1); } else if(strcmp(menucmd, "sm_spawnpo")== 0) { BuildPhysicsPositionMenu(param1); } else if(strcmp(menucmd, "sm_spawndc")== 0) { BuildDynamicCursorMenu(param1); } else if(strcmp(menucmd, "sm_spawndo")== 0) { BuildDynamicPositionMenu(param1); } else if(strcmp(menucmd, "sm_spawnsc")== 0) { BuildStaticCursorMenu(param1); } else if(strcmp(menucmd, "sm_spawnso")== 0) { BuildStaticPositionMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } /* ////////////////////////////////////////////////////////////////////////////| S A V E M E N U | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void AdminMenu_Save(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, Translate(param, "%t", "Save Objects")); } else if(action == TopMenuAction_SelectOption) { BuildSaveMenu(param); } } Menu BuildSaveMenu(int client) { Menu menu = new Menu(MenuHandler_Save); menu.SetTitle("%T", "Select The Save Method", client); menu.AddItem("sm_spsavestripper", Translate(client, "%t", "Save Stripper File")); menu.AddItem("sm_spsaverouting", Translate(client, "%t", "Save Routing File")); menu.AddItem("sm_spsaveplugin", Translate(client, "%t", "Save Spawn Objects File")); menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } Menu BuildRoutingMenu(int client) { Menu menu = new Menu(MenuHandler_PathDiff); menu.SetTitle("%T", "Select Path Difficulty", client); menu.AddItem("sm_speasy", Translate(client, "%t", "Easy Path")); menu.AddItem("sm_spmedium", Translate(client, "%t", "Medium Path")); menu.AddItem("sm_sphard", Translate(client, "%t", "Hard Path")); menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_PathDiff(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_speasy")== 0) { SaveRoutingPath(param1, RouteType_Easy); } else if(strcmp(menucmd, "sm_spmedium")== 0) { SaveRoutingPath(param1, RouteType_Medium); } else if(strcmp(menucmd, "sm_sphard")== 0) { SaveRoutingPath(param1, RouteType_Hard); } BuildSaveMenu(param1); } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_Save(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spsavestripper")== 0) { SaveMapStripper(param1); BuildSaveMenu(param1); } else if(strcmp(menucmd, "sm_spsaverouting")== 0) { BuildRoutingMenu(param1); } else if(strcmp(menucmd, "sm_spsaveplugin")== 0) { SavePluginProps(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } /* ////////////////////////////////////////////////////////////////////////////| L O A D M E N U | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void AdminMenu_Load(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength) { if(action == TopMenuAction_DisplayOption) { Format(buffer, maxlength, Translate(param, "%t", "Load Objects")); } else if(action == TopMenuAction_SelectOption) { BuildLoadAskMenu(param); PrintToChat(param, "[SM] %T", "load the map data cache?", param); } } Menu BuildLoadAskMenu(int client) { Menu menu = new Menu(MenuHandler_Load_Ask); menu.SetTitle("%T", "Are you sure?", client); menu.AddItem("sm_spyes", Translate(client, "%t", "Yes")); menu.AddItem("sm_spno", Translate(client, "%t", "No")); menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } Menu BuildLoadPropsMenu(int client) { Menu menu = new Menu(MenuHandler_Load_Props); menu.SetTitle("%T", "Choose a map number please", client); char buffer[16]; char buffer2[16]; for(int i=1; i <= MAX_PATHS; i++) { Format(buffer, sizeof(buffer), "map%i", i); Format(buffer2, sizeof(buffer2), "Map %i", i); menu.AddItem(buffer, buffer2); } menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_Load_Props(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); ReplaceString(menucmd, sizeof(menucmd), "map", "", false); int number = StringToInt(menucmd); LoadPluginProps(param1, number); g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_Load_Ask(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spyes")== 0) { BuildLoadPropsMenu(param1); } else { PrintToChat(param1, "[SM] %T", "Canceled", param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } /* ////////////////////////////////////////////////////////////////////////////| Build Secondary Menus | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ Menu BuildPhysicsCursorMenu(int client) { Menu menu = new Menu(MenuHandler_PhysicsCursor); CheckSecondaryMenuCategories(menu, client); } Menu BuildPhysicsPositionMenu(int client) { Menu menu = new Menu(MenuHandler_PhysicsPosition); CheckSecondaryMenuCategories(menu, client); } Menu BuildDynamicCursorMenu(int client) { Menu menu = new Menu(MenuHandler_DynamicCursor); CheckSecondaryMenuCategories(menu, client); } Menu BuildDynamicPositionMenu(int client) { Menu menu = new Menu(MenuHandler_DynamicPosition); CheckSecondaryMenuCategories(menu, client); } Menu BuildStaticCursorMenu(int client) { Menu menu = new Menu(MenuHandler_StaticCursor); CheckSecondaryMenuCategories(menu, client); } Menu BuildStaticPositionMenu(int client) { Menu menu = new Menu(MenuHandler_StaticPosition); CheckSecondaryMenuCategories(menu, client); } Menu CheckSecondaryMenuCategories(Menu menu, int client) { if(g_cvarVehicles.BoolValue) { menu.AddItem("vehicles", Translate(client, "%t", "Vehicles")); } if(g_cvarFoliage.BoolValue) { menu.AddItem("foliage", Translate(client, "%t", "Foliage")); } if(g_cvarFurniture.BoolValue) { menu.AddItem("furniture", Translate(client, "%t", "Furniture")); } if(g_cvarFurnishings.BoolValue) { menu.AddItem("furnishings", Translate(client, "%t", "Furnishings")); } if(g_cvarAppliances.BoolValue) { menu.AddItem("appliances", Translate(client, "%t", "Appliances")); } if(g_cvarBuildings.BoolValue) { menu.AddItem("buildings", Translate(client, "%t", "Buildings")); } if(g_cvarScaffolding.BoolValue) { menu.AddItem("scaffolding", Translate(client, "%t", "Scaffolding")); } if(g_cvarDoors.BoolValue) { menu.AddItem("doors", Translate(client, "%t", "Doors")); } if(g_cvarWindows.BoolValue) { menu.AddItem("windows", Translate(client, "%t", "Windows")); } if(g_cvarLights.BoolValue) { menu.AddItem("lights", Translate(client, "%t", "Lights")); } if(g_cvarSigns.BoolValue) { menu.AddItem("signs", Translate(client, "%t", "Signs")); } if(g_cvarFencing.BoolValue) { menu.AddItem("fencing", Translate(client, "%t", "Fencing")); } if(g_cvarRailing.BoolValue) { menu.AddItem("railing", Translate(client, "%t", "Railing")); } if(g_cvarStairs.BoolValue) { menu.AddItem("stairs", Translate(client, "%t", "Stairs")); } if(g_cvarOffice.BoolValue) { menu.AddItem("office", Translate(client, "%t", "Office")); } if(g_cvarStreets.BoolValue) { menu.AddItem("streets", Translate(client, "%t", "Streets")); } if(g_cvarFairgrounds.BoolValue) { menu.AddItem("fairgrounds", Translate(client, "%t", "Fairgrounds")); } if(g_cvarMall.BoolValue) { menu.AddItem("mall", Translate(client, "%t", "Mall")); } if(g_cvarConstruction.BoolValue) { menu.AddItem("construction", Translate(client, "%t", "Construction")); } if(g_cvarGeneralMisc.BoolValue) { menu.AddItem("generalmisc", Translate(client, "%t", "GeneralMisc")); } if(g_cvarExteriorMisc.BoolValue) { menu.AddItem("exteriormisc", Translate(client, "%t", "ExteriorMisc")); } if(g_cvarInteriorMisc.BoolValue) { menu.AddItem("interiormisc", Translate(client, "%t", "InteriorMisc")); } if(g_cvarDebris.BoolValue) { menu.AddItem("debris", Translate(client, "%t", "Debris")); } if(g_cvarJunk.BoolValue) { menu.AddItem("junk", Translate(client, "%t", "Junk")); } if(g_cvarPipes.BoolValue) { menu.AddItem("pipes", Translate(client, "%t", "Pipes")); } if(g_cvarBodiesGeneric.BoolValue) { menu.AddItem("bodiesgeneric", Translate(client, "%t", "BodiesGeneric")); } if(g_cvarBodiesSwamp.BoolValue) { menu.AddItem("bodiesswamp", Translate(client, "%t", "BodiesSwamp")); } if(g_cvarBodiesSugarMill.BoolValue) { menu.AddItem("BodiesSugarMill", Translate(client, "%t", "BodiesSugarMill")); } if(g_cvarBodiesCemetary.BoolValue) { menu.AddItem("bodiescemetary", Translate(client, "%t", "BodiesCemetary")); } if(g_cvarInfected.BoolValue) { menu.AddItem("infected", Translate(client, "%t", "Infected")); } if(g_cvarSkybox.BoolValue) { menu.AddItem("skybox", Translate(client, "%t", "Skybox")); } menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } Menu BuildEditPropMenu(int client) { Menu menu = new Menu(MenuHandler_EditProp); menu.SetTitle("%T", "Select an action:", client); menu.AddItem("rotate", Translate(client, "%t", "Rotate")); menu.AddItem("move", Translate(client, "%t", "Move")); menu.ExitBackButton = true; menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_PhysicsCursor(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 1; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_PhysicsPosition(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 2; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_DynamicCursor(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 3; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_DynamicPosition(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 4; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_StaticCursor(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 5; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_StaticPosition(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { g_iCategory[param1] = 6; char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "vehicles")== 0) { DisplayVehiclesMenu(param1); } else if(strcmp(menucmd, "foliage")== 0) { DisplayFoliageMenu(param1); } else if(strcmp(menucmd, "furniture")== 0) { DisplayFurnitureMenu(param1); } else if(strcmp(menucmd, "furnishings")== 0) { DisplayFurnishingsMenu(param1); } else if(strcmp(menucmd, "appliances")== 0) { DisplayAppliancesMenu(param1); } else if(strcmp(menucmd, "buildings")== 0) { DisplayBuildingsMenu(param1); } else if(strcmp(menucmd, "scaffolding")== 0) { DisplayScaffoldingMenu(param1); } else if(strcmp(menucmd, "doors")== 0) { DisplayDoorsMenu(param1); } else if(strcmp(menucmd, "windows")== 0) { DisplayWindowsMenu(param1); } else if(strcmp(menucmd, "lights")== 0) { DisplayLightsMenu(param1); } else if(strcmp(menucmd, "signs")== 0) { DisplaySignsMenu(param1); } else if(strcmp(menucmd, "fencing")== 0) { DisplayFencingMenu(param1); } else if(strcmp(menucmd, "railing")== 0) { DisplayRailingMenu(param1); } else if(strcmp(menucmd, "stairs")== 0) { DisplayStairsMenu(param1); } else if(strcmp(menucmd, "office")== 0) { DisplayOfficeMenu(param1); } else if(strcmp(menucmd, "streets")== 0) { DisplayStreetsMenu(param1); } else if(strcmp(menucmd, "fairgrounds")== 0) { DisplayFairgroundsMenu(param1); } else if(strcmp(menucmd, "mall")== 0) { DisplayMallMenu(param1); } else if(strcmp(menucmd, "construction")== 0) { DisplayConstructionMenu(param1); } else if(strcmp(menucmd, "generalmisc")== 0) { DisplayGeneralMiscMenu(param1); } else if(strcmp(menucmd, "exteriormisc")== 0) { DisplayExteriorMiscMenu(param1); } else if(strcmp(menucmd, "interiormisc")== 0) { DisplayInteriorMiscMenu(param1); } else if(strcmp(menucmd, "debris")== 0) { DisplayDebrisMenu(param1); } else if(strcmp(menucmd, "junk")== 0) { DisplayJunkMenu(param1); } else if(strcmp(menucmd, "pipes")== 0) { DisplayPipesMenu(param1); } else if(strcmp(menucmd, "bodiesgeneric")== 0) { DisplayBodiesGenericMenu(param1); } else if(strcmp(menucmd, "bodiesswamp")== 0) { DisplayBodiesSwampMenu(param1); } else if(strcmp(menucmd, "BodiesSugarMill")== 0) { DisplayBodiesSugarMill(param1); } else if(strcmp(menucmd, "bodiescemetary")== 0) { DisplayBodiesCemetaryMenu(param1); } else if(strcmp(menucmd, "infected")== 0) { DisplayInfectedMenu(param1); } else if(strcmp(menucmd, "skybox")== 0) { DisplaySkyboxMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } public int MenuHandler_EditProp(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "rotate")== 0) { DisplayRotateMenu(param1); } else if(strcmp(menucmd, "move")== 0) { DisplayMoveMenu(param1); } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack && g_TopMenuHandle != null) { g_TopMenuHandle.Display(param1, TopMenuPosition_LastCategory); } } case MenuAction_End: { delete menu; } } } Menu DisplayVehiclesMenu(int client) { g_iSubCategory[client] = 1; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Vehicles", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iVehiclesMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayFoliageMenu(int client) { g_iSubCategory[client] = 2; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Foliage", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iFoliageMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayFurnitureMenu(int client) { g_iSubCategory[client] = 3; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Furniture", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iFurnitureMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayFurnishingsMenu(int client) { g_iSubCategory[client] = 4; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Furnishings", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iFurnishingsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayAppliancesMenu(int client) { g_iSubCategory[client] = 5; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Appliances", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iAppliancesMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayBuildingsMenu(int client) { g_iSubCategory[client] = 6; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Buildings", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iBuildingsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayScaffoldingMenu(int client) { g_iSubCategory[client] = 7; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Scaffolding", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iScaffoldingMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayDoorsMenu(int client) { g_iSubCategory[client] = 8; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Doors", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iDoorsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayWindowsMenu(int client) { g_iSubCategory[client] = 9; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Windows", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iWindowsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayLightsMenu(int client) { g_iSubCategory[client] = 10; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Lights", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iLightsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplaySignsMenu(int client) { g_iSubCategory[client] = 11; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Signs", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iSignssMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayFencingMenu(int client) { g_iSubCategory[client] = 12; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Fencing", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iFencingMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayRailingMenu(int client) { g_iSubCategory[client] = 13; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Railing", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iRailingMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayStairsMenu(int client) { g_iSubCategory[client] = 14; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Stairs", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iStairsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayOfficeMenu(int client) { g_iSubCategory[client] = 15; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Office", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iOfficeMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayStreetsMenu(int client) { g_iSubCategory[client] = 16; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Streets", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iStreetsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayFairgroundsMenu(int client) { g_iSubCategory[client] = 17; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Fairgrounds", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iFairgroundsMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayMallMenu(int client) { g_iSubCategory[client] = 18; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Mall", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iMallMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayConstructionMenu(int client) { g_iSubCategory[client] = 19; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Construction", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iConstructionMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayGeneralMiscMenu(int client) { g_iSubCategory[client] = 20; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "GeneralMisc", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iGeneralMiscMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayExteriorMiscMenu(int client) { g_iSubCategory[client] = 21; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "ExteriorMisc", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iExteriorMiscMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayInteriorMiscMenu(int client) { g_iSubCategory[client] = 22; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "InteriorMisc", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iInteriorMiscMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayDebrisMenu(int client) { g_iSubCategory[client] = 23; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Debris", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iDebrisMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayJunkMenu(int client) { g_iSubCategory[client] = 24; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Junk", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iJunkMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayPipesMenu(int client) { g_iSubCategory[client] = 1; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Pipes", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iPipesMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayBodiesGenericMenu(int client) { g_iSubCategory[client] = 25; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "BodiesGeneric", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iBodiesGenericMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayBodiesSwampMenu(int client) { g_iSubCategory[client] = 26; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "BodiesSwamp", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iBodiesSwampMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayBodiesSugarMill(int client) { g_iSubCategory[client] = 27; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "BodiesSugarMill", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iBodiesSugarMillMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayBodiesCemetaryMenu(int client) { g_iSubCategory[client] = 28; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "BodiesCemetary", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iBodiesCemetaryMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayInfectedMenu(int client) { g_iSubCategory[client] = 29; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Infected", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iInfectedMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplaySkyboxMenu(int client) { g_iSubCategory[client] = 1; Menu menu = new Menu(MenuHandler_DoAction); SetFileCategory(menu, client); menu.SetTitle("%T", "Skybox", client); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iSkyboxMenuPosition[client], MENU_TIME_FOREVER); } Menu SetFileCategory(Menu menu, int client) { File file; char FileName[256]; char ItemModel[256]; char ItemTag[256]; char buffer[256]; BuildPath(Path_SM, FileName, sizeof(FileName), "data/l4d2_spawn_props_models.txt"); int len; if(!FileExists(FileName)) { SetFailState("Unable to find the l4d2_spawn_props_models.txt file"); } file = OpenFile(FileName, "r"); if(file == null) { SetFailState("Error opening the models file"); } g_iFileCategory[client] = 0; while(file.ReadLine(buffer, sizeof(buffer))) { len = strlen(buffer); if (buffer[len-1] == 'n') { buffer[--len] = '0'; } if(StrContains(buffer, "//Category Vehicles") >= 0) { g_iFileCategory[client] = 1; continue; } else if(StrContains(buffer, "//Category Foliage") >= 0) { g_iFileCategory[client] = 2; continue; } else if(StrContains(buffer, "//Category Furniture") >= 0) { g_iFileCategory[client] = 3; continue; } if(StrContains(buffer, "//Category Furnishings") >= 0) { g_iFileCategory[client] = 4; continue; } else if(StrContains(buffer, "//Category Appliances") >= 0) { g_iFileCategory[client] = 5; continue; } if(StrContains(buffer, "//Category Buildings") >= 0) { g_iFileCategory[client] = 6; continue; } if(StrContains(buffer, "//Category Scaffolding") >= 0) { g_iFileCategory[client] = 7; continue; } if(StrContains(buffer, "//Category Doors") >= 0) { g_iFileCategory[client] = 8; continue; } if(StrContains(buffer, "//Category Windows") >= 0) { g_iFileCategory[client] = 9; continue; } if(StrContains(buffer, "//Category Lights") >= 0) { g_iFileCategory[client] = 10; continue; } else if(StrContains(buffer, "//Category Signs") >= 0) { g_iFileCategory[client] = 11; continue; } if(StrContains(buffer, "//Category Fencing") >= 0) { g_iFileCategory[client] = 12; continue; } if(StrContains(buffer, "//Category Railing") >= 0) { g_iFileCategory[client] = 13; continue; } if(StrContains(buffer, "//Category Stairs") >= 0) { g_iFileCategory[client] = 14; continue; } else if(StrContains(buffer, "//Category Office") >= 0) { g_iFileCategory[client] = 15; continue; } else if(StrContains(buffer, "//Category Streets") >= 0) { g_iFileCategory[client] = 16; continue; } else if(StrContains(buffer, "//Category Fairgrounds") >= 0) { g_iFileCategory[client] = 17; continue; } else if(StrContains(buffer, "//Category Mall") >= 0) { g_iFileCategory[client] = 18; continue; } else if(StrContains(buffer, "//Category Construction") >= 0) { g_iFileCategory[client] = 19; continue; } else if(StrContains(buffer, "//Category GeneralMisc") >= 0) { g_iFileCategory[client] = 20; continue; } else if(StrContains(buffer, "//Category ExteriorMisc") >= 0) { g_iFileCategory[client] = 21; continue; } else if(StrContains(buffer, "//Category InteriorMisc") >= 0) { g_iFileCategory[client] = 22; continue; } else if(StrContains(buffer, "//Category Debris") >= 0) { g_iFileCategory[client] = 23; continue; } else if(StrContains(buffer, "//Category Junk") >= 0) { g_iFileCategory[client] = 24; continue; } else if(StrContains(buffer, "//Category Pipes") >= 0) { g_iFileCategory[client] = 25; continue; } else if(StrContains(buffer, "//Category BodiesGeneric") >= 0) { g_iFileCategory[client] = 26; continue; } else if(StrContains(buffer, "//Category BodiesSwamp") >= 0) { g_iFileCategory[client] = 27; continue; } else if(StrContains(buffer, "//Category BodiesSugarMill") >= 0) { g_iFileCategory[client] = 28; continue; } else if(StrContains(buffer, "//Category BodiesCemetary") >= 0) { g_iFileCategory[client] = 29; continue; } else if(StrContains(buffer, "//Category Infected") >= 0) { g_iFileCategory[client] = 30; continue; } else if(StrContains(buffer, "//Category Skybox") >= 0) { g_iFileCategory[client] = 31; continue; } if(strcmp(buffer, "")== 0) { continue; } if(g_iFileCategory[client] != g_iSubCategory[client]) { continue; } SplitString(buffer, " TAG-", ItemModel, sizeof(ItemModel)); strcopy(ItemTag, sizeof(ItemTag), buffer); ReplaceString(ItemTag, sizeof(ItemTag), ItemModel, "", false); ReplaceString(ItemTag, sizeof(ItemTag), " TAG- ", "", false); menu.AddItem(ItemModel, ItemTag); if(IsEndOfFile(file)) { break; } } CloseHandle(file); } Menu DisplayRotateMenu(int client) { g_iMoveCategory[client] = 1; Menu menu = new Menu(MenuHandler_PropPosition); menu.SetTitle("%T", "Rotate", client); menu.AddItem("rotate1x", Translate(client, "%t", "Rotate 1 degree (X axys)")); menu.AddItem("rotate-1x", Translate(client, "%t", "Back 1 degree (X axys)")); menu.AddItem("rotate10x", Translate(client, "%t", "Rotate 10 degree (X axys)")); menu.AddItem("rotate-10x", Translate(client, "%t", "Back 10 degree (X axys)")); menu.AddItem("rotate15x", Translate(client, "%t", "Rotate 15 degree (X axys)")); menu.AddItem("rotate-15x", Translate(client, "%t", "Back 15 degree (X axys)")); menu.AddItem("rotate45x", Translate(client, "%t", "Rotate 45 degree (X axys)")); menu.AddItem("rotate90x", Translate(client, "%t", "Rotate 90 degree (X axys)")); menu.AddItem("rotate180x", Translate(client, "%t", "Rotate 180 degree (X axys)")); menu.AddItem("rotate1y", Translate(client, "%t", "Rotate 1 degree (Y axys)")); menu.AddItem("rotate-1y", Translate(client, "%t", "Back 1 degree (Y axys)")); menu.AddItem("rotate10y", Translate(client, "%t", "Rotate 10 degree (Y axys)")); menu.AddItem("rotate-10y", Translate(client, "%t", "Back 10 degree (Y axys)")); menu.AddItem("rotate15y", Translate(client, "%t", "Rotate 15 degree (Y axys)")); menu.AddItem("rotate-15y", Translate(client, "%t", "Back 15 degree (Y axys)")); menu.AddItem("rotate45y", Translate(client, "%t", "Rotate 45 degree (Y axys)")); menu.AddItem("rotate90y", Translate(client, "%t", "Rotate 90 degree (Y axys)")); menu.AddItem("rotate180y", Translate(client, "%t", "Rotate 180 degree (Y axys)")); menu.AddItem("rotate1z", Translate(client, "%t", "Rotate 1 degree (Z axys)")); menu.AddItem("rotate-1z", Translate(client, "%t", "Back 1 degree (Z axys)")); menu.AddItem("rotate10z", Translate(client, "%t", "Rotate 10 degree (Z axys)")); menu.AddItem("rotate-10z", Translate(client, "%t", "Back 10 degree (Z axys)")); menu.AddItem("rotate15z", Translate(client, "%t", "Rotate 15 degree (Z axys)")); menu.AddItem("rotate-15z", Translate(client, "%t", "Back 15 degree (Z axys)")); menu.AddItem("rotate45z", Translate(client, "%t", "Rotate 45 degree (Z axys)")); menu.AddItem("rotate90z", Translate(client, "%t", "Rotate 90 degree (Z axys)")); menu.AddItem("rotate180z", Translate(client, "%t", "Rotate 180 degree (Z axys)")); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iRotateMenuPosition[client], MENU_TIME_FOREVER); } Menu DisplayMoveMenu(int client) { g_iMoveCategory[client] = 2; Menu menu = new Menu(MenuHandler_PropPosition); menu.SetTitle("%T", "Move", client); menu.AddItem("moveup1", Translate(client, "%t", "Move Up 1 Unit")); menu.AddItem("moveup10", Translate(client, "%t", "Move Up 10 Unit")); menu.AddItem("moveup30", Translate(client, "%t", "Move Up 30 Unit")); menu.AddItem("movedown1", Translate(client, "%t", "Move Down 1 Unit")); menu.AddItem("movedown10", Translate(client, "%t", "Move Down 10 Unit")); menu.AddItem("movedown30", Translate(client, "%t", "Move Down 30 Unit")); menu.AddItem("moveright1", Translate(client, "%t", "Move Right 1 Unit")); menu.AddItem("moveright10", Translate(client, "%t", "Move Right 10 Unit")); menu.AddItem("moveright30", Translate(client, "%t", "Move Right 30 Unit")); menu.AddItem("moveleft1", Translate(client, "%t", "Move Left 1 Unit")); menu.AddItem("moveleft10", Translate(client, "%t", "Move Left 10 Unit")); menu.AddItem("moveleft30", Translate(client, "%t", "Move Left 30 Unit")); menu.AddItem("moveforward1", Translate(client, "%t", "Move Forward 1 Unit")); menu.AddItem("moveforward10", Translate(client, "%t", "Move Forward 10 Unit")); menu.AddItem("moveforward30", Translate(client, "%t", "Move Forward 30 Unit")); menu.AddItem("movebackward1", Translate(client, "%t", "Move Backward 1 Unit")); menu.AddItem("movebackward10", Translate(client, "%t", "Move Backward 10 Unit")); menu.AddItem("movebackward30", Translate(client, "%t", "Move Backward 30 Unit")); menu.ExitBackButton = true; menu.ExitButton = true; menu.DisplayAt(client, g_iMoveMenuPosition[client], MENU_TIME_FOREVER); } public int MenuHandler_DoAction(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char model[256]; GetMenuItem(menu, param2, model, sizeof(model)); if(!IsModelPrecached(model)) { PrecacheModel(model); } if(g_iCategory[param1] == 1) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_physics_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); DispatchSpawn(prop); GetClientEyePosition(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, param1); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(param1, "[SM] Vector out of world geometry. Spawning on current position instead"); } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a physics object with model <%s>", name, model); } else if(g_iCategory[param1] == 2) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_physics_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); DispatchSpawn(prop); GetClientAbsOrigin(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a physics object with model <%s>", name, model); } else if(g_iCategory[param1] == 3) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); DispatchSpawn(prop); GetClientEyePosition(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, param1); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(param1, "[SM] Vector out of world geometry. Spawning on current position instead"); } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_bUnsolid[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a dynamic object with model <%s>", name, model); } else if(g_iCategory[param1] == 4) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); DispatchSpawn(prop); GetClientAbsOrigin(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_bUnsolid[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a dynamic object with model <%s>", name, model); } else if(g_iCategory[param1] == 5) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); GetClientEyePosition(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); SetEntProp(prop, Prop_Send, "m_nSolidType", 6); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_OPAQUE, RayType_Infinite, TraceRayDontHitSelf, param1); if(TR_DidHit(null)) { TR_GetEndPosition(VecOrigin); } else { PrintToChat(param1, "[SM] Vector out of world geometry. Spawning on current position instead"); } VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a static object with model <%s>", name, model); } else if(g_iCategory[param1] == 6) { float VecOrigin[3]; float VecAngles[3]; int prop = CreateEntityByName("prop_dynamic_override"); DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); SetEntProp(prop, Prop_Send, "m_nSolidType", 6); DispatchSpawn(prop); GetClientAbsOrigin(param1, VecOrigin); GetClientEyeAngles(param1, VecAngles); VecAngles[0] = 0.0; VecAngles[2] = 0.0; g_vecLastEntityAngles[param1] = VecAngles; g_iLastObject[param1] = prop; DispatchKeyValueVector(prop, "angles", VecAngles); DispatchSpawn(prop); TeleportEntity(prop, VecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = VecAngles; char name[256]; GetClientName(param1, name, sizeof(name)); LogSpawn("%s spawned a static object with model <%s>", name, model); } switch(g_iSubCategory[param1]) { case 1: { g_iVehiclesMenuPosition[param1] = menu.Selection; DisplayVehiclesMenu(param1); } case 2: { g_iFoliageMenuPosition[param1] = menu.Selection; DisplayFoliageMenu(param1); } case 3: { g_iFurnitureMenuPosition[param1] = menu.Selection; DisplayFurnitureMenu(param1); } case 4: { g_iFurnishingsMenuPosition[param1] = menu.Selection; DisplayFurnishingsMenu(param1); } case 5: { g_iAppliancesMenuPosition[param1] = menu.Selection; DisplayAppliancesMenu(param1); } case 6: { g_iBuildingsMenuPosition[param1] = menu.Selection; DisplayBuildingsMenu(param1); } case 7: { g_iScaffoldingMenuPosition[param1] = menu.Selection; DisplayScaffoldingMenu(param1); } case 8: { g_iDoorsMenuPosition[param1] = menu.Selection; DisplayDoorsMenu(param1); } case 9: { g_iWindowsMenuPosition[param1] = menu.Selection; DisplayWindowsMenu(param1); } case 10: { g_iLightsMenuPosition[param1] = menu.Selection; DisplayLightsMenu(param1); } case 11: { g_iSignssMenuPosition[param1] = menu.Selection; DisplaySignsMenu(param1); } case 12: { g_iFencingMenuPosition[param1] = menu.Selection; DisplayFencingMenu(param1); } case 13: { g_iRailingMenuPosition[param1] = menu.Selection; DisplayRailingMenu(param1); } case 14: { g_iStairsMenuPosition[param1] = menu.Selection; DisplayStairsMenu(param1); } case 15: { g_iOfficeMenuPosition[param1] = menu.Selection; DisplayOfficeMenu(param1); } case 16: { g_iStreetsMenuPosition[param1] = menu.Selection; DisplayStreetsMenu(param1); } case 17: { g_iFairgroundsMenuPosition[param1] = menu.Selection; DisplayFairgroundsMenu(param1); } case 18: { g_iMallMenuPosition[param1] = menu.Selection; DisplayMallMenu(param1); } case 19: { g_iConstructionMenuPosition[param1] = menu.Selection; DisplayConstructionMenu(param1); } case 20: { g_iGeneralMiscMenuPosition[param1] = menu.Selection; DisplayGeneralMiscMenu(param1); } case 21: { g_iExteriorMiscMenuPosition[param1] = menu.Selection; DisplayExteriorMiscMenu(param1); } case 22: { g_iInteriorMiscMenuPosition[param1] = menu.Selection; DisplayInteriorMiscMenu(param1); } case 23: { g_iDebrisMenuPosition[param1] = menu.Selection; DisplayDebrisMenu(param1); } case 24: { g_iJunkMenuPosition[param1] = menu.Selection; DisplayJunkMenu(param1); } case 25: { g_iPipesMenuPosition[param1] = menu.Selection; DisplayPipesMenu(param1); } case 26: { g_iBodiesGenericMenuPosition[param1] = menu.Selection; DisplayBodiesGenericMenu(param1); } case 27: { g_iBodiesSwampMenuPosition[param1] = menu.Selection; DisplayBodiesSwampMenu(param1); } case 28: { g_iBodiesSugarMillMenuPosition[param1] = menu.Selection; DisplayBodiesSugarMill(param1); } case 29: { g_iBodiesCemetaryMenuPosition[param1] = menu.Selection; DisplayBodiesCemetaryMenu(param1); } case 30: { g_iInfectedMenuPosition[param1] = menu.Selection; DisplayInfectedMenu(param1); } case 31: { g_iSkyboxMenuPosition[param1] = menu.Selection; DisplaySkyboxMenu(param1); } } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack) { switch(g_iCategory[param1]) { case 1: { BuildPhysicsCursorMenu(param1); } case 2: { BuildPhysicsPositionMenu(param1); } case 3: { BuildDynamicCursorMenu(param1); } case 4: { BuildDynamicPositionMenu(param1); } case 5: { BuildStaticCursorMenu(param1); } case 6: { BuildStaticPositionMenu(param1); } case 7: { BuildStaticPositionMenu(param1); } case 8: { BuildStaticPositionMenu(param1); } case 9: { BuildStaticPositionMenu(param1); } } } } case MenuAction_End: { delete menu; } } } public int MenuHandler_PropPosition(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); switch(g_iMoveCategory[param1]) { case 1: { if(g_iLastObject[param1] <= 0 || !IsValidEntity(g_iLastObject[param1])) { PrintToChat(param1, "[SM] The last object is not valid anymore or you haven't spawned anything yet"); DisplayRotateMenu(param1); return; } int Object = g_iLastObject[param1]; float vecAngles[3]; vecAngles[0] = g_vecLastEntityAngles[param1][0]; vecAngles[1] = g_vecLastEntityAngles[param1][1]; vecAngles[2] = g_vecLastEntityAngles[param1][2]; if(strcmp(menucmd, "rotate1x")== 0) { vecAngles[0] += 1; } if(strcmp(menucmd, "rotate-1x")== 0) { vecAngles[0] -= 1; } else if(strcmp(menucmd, "rotate10x")== 0) { vecAngles[0] += 10; } else if(strcmp(menucmd, "rotate-10x")== 0) { vecAngles[0] -= 10; } else if(strcmp(menucmd, "rotate15x")== 0) { vecAngles[0] += 15; } else if(strcmp(menucmd, "rotate-15x")== 0) { vecAngles[0] -= 15; } else if(strcmp(menucmd, "rotate45x")== 0) { vecAngles[0] += 45; } else if(strcmp(menucmd, "rotate90x")== 0) { vecAngles[0] += 90; } else if(strcmp(menucmd, "rotate180x")== 0) { vecAngles[0] += 180; } else if(strcmp(menucmd, "rotate1y")== 0) { vecAngles[1] += 1; } else if(strcmp(menucmd, "rotate-1y")== 0) { vecAngles[1] -= 1; } else if(strcmp(menucmd, "rotate10y")== 0) { vecAngles[1] += 10; } else if(strcmp(menucmd, "rotate-10y")== 0) { vecAngles[1] -= 10; } else if(strcmp(menucmd, "rotate15y")== 0) { vecAngles[1] += 15; } else if(strcmp(menucmd, "rotate-15y")== 0) { vecAngles[1] -= 15; } else if(strcmp(menucmd, "rotate45y")== 0) { vecAngles[1] += 45; } else if(strcmp(menucmd, "rotate90y")== 0) { vecAngles[1] += 90; } else if(strcmp(menucmd, "rotate180y")== 0) { vecAngles[1] += 180; } else if(strcmp(menucmd, "rotate1z")== 0) { vecAngles[2] += 1; } else if(strcmp(menucmd, "rotate-1z")== 0) { vecAngles[2] -= 1; } else if(strcmp(menucmd, "rotate10z")== 0) { vecAngles[2] += 10; } else if(strcmp(menucmd, "rotate-10z")== 0) { vecAngles[2] -= 10; } else if(strcmp(menucmd, "rotate15z")== 0) { vecAngles[2] += 15; } else if(strcmp(menucmd, "rotate-15z")== 0) { vecAngles[2] -= 15; } else if(strcmp(menucmd, "rotate45z")== 0) { vecAngles[2] += 45; } else if(strcmp(menucmd, "rotate90z")== 0) { vecAngles[2] += 90; } else if(strcmp(menucmd, "rotate180z")== 0) { vecAngles[2] += 180; } g_vecLastEntityAngles[param1] = vecAngles; TeleportEntity(Object, NULL_VECTOR, vecAngles, NULL_VECTOR); g_vecEntityAngles[g_iLastObject[param1]] = vecAngles; g_iRotateMenuPosition[param1] = menu.Selection; DisplayRotateMenu(param1); } case 2: { if(g_iLastObject[param1] <= 0 || !IsValidEntity(g_iLastObject[param1])) { PrintToChat(param1, "[SM] The last object is not valid anymore or you haven't spawned anything yet"); DisplayMoveMenu(param1); return; } int Object = g_iLastObject[param1]; float vecOrigin[3]; GetEntPropVector(Object, Prop_Data, "m_vecOrigin", vecOrigin); if(strcmp(menucmd, "moveup1")== 0) { vecOrigin[2]+= 1; } if(strcmp(menucmd, "moveup10")== 0) { vecOrigin[2]+= 10; } if(strcmp(menucmd, "moveup30")== 0) { vecOrigin[2]+= 30; } else if(strcmp(menucmd, "movedown1")== 0) { vecOrigin[2]-= 1; } else if(strcmp(menucmd, "movedown10")== 0) { vecOrigin[2]-= 10; } else if(strcmp(menucmd, "movedown30")== 0) { vecOrigin[2]-= 30; } else if(strcmp(menucmd, "moveright1")== 0) { vecOrigin[1]+= 1; } else if(strcmp(menucmd, "moveright10")== 0) { vecOrigin[1]+= 10; } else if(strcmp(menucmd, "moveright30")== 0) { vecOrigin[1]+= 30; } else if(strcmp(menucmd, "moveleft1")== 0) { vecOrigin[1]-= 1; } else if(strcmp(menucmd, "moveleft10")== 0) { vecOrigin[1]-= 10; } else if(strcmp(menucmd, "moveleft30")== 0) { vecOrigin[1]-= 30; } else if(strcmp(menucmd, "moveforward1")== 0) { vecOrigin[0]+= 1; } else if(strcmp(menucmd, "moveforward10")== 0) { vecOrigin[0]+= 10; } else if(strcmp(menucmd, "moveforward30")== 0) { vecOrigin[0]+= 30; } else if(strcmp(menucmd, "movebackward1")== 0) { vecOrigin[0]-= 1; } else if(strcmp(menucmd, "movebackward10")== 0) { vecOrigin[0]-= 10; } else if(strcmp(menucmd, "movebackward30")== 0) { vecOrigin[0]-= 30; } TeleportEntity(Object, vecOrigin, NULL_VECTOR, NULL_VECTOR); g_iMoveMenuPosition[param1] = menu.Selection; DisplayMoveMenu(param1); } } } case MenuAction_Cancel: { if(param2 == MenuCancel_ExitBack) { BuildEditPropMenu(param1); } } case MenuAction_End: { delete menu; } } } public bool TraceRayDontHitSelf(int entity, int mask, any data) { if(entity == data) // Check if the TraceRay hit the itself. { return false; // Don't let the entity be hit } return true; // It didn't hit itself } void DeleteLookingEntity(int client) { float VecOrigin[3]; float VecAngles[3]; GetClientEyePosition(client, VecOrigin); GetClientEyeAngles(client, VecAngles); TR_TraceRayFilter(VecOrigin, VecAngles, MASK_PLAYERSOLID, RayType_Infinite, TraceRayDontHitSelf, client); if(TR_DidHit(null)) { int Object = TR_GetEntityIndex(null); if(Object > 0 && IsValidEntity(Object) && IsValidEdict(Object)) { char class[256]; GetEdictClassname(Object, class, sizeof(class)); if(strcmp(class, "prop_physics") == 0 || strcmp(class, "prop_dynamic") == 0 || strcmp(class, "prop_physics_override") == 0 || strcmp(class, "prop_dynamic_override") == 0) { g_bSpawned[Object] = false; g_bUnsolid[Object] = false; g_vecEntityAngles[Object][0] = 0.0; g_vecEntityAngles[Object][1] = 0.0; g_vecEntityAngles[Object][2] = 0.0; char m_ModelName[PLATFORM_MAX_PATH]; GetEntPropString(Object, Prop_Data, "m_ModelName", m_ModelName, sizeof(m_ModelName)); PrintToChat(client, "[SM] %T", "Object Model", client, Object, m_ModelName); float position[3]; GetEntPropVector(Object, Prop_Send, "m_vecOrigin", position); PrintToChat(client, "[SM] %T", "Object Position", client, Object, position[0], position[1], position[2]); float angle[3]; GetEntPropVector(Object, Prop_Data, "m_angRotation", angle); PrintToChat(client, "[SM] %T", "Object Angle", client, Object, angle[0], angle[1], angle[2]); AcceptEntityInput(Object, "KillHierarchy"); PrintToChat(client, "[SM] %T", "Successfully removed an object", client, Object); if(Object == g_iLastObject[client]) { g_iLastObject[client] = -1; g_vecLastEntityAngles[client][0] = 0.0; g_vecLastEntityAngles[client][1] = 0.0; g_vecLastEntityAngles[client][2] = 0.0; g_bGrab[client] = false; g_bGrabbed[Object] = false; } if(Object == g_iLastGrabbedObject[client]) { g_iLastGrabbedObject[client] = -1; } return; } } } else { int Object = GetClientAimTarget(client, false); if(Object == -2) { PrintToChat(client, "[SM] %T","This plugin won't work in this game",client); SetFailState("Unhandled Behaviour"); } if(Object > 0 && IsValidEntity(Object)) { char class[256]; GetEdictClassname(Object, class, sizeof(class)); if(strcmp(class, "prop_physics") == 0 || strcmp(class, "prop_dynamic") == 0 || strcmp(class, "prop_physics_override") == 0 || strcmp(class, "prop_dynamic_override") == 0) { g_bSpawned[Object] = false; g_bUnsolid[Object] = false; g_vecEntityAngles[Object][0] = 0.0; g_vecEntityAngles[Object][1] = 0.0; g_vecEntityAngles[Object][2] = 0.0; AcceptEntityInput(Object, "KillHierarchy"); PrintToChat(client, "[SM] %T", "Successfully removed an object", client, Object); if(Object == g_iLastObject[client]) { g_iLastObject[client] = -1; g_vecLastEntityAngles[client][0] = 0.0; g_vecLastEntityAngles[client][1] = 0.0; g_vecLastEntityAngles[client][2] = 0.0; if(Object == g_iLastGrabbedObject[client]) { g_iLastGrabbedObject[client] = -1; } } return; } } } PrintToChat(client, "[SM] %T","You are not looking to a valid object",client); } void DeleteAllProps() { CheatCommand(_, "ent_fire", "l4d2_spawn_props_prop KillHierarchy"); for(int i=1; i<=MaxClients; i++) { g_iLastObject[i] = -1; g_vecLastEntityAngles[i][0] = 0.0; g_vecLastEntityAngles[i][1] = 0.0; g_vecLastEntityAngles[i][2] = 0.0; g_bGrab[i] = false; g_iLastGrabbedObject[i] = -1; } for(int i=MaxClients; i < ARRAY_SIZE; i++) { if(g_bSpawned[i]) { g_bGrabbed[i] = false; g_bSpawned[i] = false; g_bUnsolid[i] = false; g_vecEntityAngles[i][0] = 0.0; g_vecEntityAngles[i][1] = 0.0; g_vecEntityAngles[i][2] = 0.0; if(IsValidEntity(i)) { AcceptEntityInput(i, "Kill"); } } } } void CheatCommand(int client = 0, char[] command, char[] arguments="") { if (!client || !IsClientInGame(client)) { for (int target = 1; target <= MaxClients; target++) { if (IsClientInGame(target)) { client = target; break; } } if (!client || !IsClientInGame(client)) return; } int userflags = GetUserFlagBits(client); SetUserFlagBits(client, ADMFLAG_ROOT); int flags = GetCommandFlags(command); SetCommandFlags(command, flags & ~FCVAR_CHEAT); FakeClientCommand(client, "%s %s", command, arguments); SetCommandFlags(command, flags); SetUserFlagBits(client, userflags); } //Disabled right now void DeleteLastProp(int client) { int Object = g_iLastObject[client]; if(Object > 0 && IsValidEntity(Object)) { char class[256]; GetEdictClassname(Object, class, sizeof(class)); if(strcmp(class, "prop_physics") == 0 || strcmp(class, "prop_dynamic") == 0 || strcmp(class, "prop_physics_override") == 0 || strcmp(class, "prop_dynamic_override") == 0) { AcceptEntityInput(g_iLastObject[client], "KillHierarchy"); PrintToChat(client, "[SM] %T","Succesfully deleted the last spawned object",client); g_iLastObject[client] = -1; g_vecLastEntityAngles[client][0] = 0.0; g_vecLastEntityAngles[client][1] = 0.0; g_vecLastEntityAngles[client][2] = 0.0; g_bSpawned[Object] = false; g_bUnsolid[Object] = false; g_vecEntityAngles[Object][0] = 0.0; g_vecEntityAngles[Object][1] = 0.0; g_vecEntityAngles[Object][2] = 0.0; g_bGrab[client] = false; g_bGrabbed[Object] = false; if(Object == g_iLastGrabbedObject[client]) { g_iLastGrabbedObject[client] = -1; } return; } else { PrintToChat(client, "[SM] %T", "The last spawned object index is not an object anymore!", client, Object); g_iLastObject[client] = -1; g_vecLastEntityAngles[client][0] = 0.0; g_vecLastEntityAngles[client][1] = 0.0; g_vecLastEntityAngles[client][2] = 0.0; g_bSpawned[Object] = false; g_bUnsolid[Object] = false; g_vecEntityAngles[Object][0] = 0.0; g_vecEntityAngles[Object][1] = 0.0; g_vecEntityAngles[Object][2] = 0.0; } } else if(Object > 0 && !IsValidEntity(Object)) { PrintToChat(client, "[SM] %T","The last object is not valid anymore",client); } else if(Object <= 0) { PrintToChat(client, "[SM] %T","You haven't spawned anything yet",client); } } void LogSpawn(const char[] format, any ...) { if(!g_cvarLog.BoolValue) { return; } char buffer[512]; VFormat(buffer, sizeof(buffer), format, 2); File file; char FileName[256]; char sTime[256]; FormatTime(sTime, sizeof(sTime), "%Y%m%d"); BuildPath(Path_SM, FileName, sizeof(FileName), "logs/objects_%s.log", sTime); file = OpenFile(FileName, "a+"); FormatTime(sTime, sizeof(sTime), "%b %d |%H:%M:%S| %Y"); file.WriteLine("%s: %s", sTime, buffer); FlushFile(file); CloseHandle(file); } public Action CmdSaveMap(int client, int args) { SaveMapStripper(client); return Plugin_Handled; } void SaveMapStripper(int client) { #if DEBUG LogSpawn("[DEBUG] was called by %N", client); #endif LogSpawn("%N saved the objects for this map on a 'Stripper' file format", client); PrintToChat(client, "\x04[SM] Saving the content. Please Wait"); char FileName[256]; char map[256]; char classname[256]; File file; GetCurrentMap(map, sizeof(map)); BuildPath(Path_SM, FileName, sizeof(FileName), "../stripper/maps/%s.cfg", map); if(FileExists(FileName)) { PrintHintText(client, "%T", "The file already exists.", client); } #if DEBUG LogSpawn("[DEBUG] File stated, proceed"); #endif file = OpenFile(FileName, "a+"); #if DEBUG LogSpawn("[DEBUG] File Opened, proceed"); #endif if(file == null) { #if DEBUG LogSpawn("[DEBUG] File Invalid, proceed"); #endif PrintToChat(client, "[SM] Failed to create or overwrite the map file"); PrintToChat(client, "\x04[SM] Something was probably missing during installation"); PrintHintText(client, "[SM] Probably missing addons/stripper folder"); PrintToConsole(client, "[SM] Unable to open, write, or find the file!"); PrintCenterText(client, "[SM] FAILURE"); return; } float vecOrigin[3]; float vecAngles[3]; char sModel[256]; char sTime[256]; int iOrigin[3], iAngles[3]; FormatTime(sTime, sizeof(sTime), "%Y/%m/%d"); file.WriteLine(";----------FILE MODIFICATION (YY/MM/DD): [%s] ---------------||", sTime); file.WriteLine(";----------BY: %N----------------------||", client); file.WriteLine(""); file.WriteLine("add:"); #if DEBUG LogSpawn("[DEBUG] Wrote first information line"); #endif for(int i=MaxClients; i < ARRAY_SIZE; i++) { #if DEBUG LogSpawn("[DEBUG] CHECK: %i", i); #endif if(g_bSpawned[i] && IsValidEntity(i)) { GetEdictClassname(i, classname, sizeof(classname)); #if DEBUG LogSpawn("[DEBUG] Possible Entity Found: %i <%s>", i, classname); #endif if(StrContains(classname, "prop_dynamic") >= 0 || StrContains(classname, "prop_physics") >= 0) { GetEntPropVector(i, Prop_Send, "m_vecOrigin", vecOrigin); vecAngles = g_vecEntityAngles[i]; GetEntPropString(i, Prop_Data, "m_ModelName", sModel, sizeof(sModel)); iOrigin[0] = RoundToFloor(vecOrigin[0]); iOrigin[1] = RoundToFloor(vecOrigin[1]); iOrigin[2] = RoundToFloor(vecOrigin[2]); iAngles[0] = RoundToFloor(vecAngles[0]); iAngles[1] = RoundToFloor(vecAngles[1]); iAngles[2] = RoundToFloor(vecAngles[2]); file.WriteLine("{"); if(StrContains(classname, "physics") < 0) { if(g_bUnsolid[i]) { file.WriteLine(" \"solid\" \"0\""); } else { file.WriteLine(" \"solid\" \"6\""); } } file.WriteLine(" \"origin\" \"%i %i %i\"", iOrigin[0], iOrigin[1], iOrigin[2]); file.WriteLine(" \"angles\" \"%i %i %i\"", iAngles[0], iAngles[1], iAngles[2]); file.WriteLine(" \"model\" \"%s\"", sModel); file.WriteLine(" \"classname\" \"%s\"", classname); file.WriteLine("}"); file.WriteLine(""); #if DEBUG LogSpawn("[DEBUG] END: %i", i); #endif } } } #if DEBUG LogSpawn("[DEBUG] Wrote all entities"); #endif FlushFile(file); CloseHandle(file); PrintToChat(client, "\x03[SM] %T (%s)", "Succesfully saved the map data", client, FileName); #if DEBUG LogSpawn("[DEBUG] END"); #endif } void SaveRoutingPath(int client, int type) { #if DEBUG LogSpawn("[DEBUG] was called by %N", client); #endif LogSpawn("%N saved the objects for this map on a \"Routing\" file format", client); PrintToChat(client, "\x04[SM] Saving the content. Please Wait"); char FileName[256]; char map[256]; char classname[256]; char targetname[256]; File file; bool Exists = false; GetCurrentMap(map, sizeof(map)); BuildPath(Path_SM, FileName, sizeof(FileName), "../stripper/routing/%s.cfg", map); if(FileExists(FileName)) { PrintHintText(client, "%T", "The file already exists.", client); Exists = true; } file = OpenFile(FileName, "a+"); if(file == null) { PrintToChat(client, "[SM] Failed to create or overwrite the map file"); PrintToChat(client, "\x04[SM] Something was probably missing during installation"); PrintHintText(client, "[SM] Probably missing addons/stripper/maps/routing folder"); PrintToConsole(client, "[SM] Unable to open, write, or find the file!"); PrintCenterText(client, "[SM] FAILURE"); return; } float vecOrigin[3]; float vecAngles[3]; char sModel[256]; char sTime[256]; int iOrigin[3], iAngles[3]; FormatTime(sTime, sizeof(sTime), "%Y/%m/%d"); file.WriteLine(";----------FILE MODIFICATION (YY/MM/DD): [%s] ---------------||", sTime); file.WriteLine(";----------BY: %N----------------------||", client); file.WriteLine(""); switch(type) { case RouteType_Easy: { file.WriteLine(";This part was generated for an \"Easy\" routing path."); Format(targetname, sizeof(targetname), "easy_route_blocker"); } case RouteType_Medium: { file.WriteLine(";This part was generated for a \"Medium\" routing path."); Format(targetname, sizeof(targetname), "medium_route_blocker"); } case RouteType_Hard: { file.WriteLine(";This part was generated for a \"Hard\" routing path."); Format(targetname, sizeof(targetname), "hard_route_blocker"); } } file.WriteLine(""); file.WriteLine("add:"); if(!Exists) { //First, wee add the necessary relays file.WriteLine("; plugin trigger relay"); file.WriteLine("; will get fired by Plugin ONLY IN VERSUS, so it doesnt break coop"); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"spawnflags\" \"1\""); file.WriteLine(" \"targetname\" \"relay_routing_init\""); file.WriteLine(" \"classname\" \"logic_relay\""); file.WriteLine(" "); file.WriteLine(" ; destroy Valve routing entities so they dont interfere"); file.WriteLine(" "); file.WriteLine(" \"OnTrigger\" \"director_queryKill0-1\""); file.WriteLine("}"); file.WriteLine(""); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"spawnflags\" \"1\""); file.WriteLine(" \"targetname\" \"relay_routing_disabledbydefault\""); file.WriteLine(" \"classname\" \"logic_auto\""); file.WriteLine(" "); file.WriteLine(" \"OnMapSpawn\" \"easy_route_blockerDisable0-1\""); file.WriteLine(" \"OnMapSpawn\" \"easy_route_blockerDisableCollision0-1\""); file.WriteLine(" \"OnMapSpawn\" \"medium_route_blockerDisable0-1\""); file.WriteLine(" \"OnMapSpawn\" \"medium_route_blockerDisableCollision0-1\""); file.WriteLine(" \"OnMapSpawn\" \"hard_route_blockerDisable0-1\""); file.WriteLine(" \"OnMapSpawn\" \"hard_route_blockerDisableCollision0-1\""); file.WriteLine("}"); file.WriteLine("; config existence checking entity"); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"targetname\" \"map_has_routing\""); file.WriteLine(" \"noise\" \"0\""); file.WriteLine(" \"minAngerRange\" \"1\""); file.WriteLine(" \"maxAngerRange\" \"10\""); file.WriteLine(" \"classname\" \"logic_director_query\""); file.WriteLine(" \"OutAnger\" \"DoHeadBangInValue0-1\""); file.WriteLine("}"); file.WriteLine(""); file.WriteLine("; easy path"); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"targetname\" \"relay_easy_route_spawn\""); file.WriteLine(" \"spawnflags\" \"0\""); file.WriteLine(" \"classname\" \"logic_relay\""); file.WriteLine(" \"OnTrigger\" \"easy_route_blockerEnable0-1\""); file.WriteLine(" \"OnTrigger\" \"easy_route_blockerEnableCollision0-1\""); file.WriteLine("}"); file.WriteLine(""); file.WriteLine("; medium path"); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"targetname\" \"relay_medium_route_spawn\""); file.WriteLine(" \"spawnflags\" \"0\""); file.WriteLine(" \"classname\" \"logic_relay\""); file.WriteLine(" \"OnTrigger\" \"medium_route_blockerEnable0-1\""); file.WriteLine(" \"OnTrigger\" \"medium_route_blockerEnableCollision0-1\""); file.WriteLine("}"); file.WriteLine(""); file.WriteLine("; hard path"); file.WriteLine("{"); file.WriteLine(" \"origin\" \"0 0 0\""); file.WriteLine(" \"targetname\" \"relay_hard_route_spawn\""); file.WriteLine(" \"spawnflags\" \"0\""); file.WriteLine(" \"classname\" \"logic_relay\""); file.WriteLine(" \"OnTrigger\" \"hard_route_blockerEnable0-1\""); file.WriteLine(" \"OnTrigger\" \"hard_route_blockerEnableCollision0-1\""); file.WriteLine("}"); file.WriteLine(""); } for(int i=MaxClients; i < ARRAY_SIZE; i++) { if(g_bSpawned[i] && IsValidEntity(i)) { GetEdictClassname(i, classname, sizeof(classname)); if(StrContains(classname, "prop_dynamic") >= 0 || StrContains(classname, "prop_physics") >= 0) { GetEntPropVector(i, Prop_Send, "m_vecOrigin", vecOrigin); vecAngles = g_vecEntityAngles[i]; GetEntPropString(i, Prop_Data, "m_ModelName", sModel, sizeof(sModel)); iOrigin[0] = RoundToFloor(vecOrigin[0]); iOrigin[1] = RoundToFloor(vecOrigin[1]); iOrigin[2] = RoundToFloor(vecOrigin[2]); iAngles[0] = RoundToFloor(vecAngles[0]); iAngles[1] = RoundToFloor(vecAngles[1]); iAngles[2] = RoundToFloor(vecAngles[2]); file.WriteLine("{"); if(StrContains(classname, "physics") < 0) { if(g_bUnsolid[i]) { file.WriteLine(" \"solid\" \"0\""); } else { file.WriteLine(" \"solid\" \"6\""); } } file.WriteLine(" \"origin\" \"%i %i %i\"", iOrigin[0], iOrigin[1], iOrigin[2]); file.WriteLine(" \"angles\" \"%i %i %i\"", iAngles[0], iAngles[1], iAngles[2]); file.WriteLine(" \"model\" \"%s\"", sModel); file.WriteLine(" \"targetname\" \"%s\"", targetname); file.WriteLine(" \"classname\" \"%s\"", classname); file.WriteLine("}"); file.WriteLine(""); } } } FlushFile(file); CloseHandle(file); PrintToChat(client, "\x03[SM] %T (%s)", "Succesfully saved the map data", client, FileName); } void SavePluginProps(int client) { LogSpawn("%N saved the objects for this map on a \"Plugin Cache\" file format", client); PrintToChat(client, "\x04[SM] Saving the content. Please Wait"); char FileName[256]; char map[256]; char classname[256]; char FileNameS[256]; char FileNameT[256]; File file; GetCurrentMap(map, sizeof(map)); BuildPath(Path_SM, FileNameS, sizeof(FileNameS), "../stripper/plugin_cache/%s", map); Format(FileName, sizeof(FileName), "%s_1.txt", FileNameS); int map_number = 0; if(FileExists(FileName)) { map_number = GetNextMapNumber(FileNameS); if(map_number <= 0) { PrintToChat(client, "\x04[SM] Fatal Error: Too Many path files for this map! (Max: %i)", MAX_PATHS); return; } Format(FileNameT, sizeof(FileNameT), "%s_%i.txt", FileNameS, map_number); } else { Format(FileNameT, sizeof(FileNameT), "%s_1.txt", FileNameS); } file = OpenFile(FileNameT, "a+"); if(file == null) { PrintToChat(client, "[SM] Failed to create or overwrite the map file"); PrintToChat(client, "\x04[SM] Something was probably missing during installation"); PrintHintText(client, "[SM] Probably missing addons/stripper/maps/plugin_cache folder"); PrintToConsole(client, "[SM] Unable to open, write, or find the file!"); PrintCenterText(client, "[SM] FAILURE"); return; } CreateInitFile(); float vecOrigin[3]; float vecAngles[3]; char sModel[256]; char sTime[256]; int iOrigin[3], iAngles[3]; int count = 0; FormatTime(sTime, sizeof(sTime), "%Y/%m/%d"); file.WriteLine("//----------FILE MODIFICATION (YY/MM/DD): [%s] ---------------||", sTime); file.WriteLine("//----------BY: %N----------------------||", client); file.WriteLine(""); file.WriteLine("\"Objects_Cache\""); file.WriteLine("{"); for(int i=MaxClients; i < ARRAY_SIZE; i++) { if(g_bSpawned[i] && IsValidEntity(i)) { GetEdictClassname(i, classname, sizeof(classname)); if(StrContains(classname, "prop_dynamic") >= 0 || StrContains(classname, "prop_physics") >= 0) { GetEntPropVector(i, Prop_Send, "m_vecOrigin", vecOrigin); vecAngles = g_vecEntityAngles[i]; GetEntPropString(i, Prop_Data, "m_ModelName", sModel, sizeof(sModel)); iOrigin[0] = RoundToFloor(vecOrigin[0]); iOrigin[1] = RoundToFloor(vecOrigin[1]); iOrigin[2] = RoundToFloor(vecOrigin[2]); iAngles[0] = RoundToFloor(vecAngles[0]); iAngles[1] = RoundToFloor(vecAngles[1]); iAngles[2] = RoundToFloor(vecAngles[2]); count++; file.WriteLine(" \"object_%i\"", count); file.WriteLine(" {"); if(StrContains(classname, "physics") < 0) { if(g_bUnsolid[i]) { file.WriteLine(" \"solid\" \"0\""); } else { file.WriteLine(" \"solid\" \"6\""); } } file.WriteLine(" \"origin\" \"%i %i %i\"", iOrigin[0], iOrigin[1], iOrigin[2]); file.WriteLine(" \"angles\" \"%i %i %i\"", iAngles[0], iAngles[1], iAngles[2]); file.WriteLine(" \"model\" \"%s\"", sModel); file.WriteLine(" \"classname\" \"%s\"", classname); file.WriteLine(" }"); file.WriteLine(" "); } } } file.WriteLine(" \"total_cache\""); file.WriteLine(" {"); file.WriteLine(" \"total\" \"%i\"", count); file.WriteLine(" }"); file.WriteLine("}"); FlushFile(file); CloseHandle(file); PrintToChat(client, "\x03[SM] %T (%s)", "Succesfully saved the map data", client, FileNameT); } public Action CmdLoad(int client, int args) { if(args < 1) { PrintToChat(client, "[SM] Specify a map number"); } char arg[5]; GetCmdArgString(arg, sizeof(arg)); int number = StringToInt(arg); LoadPluginProps(client, number); return Plugin_Handled; } void LoadPluginProps(int client, int number) { LogSpawn("%N loaded the objects for this map", client); PrintToChat(client, "\x04[SM] Loading content. Please Wait"); char KvFileName[256]; char map[256]; char name[256]; GetCurrentMap(map, sizeof(map)); BuildPath(Path_SM, KvFileName, sizeof(KvFileName), "../stripper/plugin_cache/%s_%i.txt", map, number); if(!FileExists(KvFileName)) { PrintToChat(client, "\x04[SM] The file does not exist"); PrintHintText(client, "\x04[SM] The file does not exist"); return; } KeyValues keyvalues = new KeyValues("Objects_Cache"); keyvalues.ImportFromFile(KvFileName); keyvalues.Rewind(); if(keyvalues.JumpToKey("total_cache")) { int max = keyvalues.GetNum("total", 0); if(max <= 0) { PrintToChat(client, "\x04[SM] No objects found in the cache"); return; } char model[256]; char class[64]; float vecOrigin[3]; float vecAngles[3]; int solid; keyvalues.Rewind(); for(int count=1; count <= max; count++) { Format(name, sizeof(name), "object_%i", count); if(keyvalues.JumpToKey(name)) { solid = keyvalues.GetNum("solid"); keyvalues.GetVector("origin", vecOrigin); keyvalues.GetVector("angles", vecAngles); keyvalues.GetString("model", model, sizeof(model)); keyvalues.GetString("classname", class, sizeof(class)); int prop = -1; keyvalues.Rewind(); if(StrContains(class, "prop_physics") >= 0) { prop = CreateEntityByName("prop_physics_override"); } else { prop = CreateEntityByName("prop_dynamic_override"); SetEntProp(prop, Prop_Send, "m_nSolidType", solid); } DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); g_vecLastEntityAngles[client][0] = vecAngles[0]; g_vecLastEntityAngles[client][1] = vecAngles[1]; g_vecLastEntityAngles[client][2] = vecAngles[2]; DispatchKeyValueVector(prop, "angles", vecAngles); DispatchSpawn(prop); TeleportEntity(prop, vecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = vecAngles; } else { break; } } } CloseHandle(keyvalues); PrintToChat(client, "\x03[SM] Succesfully loaded the map data"); PrintHintText(client, "[SM] If nothing is visible, you probably forgot something during installation"); } public Action CmdRotate(int client, int args) { if(args < 2) { PrintToChat(client, "[SM] Usage: sm_prop_rotate [EX: !prop_rotate x 30]"); return Plugin_Handled; } int Object = g_iLastObject[client]; char arg1[16]; char arg2[16]; GetCmdArg(1, arg1, sizeof(arg1)); GetCmdArg(2, arg2, sizeof(arg2)); float vecAngles[3]; vecAngles[0] = g_vecLastEntityAngles[client][0]; vecAngles[1] = g_vecLastEntityAngles[client][1]; vecAngles[2] = g_vecLastEntityAngles[client][2]; int iAngles = StringToInt(arg2); if(strcmp(arg1, "x")== 0) { vecAngles[0] += iAngles; } else if(strcmp(arg1, "y")== 0) { vecAngles[1] += iAngles; } else if(strcmp(arg1, "z")== 0) { vecAngles[2] += iAngles; } else { PrintToChat(client, "[SM] Invalid Axys (x,y,z are allowed)"); } g_vecLastEntityAngles[client] = vecAngles; TeleportEntity(Object, NULL_VECTOR, vecAngles, NULL_VECTOR); g_vecEntityAngles[g_iLastObject[client]] = vecAngles; return Plugin_Handled; } public Action CmdRemoveLast(int client, int args) { DeleteLastProp(client); return Plugin_Handled; } public Action CmdRemoveLook(int client, int args) { DeleteLookingEntity(client); return Plugin_Handled; } public Action CmdRemoveAll(int client, int args) { PrintToChat(client, "\x04[SM] %T","Are you sure(Delete All)?",client); BuildDeleteAllCmd(client); return Plugin_Handled; } Menu BuildDeleteAllCmd(int client) { Menu menu = new Menu(MenuHandler_cmd_Ask); menu.SetTitle("%T", "Are you sure?", client); menu.AddItem("sm_spyes", Translate(client, "%t", "Yes")); menu.AddItem("sm_spno", Translate(client, "%t", "No")); menu.ExitButton = true; menu.Display(client, MENU_TIME_FOREVER); } public int MenuHandler_cmd_Ask(Menu menu, MenuAction action, int param1, int param2) { switch(action) { case MenuAction_Select: { char menucmd[256]; GetMenuItem(menu, param2, menucmd, sizeof(menucmd)); if(strcmp(menucmd, "sm_spyes")== 0) { DeleteAllProps(); PrintToChat(param1, "[SM] %T", "Successfully deleted all spawned objects", param1); } else { PrintToChat(param1, "[SM] %T", "Canceled", param1); } } case MenuAction_Cancel: { } case MenuAction_End: { delete menu; } } } int GetNextMapNumber(char[] FileName) { char FileNameS[256]; for(int i=1; i <= MAX_PATHS; i++) { Format(FileNameS, sizeof(FileNameS), "%s_%i.txt", FileName, i); if(FileExists(FileNameS)) { continue; } else { return i; } } return -1; } void SpawnObjects() { //if disabled if(!g_cvarAutoload.BoolValue) { return; } char KvFileName[256]; char name[256]; BuildPath(Path_SM, KvFileName, sizeof(KvFileName), "../stripper/plugin_cache/%s.txt", g_sPath); LogSpawn("Spawning props from file %s", KvFileName); if(!FileExists(KvFileName)) { LogError("Attempted to load an object file which does not exist (%s)", KvFileName); LogSpawn("[ERROR] Attempted to load an object file which does not exist (%s)", KvFileName); return; } KeyValues keyvalues = new KeyValues("Objects_Cache"); keyvalues.ImportFromFile(KvFileName); keyvalues.Rewind(); if(keyvalues.JumpToKey("total_cache")) { int max = keyvalues.GetNum("total", 0); if(max <= 0) { LogError("No Objects found for the map number cache"); LogSpawn("[ERROR] No Objects found for the map number cache"); return; } char model[256]; char class[64]; float vecOrigin[3]; float vecAngles[3]; int solid; keyvalues.Rewind(); for(int count=1; count <= max; count++) { Format(name, sizeof(name), "object_%i", count); if(keyvalues.JumpToKey(name)) { solid = keyvalues.GetNum("solid"); keyvalues.GetVector("origin", vecOrigin); keyvalues.GetVector("angles", vecAngles); keyvalues.GetString("model", model, sizeof(model)); keyvalues.GetString("classname", class, sizeof(class)); int prop = -1; keyvalues.Rewind(); if(StrContains(class, "prop_physics") >= 0) { prop = CreateEntityByName("prop_physics_override"); } else { prop = CreateEntityByName("prop_dynamic_override"); SetEntProp(prop, Prop_Send, "m_nSolidType", solid); } DispatchKeyValue(prop, "model", model); DispatchKeyValue(prop, "targetname", "l4d2_spawn_props_prop"); DispatchKeyValueVector(prop, "angles", vecAngles); DispatchSpawn(prop); TeleportEntity(prop, vecOrigin, NULL_VECTOR, NULL_VECTOR); g_bSpawned[prop] = true; g_vecEntityAngles[prop] = vecAngles; } else { break; } } } CloseHandle(keyvalues); } void CreateInitFile() { char FileName[256]; char map[256]; File file; GetCurrentMap(map, sizeof(map)); BuildPath(Path_SM, FileName, sizeof(FileName), "../stripper/plugin_cache/%s_init.txt", map); if(!FileExists(FileName)) { file = OpenFile(FileName, "a+"); if(file == null) { return; } file.WriteLine("//Init file for map %s", map); file.WriteLine("//DO NOT FORGET TO REPLACE \" FOR QUOTES!"); file.WriteLine("//"); file.WriteLine("//The format of the file is:"); file.WriteLine("//"); file.WriteLine("// \"coop\" --------> This is the gamemode where the following object list will be loaded"); file.WriteLine("// {"); file.WriteLine("// \"total\" \"2\" ---------> This is the total object list availables. Randomly, one will be selected"); file.WriteLine("// \"path1\" \"c5m2_park_1\" -------------> If the plugin chooses the option 1, the file c5m2_park_1.txt will be loaded"); file.WriteLine("// \"path2\" \"c5m2_park_3\" -------------> Same if the option is 2"); file.WriteLine("// }"); file.WriteLine("//"); file.WriteLine("// If you have any doubts, please check the example_init.txt file or ask on the plugin topic."); file.WriteLine("//"); file.WriteLine(""); file.WriteLine("\"PathInit\""); file.WriteLine("{"); file.WriteLine(" \"coop\""); file.WriteLine(" {"); file.WriteLine(" "); file.WriteLine(" }"); file.WriteLine(" "); file.WriteLine(" \"versus\""); file.WriteLine(" {"); file.WriteLine(" "); file.WriteLine(" }"); file.WriteLine(" "); file.WriteLine(" \"survival\""); file.WriteLine(" {"); file.WriteLine(" "); file.WriteLine(" }"); file.WriteLine(" "); file.WriteLine(" \"scavenge\""); file.WriteLine(" {"); file.WriteLine(" "); file.WriteLine(" }"); file.WriteLine("}"); FlushFile(file); CloseHandle(file); } } void GetRandomMapPath(char[] MapName, int maxlen) { char KvFileName[256]; char sMap[128]; char GameMode[128]; GetCurrentMap(sMap, sizeof(sMap)); BuildPath(Path_SM, KvFileName, sizeof(KvFileName), "../stripper/plugin_cache/%s_init.txt", sMap); if(!FileExists(KvFileName)) { LogError("Unable to find the init file!"); } else { KeyValues keyvalues = new KeyValues("PathInit"); keyvalues.ImportFromFile(KvFileName); keyvalues.Rewind(); ConVar cvarGameMode = FindConVar("mp_gamemode"); cvarGameMode.GetString(GameMode, sizeof(GameMode)); if(keyvalues.JumpToKey(GameMode)) { char sNumber[11]; int total_paths = keyvalues.GetNum("total"); int random = GetRandomInt(1, total_paths); Format(sNumber, sizeof(sNumber), "path%i", random); keyvalues.GetString(sNumber, MapName, maxlen); CloseHandle(keyvalues); return; } else { LogError("Unable to find the gamemode"); Format(MapName, maxlen, "invalid"); CloseHandle(keyvalues); return; } } Format(MapName, maxlen, "invalid"); return; } public Action CmdMove(int client, int args) { if(args < 2) { PrintToChat(client, "[SM] Usage: sm_prop_move [EX: !prop_move x 30]"); return Plugin_Handled; } int Object = g_iLastObject[client]; char arg1[16]; char arg2[16]; GetCmdArg(1, arg1, sizeof(arg1)); GetCmdArg(2, arg2, sizeof(arg2)); float vecPosition[3]; GetEntPropVector(Object, Prop_Data, "m_vecOrigin", vecPosition); float flPosition = StringToFloat(arg2); if(strcmp(arg1, "x")== 0) { vecPosition[0] += flPosition; } else if(strcmp(arg1, "y")== 0) { vecPosition[1] += flPosition; } else if(strcmp(arg1, "z")== 0) { vecPosition[2] += flPosition; } else { PrintToChat(client, "[SM] Invalid Axys (x,y,z are allowed)"); } g_bGrab[client] = false; g_bGrabbed[Object] = false; TeleportEntity(Object, vecPosition, NULL_VECTOR, NULL_VECTOR); return Plugin_Handled; } public Action CmdSetAngles(int client, int args) { if(args < 3) { PrintToChat(client, "[SM] Usage: sm_prop_setang [EX: !prop_setang 30 0 34"); return Plugin_Handled; } int Object = g_iLastObject[client]; char arg1[16]; char arg2[16]; char arg3[16]; GetCmdArg(1, arg1, sizeof(arg1)); GetCmdArg(2, arg2, sizeof(arg2)); GetCmdArg(3, arg3, sizeof(arg3)); float vecAngles[3]; vecAngles[0] = StringToFloat(arg1); vecAngles[1] = StringToFloat(arg2); vecAngles[2] = StringToFloat(arg3); g_vecLastEntityAngles[client] = vecAngles; g_vecEntityAngles[Object] = vecAngles; g_bGrab[client] = false; g_bGrabbed[Object] = false; TeleportEntity(Object, NULL_VECTOR, vecAngles, NULL_VECTOR); return Plugin_Handled; } public Action CmdSetPosition(int client, int args) { if(args < 3) { PrintToChat(client, "[SM] Usage: sm_prop_setpos [EX: !prop_setpos 505 -34 17"); return Plugin_Handled; } int Object = g_iLastObject[client]; char arg1[16]; char arg2[16]; char arg3[16]; GetCmdArg(1, arg1, sizeof(arg1)); GetCmdArg(2, arg2, sizeof(arg2)); GetCmdArg(3, arg3, sizeof(arg3)); float vecPosition[3]; vecPosition[0] = StringToFloat(arg1); vecPosition[1] = StringToFloat(arg2); vecPosition[2] = StringToFloat(arg3); TeleportEntity(Object, vecPosition, NULL_VECTOR, NULL_VECTOR); return Plugin_Handled; } /* ////////////////////////////////////////////////////////////////////////////| Build File Directories | \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| */ public void BuildFileDirectories() { for(int Num; Num < sizeof(FolderNames); Num++) { if(!DirExists(FolderNames[Num])) { CreateDirectory(FolderNames[Num], 509); } } } stock char[] Translate(int client, const char[] format, any ...) { char buffer[192]; SetGlobalTransTarget(client); VFormat(buffer, sizeof(buffer), format, 3); return buffer; }