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);
|
||
|
}
|