summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/include/smlib/edicts.inc
diff options
context:
space:
mode:
authornavewindre <nw@moneybot.cc>2023-11-13 14:28:08 +0100
committernavewindre <nw@moneybot.cc>2023-11-13 14:28:08 +0100
commitda518fdc0f32839730ccdee8098b59c6f842d93f (patch)
treed6f856a6148c0b4d5819f88f068b7287b8044513 /sourcemod/scripting/include/smlib/edicts.inc
parentbc678b10830cdaef64bcc592ca2524ebe0fcdc45 (diff)
ya
Diffstat (limited to 'sourcemod/scripting/include/smlib/edicts.inc')
-rw-r--r--sourcemod/scripting/include/smlib/edicts.inc127
1 files changed, 127 insertions, 0 deletions
diff --git a/sourcemod/scripting/include/smlib/edicts.inc b/sourcemod/scripting/include/smlib/edicts.inc
new file mode 100644
index 0000000..86f4e2a
--- /dev/null
+++ b/sourcemod/scripting/include/smlib/edicts.inc
@@ -0,0 +1,127 @@
+#if defined _smlib_edicts_included
+ #endinput
+#endif
+#define _smlib_edicts_included
+
+#include <sourcemod>
+#include <smlib/entities>
+
+/*
+ * Finds an edict by it's name
+ * It only finds the first occurence.
+ *
+ * @param name Name of the entity you want so search.
+ * @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
+ */
+stock int Edict_FindByName(const char[] name)
+{
+ int maxEntities = GetMaxEntities();
+ for (int edict=0; edict < maxEntities; edict++) {
+
+ if (!IsValidEdict(edict)) {
+ continue;
+ }
+
+ if (Entity_NameMatches(edict, name)) {
+ return edict;
+ }
+ }
+
+ return INVALID_ENT_REFERENCE;
+}
+
+/*
+ * Finds an edict by its HammerID.
+ * The newer version of Valve's Hammer editor
+ * sets a unique ID for each entity in a map.
+ * It only finds the first occurence.
+ *
+ * @param hammerId Hammer editor ID
+ * @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
+ */
+stock int Edict_FindByHammerId(int hammerId)
+{
+ int maxEntities = GetMaxEntities();
+ for (int edict=0; edict < maxEntities; edict++) {
+
+ if (!IsValidEdict(edict)) {
+ continue;
+ }
+
+ if (Entity_GetHammerId(edict) == hammerId) {
+ return edict;
+ }
+ }
+
+ return INVALID_ENT_REFERENCE;
+}
+
+/**
+ * Searches for the closest edict in relation to the given origin
+ *
+ * @param vecOrigin_center 3 dimensional origin array
+ * @param clientsOnly True if you only want to search for clients
+ * @param ignoreEntity Ignore this entity
+ * @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
+ */
+stock int Edict_GetClosest(float vecOrigin_center[3], bool clientsOnly=false, int ignoreEntity=-1)
+{
+ float vecOrigin_edict[3];
+ float smallestDistance = 0.0;
+ int closestEdict = INVALID_ENT_REFERENCE;
+
+ int maxEntities;
+
+ if (clientsOnly) {
+ maxEntities = MaxClients;
+ }
+ else {
+ maxEntities = GetMaxEntities();
+ }
+
+ for (int edict=1; edict <= maxEntities; edict++) {
+
+ if (!IsValidEdict(edict)) {
+ continue;
+ }
+
+ if (ignoreEntity >= 0 && edict == ignoreEntity) {
+ continue;
+ }
+
+ if (GetEntSendPropOffs(edict, "m_vecOrigin") == -1) {
+ continue;
+ }
+
+ Entity_GetAbsOrigin(edict, vecOrigin_edict);
+
+ float edict_distance = GetVectorDistance(vecOrigin_center, vecOrigin_edict, true);
+
+ if (edict_distance < smallestDistance || smallestDistance == 0.0) {
+ smallestDistance = edict_distance;
+ closestEdict = edict;
+ }
+ }
+
+ return closestEdict;
+}
+
+/**
+ * Searches for the closest edict in relation to the given edict.
+ *
+ * @param edict Edict index
+ * @param clientsOnly True if you only want to search for clients
+ * @return The closest edict or INVALID_ENT_REFERENCE
+ */
+stock int Edict_GetClosestToEdict(int edict, bool clientsOnly=false)
+{
+ float vecOrigin[3];
+
+ if (!HasEntProp(edict, Prop_Send, "m_vecOrigin")) {
+ return INVALID_ENT_REFERENCE;
+ }
+
+ Entity_GetAbsOrigin(edict, vecOrigin);
+
+ return Edict_GetClosest(vecOrigin, clientsOnly, edict);
+}