diff options
author | Mnikolenko Productengine <mnikolenko@productengine.com> | 2023-09-28 20:22:49 +0300 |
---|---|---|
committer | Mnikolenko Productengine <mnikolenko@productengine.com> | 2023-09-28 20:22:49 +0300 |
commit | 48dc344a9e65451c9e2b267fba7d3e01bdbbf801 (patch) | |
tree | d04dc646b6e398b51707571767d8d8a855a71422 /indra/newview/llluamanager.cpp | |
parent | 3cc437e862a7c9fb2c839a89bcbddaf129a9f3ff (diff) |
DRTVWR-589 - support for moving to dest
Diffstat (limited to 'indra/newview/llluamanager.cpp')
-rw-r--r-- | indra/newview/llluamanager.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/indra/newview/llluamanager.cpp b/indra/newview/llluamanager.cpp index bf04f6a079..b18708bd84 100644 --- a/indra/newview/llluamanager.cpp +++ b/indra/newview/llluamanager.cpp @@ -50,6 +50,7 @@ #include "llinventoryfunctions.h" #include "stringize.h" #include "lltoolplacer.h" +#include "llviewerregion.h" #include <boost/algorithm/string/replace.hpp> @@ -613,6 +614,86 @@ lua_function(rez_prim) return 0; } + +void move_to_dest(const LLVector3d &target_global, lua_State *L, std::string response_cb) +{ + struct Data + { + lua_State *L; + std::string response_cb; + }; + + Data *data = new Data(); + data->L = L; + if (!response_cb.empty()) + { + data->response_cb = response_cb; + } + + auto handle_dest_reached = [](BOOL success, void *user_data) + { + Data *cb_data = static_cast<Data *>(user_data); + if (!cb_data->response_cb.empty()) + { + S32 result = success ? 1 : -1; + lua_pushinteger(cb_data->L, result); + lua_setglobal(cb_data->L, cb_data->response_cb.c_str()); + } + }; + + gAgent.startAutoPilotGlobal(target_global, std::string(), NULL, handle_dest_reached, data, 0.f, 0.03f, FALSE); +} + +// move_by({x,y}, "lua_cb_func") +// avatar is the reference point +lua_function(move_by) +{ + lua_rawgeti(L, 1, 1); + F32 x = lua_tonumber(L, -1); + lua_pop(L, 1); + lua_rawgeti(L, 1, 2); + F32 y = lua_tonumber(L, -1); + lua_pop(L, 1); + + LLVector3d dest = gAgent.getRegion()->getPosGlobalFromRegion(gAgent.getPositionAgent() + LLVector3(x, y, 0)); + + std::string response_cb; + if (lua_type(L, 2) == LUA_TSTRING) + { + response_cb = lua_tostring(L, 2); + } + move_to_dest(dest, L, response_cb); + + lua_pop(L, lua_gettop(L)); + return 0; +} + +// move_to({x,y,z}, "lua_cb_func") +// region coordinates are used +lua_function(move_to) +{ + lua_rawgeti(L, 1, 1); + F32 x = lua_tonumber(L, -1); + lua_pop(L, 1); + lua_rawgeti(L, 1, 2); + F32 y = lua_tonumber(L, -1); + lua_rawgeti(L, 1, 3); + F32 z = lua_tonumber(L, -1); + lua_pop(L, 1); + + LLVector3d dest = gAgent.getRegion()->getPosGlobalFromRegion(LLVector3(x, y, z)); + + std::string response_cb; + if (lua_type(L, 2) == LUA_TSTRING) + { + response_cb = lua_tostring(L, 2); + } + move_to_dest(dest, L, response_cb); + + lua_pop(L, lua_gettop(L)); + return 0; +} + lua_function(run_ui_command) { int top = lua_gettop(L); |