|
dvander@174
|
1 |
#ifndef _INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_ |
|
dvander@174
|
2 |
#define _INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_ |
|
dvander@174
|
3 |
|
|
dvander@174
|
4 |
#include <IForwardSys.h> |
|
dvander@174
|
5 |
#include <IPluginSys.h> |
|
dvander@174
|
6 |
|
|
dvander@174
|
7 |
#define SMINTERFACE_FORWARDMANAGER_NAME "IForwardManager" |
|
dvander@174
|
8 |
#define SMINTERFACE_FORWARDMANAGER_VERSION 1 |
|
dvander@174
|
9 |
|
|
dvander@174
|
10 |
namespace SourceMod |
|
dvander@174
|
11 |
{ |
|
dvander@174
|
12 |
enum ResultType |
|
dvander@174
|
13 |
{ |
|
dvander@174
|
14 |
Pl_Continue = 0, /* No result */ |
|
dvander@174
|
15 |
Pl_Handled = 1, /* Result was handled, stop at the end */ |
|
dvander@174
|
16 |
Pl_Stop = 2, /* Result was handled, stop now */ |
|
dvander@174
|
17 |
}; |
|
dvander@174
|
18 |
|
|
dvander@174
|
19 |
enum ExecType |
|
dvander@174
|
20 |
{ |
|
dvander@174
|
21 |
ET_Ignore = 0, /* Ignore all return values, return 0 */ |
|
dvander@174
|
22 |
ET_Single = 1, /* Only return the first exec, ignore all others */ |
|
dvander@174
|
23 |
ET_Event = 2, /* Acts as an event with the ResultTypes above, no mid-Stops allowed, returns highest */ |
|
dvander@174
|
24 |
ET_Hook = 3, /* Acts as a hook with the ResultTypes above, mid-Stops allowed, returns highest */ |
|
dvander@174
|
25 |
}; |
|
dvander@174
|
26 |
|
|
dvander@174
|
27 |
/** |
|
dvander@174
|
28 |
* @brief Abstracts multiple function calling. |
|
dvander@174
|
29 |
* |
|
dvander@174
|
30 |
* NOTE: Parameters should be pushed in forward order, unlike |
|
dvander@174
|
31 |
* the virtual machine/IPluginContext order. |
|
dvander@174
|
32 |
*/ |
|
dvander@174
|
33 |
class IForward : public IPluginFunction |
|
dvander@174
|
34 |
{ |
|
dvander@174
|
35 |
public: |
|
dvander@174
|
36 |
/** |
|
dvander@174
|
37 |
* @brief Returns the name of the forward. |
|
dvander@174
|
38 |
* |
|
dvander@174
|
39 |
* @return Forward name. |
|
dvander@174
|
40 |
*/ |
|
dvander@174
|
41 |
virtual const char *GetForwardName() =0; |
|
dvander@174
|
42 |
|
|
dvander@174
|
43 |
/** |
|
dvander@174
|
44 |
* @brief Pushes a cell onto the current call. |
|
dvander@174
|
45 |
* |
|
dvander@174
|
46 |
* @param cell Parameter value to push. |
|
dvander@174
|
47 |
* @return True if successful, false if type or count mismatch. |
|
dvander@174
|
48 |
*/ |
|
dvander@174
|
49 |
virtual bool PushCell(cell_t cell) =0; |
|
dvander@174
|
50 |
|
|
dvander@174
|
51 |
/** |
|
dvander@174
|
52 |
* @brief Pushes a float onto the current call. |
|
dvander@174
|
53 |
* |
|
dvander@174
|
54 |
* @param float Parameter value to push. |
|
dvander@174
|
55 |
* @return True if successful, false if type or count mismatch. |
|
dvander@174
|
56 |
*/ |
|
dvander@174
|
57 |
virtual bool PushFloat(float number) =0; |
|
dvander@174
|
58 |
|
|
dvander@174
|
59 |
/** |
|
dvander@174
|
60 |
* @brief Pushes an array of cells onto the current call, each cell individually. |
|
dvander@174
|
61 |
* NOTE: This is essentially a crippled version of PushArray(). |
|
dvander@174
|
62 |
* |
|
dvander@174
|
63 |
* @param array Array of cells. |
|
dvander@174
|
64 |
* @param numcells Number of cells in array. |
|
dvander@174
|
65 |
* @param each Whether or not to push as an array or individual cells. |
|
dvander@174
|
66 |
* @return True if successful, false if too many cells were pushed. |
|
dvander@174
|
67 |
*/ |
|
dvander@174
|
68 |
virtual bool PushCells(cell_t array[], unsigned int numcells, bool each) =0; |
|
dvander@174
|
69 |
|
|
dvander@174
|
70 |
/** |
|
dvander@174
|
71 |
* @brief Pushes an array of cells onto the current call. |
|
dvander@174
|
72 |
* |
|
dvander@174
|
73 |
* @param array Array to copy, NULL if no initial array should be copied. |
|
dvander@174
|
74 |
* @param cells Number of cells to allocate and optionally read from the input array. |
|
dvander@174
|
75 |
* @param phys_addr Optional return address for physical array. |
|
dvander@174
|
76 |
* @param copyback Whether or not changes should be copied back to the input array. |
|
dvander@174
|
77 |
* @return True if successful, false otherwise. |
|
dvander@174
|
78 |
*/ |
|
dvander@174
|
79 |
virtual bool PushArray(cell_t *inarray, size_t cells, cell_t **phys_addr, bool copyback) =0; |
|
dvander@174
|
80 |
|
|
dvander@174
|
81 |
/** |
|
dvander@174
|
82 |
* @brief Pushes a string onto the current call. |
|
dvander@174
|
83 |
* |
|
dvander@174
|
84 |
* @param string String to push. |
|
dvander@174
|
85 |
* @return True if successful, false if type or count mismatch. |
|
dvander@174
|
86 |
*/ |
|
dvander@174
|
87 |
virtual bool PushString(const char *string) =0; |
|
dvander@174
|
88 |
|
|
dvander@174
|
89 |
/** |
|
dvander@174
|
90 |
* @brief Executes the forward, resets the pushed parameter list, and performs any copybacks. |
|
dvander@174
|
91 |
* |
|
dvander@174
|
92 |
* @param result Pointer to store return value in (dependent on forward type). |
|
dvander@174
|
93 |
* @param last_err Pointer to store number of successful executions in. |
|
dvander@174
|
94 |
* @return Error code, if any. |
|
dvander@174
|
95 |
*/ |
|
dvander@174
|
96 |
virtual int Execute(cell_t *result, unsigned int *num_functions) =0; |
|
dvander@174
|
97 |
|
|
dvander@174
|
98 |
/** |
|
dvander@174
|
99 |
* @brief Returns the number of functions in this forward. |
|
dvander@174
|
100 |
* |
|
dvander@174
|
101 |
* @return Number of functions in forward. |
|
dvander@174
|
102 |
*/ |
|
dvander@174
|
103 |
virtual unsigned int GetFunctionCount() =0; |
|
dvander@174
|
104 |
|
|
dvander@174
|
105 |
/** |
|
dvander@174
|
106 |
* @brief Returns the method of multi-calling this forward has. |
|
dvander@174
|
107 |
* |
|
dvander@174
|
108 |
* @return ResultType of the forward. |
|
dvander@174
|
109 |
*/ |
|
dvander@174
|
110 |
virtual ResultType GetResultType() =0; |
|
dvander@174
|
111 |
}; |
|
dvander@174
|
112 |
|
|
dvander@174
|
113 |
|
|
dvander@174
|
114 |
class IChangeableForward : public IForward |
|
dvander@174
|
115 |
{ |
|
dvander@174
|
116 |
public: |
|
dvander@174
|
117 |
/** |
|
dvander@174
|
118 |
* @brief Removes a function from the call list. |
|
dvander@174
|
119 |
* |
|
dvander@174
|
120 |
* @param func Function to remove. |
|
dvander@174
|
121 |
*/ |
|
dvander@174
|
122 |
virtual void RemoveFunction(IPluginFunction *func) =0; |
|
dvander@174
|
123 |
|
|
dvander@174
|
124 |
/** |
|
dvander@174
|
125 |
* @brief Removes all instances of a plugin from the call list. |
|
dvander@174
|
126 |
* |
|
dvander@174
|
127 |
* @param plugin Plugin to remove instances of. |
|
dvander@174
|
128 |
* @return Number of functions removed therein. |
|
dvander@174
|
129 |
*/ |
|
dvander@174
|
130 |
virtual void RemoveFunctionsOfPlugin(IPlugin *plugin) =0; |
|
dvander@174
|
131 |
|
|
dvander@174
|
132 |
/** |
|
dvander@174
|
133 |
* @brief Adds a function to the call list. |
|
dvander@174
|
134 |
* |
|
dvander@174
|
135 |
* @param func Function to add. |
|
dvander@174
|
136 |
*/ |
|
dvander@174
|
137 |
virtual void AddFunction(IPluginFunction *func) =0; |
|
dvander@174
|
138 |
}; |
|
dvander@174
|
139 |
|
|
dvander@174
|
140 |
enum ParamType |
|
dvander@174
|
141 |
{ |
|
dvander@174
|
142 |
Param_Any = 0, |
|
dvander@174
|
143 |
Param_Cell = 1, |
|
dvander@174
|
144 |
Param_Float = 2, |
|
dvander@174
|
145 |
Param_String = 3, |
|
dvander@174
|
146 |
Param_Array = 4, |
|
dvander@174
|
147 |
Param_VarArgs = 5, |
|
dvander@174
|
148 |
}; |
|
dvander@174
|
149 |
|
|
dvander@174
|
150 |
class IForwardManager : public SMInterface |
|
dvander@174
|
151 |
{ |
|
dvander@174
|
152 |
public: |
|
dvander@174
|
153 |
virtual const char *GetInterfaceName() |
|
dvander@174
|
154 |
{ |
|
dvander@174
|
155 |
return SMINTERFACE_FORWARDMANAGER_NAME; |
|
dvander@174
|
156 |
} |
|
dvander@174
|
157 |
virtual unsigned int GetInterfaceVersion() |
|
dvander@174
|
158 |
{ |
|
dvander@174
|
159 |
return SMINTERFACE_FORWARDMANAGER_VERSION; |
|
dvander@174
|
160 |
} |
|
dvander@174
|
161 |
public: |
|
dvander@174
|
162 |
/** |
|
dvander@174
|
163 |
* @brief Creates a managed forward. This forward exists globally. |
|
dvander@174
|
164 |
* The name used to create the forward is used as its public function in all target plugins. |
|
dvander@174
|
165 |
* As new non-private plugins become loaded or unloaded, they will be automatically added |
|
dvander@174
|
166 |
* or removed. This is ideal for global, static forwards that are never changed. |
|
dvander@174
|
167 |
* |
|
dvander@174
|
168 |
* @param name Name of public function to use in forward. |
|
dvander@174
|
169 |
* @param et Execution type to be used. |
|
dvander@174
|
170 |
* @param num_params Number of parameter this function will have. |
|
dvander@174
|
171 |
* NOTE: For varargs, this should include the vararg parameter. |
|
dvander@174
|
172 |
* @param types Array of type information about each parameter. If NULL, types |
|
dvander@174
|
173 |
* are read off the vararg stream. |
|
dvander@174
|
174 |
* @param ... If types is NULL, num_params ParamTypes should be pushed. |
|
dvander@174
|
175 |
* @return A new IForward on success, NULL if type combination is impossible. |
|
dvander@174
|
176 |
*/ |
|
dvander@174
|
177 |
virtual IForward *CreateForward(const char *name, ExecType et, int num_params, ParamType *types, ...) =0; |
|
dvander@174
|
178 |
|
|
dvander@174
|
179 |
/** |
|
dvander@174
|
180 |
* @brief Creates an unmanaged forward. This forward exists privately. |
|
dvander@174
|
181 |
* Unlike managed forwards, no functions are ever added by the Manager. |
|
dvander@174
|
182 |
* However, functions will be removed automatically if their parent plugin is unloaded. |
|
dvander@174
|
183 |
* |
|
dvander@174
|
184 |
* @param name Name of forward (unused except for lookup, can be NULL for anonymous). |
|
dvander@174
|
185 |
* @param et Execution type to be used. |
|
dvander@174
|
186 |
* @param num_params Number of parameter this function will have. |
|
dvander@174
|
187 |
* NOTE: For varargs, this should include the vararg parameter. |
|
dvander@174
|
188 |
* @param types Array of type information about each parameter. If NULL, types |
|
dvander@174
|
189 |
* are read off the vararg stream. |
|
dvander@174
|
190 |
* @param ... If types is NULL, num_params ParamTypes should be pushed. |
|
dvander@174
|
191 |
* @return A new IChangeableForward on success, NULL if type combination is impossible. |
|
dvander@174
|
192 |
*/ |
|
dvander@174
|
193 |
virtual IChangeableForward *CreateForwardEx(const char *name, |
|
dvander@174
|
194 |
ExecType et, |
|
dvander@174
|
195 |
int num_params, |
|
dvander@174
|
196 |
ParamType *types, |
|
dvander@174
|
197 |
...) =0; |
|
dvander@174
|
198 |
|
|
dvander@174
|
199 |
/** |
|
dvander@174
|
200 |
* @brief Finds a forward by name. Does not return anonymous forwards (named NULL or ""). |
|
dvander@174
|
201 |
* |
|
dvander@174
|
202 |
* @param name Name of forward. |
|
dvander@174
|
203 |
* @param ifchng Optionally store either NULL or an IChangeableForward pointer |
|
dvander@174
|
204 |
* depending on type of forward. |
|
dvander@174
|
205 |
* @return IForward pointer, or NULL if none found matching the name. |
|
dvander@174
|
206 |
*/ |
|
dvander@174
|
207 |
virtual IForward *FindForward(const char *name, IChangeableForward **ifchng) =0; |
|
dvander@174
|
208 |
}; |
|
dvander@174
|
209 |
}; |
|
dvander@174
|
210 |
|
|
dvander@174
|
211 |
#endif //_INCLUDE_SOURCEMOD_FORWARDINTERFACE_H_ |