[12175] | 1 | #ifndef SCRIPTABLE_CONTROLLER_API_H |
---|
| 2 | #define SCRIPTABLE_CONTROLLER_API_H |
---|
| 3 | |
---|
| 4 | #include <functional> |
---|
| 5 | #include "core/CoreIncludes.h" |
---|
| 6 | #include "tools/Timer.h" |
---|
| 7 | #include "OgreVector3.h" |
---|
| 8 | |
---|
| 9 | struct lua_State; |
---|
| 10 | |
---|
| 11 | namespace orxonox |
---|
| 12 | { |
---|
| 13 | |
---|
| 14 | class ScriptableController; |
---|
| 15 | class WorldEntity; |
---|
| 16 | class Pawn; |
---|
| 17 | |
---|
| 18 | /** |
---|
| 19 | * @brief API for ScriptableController's lua-scripts |
---|
| 20 | * |
---|
| 21 | * Defines the interface that lua can use in the scripts to communicate with orxonox. |
---|
| 22 | * |
---|
| 23 | * \sa ScriptableController |
---|
| 24 | */ |
---|
| 25 | class ScriptableControllerAPI |
---|
| 26 | { |
---|
| 27 | friend class ScriptableController; |
---|
| 28 | |
---|
| 29 | public: |
---|
| 30 | /** |
---|
| 31 | * @brief Constructs the API with the given lua state |
---|
| 32 | * @param lua The lua state |
---|
| 33 | * @param controller The parent controller |
---|
| 34 | * |
---|
| 35 | * This will not run any scripts, it'll just make the API visible to lua. |
---|
| 36 | */ |
---|
| 37 | ScriptableControllerAPI(lua_State *lua, ScriptableController *controller); |
---|
| 38 | |
---|
| 39 | /** |
---|
| 40 | * @brief Destructs the API and closes the lua state. |
---|
| 41 | */ |
---|
| 42 | ~ScriptableControllerAPI(); |
---|
| 43 | |
---|
| 44 | // ### API #################################################################### |
---|
| 45 | |
---|
| 46 | /** |
---|
| 47 | * @brief Print a message |
---|
| 48 | * @param msg The message |
---|
| 49 | * |
---|
| 50 | * Use this function instead of printing from lua directly, because that will mess up the |
---|
| 51 | * output as it is not synchronized. |
---|
| 52 | */ |
---|
| 53 | void orxPrint(std::string msg); |
---|
| 54 | |
---|
| 55 | /** |
---|
| 56 | * @brief Register a function that will be called after a timeout |
---|
| 57 | * @param callback The function to call after the timeout expired |
---|
| 58 | * @param timeout The timeout in seconds |
---|
| 59 | */ |
---|
| 60 | void registerAfterTimeout(std::function<void (void)> callback, double timeout); |
---|
| 61 | |
---|
| 62 | /** |
---|
| 63 | * @brief Register a function that will be called when two object are close to eachother |
---|
| 64 | * @param callback The function to call when the objects are close enough |
---|
| 65 | * @param id1 The first object |
---|
| 66 | * @param id2 The second object |
---|
| 67 | * @param distance If the distance between the two objects is smaller than this value, |
---|
| 68 | * the function is called |
---|
| 69 | * |
---|
| 70 | * Note: Distances are only checked every 0.5s! |
---|
| 71 | */ |
---|
| 72 | void registerAtNearObject(std::function<void(std::string, std::string)> callback, std::string id1, std::string id2, double distance); |
---|
| 73 | |
---|
| 74 | /** |
---|
| 75 | * @brief Register a function that will be called when an object is close to a certain point |
---|
| 76 | * @param callback The function to call when the object is close enough |
---|
| 77 | * @param id The object |
---|
| 78 | * @param x X-coordinate of the point |
---|
| 79 | * @param y Y-coordinate of the point |
---|
| 80 | * @param z Z-coordinate of the point |
---|
| 81 | * @param distance If the distance between the object and the point is smaller than this value, the |
---|
| 82 | * function is called. |
---|
| 83 | * |
---|
| 84 | * Note: Distances are only checked every 0.5s! |
---|
| 85 | */ |
---|
| 86 | void registerAtNearPoint(std::function<void (std::string)> callback, std::string id, double x, double y, double z, double distance); |
---|
| 87 | |
---|
| 88 | /** |
---|
| 89 | * @brief Register a function that will be called when an object enters a cubic area |
---|
| 90 | * @param callback The function to call when the object entered the area |
---|
| 91 | * @param id The object |
---|
| 92 | * @param x X-coordinate of the top-left corner |
---|
| 93 | * @param y Y-coordinate of the top-left corner |
---|
| 94 | * @param z Z-coordinate of the top-left corner |
---|
| 95 | * @param dx Size in X-direction of the cube |
---|
| 96 | * @param dy Size in Y-direction of the cube |
---|
| 97 | * @param dz Size in Z-direction of the cube |
---|
| 98 | * |
---|
| 99 | * Note: Distances are only checked every 0.5s! |
---|
| 100 | */ |
---|
| 101 | void registerAtAreaEnter(std::function<void (std::string)> callback, std::string id, int x, int y, int z, int dx, int dy, int dz); |
---|
| 102 | |
---|
| 103 | /** |
---|
| 104 | * @brief Register a function that will be called when an object leaves a cubic area |
---|
| 105 | * @param callback The function to call when the object left the area |
---|
| 106 | * @param id The object |
---|
| 107 | * @param x X-coordinate of the top-left corner |
---|
| 108 | * @param y Y-coordinate of the top-left corner |
---|
| 109 | * @param z Z-coordinate of the top-left corner |
---|
| 110 | * @param dx Size in X-direction of the cube |
---|
| 111 | * @param dy Size in Y-direction of the cube |
---|
| 112 | * @param dz Size in Z-direction of the cube |
---|
| 113 | * |
---|
| 114 | * Note: Distances are only checked every 0.5s! |
---|
| 115 | */ |
---|
| 116 | void registerAtAreaLeave(std::function<void (std::string)> callback, std::string id, int x, int y, int z, int dx, int dy, int dz); |
---|
| 117 | |
---|
| 118 | /** |
---|
| 119 | * @brief Register a function that will be called when a Pawn is killed |
---|
| 120 | * @param callback The function to call as soon as the Pawn is dead |
---|
| 121 | * @param id The Pawn |
---|
| 122 | * |
---|
| 123 | * Note: Once a Pawn is dead, the callback is removed, even if the pawn got magically revived. |
---|
| 124 | */ |
---|
| 125 | void registerAtPawnKilled(std::function<void (std::string)> callback, std::string id); |
---|
| 126 | |
---|
| 127 | /** |
---|
| 128 | * @brief Register a function that will be called when a Pawn is hit |
---|
| 129 | * @param callback The function to call as soon as the Pawn is hit |
---|
| 130 | * @param id The Pawn |
---|
| 131 | * |
---|
| 132 | * Note: Once a Pawn is dead, the all hit-callbacks are removed, even if the pawn got magically revived. |
---|
| 133 | */ |
---|
| 134 | void registerAtPawnHit(std::function<void (std::string, std::string, double, double)> callback, std::string id); |
---|
| 135 | |
---|
| 136 | /** |
---|
| 137 | * @brief Kill a pawn |
---|
| 138 | * @param id The pawn to kill |
---|
| 139 | * |
---|
| 140 | * Note: It might up to 0.5s until the pawn is actually killed. |
---|
| 141 | */ |
---|
| 142 | void killPawn(std::string id); |
---|
| 143 | |
---|
| 144 | /** |
---|
| 145 | * @brief Spawn an object |
---|
| 146 | * @param type Name of the class of the object you want to spawn |
---|
| 147 | * @param id The newly created ID that can be used to access this object |
---|
| 148 | * |
---|
| 149 | * IMPORTANT: Do not use this function yet, it only has minimal functionality and is not |
---|
| 150 | * really helpful as it is. |
---|
| 151 | */ |
---|
| 152 | void spawn(std::string type, std::string id); |
---|
| 153 | |
---|
| 154 | void spawnTest(std::string id); |
---|
| 155 | |
---|
| 156 | /** |
---|
| 157 | * @brief Set the position of an object |
---|
| 158 | * @param id The ID of the object |
---|
| 159 | * @param x The position on the x-axis |
---|
| 160 | * @param y The position on the y-axis |
---|
| 161 | * @param z The position on the z-axis |
---|
| 162 | */ |
---|
| 163 | void setPosition(std::string id, double x, double y, double z); |
---|
| 164 | |
---|
| 165 | /** |
---|
| 166 | * @brief Set the orientation of an object |
---|
| 167 | * @param id The ID of the object |
---|
| 168 | * @param x The x component of the axis vector |
---|
| 169 | * @param y The y component of the axis vector |
---|
| 170 | * @param z The z component of the axis vector |
---|
| 171 | * @param angle The angle around the axis |
---|
| 172 | * |
---|
| 173 | * To set the orientation, you have to specify the direction that the |
---|
| 174 | * object should be facing with the vector (x, y, z) and the rotation |
---|
| 175 | * of the object around this axis with 'angle', which has to be given |
---|
| 176 | * in degrees, NOT radian. The vector does not have to be normalized. |
---|
| 177 | */ |
---|
| 178 | void setOrientation(std::string id, double x, double y, double z, double angle); |
---|
| 179 | |
---|
| 180 | /** |
---|
| 181 | * @brief Set the velocity of an object |
---|
| 182 | * @param id The ID of the object |
---|
| 183 | * @param x The velocity in x-direction |
---|
| 184 | * @param y The velocity in y-direction |
---|
| 185 | * @param z The velocity in z-direction |
---|
| 186 | * |
---|
| 187 | * The velocity is in units per second. |
---|
| 188 | */ |
---|
| 189 | void setVelocity(std::string id, double x, double y, double z); |
---|
| 190 | |
---|
| 191 | /** |
---|
| 192 | * @brief Set the angular velocity of an object |
---|
| 193 | * @param id The ID of the object |
---|
| 194 | * @param x The rotation velocity around the x-axis |
---|
| 195 | * @param y The rotation velocity around the y-axis |
---|
| 196 | * @param z The rotation velocity around the z-axis |
---|
| 197 | */ |
---|
| 198 | void setAngularVelocity(std::string id, double x, double y, double z); |
---|
| 199 | |
---|
| 200 | |
---|
| 201 | /** |
---|
| 202 | * @brief Set the angular velocity of an object |
---|
| 203 | * @param id The ID of the object |
---|
| 204 | * @param x The rotation velocity around the x-axis |
---|
| 205 | * @param y The rotation velocity around the y-axis |
---|
| 206 | * @param z The rotation velocity around the z-axis |
---|
| 207 | */ |
---|
| 208 | double myTestFunction(double x, double y); |
---|
| 209 | |
---|
| 210 | void moveControllableEntity(std::string id, double x, double y, double z); |
---|
| 211 | |
---|
| 212 | // ### API END ################################################################ |
---|
| 213 | |
---|
| 214 | private: |
---|
| 215 | /** |
---|
| 216 | * @brief Groups everything together that is needed to handle a near-object event |
---|
| 217 | */ |
---|
| 218 | struct NearObjectHandler |
---|
| 219 | { |
---|
| 220 | NearObjectHandler(WorldEntity *entity1, WorldEntity *entity2, std::string id1, std::string id2, double distance, std::function<void (std::string, std::string)> callback) |
---|
| 221 | : entity1_(entity1), entity2_(entity2), id1_(id1), id2_(id2), distance_(distance), callback_(callback) |
---|
| 222 | {} |
---|
| 223 | |
---|
| 224 | WorldEntity *entity1_, *entity2_; |
---|
| 225 | std::string id1_, id2_; |
---|
| 226 | double distance_; |
---|
| 227 | std::function<void (std::string, std::string)> callback_; |
---|
| 228 | }; |
---|
| 229 | |
---|
| 230 | /** |
---|
| 231 | * @brief Groups everything together that is needed to handle a near-poinb event |
---|
| 232 | */ |
---|
| 233 | struct NearPointHandler |
---|
| 234 | { |
---|
| 235 | NearPointHandler(WorldEntity *entity, std::string id, double x, double y, double z, double distance, std::function<void (std::string)> callback) |
---|
| 236 | : entity_(entity), id_(id), point_(x, y, z), distance_(distance), callback_(callback) |
---|
| 237 | {} |
---|
| 238 | |
---|
| 239 | WorldEntity *entity_; |
---|
| 240 | std::string id_; |
---|
| 241 | Vector3 point_; |
---|
| 242 | double distance_; |
---|
| 243 | std::function<void (std::string)> callback_; |
---|
| 244 | }; |
---|
| 245 | |
---|
| 246 | /** |
---|
| 247 | * @brief Groups everything together that is needed to handle an area enter/leave event |
---|
| 248 | */ |
---|
| 249 | struct AreaHandler |
---|
| 250 | { |
---|
| 251 | AreaHandler(WorldEntity *entity, std::string id, double x, double y, double z, double dx, double dy, double dz, bool atEnter, std::function<void (std::string)> callback) |
---|
| 252 | : entity_(entity), id_(id), start_point_(x, y, z), atEnter_(atEnter), callback_(callback) |
---|
| 253 | { this-> end_point_ = this->start_point_ + Vector3(dx, dy, dz); } |
---|
| 254 | |
---|
| 255 | WorldEntity *entity_; |
---|
| 256 | std::string id_; |
---|
| 257 | Vector3 start_point_, end_point_; |
---|
| 258 | bool atEnter_; |
---|
| 259 | std::function<void (std::string)> callback_; |
---|
| 260 | }; |
---|
| 261 | |
---|
| 262 | lua_State *lua_; |
---|
| 263 | ScriptableController *controller_; |
---|
| 264 | std::list<NearObjectHandler> nearObjectHandlers_; |
---|
| 265 | std::list<NearPointHandler> nearPointHandlers_; |
---|
| 266 | std::list<AreaHandler> areaHandlers_; |
---|
| 267 | std::map<std::string, std::list<std::function<void (std::string)> > > pawnDestroyedHandlers_; |
---|
| 268 | std::map<std::string, std::list<std::function<void (std::string, std::string, double, double)> > > pawnHitHandlers_; |
---|
| 269 | Timer periodicTimer; |
---|
| 270 | static const double periodic_interval; |
---|
| 271 | |
---|
| 272 | /** |
---|
| 273 | * @brief Called by ScriptableController when a pawn is killed |
---|
| 274 | * @param id The dead pawn |
---|
| 275 | * |
---|
| 276 | * Calls the lua callbacks associated with this event. |
---|
| 277 | */ |
---|
| 278 | void pawnKilled(std::string id, Pawn *pawn); |
---|
| 279 | |
---|
| 280 | /** |
---|
| 281 | * @brief Called by ScriptableController when a Pawn is hit |
---|
| 282 | * @param target_id The hit Pawn |
---|
| 283 | * @param source_id The shooting Pawn |
---|
| 284 | * @param new_health The new health of the hit Pawn |
---|
| 285 | * @param new_shield The new shield health of the hit Pawn |
---|
| 286 | */ |
---|
| 287 | void pawnHit(std::string target_id, std::string source_id, double new_health, double new_shield); |
---|
| 288 | |
---|
| 289 | /** |
---|
| 290 | * @brief Called every 0.5s |
---|
| 291 | * |
---|
| 292 | * This handles things that have to be checked periodically (like area events) |
---|
| 293 | * but doing this in every tick would be an overkill. |
---|
| 294 | */ |
---|
| 295 | void periodic(void); |
---|
| 296 | }; |
---|
| 297 | |
---|
| 298 | } |
---|
| 299 | |
---|
| 300 | #endif // SCRIPTABLE_CONTROLLER_API_H |
---|