You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.1 KiB
C++
183 lines
5.1 KiB
C++
//
|
|
// Created by koncord on 09.05.16.
|
|
//
|
|
|
|
#include <iostream>
|
|
#include "LangLua.hpp"
|
|
#include <Script/API/TimerAPI.hpp>
|
|
#include <Script/API/PublicFnAPI.hpp>
|
|
|
|
using namespace std;
|
|
|
|
inline vector<boost::any> DefToVec(lua_State *lua, string types, int args_begin, int args_n)
|
|
{
|
|
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:
|
|
{
|
|
stringstream ssErr;
|
|
ssErr << "Lua: Unknown argument identifier" << "\"" << types[i] << "\"" << 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;
|
|
|
|
string types = Public::GetDefinition(name);
|
|
|
|
if (args_n != (long)types.size())
|
|
throw invalid_argument("Script call: Number of arguments does not match definition");
|
|
|
|
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, "", 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);
|
|
|
|
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:
|
|
{
|
|
stringstream ssErr;
|
|
ssErr << "Lua: Unknown argument identifier" << "\"" << types[i] << "\"" << endl;
|
|
throw std::runtime_error(ssErr.str());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int id = mwmp::TimerAPI::CreateTimerLua(lua, callback, msec, types, args);
|
|
luabridge::push(lua, id);
|
|
return 1;
|
|
}
|