1199 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			1199 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#include <sourcemod>
 | 
						|
#include <sdktools>
 | 
						|
#include <sdkhooks>
 | 
						|
#include <hexprops>
 | 
						|
#include <hexstocks>
 | 
						|
 | 
						|
#define PLUGIN_AUTHOR         "Hexah"
 | 
						|
#define PLUGIN_VERSION        "<TAG>"
 | 
						|
 | 
						|
#pragma semicolon 1
 | 
						|
#pragma newdecls required
 | 
						|
 | 
						|
//Handle
 | 
						|
Handle fOnPressProp;
 | 
						|
//Int
 | 
						|
int iEntHP[MAX_ENTITIES];
 | 
						|
 | 
						|
//Boolean
 | 
						|
bool bMoveProp[MAXPLAYERS+1];
 | 
						|
bool bPhysicProp[MAXPLAYERS+1];
 | 
						|
 | 
						|
//String
 | 
						|
char sPropPath[PLATFORM_MAX_PATH];
 | 
						|
 | 
						|
//Kv
 | 
						|
KeyValues PropKv;
 | 
						|
 | 
						|
//Arrays
 | 
						|
ArrayList PropsArray;
 | 
						|
 | 
						|
#include HexProps/model_moving.sp
 | 
						|
 | 
						|
//Plugin Info
 | 
						|
public Plugin myinfo =
 | 
						|
{
 | 
						|
	name = "HexProps, jenz edit for fixing (or causing) bugs",
 | 
						|
	author = PLUGIN_AUTHOR,
 | 
						|
	description = "Place, edit & save props!",
 | 
						|
	version = PLUGIN_VERSION,
 | 
						|
	url = "github.com/Hexer10/HexProps"
 | 
						|
};
 | 
						|
 | 
						|
//Startup
 | 
						|
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
 | 
						|
{
 | 
						|
	
 | 
						|
	RegPluginLibrary("hexprops");
 | 
						|
	CreateNative("IsEntProp", Native_IsEntProp);
 | 
						|
	
 | 
						|
	fOnPressProp = CreateGlobalForward("OnPlayerPressProp", ET_Ignore, Param_Cell, Param_Cell);
 | 
						|
}
 | 
						|
 | 
						|
public void OnPluginStart()
 | 
						|
{
 | 
						|
	PropsArray = new ArrayList();
 | 
						|
	RegAdminCmd("sm_props", Cmd_Props, ADMFLAG_GENERIC);
 | 
						|
	HookEvent("round_poststart", Event_RoundPostStart);
 | 
						|
}
 | 
						|
 | 
						|
public void OnMapStart()
 | 
						|
{
 | 
						|
	PreparePropKv();
 | 
						|
}
 | 
						|
public void OnMapEnd()
 | 
						|
{
 | 
						|
	delete PropKv;
 | 
						|
}
 | 
						|
 | 
						|
void PreparePropKv()
 | 
						|
{
 | 
						|
	char sMap[64];
 | 
						|
	GetCurrentMap(sMap, sizeof(sMap));
 | 
						|
	
 | 
						|
	BuildPath(Path_SM, sPropPath, sizeof(sPropPath), "configs/props/%s.props.txt", sMap); //Get the right "map" file
 | 
						|
	PropKv = new KeyValues("Props");
 | 
						|
	
 | 
						|
	if (!FileExists(sPropPath)) //Try to create kv file.
 | 
						|
		if (!PropKv.ExportToFile(sPropPath))
 | 
						|
			SetFailState(" - Props - Unable to (Kv)File: %s", sPropPath);
 | 
						|
	
 | 
						|
	if (!PropKv.ImportFromFile(sPropPath)) //Import the kv file
 | 
						|
		SetFailState("- Props - Unable to import: %s", sPropPath);
 | 
						|
}
 | 
						|
 | 
						|
//Commands
 | 
						|
public Action Cmd_Props(int client, int args)
 | 
						|
{
 | 
						|
	CreateMainMenu(client).Display(client, MENU_TIME_FOREVER);
 | 
						|
	return Plugin_Handled;
 | 
						|
}
 | 
						|
 | 
						|
//Events
 | 
						|
public void Event_RoundPostStart(Event event, const char[] name, bool dontBroadcast)
 | 
						|
{
 | 
						|
	PropsArray.Clear();
 | 
						|
	LoadProps();
 | 
						|
}
 | 
						|
 | 
						|
public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
 | 
						|
{
 | 
						|
	Moving_OnPlayerRunCmd(client, buttons);
 | 
						|
	
 | 
						|
	if (buttons & IN_USE)
 | 
						|
	{
 | 
						|
		int iEnt = GetAimEnt(client);
 | 
						|
		
 | 
						|
		if (FindInArray(iEnt) == -1)
 | 
						|
		{
 | 
						|
			Call_StartForward(fOnPressProp);
 | 
						|
			Call_PushCell(client);
 | 
						|
			Call_PushCell(iEnt);
 | 
						|
			Call_Finish();
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//Menu
 | 
						|
Menu CreateMainMenu(int client)
 | 
						|
{
 | 
						|
	//Prepare MainMenu
 | 
						|
	Menu MainMenu = new Menu(Handler_Main);
 | 
						|
	
 | 
						|
	MainMenu.SetTitle("Props");
 | 
						|
	
 | 
						|
	
 | 
						|
	char sMoveDisplay[32];
 | 
						|
	char sPhysicDisplay[32];
 | 
						|
	Format(sMoveDisplay, sizeof(sMoveDisplay), "Move: %s", bMoveProp[client]? "On" : "Off");
 | 
						|
	Format(sPhysicDisplay, sizeof(sPhysicDisplay), "Physic: %s", bPhysicProp[client]? "On" : "Off");
 | 
						|
	
 | 
						|
	MainMenu.AddItem("Place", "Place New Prop");
 | 
						|
	MainMenu.AddItem("Remove", "Remove Props");
 | 
						|
	MainMenu.AddItem("Edit", "Edit Props");
 | 
						|
	MainMenu.AddItem("Safe", "Save Props");
 | 
						|
	MainMenu.AddItem("Move", sMoveDisplay);
 | 
						|
	MainMenu.AddItem("Physic", sPhysicDisplay);
 | 
						|
	MainMenu.AddItem("Reset", "Reset Props");
 | 
						|
	MainMenu.AddItem("DeleteAll", "Delete All Props");
 | 
						|
	
 | 
						|
	return MainMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreatePropMenu()
 | 
						|
{
 | 
						|
	//Prepare PropMenu
 | 
						|
	char sPath[PLATFORM_MAX_PATH];
 | 
						|
	BuildPath(Path_SM, sPath, sizeof(sPath), "configs/props/props_list.txt"); //Get prop_list file
 | 
						|
	
 | 
						|
	KeyValues kv = new KeyValues("Props");
 | 
						|
	
 | 
						|
	if (!kv.ImportFromFile(sPath))
 | 
						|
		SetFailState("- Props - Unable to import: %s", sPath);
 | 
						|
	
 | 
						|
	if (!kv.GotoFirstSubKey())
 | 
						|
		SetFailState(" - Props - Unable to read: %s", sPath);
 | 
						|
	
 | 
						|
	Menu PropMenu = new Menu(Handler_Props);
 | 
						|
	
 | 
						|
	PropMenu.SetTitle("Props");
 | 
						|
	
 | 
						|
	do //Loop all kv keys
 | 
						|
	{
 | 
						|
		char sName[64];
 | 
						|
		char sModel[PLATFORM_MAX_PATH];
 | 
						|
		
 | 
						|
		kv.GetSectionName(sName, sizeof(sName));
 | 
						|
		kv.GetString("model", sModel, sizeof(sModel));
 | 
						|
		PropMenu.AddItem(sModel, sName);
 | 
						|
	}
 | 
						|
	while (kv.GotoNextKey());
 | 
						|
	
 | 
						|
	delete kv;
 | 
						|
	
 | 
						|
	PropMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return PropMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateEditMenu()
 | 
						|
{
 | 
						|
	//Prepare EditMenu
 | 
						|
	Menu EditMenu = new Menu(Handler_Edit);
 | 
						|
	
 | 
						|
	EditMenu.SetTitle("Edit");
 | 
						|
	
 | 
						|
	EditMenu.AddItem("Alpha", "Set Transparency");
 | 
						|
	EditMenu.AddItem("Color", "Set Color");
 | 
						|
	EditMenu.AddItem("Life", "Set LifePoints");
 | 
						|
	EditMenu.AddItem("Solid", "Set Consistency");
 | 
						|
	EditMenu.AddItem("Size", "Set Size (Not working on all props)");
 | 
						|
	EditMenu.AddItem("Physic", "Make Physic");
 | 
						|
	EditMenu.AddItem("Rotate", "Rotate props");
 | 
						|
	
 | 
						|
	EditMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return EditMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateDeleteAllMenu()
 | 
						|
{
 | 
						|
	Menu DeleteAllMenu = new Menu(Handler_DeleteAll);
 | 
						|
	
 | 
						|
	DeleteAllMenu.SetTitle("Are you sure?");
 | 
						|
	
 | 
						|
	DeleteAllMenu.AddItem("", "If you want to go back", ITEMDRAW_DISABLED);
 | 
						|
	DeleteAllMenu.AddItem("", "after you deleted the props", ITEMDRAW_DISABLED);
 | 
						|
	DeleteAllMenu.AddItem("", "press Reset Props and do NOT save the props!", ITEMDRAW_DISABLED);
 | 
						|
	DeleteAllMenu.AddItem("0", "NO");
 | 
						|
	DeleteAllMenu.AddItem("1", "YES");
 | 
						|
	
 | 
						|
	DeleteAllMenu.ExitBackButton = true;
 | 
						|
	return DeleteAllMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateColorMenu()
 | 
						|
{
 | 
						|
	//Prepare ColorMenu
 | 
						|
	Menu ColorMenu = new Menu(Handler_Color);
 | 
						|
	
 | 
						|
	ColorMenu.SetTitle("Color");
 | 
						|
	
 | 
						|
	ColorMenu.AddItem("Default", "Default");
 | 
						|
	ColorMenu.AddItem("Red", "Red");
 | 
						|
	ColorMenu.AddItem("Blue", "Blue");
 | 
						|
	ColorMenu.AddItem("Green", "Green");
 | 
						|
	ColorMenu.AddItem("Yellow", "Yellow");
 | 
						|
	ColorMenu.AddItem("Pink", "Pink");
 | 
						|
	ColorMenu.AddItem("Black", "Black");
 | 
						|
	
 | 
						|
	ColorMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return ColorMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateAlphaMenu()
 | 
						|
{
 | 
						|
	//Prepare AlphaMenu
 | 
						|
	Menu AlphaMenu = new Menu(Handler_Alpha);
 | 
						|
	
 | 
						|
	AlphaMenu.SetTitle("Trasparency");
 | 
						|
	
 | 
						|
	AlphaMenu.AddItem("255", "Full Visible");
 | 
						|
	AlphaMenu.AddItem("191", "75% Visible");
 | 
						|
	AlphaMenu.AddItem("127", "Half Visible");
 | 
						|
	AlphaMenu.AddItem("63", "25% Visible");
 | 
						|
	AlphaMenu.AddItem("0", "Invisible");
 | 
						|
	
 | 
						|
	AlphaMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return AlphaMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateLifeMenu()
 | 
						|
{
 | 
						|
	//Prepare LifeMenu
 | 
						|
	Menu LifeMenu = new Menu(Handler_Life);
 | 
						|
	
 | 
						|
	LifeMenu.SetTitle("LifePoints");
 | 
						|
	
 | 
						|
	LifeMenu.AddItem("0", "Unbreakable");
 | 
						|
	LifeMenu.AddItem("50", "50HP");
 | 
						|
	LifeMenu.AddItem("100", "100HP");
 | 
						|
	LifeMenu.AddItem("200", "200HP");
 | 
						|
	
 | 
						|
	LifeMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return LifeMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateSolidMenu()
 | 
						|
{
 | 
						|
	Menu SolidMenu = new Menu(Handler_Solid);
 | 
						|
	
 | 
						|
	SolidMenu.SetTitle("Consistency");
 | 
						|
	
 | 
						|
	SolidMenu.AddItem("6", "Solid");
 | 
						|
	SolidMenu.AddItem("1", "Un-Solid");
 | 
						|
	
 | 
						|
	SolidMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return SolidMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateSizeMenu()
 | 
						|
{
 | 
						|
	Menu SizeMenu = new Menu(Handler_Size);
 | 
						|
	
 | 
						|
	SizeMenu.SetTitle("Size");
 | 
						|
	
 | 
						|
	SizeMenu.AddItem("1.0", "Default");
 | 
						|
	SizeMenu.AddItem("2.0", "Double");
 | 
						|
	SizeMenu.AddItem("3.0", "Triple");
 | 
						|
	SizeMenu.AddItem("4.0", "Quadruple");
 | 
						|
	SizeMenu.AddItem("0.5", "Half");
 | 
						|
	
 | 
						|
	SizeMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return SizeMenu;
 | 
						|
}
 | 
						|
 | 
						|
Menu CreateRotateMenu()
 | 
						|
{
 | 
						|
	Menu RotateXMenu = new Menu(Handler_RotateX);
 | 
						|
	
 | 
						|
	RotateXMenu.SetTitle("Rotation");
 | 
						|
	
 | 
						|
	RotateXMenu.AddItem("Rotate X +45 Degrees", "Rotate X +45 Degrees");
 | 
						|
	RotateXMenu.AddItem("Rotate Y +45 Degrees", "Rotate Y +45 Degrees");
 | 
						|
	RotateXMenu.AddItem("Rotate Z +45 Degrees", "Rotate Z +45 Degrees");
 | 
						|
	
 | 
						|
	RotateXMenu.ExitBackButton = true;
 | 
						|
	
 | 
						|
	return RotateXMenu;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
//Menu Handlers
 | 
						|
public int Handler_Main(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		if (StrEqual(info, "Place"))
 | 
						|
		{
 | 
						|
			CreatePropMenu().DisplayAt(param1, param2, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if(StrEqual(info, "Remove"))
 | 
						|
		{
 | 
						|
			if (RemoveProp(param1))
 | 
						|
			{
 | 
						|
				PrintToChat(param1, "[HexProps] Prop successfully removed!");
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				PrintToChat(param1, "[HexProps] Prop couldn't be found!");
 | 
						|
			}
 | 
						|
			
 | 
						|
			CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if(StrEqual(info, "Edit"))
 | 
						|
		{
 | 
						|
			CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		
 | 
						|
		
 | 
						|
		else if (StrEqual(info, "Move"))
 | 
						|
		{
 | 
						|
			//PrintToChatAll("param1 value: %N", param1);
 | 
						|
			if (CheckCommandAccess(param1, "generic_admin", ADMFLAG_GENERIC, false))
 | 
						|
			{
 | 
						|
				bMoveProp[param1] = !bMoveProp[param1];
 | 
						|
				PrintToChatAll("%N moving props!", param1);
 | 
						|
			}
 | 
						|
			CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Physic"))
 | 
						|
		{
 | 
						|
			bPhysicProp[param1] = !bPhysicProp[param1];
 | 
						|
			
 | 
						|
			CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Safe"))
 | 
						|
		{
 | 
						|
			bool bSaved = SaveProps();
 | 
						|
			if (bSaved)
 | 
						|
			{
 | 
						|
				PrintToChat(param1, "[HexProps] Props successfully saved!");
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				PrintToChat(param1, "[HexProps] No props were saved!");
 | 
						|
			}
 | 
						|
			CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Reset"))
 | 
						|
		{
 | 
						|
			ResetProps();
 | 
						|
			PrintToChat(param1, "[HexProps] Props successfully resetted!");
 | 
						|
			CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			CreateDeleteAllMenu().Display(param1, 20);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Props(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[PLATFORM_MAX_PATH];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		if (!IsModelPrecached(info))
 | 
						|
			PrecacheModel(info);
 | 
						|
		
 | 
						|
		char sClass[64] = "prop_dynamic_override";
 | 
						|
		if (bPhysicProp[param1])
 | 
						|
		{
 | 
						|
			strcopy(sClass, sizeof(sClass), "prop_physics_multiplayer");
 | 
						|
		}
 | 
						|
 | 
						|
		SpawnTempProp(param1, sClass, info);
 | 
						|
		CreatePropMenu().DisplayAt(param1, GetMenuSelectionPosition(), MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Edit(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		if (StrEqual(info, "Alpha"))
 | 
						|
		{
 | 
						|
			CreateAlphaMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Color"))
 | 
						|
		{
 | 
						|
			CreateColorMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Life"))
 | 
						|
		{
 | 
						|
			CreateLifeMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Solid"))
 | 
						|
		{
 | 
						|
			CreateSolidMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Size"))
 | 
						|
		{
 | 
						|
			CreateSizeMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Rotate"))
 | 
						|
		{
 | 
						|
			CreateRotateMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			MakePhysic(param1);
 | 
						|
			CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		}
 | 
						|
		
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void MakePhysic(int client)
 | 
						|
{
 | 
						|
	int iEnt = GetAimEnt(client);
 | 
						|
	
 | 
						|
	if (iEnt == -1)
 | 
						|
	{
 | 
						|
		PrintToChat(client, "[HexProps] Prop couldn't be found");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	int iIndex = FindInArray(iEnt);
 | 
						|
 | 
						|
	if (!iIndex || iIndex == -1)
 | 
						|
	{
 | 
						|
		PrintToChat(client, "[HexProps] Prop couldn't be found");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	char sModel[PLATFORM_MAX_PATH];
 | 
						|
	float vPos[3];
 | 
						|
	GetEntityModel(iEnt, sModel);
 | 
						|
	GetEntityOrigin(iEnt, vPos);
 | 
						|
 | 
						|
	AcceptEntityInput(iEnt, "kill");
 | 
						|
	PropsArray.Erase(iIndex);
 | 
						|
 | 
						|
	iEnt = -1;
 | 
						|
	iEnt = CreateEntityByName("prop_physics_multiplayer");
 | 
						|
 | 
						|
	if (iEnt == -1)
 | 
						|
	{
 | 
						|
		PrintToChat(client, "[HexProps] Error occured while creating the physic prop!");
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	DispatchKeyValue(iEnt, "Physics Mode", "1");
 | 
						|
	SetEntityModel(iEnt, sModel);
 | 
						|
	DispatchSpawn(iEnt);
 | 
						|
	
 | 
						|
	TeleportEntity(iEnt, vPos, NULL_VECTOR, NULL_VECTOR);
 | 
						|
 | 
						|
	PropsArray.Push(EntIndexToEntRef(iEnt));
 | 
						|
 | 
						|
}
 | 
						|
public int Handler_DeleteAll(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		bool bDelete = view_as<bool>(StringToInt(info));
 | 
						|
		
 | 
						|
		if (bDelete)
 | 
						|
		{
 | 
						|
			if (!PropKv.GotoFirstSubKey())
 | 
						|
				SetFailState("- HexProps - Failed to read: %s", sPropPath);
 | 
						|
				
 | 
						|
			do 
 | 
						|
			{
 | 
						|
				PropKv.DeleteThis();
 | 
						|
			}
 | 
						|
			while (PropKv.GotoNextKey());
 | 
						|
			PropKv.Rewind();
 | 
						|
			
 | 
						|
			for (int i = 0; i < PropsArray.Length; i++)
 | 
						|
			{
 | 
						|
				int iEnt = EntRefToEntIndex(PropsArray.Get(i));
 | 
						|
				if (iEnt == INVALID_ENT_REFERENCE)
 | 
						|
					continue;
 | 
						|
					
 | 
						|
				AcceptEntityInput(iEnt, "kill");
 | 
						|
			}
 | 
						|
			ReplyToCommand(param1, "[SM] Props deleted!");
 | 
						|
		}
 | 
						|
		CreateMainMenu(param1).Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Color(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		int r, g, b;
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		if (StrEqual(info, "Red"))
 | 
						|
		{
 | 
						|
			r = 255;
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Green"))
 | 
						|
		{
 | 
						|
			g = 255;
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Blue"))
 | 
						|
		{
 | 
						|
			b = 255;
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Pink"))
 | 
						|
		{
 | 
						|
			r = 255;
 | 
						|
			g = 102;
 | 
						|
			b = 178;
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Yellow"))
 | 
						|
		{
 | 
						|
			r = 255;
 | 
						|
			g = 255;
 | 
						|
		}
 | 
						|
		else if (StrEqual(info, "Default"))
 | 
						|
		{
 | 
						|
			r = 255;
 | 
						|
			g = 255;
 | 
						|
			b = 255;
 | 
						|
		}
 | 
						|
		else{} //if black dont to anything
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1)
 | 
						|
		{
 | 
						|
			int r2, g2, b2, a;
 | 
						|
			
 | 
						|
			GetEntityRenderColor(iAimEnt, r2, g2, b2, a);
 | 
						|
			SetEntityRenderColor(iAimEnt, r, g, b, a);
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateColorMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Alpha(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1)
 | 
						|
		{
 | 
						|
			int r, g, b, a;
 | 
						|
			SetEntityRenderMode(iAimEnt, RENDER_TRANSCOLOR);
 | 
						|
			GetEntityRenderColor(iAimEnt, r, g, b, a);
 | 
						|
			SetEntityRenderColor(iAimEnt, r, g, b, StringToInt(info));
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateAlphaMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
		
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Life(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		int r, b, g, a;
 | 
						|
		int iLife;
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1)
 | 
						|
		{
 | 
						|
			GetEntityRenderColor(iAimEnt, r, g, b, a);
 | 
						|
			iLife = StringToInt(info);
 | 
						|
			
 | 
						|
			if (iLife)
 | 
						|
			{
 | 
						|
				iEntHP[iAimEnt] = iLife;
 | 
						|
				SetEntProp(iAimEnt, Prop_Data, "m_takedamage", 2);
 | 
						|
				SetEntProp(iAimEnt, Prop_Data, "m_iHealth", iLife);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateLifeMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Solid(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1)
 | 
						|
		{
 | 
						|
			SetEntProp(iAimEnt, Prop_Send, "m_nSolidType", StringToInt(info));
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateSolidMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
public int Handler_Size(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1)
 | 
						|
		{
 | 
						|
			SetEntPropFloat(iAimEnt, Prop_Send, "m_flModelScale", StringToFloat(info));
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateSizeMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
public int Handler_RotateX(Menu menu, MenuAction action, int param1, int param2)
 | 
						|
{
 | 
						|
	if (action == MenuAction_Select)
 | 
						|
	{
 | 
						|
		char info[64];
 | 
						|
		char classname[64];
 | 
						|
		float RotateVec[3];
 | 
						|
		menu.GetItem(param2, info, sizeof(info));
 | 
						|
		
 | 
						|
		int iAimEnt = GetAimEnt(param1);
 | 
						|
		
 | 
						|
		if (FindInArray(iAimEnt) != -1 && iAimEnt != -1)
 | 
						|
		{
 | 
						|
			GetEdictClassname(iAimEnt, classname, sizeof(classname));
 | 
						|
			
 | 
						|
			if (StrEqual(classname, "prop_physics") || StrEqual(classname, "prop_physics_override") || StrEqual(classname, "prop_dynamic") || StrEqual(classname, "prop_dynamic_override") || StrEqual(classname, "prop_physics_multiplayer") || StrEqual(classname, "prop_dynamic_ornament") || StrEqual(classname, "prop_static"))
 | 
						|
			{
 | 
						|
				PrintToChat(param1, "%s", info);
 | 
						|
				GetEntPropVector(iAimEnt, Prop_Send, "m_angRotation", RotateVec);
 | 
						|
				if (StrContains(info, "X", false) >= 0)
 | 
						|
				{
 | 
						|
					RotateVec[0] = RotateVec[0] + 45.0;
 | 
						|
				}
 | 
						|
				else if (StrContains(info, "Y", false) >= 0)
 | 
						|
				{
 | 
						|
					RotateVec[1] = RotateVec[1] + 45.0;
 | 
						|
				}
 | 
						|
				else if (StrContains(info, "Z", false) >= 0)
 | 
						|
				{
 | 
						|
					RotateVec[2] = RotateVec[2] + 45.0;
 | 
						|
				}
 | 
						|
				TeleportEntity(iAimEnt, NULL_VECTOR, RotateVec, NULL_VECTOR);
 | 
						|
				AcceptEntityInput(iAimEnt, "TurnOn", iAimEnt, iAimEnt, 0);
 | 
						|
				AcceptEntityInput(iAimEnt, "EnableCollision");
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			PrintToChat(param1, "[HexProps] Prop couldn't be found");
 | 
						|
		}
 | 
						|
		
 | 
						|
		CreateRotateMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_Cancel)
 | 
						|
	{
 | 
						|
		CreateEditMenu().Display(param1, MENU_TIME_FOREVER);
 | 
						|
	}
 | 
						|
	else if (action == MenuAction_End)
 | 
						|
	{
 | 
						|
		delete menu;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
//Functions
 | 
						|
int SpawnProp(const char[] classname, const char[] model, float vPos[3], float vAng[3], int r, int g, int b, int a, bool solid, int iLife, float fSize)
 | 
						|
{
 | 
						|
	int iEnt = CreateEntityByName(classname);
 | 
						|
	//PrintToChatAll("classname: %s", classname);
 | 
						|
	if (iEnt == -1)
 | 
						|
	{
 | 
						|
		//PrintToChatAll("Failed iEnt = -1");
 | 
						|
		return iEnt;
 | 
						|
	}
 | 
						|
	
 | 
						|
	if (!IsModelPrecached(model))
 | 
						|
		PrecacheModel(model);
 | 
						|
	
 | 
						|
	SetEntityModel(iEnt, model);
 | 
						|
	SetEntityRenderMode(iEnt, RENDER_TRANSCOLOR);
 | 
						|
	SetEntityRenderColor(iEnt, r, b, g, a);
 | 
						|
	
 | 
						|
	SetEntProp(iEnt, Prop_Send, "m_nSolidType", 6);
 | 
						|
	if (!solid)
 | 
						|
		SetEntProp(iEnt, Prop_Send, "m_nSolidType", 1);
 | 
						|
	
 | 
						|
	if (iLife)
 | 
						|
	{
 | 
						|
		SetEntProp(iEnt, Prop_Data, "m_takedamage", 2);
 | 
						|
		iEntHP[iEnt] = iLife;
 | 
						|
		SetEntProp(iEnt, Prop_Data, "m_iHealth", iLife);
 | 
						|
	}
 | 
						|
	
 | 
						|
	SetEntPropFloat(iEnt, Prop_Send, "m_flModelScale", fSize);
 | 
						|
	
 | 
						|
	if (StrContains(classname, "physics") != -1)
 | 
						|
	{
 | 
						|
		DispatchKeyValue(iEnt, "Physics Mode", "1");
 | 
						|
		DispatchSpawn(iEnt);
 | 
						|
	}
 | 
						|
	/*
 | 
						|
	PrintToChatAll("%i", view_as<int>(solid));
 | 
						|
	PrintToChatAll("vPos[0]: %f", vPos[0]);
 | 
						|
	PrintToChatAll("vPos[1]: %f", vPos[1]);
 | 
						|
	PrintToChatAll("vPos[2]: %f", vPos[2]);
 | 
						|
	PrintToChatAll("vAng[0]: %f", vAng[0]);
 | 
						|
	PrintToChatAll("vAng[1]: %f", vAng[1]);
 | 
						|
	PrintToChatAll("vAng[2]: %f", vAng[2]);
 | 
						|
	PrintToChatAll("fSize: %f", fSize);
 | 
						|
	PrintToChatAll("iLife: %i", iLife);
 | 
						|
	PrintToChatAll("model: %s", model);
 | 
						|
	for (int i = 1; i <= MaxClients; i++)
 | 
						|
	{
 | 
						|
		if (IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i))
 | 
						|
		{
 | 
						|
			TeleportEntity(i, vPos, vAng, NULL_VECTOR);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	*/
 | 
						|
	TeleportEntity(iEnt, vPos, vAng, NULL_VECTOR);
 | 
						|
	return iEnt;
 | 
						|
}
 | 
						|
 | 
						|
int SpawnTempProp(int client, const char[] classname, const char[] model)
 | 
						|
{
 | 
						|
	int iEnt = CreateEntityByName(classname);
 | 
						|
	
 | 
						|
	if (iEnt == -1)
 | 
						|
	{
 | 
						|
		CreatePropMenu().Display(client, MENU_TIME_FOREVER);
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
	
 | 
						|
	SetEntityModel(iEnt, model);
 | 
						|
	SetEntProp(iEnt, Prop_Send, "m_nSolidType", 6);
 | 
						|
	SetEntityRenderMode(iEnt, RENDER_TRANSCOLOR);
 | 
						|
	SetEntityRenderColor(iEnt);
 | 
						|
	
 | 
						|
	float vClientPos[3];
 | 
						|
	float vClientAng[3];
 | 
						|
	float vEndPoint[3];
 | 
						|
	float vEndAng[3];
 | 
						|
	
 | 
						|
	GetClientEyePosition(client, vClientPos);
 | 
						|
	GetClientEyeAngles(client, vClientAng);
 | 
						|
	
 | 
						|
	TR_TraceRayFilter(vClientPos, vClientAng, MASK_SOLID, RayType_Infinite, TraceRayDontHitPlayer, client);
 | 
						|
	
 | 
						|
	if (TR_DidHit())
 | 
						|
	{
 | 
						|
		TR_GetEndPosition(vEndPoint);
 | 
						|
		TR_GetPlaneNormal(INVALID_HANDLE, vEndAng);
 | 
						|
		GetVectorAngles(vEndAng, vEndAng);
 | 
						|
		vEndAng[0] += 90.0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		CreatePropMenu().Display(client, MENU_TIME_FOREVER);
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
	
 | 
						|
	if (StrContains(classname, "physics") != -1)
 | 
						|
	{
 | 
						|
		DispatchKeyValue(iEnt, "Physics Mode", "1");
 | 
						|
		DispatchSpawn(iEnt);
 | 
						|
	}
 | 
						|
 | 
						|
	TeleportEntity(iEnt, vEndPoint, vEndAng, NULL_VECTOR);
 | 
						|
	
 | 
						|
	int iIndex = PropsArray.Push(EntIndexToEntRef(iEnt));
 | 
						|
	
 | 
						|
	SetEntityName(iEnt, "Prop_%i", iIndex);
 | 
						|
	
 | 
						|
	return iEnt;
 | 
						|
}
 | 
						|
 | 
						|
bool RemoveProp(int client)
 | 
						|
{
 | 
						|
	int iAimEnt = GetAimEnt(client);
 | 
						|
	int iIndex;
 | 
						|
	
 | 
						|
	if (iAimEnt == -1)
 | 
						|
		return false;
 | 
						|
	
 | 
						|
	iIndex = FindInArray(iAimEnt) != -1;
 | 
						|
 | 
						|
	if (!iIndex)
 | 
						|
		return false;
 | 
						|
 | 
						|
	AcceptEntityInput(iAimEnt, "kill");
 | 
						|
	PropsArray.Erase(iIndex);
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
bool SaveProps()
 | 
						|
{
 | 
						|
	ClearPropKv();
 | 
						|
	
 | 
						|
	char sKey[8];
 | 
						|
	int iCount;
 | 
						|
	bool bReturn = false;
 | 
						|
	
 | 
						|
	for (int i = 0; i < PropsArray.Length; i++)
 | 
						|
	{
 | 
						|
		PropKv.Rewind();
 | 
						|
		IntToString(++iCount, sKey, sizeof(sKey));
 | 
						|
		
 | 
						|
		if (PropKv.JumpToKey(sKey, true))
 | 
						|
		{
 | 
						|
			int iEnt = EntRefToEntIndex(PropsArray.Get(i));
 | 
						|
			
 | 
						|
			if (iEnt == INVALID_ENT_REFERENCE)
 | 
						|
				continue;
 | 
						|
			
 | 
						|
			char sClass[64];
 | 
						|
			char sModel[PLATFORM_MAX_PATH];
 | 
						|
			char sColor[16];
 | 
						|
			float vPos[3];
 | 
						|
			float vAng[3];
 | 
						|
			int r, b, g, a;
 | 
						|
			
 | 
						|
			GetEntityClassname(iEnt, sClass, sizeof(sClass));
 | 
						|
			GetEntityModel(iEnt, sModel);
 | 
						|
			GetEntityOrigin(iEnt, vPos);
 | 
						|
			GetEntityAngles(iEnt, vAng);
 | 
						|
			GetEntityRenderColor(iEnt, r, g, b, a);
 | 
						|
			bool solid = (GetEntProp(iEnt, Prop_Send, "m_nSolidType") == 6);
 | 
						|
			int iLife = iEntHP[iEnt];
 | 
						|
			float fSize = GetEntPropFloat(iEnt, Prop_Send, "m_flModelScale");
 | 
						|
			
 | 
						|
			ColorToString(sColor, sizeof(sColor), r, b, g, a);
 | 
						|
			
 | 
						|
			PropKv.SetString("classname", sClass);
 | 
						|
			PropKv.SetString("model", sModel);
 | 
						|
			PropKv.SetVector("position", vPos);
 | 
						|
			PropKv.SetVector("angles", vAng);
 | 
						|
			PropKv.SetString("color", sColor);
 | 
						|
			PropKv.SetNum("solid", solid);
 | 
						|
			PropKv.SetNum("life", iLife);
 | 
						|
			PropKv.SetFloat("size", fSize);
 | 
						|
			bReturn = true;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	PropKv.Rewind();
 | 
						|
	PropKv.ExportToFile(sPropPath);
 | 
						|
	return bReturn;
 | 
						|
}
 | 
						|
 | 
						|
void LoadProps()
 | 
						|
{
 | 
						|
	if (!PropKv.GotoFirstSubKey())
 | 
						|
		return;
 | 
						|
	
 | 
						|
	PropsArray.Clear();	
 | 
						|
	//needs to edit this part to not rely on keyvalues
 | 
						|
	Handle l_hPropFile = INVALID_HANDLE;
 | 
						|
	char l_cReadLine[128];
 | 
						|
	char sClass[64];
 | 
						|
	char sModel[PLATFORM_MAX_PATH];
 | 
						|
	float vPos[3];
 | 
						|
	float vAng[3];
 | 
						|
	char sColors[24];
 | 
						|
	int r, g, b, a;
 | 
						|
	bool solid;
 | 
						|
	int iLife;
 | 
						|
	float fSize;
 | 
						|
	l_hPropFile = OpenFile(sPropPath, "r");
 | 
						|
	while (!IsEndOfFile(l_hPropFile) && ReadFileLine(l_hPropFile, l_cReadLine, sizeof(l_cReadLine)))
 | 
						|
	{
 | 
						|
		ReplaceString(l_cReadLine, sizeof(l_cReadLine), "\"", "", true);
 | 
						|
		if (StrContains(l_cReadLine, "classname", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "classname", "", true);
 | 
						|
			Format(sClass, sizeof(sClass), l_cReadLine);
 | 
						|
			TrimString(sClass);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "model", false) > -1)
 | 
						|
		{
 | 
						|
			//trimming first part
 | 
						|
			strcopy(l_cReadLine, sizeof(l_cReadLine), l_cReadLine[7]);
 | 
						|
			Format(sModel, sizeof(sModel), l_cReadLine);
 | 
						|
			TrimString(sModel);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "position", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "position", "", true);
 | 
						|
			char sPart[3][64];
 | 
						|
			//spliting on whitespace
 | 
						|
			ExplodeString(l_cReadLine, " ", sPart, 3, 64);
 | 
						|
			vPos[0] = StringToFloat(sPart[0]);
 | 
						|
			vPos[1] = StringToFloat(sPart[1]);
 | 
						|
			vPos[2] = StringToFloat(sPart[2]);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "angles", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "angles", "", true);
 | 
						|
			char sPart[3][64];
 | 
						|
			//spliting on whitespace
 | 
						|
			ExplodeString(l_cReadLine, " ", sPart, 3, 64);
 | 
						|
			vAng[0] = StringToFloat(sPart[0]);
 | 
						|
			vAng[1] = StringToFloat(sPart[1]);
 | 
						|
			vAng[2] = StringToFloat(sPart[2]);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "color", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "color", "", true);
 | 
						|
			Format(sColors, sizeof(sColors), l_cReadLine);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "solid", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "solid", "", true);
 | 
						|
			TrimString(l_cReadLine);
 | 
						|
			solid = view_as<bool>(StringToInt(l_cReadLine));
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "life", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "life", "", true);
 | 
						|
			TrimString(l_cReadLine);
 | 
						|
			iLife = StringToInt(l_cReadLine);
 | 
						|
		}
 | 
						|
		else if (StrContains(l_cReadLine, "size", false) > -1)
 | 
						|
		{
 | 
						|
			ReplaceString(l_cReadLine, sizeof(l_cReadLine), "size", "", true);
 | 
						|
			TrimString(l_cReadLine);
 | 
						|
			fSize = StringToFloat(l_cReadLine);
 | 
						|
			StringToColor(sColors, r, g, b, a);
 | 
						|
			int iEnt = SpawnProp(sClass, sModel, vPos, vAng, r, g, b, a, solid, iLife, fSize);
 | 
						|
			if (iEnt != -1)
 | 
						|
			{
 | 
						|
				//still works good with reading from files
 | 
						|
				int iIndex = PropsArray.Push(EntIndexToEntRef(iEnt));
 | 
						|
				SetEntityName(iEnt, "Prop_%i", iIndex);
 | 
						|
				//PrintToChatAll("iEnt: %i", iEnt);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	delete l_hPropFile;
 | 
						|
	PropKv.Rewind();
 | 
						|
}
 | 
						|
 | 
						|
void ResetProps()
 | 
						|
{
 | 
						|
	for (int i = 0; i < PropsArray.Length; i++)
 | 
						|
	{
 | 
						|
		int iEnt = EntRefToEntIndex(PropsArray.Get(i));
 | 
						|
		
 | 
						|
		if (iEnt != INVALID_ENT_REFERENCE)
 | 
						|
			AcceptEntityInput(iEnt, "kill");
 | 
						|
	}
 | 
						|
	PropsArray.Clear();
 | 
						|
	
 | 
						|
	LoadProps();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
//Trace
 | 
						|
public bool TraceRayDontHitPlayer(int entity, int mask, any data)
 | 
						|
{
 | 
						|
	if(entity != data && entity > MaxClients)
 | 
						|
	{
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
	return false;
 | 
						|
}
 | 
						|
 | 
						|
//Stocks
 | 
						|
void ColorToString(char[] sColor, int maxlength, int r, int g, int b, int a)
 | 
						|
{
 | 
						|
	Format(sColor, maxlength, "%i %i %i %i", r, g, b, a);
 | 
						|
}
 | 
						|
 | 
						|
void StringToColor(char[] sColors, int &r, int &g, int &b, int &a)
 | 
						|
{
 | 
						|
	char sColorsL[4][64];
 | 
						|
	//PrintToChatAll("sColors: %s", sColors);
 | 
						|
	ExplodeString(sColors, " ", sColorsL, sizeof(sColorsL), sizeof(sColorsL[]));
 | 
						|
	r = StringToInt(sColorsL[0]);
 | 
						|
	g = StringToInt(sColorsL[1]);
 | 
						|
	b = StringToInt(sColorsL[2]);
 | 
						|
	a = StringToInt(sColorsL[3]);
 | 
						|
}
 | 
						|
 | 
						|
void ClearPropKv()
 | 
						|
{
 | 
						|
	if (!PropKv.GotoFirstSubKey())
 | 
						|
		return;
 | 
						|
	
 | 
						|
	do
 | 
						|
	{
 | 
						|
		PropKv.DeleteThis();
 | 
						|
	}
 | 
						|
	while (PropKv.GotoNextKey());
 | 
						|
	
 | 
						|
	PropKv.Rewind();
 | 
						|
}
 | 
						|
 | 
						|
int FindInArray(int iEnt)
 | 
						|
{
 | 
						|
	if (iEnt == -1)
 | 
						|
		return 0;
 | 
						|
 | 
						|
	for (int i = 0; i < PropsArray.Length; i++)
 | 
						|
	{
 | 
						|
		int iSavedEnt = EntRefToEntIndex(PropsArray.Get(i));
 | 
						|
		
 | 
						|
		if (iSavedEnt == INVALID_ENT_REFERENCE)
 | 
						|
			return 0;
 | 
						|
 | 
						|
		if (iSavedEnt == iEnt)
 | 
						|
		{
 | 
						|
			return i;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
//Use this(instead of GetClientAimTarget) since we need to get non-solid entites too.
 | 
						|
int GetAimEnt(int client)
 | 
						|
{
 | 
						|
	float vClientPos[3];
 | 
						|
	float vClientAng[3];
 | 
						|
	GetClientEyePosition(client, vClientPos);
 | 
						|
	GetClientEyeAngles(client, vClientAng);
 | 
						|
	TR_TraceRayFilter(vClientPos, vClientAng, MASK_ALL, RayType_Infinite, TraceRayDontHitPlayer, client);
 | 
						|
	int iEnt = TR_GetEntityIndex();
 | 
						|
	//PrintToChatAll("IsValidEntity");
 | 
						|
	
 | 
						|
	if (iEnt == 0) //if it hits nothing dont do anything man
 | 
						|
	{
 | 
						|
		iEnt = -1;
 | 
						|
	}
 | 
						|
	return iEnt;
 | 
						|
}
 | 
						|
public void OnClientDisconnect(int iClient) 
 | 
						|
{
 | 
						|
	bMoveProp[iClient] = false;
 | 
						|
}
 | 
						|
public void OnClientPostAdminCheck(int iClient)
 | 
						|
{
 | 
						|
	bMoveProp[iClient] = false;
 | 
						|
}
 | 
						|
 | 
						|
//Natives
 | 
						|
public int Native_IsEntProp(Handle plugin, int numParams)
 | 
						|
{
 | 
						|
	int iEnt = GetNativeCell(1);
 | 
						|
	
 | 
						|
	return (FindInArray(iEnt) == -1);
 | 
						|
} |