mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 03:26:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <iostream>
 | |
| #include "LangLua.hpp"
 | |
| #include <Script/API/TimerAPI.hpp>
 | |
| #include <Script/API/PublicFnAPI.hpp>
 | |
| 
 | |
| inline std::vector<boost::any> DefToVec(lua_State *lua, std::string types, int args_begin, int args_n)
 | |
| {
 | |
|     std::vector<boost::any> args;
 | |
| 
 | |
|     for (int i = args_begin; i < args_n + args_begin; i++)
 | |
|     {
 | |
|         switch (types[i - args_begin])
 | |
|         {
 | |
|             case 'i':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<unsigned int>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             case 'q':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<signed int>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|                 /*case 'l':
 | |
|                 {
 | |
|                     args.emplace_back(luabridge::Stack<unsigned long long>::get(lua, i));
 | |
|                     break;
 | |
|                 }
 | |
| 
 | |
|                 case 'w':
 | |
|                 {
 | |
|                     args.emplace_back(luabridge::Stack<signed long long>::get(lua, i));
 | |
|                     break;
 | |
|                 }*/
 | |
| 
 | |
|             case 'f':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<double>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             case 's':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<const char*>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             default:
 | |
|             {
 | |
|                 std::stringstream ssErr;
 | |
|                 ssErr << "Lua: Unknown argument identifier" << "\"" << types[i] << "\"" << std::endl;
 | |
|                 throw std::runtime_error(ssErr.str());
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     return args;
 | |
| }
 | |
| 
 | |
| int LangLua::MakePublic(lua_State *lua) noexcept
 | |
| {
 | |
|     const char * callback = luabridge::Stack<const char*>::get(lua, 1);
 | |
|     const char * name = luabridge::Stack<const char*>::get(lua, 2);
 | |
|     char ret_type = luabridge::Stack<char>::get(lua, 3);
 | |
|     const char * def = luabridge::Stack<const char*>::get(lua, 4);
 | |
| 
 | |
|     Public::MakePublic(callback, lua, name, ret_type, def);
 | |
|     return 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| int LangLua::CallPublic(lua_State *lua)
 | |
| {
 | |
|     const char * name = luabridge::Stack<const char*>::get(lua, 1);
 | |
| 
 | |
|     int args_n = lua_gettop(lua) - 1;
 | |
| 
 | |
|     std::string types = Public::GetDefinition(name);
 | |
| 
 | |
|     if (args_n  != (long)types.size())
 | |
|         throw std::invalid_argument("Script call: Number of arguments does not match definition");
 | |
| 
 | |
|     std::vector<boost::any> args = DefToVec(lua, types, 2, args_n);
 | |
| 
 | |
|     boost::any result = Public::Call(&name[0], args);
 | |
|     if (result.empty())
 | |
|         return 0;
 | |
| 
 | |
|     if (result.type().hash_code() == typeid(signed int).hash_code())
 | |
|         luabridge::Stack<signed int>::push(lua, boost::any_cast<signed int>(result));
 | |
|     else if (result.type().hash_code() == typeid(unsigned int).hash_code())
 | |
|         luabridge::Stack<unsigned int>::push(lua, boost::any_cast<unsigned int>(result));
 | |
|     else if (result.type().hash_code() == typeid(double).hash_code())
 | |
|         luabridge::Stack<double>::push(lua, boost::any_cast<double>(result));
 | |
|     else if (result.type().hash_code() == typeid(const char*).hash_code())
 | |
|         luabridge::Stack<const char*>::push(lua, boost::any_cast<const char*>(result));
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| int LangLua::CreateTimer(lua_State *lua) noexcept
 | |
| {
 | |
| 
 | |
|     const char * callback= luabridge::Stack<const char*>::get(lua, 1);
 | |
|     int msec = luabridge::Stack<int>::get(lua, 2);
 | |
| 
 | |
|     int id = mwmp::TimerAPI::CreateTimerLua(lua, callback, msec, "", std::vector<boost::any>());
 | |
|     luabridge::push(lua, id);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| int LangLua::CreateTimerEx(lua_State *lua)
 | |
| {
 | |
|     const char * callback = luabridge::Stack<const char*>::get(lua, 1);
 | |
|     int msec = luabridge::Stack<int>::get(lua, 2);
 | |
| 
 | |
|     const char * types = luabridge::Stack<const char*>::get(lua, 3);
 | |
| 
 | |
|     int args_n = (int)lua_strlen(lua, 3);
 | |
| 
 | |
|     std::vector<boost::any> args;
 | |
| 
 | |
|     for (int i = 4; i < args_n + 4; i++)
 | |
|     {
 | |
|         switch (types[i - 4])
 | |
|         {
 | |
|             case 'i':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<unsigned int>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             case 'q':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<signed int>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|                 /*case 'l':
 | |
|                 {
 | |
|                     args.emplace_back(luabridge::Stack<unsigned long long>::get(lua, i));
 | |
|                     break;
 | |
|                 }
 | |
| 
 | |
|                 case 'w':
 | |
|                 {
 | |
|                     args.emplace_back(luabridge::Stack<signed long long>::get(lua, i));
 | |
|                     break;
 | |
|                 }*/
 | |
| 
 | |
|             case 'f':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<double>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             case 's':
 | |
|             {
 | |
|                 args.emplace_back(luabridge::Stack<const char*>::get(lua, i));
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             default:
 | |
|             {
 | |
|                 std::stringstream ssErr;
 | |
|                 ssErr << "Lua: Unknown argument identifier" << "\"" << types[i] << "\"" << std::endl;
 | |
|                 throw std::runtime_error(ssErr.str());
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     int id = mwmp::TimerAPI::CreateTimerLua(lua, callback, msec, types, args);
 | |
|     luabridge::push(lua, id);
 | |
|     return 1;
 | |
| }
 |