From 36ba54b24832cedbef570bf86b0079c8f1ce35dc Mon Sep 17 00:00:00 2001 From: Redo Date: Wed, 1 Oct 2025 16:26:18 -0700 Subject: [PATCH] initial --- .compileInject.bat | 15 + BlockLua-Unsafe.dll | Bin 0 -> 369198 bytes BlockLua.dll | Bin 0 -> 369198 bytes compile.bat | 13 + inc/lua/lauxlib.h | 161 ++ inc/lua/lua.h | 402 ++++ inc/lua/lua.hpp | 9 + inc/lua/lua5.1.lib | Bin 0 -> 62582 bytes inc/lua/luaconf.h | 152 ++ inc/lua/luajit.h | 79 + inc/lua/lualib.h | 43 + inc/tsfuncs/BlFuncs.cpp | 238 +++ inc/tsfuncs/BlFuncs.hpp | 109 ++ inc/tsfuncs/BlHooks.cpp | 207 +++ inc/tsfuncs/BlHooks.hpp | 122 ++ lua5.1.dll | Bin 0 -> 478566 bytes lualib/https.dll | Bin 0 -> 341033 bytes lualib/ltn12.lua | 292 +++ lualib/mime.lua | 87 + lualib/mime/core.dll | Bin 0 -> 24576 bytes lualib/socket.lua | 133 ++ lualib/socket/core.dll | Bin 0 -> 32768 bytes lualib/socket/ftp.lua | 281 +++ lualib/socket/http.lua | 350 ++++ lualib/socket/smtp.lua | 251 +++ lualib/socket/tp.lua | 123 ++ lualib/socket/url.lua | 297 +++ readme.md | 36 + src/bllua4.cpp | 105 ++ src/lua-env-safe.lua | 142 ++ src/lua-env.lua | 40 + src/luainterp.cpp | 68 + src/lualibts.cpp | 159 ++ src/ts-env.cs | 26 + src/tsliblua.cpp | 25 + src/util/libbl-support.cs | 44 + src/util/libbl-types.lua | 3706 +++++++++++++++++++++++++++++++++++++ src/util/libbl.lua | 840 +++++++++ src/util/libts-support.cs | 52 + src/util/libts.lua | 212 +++ src/util/loadaddons.cs | 412 +++++ src/util/std.lua | 360 ++++ src/util/vector.lua | 219 +++ 43 files changed, 9810 insertions(+) create mode 100644 .compileInject.bat create mode 100644 BlockLua-Unsafe.dll create mode 100644 BlockLua.dll create mode 100644 compile.bat create mode 100644 inc/lua/lauxlib.h create mode 100644 inc/lua/lua.h create mode 100644 inc/lua/lua.hpp create mode 100644 inc/lua/lua5.1.lib create mode 100644 inc/lua/luaconf.h create mode 100644 inc/lua/luajit.h create mode 100644 inc/lua/lualib.h create mode 100644 inc/tsfuncs/BlFuncs.cpp create mode 100644 inc/tsfuncs/BlFuncs.hpp create mode 100644 inc/tsfuncs/BlHooks.cpp create mode 100644 inc/tsfuncs/BlHooks.hpp create mode 100644 lua5.1.dll create mode 100644 lualib/https.dll create mode 100644 lualib/ltn12.lua create mode 100644 lualib/mime.lua create mode 100644 lualib/mime/core.dll create mode 100644 lualib/socket.lua create mode 100644 lualib/socket/core.dll create mode 100644 lualib/socket/ftp.lua create mode 100644 lualib/socket/http.lua create mode 100644 lualib/socket/smtp.lua create mode 100644 lualib/socket/tp.lua create mode 100644 lualib/socket/url.lua create mode 100644 readme.md create mode 100644 src/bllua4.cpp create mode 100644 src/lua-env-safe.lua create mode 100644 src/lua-env.lua create mode 100644 src/luainterp.cpp create mode 100644 src/lualibts.cpp create mode 100644 src/ts-env.cs create mode 100644 src/tsliblua.cpp create mode 100644 src/util/libbl-support.cs create mode 100644 src/util/libbl-types.lua create mode 100644 src/util/libbl.lua create mode 100644 src/util/libts-support.cs create mode 100644 src/util/libts.lua create mode 100644 src/util/loadaddons.cs create mode 100644 src/util/std.lua create mode 100644 src/util/vector.lua diff --git a/.compileInject.bat b/.compileInject.bat new file mode 100644 index 0000000..5dcc05e --- /dev/null +++ b/.compileInject.bat @@ -0,0 +1,15 @@ +@for /F "tokens=2" %%K in (' + tasklist /FI "ImageName eq Blockland.exe" /FO LIST ^| findstr /B "PID:" +') do ( + DllRemover32 %%K BlockLua.dll +) + +@call %~dp0compile.bat || exit + +@for /F "tokens=2" %%K in (' + tasklist /FI "ImageName eq Blockland.exe" /FO LIST ^| findstr /B "PID:" +') do ( + RemoteDllInjector32 %%K %~dp0BlockLua.dll +) + +@pause diff --git a/BlockLua-Unsafe.dll b/BlockLua-Unsafe.dll new file mode 100644 index 0000000000000000000000000000000000000000..0062c02f5d42f7135974d9b3411a70d0b2040eb4 GIT binary patch literal 369198 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 UcuK>p4N0wF@S_EScxwCq1G}LaO8@`> literal 0 HcmV?d00001 diff --git a/BlockLua.dll b/BlockLua.dll new file mode 100644 index 0000000000000000000000000000000000000000..e991cb10b240a82dc4e3781d0ed56d4cd1fedbf9 GIT binary patch literal 369198 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�Bn7$y{XGJln4f%Xdt`%F}p~2#GY|DClv7pk!#&23uMJ73)z&lyg>i`%j13uuPE^*@2GBQ@`9pdR;Pjq2`NlVLspG zixsi>2w2LpFwjo3DYFY`4j{{RE$(e05!T_5B3K@mv5=RHTBWTHg{?yj?PBph)ivgFDB=j9bBI)92Su!WfK*$B?d*5C&|bqTWOJxbVl<+*NItz4D4=CT{s99 z&Qmx5XE0_Mw2_PXJdb`&G=<{JDZFG?Tps>e6Jcv|m~DAlk`O~qY4|P18N)>f2#h(~ z)h6T@dptaqsdtau9-e_+FZSBx;~muRvsph3!TWtZgm5{?vV6ft+Dq)z!7a5j*Cp5@ z7<^Qc6)4a9KDVm9F5p(S>wIpf#4CWp2a45(l#o20EjECXm4h;*D4r_k#$f%onE3Qz zQ~*x_tsE$^?#&!0QOD#7GQ3UXJqB>RD?e%s<&Lz_8fYT`i?3RHqh>;`#4Sz>U2L_E zX)y@w8YKDr=YZ z51tVtYT4}Jxsla`#Bngk_Dmg^Vo+LyM~~Us-KIEd)s8k{Wrfn*9{LsU_nGCrQy$^= z30gArcAhM-(xdETw4V*GnW^N+OtYT{)JFg+mXSQY1KV@??U>VgGCTRS+wEz?e%6S* zj!J7zyl3NGz49&Z_?)Mi$}q#ojTpkmhOw^b?PAri(^w$z3c{BP&@p?XLebgJs1uyA z<67YeLB$~Uw90EeM0MG5a(|L*3|u;|aYygz<;YfB#b>)E*;2E^+ BlockLua.dll.dump.txt +rem objdump -d BlockLua-Unsafe.dll > BlockLua-Unsafe.dll.dump.txt + +pause diff --git a/inc/lua/lauxlib.h b/inc/lua/lauxlib.h new file mode 100644 index 0000000..a44f027 --- /dev/null +++ b/inc/lua/lauxlib.h @@ -0,0 +1,161 @@ +/* +** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +/* extra error code for `luaL_load' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + +LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, + const luaL_Reg *l, int nup); +LUALIB_API void (luaL_register) (lua_State *L, const char *libname, + const luaL_Reg *l); +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); +LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int narg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); + +LUALIB_API void (luaL_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, + const char *const lst[]); + +/* pre-defined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); +LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, + const char *name); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + + +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, + const char *r); + +LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, + const char *fname, int szhint); + +/* From Lua 5.2. */ +LUALIB_API int luaL_fileresult(lua_State *L, int stat, const char *fname); +LUALIB_API int luaL_execresult(lua_State *L, int stat); +LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, + const char *mode); +LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, + const char *name, const char *mode); +LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, + int level); +LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); +LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname, + int sizehint); +LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); +LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define luaL_argcheck(L, cond,numarg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +/* From Lua 5.2. */ +#define luaL_newlibtable(L, l) \ + lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) +#define luaL_newlib(L, l) (luaL_newlibtable(L, l), luaL_setfuncs(L, l, 0)) + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + + +typedef struct luaL_Buffer { + char *p; /* current position in buffer */ + int lvl; /* number of strings in the stack (level) */ + lua_State *L; + char buffer[LUAL_BUFFERSIZE]; +} luaL_Buffer; + +#define luaL_addchar(B,c) \ + ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) + +/* compatibility only */ +#define luaL_putchar(B,c) luaL_addchar(B,c) + +#define luaL_addsize(B,n) ((B)->p += (n)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); + + +/* }====================================================== */ + +#endif diff --git a/inc/lua/lua.h b/inc/lua/lua.h new file mode 100644 index 0000000..850bd79 --- /dev/null +++ b/inc/lua/lua.h @@ -0,0 +1,402 @@ +/* +** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ +** Lua - An Extensible Extension Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION "Lua 5.1" +#define LUA_RELEASE "Lua 5.1.4" +#define LUA_VERSION_NUM 501 +#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" + + +/* mark for precompiled code (`Lua') */ +#define LUA_SIGNATURE "\033Lua" + +/* option for multiple returns in `lua_pcall' and `lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** pseudo-indices +*/ +#define LUA_REGISTRYINDEX (-10000) +#define LUA_ENVIRONINDEX (-10001) +#define LUA_GLOBALSINDEX (-10002) +#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) + + +/* thread status */ +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + +typedef int (*lua_CFunction) (lua_State *L); + + +/* +** functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); + + +/* +** prototype for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_remove) (lua_State *L, int idx); +LUA_API void (lua_insert) (lua_State *L, int idx); +LUA_API void (lua_replace) (lua_State *L, int idx); +LUA_API int (lua_checkstack) (lua_State *L, int sz); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); + +LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); +LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API size_t (lua_objlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); +LUA_API void (lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API void (lua_gettable) (lua_State *L, int idx); +LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawget) (lua_State *L, int idx); +LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API void (lua_getfenv) (lua_State *L, int idx); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setfenv) (lua_State *L, int idx); + + +/* +** `load' and `call' functions (load and run Lua code) +*/ +LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); +LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); +LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yield) (lua_State *L, int nresults); +LUA_API int (lua_resume) (lua_State *L, int narg); +LUA_API int (lua_status) (lua_State *L); + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCISRUNNING 9 + +LUA_API int (lua_gc) (lua_State *L, int what, int data); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_strlen(L,i) lua_objlen(L, (i)) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) \ + lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) + +#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) +#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + + +/* +** compatibility macros and functions +*/ + +#define lua_open() luaL_newstate() + +#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) + +#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) + +#define lua_Chunkreader lua_Reader +#define lua_Chunkwriter lua_Writer + + +/* hack */ +LUA_API void lua_setlevel (lua_State *from, lua_State *to); + + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILRET 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debuger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); +LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook lua_gethook (lua_State *L); +LUA_API int lua_gethookmask (lua_State *L); +LUA_API int lua_gethookcount (lua_State *L); + +/* From Lua 5.2. */ +LUA_API void *lua_upvalueid (lua_State *L, int idx, int n); +LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2); +LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname, const char *mode); +LUA_API const lua_Number *lua_version (lua_State *L); +LUA_API void lua_copy (lua_State *L, int fromidx, int toidx); +LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum); +LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum); + +/* From Lua 5.3. */ +LUA_API int lua_isyieldable (lua_State *L); + + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) `global', `local', `field', `method' */ + const char *what; /* (S) `Lua', `C', `main', `tail' */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int nups; /* (u) number of upvalues */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + int i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/inc/lua/lua.hpp b/inc/lua/lua.hpp new file mode 100644 index 0000000..07e9002 --- /dev/null +++ b/inc/lua/lua.hpp @@ -0,0 +1,9 @@ +// C++ wrapper for LuaJIT header files. + +extern "C" { +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" +#include "luajit.h" +} + diff --git a/inc/lua/lua5.1.lib b/inc/lua/lua5.1.lib new file mode 100644 index 0000000000000000000000000000000000000000..1b8d57ce3c3c34fba80ab0dd643a4e03601edff5 GIT binary patch literal 62582 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 So3Hxg8}j1j7QM(cyH;QT literal 0 HcmV?d00001 diff --git a/inc/lua/luaconf.h b/inc/lua/luaconf.h new file mode 100644 index 0000000..c2d29d9 --- /dev/null +++ b/inc/lua/luaconf.h @@ -0,0 +1,152 @@ +/* +** Configuration header. +** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h +*/ + +#ifndef luaconf_h +#define luaconf_h + +#ifndef WINVER +#define WINVER 0x0501 +#endif +#include +#include + +/* Default path for loading Lua and C modules with require(). */ +#if defined(_WIN32) +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_PATH_DEFAULT \ + ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" +#define LUA_CPATH_DEFAULT \ + ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" +#else +/* +** Note to distribution maintainers: do NOT patch the following lines! +** Please read ../doc/install.html#distro and pass PREFIX=/usr instead. +*/ +#ifndef LUA_MULTILIB +#define LUA_MULTILIB "lib" +#endif +#ifndef LUA_LMULTILIB +#define LUA_LMULTILIB "lib" +#endif +#define LUA_LROOT "/usr/local" +#define LUA_LUADIR "/lua/5.1/" +#define LUA_LJDIR "/luajit-2.1.0-beta3/" + +#ifdef LUA_ROOT +#define LUA_JROOT LUA_ROOT +#define LUA_RLDIR LUA_ROOT "/share" LUA_LUADIR +#define LUA_RCDIR LUA_ROOT "/" LUA_MULTILIB LUA_LUADIR +#define LUA_RLPATH ";" LUA_RLDIR "?.lua;" LUA_RLDIR "?/init.lua" +#define LUA_RCPATH ";" LUA_RCDIR "?.so" +#else +#define LUA_JROOT LUA_LROOT +#define LUA_RLPATH +#define LUA_RCPATH +#endif + +#define LUA_JPATH ";" LUA_JROOT "/share" LUA_LJDIR "?.lua" +#define LUA_LLDIR LUA_LROOT "/share" LUA_LUADIR +#define LUA_LCDIR LUA_LROOT "/" LUA_LMULTILIB LUA_LUADIR +#define LUA_LLPATH ";" LUA_LLDIR "?.lua;" LUA_LLDIR "?/init.lua" +#define LUA_LCPATH1 ";" LUA_LCDIR "?.so" +#define LUA_LCPATH2 ";" LUA_LCDIR "loadall.so" + +#define LUA_PATH_DEFAULT "./?.lua" LUA_JPATH LUA_LLPATH LUA_RLPATH +#define LUA_CPATH_DEFAULT "./?.so" LUA_LCPATH1 LUA_RCPATH LUA_LCPATH2 +#endif + +/* Environment variable names for path overrides and initialization code. */ +#define LUA_PATH "LUA_PATH" +#define LUA_CPATH "LUA_CPATH" +#define LUA_INIT "LUA_INIT" + +/* Special file system characters. */ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif +#define LUA_PATHSEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXECDIR "!" +#define LUA_IGMARK "-" +#define LUA_PATH_CONFIG \ + LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" \ + LUA_EXECDIR "\n" LUA_IGMARK "\n" + +/* Quoting in error messages. */ +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + +/* Various tunables. */ +#define LUAI_MAXSTACK 65500 /* Max. # of stack slots for a thread (<64K). */ +#define LUAI_MAXCSTACK 8000 /* Max. # of stack slots for a C func (<10K). */ +#define LUAI_GCPAUSE 200 /* Pause GC until memory is at 200%. */ +#define LUAI_GCMUL 200 /* Run GC at 200% of allocation speed. */ +#define LUA_MAXCAPTURES 32 /* Max. pattern captures. */ + +/* Configuration for the frontend (the luajit executable). */ +#if defined(luajit_c) +#define LUA_PROGNAME "luajit" /* Fallback frontend name. */ +#define LUA_PROMPT "> " /* Interactive prompt. */ +#define LUA_PROMPT2 ">> " /* Continuation prompt. */ +#define LUA_MAXINPUT 512 /* Max. input line length. */ +#endif + +/* Note: changing the following defines breaks the Lua 5.1 ABI. */ +#define LUA_INTEGER ptrdiff_t +#define LUA_IDSIZE 60 /* Size of lua_Debug.short_src. */ +/* +** Size of lauxlib and io.* on-stack buffers. Weird workaround to avoid using +** unreasonable amounts of stack space, but still retain ABI compatibility. +** Blame Lua for depending on BUFSIZ in the ABI, blame **** for wrecking it. +*/ +#define LUAL_BUFFERSIZE (BUFSIZ > 16384 ? 8192 : BUFSIZ) + +/* The following defines are here only for compatibility with luaconf.h +** from the standard Lua distribution. They must not be changed for LuaJIT. +*/ +#define LUA_NUMBER_DOUBLE +#define LUA_NUMBER double +#define LUAI_UACNUMBER double +#define LUA_NUMBER_SCAN "%lf" +#define LUA_NUMBER_FMT "%.14g" +#define lua_number2str(s, n) sprintf((s), LUA_NUMBER_FMT, (n)) +#define LUAI_MAXNUMBER2STR 32 +#define LUA_INTFRMLEN "l" +#define LUA_INTFRM_T long + +/* Linkage of public API functions. */ +#if defined(LUA_BUILD_AS_DLL) +#if defined(LUA_CORE) || defined(LUA_LIB) +#define LUA_API __declspec(dllexport) +#else +#define LUA_API __declspec(dllimport) +#endif +#else +#define LUA_API extern +#endif + +#define LUALIB_API LUA_API + +/* Support for internal assertions. */ +#if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK) +#include +#endif +#ifdef LUA_USE_ASSERT +#define lua_assert(x) assert(x) +#endif +#ifdef LUA_USE_APICHECK +#define luai_apicheck(L, o) { (void)L; assert(o); } +#else +#define luai_apicheck(L, o) { (void)L; } +#endif + +#endif diff --git a/inc/lua/luajit.h b/inc/lua/luajit.h new file mode 100644 index 0000000..708a5a1 --- /dev/null +++ b/inc/lua/luajit.h @@ -0,0 +1,79 @@ +/* +** LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/ +** +** Copyright (C) 2005-2017 Mike Pall. All rights reserved. +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] +*/ + +#ifndef _LUAJIT_H +#define _LUAJIT_H + +#include "lua.h" + +#define LUAJIT_VERSION "LuaJIT 2.1.0-beta3" +#define LUAJIT_VERSION_NUM 20100 /* Version 2.1.0 = 02.01.00. */ +#define LUAJIT_VERSION_SYM luaJIT_version_2_1_0_beta3 +#define LUAJIT_COPYRIGHT "Copyright (C) 2005-2017 Mike Pall" +#define LUAJIT_URL "http://luajit.org/" + +/* Modes for luaJIT_setmode. */ +#define LUAJIT_MODE_MASK 0x00ff + +enum { + LUAJIT_MODE_ENGINE, /* Set mode for whole JIT engine. */ + LUAJIT_MODE_DEBUG, /* Set debug mode (idx = level). */ + + LUAJIT_MODE_FUNC, /* Change mode for a function. */ + LUAJIT_MODE_ALLFUNC, /* Recurse into subroutine protos. */ + LUAJIT_MODE_ALLSUBFUNC, /* Change only the subroutines. */ + + LUAJIT_MODE_TRACE, /* Flush a compiled trace. */ + + LUAJIT_MODE_WRAPCFUNC = 0x10, /* Set wrapper mode for C function calls. */ + + LUAJIT_MODE_MAX +}; + +/* Flags or'ed in to the mode. */ +#define LUAJIT_MODE_OFF 0x0000 /* Turn feature off. */ +#define LUAJIT_MODE_ON 0x0100 /* Turn feature on. */ +#define LUAJIT_MODE_FLUSH 0x0200 /* Flush JIT-compiled code. */ + +/* LuaJIT public C API. */ + +/* Control the JIT engine. */ +LUA_API int luaJIT_setmode(lua_State *L, int idx, int mode); + +/* Low-overhead profiling API. */ +typedef void (*luaJIT_profile_callback)(void *data, lua_State *L, + int samples, int vmstate); +LUA_API void luaJIT_profile_start(lua_State *L, const char *mode, + luaJIT_profile_callback cb, void *data); +LUA_API void luaJIT_profile_stop(lua_State *L); +LUA_API const char *luaJIT_profile_dumpstack(lua_State *L, const char *fmt, + int depth, size_t *len); + +/* Enforce (dynamic) linker error for version mismatches. Call from main. */ +LUA_API void LUAJIT_VERSION_SYM(void); + +#endif diff --git a/inc/lua/lualib.h b/inc/lua/lualib.h new file mode 100644 index 0000000..bfc130a --- /dev/null +++ b/inc/lua/lualib.h @@ -0,0 +1,43 @@ +/* +** Standard library header. +** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h +*/ + +#ifndef _LUALIB_H +#define _LUALIB_H + +#include "lua.h" + +#define LUA_FILEHANDLE "FILE*" + +#define LUA_COLIBNAME "coroutine" +#define LUA_MATHLIBNAME "math" +#define LUA_STRLIBNAME "string" +#define LUA_TABLIBNAME "table" +#define LUA_IOLIBNAME "io" +#define LUA_OSLIBNAME "os" +#define LUA_LOADLIBNAME "package" +#define LUA_DBLIBNAME "debug" +#define LUA_BITLIBNAME "bit" +#define LUA_JITLIBNAME "jit" +#define LUA_FFILIBNAME "ffi" + +LUALIB_API int luaopen_base(lua_State *L); +LUALIB_API int luaopen_math(lua_State *L); +LUALIB_API int luaopen_string(lua_State *L); +LUALIB_API int luaopen_table(lua_State *L); +LUALIB_API int luaopen_io(lua_State *L); +LUALIB_API int luaopen_os(lua_State *L); +LUALIB_API int luaopen_package(lua_State *L); +LUALIB_API int luaopen_debug(lua_State *L); +LUALIB_API int luaopen_bit(lua_State *L); +LUALIB_API int luaopen_jit(lua_State *L); +LUALIB_API int luaopen_ffi(lua_State *L); + +LUALIB_API void luaL_openlibs(lua_State *L); + +#ifndef lua_assert +#define lua_assert(x) ((void)0) +#endif + +#endif diff --git a/inc/tsfuncs/BlFuncs.cpp b/inc/tsfuncs/BlFuncs.cpp new file mode 100644 index 0000000..68b789d --- /dev/null +++ b/inc/tsfuncs/BlFuncs.cpp @@ -0,0 +1,238 @@ + +////////////////////////////////////////////////// +// BlFuncs Version 1.0 + + +// Includes + +#include "BlHooks.hpp" +#include "BlFuncs.hpp" + +#include + + +// Scanned structures + +ADDR tsf_mCacheSequence; +ADDR tsf_mCacheAllocator; +ADDR tsf_gIdDictionary; +ADDR tsf_gEvalState_globalVars; + +BlFunctionDefIntern(tsf_BlStringTable__insert ); +BlFunctionDefIntern(tsf_BlNamespace__find ); +BlFunctionDefIntern(tsf_BlNamespace__createLocalEntry); +BlFunctionDefIntern(tsf_BlDataChunker__freeBlocks ); +BlFunctionDefIntern(tsf_BlCon__evaluate ); +BlFunctionDefIntern(tsf_BlCon__executef ); +BlFunctionDefIntern(tsf_BlCon__executefSimObj ); +BlFunctionDefIntern(tsf_BlCon__getVariable ); +BlFunctionDefIntern(tsf_BlDictionary__addVariable ); +BlFunctionDefIntern(tsf_BlSim__findObject_name ); +BlFunctionDefIntern(tsf_BlStringStack__getArgBuffer ); +BlFunctionDefIntern(tsf_BlSimObject__getDataField ); +BlFunctionDefIntern(tsf_BlSimObject__setDataField ); +BlFunctionDefIntern(tsf_BlCon__getReturnBuffer ); + + +// C->TS Args + +char* tsf_GetIntArg(signed int value) { + char* ret = tsf_BlStringStack__getArgBuffer(16); + snprintf(ret, 16, "%d", value); + return ret; +} +char* tsf_GetFloatArg(float value) { + char* ret = tsf_BlStringStack__getArgBuffer(32); + snprintf(ret, 32, "%g", value); + return ret; +} +char* tsf_GetStringArg(char* value) { + int len = strlen(value)+1; + char* ret = tsf_BlStringStack__getArgBuffer(len); + memcpy(ret, value, len); + return ret; +} +char* tsf_GetThisArg(ADDR obj) { + return tsf_GetIntArg(*(signed int *)(obj + 32)); +} + + +// Eval + +const char* tsf_Eval(const char *code) { + const char *argv[] = {nullptr, code}; + return tsf_BlCon__evaluate(0, 2, argv); +} + +const char* tsf_Evalf(const char *fmt, ...) { + va_list args; + char code[4096]; + va_start(args, fmt); + vsnprintf(code, 4096, fmt, args); + va_end(args); + + return tsf_Eval((const char*)code); +} + + +// Objects + +ADDR tsf_FindObject(unsigned int id) { + ADDR obj = *(ADDR*)(*(ADDR*)(tsf_gIdDictionary) + 4*(id & 0xFFF)); + if(!obj) return 0; + + while(obj && *(unsigned int *)(obj + 32) != id) { + obj = *(ADDR*)(obj + 16); + if(!obj) return 0; + } + + return obj; +} + +ADDR tsf_FindObject(const char* name) { + return (ADDR)tsf_BlSim__findObject_name(name); +} + +ADDR tsf_LookupNamespace(const char* ns, const char* package) { + const char* ste_package; + if(package) { + ste_package = tsf_BlStringTable__insert(package, 0); + } else { + ste_package = nullptr; + } + + if(ns) { + const char* ste_namespace = tsf_BlStringTable__insert(ns, 0); + return tsf_BlNamespace__find(ste_namespace, ste_package); + } else { + return tsf_BlNamespace__find(nullptr, ste_package); + } +} +ADDR tsf_LookupNamespace(const char* ns) { + return tsf_LookupNamespace(ns, nullptr); +} + + +// Object Fields + +const char* tsf_GetDataField(ADDR simObject, const char* slotName, const char* array) { + const char *ste_slotName; + if(slotName) { + ste_slotName = tsf_BlStringTable__insert(slotName, 0); + } else { + ste_slotName = nullptr; + } + + return tsf_BlSimObject__getDataField(simObject, ste_slotName, array); +} + +void tsf_SetDataField(ADDR simObject, const char* slotName, const char* array, const char* value) { + const char* ste_slotName; + if(slotName) { + ste_slotName = tsf_BlStringTable__insert(slotName, 0); + } else { + ste_slotName = nullptr; + } + + tsf_BlSimObject__setDataField(simObject, ste_slotName, array, value); +} + + +// TS Global Variables + +const char *tsf_GetVar(const char* name) { + return tsf_BlCon__getVariable(name); +} + +void tsf_AddVarInternal(const char* name, signed int varType, void* data) { + tsf_BlDictionary__addVariable((ADDR *)tsf_gEvalState_globalVars, name, varType, data); +} + +void tsf_AddVar(const char* name, const char** data) { + tsf_AddVarInternal(name, 10, data); +} +void tsf_AddVar(const char* name, signed int* data) { + tsf_AddVarInternal(name, 4, data); +} +void tsf_AddVar(const char* name, float* data) { + tsf_AddVarInternal(name, 8, data); +} +void tsf_AddVar(const char* name, bool* data) { + tsf_AddVarInternal(name, 6, data); +} + + +// TS->C Functions + +ADDR tsf_AddConsoleFuncInternal(const char* pname, const char* cname, const char* fname, signed int cbtype, const char* usage, signed int mina, signed int maxa) { + const char *ste_fname = tsf_BlStringTable__insert(fname, 0); + ADDR ns = tsf_LookupNamespace(cname, pname); + ADDR ent = tsf_BlNamespace__createLocalEntry(ns, ste_fname); + + *(signed int *)tsf_mCacheSequence += 1; + tsf_BlDataChunker__freeBlocks(*(ADDR *)tsf_mCacheAllocator); + + *(const char**)(ent + 24) = usage ; + *(signed int* )(ent + 16) = mina ; + *(signed int* )(ent + 20) = maxa ; + *(signed int* )(ent + 12) = cbtype; + + return ent; +} + +void tsf_AddConsoleFunc(const char* pname, const char* cname, const char* fname, tsf_StringCallback sc, const char* usage, signed int mina, signed int maxa) { + ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 1, usage, mina, maxa); + *(tsf_StringCallback *)(ent + 40) = sc; +} +void tsf_AddConsoleFunc(const char* pname, const char* cname, const char* fname, tsf_IntCallback ic, const char* usage, signed int mina, signed int maxa) { + ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 2, usage, mina, maxa); + *(tsf_IntCallback *)(ent + 40) = ic; +} +void tsf_AddConsoleFunc(const char* pname, const char* cname, const char* fname, tsf_FloatCallback fc, const char* usage, signed int mina, signed int maxa) { + ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 3, usage, mina, maxa); + *(tsf_FloatCallback *)(ent + 40) = fc; +} +void tsf_AddConsoleFunc(const char* pname, const char* cname, const char* fname, tsf_VoidCallback vc, const char* usage, signed int mina, signed int maxa) { + ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 4, usage, mina, maxa); + *(tsf_VoidCallback *)(ent + 40) = vc; +} +void tsf_AddConsoleFunc(const char* pname, const char* cname, const char* fname, tsf_BoolCallback bc, const char* usage, signed int mina, signed int maxa) { + ADDR ent = tsf_AddConsoleFuncInternal(pname, cname, fname, 5, usage, mina, maxa); + *(tsf_BoolCallback *)(ent + 40) = bc; +} + + +// Initialization + +bool tsf_InitInternal() { + BlScanFunctionText(tsf_BlStringTable__insert , "83 EC 0C 80 3D ? ? ? ? ?" ); + BlScanFunctionText(tsf_BlNamespace__find , "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 0C 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B DA 8B D1" ); + BlScanFunctionText(tsf_BlNamespace__createLocalEntry, "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 83 EC 08 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 89 4D F0" ); + BlScanFunctionText(tsf_BlDataChunker__freeBlocks , "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 51 53 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B D9 8B 33" ); + BlScanFunctionText(tsf_BlCon__evaluate , "55 8B EC 6A FF 68 ? ? ? ? 64 A1 ? ? ? ? 50 56 57 A1 ? ? ? ? 33 C5 50 8D 45 F4 64 A3 ? ? ? ? 8B 75 10" ); + BlScanFunctionText(tsf_BlCon__executef , "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 53 55 56 8B B4 24 ? ? ? ? 33 C9" ); + BlScanFunctionText(tsf_BlCon__executefSimObj , "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 53 56 8B B4 24 ? ? ? ? 33 C9" ); + BlScanFunctionText(tsf_BlCon__getVariable , "53 56 8B F1 57 85 F6 0F 84 ? ? ? ?" ); + BlScanFunctionText(tsf_BlDictionary__addVariable , "8B 44 24 04 56 57 8B F9" ); + BlScanFunctionText(tsf_BlSim__findObject_name , "57 8B F9 8A 17" ); + BlScanFunctionText(tsf_BlStringStack__getArgBuffer , "55 8B EC 83 E4 F8 8B 0D ? ? ? ? A1 ? ? ? ? 56 57 8B 7D 08 8D 14 01 03 D7 3B 15 ? ? ? ? 72 2C 8B 0D" ); + BlScanFunctionText(tsf_BlSimObject__getDataField , "51 53 8B D9 55 56 8B 74 24 14" ); + BlScanFunctionText(tsf_BlSimObject__setDataField , "81 EC ? ? ? ? A1 ? ? ? ? 33 C4 89 84 24 ? ? ? ? 8B 84 24 ? ? ? ? 53 8B D9 89 44 24 04" ); + BlScanFunctionText(tsf_BlCon__getReturnBuffer , "81 F9 ? ? ? ? 76 2B" ); + + ADDR BlScanText (tsf_mCacheSequenceLoc , "FF 05 ? ? ? ? B9 ? ? ? ? 8B F8 E8 ? ? ? ? 8B 44 24 1C 89 47 18 8B 44 24 14" ); + ADDR BlScanText (tsf_mCacheAllocatorLoc , "89 35 ? ? ? ? C7 06 ? ? ? ? A1 ? ? ? ? 68 ? ? ? ? C7 40 ? ? ? ? ? E8 ? ? ? ? 83 C4 04 8B 4D F4 64 89 0D ? ? ? ? 59 5E 8B E5 5D C3"); + ADDR BlScanText (tsf_gIdDictionaryLoc , "89 15 ? ? ? ? E8 ? ? ? ? 8B F0 89 75 F0" ); + ADDR BlScanText (tsf_gEvalState_globalVarsLoc , "B9 ? ? ? ? E8 ? ? ? ? 68 ? ? ? ? 6A 0A 68 ? ? ? ? B9 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ?" ); + + tsf_mCacheSequence = *(ADDR*)(tsf_mCacheSequenceLoc + 2); + tsf_mCacheAllocator = *(ADDR*)(tsf_mCacheAllocatorLoc + 2); + tsf_gIdDictionary = *(ADDR*)(tsf_gIdDictionaryLoc + 2); + tsf_gEvalState_globalVars = *(ADDR*)(tsf_gEvalState_globalVarsLoc + 1); + + return true; +} + +bool tsf_DeinitInternal() { + return true; +} diff --git a/inc/tsfuncs/BlFuncs.hpp b/inc/tsfuncs/BlFuncs.hpp new file mode 100644 index 0000000..b14626d --- /dev/null +++ b/inc/tsfuncs/BlFuncs.hpp @@ -0,0 +1,109 @@ + +////////////////////////////////////////////////// +// BlFuncs Version 1.0 + +#ifndef _H_BLFUNCS +#define _H_BLFUNCS + +// Require BlHooks to be included before this header +#ifndef _H_BLHOOKS + #error "BlFuncs.hpp: You must include BlHooks.hpp first" +#else + +typedef const char * (*tsf_StringCallback)(ADDR, signed int, const char *[]); +typedef signed int (*tsf_IntCallback )(ADDR, signed int, const char *[]); +typedef float (*tsf_FloatCallback )(ADDR, signed int, const char *[]); +typedef void (*tsf_VoidCallback )(ADDR, signed int, const char *[]); +typedef bool (*tsf_BoolCallback )(ADDR, signed int, const char *[]); + +/* These functions are used for tsf_BlCon__executefSimObj. + They refer to a special buffer for the argument stack. + For tsf_BlCon__executef, you need to use your own buffers. */ +char *tsf_GetIntArg(int); +char *tsf_GetFloatArg(float); +char *tsf_ScriptThis(ADDR); + +const char *tsf_Eval(const char *); +const char *tsf_Evalf(const char *, ...); + +ADDR tsf_FindObject(unsigned int); +ADDR tsf_FindObject(const char *); + +ADDR tsf_LookupNamespace(const char *, const char *); + +const char *tsf_GetDataField(ADDR, const char *, const char *); +void tsf_SetDataField(ADDR, const char *, const char *, const char *); + +const char *tsf_GetVar(const char *); + +void tsf_AddVarInternal(const char *, signed int, void *); +void tsf_AddVar(const char *, const char **); +void tsf_AddVar(const char *, signed int *); +void tsf_AddVar(const char *, float *); +void tsf_AddVar(const char *, bool *); + +ADDR tsf_AddConsoleFuncInternal(const char *, const char *, const char *, signed int, const char *, signed int, signed int); +void tsf_AddConsoleFunc(const char *, const char *, const char *, tsf_StringCallback, const char *, signed int, signed int); +void tsf_AddConsoleFunc(const char *, const char *, const char *, tsf_IntCallback, const char *, signed int, signed int); +void tsf_AddConsoleFunc(const char *, const char *, const char *, tsf_FloatCallback, const char *, signed int, signed int); +void tsf_AddConsoleFunc(const char *, const char *, const char *, tsf_VoidCallback, const char *, signed int, signed int); +void tsf_AddConsoleFunc(const char *, const char *, const char *, tsf_BoolCallback, const char *, signed int, signed int); + +bool tsf_InitInternal(); + +extern ADDR tsf_mCacheSequence; +extern ADDR tsf_mCacheAllocator; +extern ADDR tsf_gIdDictionary; +extern ADDR tsf_gEvalState_globalVars; + +BlFunctionDefExtern(const char *, __stdcall, tsf_BlStringTable__insert, const char *, bool); +BlFunctionDefExtern(ADDR, __fastcall, tsf_BlNamespace__find, const char *, const char *); +BlFunctionDefExtern(ADDR, __thiscall, tsf_BlNamespace__createLocalEntry, ADDR, const char *); +BlFunctionDefExtern(void, __thiscall, tsf_BlDataChunker__freeBlocks, ADDR); +BlFunctionDefExtern(const char *, , tsf_BlCon__evaluate, ADDR, signed int, const char **); +BlFunctionDefExtern(const char *, , tsf_BlCon__executef, signed int, ...); +BlFunctionDefExtern(const char *, , tsf_BlCon__executefSimObj, ADDR *, signed int, ...); +BlFunctionDefExtern(const char *, __thiscall, tsf_BlCon__getVariable, const char *); +BlFunctionDefExtern(void, __thiscall, tsf_BlDictionary__addVariable, ADDR *, const char *, signed int, void *); +BlFunctionDefExtern(ADDR *, __thiscall, tsf_BlSim__findObject_name, const char *); +BlFunctionDefExtern(char *, __stdcall, tsf_BlStringStack__getArgBuffer, unsigned int); +BlFunctionDefExtern(const char *, __thiscall, tsf_BlSimObject__getDataField, ADDR, const char *, const char *); +BlFunctionDefExtern(void, __thiscall, tsf_BlSimObject__setDataField, ADDR, const char *, const char *, const char *); +BlFunctionDefExtern(char *, __fastcall, tsf_BlCon__getReturnBuffer, unsigned int); + + +// Function short names + +#define BlEval tsf_Eval +#define BlEvalf tsf_Evalf + +#define BlIntArg tsf_GetIntArg +#define BlFloatArg tsf_GetFloatArg +#define BlThisArg tsf_GetThisArg +#define BlStringArg(x) tsf_GetStringArg((char*)x) +#define BlReturnBuffer tsf_BlCon__getReturnBuffer + +#define BlObject tsf_FindObject +#define BlNamespace tsf_LookupNamespace + +#define BlGetField tsf_GetDataField +#define BlSetField tsf_SetDataField + +#define BlGetVar tsf_GetVar +#define BlAddVar tsf_AddVar + +#define BlAddFunction tsf_AddConsoleFunc + +#define __22ND_ARGUMENT(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, ...) a22 +#define __NUM_LIST(...) __22ND_ARGUMENT(dummy, ##__VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#define BlCall(...) \ + tsf_BlCon__executef(__NUM_LIST(__VA_ARGS__), __VA_ARGS__) +#define BlCallObj(obj, ...) \ + tsf_BlCon__executefSimObj((ADDR*)obj, __NUM_LIST(__VA_ARGS__), __VA_ARGS__) + +#define BlFuncsInit() if(!tsf_InitInternal()) { return false; } +#define BlFuncsDeinit() if(!tsf_DeinitInternal()) { return false; } + + +#endif +#endif diff --git a/inc/tsfuncs/BlHooks.cpp b/inc/tsfuncs/BlHooks.cpp new file mode 100644 index 0000000..e46a852 --- /dev/null +++ b/inc/tsfuncs/BlHooks.cpp @@ -0,0 +1,207 @@ + +////////////////////////////////////////////////// +// RedoBlHooks Version 3.0 + + +// Includes + +#include +#include +//#include + +#include "BlHooks.hpp" + + +// Scanned structures + +BlFunctionDefIntern(tsh_BlPrintf); + + +// Sig Scanning + +ADDR ImageBase; +ADDR ImageSize; + +void tsh_i_InitScanner(){ + HMODULE module = GetModuleHandle(NULL); + if(module) { + MODULEINFO info; + GetModuleInformation(GetCurrentProcess(), module, &info, sizeof(MODULEINFO)); + ImageBase = (ADDR)info.lpBaseOfDll; + ImageSize = info.SizeOfImage; + } +} + +bool tsh_i_CompareData(BYTE *data, BYTE *pattern, char* mask){ + for (; *mask; ++data, ++pattern, ++mask){ + if (*mask=='x' && *data!=*pattern) + return false; + } + return (*mask)==0; +} + +ADDR tsh_i_FindPattern(ADDR imageBase, ADDR imageSize, BYTE *pattern, char *mask){ + for (ADDR i=imageBase; i < imageBase+imageSize; i++){ + if(tsh_i_CompareData((PBYTE)i, pattern, mask)){ + return i; + } + } + return 0; +} + +// Convert a text-style pattern into code-style +void tsh_i_PatternTextToCode(char* text, char** opatt, char** omask) { + unsigned int len = strlen(text); + char* patt = (char*)malloc(len); + char* mask = (char*)malloc(len); + + int outidx = 0; + int val = 0; + bool uk = false; + for(unsigned int i=0; i='0' && c<='9'){ + val = (val<<4) + (c-'0'); + }else if(c>='A' && c<='F'){ + val = (val<<4) + (c-'A'+10); + }else if(c>='a' && c<='f'){ + val = (val<<4) + (c-'a'+10); + }else if(c==' '){ + patt[outidx] = uk ? 0 : val; + mask[outidx] = uk ? '?' : 'x'; + val = 0; + uk = false; + outidx++; + } + } + + patt[outidx] = uk ? 0 : val; + mask[outidx] = uk ? '?' : 'x'; + outidx++; + patt[outidx] = 0; + mask[outidx] = 0; + + *opatt = patt; + *omask = mask; +} + + +// Public functions for sig scanning + +// Scan using code-style pattern +ADDR tsh_ScanCode(char* pattern, char* mask) { + return tsh_i_FindPattern(ImageBase, ImageSize-strlen(mask), (BYTE*)pattern, mask); +} + +// Scan using a text-style pattern +ADDR tsh_ScanText(char* text) { + char* patt; + char* mask; + tsh_i_PatternTextToCode(text, &patt, &mask); + + ADDR res = tsh_ScanCode(patt, mask); + + free(patt); + free(mask); + + return res; +} + + +// Call Patching and Hooking + +// Remove protection from address +//std::map> tsh_DeprotectedAddresses; + +void tsh_DeprotectAddress(ADDR length, ADDR location) { + DWORD oldProtection; + VirtualProtect((void*)location, length, PAGE_EXECUTE_READWRITE, &oldProtection); + //tsh_DeprotectedAddresses[location] = {length, oldProtection}; +} + +// Patch a string of bytes by deprotecting and then overwriting +void tsh_PatchBytes(ADDR length, ADDR location, BYTE* repl) { + tsh_DeprotectAddress(length, location); + memcpy((void*)location, (void*)repl, (size_t)length); +} + +void tsh_PatchByte(ADDR location, BYTE value) { + tsh_PatchBytes(location, 1, &value); +} + +void tsh_ReplaceInt(ADDR addr, int rval) { + tsh_PatchBytes(4, addr, (BYTE*)(&rval)); +} + +int tsh_i_CallOffset(ADDR instr, ADDR func) { + return func - (instr+4); +} + +void tsh_i_ReplaceCall(ADDR instr, ADDR target) { + tsh_ReplaceInt(instr, tsh_i_CallOffset(instr, target)); +} + +void tsh_i_PatchCopy(ADDR dest, ADDR src, unsigned int len) { + for(unsigned int i=0; i bool: success +#define BlHooksInit() if(!tsh_InitInternal()) { BlPrintf("BlHooksInit failed"); return false; } +// BlHooksDeinit() -> bool: success +#define BlHooksDeinit() if(!tsh_DeinitInternal()) { BlPrintf("BlHooksDeinit failed"); return false; } + + +// Scanned structures + +BlFunctionDefExtern(void, , tsh_BlPrintf, const char*, ...); + + +#endif diff --git a/lua5.1.dll b/lua5.1.dll new file mode 100644 index 0000000000000000000000000000000000000000..752c9c1df84d75634dad4b146eedcf777bcb7e91 GIT binary patch literal 478566 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%0D$yvv;C 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 z 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 literal 0 HcmV?d00001 diff --git a/lualib/https.dll b/lualib/https.dll new file mode 100644 index 0000000000000000000000000000000000000000..af815bbfc5a3f6e41749b3cd26bfe5a432e8e9cb GIT binary patch literal 341033 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 literal 0 HcmV?d00001 diff --git a/lualib/ltn12.lua b/lualib/ltn12.lua new file mode 100644 index 0000000..b42689a --- /dev/null +++ b/lualib/ltn12.lua @@ -0,0 +1,292 @@ +----------------------------------------------------------------------------- +-- LTN12 - Filters, sources, sinks and pumps. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ltn12.lua,v 1.31 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local table = require("table") +local base = _G +module("ltn12") + +filter = {} +source = {} +sink = {} +pump = {} + +-- 2048 seems to be better in windows... +BLOCKSIZE = 2048 +_VERSION = "LTN12 1.0.1" + +----------------------------------------------------------------------------- +-- Filter stuff +----------------------------------------------------------------------------- +-- returns a high level filter that cycles a low-level filter +function filter.cycle(low, ctx, extra) + base.assert(low) + return function(chunk) + local ret + ret, ctx = low(ctx, chunk, extra) + return ret + end +end + +-- chains a bunch of filters together +-- (thanks to Wim Couwenberg) +function filter.chain(...) + local n = table.getn(arg) + local top, index = 1, 1 + local retry = "" + return function(chunk) + retry = chunk and retry + while true do + if index == top then + chunk = arg[index](chunk) + if chunk == "" or top == n then return chunk + elseif chunk then index = index + 1 + else + top = top+1 + index = top + end + else + chunk = arg[index](chunk or "") + if chunk == "" then + index = index - 1 + chunk = retry + elseif chunk then + if index == n then return chunk + else index = index + 1 end + else base.error("filter returned inappropriate nil") end + end + end + end +end + +----------------------------------------------------------------------------- +-- Source stuff +----------------------------------------------------------------------------- +-- create an empty source +local function empty() + return nil +end + +function source.empty() + return empty +end + +-- returns a source that just outputs an error +function source.error(err) + return function() + return nil, err + end +end + +-- creates a file source +function source.file(handle, io_err) + if handle then + return function() + local chunk = handle:read(BLOCKSIZE) + if not chunk then handle:close() end + return chunk + end + else return source.error(io_err or "unable to open file") end +end + +-- turns a fancy source into a simple source +function source.simplify(src) + base.assert(src) + return function() + local chunk, err_or_new = src() + src = err_or_new or src + if not chunk then return nil, err_or_new + else return chunk end + end +end + +-- creates string source +function source.string(s) + if s then + local i = 1 + return function() + local chunk = string.sub(s, i, i+BLOCKSIZE-1) + i = i + BLOCKSIZE + if chunk ~= "" then return chunk + else return nil end + end + else return source.empty() end +end + +-- creates rewindable source +function source.rewind(src) + base.assert(src) + local t = {} + return function(chunk) + if not chunk then + chunk = table.remove(t) + if not chunk then return src() + else return chunk end + else + table.insert(t, chunk) + end + end +end + +function source.chain(src, f) + base.assert(src and f) + local last_in, last_out = "", "" + local state = "feeding" + local err + return function() + if not last_out then + base.error('source is empty!', 2) + end + while true do + if state == "feeding" then + last_in, err = src() + if err then return nil, err end + last_out = f(last_in) + if not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + elseif last_out ~= "" then + state = "eating" + if last_in then last_in = "" end + return last_out + end + else + last_out = f(last_in) + if last_out == "" then + if last_in == "" then + state = "feeding" + else + base.error('filter returned ""') + end + elseif not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + else + return last_out + end + end + end + end +end + +-- creates a source that produces contents of several sources, one after the +-- other, as if they were concatenated +-- (thanks to Wim Couwenberg) +function source.cat(...) + local src = table.remove(arg, 1) + return function() + while src do + local chunk, err = src() + if chunk then return chunk end + if err then return nil, err end + src = table.remove(arg, 1) + end + end +end + +----------------------------------------------------------------------------- +-- Sink stuff +----------------------------------------------------------------------------- +-- creates a sink that stores into a table +function sink.table(t) + t = t or {} + local f = function(chunk, err) + if chunk then table.insert(t, chunk) end + return 1 + end + return f, t +end + +-- turns a fancy sink into a simple sink +function sink.simplify(snk) + base.assert(snk) + return function(chunk, err) + local ret, err_or_new = snk(chunk, err) + if not ret then return nil, err_or_new end + snk = err_or_new or snk + return 1 + end +end + +-- creates a file sink +function sink.file(handle, io_err) + if handle then + return function(chunk, err) + if not chunk then + handle:close() + return 1 + else return handle:write(chunk) end + end + else return sink.error(io_err or "unable to open file") end +end + +-- creates a sink that discards data +local function null() + return 1 +end + +function sink.null() + return null +end + +-- creates a sink that just returns an error +function sink.error(err) + return function() + return nil, err + end +end + +-- chains a sink with a filter +function sink.chain(f, snk) + base.assert(f and snk) + return function(chunk, err) + if chunk ~= "" then + local filtered = f(chunk) + local done = chunk and "" + while true do + local ret, snkerr = snk(filtered, err) + if not ret then return nil, snkerr end + if filtered == done then return 1 end + filtered = f(done) + end + else return 1 end + end +end + +----------------------------------------------------------------------------- +-- Pump stuff +----------------------------------------------------------------------------- +-- pumps one chunk from the source to the sink +function pump.step(src, snk) + local chunk, src_err = src() + local ret, snk_err = snk(chunk, src_err) + if chunk and ret then return 1 + else return nil, src_err or snk_err end +end + +-- pumps all data from a source to a sink, using a step function +function pump.all(src, snk, step) + base.assert(src and snk) + step = step or pump.step + while true do + local ret, err = step(src, snk) + if not ret then + if err then return nil, err + else return 1 end + end + end +end + diff --git a/lualib/mime.lua b/lualib/mime.lua new file mode 100644 index 0000000..7fdd9ed --- /dev/null +++ b/lualib/mime.lua @@ -0,0 +1,87 @@ +----------------------------------------------------------------------------- +-- MIME support for the Lua language. +-- Author: Diego Nehab +-- Conforming to RFCs 2045-2049 +-- RCS ID: $Id: mime.lua,v 1.29 2007/06/11 23:44:54 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local ltn12 = require("ltn12") +local mime = require("mime.core") +--local io = require("io") +local string = require("string") +module("mime") + +-- encode, decode and wrap algorithm tables +encodet = {} +decodet = {} +wrapt = {} + +-- creates a function that chooses a filter by name from a given table +local function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then + base.error("unknown key (" .. base.tostring(name) .. ")", 3) + else return f(opt1, opt2) end + end +end + +-- define the encoding filters +encodet['base64'] = function() + return ltn12.filter.cycle(b64, "") +end + +encodet['quoted-printable'] = function(mode) + return ltn12.filter.cycle(qp, "", + (mode == "binary") and "=0D=0A" or "\r\n") +end + +-- define the decoding filters +decodet['base64'] = function() + return ltn12.filter.cycle(unb64, "") +end + +decodet['quoted-printable'] = function() + return ltn12.filter.cycle(unqp, "") +end + +local function format(chunk) + if chunk then + if chunk == "" then return "''" + else return string.len(chunk) end + else return "nil" end +end + +-- define the line-wrap filters +wrapt['text'] = function(length) + length = length or 76 + return ltn12.filter.cycle(wrp, length, length) +end +wrapt['base64'] = wrapt['text'] +wrapt['default'] = wrapt['text'] + +wrapt['quoted-printable'] = function() + return ltn12.filter.cycle(qpwrp, 76, 76) +end + +-- function that choose the encoding, decoding or wrap algorithm +encode = choose(encodet) +decode = choose(decodet) +wrap = choose(wrapt) + +-- define the end-of-line normalization filter +function normalize(marker) + return ltn12.filter.cycle(eol, 0, marker) +end + +-- high level stuffing filter +function stuff() + return ltn12.filter.cycle(dot, 2) +end diff --git a/lualib/mime/core.dll b/lualib/mime/core.dll new file mode 100644 index 0000000000000000000000000000000000000000..8de58050f0dbfd70eb4320ec5afb96ae73baea3a GIT binary patch literal 24576 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 literal 0 HcmV?d00001 diff --git a/lualib/socket.lua b/lualib/socket.lua new file mode 100644 index 0000000..211adcd --- /dev/null +++ b/lualib/socket.lua @@ -0,0 +1,133 @@ +----------------------------------------------------------------------------- +-- LuaSocket helper module +-- Author: Diego Nehab +-- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local math = require("math") +local socket = require("socket.core") +module("socket") + +----------------------------------------------------------------------------- +-- Exported auxiliar functions +----------------------------------------------------------------------------- +function connect(address, port, laddress, lport) + local sock, err = socket.tcp() + if not sock then return nil, err end + if laddress then + local res, err = sock:bind(laddress, lport, -1) + if not res then return nil, err end + end + local res, err = sock:connect(address, port) + if not res then return nil, err end + return sock +end + +function bind(host, port, backlog) + local sock, err = socket.tcp() + if not sock then return nil, err end + sock:setoption("reuseaddr", true) + local res, err = sock:bind(host, port) + if not res then return nil, err end + res, err = sock:listen(backlog) + if not res then return nil, err end + return sock +end + +try = newtry() + +function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) + else return f(opt1, opt2) end + end +end + +----------------------------------------------------------------------------- +-- Socket sources and sinks, conforming to LTN12 +----------------------------------------------------------------------------- +-- create namespaces inside LuaSocket namespace +sourcet = {} +sinkt = {} + +BLOCKSIZE = 2048 + +sinkt["close-when-done"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then + sock:close() + return 1 + else return sock:send(chunk) end + end + }) +end + +sinkt["keep-open"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if chunk then return sock:send(chunk) + else return 1 end + end + }) +end + +sinkt["default"] = sinkt["keep-open"] + +sink = choose(sinkt) + +sourcet["by-length"] = function(sock, length) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if length <= 0 then return nil end + local size = math.min(socket.BLOCKSIZE, length) + local chunk, err = sock:receive(size) + if err then return nil, err end + length = length - string.len(chunk) + return chunk + end + }) +end + +sourcet["until-closed"] = function(sock) + local done + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if done then return nil end + local chunk, err, partial = sock:receive(socket.BLOCKSIZE) + if not err then return chunk + elseif err == "closed" then + sock:close() + done = 1 + return partial + else return nil, err end + end + }) +end + + +sourcet["default"] = sourcet["until-closed"] + +source = choose(sourcet) + diff --git a/lualib/socket/core.dll b/lualib/socket/core.dll new file mode 100644 index 0000000000000000000000000000000000000000..9cb49ee8acfee3e3b0b501a894f3f5ec6ff6e512 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/lualib/socket/ftp.lua b/lualib/socket/ftp.lua new file mode 100644 index 0000000..598f65d --- /dev/null +++ b/lualib/socket/ftp.lua @@ -0,0 +1,281 @@ +----------------------------------------------------------------------------- +-- FTP support for the Lua language +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ftp.lua,v 1.45 2007/07/11 19:25:47 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local table = require("table") +local string = require("string") +local math = require("math") +local socket = require("socket") +local url = require("socket.url") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +module("socket.ftp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout in seconds before the program gives up on a connection +TIMEOUT = 60 +-- default port for ftp service +PORT = 21 +-- this is the default anonymous password. used when no password is +-- provided in url. should be changed to your e-mail. +USER = "ftp" +PASSWORD = "anonymous@anonymous.org" + +----------------------------------------------------------------------------- +-- Low level FTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(server, port, create) + local tp = socket.try(tp.connect(server, port or PORT, TIMEOUT, create)) + local f = base.setmetatable({ tp = tp }, metat) + -- make sure everything gets closed in an exception + f.try = socket.newtry(function() f:close() end) + return f +end + +function metat.__index:portconnect() + self.try(self.server:settimeout(TIMEOUT)) + self.data = self.try(self.server:accept()) + self.try(self.data:settimeout(TIMEOUT)) +end + +function metat.__index:pasvconnect() + self.data = self.try(socket.tcp()) + self.try(self.data:settimeout(TIMEOUT)) + self.try(self.data:connect(self.pasvt.ip, self.pasvt.port)) +end + +function metat.__index:login(user, password) + self.try(self.tp:command("user", user or USER)) + local code, reply = self.try(self.tp:check{"2..", 331}) + if code == 331 then + self.try(self.tp:command("pass", password or PASSWORD)) + self.try(self.tp:check("2..")) + end + return 1 +end + +function metat.__index:pasv() + self.try(self.tp:command("pasv")) + local code, reply = self.try(self.tp:check("2..")) + local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)" + local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern)) + self.try(a and b and c and d and p1 and p2, reply) + self.pasvt = { + ip = string.format("%d.%d.%d.%d", a, b, c, d), + port = p1*256 + p2 + } + if self.server then + self.server:close() + self.server = nil + end + return self.pasvt.ip, self.pasvt.port +end + +function metat.__index:port(ip, port) + self.pasvt = nil + if not ip then + ip, port = self.try(self.tp:getcontrol():getsockname()) + self.server = self.try(socket.bind(ip, 0)) + ip, port = self.try(self.server:getsockname()) + self.try(self.server:settimeout(TIMEOUT)) + end + local pl = math.mod(port, 256) + local ph = (port - pl)/256 + local arg = string.gsub(string.format("%s,%d,%d", ip, ph, pl), "%.", ",") + self.try(self.tp:command("port", arg)) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:send(sendt) + self.try(self.pasvt or self.server, "need port or pasv first") + -- if there is a pasvt table, we already sent a PASV command + -- we just get the data connection into self.data + if self.pasvt then self:pasvconnect() end + -- get the transfer argument and command + local argument = sendt.argument or + url.unescape(string.gsub(sendt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = sendt.command or "stor" + -- send the transfer command and check the reply + self.try(self.tp:command(command, argument)) + local code, reply = self.try(self.tp:check{"2..", "1.."}) + -- if there is not a a pasvt table, then there is a server + -- and we already sent a PORT command + if not self.pasvt then self:portconnect() end + -- get the sink, source and step for the transfer + local step = sendt.step or ltn12.pump.step + local readt = {self.tp.c} + local checkstep = function(src, snk) + -- check status in control connection while downloading + local readyt = socket.select(readt, nil, 0) + if readyt[tp] then code = self.try(self.tp:check("2..")) end + return step(src, snk) + end + local sink = socket.sink("close-when-done", self.data) + -- transfer all data and check error + self.try(ltn12.pump.all(sendt.source, sink, checkstep)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + -- done with data connection + self.data:close() + -- find out how many bytes were sent + local sent = socket.skip(1, self.data:getstats()) + self.data = nil + return sent +end + +function metat.__index:receive(recvt) + self.try(self.pasvt or self.server, "need port or pasv first") + if self.pasvt then self:pasvconnect() end + local argument = recvt.argument or + url.unescape(string.gsub(recvt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = recvt.command or "retr" + self.try(self.tp:command(command, argument)) + local code = self.try(self.tp:check{"1..", "2.."}) + if not self.pasvt then self:portconnect() end + local source = socket.source("until-closed", self.data) + local step = recvt.step or ltn12.pump.step + self.try(ltn12.pump.all(source, recvt.sink, step)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + self.data:close() + self.data = nil + return 1 +end + +function metat.__index:cwd(dir) + self.try(self.tp:command("cwd", dir)) + self.try(self.tp:check(250)) + return 1 +end + +function metat.__index:type(type) + self.try(self.tp:command("type", type)) + self.try(self.tp:check(200)) + return 1 +end + +function metat.__index:greet() + local code = self.try(self.tp:check{"1..", "2.."}) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + return 1 +end + +function metat.__index:quit() + self.try(self.tp:command("quit")) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:close() + if self.data then self.data:close() end + if self.server then self.server:close() end + return self.tp:close() +end + +----------------------------------------------------------------------------- +-- High level FTP API +----------------------------------------------------------------------------- +local function override(t) + if t.url then + local u = url.parse(t.url) + for i,v in base.pairs(t) do + u[i] = v + end + return u + else return t end +end + +local function tput(putt) + putt = override(putt) + socket.try(putt.host, "missing hostname") + local f = open(putt.host, putt.port, putt.create) + f:greet() + f:login(putt.user, putt.password) + if putt.type then f:type(putt.type) end + f:pasv() + local sent = f:send(putt) + f:quit() + f:close() + return sent +end + +local default = { + path = "/", + scheme = "ftp" +} + +local function parse(u) + local t = socket.try(url.parse(u, default)) + socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'") + socket.try(t.host, "missing hostname") + local pat = "^type=(.)$" + if t.params then + t.type = socket.skip(2, string.find(t.params, pat)) + socket.try(t.type == "a" or t.type == "i", + "invalid type '" .. t.type .. "'") + end + return t +end + +local function sput(u, body) + local putt = parse(u) + putt.source = ltn12.source.string(body) + return tput(putt) +end + +put = socket.protect(function(putt, body) + if base.type(putt) == "string" then return sput(putt, body) + else return tput(putt) end +end) + +local function tget(gett) + gett = override(gett) + socket.try(gett.host, "missing hostname") + local f = open(gett.host, gett.port, gett.create) + f:greet() + f:login(gett.user, gett.password) + if gett.type then f:type(gett.type) end + f:pasv() + f:receive(gett) + f:quit() + return f:close() +end + +local function sget(u) + local gett = parse(u) + local t = {} + gett.sink = ltn12.sink.table(t) + tget(gett) + return table.concat(t) +end + +command = socket.protect(function(cmdt) + cmdt = override(cmdt) + socket.try(cmdt.host, "missing hostname") + socket.try(cmdt.command, "missing command") + local f = open(cmdt.host, cmdt.port, cmdt.create) + f:greet() + f:login(cmdt.user, cmdt.password) + f.try(f.tp:command(cmdt.command, cmdt.argument)) + if cmdt.check then f.try(f.tp:check(cmdt.check)) end + f:quit() + return f:close() +end) + +get = socket.protect(function(gett) + if base.type(gett) == "string" then return sget(gett) + else return tget(gett) end +end) + diff --git a/lualib/socket/http.lua b/lualib/socket/http.lua new file mode 100644 index 0000000..c020d8e --- /dev/null +++ b/lualib/socket/http.lua @@ -0,0 +1,350 @@ +----------------------------------------------------------------------------- +-- HTTP/1.1 client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: http.lua,v 1.70 2007/03/12 04:08:40 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +------------------------------------------------------------------------------- +local socket = require("socket") +local url = require("socket.url") +local ltn12 = require("ltn12") +local mime = require("mime") +local string = require("string") +local base = _G +local table = require("table") +module("socket.http") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- connection timeout in seconds +TIMEOUT = 60 +-- default port for document retrieval +PORT = 80 +-- user agent field sent in request +USERAGENT = socket._VERSION + +----------------------------------------------------------------------------- +-- Reads MIME headers from a connection, unfolding where needed +----------------------------------------------------------------------------- +local function receiveheaders(sock, headers) + local line, name, value, err + headers = headers or {} + -- get first line + line, err = sock:receive() + if err then return nil, err end + -- headers go until a blank line is found + while line ~= "" do + -- get field-name and value + name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)")) + if not (name and value) then return nil, "malformed reponse headers" end + name = string.lower(name) + -- get next line (value might be folded) + line, err = sock:receive() + if err then return nil, err end + -- unfold any folded values + while string.find(line, "^%s") do + value = value .. line + line = sock:receive() + if err then return nil, err end + end + -- save pair in table + if headers[name] then headers[name] = headers[name] .. ", " .. value + else headers[name] = value end + end + return headers +end + +----------------------------------------------------------------------------- +-- Extra sources and sinks +----------------------------------------------------------------------------- +socket.sourcet["http-chunked"] = function(sock, headers) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + -- get chunk size, skip extention + local line, err = sock:receive() + if err then return nil, err end + local size = base.tonumber(string.gsub(line, ";.*", ""), 16) + if not size then return nil, "invalid chunk size" end + -- was it the last chunk? + if size > 0 then + -- if not, get chunk and skip terminating CRLF + local chunk, err, part = sock:receive(size) + if chunk then sock:receive() end + return chunk, err + else + -- if it was, read trailers into headers table + headers, err = receiveheaders(sock, headers) + if not headers then return nil, err end + end + end + }) +end + +socket.sinkt["http-chunked"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then return sock:send("0\r\n\r\n") end + local size = string.format("%X\r\n", string.len(chunk)) + return sock:send(size .. chunk .. "\r\n") + end + }) +end + +----------------------------------------------------------------------------- +-- Low level HTTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(host, port, create) + -- create socket with user connect function, or with default + local c = socket.try((create or socket.tcp)()) + local h = base.setmetatable({ c = c }, metat) + -- create finalized try + h.try = socket.newtry(function() h:close() end) + -- set timeout before connecting + h.try(c:settimeout(TIMEOUT)) + h.try(c:connect(host, port or PORT)) + -- here everything worked + return h +end + +function metat.__index:sendrequestline(method, uri) + local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri) + return self.try(self.c:send(reqline)) +end + +function metat.__index:sendheaders(headers) + local h = "\r\n" + for i, v in base.pairs(headers) do + h = i .. ": " .. v .. "\r\n" .. h + end + self.try(self.c:send(h)) + return 1 +end + +function metat.__index:sendbody(headers, source, step) + source = source or ltn12.source.empty() + step = step or ltn12.pump.step + -- if we don't know the size in advance, send chunked and hope for the best + local mode = "http-chunked" + if headers["content-length"] then mode = "keep-open" end + return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step)) +end + +function metat.__index:receivestatusline() + local status = self.try(self.c:receive(5)) + -- identify HTTP/0.9 responses, which do not contain a status line + -- this is just a heuristic, but is what the RFC recommends + if status ~= "HTTP/" then return nil, status end + -- otherwise proceed reading a status line + status = self.try(self.c:receive("*l", status)) + local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)")) + return self.try(base.tonumber(code), status) +end + +function metat.__index:receiveheaders() + return self.try(receiveheaders(self.c)) +end + +function metat.__index:receivebody(headers, sink, step) + sink = sink or ltn12.sink.null() + step = step or ltn12.pump.step + local length = base.tonumber(headers["content-length"]) + local t = headers["transfer-encoding"] -- shortcut + local mode = "default" -- connection close + if t and t ~= "identity" then mode = "http-chunked" + elseif base.tonumber(headers["content-length"]) then mode = "by-length" end + return self.try(ltn12.pump.all(socket.source(mode, self.c, length), + sink, step)) +end + +function metat.__index:receive09body(status, sink, step) + local source = ltn12.source.rewind(socket.source("until-closed", self.c)) + source(status) + return self.try(ltn12.pump.all(source, sink, step)) +end + +function metat.__index:close() + return self.c:close() +end + +----------------------------------------------------------------------------- +-- High level HTTP API +----------------------------------------------------------------------------- +local function adjusturi(reqt) + local u = reqt + -- if there is a proxy, we need the full url. otherwise, just a part. + if not reqt.proxy and not PROXY then + u = { + path = socket.try(reqt.path, "invalid path 'nil'"), + params = reqt.params, + query = reqt.query, + fragment = reqt.fragment + } + end + return url.build(u) +end + +local function adjustproxy(reqt) + local proxy = reqt.proxy or PROXY + if proxy then + proxy = url.parse(proxy) + return proxy.host, proxy.port or 3128 + else + return reqt.host, reqt.port + end +end + +local function adjustheaders(reqt) + -- default headers + local lower = { + ["user-agent"] = USERAGENT, + ["host"] = reqt.host, + ["connection"] = "close, TE", + ["te"] = "trailers" + } + -- if we have authentication information, pass it along + if reqt.user and reqt.password then + lower["authorization"] = + "Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password)) + end + -- override with user headers + for i,v in base.pairs(reqt.headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +-- default url parts +local default = { + host = "", + port = PORT, + path ="/", + scheme = "http" +} + +local function adjustrequest(reqt) + -- parse url if provided + local nreqt = reqt.url and url.parse(reqt.url, default) or {} + -- explicit components override url + for i,v in base.pairs(reqt) do nreqt[i] = v end + if nreqt.port == "" then nreqt.port = 80 end + socket.try(nreqt.host and nreqt.host ~= "", + "invalid host '" .. base.tostring(nreqt.host) .. "'") + -- compute uri if user hasn't overriden + nreqt.uri = reqt.uri or adjusturi(nreqt) + -- ajust host and port if there is a proxy + nreqt.host, nreqt.port = adjustproxy(nreqt) + -- adjust headers in request + nreqt.headers = adjustheaders(nreqt) + return nreqt +end + +local function shouldredirect(reqt, code, headers) + return headers.location and + string.gsub(headers.location, "%s", "") ~= "" and + (reqt.redirect ~= false) and + (code == 301 or code == 302) and + (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") + and (not reqt.nredirects or reqt.nredirects < 5) +end + +local function shouldreceivebody(reqt, code) + if reqt.method == "HEAD" then return nil end + if code == 204 or code == 304 then return nil end + if code >= 100 and code < 200 then return nil end + return 1 +end + +-- forward declarations +local trequest, tredirect + +function tredirect(reqt, location) + local result, code, headers, status = trequest { + -- the RFC says the redirect URL has to be absolute, but some + -- servers do not respect that + url = url.absolute(reqt.url, location), + source = reqt.source, + sink = reqt.sink, + headers = reqt.headers, + proxy = reqt.proxy, + nredirects = (reqt.nredirects or 0) + 1, + create = reqt.create + } + -- pass location header back as a hint we redirected + headers = headers or {} + headers.location = headers.location or location + return result, code, headers, status +end + +function trequest(reqt) + -- we loop until we get what we want, or + -- until we are sure there is no way to get it + local nreqt = adjustrequest(reqt) + local h = open(nreqt.host, nreqt.port, nreqt.create) + -- send request line and headers + h:sendrequestline(nreqt.method, nreqt.uri) + h:sendheaders(nreqt.headers) + -- if there is a body, send it + if nreqt.source then + h:sendbody(nreqt.headers, nreqt.source, nreqt.step) + end + local code, status = h:receivestatusline() + -- if it is an HTTP/0.9 server, simply get the body and we are done + if not code then + h:receive09body(status, nreqt.sink, nreqt.step) + return 1, 200 + end + local headers + -- ignore any 100-continue messages + while code == 100 do + headers = h:receiveheaders() + code, status = h:receivestatusline() + end + headers = h:receiveheaders() + -- at this point we should have a honest reply from the server + -- we can't redirect if we already used the source, so we report the error + if shouldredirect(nreqt, code, headers) and not nreqt.source then + h:close() + return tredirect(reqt, headers.location) + end + -- here we are finally done + if shouldreceivebody(nreqt, code) then + h:receivebody(headers, nreqt.sink, nreqt.step) + end + h:close() + return 1, code, headers, status +end + +local function srequest(u, b) + local t = {} + local reqt = { + url = u, + sink = ltn12.sink.table(t) + } + if b then + reqt.source = ltn12.source.string(b) + reqt.headers = { + ["content-length"] = string.len(b), + ["content-type"] = "application/x-www-form-urlencoded" + } + reqt.method = "POST" + end + local code, headers, status = socket.skip(1, trequest(reqt)) + return table.concat(t), code, headers, status +end + +request = socket.protect(function(reqt, body) + if base.type(reqt) == "string" then return srequest(reqt, body) + else return trequest(reqt) end +end) diff --git a/lualib/socket/smtp.lua b/lualib/socket/smtp.lua new file mode 100644 index 0000000..8f3cfcf --- /dev/null +++ b/lualib/socket/smtp.lua @@ -0,0 +1,251 @@ +----------------------------------------------------------------------------- +-- SMTP client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: smtp.lua,v 1.46 2007/03/12 04:08:40 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local coroutine = require("coroutine") +local string = require("string") +local math = require("math") +local os = require("os") +local socket = require("socket") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +local mime = require("mime") +module("socket.smtp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout for connection +TIMEOUT = 60 +-- default server used to send e-mails +SERVER = "localhost" +-- default port +PORT = 25 +-- domain used in HELO command and default sendmail +-- If we are under a CGI, try to get from environment +DOMAIN = os.getenv("SERVER_NAME") or "localhost" +-- default time zone (means we don't know) +ZONE = "-0000" + +--------------------------------------------------------------------------- +-- Low level SMTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function metat.__index:greet(domain) + self.try(self.tp:check("2..")) + self.try(self.tp:command("EHLO", domain or DOMAIN)) + return socket.skip(1, self.try(self.tp:check("2.."))) +end + +function metat.__index:mail(from) + self.try(self.tp:command("MAIL", "FROM:" .. from)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:rcpt(to) + self.try(self.tp:command("RCPT", "TO:" .. to)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:data(src, step) + self.try(self.tp:command("DATA")) + self.try(self.tp:check("3..")) + self.try(self.tp:source(src, step)) + self.try(self.tp:send("\r\n.\r\n")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:quit() + self.try(self.tp:command("QUIT")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:close() + return self.tp:close() +end + +function metat.__index:login(user, password) + self.try(self.tp:command("AUTH", "LOGIN")) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(user))) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(password))) + return self.try(self.tp:check("2..")) +end + +function metat.__index:plain(user, password) + local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password) + self.try(self.tp:command("AUTH", auth)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:auth(user, password, ext) + if not user or not password then return 1 end + if string.find(ext, "AUTH[^\n]+LOGIN") then + return self:login(user, password) + elseif string.find(ext, "AUTH[^\n]+PLAIN") then + return self:plain(user, password) + else + self.try(nil, "authentication not supported") + end +end + +-- send message or throw an exception +function metat.__index:send(mailt) + self:mail(mailt.from) + if base.type(mailt.rcpt) == "table" then + for i,v in base.ipairs(mailt.rcpt) do + self:rcpt(v) + end + else + self:rcpt(mailt.rcpt) + end + self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step) +end + +function open(server, port, create) + local tp = socket.try(tp.connect(server or SERVER, port or PORT, + TIMEOUT, create)) + local s = base.setmetatable({tp = tp}, metat) + -- make sure tp is closed if we get an exception + s.try = socket.newtry(function() + s:close() + end) + return s +end + +-- convert headers to lowercase +local function lower_headers(headers) + local lower = {} + for i,v in base.pairs(headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +--------------------------------------------------------------------------- +-- Multipart message source +----------------------------------------------------------------------------- +-- returns a hopefully unique mime boundary +local seqno = 0 +local function newboundary() + seqno = seqno + 1 + return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'), + math.random(0, 99999), seqno) +end + +-- send_message forward declaration +local send_message + +-- yield the headers all at once, it's faster +local function send_headers(headers) + local h = "\r\n" + for i,v in base.pairs(headers) do + h = i .. ': ' .. v .. "\r\n" .. h + end + coroutine.yield(h) +end + +-- yield multipart message body from a multipart message table +local function send_multipart(mesgt) + -- make sure we have our boundary and send headers + local bd = newboundary() + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or 'multipart/mixed' + headers['content-type'] = headers['content-type'] .. + '; boundary="' .. bd .. '"' + send_headers(headers) + -- send preamble + if mesgt.body.preamble then + coroutine.yield(mesgt.body.preamble) + coroutine.yield("\r\n") + end + -- send each part separated by a boundary + for i, m in base.ipairs(mesgt.body) do + coroutine.yield("\r\n--" .. bd .. "\r\n") + send_message(m) + end + -- send last boundary + coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") + -- send epilogue + if mesgt.body.epilogue then + coroutine.yield(mesgt.body.epilogue) + coroutine.yield("\r\n") + end +end + +-- yield message body from a source +local function send_source(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from source + while true do + local chunk, err = mesgt.body() + if err then coroutine.yield(nil, err) + elseif chunk then coroutine.yield(chunk) + else break end + end +end + +-- yield message body from a string +local function send_string(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from string + coroutine.yield(mesgt.body) +end + +-- message source +function send_message(mesgt) + if base.type(mesgt.body) == "table" then send_multipart(mesgt) + elseif base.type(mesgt.body) == "function" then send_source(mesgt) + else send_string(mesgt) end +end + +-- set defaul headers +local function adjust_headers(mesgt) + local lower = lower_headers(mesgt.headers) + lower["date"] = lower["date"] or + os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE) + lower["x-mailer"] = lower["x-mailer"] or socket._VERSION + -- this can't be overriden + lower["mime-version"] = "1.0" + return lower +end + +function message(mesgt) + mesgt.headers = adjust_headers(mesgt) + -- create and return message source + local co = coroutine.create(function() send_message(mesgt) end) + return function() + local ret, a, b = coroutine.resume(co) + if ret then return a, b + else return nil, a end + end +end + +--------------------------------------------------------------------------- +-- High level SMTP API +----------------------------------------------------------------------------- +send = socket.protect(function(mailt) + local s = open(mailt.server, mailt.port, mailt.create) + local ext = s:greet(mailt.domain) + s:auth(mailt.user, mailt.password, ext) + s:send(mailt) + s:quit() + return s:close() +end) diff --git a/lualib/socket/tp.lua b/lualib/socket/tp.lua new file mode 100644 index 0000000..0683869 --- /dev/null +++ b/lualib/socket/tp.lua @@ -0,0 +1,123 @@ +----------------------------------------------------------------------------- +-- Unified SMTP/FTP subsystem +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: tp.lua,v 1.22 2006/03/14 09:04:15 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local socket = require("socket") +local ltn12 = require("ltn12") +module("socket.tp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +TIMEOUT = 60 + +----------------------------------------------------------------------------- +-- Implementation +----------------------------------------------------------------------------- +-- gets server reply (works for SMTP and FTP) +local function get_reply(c) + local code, current, sep + local line, err = c:receive() + local reply = line + if err then return nil, err end + code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + if not code then return nil, "invalid server reply" end + if sep == "-" then -- reply is multiline + repeat + line, err = c:receive() + if err then return nil, err end + current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + reply = reply .. "\n" .. line + -- reply ends with same code + until code == current and sep == " " + end + return code, reply +end + +-- metatable for sock object +local metat = { __index = {} } + +function metat.__index:check(ok) + local code, reply = get_reply(self.c) + if not code then return nil, reply end + if base.type(ok) ~= "function" then + if base.type(ok) == "table" then + for i, v in base.ipairs(ok) do + if string.find(code, v) then + return base.tonumber(code), reply + end + end + return nil, reply + else + if string.find(code, ok) then return base.tonumber(code), reply + else return nil, reply end + end + else return ok(base.tonumber(code), reply) end +end + +function metat.__index:command(cmd, arg) + if arg then + return self.c:send(cmd .. " " .. arg.. "\r\n") + else + return self.c:send(cmd .. "\r\n") + end +end + +function metat.__index:sink(snk, pat) + local chunk, err = c:receive(pat) + return snk(chunk, err) +end + +function metat.__index:send(data) + return self.c:send(data) +end + +function metat.__index:receive(pat) + return self.c:receive(pat) +end + +function metat.__index:getfd() + return self.c:getfd() +end + +function metat.__index:dirty() + return self.c:dirty() +end + +function metat.__index:getcontrol() + return self.c +end + +function metat.__index:source(source, step) + local sink = socket.sink("keep-open", self.c) + local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step) + return ret, err +end + +-- closes the underlying c +function metat.__index:close() + self.c:close() + return 1 +end + +-- connect with server and return c object +function connect(host, port, timeout, create) + local c, e = (create or socket.tcp)() + if not c then return nil, e end + c:settimeout(timeout or TIMEOUT) + local r, e = c:connect(host, port) + if not r then + c:close() + return nil, e + end + return base.setmetatable({c = c}, metat) +end + diff --git a/lualib/socket/url.lua b/lualib/socket/url.lua new file mode 100644 index 0000000..0e31d8a --- /dev/null +++ b/lualib/socket/url.lua @@ -0,0 +1,297 @@ +----------------------------------------------------------------------------- +-- URI parsing, composition and relative URL resolution +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: url.lua,v 1.38 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local base = _G +local table = require("table") +module("socket.url") + +----------------------------------------------------------------------------- +-- Module version +----------------------------------------------------------------------------- +_VERSION = "URL 1.0.1" + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function escape(s) + return string.gsub(s, "([^A-Za-z0-9_])", function(c) + return string.format("%%%02x", string.byte(c)) + end) +end + +----------------------------------------------------------------------------- +-- Protects a path segment, to prevent it from interfering with the +-- url parsing. +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +local function make_set(t) + local s = {} + for i,v in base.ipairs(t) do + s[t[i]] = 1 + end + return s +end + +-- these are allowed withing a path segment, along with alphanum +-- other characters must be escaped +local segment_set = make_set { + "-", "_", ".", "!", "~", "*", "'", "(", + ")", ":", "@", "&", "=", "+", "$", ",", +} + +local function protect_segment(s) + return string.gsub(s, "([^A-Za-z0-9_])", function (c) + if segment_set[c] then return c + else return string.format("%%%02x", string.byte(c)) end + end) +end + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function unescape(s) + return string.gsub(s, "%%(%x%x)", function(hex) + return string.char(base.tonumber(hex, 16)) + end) +end + +----------------------------------------------------------------------------- +-- Builds a path from a base path and a relative path +-- Input +-- base_path +-- relative_path +-- Returns +-- corresponding absolute path +----------------------------------------------------------------------------- +local function absolute_path(base_path, relative_path) + if string.sub(relative_path, 1, 1) == "/" then return relative_path end + local path = string.gsub(base_path, "[^/]*$", "") + path = path .. relative_path + path = string.gsub(path, "([^/]*%./)", function (s) + if s ~= "./" then return s else return "" end + end) + path = string.gsub(path, "/%.$", "/") + local reduced + while reduced ~= path do + reduced = path + path = string.gsub(reduced, "([^/]*/%.%./)", function (s) + if s ~= "../../" then return "" else return s end + end) + end + path = string.gsub(reduced, "([^/]*/%.%.)$", function (s) + if s ~= "../.." then return "" else return s end + end) + return path +end + +----------------------------------------------------------------------------- +-- Parses a url and returns a table with all its parts according to RFC 2396 +-- The following grammar describes the names given to the URL parts +-- ::= :///;?# +-- ::= @: +-- ::= [:] +-- :: = {/} +-- Input +-- url: uniform resource locator of request +-- default: table with default values for each field +-- Returns +-- table with the following fields, where RFC naming conventions have +-- been preserved: +-- scheme, authority, userinfo, user, password, host, port, +-- path, params, query, fragment +-- Obs: +-- the leading '/' in {/} is considered part of +----------------------------------------------------------------------------- +function parse(url, default) + -- initialize default parameters + local parsed = {} + for i,v in base.pairs(default or parsed) do parsed[i] = v end + -- empty url is parsed to nil + if not url or url == "" then return nil, "invalid url" end + -- remove whitespace + -- url = string.gsub(url, "%s", "") + -- get fragment + url = string.gsub(url, "#(.*)$", function(f) + parsed.fragment = f + return "" + end) + -- get scheme + url = string.gsub(url, "^([%w][%w%+%-%.]*)%:", + function(s) parsed.scheme = s; return "" end) + -- get authority + url = string.gsub(url, "^//([^/]*)", function(n) + parsed.authority = n + return "" + end) + -- get query stringing + url = string.gsub(url, "%?(.*)", function(q) + parsed.query = q + return "" + end) + -- get params + url = string.gsub(url, "%;(.*)", function(p) + parsed.params = p + return "" + end) + -- path is whatever was left + if url ~= "" then parsed.path = url end + local authority = parsed.authority + if not authority then return parsed end + authority = string.gsub(authority,"^([^@]*)@", + function(u) parsed.userinfo = u; return "" end) + authority = string.gsub(authority, ":([^:]*)$", + function(p) parsed.port = p; return "" end) + if authority ~= "" then parsed.host = authority end + local userinfo = parsed.userinfo + if not userinfo then return parsed end + userinfo = string.gsub(userinfo, ":([^:]*)$", + function(p) parsed.password = p; return "" end) + parsed.user = userinfo + return parsed +end + +----------------------------------------------------------------------------- +-- Rebuilds a parsed URL from its components. +-- Components are protected if any reserved or unallowed characters are found +-- Input +-- parsed: parsed URL, as returned by parse +-- Returns +-- a stringing with the corresponding URL +----------------------------------------------------------------------------- +function build(parsed) + local ppath = parse_path(parsed.path or "") + local url = build_path(ppath) + if parsed.params then url = url .. ";" .. parsed.params end + if parsed.query then url = url .. "?" .. parsed.query end + local authority = parsed.authority + if parsed.host then + authority = parsed.host + if parsed.port then authority = authority .. ":" .. parsed.port end + local userinfo = parsed.userinfo + if parsed.user then + userinfo = parsed.user + if parsed.password then + userinfo = userinfo .. ":" .. parsed.password + end + end + if userinfo then authority = userinfo .. "@" .. authority end + end + if authority then url = "//" .. authority .. url end + if parsed.scheme then url = parsed.scheme .. ":" .. url end + if parsed.fragment then url = url .. "#" .. parsed.fragment end + -- url = string.gsub(url, "%s", "") + return url +end + +----------------------------------------------------------------------------- +-- Builds a absolute URL from a base and a relative URL according to RFC 2396 +-- Input +-- base_url +-- relative_url +-- Returns +-- corresponding absolute url +----------------------------------------------------------------------------- +function absolute(base_url, relative_url) + if base.type(base_url) == "table" then + base_parsed = base_url + base_url = build(base_parsed) + else + base_parsed = parse(base_url) + end + local relative_parsed = parse(relative_url) + if not base_parsed then return relative_url + elseif not relative_parsed then return base_url + elseif relative_parsed.scheme then return relative_url + else + relative_parsed.scheme = base_parsed.scheme + if not relative_parsed.authority then + relative_parsed.authority = base_parsed.authority + if not relative_parsed.path then + relative_parsed.path = base_parsed.path + if not relative_parsed.params then + relative_parsed.params = base_parsed.params + if not relative_parsed.query then + relative_parsed.query = base_parsed.query + end + end + else + relative_parsed.path = absolute_path(base_parsed.path or "", + relative_parsed.path) + end + end + return build(relative_parsed) + end +end + +----------------------------------------------------------------------------- +-- Breaks a path into its segments, unescaping the segments +-- Input +-- path +-- Returns +-- segment: a table with one entry per segment +----------------------------------------------------------------------------- +function parse_path(path) + local parsed = {} + path = path or "" + --path = string.gsub(path, "%s", "") + string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) + for i = 1, table.getn(parsed) do + parsed[i] = unescape(parsed[i]) + end + if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end + if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end + return parsed +end + +----------------------------------------------------------------------------- +-- Builds a path component from its segments, escaping protected characters. +-- Input +-- parsed: path segments +-- unsafe: if true, segments are not protected before path is built +-- Returns +-- path: corresponding path stringing +----------------------------------------------------------------------------- +function build_path(parsed, unsafe) + local path = "" + local n = table.getn(parsed) + if unsafe then + for i = 1, n-1 do + path = path .. parsed[i] + path = path .. "/" + end + if n > 0 then + path = path .. parsed[n] + if parsed.is_directory then path = path .. "/" end + end + else + for i = 1, n-1 do + path = path .. protect_segment(parsed[i]) + path = path .. "/" + end + if n > 0 then + path = path .. protect_segment(parsed[n]) + if parsed.is_directory then path = path .. "/" end + end + end + if parsed.is_absolute then path = "/" .. path end + return path +end diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..dd791bf --- /dev/null +++ b/readme.md @@ -0,0 +1,36 @@ + +# BlockLua +## How to Install +- Install RedBlocklandLoader +- Copy `BlockLua.dll`, `lua5.1.dll`, into the `modules` folder next to `Blockland.exe` +- Optional: Copy the `lualib` folder into `modules` + + +## Quick Reference + +### From TorqueScript +`'print('hello world')` - Execute Lua code in the console by prepending a `'` (single quote) +`luaeval("code");` - Eval Lua code from Torque +`luacall("funcName", %args);` - Eval Lua code from Torque +`luaexec("fileName");` - Execute a Lua file from Torque +`luaget("varName");` - Read a Lua global variable +`luaset("varName");` - Write a Lua global variable + +### From Lua +`bl.funcName(args)` - Call a TorqueScript function +`bl.varName` - Read a TorqueScript global variable +`bl['varName']` - Read a TorqueScript global variable (with special characters in the name, or from an array) +`bl.set('varName', value)` - Write a TorqueScript global variable + +### Accessing Torque Objects from Lua +`bl.objectName` - Access a Torque object by name +`bl[objectID]` - Access a Torque object by ID (or name) +`bl.objectName.field` - Read a field or Lua key from a Torque object +`bl.objectName:set('field', value)` - Write a field on a Torque object +`bl.objectName.key = value` - Associate Lua data with a Torque object +`bl.objectName:method(args)` - Call a Torque object method + + +### Unsafe Mode +BlockLua-Unsafe.dll can be used in place of BlockLua.dll, to remove the sandboxing of Lua code. +This allows Lua code to access any file and use any library, including ffi. diff --git a/src/bllua4.cpp b/src/bllua4.cpp new file mode 100644 index 0000000..fa75efd --- /dev/null +++ b/src/bllua4.cpp @@ -0,0 +1,105 @@ +// BlockLua (bllua4): Simple Lua interface for TorqueScript + +// Includes + +#include +#include + +#include "lua.hpp" +#include "BlHooks.cpp" +#include "BlFuncs.cpp" + +#include "luainterp.cpp" +#include "lualibts.cpp" +lua_State* gL; +#include "tsliblua.cpp" + +// Global variables + +// Setup + +// Hack to encode the contents of text files as static strings +#define INCLUDE_BIN(varname, filename) \ + asm("_" #varname ": .incbin \"" filename "\""); \ + asm(".byte 0"); \ + extern char varname[]; +INCLUDE_BIN(bll_fileLuaEnvSafe, "lua-env-safe.lua"); +INCLUDE_BIN(bll_fileLuaEnv , "lua-env.lua"); +INCLUDE_BIN(bll_fileTsEnv , "ts-env.cs" ); +INCLUDE_BIN(bll_fileLuaStd , "util/std.lua"); +INCLUDE_BIN(bll_fileLuaVector , "util/vector.lua"); +INCLUDE_BIN(bll_fileLuaLibts , "util/libts.lua"); +INCLUDE_BIN(bll_fileTsLibtsSupport, "util/libts-support.cs"); +INCLUDE_BIN(bll_fileLuaLibbl , "util/libbl.lua" ); +INCLUDE_BIN(bll_fileLuaLibblTypes , "util/libbl-types.lua"); +INCLUDE_BIN(bll_fileTsLibblSupport, "util/libbl-support.cs"); +INCLUDE_BIN(bll_fileLoadaddons , "util/loadaddons.cs"); + +#define BLL_LOAD_LUA(lstate, vname) \ + if(!bll_LuaEval(lstate, vname)) { \ + BlPrintf(" Error executing " #vname); \ + return false; \ + } + +bool init() { + BlHooksInit(); + BlPrintf("BlockLua: Loading"); + + BlFuncsInit(); + + // Initialize Lua environment + gL = lua_open(); + luaL_openlibs(gL); + + // Expose TS API to Lua + llibbl_init(gL); + + // Set up Lua environment + BLL_LOAD_LUA(gL, bll_fileLuaEnv); + #ifndef BLLUA_UNSAFE + BLL_LOAD_LUA(gL, bll_fileLuaEnvSafe); + #endif + + // Expose Lua API to TS + BlAddFunction(NULL, NULL, "_bllua_luacall", bll_ts_luacall, "LuaCall(name, ...) - Call Lua function and return result", 2, 20); + BlEval(bll_fileTsEnv); + + // Load utilities + BLL_LOAD_LUA(gL, bll_fileLuaStd); + BLL_LOAD_LUA(gL, bll_fileLuaVector); + BLL_LOAD_LUA(gL, bll_fileLuaLibts); + BlEval(bll_fileTsLibtsSupport); + BLL_LOAD_LUA(gL, bll_fileLuaLibbl); + BLL_LOAD_LUA(gL, bll_fileLuaLibblTypes); + BlEval(bll_fileTsLibblSupport); + BlEval(bll_fileLoadaddons); + + BlEval("$_bllua_active = 1;"); + + BlPrintf(" BlockLua: Done Loading"); + return true; +} + +bool deinit() { + BlPrintf("BlockLua: Unloading"); + + BlEval("deactivatePackage(_bllua_main);"); + BlEval("$_bllua_active = 0;"); + bll_LuaEval(gL, "for _,f in pairs(_bllua_on_unload) do f() end"); + + lua_close(gL); + + BlHooksDeinit(); + BlFuncsDeinit(); + + BlPrintf(" BlockLua: Done Unloading"); + return true; +} + +bool __stdcall DllMain(HINSTANCE hinstance, DWORD reason, void* reserved) { + switch(reason) { + case DLL_PROCESS_ATTACH: return init(); + case DLL_PROCESS_DETACH: return deinit(); + default : return true; + } +} diff --git a/src/lua-env-safe.lua b/src/lua-env-safe.lua new file mode 100644 index 0000000..c64a30e --- /dev/null +++ b/src/lua-env-safe.lua @@ -0,0 +1,142 @@ +-- Sanitize the Lua environment to: +-- Prevent scripts from accessing files outside the game directory +-- Prevent usage of libraries other than + + +-- Utility: Convert a list of strings into a map of string->true +local function tmap(t) local u = {}; for _, n in ipairs(t) do u[n] = true end; return u; end + +-- Save banned global variables for wrapping with safe functions +local old_io = io +local old_require = require +local old_os = os +local old_debug = debug +local old_package = package + +-- Remove all global variables except a whitelist +local ok_names = tmap { + '_G', '_bllua_ts', '_bllua_on_unload', '_bllua_on_error', + 'string', 'table', 'math', 'coroutine', 'bit', + 'pairs', 'ipairs', 'next', 'unpack', 'select', + 'error', 'assert', 'pcall', 'xpcall', + 'type', 'tostring', 'tonumber', + 'loadstring', + 'getmetatable', 'setmetatable', + 'rawget', 'rawset', 'rawequal', 'rawlen', + 'module', '_VERSION', +} +local not_ok_names = {} +for n, _ in pairs(_G) do + if not ok_names[n] then + table.insert(not_ok_names, n) + end +end +for _, n in ipairs(not_ok_names) do + _G[n] = nil +end + +-- Sanitize file paths to point only to allowed files within the game directory +-- List of allowed directories for reading/writing +local allowed_dirs = tmap { + 'add-ons', 'base', 'config', 'saves', 'screenshots', 'shaders' +} +-- List of allowed directories for reading only +local allowed_dirs_readonly = tmap { + 'lualib' +} +-- List of disallowed file extensions - basically executable file extensions +-- Note that even without this protection, exploiting would still require somehow +-- getting a file within the allowed directories to autorun, +-- so this is just a precaution. +local disallowed_exts = tmap { + -- windows + 'bat','bin','cab','cmd','com','cpl','ex_','exe','gadget','inf','ins','inx','isu', + 'job','jse','lnk','msc','msi','msp','mst','paf','pif','ps1','reg','rgs','scr', + 'sct','shb','shs','u3p','vb','vbe','vbs','vbscript','ws','wsf','wsh', + -- linux + 'csh','ksh','out','run','sh', + -- mac/other + 'action','apk','app','command','ipa','osx','prg','workflow', +} +-- Arguments: file name (relative to game directory), boolean true if only reading +-- Return: clean file path if allowed (or nil if disallowed), +-- error string (or nil if allowed) +local function safe_path(fn, readonly) + fn = fn:gsub('\\', '/') + fn = fn:gsub('^ +', '') + fn = fn:gsub(' +$', '') + -- whitelist characters + local ic = fn:find('[^a-zA-Z0-9_%-/ %.]') + if ic then + return nil, 'Filename \''..fn..'\' contains invalid character \''.. + fn:sub(ic, ic)..'\' at position '..ic + end + -- disallow up-dirs, absolute paths, and relative paths + -- './' and '../' are possible in scripts, because they're processed into + -- absolute paths in util.lua before reaching here + if fn:find('^%.') or fn:find('%.%.') or fn:find(':') or fn:find('^/') then + return nil, 'Filename \''..fn..'\' contains invalid sequence' + end + -- allow only whitelisted dirs + local dir = fn:match('^([^/]+)/') + if (not dir) or ( + (not allowed_dirs[dir:lower()]) and + ((not readonly) or (not allowed_dirs_readonly[dir:lower()])) ) then + return nil, 'filename is in disallowed directory '..(dir or 'nil') + end + -- disallow blacklisted extensions or no extension + local ext = fn:match('%.([^/%.]+)$') + if (not ext) or (disallowed_exts[ext:lower()]) then + return nil, 'Filename \''..fn..'\' has disallowed extension \''.. + (ext or '')..'\'' + end + return fn, nil +end + +-- Wrap io.open with path sanitization +function _bllua_io_open(fn, md) + md = md or 'r' + local readonly = md=='r' or md=='rb' + local fns, err = safe_path(fn, readonly) + if fns then + return old_io.open(fns, md) + else + return nil, err + end +end +-- Allow io.type (works on file handles returned by io.open) +function _bllua_io_type(f) + return old_io.type(f) +end + +-- Wrap require with a blacklist for unsafe built-in modules +-- List of allowed packages to require +-- Note that util.lua wraps this and provides 'require', +-- only falling back here if the package is not found in user files +local disallowed_packages = tmap { + 'ffi', 'debug', 'package', 'io', 'os', + '_bllua_ts', +} +function _bllua_requiresecure(name) + if name:find('[^a-zA-Z0-9_%-%.]') or name:find('%.%.') or + name:find('^%.') or name:find('%.$') then + error('require: package name contains invalid character', 3) + elseif disallowed_packages[name] then + error('require: attempt to require disallowed module \''..name..'\'', 3) + else + -- todo: reimplement require to not use package.* stuff? + return old_require(name) + end +end +package = { + seeall = old_package.seeall, +} + +-- Provide limited debug +debug = { + traceback = old_debug.traceback, + getinfo = old_debug.getinfo, + getfilename = old_debug.getfilename, -- defined in lua.env.lua +} + +_bllua_ts.echo(' Executed bllua-env-safe.lua') diff --git a/src/lua-env.lua b/src/lua-env.lua new file mode 100644 index 0000000..f485ee2 --- /dev/null +++ b/src/lua-env.lua @@ -0,0 +1,40 @@ +-- Set up the Lua environment + +-- Point old require to modules/lua in game directory +package.path = 'modules\\lualib\\?.lua;modules\\lualib\\?\\init.lua;' +package.cpath = 'modules\\lualib\\?.dll;' + +-- Set up table of unload/cleanup callbacks +_bllua_on_unload = {} + +-- Utility for getting the current filename +function debug.getfilename(level) + if type(level) == 'number' then level = level+1 end + local info = debug.getinfo(level) + if not info then return nil end + local filename = info.source:match('^%-%-%[%[([^%]]+)%]%]') + return filename +end + +-- Called when pcall fails on a ts->lua call, used to print detailed error info +function _bllua_on_error(err) + err = err:match(': (.+)$') or err + local tracelines = {err} + local level = 2 + while true do + local info = debug.getinfo(level) + if not info then break end + local filename = debug.getfilename(level) or info.short_src + local funcname = info.name + if funcname=='dofile' then break end + table.insert(tracelines, string.format('%s:%s in function \'%s\'', + filename, + info.currentline==-1 and '' or info.currentline..':', + funcname + )) + level = level+1 + end + return table.concat(tracelines, '\n') +end + +_bllua_ts.echo(' Executed bllua-env.lua') diff --git a/src/luainterp.cpp b/src/luainterp.cpp new file mode 100644 index 0000000..86f22a6 --- /dev/null +++ b/src/luainterp.cpp @@ -0,0 +1,68 @@ + +// Handle errors with a Lua function, defined in lua-env.lua +int bll_error_handler(lua_State *L) { + lua_getfield(L, LUA_GLOBALSINDEX, "_bllua_on_error"); + if (!lua_isfunction(L, -1)) { + BlPrintf(" Lua error handler: _bllua_on_error not defined."); + lua_pop(L, 1); + return 1; + } + + // move function to before arg + int hpos = lua_gettop(L) - 1; + lua_insert(L, hpos); + + lua_pcall(L, 1, 1, 0); + return 1; +} +int bll_pcall(lua_State* L, int nargs, int nret) { + // calculate stack position for message handler + int hpos = lua_gettop(L) - nargs; + // push custom error message handler + lua_pushcfunction(L, bll_error_handler); + // move it before function and arguments + lua_insert(L, hpos); + // call lua_pcall function with custom handler + int ret = lua_pcall(L, nargs, nret, hpos); + // remove custom error message handler from stack + lua_remove(L, hpos); + return ret; +} + +// Display the last Lua error in the BL console +void bll_printError(lua_State* L, const char* operation, const char* item) { + //error_handler(L); + BlPrintf("\x03Lua error: %s", lua_tostring(L, -1)); + BlPrintf("\x03 (%s: %s)", operation, item); + lua_pop(L, 1); +} + +// Eval a string of Lua code +bool bll_LuaEval(lua_State* L, const char* str) { + if(luaL_loadbuffer(L, str, strlen(str), "input") || bll_pcall(L, 0, 1)) { + bll_printError(L, "eval", str); + return false; + } + return true; +} + +// Convert a Lua stack entry into a string for providing to TS +// Use static buffer to avoid excessive malloc +#define BLL_ARG_COUNT 20 +#define BLL_ARG_MAX 8192 +char bll_arg_buffer[BLL_ARG_COUNT][BLL_ARG_MAX]; +bool bll_toarg(lua_State* L, char* buf, int i, bool err) { + if(lua_isstring(L, i)) { + const char* str = lua_tostring(L, i); + if(strlen(str) >= BLL_ARG_MAX) { + if(err) luaL_error(L, "argument to TS is too long - max length is 8192"); + return true; + } else { + strcpy(buf, str); + return false; + } + } else { + if(err) luaL_error(L, "argument to TS must be a string"); + return true; + } +} diff --git a/src/lualibts.cpp b/src/lualibts.cpp new file mode 100644 index 0000000..ee90a47 --- /dev/null +++ b/src/lualibts.cpp @@ -0,0 +1,159 @@ +//run ../compile + +// TS -> Lua API + +// Call a TS function from Lua, push the result to Lua stack +int bll_TsCall(lua_State* L, const char* oname, const char* fname, int argc, int ofs) { + ADDR obj = (ADDR)NULL; + if(oname) { + obj = BlObject(oname); + if(!obj) { return luaL_error(L, "Lua->TS call: Object not found"); } + } + + if(argc > BLL_ARG_COUNT) { return luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)"); } + + char* argv[BLL_ARG_COUNT]; + for(int i=0; iTS object call: Too many arguments (Max is 19)"); + } + } else { + switch(argc) { + case 0: res = BlCall(fname); break; + case 1: res = BlCall(fname, argv[0]); break; + case 2: res = BlCall(fname, argv[0], argv[1]); break; + case 3: res = BlCall(fname, argv[0], argv[1], argv[2]); break; + case 4: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3]); break; + case 5: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4]); break; + case 6: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); break; + case 7: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]); break; + case 8: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); break; + case 9: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]); break; + case 10: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]); break; + case 11: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); break; + case 12: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]); break; + case 13: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]); break; + case 14: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]); break; + case 15: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]); break; + case 16: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15]); break; + case 17: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16]); break; + case 18: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17]); break; + case 19: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18]); break; + default: res = ""; luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)"); + } + } + + lua_pushstring(L, res); + + return 1; +} +// Lua lib function: ts.call +int bll_lua_tscall(lua_State* L) { + int argc = lua_gettop(L)-1; // number of arguments after function name + if(argc < 0) return luaL_error(L, "_bllua_ts.call: Must provide a function name"); + + const char* fname = luaL_checkstring(L, 1); + + return bll_TsCall(L, NULL, fname, argc, 1); +} +// Lua lib function: ts.callobj +int bll_lua_tscallobj(lua_State* L) { + int argc = lua_gettop(L)-2; // number of arguments after function name and object? + if(argc < 0) return luaL_error(L, "_bllua_ts.callobj: Must provide an object and function name"); + + const char* oname = luaL_checkstring(L, 1); + const char* fname = luaL_checkstring(L, 2); + + return bll_TsCall(L, oname, fname, argc, 2); +} + +// Lua lib function: ts.getvar +int bll_lua_tsgetvar(lua_State* L) { + const char* vname = luaL_checkstring(L, 1); + + const char* var = BlGetVar(vname); + lua_pushstring(L, var); + return 1; +} + +// Lua lib function: ts.getfield +int bll_lua_tsgetfield(lua_State* L) { + const char* oname = luaL_checkstring(L, 1); + const char* vname = luaL_checkstring(L, 2); + ADDR obj = BlObject(oname); + if(!obj) { return luaL_error(L, "_bllua_ts.getfield: Object not found"); } + + const char* val = BlGetField(obj, vname, NULL); + lua_pushstring(L, val); + return 1; +} +// Lua lib function: ts.setfield +int bll_lua_tssetfield(lua_State* L) { + const char* oname = luaL_checkstring(L, 1); + const char* vname = luaL_checkstring(L, 2); + const char* val = luaL_checkstring(L, 3); + ADDR obj = BlObject(oname); + if(!obj) { return luaL_error(L, "_bllua_ts.setfield: Object not found"); } + + BlSetField(obj, vname, NULL, val); + return 0; +} + +// Lua lib function: ts.eval +int bll_lua_tseval(lua_State* L) { + const char* str = luaL_checkstring(L, 1); + const char* res = BlEval(str); + lua_pushstring(L, res); + return 1; +} + +// Lua lib function: ts.echo +// Print to BL console - used in Lua print implementation +int bll_lua_tsecho(lua_State* L) { + const char* str = luaL_checkstring(L, 1); + BlPrintf("%s", str); + return 0; +} + +const luaL_Reg bll_lua_reg[] = { + {"call" , bll_lua_tscall }, + {"callobj" , bll_lua_tscallobj }, + {"getvar" , bll_lua_tsgetvar }, + {"getfield", bll_lua_tsgetfield}, + {"setfield", bll_lua_tssetfield}, + {"eval" , bll_lua_tseval }, + {"echo" , bll_lua_tsecho }, + {NULL, NULL}, +}; +void llibbl_init(lua_State* L) { + luaL_register(L, "_bllua_ts", bll_lua_reg); +} diff --git a/src/ts-env.cs b/src/ts-env.cs new file mode 100644 index 0000000..cda3a2b --- /dev/null +++ b/src/ts-env.cs @@ -0,0 +1,26 @@ +// Built-in functions +// Eval'd after BLLua4 has loaded the Lua environment and API + +// Public Lua library for TS +function luacall(%func, %a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p) { + if($_bllua_active) + return _bllua_luacall(%func, %a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k,%l,%m,%n,%o,%p); +} +function luaexec(%fn) { + if($_bllua_active) + return _bllua_luacall("_bllua_exec", %fn); +} +function luaeval(%code) { + if($_bllua_active) + return _bllua_luacall("_bllua_eval", %code); +} +function luaget(%name) { + if($_bllua_active) + return _bllua_luacall("_bllua_getvar", %name); +} +function luaset(%name, %val) { + if($_bllua_active) + _bllua_luacall("_bllua_setvar", %name, %val); +} + +echo(" Executed bllua-env.cs"); diff --git a/src/tsliblua.cpp b/src/tsliblua.cpp new file mode 100644 index 0000000..03fc03d --- /dev/null +++ b/src/tsliblua.cpp @@ -0,0 +1,25 @@ + +// Call a Lua function from TS, return true if success - result will be on Lua stack +bool bll_LuaCall(const char* fname, int argc, const char* argv[]) { + lua_getglobal(gL, fname); + for(int i=0; i " @ %text); + luacall("_bllua_smarteval", %text); + } else { + echo("Lua: not loaded"); + } + ConsoleEntry.setValue(""); + } else { + %textT = trim(%text); + if(strLen(%textT)>0) { + %lastChar = getSubStr(%textT, strLen(%textT)-1, 1); + if(%lastChar!$=";" && %lastChar!$="}") { + %text = "echo(" @ %text @ ");"; + ConsoleEntry.setValue(%text); + } + } + parent::eval(); + } + } +}; +activatePackage(_bllua_smartEval); + +package _bllua_objectDeletionHook { + // Hook object deletion to clean up its lua data + function SimObject::onRemove(%obj) { + // note: no parent function exists by default, + // and this is loaded before any addons + //parent::onRemove(%obj); + if($_bllua_active) luacall("_bllua_objectDeleted", %obj); + } +}; +activatePackage(_bllua_objectDeletionHook); + +echo(" Executed libbl-support.cs"); diff --git a/src/util/libbl-types.lua b/src/util/libbl-types.lua new file mode 100644 index 0000000..28502e1 --- /dev/null +++ b/src/util/libbl-types.lua @@ -0,0 +1,3706 @@ +-- Pre-defined types for builtin functions and variables +-- Most type conversion is automatic; only need to discern objects and booleans, +-- since both are represented by plain numbers in TS. + +-- Class hierarchy, adapted from https://notabug.org/Queuenard/blockland-DLL-tools/src/master/class_hierarchy +bl.class('SimObject') + bl.class('ScriptObject', 'SimObject') + bl.class('SimSet', 'SimObject') + bl.class('SimGroup', 'SimSet') + bl.class('GuiControl', 'SimGroup') + bl.class('GuiTextCtrl' , 'GuiControl') + bl.class('GuiSwatchCtrl' , 'GuiControl') + bl.class('GuiButtonBaseCtrl' , 'GuiControl') + bl.class('GuiArrayCtrl' , 'GuiControl') + bl.class('GuiScrollCtrl' , 'GuiControl') + bl.class('GuiMouseEventCtrl' , 'GuiControl') + bl.class('GuiProgressCtrl' , 'GuiControl') + bl.class('GuiSliderCtrl' , 'GuiControl') + bl.class('GuiConsoleTextCtrl' , 'GuiControl') + bl.class('GuiTSCtrl' , 'GuiControl') + bl.class('GuiObjectView', 'GuiTSCtrl') + bl.class('GameTSCtrl' , 'GuiTSCtrl') + bl.class('EditTSCtrl' , 'GuiTSCtrl') + bl.class('GuiPlayerView', 'GuiTSCtrl') + bl.class('GuiShapeNameHud' , 'GuiControl') + bl.class('GuiHealthBarHud' , 'GuiControl') + bl.class('GuiGraphCtrl' , 'GuiControl') + bl.class('GuiInspector' , 'GuiControl') + bl.class('GuiChunkedBitmapCtrl', 'GuiControl') + bl.class('GuiInputCtrl' , 'GuiControl') + bl.class('GuiNoMouseCtrl' , 'GuiControl') + bl.class('GuiBitmapBorderCtrl' , 'GuiControl') + bl.class('GuiBackgroundCtrl' , 'GuiControl') + bl.class('GuiEditorRuler' , 'GuiControl') + bl.class('GuiClockHud' , 'GuiControl') + bl.class('GuiEditCtrl' , 'GuiControl') + bl.class('GuiFilterCtrl' , 'GuiControl') + bl.class('GuiFrameSetCtrl' , 'GuiControl') + bl.class('GuiMenuBar' , 'GuiControl') + bl.class('GuiMessageVectorCtrl', 'GuiControl') + bl.class('GuiBitmapCtrl' , 'GuiControl') + bl.class('GuiCrossHairHud', 'GuiBitmapCtrl') + bl.class('ScriptGroup', 'SimGroup') + bl.class('NetConnection', 'SimGroup') + bl.class('GameConnection', 'NetConnection') + bl.class('Path', 'SimGroup') + bl.class('TCPObject', 'SimObject') + bl.class('SOCKObject', 'TCPObject') + bl.class('HTTPObject', 'TCPObject') + bl.class('SimDataBlock', 'SimObject') + bl.class('AudioEnvironment' , 'SimDataBlock') + bl.class('AudioSampleEnvironment', 'SimDataBlock') + bl.class('AudioDescription' , 'SimDataBlock') + bl.class('GameBaseData' , 'SimDataBlock') + bl.class('ShapeBaseData' , 'GameBaseData') + bl.class('CameraData' , 'ShapeBaseData') + bl.class('ItemData' , 'ShapeBaseData') + bl.class('MissionMarkerData', 'ShapeBaseData') + bl.class('PathCameraData' , 'ShapeBaseData') + bl.class('PlayerData' , 'ShapeBaseData') + bl.class('StaticShapeData' , 'ShapeBaseData') + bl.class('VehicleData' , 'ShapeBaseData') + bl.class('FlyingVehicleData' , 'VehicleData') + bl.class('WheeledVehicleData', 'VehicleData') + bl.class('DebrisData' , 'GameBaseData') + bl.class('ProjectileData' , 'GameBaseData') + bl.class('ShapeBaseImageData' , 'GameBaseData') + bl.class('TriggerData' , 'GameBaseData') + bl.class('ExplosionData' , 'GameBaseData') + bl.class('fxLightData' , 'GameBaseData') + bl.class('LightningData' , 'GameBaseData') + bl.class('ParticleEmitterNodeData', 'GameBaseData') + bl.class('SplashData' , 'GameBaseData') + bl.class('fxDTSBrickData' , 'GameBaseData') + bl.class('ParticleEmitterData' , 'GameBaseData') + bl.class('WheeledVehicleTire' , 'SimDataBlock') + bl.class('WheeledVehicleSpring' , 'SimDataBlock') + bl.class('TSShapeConstructor' , 'SimDataBlock') + bl.class('AudioProfile' , 'SimDataBlock') + bl.class('ParticleData' , 'SimDataBlock') + bl.class('MaterialPropertyMap', 'SimObject') + bl.class('NetObject', 'SimObject') + bl.class('SceneObject', 'NetObject') + bl.class('GameBase', 'SceneObject') + bl.class('ShapeBase', 'GameBase') + bl.class('MissionMarker', 'ShapeBase') + bl.class('SpawnSphere' , 'MissionMarker') + bl.class('VehicleSpawnMarker', 'MissionMarker') + bl.class('Waypoint' , 'MissionMarker') + bl.class('StaticShape' , 'ShapeBase') + bl.class('ScopeAlwaysShape', 'StaticShape') + bl.class('Player' , 'ShapeBase') + bl.class('AIPlayer', 'Player') + bl.class('Camera' , 'ShapeBase') + bl.class('Item' , 'ShapeBase') + bl.class('PathCamera' , 'ShapeBase') + bl.class('Vehicle' , 'ShapeBase') + bl.class('FlyingVehicle' , 'Vehicle') + bl.class('WheeledVehicle', 'Vehicle') + bl.class('Explosion' , 'GameBase') + bl.class('Splash' , 'GameBase') + bl.class('Debris' , 'GameBase') + bl.class('Projectile' , 'GameBase') + bl.class('Trigger' , 'GameBase') + bl.class('fxLight' , 'GameBase') + bl.class('Lightning' , 'GameBase') + bl.class('ParticleEmitterNode', 'GameBase') + bl.class('ParticleEmitter' , 'GameBase') + bl.class('Precipitation' , 'GameBase') + bl.class('TSStatic' , 'SceneObject') + bl.class('VehicleBlocker', 'SceneObject') + bl.class('Marker' , 'SceneObject') + bl.class('AudioEmitter' , 'SceneObject') + bl.class('PhysicalZone' , 'SceneObject') + bl.class('fxDayCycle' , 'SceneObject') + bl.class('fxDTSBrick' , 'SceneObject') + bl.class('fxPlane' , 'SceneObject') + bl.class('fxSunLight' , 'SceneObject') + bl.class('Sky' , 'SceneObject') + bl.class('SceneRoot' , 'SceneObject') + bl.class('Sun', 'NetObject') + bl.class('GuiCursor', 'SimObject') + bl.class('ConsoleLogger' , 'SimObject') + bl.class('QuotaObject' , 'SimObject') + bl.class('FileObject' , 'SimObject') + bl.class('BanList' , 'SimObject') + bl.class('GuiControlProfile', 'SimObject') + bl.class('MessageVector' , 'SimObject') + bl.class('ActionMap' , 'SimObject') + +-- Auto-generated from game scripts +bl.type('ActionMap::blockBind:1', 'object') +bl.type('ActionMap::copyBind:1', 'object') +bl.type('addBanGui::ban:1', 'object') +bl.type('addBanGui::clickForever:1', 'object') +bl.type('addBanGui::onSleep:1', 'object') +bl.type('addBanGui::onWake:1', 'object') +bl.type('addBanGui::setVictim:1', 'object') +bl.type('adminGui::ban:1', 'object') +bl.type('adminGui::ClickClearBricks:1', 'object') +bl.type('adminGui::ClickGameMode:1', 'object') +bl.type('adminGui::ClickServerSettings:1', 'object') +bl.type('adminGui::kick:1', 'object') +bl.type('adminGui::onWake:1', 'object') +bl.type('adminGui::openEnvGui:1', 'object') +bl.type('adminGui::sortList:1', 'object') +bl.type('adminGui::sortNumList:1', 'object') +bl.type('adminGui::spy:1', 'object') +bl.type('AdminLoginGui::onSleep:1', 'object') +bl.type('AdminLoginGui::onWake:1', 'object') +bl.type('authTCPobj_Client::onConnected:1', 'object') +bl.type('authTCPobj_Client::onConnectFailed:1', 'object') +bl.type('authTCPobj_Client::onDisconnect:1', 'object') +bl.type('authTCPobj_Client::onDNSFailed:1', 'object') +bl.type('authTCPobj_Client::onLine:1', 'object') +bl.type('AvatarGui::ClickFav:1', 'object') +bl.type('AvatarGui::clickSetFavs:1', 'object') +bl.type('AvatarGui::ClickX:1', 'object') +bl.type('AvatarGui::onSleep:1', 'object') +bl.type('AvatarGui::onWake:1', 'object') +bl.type('AvatarGui::updateFavButtons:1', 'object') +bl.type('BottomPrintText::onResize:1', 'object') +bl.type('BrickManGui::clearAllBricks:1', 'object') +bl.type('BrickManGui::clearBrickGroup:1', 'object') +bl.type('BrickManGui::clickBan:1', 'object') +bl.type('BrickManGui::clickClear:1', 'object') +bl.type('BrickManGui::clickClearAll:1', 'object') +bl.type('BrickManGui::clickHilight:1', 'object') +bl.type('BrickManGui::onSleep:1', 'object') +bl.type('BrickManGui::onWake:1', 'object') +bl.type('BrickManGui::sortList:1', 'object') +bl.type('BrickManGui::sortNumList:1', 'object') +bl.type('BrickSelectorDlg::onSleep:1', 'object') +bl.type('BrickSelectorDlg::onWake:1', 'object') +bl.type('BrickSelectorDlg::updateFavButtons:1', 'object') +bl.type('BSD_category::onRemove:1', 'object') +bl.type('BuildMacroSO::compress:1', 'object') +bl.type('BuildMacroSO::deleteEvent:1', 'object') +bl.type('BuildMacroSO::dump:1', 'object') +bl.type('BuildMacroSO::PlayBack:1', 'object') +bl.type('BuildMacroSO::PlayEvent:1', 'object') +bl.type('BuildMacroSO::pushEvent:1', 'object') +bl.type('CenterPrintText::onResize:1', 'object') +bl.type('clientIsValidAddOn', 'boolean') +bl.type('clientIsValidMusicFilename', 'boolean') +bl.type('ClientVerifyAddOnScripts', 'boolean') +bl.type('colorGui::clickCancel:1', 'object') +bl.type('colorGui::doCallbacks:1', 'object') +bl.type('colorGui::done:1', 'object') +bl.type('colorGui::onSleep:1', 'object') +bl.type('colorGui::onWake:1', 'object') +bl.type('colorGui::popUp:1', 'object') +bl.type('colorGui::setMode:1', 'object') +bl.type('colorGui::update:1', 'object') +bl.type('colorMatch', 'boolean') +bl.type('ColorSetGui::AddColor:1', 'object') +bl.type('ColorSetGui::defaults:1', 'object') +bl.type('ColorSetGui::deleteColor:1', 'object') +bl.type('ColorSetGui::Display:1', 'object') +bl.type('ColorSetGui::load:1', 'object') +bl.type('ColorSetGui::onSleep:1', 'object') +bl.type('ColorSetGui::onWake:1', 'object') +bl.type('ColorSetGui::save:1', 'object') +bl.type('ColorSetGui::selectColor:1', 'object') +bl.type('ColorSetGui::setMode:1', 'object') +bl.type('ColorSetGui::update:1', 'object') +bl.type('connectingGui::cancel:1', 'object') +bl.type('connectingGui::onWake:1', 'object') +bl.type('ConsoleEntry::eval:1', 'object') +bl.type('CreateMiniGameGui::clickColorList:1', 'object') +bl.type('CreateMiniGameGui::ClickCreate:1', 'object') +bl.type('CreateMiniGameGui::clickEnd:1', 'object') +bl.type('CreateMiniGameGui::ClickFav:1', 'object') +bl.type('CreateMiniGameGui::clickReset:1', 'object') +bl.type('CreateMiniGameGui::clickSetFavs:1', 'object') +bl.type('CreateMiniGameGui::dumpColorList:1', 'object') +bl.type('CreateMiniGameGui::end:1', 'object') +bl.type('CreateMiniGameGui::LoadDataBlocks:1', 'object') +bl.type('CreateMiniGameGui::onSleep:1', 'object') +bl.type('CreateMiniGameGui::onWake:1', 'object') +bl.type('CreateMiniGameGui::Refresh:1', 'object') +bl.type('CreateMiniGameGui::send:1', 'object') +bl.type('CustomGameGui::AddAdvancedGuiElement:1', 'object') +bl.type('CustomGameGui::clickAddOnItem:1', 'object') +bl.type('CustomGameGui::clickAddOns:1', 'object') +bl.type('CustomGameGui::clickAdvanced:1', 'object') +bl.type('CustomGameGui::clickAdvancedItem:1', 'object') +bl.type('CustomGameGui::clickAll:1', 'object') +bl.type('CustomGameGui::ClickBack:1', 'object') +bl.type('CustomGameGui::clickDefault:1', 'object') +bl.type('CustomGameGui::clickMusic:1', 'object') +bl.type('CustomGameGui::clickMusicItem:1', 'object') +bl.type('CustomGameGui::clickNone:1', 'object') +bl.type('CustomGameGui::ClickSelect:1', 'object') +bl.type('CustomGameGui::CopyGuiVarsToPrefs:1', 'object') +bl.type('CustomGameGui::CopyPrefsToGuiVars:1', 'object') +bl.type('CustomGameGui::CreateAddOnListGui:1', 'object') +bl.type('CustomGameGui::CreateAdvancedGui:1', 'object') +bl.type('CustomGameGui::CreateMusicListGui:1', 'object') +bl.type('CustomGameGui::hideAllTabs:1', 'object') +bl.type('CustomGameGui::onRender:1', 'object') +bl.type('CustomGameGui::onWake:1', 'object') +bl.type('CustomGameGui::populateAddOnList:1', 'object') +bl.type('CustomGameGui::populateMusicList:1', 'object') +bl.type('CustomGameGui::ScaleText:1', 'object') +bl.type('CustomGameGui::setDefaultAddOns:1', 'object') +bl.type('CustomGameGui::setDefaultMusic:1', 'object') +bl.type('defaultControlsGui::apply:1', 'object') +bl.type('defaultControlsGui::clickClose:1', 'object') +bl.type('defaultControlsGui::onSleep:1', 'object') +bl.type('defaultControlsGui::onWake:1', 'object') +bl.type('EnvGui::apply:1', 'object') +bl.type('EnvGui::cancel:1', 'object') +bl.type('EnvGui::clickAmbientLightColor:1', 'object') +bl.type('EnvGui::ClickDayCycleMenu:1', 'object') +bl.type('EnvGui::ClickDefaults:1', 'object') +bl.type('EnvGui::clickDirectLightColor:1', 'object') +bl.type('EnvGui::clickFogColor:1', 'object') +bl.type('EnvGui::ClickGroundButton:1', 'object') +bl.type('EnvGui::clickGroundColor:1', 'object') +bl.type('EnvGui::clickRandom:1', 'object') +bl.type('EnvGui::clickShadowColor:1', 'object') +bl.type('EnvGui::ClickSkyButton:1', 'object') +bl.type('EnvGui::clickSkyColor:1', 'object') +bl.type('EnvGui::ClickSunFlareBottomButton:1', 'object') +bl.type('EnvGui::clickSunFlareColor:1', 'object') +bl.type('EnvGui::ClickSunFlareTopButton:1', 'object') +bl.type('EnvGui::clickUnderWaterColor:1', 'object') +bl.type('EnvGui::clickVignetteColor:1', 'object') +bl.type('EnvGui::clickVignetteMultiply:1', 'object') +bl.type('EnvGui::ClickWaterButton:1', 'object') +bl.type('EnvGui::clickWaterColor:1', 'object') +bl.type('EnvGui::CreateIconMenu:1', 'object') +bl.type('EnvGui::hideAllMenus:1', 'object') +bl.type('EnvGui::onWake:1', 'object') +bl.type('EnvGui::setGround:1', 'object') +bl.type('EnvGui::setPane:1', 'object') +bl.type('EnvGui::setSky:1', 'object') +bl.type('EnvGui::setSunFlareBottom:1', 'object') +bl.type('EnvGui::setSunFlareTop:1', 'object') +bl.type('EnvGui::setWater:1', 'object') +bl.type('EnvGui::updateDayCycleEnabled:1', 'object') +bl.type('EnvGui::updateDayLength:1', 'object') +bl.type('EnvGui::updateVar:1', 'object') +bl.type('EnvGui_Window::onWindowFocus:1', 'object') +bl.type('escapeMenu::clickAdmin:1', 'object') +bl.type('escapeMenu::clickLoadBricks:1', 'object') +bl.type('escapeMenu::clickMinigames:1', 'object') +bl.type('escapeMenu::clickSaveBricks:1', 'object') +bl.type('escapeMenu::onWake:1', 'object') +bl.type('escapeMenu::toggle:1', 'object') +bl.type('filtersGui::onSleep:1', 'object') +bl.type('filtersGui::onWake:1', 'object') +bl.type('GameConnection::initialControlSet:1', 'object') +bl.type('GameConnection::onConnectionAccepted:1', 'object') +bl.type('GameConnection::onConnectionDropped:1', 'object') +bl.type('GameConnection::onConnectionError:1', 'object') +bl.type('GameConnection::onConnectionTimedOut:1', 'object') +bl.type('GameConnection::onConnectRequestRejected:1', 'object') +bl.type('GameConnection::onConnectRequestTimedOut:1', 'object') +bl.type('GameConnection::prepDemoPlayback:1', 'object') +bl.type('GameConnection::prepDemoRecord:1', 'object') +bl.type('GameConnection::setLagIcon:1', 'object') +bl.type('GameModeGui::ClickBack:1', 'object') +bl.type('GameModeGui::ClickGameMode:1', 'object') +bl.type('GameModeGui::ClickSelect:1', 'object') +bl.type('GameModeGui::CreateListItems:1', 'object') +bl.type('GameModeGui::DumpGameModes:1', 'object') +bl.type('GameModeGui::GetMissingAddOns:1', 'object') +bl.type('GameModeGui::onRender:1', 'object') +bl.type('GameModeGui::onWake:1', 'object') +bl.type('GameModeGui::PopulateGameModeList:1', 'object') +bl.type('GameModeGui::scrollToGameMode:1', 'object') +bl.type('GuiCanvas::checkCursor:1', 'object') +bl.type('GuiCanvas::checkTabFocus:1', 'object') +bl.type('GuiCanvas::popDialog:1', 'object') +bl.type('GuiCanvas::popLayer:1', 'object') +bl.type('GuiCanvas::pushDialog:1', 'object') +bl.type('GuiCanvas::setContent:1', 'object') +bl.type('GuiControl::getHelpPage:1', 'object') +bl.type('GuiControl::ScaleText:1', 'object') +bl.type('GuiMLTextCtrl::onURL:1', 'object') +bl.type('handleAddClientToTeam', 'boolean') +bl.type('handleRemoveClientFromTeam', 'boolean') +bl.type('handleSetTeamCaptain', 'boolean') +bl.type('hatTCPObj::onConnected:1', 'object') +bl.type('hatTCPObj::onConnectFailed:1', 'object') +bl.type('hatTCPObj::onDisconnect:1', 'object') +bl.type('hatTCPObj::onDNSFailed:1', 'object') +bl.type('hatTCPObj::onLine:1', 'object') +bl.type('haveTools', 'boolean') +bl.type('HelpDlg::onWake:1', 'object') +bl.type('HelpFileList::onSelect:1', 'object') +bl.type('isListenServer', 'boolean') +bl.type('isValidDecal', 'boolean') +bl.type('isValidFileName', 'boolean') +bl.type('joinMiniGameGui::ClickCreate:1', 'object') +bl.type('joinMiniGameGui::ClickJoin:1', 'object') +bl.type('joinMiniGameGui::ClickLeave:1', 'object') +bl.type('joinMiniGameGui::clickList:1', 'object') +bl.type('joinMiniGameGui::end:1', 'object') +bl.type('joinMiniGameGui::onSleep:1', 'object') +bl.type('joinMiniGameGui::onWake:1', 'object') +bl.type('joinMiniGameGui::sortList:1', 'object') +bl.type('joinMiniGameGui::sortNumList:1', 'object') +bl.type('JoinServerGuiBS::cancel:1', 'object') +bl.type('JoinServerGuiBS::ClickBack:1', 'object') +bl.type('JoinServerGuiBS::exit:1', 'object') +bl.type('JoinServerGuiBS::join:1', 'object') +bl.type('JoinServerGuiBS::onWake:1', 'object') +bl.type('JoinServerGuiBS::queryLan:1', 'object') +bl.type('JoinServerGuiBS::queryWebMaster:1', 'object') +bl.type('JoinServerGuiBS::update:1', 'object') +bl.type('JoinServerPassGui::cancel:1', 'object') +bl.type('JoinServerPassGui::enterPass:1', 'object') +bl.type('LoadBricksGui::ClickOwnership:1', 'object') +bl.type('LoadBricksGui::onSleep:1', 'object') +bl.type('LoadBricksGui::onWake:1', 'object') +bl.type('LoadingGui::onAdd:1', 'object') +bl.type('LoadingGui::onSleep:1', 'object') +bl.type('LoadingGui::onWake:1', 'object') +bl.type('MainMenuGui::buildScreenshotList:1', 'object') +bl.type('MainMenuGui::clickJoinBS:1', 'object') +bl.type('MainMenuGui::clickNameButton:1', 'object') +bl.type('MainMenuGui::clickOptions:1', 'object') +bl.type('MainMenuGui::clickPlayer:1', 'object') +bl.type('MainMenuGui::clickStart:1', 'object') +bl.type('MainMenuGui::clickSteam:1', 'object') +bl.type('MainMenuGui::clickUnlock:1', 'object') +bl.type('MainMenuGui::hideButtons:1', 'object') +bl.type('MainMenuGui::onRender:1', 'object') +bl.type('MainMenuGui::onSleep:1', 'object') +bl.type('MainMenuGui::onWake:1', 'object') +bl.type('MainMenuGui::PlayMusic:1', 'object') +bl.type('MainMenuGui::retryAuth:1', 'object') +bl.type('MainMenuGui::showButtons:1', 'object') +bl.type('ManualJoin::onWake:1', 'object') +bl.type('MessageBoxOKCancelDlg::onSleep:1', 'object') +bl.type('MessageBoxOKDlg::onSleep:1', 'object') +bl.type('MessageBoxYesNoDlg::onSleep:1', 'object') +bl.type('MiniGameInviteGui::ClickAccept:1', 'object') +bl.type('MiniGameInviteGui::ClickIgnore:1', 'object') +bl.type('MiniGameInviteGui::ClickReject:1', 'object') +bl.type('MiniGameInviteGui::Ignore:1', 'object') +bl.type('MiniGameInviteGui::onSleep:1', 'object') +bl.type('MiniGameInviteGui::onWake:1', 'object') +bl.type('MM_AuthBar::blinkFail:1', 'object') +bl.type('MM_AuthBar::blinkSuccess:1', 'object') +bl.type('mm_Fade::onDone:1', 'object') +bl.type('mm_Fade::OnWait:1', 'object') +bl.type('NewChatSO::addLine:1', 'object') +bl.type('NewChatSO::displayLatest:1', 'object') +bl.type('NewChatSO::displayPage:1', 'object') +bl.type('NewChatSO::dumpLines:1', 'object') +bl.type('NewChatSO::pageDown:1', 'object') +bl.type('NewChatSO::pageUp:1', 'object') +bl.type('NewChatSO::update:1', 'object') +bl.type('newMessageHud::onSleep:1', 'object') +bl.type('newMessageHud::onWake:1', 'object') +bl.type('newMessageHud::open:1', 'object') +bl.type('newMessageHud::updatePosition:1', 'object') +bl.type('newMessageHud::updateTypePosition:1', 'object') +bl.type('NewPlayerListGui::ClearInYourMiniGame:1', 'object') +bl.type('NewPlayerListGui::clickList:1', 'object') +bl.type('NewPlayerListGui::ClickMiniGameInvite:1', 'object') +bl.type('NewPlayerListGui::ClickMiniGameRemove:1', 'object') +bl.type('NewPlayerListGui::ClickTrustDemoteBUILD:1', 'object') +bl.type('NewPlayerListGui::ClickTrustDemoteNONE:1', 'object') +bl.type('NewPlayerListGui::ClickTrustInviteBuild:1', 'object') +bl.type('NewPlayerListGui::ClickTrustInviteFull:1', 'object') +bl.type('NewPlayerListGui::ClickUnIgnore:1', 'object') +bl.type('NewPlayerListGui::getIgnoringBL_ID:1', 'object') +bl.type('NewPlayerListGui::onSleep:1', 'object') +bl.type('NewPlayerListGui::onWake:1', 'object') +bl.type('NewPlayerListGui::setIgnoring:1', 'object') +bl.type('NewPlayerListGui::setIgnoringBL_ID:1', 'object') +bl.type('NewPlayerListGui::showTrustMessage:1', 'object') +bl.type('NewPlayerListGui::sortList:1', 'object') +bl.type('NewPlayerListGui::sortNumList:1', 'object') +bl.type('NewPlayerListGui::toggle:1', 'object') +bl.type('NewPlayerListGui::update:1', 'object') +bl.type('NewPlayerListGui::updateInYourMiniGame:1', 'object') +bl.type('NewPlayerListGui::updateScore:1', 'object') +bl.type('NewPlayerListGui::updateTrust:1', 'object') +bl.type('NewPlayerListGui::UpdateWindowTitle:1', 'object') +bl.type('NMH_Type::send:1', 'object') +bl.type('NMH_Type::type:1', 'object') +bl.type('noHudGui::onRender:1', 'object') +bl.type('noHudGui::onSleep:1', 'object') +bl.type('noHudGui::onWake:1', 'object') +bl.type('OptAudioDriverList::onSelect:1', 'object') +bl.type('OptGraphicsBorderlessToggle::onAction:1', 'object') +bl.type('OptGraphicsBPPMenu::init:1', 'object') +bl.type('OptGraphicsDriverMenu::onSelect:1', 'object') +bl.type('OptGraphicsFullscreenToggle::onAction:1', 'object') +bl.type('OptGraphicsResolutionMenu::init:1', 'object') +bl.type('OptGraphicsResolutionMenu::onSelect:1', 'object') +bl.type('optionsDlg::applyGraphics:1', 'object') +bl.type('optionsDlg::clearAllBinds:1', 'object') +bl.type('optionsDlg::clickLatencyOption:1', 'object') +bl.type('optionsDlg::onSleep:1', 'object') +bl.type('optionsDlg::onWake:1', 'object') +bl.type('optionsDlg::RemapAll:1', 'object') +bl.type('optionsDlg::RemapNext:1', 'object') +bl.type('optionsDlg::setBrickFXQuality:1', 'object') +bl.type('optionsDlg::setDefaultBinds:1', 'object') +bl.type('optionsDlg::setLightingQuality:1', 'object') +bl.type('optionsDlg::setPane:1', 'object') +bl.type('optionsDlg::setParticleQuality:1', 'object') +bl.type('optionsDlg::setPhysicsQuality:1', 'object') +bl.type('optionsDlg::setShaderQuality:1', 'object') +bl.type('optionsDlg::setTextureQuality:1', 'object') +bl.type('optionsDlg::UpdateAvailableShaders:1', 'object') +bl.type('optionsDlg::updateDrawDistanceBlocker:1', 'object') +bl.type('optionsDlg::updateFOV:1', 'object') +bl.type('optionsDlg::updateMaxViewDistance:1', 'object') +bl.type('optionsDlg::updateTempBrickBlockers:1', 'object') +bl.type('OptRemapInputCtrl::onInputEvent:1', 'object') +bl.type('OptRemapList::doRemap:1', 'object') +bl.type('OptRemapList::fillList:1', 'object') +bl.type('OptScreenshotMenu::init:1', 'object') +bl.type('PlayGui::createInvHUD:1', 'object') +bl.type('PlayGui::createToolHUD:1', 'object') +bl.type('PlayGui::FadePaintRow:1', 'object') +bl.type('PlayGui::FadePaintRows:1', 'object') +bl.type('PlayGui::hideBrickBox:1', 'object') +bl.type('PlayGui::hidePaintBox:1', 'object') +bl.type('PlayGui::hideToolBox:1', 'object') +bl.type('PlayGui::killInvHud:1', 'object') +bl.type('PlayGui::killpaint:1', 'object') +bl.type('PlayGui::killToolHud:1', 'object') +bl.type('PlayGui::loadPaint:1', 'object') +bl.type('PlayGui::onRender:1', 'object') +bl.type('PlayGui::onSleep:1', 'object') +bl.type('PlayGui::onWake:1', 'object') +bl.type('PlayGui::UnFadePaintRow:1', 'object') +bl.type('PlayGui::updatePaintActive:1', 'object') +bl.type('PrintSelectorDlg::onSleep:1', 'object') +bl.type('PrintSelectorDlg::onWake:1', 'object') +bl.type('queryMasterTCPObj::onConnected:1', 'object') +bl.type('queryMasterTCPObj::onConnectFailed:1', 'object') +bl.type('queryMasterTCPObj::onDisconnect:1', 'object') +bl.type('queryMasterTCPObj::onDNSFailed:1', 'object') +bl.type('queryMasterTCPObj::onLine:1', 'object') +bl.type('recordingsDlg::onWake:1', 'object') +bl.type('regNameGui::onClose:1', 'object') +bl.type('regNameGui::onSleep:1', 'object') +bl.type('regNameGui::onType:1', 'object') +bl.type('regNameGui::onWake:1', 'object') +bl.type('regNameGui::register:1', 'object') +bl.type('regName_tcpObj::onConnected:1', 'object') +bl.type('regName_tcpObj::onConnectFailed:1', 'object') +bl.type('regName_tcpObj::onDisconnect:1', 'object') +bl.type('regName_tcpObj::onDNSFailed:1', 'object') +bl.type('regName_tcpObj::onLine:1', 'object') +bl.type('saveBricksGui::onSleep:1', 'object') +bl.type('saveBricksGui::onWake:1', 'object') +bl.type('SavingGui::onRender:1', 'object') +bl.type('SavingGui::onWake:1', 'object') +bl.type('SavingGui::save:1', 'object') +bl.type('selectBLIDGui::onSleep:1', 'object') +bl.type('selectBLIDGui::onWake:1', 'object') +bl.type('selectBLIDGui::select:1', 'object') +bl.type('SelectNetworkGui::onSleep:1', 'object') +bl.type('SelectNetworkGui::onWake:1', 'object') +bl.type('ServerSettingsGui::ApplyVariablesToGui:1', 'object') +bl.type('ServerSettingsGui::ClickBack:1', 'object') +bl.type('ServerSettingsGui::clickInternet:1', 'object') +bl.type('ServerSettingsGui::clickLAN:1', 'object') +bl.type('ServerSettingsGui::clickLaunchGame:1', 'object') +bl.type('ServerSettingsGui::clickSinglePlayer:1', 'object') +bl.type('ServerSettingsGui::copyVariablesToPrefs:1', 'object') +bl.type('ServerSettingsGui::getVariablesFromFile:1', 'object') +bl.type('ServerSettingsGui::getVariablesFromGui:1', 'object') +bl.type('ServerSettingsGui::onRender:1', 'object') +bl.type('ServerSettingsGui::onWake:1', 'object') +bl.type('ServerSO::Display:1', 'object') +bl.type('ServerSO::serialize:1', 'object') +bl.type('setJoinIP_tcpObj::onConnected:1', 'object') +bl.type('setJoinIP_tcpObj::onConnectFailed:1', 'object') +bl.type('setJoinIP_tcpObj::onDisconnect:1', 'object') +bl.type('setJoinIP_tcpObj::onDNSFailed:1', 'object') +bl.type('setJoinIP_tcpObj::onLine:1', 'object') +bl.type('setScrollMode', 'boolean') +bl.type('SimGroup::CLIENTaddNTName:1', 'object') +bl.type('SimGroup::CLIENTDumpNTNames:1', 'object') +bl.type('SimGroup::CLIENTremoveNTName:1', 'object') +bl.type('SO_ClientTeam::addMember:1', 'object') +bl.type('SO_ClientTeam::removeMember', 'boolean') +bl.type('SO_ClientTeam::removeMember:1', 'object') +bl.type('SO_ClientTeam::setCaptain:1', 'object') +bl.type('SO_ClientTeamManager::addTeam', 'boolean') +bl.type('SO_ClientTeamManager::addTeam:1', 'object') +bl.type('SO_ClientTeamManager::dumpTeams:1', 'object') +bl.type('SO_ClientTeamManager::findTeamByID:1', 'object') +bl.type('SO_ClientTeamManager::removeTeam', 'boolean') +bl.type('SO_ClientTeamManager::removeTeam:1', 'object') +bl.type('SO_ClientTeamManager::setTeamName:1', 'object') +bl.type('SteamGreenLightGui::ClickBack:1', 'object') +bl.type('SteamGreenLightGui::clickForward:1', 'object') +bl.type('SteamGreenLightGui::onRender:1', 'object') +bl.type('SteamGreenLightGui::onWake:1', 'object') +bl.type('TrustInviteGui::ClickAccept:1', 'object') +bl.type('TrustInviteGui::ClickIgnore:1', 'object') +bl.type('TrustInviteGui::ClickReject:1', 'object') +bl.type('TrustInviteGui::Ignore:1', 'object') +bl.type('unBanGui::clickUnBan:1', 'object') +bl.type('unBanGui::onSleep:1', 'object') +bl.type('unBanGui::onWake:1', 'object') +bl.type('unBanGui::sortList:1', 'object') +bl.type('unBanGui::sortNumList:1', 'object') +bl.type('unBanGui::unBan:1', 'object') +bl.type('WhoTalkSO::addID:1', 'object') +bl.type('WhoTalkSO::Display:1', 'object') +bl.type('WhoTalkSO::HasID', 'boolean') +bl.type('WhoTalkSO::HasID:1', 'object') +bl.type('WhoTalkSO::removeID:1', 'object') +bl.type('wrenchDlg::LoadDataBlocks:1', 'object') +bl.type('wrenchDlg::onSleep:1', 'object') +bl.type('wrenchDlg::onWake:1', 'object') +bl.type('wrenchDlg::send:1', 'object') +bl.type('wrenchEventsDlg::clear:1', 'object') +bl.type('wrenchEventsDlg::closeColorMenu:1', 'object') +bl.type('wrenchEventsDlg::CreateColorMenu:1', 'object') +bl.type('wrenchEventsDlg::CreateNamedBrickList:1', 'object') +bl.type('wrenchEventsDlg::createOutputList:1', 'object') +bl.type('wrenchEventsDlg::createOutputParameters:1', 'object') +bl.type('wrenchEventsDlg::createTargetList:1', 'object') +bl.type('wrenchEventsDlg::newEvent:1', 'object') +bl.type('wrenchEventsDlg::onSleep:1', 'object') +bl.type('wrenchEventsDlg::onWake:1', 'object') +bl.type('wrenchEventsDlg::pickColor:1', 'object') +bl.type('wrenchEventsDlg::reshuffleScrollbox:1', 'object') +bl.type('wrenchEventsDlg::send:1', 'object') +bl.type('wrenchEventsDlg::VerifyInt:1', 'object') +bl.type('wrenchSoundDlg::onSleep:1', 'object') +bl.type('wrenchSoundDlg::onWake:1', 'object') +bl.type('wrenchSoundDlg::send:1', 'object') +bl.type('wrenchVehicleSpawnDlg::onSleep:1', 'object') +bl.type('wrenchVehicleSpawnDlg::onWake:1', 'object') +bl.type('wrenchVehicleSpawnDlg::Respawn:1', 'object') +bl.type('wrenchVehicleSpawnDlg::send:1', 'object') +bl.type('AdminWandImage::onFire:1', 'object') +bl.type('AdminWandImage::onHitObject:1', 'object') +bl.type('AdminWandImage::onPreFire:1', 'object') +bl.type('AdminWandImage::onStopFire:1', 'object') +bl.type('ammo::onInventory:1', 'object') +bl.type('Armor::Damage:1', 'object') +bl.type('Armor::doDismount:1', 'object') +bl.type('Armor::onAdd:1', 'object') +bl.type('Armor::onCollision:1', 'object') +bl.type('Armor::onDamage:1', 'object') +bl.type('Armor::onDisabled:1', 'object') +bl.type('Armor::onEnterLiquid:1', 'object') +bl.type('Armor::onEnterMissionArea:1', 'object') +bl.type('Armor::onImpact:1', 'object') +bl.type('Armor::onLeaveLiquid:1', 'object') +bl.type('Armor::onLeaveMissionArea:1', 'object') +bl.type('Armor::onMount:1', 'object') +bl.type('Armor::onNewDataBlock:1', 'object') +bl.type('Armor::onReachDestination:1', 'object') +bl.type('Armor::onRemove:1', 'object') +bl.type('Armor::onStuck:1', 'object') +bl.type('Armor::onTargetEnterLOS:1', 'object') +bl.type('Armor::onTargetExitLOS:1', 'object') +bl.type('Armor::onTrigger:1', 'object') +bl.type('Armor::onUnMount:1', 'object') +bl.type('BanManagerSO::addBan:1', 'object') +bl.type('BanManagerSO::dumpBans:1', 'object') +bl.type('BanManagerSO::isBanned:1', 'object') +bl.type('BanManagerSO::loadBans:1', 'object') +bl.type('BanManagerSO::removeBan:1', 'object') +bl.type('BanManagerSO::RemoveBanBL_ID:1', 'object') +bl.type('BanManagerSO::saveBans:1', 'object') +bl.type('BanManagerSO::sendBanList:1', 'object') +bl.type('blankaBallImage::onAbortCharge:1', 'object') +bl.type('blankaBallImage::onCharge:1', 'object') +bl.type('blankaBallImage::onFire:1', 'object') +bl.type('blankaBallImage::onMount:1', 'object') +bl.type('blankaBallImage::onUnMount:1', 'object') +bl.type('blankaBallProjectile::onCollision:1', 'object') +bl.type('blinkPaintProjectile::onCollision:1', 'object') +bl.type('brickDeployProjectile::onCollision:1', 'object') +bl.type('brickImage::onDeploy:1', 'object') +bl.type('brickSpawnPointData::onLoadPlant:1', 'object') +bl.type('brickSpawnPointData::onPlant:1', 'object') +bl.type('brickSpawnPointData::onRemove:1', 'object') +bl.type('brickVehicleSpawnData::onColorChange:1', 'object') +bl.type('Camera::onAdd:1', 'object') +bl.type('Camera::setMode:1', 'object') +bl.type('chromePaintProjectile::onCollision:1', 'object') +bl.type('colorMatch', 'boolean') +bl.type('CustomGameGuiServer::populateAddOnList:1', 'object') +bl.type('CustomGameGuiServer::populateMusicList:1', 'object') +bl.type('EnvGuiServer::AddToResourceList:1', 'object') +bl.type('EnvGuiServer::fillAdvancedVarsFromSimple:1', 'object') +bl.type('EnvGuiServer::getIdxFromFilenames:1', 'object') +bl.type('EnvGuiServer::PopulateEnvResourceList:1', 'object') +bl.type('EnvGuiServer::readAdvancedVarsFromSimple:1', 'object') +bl.type('EnvGuiServer::SendVignette:1', 'object') +bl.type('EnvGuiServer::SendVignetteAll:1', 'object') +bl.type('EnvGuiServer::SetAdvancedMode:1', 'object') +bl.type('EnvGuiServer::SetSimpleMode:1', 'object') +bl.type('Explosion::onAdd:1', 'object') +bl.type('ExplosionData::onAdd:1', 'object') +bl.type('flatPaintProjectile::onCollision:1', 'object') +bl.type('FlyingVehicleData::Damage:1', 'object') +bl.type('FlyingVehicleData::onCollision:1', 'object') +bl.type('fxDTSBrick::addEvent:1', 'object') +bl.type('fxDTSBrick::chainTrustCheckDown:1', 'object') +bl.type('fxDTSBrick::ChainTrustCheckUp:1', 'object') +bl.type('fxDTSBrick::ChainTrustCheckVolume:1', 'object') +bl.type('fxDTSBrick::chainUndoTrustCheckDown:1', 'object') +bl.type('fxDTSBrick::ChainUndoTrustCheckUp:1', 'object') +bl.type('fxDTSBrick::colorVehicle:1', 'object') +bl.type('fxDTSBrick::decrementPrintCount:1', 'object') +bl.type('fxDTSBrick::disappear:1', 'object') +bl.type('fxDTSBrick::eventFloodCheck', 'boolean') +bl.type('fxDTSBrick::eventFloodCheck:1', 'object') +bl.type('fxDTSBrick::explode:1', 'object') +bl.type('fxDTSBrick::fakeKillBrick:1', 'object') +bl.type('fxDTSBrick::fireRelay:1', 'object') +bl.type('fxDTSBrick::fireRelayDown:1', 'object') +bl.type('fxDTSBrick::fireRelayEast:1', 'object') +bl.type('fxDTSBrick::fireRelayFromBox:1', 'object') +bl.type('fxDTSBrick::fireRelayNorth:1', 'object') +bl.type('fxDTSBrick::fireRelaySouth:1', 'object') +bl.type('fxDTSBrick::fireRelayUp:1', 'object') +bl.type('fxDTSBrick::fireRelayWest:1', 'object') +bl.type('fxDTSBrick::getPrintCount:1', 'object') +bl.type('fxDTSBrick::getSpawnPoint:1', 'object') +bl.type('fxDTSBrick::incrementPrintCount:1', 'object') +bl.type('fxDTSBrick::isBlocked', 'boolean') +bl.type('fxDTSBrick::isBlocked:1', 'object') +bl.type('fxDTSBrick::onActivate:1', 'object') +bl.type('fxDTSBrick::onAdd:1', 'object') +bl.type('fxDTSBrick::onBlownUp:1', 'object') +bl.type('fxDTSBrick::onClearFakeDeath:1', 'object') +bl.type('fxDTSBrick::onColorChange:1', 'object') +bl.type('fxDTSBrick::onDeath:1', 'object') +bl.type('fxDTSBrick::onDisappear:1', 'object') +bl.type('fxDTSBrick::onFakeDeath:1', 'object') +bl.type('fxDTSBrick::onLoadPlant:1', 'object') +bl.type('fxDTSBrick::onMiniGameReset:1', 'object') +bl.type('fxDTSBrick::onPlant:1', 'object') +bl.type('fxDTSBrick::onPlayerTouch:1', 'object') +bl.type('fxDTSBrick::onPrintCountOverFlow:1', 'object') +bl.type('fxDTSBrick::onPrintCountUnderFlow:1', 'object') +bl.type('fxDTSBrick::onProjectileHit:1', 'object') +bl.type('fxDTSBrick::onReappear:1', 'object') +bl.type('fxDTSBrick::onRelay:1', 'object') +bl.type('fxDTSBrick::onRemove:1', 'object') +bl.type('fxDTSBrick::onRespawn:1', 'object') +bl.type('fxDTSBrick::onToolBreak:1', 'object') +bl.type('fxDTSBrick::PlantedTrustCheck:1', 'object') +bl.type('fxDTSBrick::playSound:1', 'object') +bl.type('fxDTSBrick::radiusImpulse:1', 'object') +bl.type('fxDTSBrick::reappear:1', 'object') +bl.type('fxDTSBrick::recoverVehicle:1', 'object') +bl.type('fxDTSBrick::Respawn:1', 'object') +bl.type('fxDTSBrick::respawnVehicle:1', 'object') +bl.type('fxDTSBrick::sendWrenchData:1', 'object') +bl.type('fxDTSBrick::sendWrenchSoundData:1', 'object') +bl.type('fxDTSBrick::sendWrenchVehicleSpawnData:1', 'object') +bl.type('fxDTSBrick::setEmitter:1', 'object') +bl.type('fxDTSBrick::setEmitterDirection:1', 'object') +bl.type('fxDTSBrick::setItem:1', 'object') +bl.type('fxDTSBrick::setItemDirection:1', 'object') +bl.type('fxDTSBrick::setItemPosition:1', 'object') +bl.type('fxDTSBrick::setItemRespawntime:1', 'object') +bl.type('fxDTSBrick::setLight:1', 'object') +bl.type('fxDTSBrick::setMusic:1', 'object') +bl.type('fxDTSBrick::setPrintCount:1', 'object') +bl.type('fxDTSBrick::setReColorVehicle:1', 'object') +bl.type('fxDTSBrick::setSound:1', 'object') +bl.type('fxDTSBrick::setVehicle:1', 'object') +bl.type('fxDTSBrick::setVehiclePowered:1', 'object') +bl.type('fxDTSBrick::spawnExplosion:1', 'object') +bl.type('fxDTSBrick::spawnItem:1', 'object') +bl.type('fxDTSBrick::spawnProjectile:1', 'object') +bl.type('fxDTSBrick::spawnVehicle:1', 'object') +bl.type('fxDTSBrick::TrustCheckFailed:1', 'object') +bl.type('fxDTSBrick::trustCheckFinished:1', 'object') +bl.type('fxDTSBrick::unColorVehicle:1', 'object') +bl.type('fxDTSBrick::undoTrustCheck:1', 'object') +bl.type('fxDTSBrick::vehicleMinigameEject:1', 'object') +bl.type('fxDTSBrickData::disappear:1', 'object') +bl.type('fxDTSBrickData::onAdd:1', 'object') +bl.type('fxDTSBrickData::onClearFakeDeath:1', 'object') +bl.type('fxDTSBrickData::onColorChange:1', 'object') +bl.type('fxDTSBrickData::onDeath:1', 'object') +bl.type('fxDTSBrickData::onFakeDeath:1', 'object') +bl.type('fxDTSBrickData::onLoadPlant:1', 'object') +bl.type('fxDTSBrickData::onPlant:1', 'object') +bl.type('fxDTSBrickData::onPlayerTouch:1', 'object') +bl.type('fxDTSBrickData::onRemove:1', 'object') +bl.type('fxDTSBrickData::onTrustCheckFailed:1', 'object') +bl.type('fxDTSBrickData::onTrustCheckFinished:1', 'object') +bl.type('fxDTSBrickData::onUse:1', 'object') +bl.type('fxDTSBrickData::reappear:1', 'object') +bl.type('fxLight::onRemove:1', 'object') +bl.type('GameConnection::applyBodyColors:1', 'object') +bl.type('GameConnection::applyBodyParts:1', 'object') +bl.type('GameConnection::bottomPrint:1', 'object') +bl.type('GameConnection::CenterPrint:1', 'object') +bl.type('GameConnection::ChatMessage:1', 'object') +bl.type('GameConnection::ClearEventObjects:1', 'object') +bl.type('GameConnection::ClearEventSchedules:1', 'object') +bl.type('GameConnection::ClearInvitePending:1', 'object') +bl.type('GameConnection::eventFloodCheck', 'boolean') +bl.type('GameConnection::eventFloodCheck:1', 'object') +bl.type('GameConnection::getBL_IDTrustLevel:1', 'object') +bl.type('GameConnection::InitializeTrustListUpload:1', 'object') +bl.type('GameConnection::playSound:1', 'object') +bl.type('GameConnection::StartInvitationTimeout:1', 'object') +bl.type('GameConnection::TransmitExtendedBrickInfo:1', 'object') +bl.type('GameConnection::validateAvatarPrefs:1', 'object') +bl.type('GameModeGuiServer::GetMissingAddOns:1', 'object') +bl.type('GameModeGuiServer::ParseGameModeFile', 'boolean') +bl.type('GameModeGuiServer::ParseGameModeFile:1', 'object') +bl.type('GameModeGuiServer::PopulateGameModeList:1', 'object') +bl.type('glowPaintProjectile::onCollision:1', 'object') +bl.type('hammerImage::onFire:1', 'object') +bl.type('hammerImage::onHitObject:1', 'object') +bl.type('hammerImage::onPreFire:1', 'object') +bl.type('hammerImage::onStopFire:1', 'object') +bl.type('isListenServer', 'boolean') +bl.type('isValidAddOn', 'boolean') +bl.type('isValidMap', 'boolean') +bl.type('isValidMusicFilename', 'boolean') +bl.type('Item::fadeIn:1', 'object') +bl.type('Item::fadeOut:1', 'object') +bl.type('Item::Respawn:1', 'object') +bl.type('Item::schedulePop:1', 'object') +bl.type('Item::setThrower:1', 'object') +bl.type('ItemData::create:1', 'object') +bl.type('ItemData::onAdd:1', 'object') +bl.type('ItemData::onCollision:1', 'object') +bl.type('ItemData::onPickup:1', 'object') +bl.type('ItemData::onThrow:1', 'object') +bl.type('ItemData::onUse:1', 'object') +bl.type('ItemImage::onMount:1', 'object') +bl.type('ItemImage::onUnMount:1', 'object') +bl.type('jelloPaintProjectile::onCollision:1', 'object') +bl.type('MiniGameSO::addMember:1', 'object') +bl.type('MiniGameSO::BottomPrintAll:1', 'object') +bl.type('MiniGameSO::CenterPrintAll:1', 'object') +bl.type('MiniGameSO::chatMessageAll:1', 'object') +bl.type('MiniGameSO::ChatMsgAll:1', 'object') +bl.type('MiniGameSO::checkLastManStanding:1', 'object') +bl.type('MiniGameSO::endGame:1', 'object') +bl.type('MiniGameSO::forceEquip:1', 'object') +bl.type('MiniGameSO::getLine:1', 'object') +bl.type('MiniGameSO::isMember', 'boolean') +bl.type('MiniGameSO::isMember:1', 'object') +bl.type('MiniGameSO::MessageAll:1', 'object') +bl.type('MiniGameSO::messageAllExcept:1', 'object') +bl.type('MiniGameSO::onAdd:1', 'object') +bl.type('MiniGameSO::pickSpawnPoint:1', 'object') +bl.type('MiniGameSO::removeMember:1', 'object') +bl.type('MiniGameSO::Report:1', 'object') +bl.type('MiniGameSO::Reset:1', 'object') +bl.type('MiniGameSO::RespawnAll:1', 'object') +bl.type('MiniGameSO::scheduleReset:1', 'object') +bl.type('MiniGameSO::setEnableBuilding:1', 'object') +bl.type('MiniGameSO::setEnablePainting:1', 'object') +bl.type('MiniGameSO::timeLimitTick:1', 'object') +bl.type('MiniGameSO::updateEnableBuilding:1', 'object') +bl.type('MiniGameSO::updateEnablePainting:1', 'object') +bl.type('MiniGameSO::updatePlayerDataBlock:1', 'object') +bl.type('MissionMarkerData::create:1', 'object') +bl.type('Observer::onTrigger:1', 'object') +bl.type('Observer::setMode:1', 'object') +bl.type('PainHighImage::onDone:1', 'object') +bl.type('PainLowImage::onDone:1', 'object') +bl.type('PainMidImage::onDone:1', 'object') +bl.type('paintProjectile::onCollision:1', 'object') +bl.type('ParticleEmitterNode::onRemove:1', 'object') +bl.type('pearlPaintProjectile::onCollision:1', 'object') +bl.type('Player::ActivateStuff:1', 'object') +bl.type('Player::AddHealth:1', 'object') +bl.type('Player::AddVelocity:1', 'object') +bl.type('Player::burn:1', 'object') +bl.type('Player::BurnPlayer:1', 'object') +bl.type('Player::ChangeDataBlock:1', 'object') +bl.type('Player::clearBurn:1', 'object') +bl.type('Player::ClearTempColor:1', 'object') +bl.type('Player::ClearTools:1', 'object') +bl.type('Player::Dismount:1', 'object') +bl.type('Player::emote:1', 'object') +bl.type('Player::GiveDefaultEquipment:1', 'object') +bl.type('Player::InstantRespawn:1', 'object') +bl.type('Player::isPilot', 'boolean') +bl.type('Player::isPilot:1', 'object') +bl.type('Player::kill:1', 'object') +bl.type('Player::lavaDamage:1', 'object') +bl.type('Player::mountVehicles:1', 'object') +bl.type('Player::onDriverLeave:1', 'object') +bl.type('Player::playCelAnimation:1', 'object') +bl.type('Player::playDeathAnimation:1', 'object') +bl.type('Player::playDeathCry:1', 'object') +bl.type('Player::playPain:1', 'object') +bl.type('Player::RemoveBody:1', 'object') +bl.type('Player::SetHealth:1', 'object') +bl.type('Player::SetPlayerScale:1', 'object') +bl.type('Player::setTempColor:1', 'object') +bl.type('Player::spawnExplosion:1', 'object') +bl.type('Player::spawnProjectile:1', 'object') +bl.type('Player::teleportEffect:1', 'object') +bl.type('Player::updateArm:1', 'object') +bl.type('PlayerData::onDriverLeave:1', 'object') +bl.type('PlayerTeleportImage::onDone:1', 'object') +bl.type('PrintGunImage::onFire:1', 'object') +bl.type('PrintGunImage::onHitObject:1', 'object') +bl.type('Projectile::Bounce:1', 'object') +bl.type('Projectile::onAdd:1', 'object') +bl.type('Projectile::Redirect:1', 'object') +bl.type('ProjectileData::Damage:1', 'object') +bl.type('ProjectileData::impactImpulse:1', 'object') +bl.type('ProjectileData::onCollision:1', 'object') +bl.type('ProjectileData::onExplode:1', 'object') +bl.type('ProjectileData::radiusDamage:1', 'object') +bl.type('ProjectileData::radiusImpulse:1', 'object') +bl.type('QueueSO::dumpVals:1', 'object') +bl.type('QueueSO::pop:1', 'object') +bl.type('QueueSO::push:1', 'object') +bl.type('rainbowPaintProjectile::onCollision:1', 'object') +bl.type('serverCmdAcceptMiniGameInvite:1', 'object') +bl.type('serverCmdAcceptTrustInvite:1', 'object') +bl.type('serverCmdActivateStuff:1', 'object') +bl.type('serverCmdAddEvent:1', 'object') +bl.type('serverCmdBan:1', 'object') +bl.type('serverCmdBrickCount:1', 'object') +bl.type('serverCmdBSD:1', 'object') +bl.type('serverCmdBuyBrick:1', 'object') +bl.type('serverCmdCancelAllEvents:1', 'object') +bl.type('ServerCmdCancelBrick:1', 'object') +bl.type('serverCmdCancelEvents:1', 'object') +bl.type('ServerCmdCancelExtendedBrickInfoRequest:1', 'object') +bl.type('serverCmdCancelSaveFileUpload:1', 'object') +bl.type('serverCmdClearAllBricks:1', 'object') +bl.type('ServerCmdClearBots:1', 'object') +bl.type('serverCmdClearBrickGroup:1', 'object') +bl.type('serverCmdClearBricks:1', 'object') +bl.type('serverCmdClearColors:1', 'object') +bl.type('serverCmdClearEvents:1', 'object') +bl.type('serverCmdClearFarAwayBricks:1', 'object') +bl.type('serverCmdClearFloatingBricks:1', 'object') +bl.type('serverCmdClearInventory:1', 'object') +bl.type('serverCmdClearPreviewCenter:1', 'object') +bl.type('serverCmdClearSpamBricks:1', 'object') +bl.type('ServerCmdClearVehicles:1', 'object') +bl.type('serverCmdColorTest:1', 'object') +bl.type('serverCmdCreateMiniGame:1', 'object') +bl.type('serverCmdCustomGameGui_ListUploadDone:1', 'object') +bl.type('serverCmdCustomGameGui_RequestList:1', 'object') +bl.type('serverCmdCustomGameGui_SetAddOnEnabled:1', 'object') +bl.type('serverCmdCustomGameGui_SetMusicEnabled:1', 'object') +bl.type('serverCmdCustomGameGui_SetPref:1', 'object') +bl.type('serverCmdDFG:1', 'object') +bl.type('serverCmdDoAllIcons:1', 'object') +bl.type('serverCmdDoIcon:1', 'object') +bl.type('serverCmdDoItemIcon:1', 'object') +bl.type('serverCmdDoPackIcons:1', 'object') +bl.type('serverCmdDoPlayerIcons:1', 'object') +bl.type('serverCmdDoSecondPackIcons:1', 'object') +bl.type('serverCmdDPB:1', 'object') +bl.type('serverCmdDropCameraAtPlayer:1', 'object') +bl.type('serverCmdDropPlayerAtCamera:1', 'object') +bl.type('ServerCmdDropTool:1', 'object') +bl.type('serverCmdEndMiniGame:1', 'object') +bl.type('serverCmdEndSaveFileUpload:1', 'object') +bl.type('serverCmdEnvGui_ClickDefaults:1', 'object') +bl.type('serverCmdEnvGui_RequestCurrent:1', 'object') +bl.type('serverCmdEnvGui_RequestCurrentVars:1', 'object') +bl.type('serverCmdEnvGui_RequestLists:1', 'object') +bl.type('serverCmdEnvGui_SetVar:1', 'object') +bl.type('serverCmdFetch:1', 'object') +bl.type('serverCmdFind:1', 'object') +bl.type('serverCmdGameModeGuiServer_ChangeGameMode:1', 'object') +bl.type('serverCmdGameModeGuiServer_RequestList:1', 'object') +bl.type('serverCmdGetID:1', 'object') +bl.type('serverCmdGetPZ:1', 'object') +bl.type('serverCmdGetTransform:1', 'object') +bl.type('serverCmdGreenLight:1', 'object') +bl.type('ServerCmdHilightBrickGroup:1', 'object') +bl.type('serverCmdHug:1', 'object') +bl.type('serverCmdIconInit:1', 'object') +bl.type('serverCmdIgnoreMiniGameInvite:1', 'object') +bl.type('serverCmdIgnoreTrustInvite:1', 'object') +bl.type('serverCmdInitUploadHandshake:1', 'object') +bl.type('serverCmdInstantUseBrick:1', 'object') +bl.type('serverCmdInviteToMiniGame:1', 'object') +bl.type('serverCmdJoinMiniGame:1', 'object') +bl.type('serverCmdKick:1', 'object') +bl.type('serverCmdLeaveMiniGame:1', 'object') +bl.type('serverCmdLight:1', 'object') +bl.type('ServerCmdListAllDataBlocks:1', 'object') +bl.type('serverCmdMagicWand:1', 'object') +bl.type('serverCmdNextSeat:1', 'object') +bl.type('ServerCmdPlantBrick:1', 'object') +bl.type('serverCmdPrevSeat:1', 'object') +bl.type('serverCmdRayPZ:1', 'object') +bl.type('serverCmdRealBrickCount:1', 'object') +bl.type('serverCmdRejectMiniGameInvite:1', 'object') +bl.type('serverCmdRejectTrustInvite:1', 'object') +bl.type('serverCmdReloadBricks:1', 'object') +bl.type('serverCmdRemoveFromMiniGame:1', 'object') +bl.type('serverCmdRequestBanList:1', 'object') +bl.type('ServerCmdRequestBrickManList:1', 'object') +bl.type('serverCmdRequestEventTables:1', 'object') +bl.type('ServerCmdRequestExtendedBrickInfo:1', 'object') +bl.type('serverCmdRequestMiniGameColorList:1', 'object') +bl.type('serverCmdRequestMiniGameList:1', 'object') +bl.type('ServerCmdRequestNamedTargets:1', 'object') +bl.type('ServerCmdRequestWrenchEvents:1', 'object') +bl.type('serverCmdResetMiniGame:1', 'object') +bl.type('ServerCmdResetVehicles:1', 'object') +bl.type('serverCmdRet:1', 'object') +bl.type('ServerCmdRotateBrick:1', 'object') +bl.type('serverCmdServerSettingsGui_ApplyVariables:1', 'object') +bl.type('serverCmdServerSettingsGui_RequestVariables:1', 'object') +bl.type('serverCmdServerSettingsGui_SetVariable:1', 'object') +bl.type('serverCmdSetColorMethod:1', 'object') +bl.type('ServerCmdSetFocalPoint:1', 'object') +bl.type('serverCmdSetHatTicket:1', 'object') +bl.type('ServerCmdSetMiniGameData:1', 'object') +bl.type('serverCmdSetPreviewCenter:1', 'object') +bl.type('serverCmdSetPrint:1', 'object') +bl.type('serverCmdSetSaveUploadDirName:1', 'object') +bl.type('serverCmdSetWrenchData:1', 'object') +bl.type('ServerCmdShiftBrick:1', 'object') +bl.type('serverCmdSit:1', 'object') +bl.type('serverCmdSpy:1', 'object') +bl.type('serverCmdStartSaveFileUpload:1', 'object') +bl.type('serverCmdStartTalking:1', 'object') +bl.type('serverCmdStopTalking:1', 'object') +bl.type('serverCmdSuicide:1', 'object') +bl.type('ServerCmdSuperShiftBrick:1', 'object') +bl.type('serverCmdTimeScale:1', 'object') +bl.type('serverCmdTripOut:1', 'object') +bl.type('serverCmdTrustListUpload_Done:1', 'object') +bl.type('serverCmdTrustListUpload_Line:1', 'object') +bl.type('serverCmdTrust_Demote:1', 'object') +bl.type('serverCmdTrust_Invite:1', 'object') +bl.type('serverCmdUnBan:1', 'object') +bl.type('ServerCmdUndoBrick:1', 'object') +bl.type('serverCmdUnIgnore:1', 'object') +bl.type('ServerCmdUnUseTool:1', 'object') +bl.type('servercmdupdatebodycolors:1', 'object') +bl.type('servercmdupdatebodyparts:1', 'object') +bl.type('serverCmdUploadSaveFileLine:1', 'object') +bl.type('serverCmdUseFXCan:1', 'object') +bl.type('serverCmdUseHammer:1', 'object') +bl.type('ServerCmdUseInventory:1', 'object') +bl.type('serverCmdUseSprayCan:1', 'object') +bl.type('ServerCmdUseTool:1', 'object') +bl.type('serverCmdVehicleSpawn_Respawn:1', 'object') +bl.type('serverCmdWand:1', 'object') +bl.type('serverCmdWarp:1', 'object') +bl.type('serverCmdZombie:1', 'object') +bl.type('setSprayCanColors', 'boolean') +bl.type('ShapeBase::clearInventory:1', 'object') +bl.type('ShapeBase::Damage:1', 'object') +bl.type('ShapeBase::decInventory:1', 'object') +bl.type('ShapeBase::getInventory:1', 'object') +bl.type('ShapeBase::incInventory:1', 'object') +bl.type('ShapeBase::maxInventory:1', 'object') +bl.type('ShapeBase::onInventory:1', 'object') +bl.type('ShapeBase::pickup:1', 'object') +bl.type('ShapeBase::setInventory:1', 'object') +bl.type('ShapeBase::throw', 'boolean') +bl.type('ShapeBase::throw:1', 'object') +bl.type('ShapeBase::throwObject:1', 'object') +bl.type('ShapeBase::use:1', 'object') +bl.type('ShapeBaseData::Damage:1', 'object') +bl.type('ShapeBaseData::onInventory:1', 'object') +bl.type('ShapeBaseData::onPickup', 'boolean') +bl.type('ShapeBaseData::onPickup:1', 'object') +bl.type('ShapeBaseData::onThrow', 'boolean') +bl.type('ShapeBaseData::onThrow:1', 'object') +bl.type('ShapeBaseData::onUse', 'boolean') +bl.type('ShapeBaseData::onUse:1', 'object') +bl.type('SimGroup::addNTName:1', 'object') +bl.type('SimGroup::addPotentialTrust:1', 'object') +bl.type('SimGroup::addSpawnBrick:1', 'object') +bl.type('SimGroup::chainBlink:1', 'object') +bl.type('SimGroup::ChainDeleteAll:1', 'object') +bl.type('SimGroup::ClearAllNTNames:1', 'object') +bl.type('SimGroup::DumpNTNames:1', 'object') +bl.type('SimGroup::dumpSpawnPoints:1', 'object') +bl.type('SimGroup::getBrickSpawnPoint:1', 'object') +bl.type('SimGroup::getClient:1', 'object') +bl.type('SimGroup::hasUser', 'boolean') +bl.type('SimGroup::hasUser:1', 'object') +bl.type('SimGroup::removeNTName:1', 'object') +bl.type('SimGroup::removeSpawnBrick:1', 'object') +bl.type('SimObject::addScheduledEvent:1', 'object') +bl.type('SimObject::cancelEvents:1', 'object') +bl.type('SimObject::clearEvents:1', 'object') +bl.type('SimObject::clearNTObjectName:1', 'object') +bl.type('SimObject::dumpEvents:1', 'object') +bl.type('SimObject::onCameraEnterOrbit:1', 'object') +bl.type('SimObject::onCameraLeaveOrbit:1', 'object') +bl.type('SimObject::processInputEvent:1', 'object') +bl.type('SimObject::serializeEvent:1', 'object') +bl.type('SimObject::serializeEventToString:1', 'object') +bl.type('SimObject::SetEventEnabled:1', 'object') +bl.type('SimObject::setNTObjectName:1', 'object') +bl.type('SimObject::ToggleEventEnabled:1', 'object') +bl.type('stablePaintProjectile::onCollision:1', 'object') +bl.type('StaticShape::explode:1', 'object') +bl.type('StaticShapeData::create:1', 'object') +bl.type('StaticShapeData::Damage:1', 'object') +bl.type('StaticShapeData::onAdd:1', 'object') +bl.type('swirlPaintProjectile::onCollision:1', 'object') +bl.type('Trigger::onAdd:1', 'object') +bl.type('TriggerData::onAdd:1', 'object') +bl.type('TriggerData::onEnterTrigger:1', 'object') +bl.type('TriggerData::onLeaveTrigger:1', 'object') +bl.type('TriggerData::onTickTrigger:1', 'object') +bl.type('validateEnvironmentObjects', 'boolean') +bl.type('Vehicle::finalExplosion:1', 'object') +bl.type('Vehicle::lavaDamage:1', 'object') +bl.type('Vehicle::onActivate:1', 'object') +bl.type('Vehicle::onCollision:1', 'object') +bl.type('Vehicle::onDriverLeave:1', 'object') +bl.type('Vehicle::onRemove:1', 'object') +bl.type('Vehicle::teleportEffect:1', 'object') +bl.type('VehicleData::onCollision:1', 'object') +bl.type('VehicleData::onDriverLeave:1', 'object') +bl.type('VehicleData::onEnterLiquid:1', 'object') +bl.type('VehicleData::onLeaveLiquid:1', 'object') +bl.type('VehicleSpawnMarker::onAdd:1', 'object') +bl.type('VehicleSpawnMarker::onRemove:1', 'object') +bl.type('VerifyAddOnScripts', 'boolean') +bl.type('WandImage::onFire:1', 'object') +bl.type('WandImage::onHitObject:1', 'object') +bl.type('WandImage::onPreFire:1', 'object') +bl.type('WandImage::onStopFire:1', 'object') +bl.type('WandItem::onUse:1', 'object') +bl.type('Weapon::onInventory:1', 'object') +bl.type('Weapon::onPickup:1', 'object') +bl.type('Weapon::onUse:1', 'object') +bl.type('WeaponImage::onFire:1', 'object') +bl.type('WeaponImage::onMount:1', 'object') +bl.type('WeaponImage::onUnMount:1', 'object') +bl.type('WheeledVehicleData::create:1', 'object') +bl.type('WheeledVehicleData::Damage:1', 'object') +bl.type('WheeledVehicleData::onAdd:1', 'object') +bl.type('WheeledVehicleData::onCollision:1', 'object') +bl.type('WheeledVehicleData::onDamage:1', 'object') +bl.type('WheeledVehicleData::onDriverLeave:1', 'object') +bl.type('WrenchImage::onFire:1', 'object') +bl.type('WrenchImage::onHitObject:1', 'object') +bl.type('WrenchImage::onPreFire:1', 'object') +bl.type('WrenchImage::onStopFire:1', 'object') +bl.type('GameConnection::Cheat:1', 'object') +bl.type('GameConnection::createPlayer:1', 'object') +bl.type('GameConnection::getSimpleName:1', 'object') +bl.type('GameConnection::getSpawnPoint:1', 'object') +bl.type('GameConnection::InstantRespawn:1', 'object') +bl.type('GameConnection::onClientEnterGame:1', 'object') +bl.type('GameConnection::onClientLeaveGame:1', 'object') +bl.type('GameConnection::onDeath:1', 'object') +bl.type('GameConnection::onEnterMissionArea:1', 'object') +bl.type('GameConnection::onInfiniteLag:1', 'object') +bl.type('GameConnection::onLeaveMissionArea:1', 'object') +bl.type('GameConnection::resetVehicles:1', 'object') +bl.type('GameConnection::sendTrustFailureMessage:1', 'object') +bl.type('GameConnection::setCanRespawn:1', 'object') +bl.type('GameConnection::setLoadingIndicator:1', 'object') +bl.type('GameConnection::spawnPlayer:1', 'object') +bl.type('GameConnection::transmitMaxPlayers:1', 'object') +bl.type('GameConnection::transmitServerName:1', 'object') +bl.type('SimGroup::getTrustFailureMessage:1', 'object') +bl.type('AIConnection::onConnect:1', 'object') +bl.type('authTCPobj_Server::onConnected:1', 'object') +bl.type('authTCPobj_Server::onConnectFailed:1', 'object') +bl.type('authTCPobj_Server::onDisconnect:1', 'object') +bl.type('authTCPobj_Server::onDNSFailed:1', 'object') +bl.type('authTCPobj_Server::onLine:1', 'object') +bl.type('chatFilter', 'boolean') +bl.type('GameConnection::authCheck:1', 'object') +bl.type('GameConnection::autoAdminCheck:1', 'object') +bl.type('GameConnection::clientWantsGhostAlwaysRetry:1', 'object') +bl.type('GameConnection::endMission:1', 'object') +bl.type('GameConnection::incScore:1', 'object') +bl.type('GameConnection::killDupes:1', 'object') +bl.type('GameConnection::loadMission:1', 'object') +bl.type('GameConnection::onClientEnterGame:1', 'object') +bl.type('GameConnection::onClientLeaveGame:1', 'object') +bl.type('GameConnection::onConnect:1', 'object') +bl.type('GameConnection::onConnectRequest:1', 'object') +bl.type('GameConnection::onDataBlocksDone:1', 'object') +bl.type('GameConnection::onDrop:1', 'object') +bl.type('GameConnection::onGhostAlwaysFailed:1', 'object') +bl.type('GameConnection::onGhostAlwaysObjectsReceived:1', 'object') +bl.type('GameConnection::sendPlayerListUpdate:1', 'object') +bl.type('GameConnection::setScore:1', 'object') +bl.type('GameConnection::spamMessageTimeout:1', 'object') +bl.type('GameConnection::spamReset:1', 'object') +bl.type('GameConnection::startLoad:1', 'object') +bl.type('GameConnection::startMission:1', 'object') +bl.type('GameConnection::syncClock:1', 'object') +bl.type('isNameUnique', 'boolean') +bl.type('postServerTCPObj::onConnected:1', 'object') +bl.type('postServerTCPObj::onConnectFailed:1', 'object') +bl.type('postServerTCPObj::onDisconnect:1', 'object') +bl.type('postServerTCPObj::onDNSFailed:1', 'object') +bl.type('postServerTCPObj::onLine:1', 'object') +bl.type('servAuthTCPobj::onConnected:1', 'object') +bl.type('servAuthTCPobj::onConnectFailed:1', 'object') +bl.type('servAuthTCPobj::onDNSFailed:1', 'object') +bl.type('servAuthTCPobj::onLine:1', 'object') +bl.type('serverCmdBlobDownloadFinished:1', 'object') +bl.type('serverCmdClosePlayerList:1', 'object') +bl.type('serverCmdMessageSent:1', 'object') +bl.type('serverCmdMissionStartPhase1Ack:1', 'object') +bl.type('serverCmdMissionStartPhase2Ack:1', 'object') +bl.type('serverCmdMissionStartPhase3Ack:1', 'object') +bl.type('serverCmdOpenPlayerList:1', 'object') +bl.type('serverCmdSAD:1', 'object') +bl.type('serverCmdSADSetPassword:1', 'object') +bl.type('serverCmdTeamMessageSent:1', 'object') +bl.type('spamAlert', 'boolean') + +-- Auto-generated from dumpConsoleClasses() and dumpConsoleFunctions() +bl.type('AIConnection::onConnect:1', 'object') +bl.type('AIPlayer.canSetIFLs', 'bool') +bl.type('AIPlayer::InstantRespawn:1', 'object') +bl.type('AIPlayer::clearAim:1', 'object') +bl.type('AIPlayer::clearMoveDestination:1', 'object') +bl.type('AIPlayer::clearMoveX:1', 'object') +bl.type('AIPlayer::clearMoveY:1', 'object') +bl.type('AIPlayer::clearMoveYaw:1', 'object') +bl.type('AIPlayer::getAimLocation:1', 'object') +bl.type('AIPlayer::getAimObject', 'object') +bl.type('AIPlayer::getAimObject:1', 'object') +bl.type('AIPlayer::getAimVector:1', 'object') +bl.type('AIPlayer::getMoveDestination:1', 'object') +bl.type('AIPlayer::getMoveObject', 'object') +bl.type('AIPlayer::getMoveObject:1', 'object') +bl.type('AIPlayer::getMoveTolerance:1', 'object') +bl.type('AIPlayer::getPlayerName:1', 'object') +bl.type('AIPlayer::hMeleeAttack:1', 'object') +bl.type('AIPlayer::isCrouching', 'bool') +bl.type('AIPlayer::isCrouching:1', 'object') +bl.type('AIPlayer::isJetting', 'bool') +bl.type('AIPlayer::isJetting:1', 'object') +bl.type('AIPlayer::isJumping', 'bool') +bl.type('AIPlayer::isJumping:1', 'object') +bl.type('AIPlayer::setAimLocation:1', 'object') +bl.type('AIPlayer::setAimObject:1', 'object') +bl.type('AIPlayer::setAimObject:2', 'object') +bl.type('AIPlayer::setAimVector:1', 'object') +bl.type('AIPlayer::setCrouching:1', 'object') +bl.type('AIPlayer::setCrouching:2', 'bool') +bl.type('AIPlayer::setEngageDistance:1', 'object') +bl.type('AIPlayer::setHeadAngle:1', 'object') +bl.type('AIPlayer::setHeadAngleSpeed:1', 'object') +bl.type('AIPlayer::setJetting:1', 'object') +bl.type('AIPlayer::setJetting:2', 'bool') +bl.type('AIPlayer::setJumping:1', 'object') +bl.type('AIPlayer::setJumping:2', 'bool') +bl.type('AIPlayer::setMoveDestination:1', 'object') +bl.type('AIPlayer::setMoveObject:1', 'object') +bl.type('AIPlayer::setMoveObject:2', 'object') +bl.type('AIPlayer::setMoveSlowdown:1', 'object') +bl.type('AIPlayer::setMoveSlowdown:2', 'bool') +bl.type('AIPlayer::setMoveSpeed:1', 'object') +bl.type('AIPlayer::setMoveTolerance:1', 'object') +bl.type('AIPlayer::setMoveX:1', 'object') +bl.type('AIPlayer::setMoveY:1', 'object') +bl.type('AIPlayer::setMoveYaw:1', 'object') +bl.type('AIPlayer::stop:1', 'object') +bl.type('ActionMap::bind:1', 'object') +bl.type('ActionMap::bindCmd:1', 'object') +bl.type('ActionMap::blockBind:1', 'object') +bl.type('ActionMap::copyBind:1', 'object') +bl.type('ActionMap::getBinding:1', 'object') +bl.type('ActionMap::getCommand:1', 'object') +bl.type('ActionMap::getDeadZone:1', 'object') +bl.type('ActionMap::getNumBinds:1', 'object') +bl.type('ActionMap::getScale:1', 'object') +bl.type('ActionMap::isInverted', 'bool') +bl.type('ActionMap::isInverted:1', 'object') +bl.type('ActionMap::pop:1', 'object') +bl.type('ActionMap::popUnbind:1', 'object') +bl.type('ActionMap::push:1', 'object') +bl.type('ActionMap::pushBind:1', 'object') +bl.type('ActionMap::save:1', 'object') +bl.type('ActionMap::unbind:1', 'object') +bl.type('AdminLoginGui::onSleep:1', 'object') +bl.type('AdminLoginGui::onWake:1', 'object') +bl.type('AdminWandImage::onFire:1', 'object') +bl.type('AdminWandImage::onHitObject:1', 'object') +bl.type('AdminWandImage::onPreFire:1', 'object') +bl.type('AdminWandImage::onStopFire:1', 'object') +bl.type('AkimboGunImage::onFire:1', 'object') +bl.type('AkimboGunImage::onFireAkimbo:1', 'object') +bl.type('AkimboGunImage::onMount:1', 'object') +bl.type('AkimboGunImage::onUnMount:1', 'object') +bl.type('AllPrintRatios_List::onSelect:1', 'object') +bl.type('Armor::onCollision:1', 'object') +bl.type('AudioDescription.is3D', 'bool') +bl.type('AudioDescription.isLooping', 'bool') +bl.type('AudioDescription.isStreaming', 'bool') +bl.type('AudioEmitter.enableVisualFeedback', 'bool') +bl.type('AudioEmitter.is3D', 'bool') +bl.type('AudioEmitter.isLooping', 'bool') +bl.type('AudioEmitter.outsideAmbient', 'bool') +bl.type('AudioEmitter.useProfileDescription', 'bool') +bl.type('AudioEmitter::getProfileId:1', 'object') +bl.type('AudioEmitter::update:1', 'object') +bl.type('AudioEnvironment.useRoom', 'bool') +bl.type('AudioProfile.preload', 'bool') +bl.type('AudioProfile::getDescription:1', 'object') +bl.type('AudioProfile::isStereo', 'bool') +bl.type('AudioProfile::isStereo:1', 'object') +bl.type('AvatarGui::onWake:1', 'object') +bl.type('BSD_TabBoxShifter::checkButtonVisibility:1', 'object') +bl.type('BSD_TabBoxShifter::checkTabVisibility:1', 'object') +bl.type('BSD_TabBoxShifter::shiftTabsLeft:1', 'object') +bl.type('BSD_TabBoxShifter::shiftTabsRight:1', 'object') +bl.type('BSD_category::onRemove:1', 'object') +bl.type('BanList::add:1', 'object') +bl.type('BanList::addAbsolute:1', 'object') +bl.type('BanList::export:1', 'object') +bl.type('BanList::isBanned', 'bool') +bl.type('BanList::isBanned:1', 'object') +bl.type('BanList::removeBan:1', 'object') +bl.type('BanManagerSO::RemoveBanBL_ID:1', 'object') +bl.type('BanManagerSO::addBan:1', 'object') +bl.type('BanManagerSO::dumpBans:1', 'object') +bl.type('BanManagerSO::isBanned:1', 'object') +bl.type('BanManagerSO::loadBans:1', 'object') +bl.type('BanManagerSO::removeBan:1', 'object') +bl.type('BanManagerSO::saveBans:1', 'object') +bl.type('BanManagerSO::sendBanList:1', 'object') +bl.type('BlockheadHoleBot::onAdd:1', 'object') +bl.type('BlockheadHoleBot::onBotCollision:1', 'object') +bl.type('BlockheadHoleBot::onBotDamage:1', 'object') +bl.type('BlockheadHoleBot::onBotFollow:1', 'object') +bl.type('BlockheadHoleBot::onBotLoop:1', 'object') +bl.type('BottomPrintText::onResize:1', 'object') +bl.type('BrickManGui::clearAllBricks:1', 'object') +bl.type('BrickManGui::clearBrickGroup:1', 'object') +bl.type('BrickManGui::clickBan:1', 'object') +bl.type('BrickManGui::clickClear:1', 'object') +bl.type('BrickManGui::clickClearAll:1', 'object') +bl.type('BrickManGui::clickHilight:1', 'object') +bl.type('BrickManGui::onSleep:1', 'object') +bl.type('BrickManGui::onWake:1', 'object') +bl.type('BrickManGui::sortList:1', 'object') +bl.type('BrickManGui::sortNumList:1', 'object') +bl.type('BrickSelectorDlg::onSleep:1', 'object') +bl.type('BrickSelectorDlg::onWake:1', 'object') +bl.type('BrickSharkBot_HoleSpawnData::onPlant:1', 'object') +bl.type('BuildMacroSO::PlayBack:1', 'object') +bl.type('BuildMacroSO::PlayEvent:1', 'object') +bl.type('BuildMacroSO::compress:1', 'object') +bl.type('BuildMacroSO::deleteEvent:1', 'object') +bl.type('BuildMacroSO::dump:1', 'object') +bl.type('BuildMacroSO::pushEvent:1', 'object') +bl.type('CSVReader::hasNextValue:1', 'object') +bl.type('CSVReader::readNextValue:1', 'object') +bl.type('CSVReader::setDataString:1', 'object') +bl.type('Camera.canSetIFLs', 'bool') +bl.type('Camera::getCameraRelativeMovement', 'bool') +bl.type('Camera::getCameraRelativeMovement:1', 'object') +bl.type('Camera::getControlObject', 'object') +bl.type('Camera::getControlObject:1', 'object') +bl.type('Camera::getOrbitDistance:1', 'object') +bl.type('Camera::getOrbitObject', 'object') +bl.type('Camera::getOrbitObject:1', 'object') +bl.type('Camera::getOrbitPoint:1', 'object') +bl.type('Camera::getPosition:1', 'object') +bl.type('Camera::isOrbitMode', 'bool') +bl.type('Camera::isOrbitMode:1', 'object') +bl.type('Camera::onAdd:1', 'object') +bl.type('Camera::setCameraRelativeMovement:1', 'object') +bl.type('Camera::setCameraRelativeMovement:2', 'bool') +bl.type('Camera::setClampMode:1', 'object') +bl.type('Camera::setControlObject', 'bool') +bl.type('Camera::setControlObject:1', 'object') +bl.type('Camera::setControlObject:2', 'object') +bl.type('Camera::setDollyMode:1', 'object') +bl.type('Camera::setFlyMode:1', 'object') +bl.type('Camera::setMode:1', 'object') +bl.type('Camera::setOrbitMode:1', 'object') +bl.type('Camera::setOrbitMode:2', 'object') +bl.type('Camera::setOrbitMode:7', 'bool') +bl.type('Camera::setOrbitPointMode:1', 'object') +bl.type('CameraData.emap', 'bool') +bl.type('CameraData.firstPersonOnly', 'bool') +bl.type('CameraData.inheritEnergyFromMount', 'bool') +bl.type('CameraData.isInvincible', 'bool') +bl.type('CameraData.observeThroughObject', 'bool') +bl.type('CameraData.renderWhenDestroyed', 'bool') +bl.type('CameraData.thirdPersonOnly', 'bool') +bl.type('CameraData.useEyePoint', 'bool') +bl.type('CannonFuseImage::onDone:1', 'object') +bl.type('CannonSmokeImage::onDone:1', 'object') +bl.type('CannonTurret::onDisabled:1', 'object') +bl.type('Canvas::popDialog:1', 'object') +bl.type('Canvas::pushDialog:1', 'object') +bl.type('CenterPrintText::onResize:1', 'object') +bl.type('ClientBrickSearchNext', 'object') +bl.type('ColorSetGui::AddColor:1', 'object') +bl.type('ColorSetGui::Display:1', 'object') +bl.type('ColorSetGui::defaults:1', 'object') +bl.type('ColorSetGui::deleteColor:1', 'object') +bl.type('ColorSetGui::load:1', 'object') +bl.type('ColorSetGui::onSleep:1', 'object') +bl.type('ColorSetGui::onWake:1', 'object') +bl.type('ColorSetGui::save:1', 'object') +bl.type('ColorSetGui::selectColor:1', 'object') +bl.type('ColorSetGui::setMode:1', 'object') +bl.type('ColorSetGui::update:1', 'object') +bl.type('ConsoleEntry::eval:1', 'object') +bl.type('ConsoleLogger::attach', 'bool') +bl.type('ConsoleLogger::attach:1', 'object') +bl.type('ConsoleLogger::detach', 'bool') +bl.type('ConsoleLogger::detach:1', 'object') +bl.type('CreateMiniGameGui::ClickCreate:1', 'object') +bl.type('CreateMiniGameGui::ClickFav:1', 'object') +bl.type('CreateMiniGameGui::LoadDataBlocks:1', 'object') +bl.type('CreateMiniGameGui::Refresh:1', 'object') +bl.type('CreateMiniGameGui::clickColorList:1', 'object') +bl.type('CreateMiniGameGui::clickEnd:1', 'object') +bl.type('CreateMiniGameGui::clickReset:1', 'object') +bl.type('CreateMiniGameGui::clickSetFavs:1', 'object') +bl.type('CreateMiniGameGui::dumpColorList:1', 'object') +bl.type('CreateMiniGameGui::end:1', 'object') +bl.type('CreateMiniGameGui::onSleep:1', 'object') +bl.type('CreateMiniGameGui::onWake:1', 'object') +bl.type('CreateMiniGameGui::send:1', 'object') +bl.type('CreatorTree.clipToParent', 'bool') +bl.type('CreatorTree.enabled', 'bool') +bl.type('CreatorTree.visible', 'bool') +bl.type('CreatorTree::addGroup:1', 'object') +bl.type('CreatorTree::addItem:1', 'object') +bl.type('CreatorTree::clear:1', 'object') +bl.type('CreatorTree::fileNameMatch', 'bool') +bl.type('CreatorTree::fileNameMatch:1', 'object') +bl.type('CreatorTree::getName:1', 'object') +bl.type('CreatorTree::getParent:1', 'object') +bl.type('CreatorTree::getSelected:1', 'object') +bl.type('CreatorTree::getValue:1', 'object') +bl.type('CreatorTree::isGroup', 'bool') +bl.type('CreatorTree::isGroup:1', 'object') +bl.type('CustomGameGui::AddAdvancedGuiElement:1', 'object') +bl.type('CustomGameGui::ClickBack:1', 'object') +bl.type('CustomGameGui::ClickSelect:1', 'object') +bl.type('CustomGameGui::CopyGuiVarsToPrefs:1', 'object') +bl.type('CustomGameGui::CopyPrefsToGuiVars:1', 'object') +bl.type('CustomGameGui::CreateAddOnListGui:1', 'object') +bl.type('CustomGameGui::CreateAdvancedGui:1', 'object') +bl.type('CustomGameGui::CreateMusicListGui:1', 'object') +bl.type('CustomGameGui::ScaleText:1', 'object') +bl.type('CustomGameGui::clickAddOnItem:1', 'object') +bl.type('CustomGameGui::clickAddOns:1', 'object') +bl.type('CustomGameGui::clickAdvanced:1', 'object') +bl.type('CustomGameGui::clickAdvancedItem:1', 'object') +bl.type('CustomGameGui::clickAll:1', 'object') +bl.type('CustomGameGui::clickDefault:1', 'object') +bl.type('CustomGameGui::clickMusic:1', 'object') +bl.type('CustomGameGui::clickMusicItem:1', 'object') +bl.type('CustomGameGui::clickNone:1', 'object') +bl.type('CustomGameGui::hideAllTabs:1', 'object') +bl.type('CustomGameGui::onRender:1', 'object') +bl.type('CustomGameGui::onWake:1', 'object') +bl.type('CustomGameGui::populateAddOnList:1', 'object') +bl.type('CustomGameGui::populateMusicList:1', 'object') +bl.type('CustomGameGui::setDefaultAddOns:1', 'object') +bl.type('CustomGameGui::setDefaultMusic:1', 'object') +bl.type('CustomGameGuiServer::populateAddOnList:1', 'object') +bl.type('CustomGameGuiServer::populateMusicList:1', 'object') +bl.type('DDS_BackgroundCtrl::onMouseDown:1', 'object') +bl.type('DDS_PopUpInputCtrl::onTabComplete:1', 'object') +bl.type('DDS_PopUpListCtrl::makeSelectedVisible:1', 'object') +bl.type('DDS_PopUpListCtrl::selectLineNoCallback:1', 'object') +bl.type('DDS_PopUpMenuCtrl::addLineBack:1', 'object') +bl.type('DDS_PopUpMenuCtrl::addLineFront:1', 'object') +bl.type('DDS_PopUpMenuCtrl::calcListWidth:1', 'object') +bl.type('DDS_PopUpMenuCtrl::clearLines:1', 'object') +bl.type('DDS_PopUpMenuCtrl::closeMenu:1', 'object') +bl.type('DDS_PopUpMenuCtrl::moveSelection:1', 'object') +bl.type('DDS_PopUpMenuCtrl::onLineSelected:1', 'object') +bl.type('DDS_PopUpMenuCtrl::onMouseDown:1', 'object') +bl.type('DDS_PopUpMenuCtrl::openMenu:1', 'object') +bl.type('DDS_PopUpMenuCtrl::repeatMove:1', 'object') +bl.type('DDS_PopUpMenuCtrl::startMoveDown:1', 'object') +bl.type('DDS_PopUpMenuCtrl::startMoveUp:1', 'object') +bl.type('DDS_PopUpMenuCtrl::stopMove:1', 'object') +bl.type('DDS_PopUpMenuCtrl::updateFilter:1', 'object') +bl.type('DDS_PopUpMenuCtrl::updateScrollRect:1', 'object') +bl.type('DDS_PopUpMenuCtrl::updateTabHint:1', 'object') +bl.type('DNetSetLogging:1', 'bool') +bl.type('DbgFileView.clipToParent', 'bool') +bl.type('DbgFileView.enabled', 'bool') +bl.type('DbgFileView.visible', 'bool') +bl.type('DbgFileView::clearBreakPositions:1', 'object') +bl.type('DbgFileView::findString', 'bool') +bl.type('DbgFileView::findString:1', 'object') +bl.type('DbgFileView::getCurrentLine:1', 'object') +bl.type('DbgFileView::open', 'bool') +bl.type('DbgFileView::open:1', 'object') +bl.type('DbgFileView::removeBreak:1', 'object') +bl.type('DbgFileView::setBreak:1', 'object') +bl.type('DbgFileView::setBreakPosition:1', 'object') +bl.type('DbgFileView::setCurrentLine:1', 'object') +bl.type('DbgFileView::setCurrentLine:3', 'bool') +bl.type('Debris::init', 'bool') +bl.type('Debris::init:1', 'object') +bl.type('DebrisData.explodeOnMaxBounce', 'bool') +bl.type('DebrisData.fade', 'bool') +bl.type('DebrisData.ignoreWater', 'bool') +bl.type('DebrisData.render2D', 'bool') +bl.type('DebrisData.snapOnMaxBounce', 'bool') +bl.type('DebrisData.staticOnMaxBounce', 'bool') +bl.type('DebrisData.useRadiusMass', 'bool') +bl.type('DebugView.clipToParent', 'bool') +bl.type('DebugView.enabled', 'bool') +bl.type('DebugView.visible', 'bool') +bl.type('DebugView::addLine:1', 'object') +bl.type('DebugView::clearLines:1', 'object') +bl.type('DebugView::clearText:1', 'object') +bl.type('DebugView::setText:1', 'object') +bl.type('EGplus_Funcbar::onURL:1', 'object') +bl.type('EGplus_Main::close:1', 'object') +bl.type('EGplus_Main::open:1', 'object') +bl.type('EGplus_Ticker::clear:1', 'object') +bl.type('EGplus_Ticker::showStatus:1', 'object') +bl.type('EditManager.clipToParent', 'bool') +bl.type('EditManager.enabled', 'bool') +bl.type('EditManager.visible', 'bool') +bl.type('EditManager::gotoBookmark:1', 'object') +bl.type('EditManager::setBookmark:1', 'object') +bl.type('EditTSCtrl.clipToParent', 'bool') +bl.type('EditTSCtrl.enabled', 'bool') +bl.type('EditTSCtrl.renderMissionArea', 'bool') +bl.type('EditTSCtrl.visible', 'bool') +bl.type('EditTSCtrl::renderCircle:1', 'object') +bl.type('EditTSCtrl::renderLine:1', 'object') +bl.type('EditTSCtrl::renderSphere:1', 'object') +bl.type('EditTSCtrl::renderTriangle:1', 'object') +bl.type('Editor::Create:1', 'object') +bl.type('Editor::checkActiveLoadDone:1', 'object') +bl.type('Editor::onAdd:1', 'object') +bl.type('EnvFav_List::onSelect:1', 'object') +bl.type('EnvFav_List::update:1', 'object') +bl.type('EnvGui::onWake:1', 'object') +bl.type('EnvGui::setPane:1', 'object') +bl.type('EnvGuiFavorites::doLoad:1', 'object') +bl.type('EnvGuiFavorites::doSave:1', 'object') +bl.type('EnvGuiFavorites::remake:1', 'object') +bl.type('EnvGuiFavorites::saveFavorite:1', 'object') +bl.type('EnvGuiFavorites::setVar:1', 'object') +bl.type('EnvGuiServer::AddToResourceList:1', 'object') +bl.type('EnvGuiServer::PopulateEnvResourceList:1', 'object') +bl.type('EnvGuiServer::SendVignette:1', 'object') +bl.type('EnvGuiServer::SendVignetteAll:1', 'object') +bl.type('EnvGuiServer::SetAdvancedMode:1', 'object') +bl.type('EnvGuiServer::SetSimpleMode:1', 'object') +bl.type('EnvGuiServer::fillAdvancedVarsFromSimple:1', 'object') +bl.type('EnvGuiServer::getIdxFromFilenames:1', 'object') +bl.type('EnvGuiServer::readAdvancedVarsFromSimple:1', 'object') +bl.type('EnvGui_Window::onWindowFocus:1', 'object') +bl.type('Explosion::onAdd:1', 'object') +bl.type('ExplosionData.cameraShakeFalloff', 'bool') +bl.type('ExplosionData.faceViewer', 'bool') +bl.type('ExplosionData.shakeCamera', 'bool') +bl.type('ExplosionData::onAdd:1', 'object') +bl.type('FileObject::close:1', 'object') +bl.type('FileObject::isEOF', 'bool') +bl.type('FileObject::isEOF:1', 'object') +bl.type('FileObject::openForAppend', 'bool') +bl.type('FileObject::openForAppend:1', 'object') +bl.type('FileObject::openForRead', 'bool') +bl.type('FileObject::openForRead:1', 'object') +bl.type('FileObject::openForWrite', 'bool') +bl.type('FileObject::openForWrite:1', 'object') +bl.type('FileObject::readLine:1', 'object') +bl.type('FileObject::writeLine:1', 'object') +bl.type('FlyingVehicle.canSetIFLs', 'bool') +bl.type('FlyingVehicle.disableMove', 'bool') +bl.type('FlyingVehicle::useCreateHeight:1', 'object') +bl.type('FlyingVehicle::useCreateHeight:2', 'bool') +bl.type('FlyingVehicleData.cameraRoll', 'bool') +bl.type('FlyingVehicleData.emap', 'bool') +bl.type('FlyingVehicleData.firstPersonOnly', 'bool') +bl.type('FlyingVehicleData.inheritEnergyFromMount', 'bool') +bl.type('FlyingVehicleData.isInvincible', 'bool') +bl.type('FlyingVehicleData.observeThroughObject', 'bool') +bl.type('FlyingVehicleData.renderWhenDestroyed', 'bool') +bl.type('FlyingVehicleData.rideAble', 'bool') +bl.type('FlyingVehicleData.thirdPersonOnly', 'bool') +bl.type('FlyingVehicleData.useEyePoint', 'bool') +bl.type('FlyingVehicleData::Damage:1', 'object') +bl.type('FlyingVehicleData::onCollision:1', 'object') +bl.type('FootballItem::onBallCollision:1', 'object') +bl.type('GLEW_ARB_shader_objects', 'bool') +bl.type('GLEW_ARB_shading_language_100', 'bool') +bl.type('GLEW_ARB_shadow', 'bool') +bl.type('GLEW_ARB_texture_rg', 'bool') +bl.type('GLEW_EXT_framebuffer_object', 'bool') +bl.type('GLEW_EXT_texture3D', 'bool') +bl.type('GLEW_EXT_texture_array', 'bool') +bl.type('GameBase::getDataBlock:1', 'object') +bl.type('GameBase::inspectPostApply:1', 'object') +bl.type('GameBase::setDataBlock', 'bool') +bl.type('GameBase::setDataBlock:1', 'object') +bl.type('GameConnection::onDrop:1', 'object') +bl.type('GameConnection::setConnectArgs:1', 'object') +bl.type('GameConnection::startMission:1', 'object') +bl.type('GameModeGui::ClickGameMode:1', 'object') +bl.type('GameModeGuiServer::GetMissingAddOns:1', 'object') +bl.type('GameModeGuiServer::ParseGameModeFile:1', 'object') +bl.type('GameModeGuiServer::PopulateGameModeList:1', 'object') +bl.type('GameTSCtrl.clipToParent', 'bool') +bl.type('GameTSCtrl.enabled', 'bool') +bl.type('GameTSCtrl.visible', 'bool') +bl.type('GameWindowExists', 'bool') +bl.type('GuiAnimatedBitmapCtrl.alignLeft', 'bool') +bl.type('GuiAnimatedBitmapCtrl.alignTop', 'bool') +bl.type('GuiAnimatedBitmapCtrl.clipToParent', 'bool') +bl.type('GuiAnimatedBitmapCtrl.enabled', 'bool') +bl.type('GuiAnimatedBitmapCtrl.keepCached', 'bool') +bl.type('GuiAnimatedBitmapCtrl.lockAspectRatio', 'bool') +bl.type('GuiAnimatedBitmapCtrl.mMultiply', 'bool') +bl.type('GuiAnimatedBitmapCtrl.overflowImage', 'bool') +bl.type('GuiAnimatedBitmapCtrl.skipFrames', 'bool') +bl.type('GuiAnimatedBitmapCtrl.visible', 'bool') +bl.type('GuiAnimatedBitmapCtrl.wrap', 'bool') +bl.type('GuiAnimatedBitmapCtrl::setBitmap:1', 'object') +bl.type('GuiArrayCtrl.clipToParent', 'bool') +bl.type('GuiArrayCtrl.enabled', 'bool') +bl.type('GuiArrayCtrl.visible', 'bool') +bl.type('GuiBackgroundCtrl.clipToParent', 'bool') +bl.type('GuiBackgroundCtrl.enabled', 'bool') +bl.type('GuiBackgroundCtrl.visible', 'bool') +bl.type('GuiBitmapBorderCtrl.clipToParent', 'bool') +bl.type('GuiBitmapBorderCtrl.enabled', 'bool') +bl.type('GuiBitmapBorderCtrl.visible', 'bool') +bl.type('GuiBitmapButtonCtrl.alignLeft', 'bool') +bl.type('GuiBitmapButtonCtrl.alignTop', 'bool') +bl.type('GuiBitmapButtonCtrl.clipToParent', 'bool') +bl.type('GuiBitmapButtonCtrl.enabled', 'bool') +bl.type('GuiBitmapButtonCtrl.lockAspectRatio', 'bool') +bl.type('GuiBitmapButtonCtrl.mKeepCached', 'bool') +bl.type('GuiBitmapButtonCtrl.overflowImage', 'bool') +bl.type('GuiBitmapButtonCtrl.visible', 'bool') +bl.type('GuiBitmapButtonCtrl::getColor:1', 'object') +bl.type('GuiBitmapButtonCtrl::setBitmap:1', 'object') +bl.type('GuiBitmapButtonCtrl::setColor:1', 'object') +bl.type('GuiBitmapCtrl.alignLeft', 'bool') +bl.type('GuiBitmapCtrl.alignTop', 'bool') +bl.type('GuiBitmapCtrl.clipToParent', 'bool') +bl.type('GuiBitmapCtrl.enabled', 'bool') +bl.type('GuiBitmapCtrl.keepCached', 'bool') +bl.type('GuiBitmapCtrl.lockAspectRatio', 'bool') +bl.type('GuiBitmapCtrl.mMultiply', 'bool') +bl.type('GuiBitmapCtrl.overflowImage', 'bool') +bl.type('GuiBitmapCtrl.visible', 'bool') +bl.type('GuiBitmapCtrl.wrap', 'bool') +bl.type('GuiBitmapCtrl::getColor:1', 'object') +bl.type('GuiBitmapCtrl::getPixelColor:1', 'object') +bl.type('GuiBitmapCtrl::setBitmap:1', 'object') +bl.type('GuiBitmapCtrl::setColor:1', 'object') +bl.type('GuiBitmapCtrl::setValue:1', 'object') +bl.type('GuiBorderButtonCtrl.clipToParent', 'bool') +bl.type('GuiBorderButtonCtrl.enabled', 'bool') +bl.type('GuiBorderButtonCtrl.visible', 'bool') +bl.type('GuiBubbleTextCtrl.clipToParent', 'bool') +bl.type('GuiBubbleTextCtrl.enabled', 'bool') +bl.type('GuiBubbleTextCtrl.visible', 'bool') +bl.type('GuiButtonBaseCtrl.clipToParent', 'bool') +bl.type('GuiButtonBaseCtrl.enabled', 'bool') +bl.type('GuiButtonBaseCtrl.visible', 'bool') +bl.type('GuiButtonBaseCtrl::getText:1', 'object') +bl.type('GuiButtonBaseCtrl::performClick:1', 'object') +bl.type('GuiButtonBaseCtrl::setText:1', 'object') +bl.type('GuiButtonCtrl.clipToParent', 'bool') +bl.type('GuiButtonCtrl.enabled', 'bool') +bl.type('GuiButtonCtrl.visible', 'bool') +bl.type('GuiCanvas.clipToParent', 'bool') +bl.type('GuiCanvas.enabled', 'bool') +bl.type('GuiCanvas.visible', 'bool') +bl.type('GuiCanvas::canTabFocus:1', 'object') +bl.type('GuiCanvas::canTabFocus:2', 'bool') +bl.type('GuiCanvas::checkCursor:1', 'object') +bl.type('GuiCanvas::checkTabFocus:1', 'object') +bl.type('GuiCanvas::cursorOff:1', 'object') +bl.type('GuiCanvas::cursorOn:1', 'object') +bl.type('GuiCanvas::getContent:1', 'object') +bl.type('GuiCanvas::getCursorPos:1', 'object') +bl.type('GuiCanvas::hideCursor:1', 'object') +bl.type('GuiCanvas::isCursorOn', 'bool') +bl.type('GuiCanvas::isCursorOn:1', 'object') +bl.type('GuiCanvas::popDialog:1', 'object') +bl.type('GuiCanvas::popDialog:2', 'object') +bl.type('GuiCanvas::popLayer:1', 'object') +bl.type('GuiCanvas::pushDialog:1', 'object') +bl.type('GuiCanvas::pushDialog:2', 'object') +bl.type('GuiCanvas::renderFront:1', 'object') +bl.type('GuiCanvas::renderFront:2', 'bool') +bl.type('GuiCanvas::repaint:1', 'object') +bl.type('GuiCanvas::reset:1', 'object') +bl.type('GuiCanvas::setContent:1', 'object') +bl.type('GuiCanvas::setContent:2', 'object') +bl.type('GuiCanvas::setCursor:1', 'object') +bl.type('GuiCanvas::setCursor:2', 'bool') +bl.type('GuiCanvas::setCursorPos:1', 'object') +bl.type('GuiCanvas::showCursor:1', 'object') +bl.type('GuiCanvas::tabNext:1', 'object') +bl.type('GuiCheckBoxCtrl.clipToParent', 'bool') +bl.type('GuiCheckBoxCtrl.enabled', 'bool') +bl.type('GuiCheckBoxCtrl.visible', 'bool') +bl.type('GuiChunkedBitmapCtrl.clipToParent', 'bool') +bl.type('GuiChunkedBitmapCtrl.enabled', 'bool') +bl.type('GuiChunkedBitmapCtrl.tile', 'bool') +bl.type('GuiChunkedBitmapCtrl.useVariable', 'bool') +bl.type('GuiChunkedBitmapCtrl.visible', 'bool') +bl.type('GuiChunkedBitmapCtrl::setBitmap:1', 'object') +bl.type('GuiClockHud.clipToParent', 'bool') +bl.type('GuiClockHud.enabled', 'bool') +bl.type('GuiClockHud.showFill', 'bool') +bl.type('GuiClockHud.showFrame', 'bool') +bl.type('GuiClockHud.visible', 'bool') +bl.type('GuiClockHud::getTime:1', 'object') +bl.type('GuiClockHud::setTime:1', 'object') +bl.type('GuiConsole.clipToParent', 'bool') +bl.type('GuiConsole.enabled', 'bool') +bl.type('GuiConsole.visible', 'bool') +bl.type('GuiConsoleEditCtrl.clipToParent', 'bool') +bl.type('GuiConsoleEditCtrl.enabled', 'bool') +bl.type('GuiConsoleEditCtrl.password', 'bool') +bl.type('GuiConsoleEditCtrl.sinkAllKeyEvents', 'bool') +bl.type('GuiConsoleEditCtrl.tabComplete', 'bool') +bl.type('GuiConsoleEditCtrl.useSiblingScroller', 'bool') +bl.type('GuiConsoleEditCtrl.visible', 'bool') +bl.type('GuiConsoleTextCtrl.clipToParent', 'bool') +bl.type('GuiConsoleTextCtrl.enabled', 'bool') +bl.type('GuiConsoleTextCtrl.visible', 'bool') +bl.type('GuiControl.clipToParent', 'bool') +bl.type('GuiControl.enabled', 'bool') +bl.type('GuiControl.visible', 'bool') +bl.type('GuiControl::ScaleText:1', 'object') +bl.type('GuiControl::getExtent:1', 'object') +bl.type('GuiControl::getHelpPage:1', 'object') +bl.type('GuiControl::getLowestChildPoint:1', 'object') +bl.type('GuiControl::getMinExtent:1', 'object') +bl.type('GuiControl::getPosition:1', 'object') +bl.type('GuiControl::getScreenPosition:1', 'object') +bl.type('GuiControl::getValue:1', 'object') +bl.type('GuiControl::isActive', 'bool') +bl.type('GuiControl::isActive:1', 'object') +bl.type('GuiControl::isAwake', 'bool') +bl.type('GuiControl::isAwake:1', 'object') +bl.type('GuiControl::isVisible', 'bool') +bl.type('GuiControl::isVisible:1', 'object') +bl.type('GuiControl::makeFirstResponder:1', 'object') +bl.type('GuiControl::makeFirstResponder:2', 'bool') +bl.type('GuiControl::resize:1', 'object') +bl.type('GuiControl::setActive:1', 'object') +bl.type('GuiControl::setActive:2', 'bool') +bl.type('GuiControl::setCentered:1', 'object') +bl.type('GuiControl::setCenteredX:1', 'object') +bl.type('GuiControl::setCenteredY:1', 'object') +bl.type('GuiControl::setHasRendered:1', 'object') +bl.type('GuiControl::setHasRendered:2', 'bool') +bl.type('GuiControl::setProfile:1', 'object') +bl.type('GuiControl::setProfile:2', 'object') +bl.type('GuiControl::setValue:1', 'object') +bl.type('GuiControl::setVisible:1', 'object') +bl.type('GuiControl::setVisible:2', 'bool') +bl.type('GuiControlListPopUp.clipToParent', 'bool') +bl.type('GuiControlListPopUp.enabled', 'bool') +bl.type('GuiControlListPopUp.visible', 'bool') +bl.type('GuiControlProfile.autoSizeHeight', 'bool') +bl.type('GuiControlProfile.autoSizeWidth', 'bool') +bl.type('GuiControlProfile.canKeyFocus', 'bool') +bl.type('GuiControlProfile.doFontOutline', 'bool') +bl.type('GuiControlProfile.modal', 'bool') +bl.type('GuiControlProfile.mouseOverSelected', 'bool') +bl.type('GuiControlProfile.numbersOnly', 'bool') +bl.type('GuiControlProfile.opaque', 'bool') +bl.type('GuiControlProfile.returnTab', 'bool') +bl.type('GuiControlProfile.tab', 'bool') +bl.type('GuiControlProfile::updateFont:1', 'object') +bl.type('GuiCrossHairHud.alignLeft', 'bool') +bl.type('GuiCrossHairHud.alignTop', 'bool') +bl.type('GuiCrossHairHud.clipToParent', 'bool') +bl.type('GuiCrossHairHud.enabled', 'bool') +bl.type('GuiCrossHairHud.keepCached', 'bool') +bl.type('GuiCrossHairHud.lockAspectRatio', 'bool') +bl.type('GuiCrossHairHud.mMultiply', 'bool') +bl.type('GuiCrossHairHud.overflowImage', 'bool') +bl.type('GuiCrossHairHud.visible', 'bool') +bl.type('GuiCrossHairHud.wrap', 'bool') +bl.type('GuiEditCtrl.clipToParent', 'bool') +bl.type('GuiEditCtrl.enabled', 'bool') +bl.type('GuiEditCtrl.visible', 'bool') +bl.type('GuiEditCtrl::addNewCtrl:1', 'object') +bl.type('GuiEditCtrl::addNewCtrl:2', 'object') +bl.type('GuiEditCtrl::bringToFront:1', 'object') +bl.type('GuiEditCtrl::deleteSelection:1', 'object') +bl.type('GuiEditCtrl::justify:1', 'object') +bl.type('GuiEditCtrl::loadSelection:1', 'object') +bl.type('GuiEditCtrl::moveSelection:1', 'object') +bl.type('GuiEditCtrl::pushToBack:1', 'object') +bl.type('GuiEditCtrl::saveSelection:1', 'object') +bl.type('GuiEditCtrl::select:1', 'object') +bl.type('GuiEditCtrl::select:2', 'object') +bl.type('GuiEditCtrl::selectAll:1', 'object') +bl.type('GuiEditCtrl::setCurrentAddSet:1', 'object') +bl.type('GuiEditCtrl::setCurrentAddSet:2', 'object') +bl.type('GuiEditCtrl::setRoot:1', 'object') +bl.type('GuiEditCtrl::setRoot:2', 'object') +bl.type('GuiEditCtrl::toggle:1', 'object') +bl.type('GuiEditor::onSelect:1', 'object') +bl.type('GuiEditorClassPopup::onSelect:1', 'object') +bl.type('GuiEditorContentList::onSelect:1', 'object') +bl.type('GuiEditorMenuBar::onMenuItemSelect:1', 'object') +bl.type('GuiEditorResList::onSelect:1', 'object') +bl.type('GuiEditorRuler.clipToParent', 'bool') +bl.type('GuiEditorRuler.enabled', 'bool') +bl.type('GuiEditorRuler.visible', 'bool') +bl.type('GuiEditorTreeView::onSelect:1', 'object') +bl.type('GuiFadeinBitmapCtrl.alignLeft', 'bool') +bl.type('GuiFadeinBitmapCtrl.alignTop', 'bool') +bl.type('GuiFadeinBitmapCtrl.clipToParent', 'bool') +bl.type('GuiFadeinBitmapCtrl.enabled', 'bool') +bl.type('GuiFadeinBitmapCtrl.keepCached', 'bool') +bl.type('GuiFadeinBitmapCtrl.lockAspectRatio', 'bool') +bl.type('GuiFadeinBitmapCtrl.mMultiply', 'bool') +bl.type('GuiFadeinBitmapCtrl.overflowImage', 'bool') +bl.type('GuiFadeinBitmapCtrl.visible', 'bool') +bl.type('GuiFadeinBitmapCtrl.wrap', 'bool') +bl.type('GuiFadeinBitmapCtrl::reset:1', 'object') +bl.type('GuiFilterCtrl.clipToParent', 'bool') +bl.type('GuiFilterCtrl.enabled', 'bool') +bl.type('GuiFilterCtrl.visible', 'bool') +bl.type('GuiFilterCtrl::getValue:1', 'object') +bl.type('GuiFilterCtrl::identity:1', 'object') +bl.type('GuiFilterCtrl::setValue:1', 'object') +bl.type('GuiFrameSetCtrl.autoBalance', 'bool') +bl.type('GuiFrameSetCtrl.clipToParent', 'bool') +bl.type('GuiFrameSetCtrl.enabled', 'bool') +bl.type('GuiFrameSetCtrl.visible', 'bool') +bl.type('GuiFrameSetCtrl::addColumn:1', 'object') +bl.type('GuiFrameSetCtrl::addRow:1', 'object') +bl.type('GuiFrameSetCtrl::frameBorder:1', 'object') +bl.type('GuiFrameSetCtrl::frameBorder:3', 'bool') +bl.type('GuiFrameSetCtrl::frameMinExtent:1', 'object') +bl.type('GuiFrameSetCtrl::frameMovable:1', 'object') +bl.type('GuiFrameSetCtrl::frameMovable:3', 'bool') +bl.type('GuiFrameSetCtrl::getColumnCount:1', 'object') +bl.type('GuiFrameSetCtrl::getColumnOffset:1', 'object') +bl.type('GuiFrameSetCtrl::getRowCount:1', 'object') +bl.type('GuiFrameSetCtrl::getRowOffset:1', 'object') +bl.type('GuiFrameSetCtrl::removeColumn:1', 'object') +bl.type('GuiFrameSetCtrl::removeRow:1', 'object') +bl.type('GuiFrameSetCtrl::setColumnOffset:1', 'object') +bl.type('GuiFrameSetCtrl::setRowOffset:1', 'object') +bl.type('GuiGraphCtrl.clipToParent', 'bool') +bl.type('GuiGraphCtrl.enabled', 'bool') +bl.type('GuiGraphCtrl.visible', 'bool') +bl.type('GuiGraphCtrl::addAutoPlot:1', 'object') +bl.type('GuiGraphCtrl::addDatum:1', 'object') +bl.type('GuiGraphCtrl::getDatum:1', 'object') +bl.type('GuiGraphCtrl::matchScale:1', 'object') +bl.type('GuiGraphCtrl::removeAutoPlot:1', 'object') +bl.type('GuiGraphCtrl::setGraphType:1', 'object') +bl.type('GuiHealthBarHud.clipToParent', 'bool') +bl.type('GuiHealthBarHud.displayEnergy', 'bool') +bl.type('GuiHealthBarHud.enabled', 'bool') +bl.type('GuiHealthBarHud.flipped', 'bool') +bl.type('GuiHealthBarHud.showFill', 'bool') +bl.type('GuiHealthBarHud.showFrame', 'bool') +bl.type('GuiHealthBarHud.visible', 'bool') +bl.type('GuiInputCtrl.clipToParent', 'bool') +bl.type('GuiInputCtrl.enabled', 'bool') +bl.type('GuiInputCtrl.visible', 'bool') +bl.type('GuiInspector.clipToParent', 'bool') +bl.type('GuiInspector.enabled', 'bool') +bl.type('GuiInspector.useFieldGrouping', 'bool') +bl.type('GuiInspector.visible', 'bool') +bl.type('GuiInspector::addDynamicField:1', 'object') +bl.type('GuiInspector::apply:1', 'object') +bl.type('GuiInspector::inspect:1', 'object') +bl.type('GuiInspector::inspect:2', 'object') +bl.type('GuiInspector::setAllGroupState:1', 'object') +bl.type('GuiInspector::setAllGroupState:2', 'bool') +bl.type('GuiInspector::setAllGroupStateScript:1', 'object') +bl.type('GuiInspector::toggleDynamicGroupExpand:1', 'object') +bl.type('GuiInspector::toggleDynamicGroupScript:1', 'object') +bl.type('GuiInspector::toggleGroupExpand:1', 'object') +bl.type('GuiInspector::toggleGroupExpand:2', 'object') +bl.type('GuiInspector::toggleGroupScript:1', 'object') +bl.type('GuiMLTextCtrl.allowColorChars', 'bool') +bl.type('GuiMLTextCtrl.autoResize', 'bool') +bl.type('GuiMLTextCtrl.clipToParent', 'bool') +bl.type('GuiMLTextCtrl.enabled', 'bool') +bl.type('GuiMLTextCtrl.selectable', 'bool') +bl.type('GuiMLTextCtrl.visible', 'bool') +bl.type('GuiMLTextCtrl::addText:1', 'object') +bl.type('GuiMLTextCtrl::addText:3', 'bool') +bl.type('GuiMLTextCtrl::forceReflow:1', 'object') +bl.type('GuiMLTextCtrl::getText:1', 'object') +bl.type('GuiMLTextCtrl::onAdd:1', 'object') +bl.type('GuiMLTextCtrl::onURL:1', 'object') +bl.type('GuiMLTextCtrl::scrollToTag:1', 'object') +bl.type('GuiMLTextCtrl::scrollToTop:1', 'object') +bl.type('GuiMLTextCtrl::setAlpha:1', 'object') +bl.type('GuiMLTextCtrl::setCursorPosition', 'bool') +bl.type('GuiMLTextCtrl::setCursorPosition:1', 'object') +bl.type('GuiMLTextCtrl::setText:1', 'object') +bl.type('GuiMLTextEditCtrl.allowColorChars', 'bool') +bl.type('GuiMLTextEditCtrl.autoResize', 'bool') +bl.type('GuiMLTextEditCtrl.clipToParent', 'bool') +bl.type('GuiMLTextEditCtrl.enabled', 'bool') +bl.type('GuiMLTextEditCtrl.selectable', 'bool') +bl.type('GuiMLTextEditCtrl.visible', 'bool') +bl.type('GuiMenuBar.clipToParent', 'bool') +bl.type('GuiMenuBar.enabled', 'bool') +bl.type('GuiMenuBar.visible', 'bool') +bl.type('GuiMenuBar::addMenu:1', 'object') +bl.type('GuiMenuBar::addMenuItem:1', 'object') +bl.type('GuiMenuBar::clearMenuItems:1', 'object') +bl.type('GuiMenuBar::clearMenus:1', 'object') +bl.type('GuiMenuBar::removeMenu:1', 'object') +bl.type('GuiMenuBar::removeMenuItem:1', 'object') +bl.type('GuiMenuBar::setMenuItemBitmap:1', 'object') +bl.type('GuiMenuBar::setMenuItemChecked:1', 'object') +bl.type('GuiMenuBar::setMenuItemChecked:4', 'bool') +bl.type('GuiMenuBar::setMenuItemEnable:1', 'object') +bl.type('GuiMenuBar::setMenuItemEnable:4', 'bool') +bl.type('GuiMenuBar::setMenuItemText:1', 'object') +bl.type('GuiMenuBar::setMenuItemVisible:1', 'object') +bl.type('GuiMenuBar::setMenuItemVisible:4', 'bool') +bl.type('GuiMenuBar::setMenuText:1', 'object') +bl.type('GuiMenuBar::setMenuVisible:1', 'object') +bl.type('GuiMenuBar::setMenuVisible:3', 'bool') +bl.type('GuiMessageVectorCtrl.clipToParent', 'bool') +bl.type('GuiMessageVectorCtrl.enabled', 'bool') +bl.type('GuiMessageVectorCtrl.visible', 'bool') +bl.type('GuiMessageVectorCtrl::attach', 'bool') +bl.type('GuiMessageVectorCtrl::attach:1', 'object') +bl.type('GuiMessageVectorCtrl::attach:2', 'object') +bl.type('GuiMessageVectorCtrl::detach:1', 'object') +bl.type('GuiMouseEventCtrl.clipToParent', 'bool') +bl.type('GuiMouseEventCtrl.enabled', 'bool') +bl.type('GuiMouseEventCtrl.lockMouse', 'bool') +bl.type('GuiMouseEventCtrl.visible', 'bool') +bl.type('GuiNoMouseCtrl.clipToParent', 'bool') +bl.type('GuiNoMouseCtrl.enabled', 'bool') +bl.type('GuiNoMouseCtrl.visible', 'bool') +bl.type('GuiObjectView.clipToParent', 'bool') +bl.type('GuiObjectView.enabled', 'bool') +bl.type('GuiObjectView.visible', 'bool') +bl.type('GuiObjectView::dumpView:1', 'object') +bl.type('GuiObjectView::hideNode:1', 'object') +bl.type('GuiObjectView::loadDSQ:1', 'object') +bl.type('GuiObjectView::mountObject:1', 'object') +bl.type('GuiObjectView::setCamera:1', 'object') +bl.type('GuiObjectView::setCameraRot:1', 'object') +bl.type('GuiObjectView::setEmpty:1', 'object') +bl.type('GuiObjectView::setIflFrame:1', 'object') +bl.type('GuiObjectView::setMouse:1', 'object') +bl.type('GuiObjectView::setNodeColor:1', 'object') +bl.type('GuiObjectView::setObject:1', 'object') +bl.type('GuiObjectView::setOrbitDist:1', 'object') +bl.type('GuiObjectView::setScale:1', 'object') +bl.type('GuiObjectView::setSequence:1', 'object') +bl.type('GuiObjectView::setThreadPos:1', 'object') +bl.type('GuiObjectView::unHideNode:1', 'object') +bl.type('GuiObjectView::unMountObject:1', 'object') +bl.type('GuiPlayerView.clipToParent', 'bool') +bl.type('GuiPlayerView.enabled', 'bool') +bl.type('GuiPlayerView.visible', 'bool') +bl.type('GuiPlayerView::setModel:1', 'object') +bl.type('GuiPlayerView::setSeq:1', 'object') +bl.type('GuiPopUpMenuCtrl.clipToParent', 'bool') +bl.type('GuiPopUpMenuCtrl.enabled', 'bool') +bl.type('GuiPopUpMenuCtrl.visible', 'bool') +bl.type('GuiPopUpMenuCtrl::add:1', 'object') +bl.type('GuiPopUpMenuCtrl::addFront:1', 'object') +bl.type('GuiPopUpMenuCtrl::addScheme:1', 'object') +bl.type('GuiPopUpMenuCtrl::clear:1', 'object') +bl.type('GuiPopUpMenuCtrl::findText:1', 'object') +bl.type('GuiPopUpMenuCtrl::forceClose:1', 'object') +bl.type('GuiPopUpMenuCtrl::forceOnAction:1', 'object') +bl.type('GuiPopUpMenuCtrl::getSelected:1', 'object') +bl.type('GuiPopUpMenuCtrl::getText:1', 'object') +bl.type('GuiPopUpMenuCtrl::getTextById:1', 'object') +bl.type('GuiPopUpMenuCtrl::onRemove:1', 'object') +bl.type('GuiPopUpMenuCtrl::replaceText:1', 'object') +bl.type('GuiPopUpMenuCtrl::replaceText:2', 'bool') +bl.type('GuiPopUpMenuCtrl::setEnumContent:1', 'object') +bl.type('GuiPopUpMenuCtrl::setSelected:1', 'object') +bl.type('GuiPopUpMenuCtrl::setText:1', 'object') +bl.type('GuiPopUpMenuCtrl::size:1', 'object') +bl.type('GuiPopUpMenuCtrl::sort:1', 'object') +bl.type('GuiProgressCtrl.clipToParent', 'bool') +bl.type('GuiProgressCtrl.enabled', 'bool') +bl.type('GuiProgressCtrl.visible', 'bool') +bl.type('GuiRadioCtrl.clipToParent', 'bool') +bl.type('GuiRadioCtrl.enabled', 'bool') +bl.type('GuiRadioCtrl.visible', 'bool') +bl.type('GuiScrollCtrl.clipToParent', 'bool') +bl.type('GuiScrollCtrl.constantThumbHeight', 'bool') +bl.type('GuiScrollCtrl.enabled', 'bool') +bl.type('GuiScrollCtrl.visible', 'bool') +bl.type('GuiScrollCtrl.willFirstRespond', 'bool') +bl.type('GuiScrollCtrl::scrollToBottom:1', 'object') +bl.type('GuiScrollCtrl::scrollToTop:1', 'object') +bl.type('GuiShapeNameHud.clipToParent', 'bool') +bl.type('GuiShapeNameHud.enabled', 'bool') +bl.type('GuiShapeNameHud.showFill', 'bool') +bl.type('GuiShapeNameHud.showFrame', 'bool') +bl.type('GuiShapeNameHud.visible', 'bool') +bl.type('GuiSliderCtrl.clipToParent', 'bool') +bl.type('GuiSliderCtrl.enabled', 'bool') +bl.type('GuiSliderCtrl.snap', 'bool') +bl.type('GuiSliderCtrl.visible', 'bool') +bl.type('GuiSliderCtrl::getValue:1', 'object') +bl.type('GuiSpeedometerHud.alignLeft', 'bool') +bl.type('GuiSpeedometerHud.alignTop', 'bool') +bl.type('GuiSpeedometerHud.clipToParent', 'bool') +bl.type('GuiSpeedometerHud.enabled', 'bool') +bl.type('GuiSpeedometerHud.keepCached', 'bool') +bl.type('GuiSpeedometerHud.lockAspectRatio', 'bool') +bl.type('GuiSpeedometerHud.mMultiply', 'bool') +bl.type('GuiSpeedometerHud.overflowImage', 'bool') +bl.type('GuiSpeedometerHud.visible', 'bool') +bl.type('GuiSpeedometerHud.wrap', 'bool') +bl.type('GuiSwatchCtrl.clipToParent', 'bool') +bl.type('GuiSwatchCtrl.enabled', 'bool') +bl.type('GuiSwatchCtrl.visible', 'bool') +bl.type('GuiSwatchCtrl::getColor:1', 'object') +bl.type('GuiSwatchCtrl::setColor:1', 'object') +bl.type('GuiTSCtrl.clipToParent', 'bool') +bl.type('GuiTSCtrl.enabled', 'bool') +bl.type('GuiTSCtrl.visible', 'bool') +bl.type('GuiTextCtrl.clipToParent', 'bool') +bl.type('GuiTextCtrl.enabled', 'bool') +bl.type('GuiTextCtrl.visible', 'bool') +bl.type('GuiTextCtrl::getPixelWidth:1', 'object') +bl.type('GuiTextCtrl::setText:1', 'object') +bl.type('GuiTextEditCtrl.clipToParent', 'bool') +bl.type('GuiTextEditCtrl.enabled', 'bool') +bl.type('GuiTextEditCtrl.password', 'bool') +bl.type('GuiTextEditCtrl.sinkAllKeyEvents', 'bool') +bl.type('GuiTextEditCtrl.tabComplete', 'bool') +bl.type('GuiTextEditCtrl.visible', 'bool') +bl.type('GuiTextEditCtrl::getCursorPos:1', 'object') +bl.type('GuiTextEditCtrl::restrictNumberInput:1', 'object') +bl.type('GuiTextEditCtrl::setCursorPos:1', 'object') +bl.type('GuiTextEditCtrl::updateHistorySize:1', 'object') +bl.type('GuiTextEditSliderCtrl.clipToParent', 'bool') +bl.type('GuiTextEditSliderCtrl.enabled', 'bool') +bl.type('GuiTextEditSliderCtrl.password', 'bool') +bl.type('GuiTextEditSliderCtrl.sinkAllKeyEvents', 'bool') +bl.type('GuiTextEditSliderCtrl.tabComplete', 'bool') +bl.type('GuiTextEditSliderCtrl.visible', 'bool') +bl.type('GuiTextListCtrl.clipColumnText', 'bool') +bl.type('GuiTextListCtrl.clipToParent', 'bool') +bl.type('GuiTextListCtrl.enabled', 'bool') +bl.type('GuiTextListCtrl.enumerate', 'bool') +bl.type('GuiTextListCtrl.fitParentWidth', 'bool') +bl.type('GuiTextListCtrl.resizeCell', 'bool') +bl.type('GuiTextListCtrl.visible', 'bool') +bl.type('GuiTextListCtrl::addRow:1', 'object') +bl.type('GuiTextListCtrl::clear:1', 'object') +bl.type('GuiTextListCtrl::clearSelection:1', 'object') +bl.type('GuiTextListCtrl::findTextIndex:1', 'object') +bl.type('GuiTextListCtrl::getRowId:1', 'object') +bl.type('GuiTextListCtrl::getRowNumById:1', 'object') +bl.type('GuiTextListCtrl::getRowText:1', 'object') +bl.type('GuiTextListCtrl::getRowTextById:1', 'object') +bl.type('GuiTextListCtrl::getSelectedId:1', 'object') +bl.type('GuiTextListCtrl::isRowActive', 'bool') +bl.type('GuiTextListCtrl::isRowActive:1', 'object') +bl.type('GuiTextListCtrl::removeRow:1', 'object') +bl.type('GuiTextListCtrl::removeRowById:1', 'object') +bl.type('GuiTextListCtrl::rowCount:1', 'object') +bl.type('GuiTextListCtrl::scrollVisible:1', 'object') +bl.type('GuiTextListCtrl::setRowActive:1', 'object') +bl.type('GuiTextListCtrl::setRowActive:3', 'bool') +bl.type('GuiTextListCtrl::setRowById:1', 'object') +bl.type('GuiTextListCtrl::setSelectedById:1', 'object') +bl.type('GuiTextListCtrl::setSelectedRow:1', 'object') +bl.type('GuiTextListCtrl::sort:1', 'object') +bl.type('GuiTextListCtrl::sort:3', 'bool') +bl.type('GuiTextListCtrl::sortNumerical:1', 'object') +bl.type('GuiTextListCtrl::sortNumerical:3', 'bool') +bl.type('GuiTreeViewCtrl.allowMultipleSelections', 'bool') +bl.type('GuiTreeViewCtrl.clipToParent', 'bool') +bl.type('GuiTreeViewCtrl.enabled', 'bool') +bl.type('GuiTreeViewCtrl.recurseSets', 'bool') +bl.type('GuiTreeViewCtrl.visible', 'bool') +bl.type('GuiTreeViewCtrl::open:1', 'object') +bl.type('GuiTreeViewCtrl::open:2', 'object') +bl.type('GuiWindowCtrl.canClose', 'bool') +bl.type('GuiWindowCtrl.canMaximize', 'bool') +bl.type('GuiWindowCtrl.canMinimize', 'bool') +bl.type('GuiWindowCtrl.canMove', 'bool') +bl.type('GuiWindowCtrl.clipToParent', 'bool') +bl.type('GuiWindowCtrl.enabled', 'bool') +bl.type('GuiWindowCtrl.resizeHeight', 'bool') +bl.type('GuiWindowCtrl.resizeWidth', 'bool') +bl.type('GuiWindowCtrl.visible', 'bool') +bl.type('HTTPObject::get:1', 'object') +bl.type('HTTPObject::post:1', 'object') +bl.type('HateImage::onDone:1', 'object') +bl.type('HeapQueue::_demote:1', 'object') +bl.type('HeapQueue::_promote:1', 'object') +bl.type('HeapQueue::compare:1', 'object') +bl.type('HeapQueue::onAdd:1', 'object') +bl.type('HeapQueue::pop:1', 'object') +bl.type('HeapQueue::push:1', 'object') +bl.type('HeapQueue::update:1', 'object') +bl.type('HelpDlg::onWake:1', 'object') +bl.type('HelpFileList::onSelect:1', 'object') +bl.type('HelpText::setText:1', 'object') +bl.type('HorseArmor::onAdd:1', 'object') +bl.type('HorseArmor::onDriverLeave:1', 'object') +bl.type('HorseHoleBot::onAdd:1', 'object') +bl.type('HorseHoleBot::onBotCollision:1', 'object') +bl.type('HorseHoleBot::onBotDamage:1', 'object') +bl.type('HorseHoleBot::onBotFollow:1', 'object') +bl.type('HorseHoleBot::onBotLoop:1', 'object') +bl.type('InspectAddFieldDlg::doAction:1', 'object') +bl.type('InspectTreeView::onSelect:1', 'object') +bl.type('Item.canSetIFLs', 'bool') +bl.type('Item.collideable', 'bool') +bl.type('Item.rotate', 'bool') +bl.type('Item.static', 'bool') +bl.type('Item::Respawn:1', 'object') +bl.type('Item::fadeIn:1', 'object') +bl.type('Item::fadeOut:1', 'object') +bl.type('Item::getLastStickyNormal:1', 'object') +bl.type('Item::getLastStickyPos:1', 'object') +bl.type('Item::getRespawnTime:1', 'object') +bl.type('Item::isRotating', 'bool') +bl.type('Item::isRotating:1', 'object') +bl.type('Item::isStatic', 'bool') +bl.type('Item::isStatic:1', 'object') +bl.type('Item::schedulePop:1', 'object') +bl.type('Item::setCollisionTimeout', 'bool') +bl.type('Item::setCollisionTimeout:1', 'object') +bl.type('Item::setCollisionTimeout:2', 'object') +bl.type('Item::setRespawnTime:1', 'object') +bl.type('Item::setThrower:1', 'object') +bl.type('ItemData.doColorShift', 'bool') +bl.type('ItemData.emap', 'bool') +bl.type('ItemData.firstPersonOnly', 'bool') +bl.type('ItemData.inheritEnergyFromMount', 'bool') +bl.type('ItemData.isInvincible', 'bool') +bl.type('ItemData.lightOnlyStatic', 'bool') +bl.type('ItemData.observeThroughObject', 'bool') +bl.type('ItemData.renderWhenDestroyed', 'bool') +bl.type('ItemData.sticky', 'bool') +bl.type('ItemData.thirdPersonOnly', 'bool') +bl.type('ItemData.useEyePoint', 'bool') +bl.type('ItemData::create:1', 'object') +bl.type('ItemData::onAdd:1', 'object') +bl.type('ItemData::onBallCollision:1', 'object') +bl.type('ItemData::onCollision:1', 'object') +bl.type('ItemData::onPickup:1', 'object') +bl.type('ItemData::onThrow:1', 'object') +bl.type('ItemData::onUse:1', 'object') +bl.type('ItemImage::onMount:1', 'object') +bl.type('ItemImage::onUnMount:1', 'object') +bl.type('JMG_List::onSelect:1', 'object') +bl.type('JMG_Slayer::createMinigame:1', 'object') +bl.type('JMG_Slayer::editMinigame:1', 'object') +bl.type('JMG_Slayer::onWake:1', 'object') +bl.type('JoinServerGuiBS::ClickBack:1', 'object') +bl.type('JoinServerGuiBS::cancel:1', 'object') +bl.type('JoinServerGuiBS::exit:1', 'object') +bl.type('JoinServerGuiBS::join:1', 'object') +bl.type('JoinServerGuiBS::onWake:1', 'object') +bl.type('JoinServerGuiBS::queryLan:1', 'object') +bl.type('JoinServerGuiBS::queryWebMaster:1', 'object') +bl.type('JoinServerGuiBS::update:1', 'object') +bl.type('JoinServerPassGui::cancel:1', 'object') +bl.type('JoinServerPassGui::enterPass:1', 'object') +bl.type('LeftHandedGunImage::onFire:1', 'object') +bl.type('LeftHandedGunImage::onMount:1', 'object') +bl.type('LeftHandedGunImage::onUnMount:1', 'object') +bl.type('Lightning.useFog', 'bool') +bl.type('Lightning::strikeObject:1', 'object') +bl.type('Lightning::strikeObject:2', 'object') +bl.type('Lightning::strikeRandomPoint:1', 'object') +bl.type('Lightning::warningFlashes:1', 'object') +bl.type('LoadBricksGui::ClickOwnership:1', 'object') +bl.type('LoadBricksGui::onSleep:1', 'object') +bl.type('LoadBricksGui::onWake:1', 'object') +bl.type('LoadingGui::onAdd:1', 'object') +bl.type('LoadingGui::onSleep:1', 'object') +bl.type('LoadingGui::onWake:1', 'object') +bl.type('LoveImage::onDone:1', 'object') +bl.type('MM_AuthBar::blinkFail:1', 'object') +bl.type('MM_AuthBar::blinkSuccess:1', 'object') +bl.type('MainMenuGui::PlayMusic:1', 'object') +bl.type('MainMenuGui::buildScreenshotList:1', 'object') +bl.type('MainMenuGui::clickJoinBS:1', 'object') +bl.type('MainMenuGui::clickNameButton:1', 'object') +bl.type('MainMenuGui::clickOptions:1', 'object') +bl.type('MainMenuGui::clickPlayer:1', 'object') +bl.type('MainMenuGui::clickStart:1', 'object') +bl.type('MainMenuGui::clickSteam:1', 'object') +bl.type('MainMenuGui::clickUnlock:1', 'object') +bl.type('MainMenuGui::hideButtons:1', 'object') +bl.type('MainMenuGui::onRender:1', 'object') +bl.type('MainMenuGui::onSleep:1', 'object') +bl.type('MainMenuGui::onWake:1', 'object') +bl.type('MainMenuGui::retryAuth:1', 'object') +bl.type('MainMenuGui::showButtons:1', 'object') +bl.type('ManualJoin::onWake:1', 'object') +bl.type('MessageBoxOKCancelDlg::onSleep:1', 'object') +bl.type('MessageBoxOKDlg::onSleep:1', 'object') +bl.type('MessageBoxYesNoDlg::onSleep:1', 'object') +bl.type('MessageVector::clear:1', 'object') +bl.type('MessageVector::deleteLine', 'bool') +bl.type('MessageVector::deleteLine:1', 'object') +bl.type('MessageVector::dump:1', 'object') +bl.type('MessageVector::getLineIndexByTag:1', 'object') +bl.type('MessageVector::getLineTag:1', 'object') +bl.type('MessageVector::getLineText:1', 'object') +bl.type('MessageVector::getLineTextByTag:1', 'object') +bl.type('MessageVector::getNumLines:1', 'object') +bl.type('MessageVector::insertLine', 'bool') +bl.type('MessageVector::insertLine:1', 'object') +bl.type('MessageVector::popBackLine', 'bool') +bl.type('MessageVector::popBackLine:1', 'object') +bl.type('MessageVector::popFrontLine', 'bool') +bl.type('MessageVector::popFrontLine:1', 'object') +bl.type('MessageVector::pushBackLine:1', 'object') +bl.type('MessageVector::pushFrontLine:1', 'object') +bl.type('MiniGameInviteGui::ClickAccept:1', 'object') +bl.type('MiniGameInviteGui::ClickIgnore:1', 'object') +bl.type('MiniGameInviteGui::ClickReject:1', 'object') +bl.type('MiniGameInviteGui::Ignore:1', 'object') +bl.type('MiniGameInviteGui::onSleep:1', 'object') +bl.type('MiniGameInviteGui::onWake:1', 'object') +bl.type('MiniGameSO::reset:1', 'object') +bl.type('MissionMarker.canSetIFLs', 'bool') +bl.type('MissionMarkerData.emap', 'bool') +bl.type('MissionMarkerData.firstPersonOnly', 'bool') +bl.type('MissionMarkerData.inheritEnergyFromMount', 'bool') +bl.type('MissionMarkerData.isInvincible', 'bool') +bl.type('MissionMarkerData.observeThroughObject', 'bool') +bl.type('MissionMarkerData.renderWhenDestroyed', 'bool') +bl.type('MissionMarkerData.thirdPersonOnly', 'bool') +bl.type('MissionMarkerData.useEyePoint', 'bool') +bl.type('MissionMarkerData::create:1', 'object') +bl.type('NMH_Type::send:1', 'object') +bl.type('NMH_Type::type:1', 'object') +bl.type('NetConnection::cancelConnect:1', 'object') +bl.type('NetConnection::checkMaxRate:1', 'object') +bl.type('NetConnection::clearPaths:1', 'object') +bl.type('NetConnection::connect:1', 'object') +bl.type('NetConnection::connectArranged:1', 'object') +bl.type('NetConnection::connectLocal:1', 'object') +bl.type('NetConnection::getAddress:1', 'object') +bl.type('NetConnection::getFinishedInitialGhost', 'bool') +bl.type('NetConnection::getFinishedInitialGhost:1', 'object') +bl.type('NetConnection::getGhostID:1', 'object') +bl.type('NetConnection::getGhostsActive:1', 'object') +bl.type('NetConnection::getPacketLoss:1', 'object') +bl.type('NetConnection::getPing:1', 'object') +bl.type('NetConnection::getPort:1', 'object') +bl.type('NetConnection::getProtocolVersion:1', 'object') +bl.type('NetConnection::getRawIP:1', 'object') +bl.type('NetConnection::isLan', 'bool') +bl.type('NetConnection::isLan:1', 'object') +bl.type('NetConnection::isLocal', 'bool') +bl.type('NetConnection::isLocal:1', 'object') +bl.type('NetConnection::isLocalConnection', 'bool') +bl.type('NetConnection::isLocalConnection:1', 'object') +bl.type('NetConnection::resolveGhostID:1', 'object') +bl.type('NetConnection::resolveObjectFromGhostIndex', 'object') +bl.type('NetConnection::resolveObjectFromGhostIndex:1', 'object') +bl.type('NetConnection::sendDisconnectPacket:1', 'object') +bl.type('NetConnection::setFinishedInitialGhost:1', 'object') +bl.type('NetConnection::setFinishedInitialGhost:2', 'bool') +bl.type('NetConnection::transmitPaths:1', 'object') +bl.type('NetGraph::cancel:1', 'object') +bl.type('NetGraph::toggleKey:1', 'object') +bl.type('NetGraph::toggleNetGraph:1', 'object') +bl.type('NetGraph::updateStats:1', 'object') +bl.type('NetObject::clearScopeToClient:1', 'object') +bl.type('NetObject::getGhostID:1', 'object') +bl.type('NetObject::scopeToClient:1', 'object') +bl.type('NetObject::scopeToClient:2', 'object') +bl.type('NetObject::setScopeAlways:1', 'object') +bl.type('NewChatSO::addLine:1', 'object') +bl.type('NewPlayerListGui::clickList:1', 'object') +bl.type('NewPlayerListGui::onWake:1', 'object') +bl.type('Observer::onTrigger:1', 'object') +bl.type('OpenALInitDriver', 'bool') +bl.type('OptAudioDriverList::onSelect:1', 'object') +bl.type('OptGraphicsBPPMenu::init:1', 'object') +bl.type('OptGraphicsBorderlessToggle::onAction:1', 'object') +bl.type('OptGraphicsDriverMenu::onSelect:1', 'object') +bl.type('OptGraphicsFullscreenToggle::onAction:1', 'object') +bl.type('OptGraphicsResolutionMenu::init:1', 'object') +bl.type('OptGraphicsResolutionMenu::onSelect:1', 'object') +bl.type('OptRemapInputCtrl::onInputEvent:1', 'object') +bl.type('OptRemapList::doRemap:1', 'object') +bl.type('OptRemapList::fillList:1', 'object') +bl.type('OptScreenshotMenu::init:1', 'object') +bl.type('PE_EmitterEditor::onNewEmitter:1', 'object') +bl.type('PE_EmitterEditor::save:1', 'object') +bl.type('PE_EmitterEditor::updateControls:1', 'object') +bl.type('PE_EmitterEditor::updateEmitter:1', 'object') +bl.type('PE_ParticleEditor::onNewParticle:1', 'object') +bl.type('PE_ParticleEditor::save:1', 'object') +bl.type('PE_ParticleEditor::updateControls:1', 'object') +bl.type('PE_ParticleEditor::updateParticle:1', 'object') +bl.type('PSD_Window::SetAllPrintRatiosGui:1', 'object') +bl.type('PSD_Window::ShowAllPrintRatiosTab:1', 'object') +bl.type('PainHighImage::onDone:1', 'object') +bl.type('PainLowImage::onDone:1', 'object') +bl.type('PainMidImage::onDone:1', 'object') +bl.type('ParticleData.animateTexture', 'bool') +bl.type('ParticleData.useInvAlpha', 'bool') +bl.type('ParticleData::reload:1', 'object') +bl.type('ParticleEditor::initEditor:1', 'object') +bl.type('ParticleEditor::openEmitterPane:1', 'object') +bl.type('ParticleEditor::openParticlePane:1', 'object') +bl.type('ParticleEditor::resetEmitterNode:1', 'object') +bl.type('ParticleEditor::startup:1', 'object') +bl.type('ParticleEditor::updateEmitterNode:1', 'object') +bl.type('ParticleEmitterData.doDetail', 'bool') +bl.type('ParticleEmitterData.doFalloff', 'bool') +bl.type('ParticleEmitterData.orientOnVelocity', 'bool') +bl.type('ParticleEmitterData.orientParticles', 'bool') +bl.type('ParticleEmitterData.overrideAdvance', 'bool') +bl.type('ParticleEmitterData.useEmitterColors', 'bool') +bl.type('ParticleEmitterData.useEmitterSizes', 'bool') +bl.type('ParticleEmitterData::reload:1', 'object') +bl.type('ParticleEmitterNode.pointPlacement', 'bool') +bl.type('ParticleEmitterNode.spherePlacement', 'bool') +bl.type('ParticleEmitterNode::getEmitterDataBlock:1', 'object') +bl.type('ParticleEmitterNode::onRemove:1', 'object') +bl.type('ParticleEmitterNode::setColor:1', 'object') +bl.type('ParticleEmitterNode::setEmitterDataBlock:1', 'object') +bl.type('Path.isLooping', 'bool') +bl.type('Path::getPathId:1', 'object') +bl.type('PathCamera.canSetIFLs', 'bool') +bl.type('PathCamera::popFront:1', 'object') +bl.type('PathCamera::pushBack:1', 'object') +bl.type('PathCamera::pushFront:1', 'object') +bl.type('PathCamera::reset:1', 'object') +bl.type('PathCamera::setPosition:1', 'object') +bl.type('PathCamera::setState:1', 'object') +bl.type('PathCamera::setTarget:1', 'object') +bl.type('PathCameraData.emap', 'bool') +bl.type('PathCameraData.firstPersonOnly', 'bool') +bl.type('PathCameraData.inheritEnergyFromMount', 'bool') +bl.type('PathCameraData.isInvincible', 'bool') +bl.type('PathCameraData.observeThroughObject', 'bool') +bl.type('PathCameraData.renderWhenDestroyed', 'bool') +bl.type('PathCameraData.thirdPersonOnly', 'bool') +bl.type('PathCameraData.useEyePoint', 'bool') +bl.type('PhysicalZone.isWater', 'bool') +bl.type('PhysicalZone::activate:1', 'object') +bl.type('PhysicalZone::deactivate:1', 'object') +bl.type('PhysicalZone::sendUpdate:1', 'object') +bl.type('PhysicalZone::setAppliedForce:1', 'object') +bl.type('PhysicalZone::setWaterColor:1', 'object') +bl.type('PlayGui::createInvHUD:1', 'object') +bl.type('Player.canSetIFLs', 'bool') +bl.type('Player::ActivateStuff:1', 'object') +bl.type('Player::checkDismountPoint', 'bool') +bl.type('Player::checkDismountPoint:1', 'object') +bl.type('Player::clearControlObject:1', 'object') +bl.type('Player::emote:1', 'object') +bl.type('Player::getControlObject:1', 'object') +bl.type('Player::getHackPosition:1', 'object') +bl.type('Player::getMaxBackwardSpeed:1', 'object') +bl.type('Player::getMaxCrouchBackwardSpeed:1', 'object') +bl.type('Player::getMaxCrouchForwardSpeed:1', 'object') +bl.type('Player::getMaxCrouchSideSpeed:1', 'object') +bl.type('Player::getMaxForwardSpeed:1', 'object') +bl.type('Player::getMaxSideSpeed:1', 'object') +bl.type('Player::getMaxUnderwaterBackwardSpeed:1', 'object') +bl.type('Player::getMaxUnderwaterForwardSpeed:1', 'object') +bl.type('Player::getMaxUnderwaterSideSpeed:1', 'object') +bl.type('Player::getState:1', 'object') +bl.type('Player::getWorldSpaceMovement', 'bool') +bl.type('Player::getWorldSpaceMovement:1', 'object') +bl.type('Player::isCrouched', 'bool') +bl.type('Player::isCrouched:1', 'object') +bl.type('Player::isFirstPerson', 'bool') +bl.type('Player::isFirstPerson:1', 'object') +bl.type('Player::setActionThread', 'bool') +bl.type('Player::setActionThread:1', 'object') +bl.type('Player::setActionThread:3', 'bool') +bl.type('Player::setActionThread:4', 'bool') +bl.type('Player::setArmThread', 'bool') +bl.type('Player::setArmThread:1', 'object') +bl.type('Player::setControlObject', 'bool') +bl.type('Player::setControlObject:1', 'object') +bl.type('Player::setControlObject:2', 'object') +bl.type('Player::setDecalName:1', 'object') +bl.type('Player::setFaceName:1', 'object') +bl.type('Player::setHeadUp', 'bool') +bl.type('Player::setHeadUp:1', 'object') +bl.type('Player::setHeadUp:2', 'bool') +bl.type('Player::setLookLimits:1', 'object') +bl.type('Player::setMaxBackwardSpeed:1', 'object') +bl.type('Player::setMaxCrouchBackwardSpeed:1', 'object') +bl.type('Player::setMaxCrouchForwardSpeed:1', 'object') +bl.type('Player::setMaxCrouchSideSpeed:1', 'object') +bl.type('Player::setMaxForwardSpeed:1', 'object') +bl.type('Player::setMaxSideSpeed:1', 'object') +bl.type('Player::setMaxUnderwaterBackwardSpeed:1', 'object') +bl.type('Player::setMaxUnderwaterForwardSpeed:1', 'object') +bl.type('Player::setMaxUnderwaterSideSpeed:1', 'object') +bl.type('Player::setWorldSpaceMovement:1', 'object') +bl.type('Player::setWorldSpaceMovement:2', 'bool') +bl.type('PlayerData.canJet', 'bool') +bl.type('PlayerData.canRide', 'bool') +bl.type('PlayerData.emap', 'bool') +bl.type('PlayerData.firstPersonOnly', 'bool') +bl.type('PlayerData.inheritEnergyFromMount', 'bool') +bl.type('PlayerData.isInvincible', 'bool') +bl.type('PlayerData.observeThroughObject', 'bool') +bl.type('PlayerData.renderFirstPerson', 'bool') +bl.type('PlayerData.renderWhenDestroyed', 'bool') +bl.type('PlayerData.rideAble', 'bool') +bl.type('PlayerData.thirdPersonOnly', 'bool') +bl.type('PlayerData.useEyePoint', 'bool') +bl.type('PlayerData::onDriverLeave:1', 'object') +bl.type('PlayerSportArmor::onTrigger:1', 'object') +bl.type('PlayerSportTurboArmor::onTrigger:1', 'object') +bl.type('PlayerTeleportImage::onDone:1', 'object') +bl.type('Precipitation.doCollision', 'bool') +bl.type('Precipitation.rotateWithCamVel', 'bool') +bl.type('Precipitation.useTrueBillboards', 'bool') +bl.type('Precipitation.useTurbulence', 'bool') +bl.type('Precipitation::setPercentange:1', 'object') +bl.type('PrintGunImage::onFire:1', 'object') +bl.type('PrintGunImage::onHitObject:1', 'object') +bl.type('PrintSelectorDlg::onSleep:1', 'object') +bl.type('PrintSelectorDlg::onWake:1', 'object') +bl.type('Projectile.sourceObject', 'object') +bl.type('Projectile::Bounce:1', 'object') +bl.type('Projectile::Redirect:1', 'object') +bl.type('Projectile::explode:1', 'object') +bl.type('Projectile::getLastImpactNormal:1', 'object') +bl.type('Projectile::getLastImpactPosition:1', 'object') +bl.type('Projectile::getLastImpactVelocity:1', 'object') +bl.type('Projectile::getVelocity:1', 'object') +bl.type('Projectile::onAdd:1', 'object') +bl.type('Projectile::playSportBallSound:1', 'object') +bl.type('ProjectileData.collideWithPlayers', 'bool') +bl.type('ProjectileData.explodeOnDeath', 'bool') +bl.type('ProjectileData.explodeOnPlayerImpact', 'bool') +bl.type('ProjectileData.hasLight', 'bool') +bl.type('ProjectileData.hasWaterLight', 'bool') +bl.type('ProjectileData.isBallistic', 'bool') +bl.type('ProjectileData::Damage:1', 'object') +bl.type('ProjectileData::impactImpulse:1', 'object') +bl.type('ProjectileData::onCollision:1', 'object') +bl.type('ProjectileData::onExplode:1', 'object') +bl.type('ProjectileData::radiusDamage:1', 'object') +bl.type('ProjectileData::radiusImpulse:1', 'object') +bl.type('QueueSO::dumpVals:1', 'object') +bl.type('QueueSO::pop:1', 'object') +bl.type('QueueSO::push:1', 'object') +bl.type('QuotaObject.AutoDelete', 'bool') +bl.type('QuotaObject::dumpAllocs:1', 'object') +bl.type('QuotaObject::getAllocs_Schedules:1', 'object') +bl.type('QuotaObject::killObjects:1', 'object') +bl.type('QuotaObject::setAllocs_Environment:1', 'object') +bl.type('QuotaObject::setAllocs_Item:1', 'object') +bl.type('QuotaObject::setAllocs_Misc:1', 'object') +bl.type('QuotaObject::setAllocs_Player:1', 'object') +bl.type('QuotaObject::setAllocs_Projectile:1', 'object') +bl.type('QuotaObject::setAllocs_Schedules:1', 'object') +bl.type('QuotaObject::setAllocs_Vehicle:1', 'object') +bl.type('SA_directoryList::onSelect:1', 'object') +bl.type('SA_fileList::onSelect:1', 'object') +bl.type('SO_ClientTeam::addMember:1', 'object') +bl.type('SO_ClientTeam::removeMember:1', 'object') +bl.type('SO_ClientTeam::setCaptain:1', 'object') +bl.type('SO_ClientTeamManager::addTeam:1', 'object') +bl.type('SO_ClientTeamManager::dumpTeams:1', 'object') +bl.type('SO_ClientTeamManager::findTeamByID:1', 'object') +bl.type('SO_ClientTeamManager::removeTeam:1', 'object') +bl.type('SO_ClientTeamManager::setTeamName:1', 'object') +bl.type('SavingGui::onRender:1', 'object') +bl.type('SavingGui::onWake:1', 'object') +bl.type('SavingGui::save:1', 'object') +bl.type('SceneObject::getForwardVector:1', 'object') +bl.type('SceneObject::getObjectBox:1', 'object') +bl.type('SceneObject::getPosition:1', 'object') +bl.type('SceneObject::getScale:1', 'object') +bl.type('SceneObject::getTransform:1', 'object') +bl.type('SceneObject::getUpVector:1', 'object') +bl.type('SceneObject::getWorldBox:1', 'object') +bl.type('SceneObject::getWorldBoxCenter:1', 'object') +bl.type('SceneObject::setScale:1', 'object') +bl.type('SceneObject::setTransform:1', 'object') +bl.type('ScopeAlwaysShape.canSetIFLs', 'bool') +bl.type('ScriptObject::getVariable:1', 'object') +bl.type('ScriptObject::setVariable:1', 'object') +bl.type('SelectNetworkGui::onSleep:1', 'object') +bl.type('SelectNetworkGui::onWake:1', 'object') +bl.type('ServerSO::Display:1', 'object') +bl.type('ServerSO::serialize:1', 'object') +bl.type('ServerSettingsGui::ApplyVariablesToGui:1', 'object') +bl.type('ServerSettingsGui::ClickBack:1', 'object') +bl.type('ServerSettingsGui::clickInternet:1', 'object') +bl.type('ServerSettingsGui::clickLAN:1', 'object') +bl.type('ServerSettingsGui::clickLaunchGame:1', 'object') +bl.type('ServerSettingsGui::clickSinglePlayer:1', 'object') +bl.type('ServerSettingsGui::copyVariablesToPrefs:1', 'object') +bl.type('ServerSettingsGui::getVariablesFromFile:1', 'object') +bl.type('ServerSettingsGui::getVariablesFromGui:1', 'object') +bl.type('ServerSettingsGui::onRender:1', 'object') +bl.type('ServerSettingsGui::onWake:1', 'object') +bl.type('ShapeBase.canSetIFLs', 'bool') +bl.type('ShapeBase::applyDamage:1', 'object') +bl.type('ShapeBase::applyImpulse', 'bool') +bl.type('ShapeBase::applyImpulse:1', 'object') +bl.type('ShapeBase::applyRepair:1', 'object') +bl.type('ShapeBase::canCloak', 'bool') +bl.type('ShapeBase::canCloak:1', 'object') +bl.type('ShapeBase::disableNodeColor:1', 'object') +bl.type('ShapeBase::getCameraFov:1', 'object') +bl.type('ShapeBase::getControllingClient:1', 'object') +bl.type('ShapeBase::getControllingObject', 'object') +bl.type('ShapeBase::getControllingObject:1', 'object') +bl.type('ShapeBase::getDamageFlash:1', 'object') +bl.type('ShapeBase::getDamageLevel:1', 'object') +bl.type('ShapeBase::getDamagePercent:1', 'object') +bl.type('ShapeBase::getDamageState:1', 'object') +bl.type('ShapeBase::getEnergyLevel:1', 'object') +bl.type('ShapeBase::getEnergyPercent:1', 'object') +bl.type('ShapeBase::getEyePoint:1', 'object') +bl.type('ShapeBase::getEyeTransform:1', 'object') +bl.type('ShapeBase::getEyeVector:1', 'object') +bl.type('ShapeBase::getImageAmmo', 'bool') +bl.type('ShapeBase::getImageAmmo:1', 'object') +bl.type('ShapeBase::getImageLoaded', 'bool') +bl.type('ShapeBase::getImageLoaded:1', 'object') +bl.type('ShapeBase::getImageSkinTag:1', 'object') +bl.type('ShapeBase::getImageState:1', 'object') +bl.type('ShapeBase::getImageTrigger', 'bool') +bl.type('ShapeBase::getImageTrigger:1', 'object') +bl.type('ShapeBase::getMountNode:1', 'object') +bl.type('ShapeBase::getMountNodeObject', 'object') +bl.type('ShapeBase::getMountNodeObject:1', 'object') +bl.type('ShapeBase::getMountSlot:1', 'object') +bl.type('ShapeBase::getMountSlot:2', 'object') +bl.type('ShapeBase::getMountedImage:1', 'object') +bl.type('ShapeBase::getMountedObject', 'object') +bl.type('ShapeBase::getMountedObject:1', 'object') +bl.type('ShapeBase::getMountedObjectCount:1', 'object') +bl.type('ShapeBase::getMountedObjectNode', 'object') +bl.type('ShapeBase::getMountedObjectNode:1', 'object') +bl.type('ShapeBase::getMuzzlePoint:1', 'object') +bl.type('ShapeBase::getMuzzleVector:1', 'object') +bl.type('ShapeBase::getObjectMount', 'object') +bl.type('ShapeBase::getObjectMount:1', 'object') +bl.type('ShapeBase::getPendingImage:1', 'object') +bl.type('ShapeBase::getRechargeRate:1', 'object') +bl.type('ShapeBase::getRepairRate:1', 'object') +bl.type('ShapeBase::getShapeName:1', 'object') +bl.type('ShapeBase::getSkinName:1', 'object') +bl.type('ShapeBase::getSlotTransform:1', 'object') +bl.type('ShapeBase::getVelocity:1', 'object') +bl.type('ShapeBase::getWaterCoverage:1', 'object') +bl.type('ShapeBase::getWhiteOut:1', 'object') +bl.type('ShapeBase::hideNode:1', 'object') +bl.type('ShapeBase::isCloaked', 'bool') +bl.type('ShapeBase::isCloaked:1', 'object') +bl.type('ShapeBase::isDestroyed', 'bool') +bl.type('ShapeBase::isDestroyed:1', 'object') +bl.type('ShapeBase::isDisabled', 'bool') +bl.type('ShapeBase::isDisabled:1', 'object') +bl.type('ShapeBase::isEnabled', 'bool') +bl.type('ShapeBase::isEnabled:1', 'object') +bl.type('ShapeBase::isHidden', 'bool') +bl.type('ShapeBase::isHidden:1', 'object') +bl.type('ShapeBase::isImageFiring', 'bool') +bl.type('ShapeBase::isImageFiring:1', 'object') +bl.type('ShapeBase::isImageMounted', 'bool') +bl.type('ShapeBase::isImageMounted:1', 'object') +bl.type('ShapeBase::isImageMounted:2', 'object') +bl.type('ShapeBase::isMounted', 'bool') +bl.type('ShapeBase::isMounted:1', 'object') +bl.type('ShapeBase::isNodeVisible', 'bool') +bl.type('ShapeBase::isNodeVisible:1', 'object') +bl.type('ShapeBase::mountImage', 'bool') +bl.type('ShapeBase::mountImage:1', 'object') +bl.type('ShapeBase::mountImage:2', 'object') +bl.type('ShapeBase::mountImage:4', 'bool') +bl.type('ShapeBase::mountObject', 'bool') +bl.type('ShapeBase::mountObject:1', 'object') +bl.type('ShapeBase::mountObject:2', 'object') +bl.type('ShapeBase::mountObject:3', 'object') +bl.type('ShapeBase::pauseThread', 'bool') +bl.type('ShapeBase::pauseThread:1', 'object') +bl.type('ShapeBase::playAudio', 'bool') +bl.type('ShapeBase::playAudio:1', 'object') +bl.type('ShapeBase::playAudio:3', 'object') +bl.type('ShapeBase::playThread', 'bool') +bl.type('ShapeBase::playThread:1', 'object') +bl.type('ShapeBase::setCameraFov:1', 'object') +bl.type('ShapeBase::setCloaked:1', 'object') +bl.type('ShapeBase::setCloaked:2', 'bool') +bl.type('ShapeBase::setDamageFlash:1', 'object') +bl.type('ShapeBase::setDamageLevel:1', 'object') +bl.type('ShapeBase::setDamageState', 'bool') +bl.type('ShapeBase::setDamageState:1', 'object') +bl.type('ShapeBase::setDamageVector:1', 'object') +bl.type('ShapeBase::setEnergyLevel:1', 'object') +bl.type('ShapeBase::setHidden:1', 'object') +bl.type('ShapeBase::setHidden:2', 'bool') +bl.type('ShapeBase::setIflFrame:1', 'object') +bl.type('ShapeBase::setImageAmmo', 'bool') +bl.type('ShapeBase::setImageAmmo:1', 'object') +bl.type('ShapeBase::setImageAmmo:3', 'bool') +bl.type('ShapeBase::setImageLoaded', 'bool') +bl.type('ShapeBase::setImageLoaded:1', 'object') +bl.type('ShapeBase::setImageLoaded:3', 'bool') +bl.type('ShapeBase::setImageTrigger', 'bool') +bl.type('ShapeBase::setImageTrigger:1', 'object') +bl.type('ShapeBase::setImageTrigger:3', 'bool') +bl.type('ShapeBase::setNodeColor:1', 'object') +bl.type('ShapeBase::setRepairRate:1', 'object') +bl.type('ShapeBase::setShapeName:1', 'object') +bl.type('ShapeBase::setShapeNameColor:1', 'object') +bl.type('ShapeBase::setShapeNameDistance:1', 'object') +bl.type('ShapeBase::setSkinName:1', 'object') +bl.type('ShapeBase::setThreadDir', 'bool') +bl.type('ShapeBase::setThreadDir:1', 'object') +bl.type('ShapeBase::setThreadDir:3', 'bool') +bl.type('ShapeBase::setVelocity', 'bool') +bl.type('ShapeBase::setVelocity:1', 'object') +bl.type('ShapeBase::setWhiteOut:1', 'object') +bl.type('ShapeBase::startFade:1', 'object') +bl.type('ShapeBase::startFade:4', 'bool') +bl.type('ShapeBase::stopAudio', 'bool') +bl.type('ShapeBase::stopAudio:1', 'object') +bl.type('ShapeBase::stopThread', 'bool') +bl.type('ShapeBase::stopThread:1', 'object') +bl.type('ShapeBase::unHideNode:1', 'object') +bl.type('ShapeBase::unMountObject', 'bool') +bl.type('ShapeBase::unMountObject:1', 'object') +bl.type('ShapeBase::unMountObject:2', 'object') +bl.type('ShapeBase::unmount:1', 'object') +bl.type('ShapeBase::unmountImage', 'bool') +bl.type('ShapeBase::unmountImage:1', 'object') +bl.type('ShapeBaseData.emap', 'bool') +bl.type('ShapeBaseData.firstPersonOnly', 'bool') +bl.type('ShapeBaseData.inheritEnergyFromMount', 'bool') +bl.type('ShapeBaseData.isInvincible', 'bool') +bl.type('ShapeBaseData.observeThroughObject', 'bool') +bl.type('ShapeBaseData.renderWhenDestroyed', 'bool') +bl.type('ShapeBaseData.thirdPersonOnly', 'bool') +bl.type('ShapeBaseData.useEyePoint', 'bool') +bl.type('ShapeBaseData::Damage:1', 'object') +bl.type('ShapeBaseData::checkDeployPos', 'bool') +bl.type('ShapeBaseData::checkDeployPos:1', 'object') +bl.type('ShapeBaseData::getDeployTransform:1', 'object') +bl.type('ShapeBaseData::onInventory:1', 'object') +bl.type('ShapeBaseData::onPickup:1', 'object') +bl.type('ShapeBaseData::onThrow:1', 'object') +bl.type('ShapeBaseData::onUse:1', 'object') +bl.type('ShapeBaseImageData.accuFire', 'bool') +bl.type('ShapeBaseImageData.cloakable', 'bool') +bl.type('ShapeBaseImageData.correctMuzzleVector', 'bool') +bl.type('ShapeBaseImageData.doColorShift', 'bool') +bl.type('ShapeBaseImageData.emap', 'bool') +bl.type('ShapeBaseImageData.firstPerson', 'bool') +bl.type('ShapeBaseImageData.firstPersonParticles', 'bool') +bl.type('ShapeBaseImageData.stateAllowImageChange', 'bool') +bl.type('ShapeBaseImageData.stateDirection', 'bool') +bl.type('ShapeBaseImageData.stateEjectShell', 'bool') +bl.type('ShapeBaseImageData.stateFire', 'bool') +bl.type('ShapeBaseImageData.stateIgnoreLoadedForReady', 'bool') +bl.type('ShapeBaseImageData.stateSequenceRandomFlash', 'bool') +bl.type('ShapeBaseImageData.stateWaitForTimeout', 'bool') +bl.type('ShapeBaseImageData.usesEnergy', 'bool') +bl.type('ShapeBaseImageData::onBallTrigger:1', 'object') +bl.type('SharkHoleBot::onAdd:1', 'object') +bl.type('SharkHoleBot::onBotCollision:1', 'object') +bl.type('SharkHoleBot::onBotDamage:1', 'object') +bl.type('SharkHoleBot::onBotFollow:1', 'object') +bl.type('SharkHoleBot::onBotLoop:1', 'object') +bl.type('SharkHoleBot::onDisabled:1', 'object') +bl.type('SharkHoleBot::onEnterLiquid:1', 'object') +bl.type('SharkHoleBot::onNewDataBlock:1', 'object') +bl.type('SharkHoleBot::onRemove:1', 'object') +bl.type('SharkHoleBotBottom::onAdd:1', 'object') +bl.type('SharkHoleBotBottom::onBotCollision:1', 'object') +bl.type('SharkHoleBotBottom::onBotDamage:1', 'object') +bl.type('SharkHoleBotBottom::onBotLoop:1', 'object') +bl.type('SharkHoleBotBottom::onDisabled:1', 'object') +bl.type('SharkHoleBotBottom::onEnterLiquid:1', 'object') +bl.type('SharkHoleBotBottom::onNewDataBlock:1', 'object') +bl.type('SharkHoleBotBottom::onRemove:1', 'object') +bl.type('SharkHoleBotTop::onAdd:1', 'object') +bl.type('SharkHoleBotTop::onBotCollision:1', 'object') +bl.type('SharkHoleBotTop::onBotDamage:1', 'object') +bl.type('SharkHoleBotTop::onBotLoop:1', 'object') +bl.type('SharkHoleBotTop::onDisabled:1', 'object') +bl.type('SharkHoleBotTop::onEnterLiquid:1', 'object') +bl.type('SharkHoleBotTop::onNewDataBlock:1', 'object') +bl.type('SharkHoleBotTop::onRemove:1', 'object') +bl.type('SimGroup::CLIENTDumpNTNames:1', 'object') +bl.type('SimGroup::CLIENTaddNTName:1', 'object') +bl.type('SimGroup::CLIENTremoveNTName:1', 'object') +bl.type('SimGroup::ChainDeleteAll:1', 'object') +bl.type('SimGroup::ClearAllNTNames:1', 'object') +bl.type('SimGroup::DumpNTNames:1', 'object') +bl.type('SimGroup::addNTName:1', 'object') +bl.type('SimGroup::addPotentialTrust:1', 'object') +bl.type('SimGroup::addSpawnBrick:1', 'object') +bl.type('SimGroup::chainBlink:1', 'object') +bl.type('SimGroup::chainMethodCall:1', 'object') +bl.type('SimGroup::dumpSpawnPoints:1', 'object') +bl.type('SimGroup::getBrickSpawnPoint:1', 'object') +bl.type('SimGroup::getClient:1', 'object') +bl.type('SimGroup::getTrustFailureMessage:1', 'object') +bl.type('SimGroup::hasUser:1', 'object') +bl.type('SimGroup::indexOf:1', 'object') +bl.type('SimGroup::removeNTName:1', 'object') +bl.type('SimGroup::removeSpawnBrick:1', 'object') +bl.type('SimObject::SetEventEnabled:1', 'object') +bl.type('SimObject::ToggleEventEnabled:1', 'object') +bl.type('SimObject::addScheduledEvent:1', 'object') +bl.type('SimObject::call:1', 'object') +bl.type('SimObject::cancelEvents:1', 'object') +bl.type('SimObject::clearAttributes:1', 'object') +bl.type('SimObject::clearEvents:1', 'object') +bl.type('SimObject::clearNTObjectName:1', 'object') +bl.type('SimObject::copyAttributes:1', 'object') +bl.type('SimObject::delete:1', 'object') +bl.type('SimObject::dump:1', 'object') +bl.type('SimObject::dumpEvents:1', 'object') +bl.type('SimObject::getAttribute:1', 'object') +bl.type('SimObject::getClassName:1', 'object') +bl.type('SimObject::getGroup:1', 'object') +bl.type('SimObject::getId:1', 'object') +bl.type('SimObject::getName:1', 'object') +bl.type('SimObject::getTaggedField:1', 'object') +bl.type('SimObject::getType:1', 'object') +bl.type('SimObject::getVariable:1', 'object') +bl.type('SimObject::onCameraEnterOrbit:1', 'object') +bl.type('SimObject::onCameraLeaveOrbit:1', 'object') +bl.type('SimObject::processInputEvent:1', 'object') +bl.type('SimObject::save', 'bool') +bl.type('SimObject::save:1', 'object') +bl.type('SimObject::schedule:1', 'object') +bl.type('SimObject::scheduleNoQuota:1', 'object') +bl.type('SimObject::serializeEvent:1', 'object') +bl.type('SimObject::serializeEventToString:1', 'object') +bl.type('SimObject::setAttribute:1', 'object') +bl.type('SimObject::setNTObjectName:1', 'object') +bl.type('SimObject::setName:1', 'object') +bl.type('SimObject::setVariable:1', 'object') +bl.type('SimSet::add:1', 'object') +bl.type('SimSet::bringToFront:1', 'object') +bl.type('SimSet::clear:1', 'object') +bl.type('SimSet::clientDeleteAll:1', 'object') +bl.type('SimSet::deleteAll:1', 'object') +bl.type('SimSet::getCount:1', 'object') +bl.type('SimSet::getObject', 'object') +bl.type('SimSet::getObject:1', 'object') +bl.type('SimSet::isMember', 'bool') +bl.type('SimSet::isMember:1', 'object') +bl.type('SimSet::listObjects:1', 'object') +bl.type('SimSet::pushToBack:1', 'object') +bl.type('SimSet::remove:1', 'object') +bl.type('SkiItem::onUse:1', 'object') +bl.type('SkiWeaponImage::onFire:1', 'object') +bl.type('Sky.noRenderBans', 'bool') +bl.type('Sky.renderBottomTexture', 'bool') +bl.type('Sky.windEffectPrecipitation', 'bool') +bl.type('Sky::getWindVelocity:1', 'object') +bl.type('Sky::sendUpdate:1', 'object') +bl.type('Sky::setWindVelocity:1', 'object') +bl.type('SlayerClient::SendData:1', 'object') +bl.type('SlayerClient::clearAllData:1', 'object') +bl.type('SlayerClient::editMinigame:1', 'object') +bl.type('SlayerClient::onAdd:1', 'object') +bl.type('SlayerClient::onDisconnect:1', 'object') +bl.type('SlayerClient::onRemove:1', 'object') +bl.type('SlayerClient_GameModeHandlerSG::updateGameMode:1', 'object') +bl.type('SlayerClient_GameModeTemplateSG::applyDefaultPreferences:1', 'object') +bl.type('SlayerClient_GameModeTemplateSG::applyDefaultTeamPreferences:1', 'object') +bl.type('SlayerClient_GameModeTemplateSG::createDefaultTeams:1', 'object') +bl.type('SlayerClient_PrefHandlerSG::getPrefSO:1', 'object') +bl.type('SlayerClient_PrefSO::getDisplayValue:1', 'object') +bl.type('SlayerClient_PrefSO::getValue:1', 'object') +bl.type('SlayerClient_PrefSO::idiotProof:1', 'object') +bl.type('SlayerClient_PrefSO::onAdd:1', 'object') +bl.type('SlayerClient_PrefSO::onAdded:1', 'object') +bl.type('SlayerClient_PrefSO::setValue:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::addPref:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::clearPrefs:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::clearRules:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::displayRule:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::exportMinigamePreferences:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::exportPrefs:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::getPrefSO:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::importMinigamePreferences:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::sendPreferenceValues:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::updateDynamicRules:1', 'object') +bl.type('SlayerClient_ServerPrefHandlerSG::updateGUIValue:1', 'object') +bl.type('SlayerClient_ServerPrefSO::getDisplayValue:1', 'object') +bl.type('SlayerClient_ServerPrefSO::getValue:1', 'object') +bl.type('SlayerClient_ServerPrefSO::idiotProof:1', 'object') +bl.type('SlayerClient_ServerPrefSO::setValue:1', 'object') +bl.type('SlayerClient_Support::Debug:1', 'object') +bl.type('SlayerClient_Support::error:1', 'object') +bl.type('SlayerClient_Support::getIDFromUiName:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::addTeam:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::clearTeams:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::createTeam:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::getTeamFromID:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::getTeamFromName:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::onAdd:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::onRemove:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::removeTeam:1', 'object') +bl.type('SlayerClient_TeamHandlerSG::sendTeams:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::addPref:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::clearPrefs:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::exportTeamPreferences:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::getPrefSO:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::importTeamPreferences:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::resetPreferences:1', 'object') +bl.type('SlayerClient_TeamPrefHandlerSG::updateGUIValue:1', 'object') +bl.type('SlayerClient_TeamPrefSO::getDisplayValue:1', 'object') +bl.type('SlayerClient_TeamPrefSO::getValue:1', 'object') +bl.type('SlayerClient_TeamPrefSO::idiotProof:1', 'object') +bl.type('SlayerClient_TeamPrefSO::setValue:1', 'object') +bl.type('SlayerClient_helpTCP::handleText:1', 'object') +bl.type('SlayerClient_helpTCP::onDone:1', 'object') +bl.type('Slayer_Advanced::Refresh:1', 'object') +bl.type('Slayer_Advanced::apply:1', 'object') +bl.type('Slayer_Advanced::onWake:1', 'object') +bl.type('Slayer_Advanced_CategoryFilter::onSelect:1', 'object') +bl.type('Slayer_Advanced_Selector::onSelect:1', 'object') +bl.type('Slayer_CtrDisplay::addText:1', 'object') +bl.type('Slayer_CtrDisplay::onWake:1', 'object') +bl.type('Slayer_General::onWake:1', 'object') +bl.type('Slayer_General_Basic_Color::CreateColorMenu:1', 'object') +bl.type('Slayer_General_Basic_Color::clickColor:1', 'object') +bl.type('Slayer_General_Mode_Selector::onCancel:1', 'object') +bl.type('Slayer_General_Mode_Selector::onSelect:1', 'object') +bl.type('Slayer_General_Player::onPopUpMenuSelect:1', 'object') +bl.type('Slayer_Help::getHelpFile:1', 'object') +bl.type('Slayer_Help::loadOfflineHelpFile:1', 'object') +bl.type('Slayer_Help::onWake:1', 'object') +bl.type('Slayer_Main::Refresh:1', 'object') +bl.type('Slayer_Main::apply:1', 'object') +bl.type('Slayer_Main::onSleep:1', 'object') +bl.type('Slayer_Main::onWake:1', 'object') +bl.type('Slayer_Main::refreshFromServer:1', 'object') +bl.type('Slayer_Main_Announcements::addMessage:1', 'object') +bl.type('Slayer_Main_Announcements::clearMessages:1', 'object') +bl.type('Slayer_Main_Announcements::onSleep:1', 'object') +bl.type('Slayer_Main_Announcements::onWake:1', 'object') +bl.type('Slayer_Main_Announcements::removeMessage:1', 'object') +bl.type('Slayer_Main_Announcements::scrollText:1', 'object') +bl.type('Slayer_Main_Announcements::startScrolling:1', 'object') +bl.type('Slayer_Main_Favs::ClickFav:1', 'object') +bl.type('Slayer_Main_Favs::onWake:1', 'object') +bl.type('Slayer_Main_Favs::setFavs:1', 'object') +bl.type('Slayer_Main_Favs::updateFavs:1', 'object') +bl.type('Slayer_Main_TabList::onSelect:1', 'object') +bl.type('Slayer_Main_TabList::setSelectedByTab:1', 'object') +bl.type('Slayer_Main_Tabs::addTab:1', 'object') +bl.type('Slayer_Main_Tabs::lockTab:1', 'object') +bl.type('Slayer_Main_Tabs::removeTab:1', 'object') +bl.type('Slayer_Main_Tabs::setTab:1', 'object') +bl.type('Slayer_Options::Refresh:1', 'object') +bl.type('Slayer_Options::apply:1', 'object') +bl.type('Slayer_Options::onWake:1', 'object') +bl.type('Slayer_Options_Selector::onSelect:1', 'object') +bl.type('Slayer_PrefSO::getDisplayValue:1', 'object') +bl.type('Slayer_PrefSO::idiotProof:1', 'object') +bl.type('Slayer_Support::Benchmark:1', 'object') +bl.type('Slayer_Support::RgbToHex:1', 'object') +bl.type('Slayer_Support::getAverageColor:1', 'object') +bl.type('Slayer_Support::getClosestPaintColor:1', 'object') +bl.type('Slayer_Support::getDynamicVariable:1', 'object') +bl.type('Slayer_Support::isFloat:1', 'object') +bl.type('Slayer_Support::isItemInList:1', 'object') +bl.type('Slayer_Support::loadFiles:1', 'object') +bl.type('Slayer_Support::setDynamicVariable:1', 'object') +bl.type('Slayer_Support::stripTrailingZeros:1', 'object') +bl.type('Slayer_Support::swapItemsInList:1', 'object') +bl.type('Slayer_Teams::CreateColorMenu:1', 'object') +bl.type('Slayer_Teams::Refresh:1', 'object') +bl.type('Slayer_Teams::clickAddMember:1', 'object') +bl.type('Slayer_Teams::clickAdvanced:1', 'object') +bl.type('Slayer_Teams::clickApply:1', 'object') +bl.type('Slayer_Teams::clickCancel:1', 'object') +bl.type('Slayer_Teams::clickCreateTeam:1', 'object') +bl.type('Slayer_Teams::clickDeleteTeam:1', 'object') +bl.type('Slayer_Teams::clickEditUniform:1', 'object') +bl.type('Slayer_Teams::clickRemoveMember:1', 'object') +bl.type('Slayer_Teams::loadUniform:1', 'object') +bl.type('Slayer_Teams::onWake:1', 'object') +bl.type('Slayer_Teams::pickColor:1', 'object') +bl.type('Slayer_Teams::resetDatablockLists:1', 'object') +bl.type('Slayer_Teams::resetUniform:1', 'object') +bl.type('Slayer_Teams::saveUniform:1', 'object') +bl.type('Slayer_Teams::setLoadoutSync:1', 'object') +bl.type('Slayer_Teams_Advanced::apply:1', 'object') +bl.type('Slayer_Teams_Advanced::onWake:1', 'object') +bl.type('Slayer_Teams_Advanced_Selector::onSelect:1', 'object') +bl.type('Slayer_Teams_MovePlayerName::refreshList:1', 'object') +bl.type('Slayer_Teams_Selector::onDeleteKey:1', 'object') +bl.type('Slayer_Teams_Selector::onSelect:1', 'object') +bl.type('SpawnSphere.canSetIFLs', 'bool') +bl.type('StaticShape.canSetIFLs', 'bool') +bl.type('StaticShape::explode:1', 'object') +bl.type('StaticShapeData.emap', 'bool') +bl.type('StaticShapeData.firstPersonOnly', 'bool') +bl.type('StaticShapeData.inheritEnergyFromMount', 'bool') +bl.type('StaticShapeData.isInvincible', 'bool') +bl.type('StaticShapeData.noIndividualDamage', 'bool') +bl.type('StaticShapeData.observeThroughObject', 'bool') +bl.type('StaticShapeData.renderWhenDestroyed', 'bool') +bl.type('StaticShapeData.thirdPersonOnly', 'bool') +bl.type('StaticShapeData.useEyePoint', 'bool') +bl.type('StaticShapeData::Damage:1', 'object') +bl.type('StaticShapeData::create:1', 'object') +bl.type('StaticShapeData::onAdd:1', 'object') +bl.type('SteamAPI_Init', 'bool') +bl.type('SteamEnabled', 'bool') +bl.type('SteamGreenLightGui::ClickBack:1', 'object') +bl.type('SteamGreenLightGui::clickForward:1', 'object') +bl.type('SteamGreenLightGui::onRender:1', 'object') +bl.type('SteamGreenLightGui::onWake:1', 'object') +bl.type('SteamSetLobbyIP', 'bool') +bl.type('SteamSetLobbyPort', 'bool') +bl.type('Sun::sendUpdate:1', 'object') +bl.type('TCPObject::connect:1', 'object') +bl.type('TCPObject::delete:1', 'object') +bl.type('TCPObject::disconnect:1', 'object') +bl.type('TCPObject::listen:1', 'object') +bl.type('TCPObject::saveBufferToFile:1', 'object') +bl.type('TCPObject::send:1', 'object') +bl.type('TCPObject::setBinary:1', 'object') +bl.type('TCPObject::setBinary:2', 'bool') +bl.type('TCPObject::setBinarySize:1', 'object') +bl.type('TankShellProjectile::onCollision:1', 'object') +bl.type('TankSmokeImage::onDone:1', 'object') +bl.type('TankTurretPlayer::Damage:1', 'object') +bl.type('TankVehicle::Damage:1', 'object') +bl.type('Trigger::getNumObjects:1', 'object') +bl.type('Trigger::getObject:1', 'object') +bl.type('Trigger::onAdd:1', 'object') +bl.type('Trigger::removeObjectById', 'bool') +bl.type('Trigger::removeObjectById:1', 'object') +bl.type('TriggerData::onAdd:1', 'object') +bl.type('TriggerData::onEnterTrigger:1', 'object') +bl.type('TriggerData::onLeaveTrigger:1', 'object') +bl.type('TriggerData::onTickTrigger:1', 'object') +bl.type('TrustInviteGui::ClickAccept:1', 'object') +bl.type('TrustInviteGui::ClickIgnore:1', 'object') +bl.type('TrustInviteGui::ClickReject:1', 'object') +bl.type('TrustInviteGui::Ignore:1', 'object') +bl.type('VBOSupport', 'bool') +bl.type('Vehicle.canSetIFLs', 'bool') +bl.type('Vehicle.disableMove', 'bool') +bl.type('Vehicle::finalExplosion:1', 'object') +bl.type('Vehicle::lavaDamage:1', 'object') +bl.type('Vehicle::onActivate:1', 'object') +bl.type('Vehicle::onCollision:1', 'object') +bl.type('Vehicle::onDriverLeave:1', 'object') +bl.type('Vehicle::onRemove:1', 'object') +bl.type('Vehicle::setAngularVelocity:1', 'object') +bl.type('Vehicle::teleportEffect:1', 'object') +bl.type('Vehicle::tumbleCheck:1', 'object') +bl.type('VehicleData.cameraRoll', 'bool') +bl.type('VehicleData.emap', 'bool') +bl.type('VehicleData.firstPersonOnly', 'bool') +bl.type('VehicleData.inheritEnergyFromMount', 'bool') +bl.type('VehicleData.isInvincible', 'bool') +bl.type('VehicleData.observeThroughObject', 'bool') +bl.type('VehicleData.renderWhenDestroyed', 'bool') +bl.type('VehicleData.rideAble', 'bool') +bl.type('VehicleData.thirdPersonOnly', 'bool') +bl.type('VehicleData.useEyePoint', 'bool') +bl.type('VehicleData::onCollision:1', 'object') +bl.type('VehicleData::onDriverLeave:1', 'object') +bl.type('VehicleData::onEnterLiquid:1', 'object') +bl.type('VehicleData::onLeaveLiquid:1', 'object') +bl.type('VehicleSpawnMarker.canSetIFLs', 'bool') +bl.type('VehicleSpawnMarker.reColorVehicle', 'bool') +bl.type('VehicleSpawnMarker::getReColorVehicle', 'bool') +bl.type('VehicleSpawnMarker::getReColorVehicle:1', 'object') +bl.type('VehicleSpawnMarker::getUiName:1', 'object') +bl.type('VehicleSpawnMarker::onAdd:1', 'object') +bl.type('VehicleSpawnMarker::onRemove:1', 'object') +bl.type('VehicleSpawnMarker::setData:1', 'object') +bl.type('VehicleSpawnMarker::setData:3', 'bool') +bl.type('WandImage::onFire:1', 'object') +bl.type('WandImage::onHitObject:1', 'object') +bl.type('WandImage::onPreFire:1', 'object') +bl.type('WandImage::onStopFire:1', 'object') +bl.type('WandItem::onUse:1', 'object') +bl.type('WayPoint.canSetIFLs', 'bool') +bl.type('Weapon::onInventory:1', 'object') +bl.type('Weapon::onPickup:1', 'object') +bl.type('Weapon::onUse:1', 'object') +bl.type('WeaponImage::onFire:1', 'object') +bl.type('WeaponImage::onMount:1', 'object') +bl.type('WeaponImage::onUnMount:1', 'object') +bl.type('WheeledVehicle.canSetIFLs', 'bool') +bl.type('WheeledVehicle.disableMove', 'bool') +bl.type('WheeledVehicle::getWheelCount:1', 'object') +bl.type('WheeledVehicle::getWheelPowered', 'bool') +bl.type('WheeledVehicle::getWheelPowered:1', 'object') +bl.type('WheeledVehicle::setWheelPowered', 'bool') +bl.type('WheeledVehicle::setWheelPowered:1', 'object') +bl.type('WheeledVehicle::setWheelPowered:3', 'bool') +bl.type('WheeledVehicle::setWheelSpring', 'bool') +bl.type('WheeledVehicle::setWheelSpring:1', 'object') +bl.type('WheeledVehicle::setWheelSteering', 'bool') +bl.type('WheeledVehicle::setWheelSteering:1', 'object') +bl.type('WheeledVehicle::setWheelTire', 'bool') +bl.type('WheeledVehicle::setWheelTire:1', 'object') +bl.type('WheeledVehicleData.cameraRoll', 'bool') +bl.type('WheeledVehicleData.emap', 'bool') +bl.type('WheeledVehicleData.firstPersonOnly', 'bool') +bl.type('WheeledVehicleData.inheritEnergyFromMount', 'bool') +bl.type('WheeledVehicleData.isInvincible', 'bool') +bl.type('WheeledVehicleData.isSled', 'bool') +bl.type('WheeledVehicleData.observeThroughObject', 'bool') +bl.type('WheeledVehicleData.renderWhenDestroyed', 'bool') +bl.type('WheeledVehicleData.rideAble', 'bool') +bl.type('WheeledVehicleData.steeringUseAutoReturn', 'bool') +bl.type('WheeledVehicleData.steeringUseStrafeSteering', 'bool') +bl.type('WheeledVehicleData.thirdPersonOnly', 'bool') +bl.type('WheeledVehicleData.useEyePoint', 'bool') +bl.type('WheeledVehicleData::Damage:1', 'object') +bl.type('WheeledVehicleData::create:1', 'object') +bl.type('WheeledVehicleData::onAdd:1', 'object') +bl.type('WheeledVehicleData::onCollision:1', 'object') +bl.type('WheeledVehicleData::onDamage:1', 'object') +bl.type('WheeledVehicleData::onDriverLeave:1', 'object') +bl.type('WhoTalkSO::Display:1', 'object') +bl.type('WhoTalkSO::HasID:1', 'object') +bl.type('WhoTalkSO::addID:1', 'object') +bl.type('WhoTalkSO::removeID:1', 'object') +bl.type('WorldEditor.axisGizmoActive', 'bool') +bl.type('WorldEditor.boundingBoxCollision', 'bool') +bl.type('WorldEditor.clipToParent', 'bool') +bl.type('WorldEditor.enabled', 'bool') +bl.type('WorldEditor.isDirty', 'bool') +bl.type('WorldEditor.objectsUseBoxCenter', 'bool') +bl.type('WorldEditor.planarMovement', 'bool') +bl.type('WorldEditor.renderMissionArea', 'bool') +bl.type('WorldEditor.renderNav', 'bool') +bl.type('WorldEditor.renderObjHandle', 'bool') +bl.type('WorldEditor.renderObjText', 'bool') +bl.type('WorldEditor.renderPlane', 'bool') +bl.type('WorldEditor.renderPlaneHashes', 'bool') +bl.type('WorldEditor.renderPopupBackground', 'bool') +bl.type('WorldEditor.renderSelectionBox', 'bool') +bl.type('WorldEditor.selectionLocked', 'bool') +bl.type('WorldEditor.showMousePopupInfo', 'bool') +bl.type('WorldEditor.snapRotations', 'bool') +bl.type('WorldEditor.snapToGrid', 'bool') +bl.type('WorldEditor.toggleIgnoreList', 'bool') +bl.type('WorldEditor.visible', 'bool') +bl.type('WorldEditor::addUndoState:1', 'object') +bl.type('WorldEditor::canPasteSelection', 'bool') +bl.type('WorldEditor::canPasteSelection:1', 'object') +bl.type('WorldEditor::clearIgnoreList:1', 'object') +bl.type('WorldEditor::clearSelection:1', 'object') +bl.type('WorldEditor::copySelection:1', 'object') +bl.type('WorldEditor::deleteSelection:1', 'object') +bl.type('WorldEditor::dropSelection:1', 'object') +bl.type('WorldEditor::getMode:1', 'object') +bl.type('WorldEditor::getSelectedObject', 'object') +bl.type('WorldEditor::getSelectedObject:1', 'object') +bl.type('WorldEditor::getSelectionCentroid:1', 'object') +bl.type('WorldEditor::getSelectionSize:1', 'object') +bl.type('WorldEditor::hideSelection:1', 'object') +bl.type('WorldEditor::hideSelection:2', 'bool') +bl.type('WorldEditor::ignoreObjClass:1', 'object') +bl.type('WorldEditor::lockSelection:1', 'object') +bl.type('WorldEditor::lockSelection:2', 'bool') +bl.type('WorldEditor::pasteSelection:1', 'object') +bl.type('WorldEditor::redirectConsole:1', 'object') +bl.type('WorldEditor::redo:1', 'object') +bl.type('WorldEditor::selectObject:1', 'object') +bl.type('WorldEditor::selectObject:2', 'object') +bl.type('WorldEditor::setMode:1', 'object') +bl.type('WorldEditor::undo:1', 'object') +bl.type('WorldEditor::unselectObject:1', 'object') +bl.type('WorldEditor::unselectObject:2', 'object') +bl.type('WrenchImage::onFire:1', 'object') +bl.type('WrenchImage::onHitObject:1', 'object') +bl.type('WrenchImage::onPreFire:1', 'object') +bl.type('WrenchImage::onStopFire:1', 'object') +bl.type('WtfImage::onDone:1', 'object') +bl.type('ZombieHoleBot::onAdd:1', 'object') +bl.type('ZombieHoleBot::onBotCollision:1', 'object') +bl.type('ZombieHoleBot::onBotFollow:1', 'object') +bl.type('ZombieHoleBot::onBotLoop:1', 'object') +bl.type('aboutDlg::onWake:1', 'object') +bl.type('aboutText::onURL:1', 'object') +bl.type('activateKeyboard', 'bool') +bl.type('addBanGui::ban:1', 'object') +bl.type('addBanGui::clickForever:1', 'object') +bl.type('addBanGui::onSleep:1', 'object') +bl.type('addBanGui::onWake:1', 'object') +bl.type('addBanGui::setVictim:1', 'object') +bl.type('addCardProfile:11', 'bool') +bl.type('addCardProfile:12', 'bool') +bl.type('addCardProfile:13', 'bool') +bl.type('addCardProfile:3', 'bool') +bl.type('addCardProfile:4', 'bool') +bl.type('addCardProfile:5', 'bool') +bl.type('addCardProfile:6', 'bool') +bl.type('addCardProfile:7', 'bool') +bl.type('addCardProfile:8', 'bool') +bl.type('addCardProfile:9', 'bool') +bl.type('addMaterialMapping', 'bool') +bl.type('addOSCardProfile:3', 'bool') +bl.type('addOSCardProfile:4', 'bool') +bl.type('addOSCardProfile:5', 'bool') +bl.type('adminGui::ClickClearBricks:1', 'object') +bl.type('adminGui::ClickGameMode:1', 'object') +bl.type('adminGui::ClickServerSettings:1', 'object') +bl.type('adminGui::ban:1', 'object') +bl.type('adminGui::kick:1', 'object') +bl.type('adminGui::onWake:1', 'object') +bl.type('adminGui::openEnvGui:1', 'object') +bl.type('adminGui::sortList:1', 'object') +bl.type('adminGui::sortNumList:1', 'object') +bl.type('adminGui::spy:1', 'object') +bl.type('alxIsPlaying', 'bool') +bl.type('alxSetChannelVolume', 'bool') +bl.type('amIDrivingAVehicle', 'bool') +bl.type('amIStrafeSteering', 'bool') +bl.type('ammo::onInventory:1', 'object') +bl.type('authTCPobj_Client::onConnectFailed:1', 'object') +bl.type('authTCPobj_Client::onConnected:1', 'object') +bl.type('authTCPobj_Client::onDNSFailed:1', 'object') +bl.type('authTCPobj_Client::onDisconnect:1', 'object') +bl.type('authTCPobj_Client::onLine:1', 'object') +bl.type('authTCPobj_Server::onConnectFailed:1', 'object') +bl.type('authTCPobj_Server::onConnected:1', 'object') +bl.type('authTCPobj_Server::onDNSFailed:1', 'object') +bl.type('authTCPobj_Server::onDisconnect:1', 'object') +bl.type('authTCPobj_Server::onLine:1', 'object') +bl.type('basketballImage::onBallTrigger:1', 'object') +bl.type('basketballImage::onFire:1', 'object') +bl.type('basketballImage::onMount:1', 'object') +bl.type('basketballImage::onUnMount:1', 'object') +bl.type('basketballItem::onBallCollision:1', 'object') +bl.type('basketballItem::onUse:1', 'object') +bl.type('basketballProjectile::onCollision:1', 'object') +bl.type('basketballShootImage::onBallTrigger:1', 'object') +bl.type('basketballShootImage::onCharge:1', 'object') +bl.type('basketballShootImage::onFire:1', 'object') +bl.type('basketballShootImage::onMount:1', 'object') +bl.type('basketballShootImage::onUnMount:1', 'object') +bl.type('blankaBallImage::onAbortCharge:1', 'object') +bl.type('blankaBallImage::onCharge:1', 'object') +bl.type('blankaBallImage::onFire:1', 'object') +bl.type('blankaBallImage::onMount:1', 'object') +bl.type('blankaBallImage::onUnMount:1', 'object') +bl.type('blankaBallProjectile::onCollision:1', 'object') +bl.type('blinkPaintProjectile::onCollision:1', 'object') +bl.type('blueKeyImage::onFire:1', 'object') +bl.type('blueKeyImage::onHitObject:1', 'object') +bl.type('blueKeyImage::onPreFire:1', 'object') +bl.type('blueKeyImage::onStopFire:1', 'object') +bl.type('brick32xWaterData::disappear:1', 'object') +bl.type('brick32xWaterData::onClearFakeDeath:1', 'object') +bl.type('brick32xWaterData::onColorChange:1', 'object') +bl.type('brick32xWaterData::onDeath:1', 'object') +bl.type('brick32xWaterData::onFakeDeath:1', 'object') +bl.type('brick32xWaterData::onLoadPlant:1', 'object') +bl.type('brick32xWaterData::onPlant:1', 'object') +bl.type('brick32xWaterData::onRemove:1', 'object') +bl.type('brick32xWaterData::onTrustCheckFinished:1', 'object') +bl.type('brick32xWaterData::reappear:1', 'object') +bl.type('brick8xWaterData::disappear:1', 'object') +bl.type('brick8xWaterData::onClearFakeDeath:1', 'object') +bl.type('brick8xWaterData::onColorChange:1', 'object') +bl.type('brick8xWaterData::onDeath:1', 'object') +bl.type('brick8xWaterData::onFakeDeath:1', 'object') +bl.type('brick8xWaterData::onLoadPlant:1', 'object') +bl.type('brick8xWaterData::onPlant:1', 'object') +bl.type('brick8xWaterData::onRemove:1', 'object') +bl.type('brick8xWaterData::onTrustCheckFinished:1', 'object') +bl.type('brick8xWaterData::reappear:1', 'object') +bl.type('brick8xWaterRapidsData::disappear:1', 'object') +bl.type('brick8xWaterRapidsData::onClearFakeDeath:1', 'object') +bl.type('brick8xWaterRapidsData::onColorChange:1', 'object') +bl.type('brick8xWaterRapidsData::onDeath:1', 'object') +bl.type('brick8xWaterRapidsData::onFakeDeath:1', 'object') +bl.type('brick8xWaterRapidsData::onLoadPlant:1', 'object') +bl.type('brick8xWaterRapidsData::onPlant:1', 'object') +bl.type('brick8xWaterRapidsData::onRemove:1', 'object') +bl.type('brick8xWaterRapidsData::onTrustCheckFinished:1', 'object') +bl.type('brick8xWaterRapidsData::reappear:1', 'object') +bl.type('brick8xWaterRiverData::disappear:1', 'object') +bl.type('brick8xWaterRiverData::onClearFakeDeath:1', 'object') +bl.type('brick8xWaterRiverData::onColorChange:1', 'object') +bl.type('brick8xWaterRiverData::onDeath:1', 'object') +bl.type('brick8xWaterRiverData::onFakeDeath:1', 'object') +bl.type('brick8xWaterRiverData::onLoadPlant:1', 'object') +bl.type('brick8xWaterRiverData::onPlant:1', 'object') +bl.type('brick8xWaterRiverData::onRemove:1', 'object') +bl.type('brick8xWaterRiverData::onTrustCheckFinished:1', 'object') +bl.type('brick8xWaterRiverData::reappear:1', 'object') +bl.type('brickCheckpointData::onLoadPlant:1', 'object') +bl.type('brickCheckpointData::onPlant:1', 'object') +bl.type('brickCheckpointData::onPlayerTouch:1', 'object') +bl.type('brickDeployProjectile::onCollision:1', 'object') +bl.type('brickImage::onDeploy:1', 'object') +bl.type('brickSkullData::onPlant:1', 'object') +bl.type('brickSpawnPointData::onLoadPlant:1', 'object') +bl.type('brickSpawnPointData::onPlant:1', 'object') +bl.type('brickSpawnPointData::onRemove:1', 'object') +bl.type('brickTeledoorData::onLoadPlant:1', 'object') +bl.type('brickTeledoorData::onPlant:1', 'object') +bl.type('brickTeledoorData::onPlayerTouch:1', 'object') +bl.type('brickTeledoorData::onTrustCheckFinished:1', 'object') +bl.type('brickTreasureChestData::onDeath:1', 'object') +bl.type('brickTreasureChestData::onLoadPlant:1', 'object') +bl.type('brickTreasureChestData::onPlant:1', 'object') +bl.type('brickTreasureChestData::onRemove:1', 'object') +bl.type('brickTreasureChestData::openTreasureChest:1', 'object') +bl.type('brickVehicleSpawnData::onColorChange:1', 'object') +bl.type('calcExplosionCoverage:2', 'object') +bl.type('chromePaintProjectile::onCollision:1', 'object') +bl.type('colorGui::clickCancel:1', 'object') +bl.type('colorGui::doCallbacks:1', 'object') +bl.type('colorGui::done:1', 'object') +bl.type('colorGui::onSleep:1', 'object') +bl.type('colorGui::onWake:1', 'object') +bl.type('colorGui::popUp:1', 'object') +bl.type('colorGui::setMode:1', 'object') +bl.type('colorGui::update:1', 'object') +bl.type('commandToClient:1', 'object') +bl.type('compile', 'bool') +bl.type('connectingGui::cancel:1', 'object') +bl.type('connectingGui::onWake:1', 'object') +bl.type('containerBoxClear', 'bool') +bl.type('containerBoxEmpty', 'bool') +bl.type('containerRayCast:4', 'object') +bl.type('createCanvas', 'bool') +bl.type('createPath', 'bool') +bl.type('customAvatarGui::ClickX:1', 'object') +bl.type('customAvatarGui::onWake:1', 'object') +bl.type('customAvatar_modelSelect::onSelect:1', 'object') +bl.type('deathVehicle::onAdd:1', 'object') +bl.type('deathVehicle::onDriverLeave:1', 'object') +bl.type('deathVehicle::onImpact:1', 'object') +bl.type('deathVehicle::onRemove:1', 'object') +bl.type('deathVehicle::tumbleCheck:1', 'object') +bl.type('defaultControlsGui::apply:1', 'object') +bl.type('defaultControlsGui::clickClose:1', 'object') +bl.type('defaultControlsGui::onSleep:1', 'object') +bl.type('defaultControlsGui::onWake:1', 'object') +bl.type('discoverFile', 'bool') +bl.type('dodgeballImage::onBallTrigger:1', 'object') +bl.type('dodgeballImage::onCharge:1', 'object') +bl.type('dodgeballImage::onFire:1', 'object') +bl.type('dodgeballImage::onMount:1', 'object') +bl.type('dodgeballImage::onUnMount:1', 'object') +bl.type('dodgeballItem::onUse:1', 'object') +bl.type('dodgeballProjectile::onCollision:1', 'object') +bl.type('doesAllowConnections', 'bool') +bl.type('dofScreenShot', 'bool') +bl.type('enableJoystick', 'bool') +bl.type('enableMouse', 'bool') +bl.type('enableWinConsole:1', 'bool') +bl.type('escapeMenu::clickAdmin:1', 'object') +bl.type('escapeMenu::clickLoadBricks:1', 'object') +bl.type('escapeMenu::clickMinigames:1', 'object') +bl.type('escapeMenu::clickSaveBricks:1', 'object') +bl.type('escapeMenu::onWake:1', 'object') +bl.type('escapeMenu::toggle:1', 'object') +bl.type('exec', 'bool') +bl.type('fileCopy', 'bool') +bl.type('fileDelete', 'bool') +bl.type('filtersGui::onSleep:1', 'object') +bl.type('filtersGui::onWake:1', 'object') +bl.type('flatPaintProjectile::onCollision:1', 'object') +bl.type('footballImage::onAbortCharge:1', 'object') +bl.type('footballImage::onBallTrigger:1', 'object') +bl.type('footballImage::onCharge:1', 'object') +bl.type('footballImage::onFire:1', 'object') +bl.type('footballImage::onMount:1', 'object') +bl.type('footballImage::onUnMount:1', 'object') +bl.type('footballProjectile::onCollision:1', 'object') +bl.type('footballProjectile::onRest:1', 'object') +bl.type('fxDTSBrick.isBasePlate', 'bool') +bl.type('fxDTSBrick.isPlanted', 'bool') +bl.type('fxDTSBrick::canExplode', 'bool') +bl.type('fxDTSBrick::canExplode:1', 'object') +bl.type('fxDTSBrick::colorVehicle:1', 'object') +bl.type('fxDTSBrick::delete:1', 'object') +bl.type('fxDTSBrick::dumpDownList:1', 'object') +bl.type('fxDTSBrick::dumpUpList:1', 'object') +bl.type('fxDTSBrick::getAngleID:1', 'object') +bl.type('fxDTSBrick::getColorFxID:1', 'object') +bl.type('fxDTSBrick::getColorID:1', 'object') +bl.type('fxDTSBrick::getDataBlock:1', 'object') +bl.type('fxDTSBrick::getDestructionVolume:1', 'object') +bl.type('fxDTSBrick::getDistanceFromGround:1', 'object') +bl.type('fxDTSBrick::getDownBrick', 'object') +bl.type('fxDTSBrick::getDownBrick:1', 'object') +bl.type('fxDTSBrick::getExposedAreaBottom:1', 'object') +bl.type('fxDTSBrick::getExposedAreaEast:1', 'object') +bl.type('fxDTSBrick::getExposedAreaNorth:1', 'object') +bl.type('fxDTSBrick::getExposedAreaSouth:1', 'object') +bl.type('fxDTSBrick::getExposedAreaTop:1', 'object') +bl.type('fxDTSBrick::getExposedAreaWest:1', 'object') +bl.type('fxDTSBrick::getFakeDeadTime:1', 'object') +bl.type('fxDTSBrick::getLightId:1', 'object') +bl.type('fxDTSBrick::getNumDownBricks:1', 'object') +bl.type('fxDTSBrick::getNumUpBricks:1', 'object') +bl.type('fxDTSBrick::getPrintID:1', 'object') +bl.type('fxDTSBrick::getShapeFxID:1', 'object') +bl.type('fxDTSBrick::getUpBrick', 'object') +bl.type('fxDTSBrick::getUpBrick:1', 'object') +bl.type('fxDTSBrick::hasFakePathToGround', 'bool') +bl.type('fxDTSBrick::hasFakePathToGround:1', 'object') +bl.type('fxDTSBrick::hasPathToGround', 'bool') +bl.type('fxDTSBrick::hasPathToGround:1', 'object') +bl.type('fxDTSBrick::isBasePlate', 'bool') +bl.type('fxDTSBrick::isBasePlate:1', 'object') +bl.type('fxDTSBrick::isColliding', 'bool') +bl.type('fxDTSBrick::isColliding:1', 'object') +bl.type('fxDTSBrick::isDead', 'bool') +bl.type('fxDTSBrick::isDead:1', 'object') +bl.type('fxDTSBrick::isExposed', 'bool') +bl.type('fxDTSBrick::isExposed:1', 'object') +bl.type('fxDTSBrick::isFakeDead', 'bool') +bl.type('fxDTSBrick::isFakeDead:1', 'object') +bl.type('fxDTSBrick::isInSceneGraph', 'bool') +bl.type('fxDTSBrick::isInSceneGraph:1', 'object') +bl.type('fxDTSBrick::isInTree', 'bool') +bl.type('fxDTSBrick::isInTree:1', 'object') +bl.type('fxDTSBrick::isPlanted', 'bool') +bl.type('fxDTSBrick::isPlanted:1', 'object') +bl.type('fxDTSBrick::isRayCasting', 'bool') +bl.type('fxDTSBrick::isRayCasting:1', 'object') +bl.type('fxDTSBrick::isRendering', 'bool') +bl.type('fxDTSBrick::isRendering:1', 'object') +bl.type('fxDTSBrick::isTreeRendering', 'bool') +bl.type('fxDTSBrick::isTreeRendering:1', 'object') +bl.type('fxDTSBrick::killBrick:1', 'object') +bl.type('fxDTSBrick::onDeath:1', 'object') +bl.type('fxDTSBrick::onLoadPlant:1', 'object') +bl.type('fxDTSBrick::onRemove:1', 'object') +bl.type('fxDTSBrick::plant:1', 'object') +bl.type('fxDTSBrick::sendWrenchData:1', 'object') +bl.type('fxDTSBrick::setColliding:1', 'object') +bl.type('fxDTSBrick::setColliding:2', 'bool') +bl.type('fxDTSBrick::setColor:1', 'object') +bl.type('fxDTSBrick::setColorFX:1', 'object') +bl.type('fxDTSBrick::setDataBlock', 'bool') +bl.type('fxDTSBrick::setDataBlock:1', 'object') +bl.type('fxDTSBrick::setItem:1', 'object') +bl.type('fxDTSBrick::setItemPosition:1', 'object') +bl.type('fxDTSBrick::setItemRespawntime:1', 'object') +bl.type('fxDTSBrick::setPrint:1', 'object') +bl.type('fxDTSBrick::setRayCasting:1', 'object') +bl.type('fxDTSBrick::setRayCasting:2', 'bool') +bl.type('fxDTSBrick::setRendering:1', 'object') +bl.type('fxDTSBrick::setRendering:2', 'bool') +bl.type('fxDTSBrick::setShapeFX:1', 'object') +bl.type('fxDTSBrick::setTrusted:1', 'object') +bl.type('fxDTSBrick::setTrusted:2', 'bool') +bl.type('fxDTSBrick::trustCheckFinished:1', 'object') +bl.type('fxDTSBrick::willCauseChainKill', 'bool') +bl.type('fxDTSBrick::willCauseChainKill:1', 'object') +bl.type('fxDTSBrickData.alwaysShowWireFrame', 'bool') +bl.type('fxDTSBrickData.brickSizeX', 'object') +bl.type('fxDTSBrickData.brickSizeY', 'object') +bl.type('fxDTSBrickData.brickSizeZ', 'object') +bl.type('fxDTSBrickData.canCoverBottom', 'bool') +bl.type('fxDTSBrickData.canCoverEast', 'bool') +bl.type('fxDTSBrickData.canCoverNorth', 'bool') +bl.type('fxDTSBrickData.canCoverSouth', 'bool') +bl.type('fxDTSBrickData.canCoverTop', 'bool') +bl.type('fxDTSBrickData.canCoverWest', 'bool') +bl.type('fxDTSBrickData.hasPrint', 'bool') +bl.type('fxDTSBrickData.indestructable', 'bool') +bl.type('fxDTSBrickData.isWaterBrick', 'bool') +bl.type('fxDTSBrickData::disappear:1', 'object') +bl.type('fxDTSBrickData::getBlockArrayBit', 'bool') +bl.type('fxDTSBrickData::getBlockArrayBit:1', 'object') +bl.type('fxDTSBrickData::getMaxSide:1', 'object') +bl.type('fxDTSBrickData::getVolume:1', 'object') +bl.type('fxDTSBrickData::onAdd:1', 'object') +bl.type('fxDTSBrickData::onClearFakeDeath:1', 'object') +bl.type('fxDTSBrickData::onColorChange:1', 'object') +bl.type('fxDTSBrickData::onDeath:1', 'object') +bl.type('fxDTSBrickData::onFakeDeath:1', 'object') +bl.type('fxDTSBrickData::onLoadPlant:1', 'object') +bl.type('fxDTSBrickData::onPlant:1', 'object') +bl.type('fxDTSBrickData::onPlayerTouch:1', 'object') +bl.type('fxDTSBrickData::onRemove:1', 'object') +bl.type('fxDTSBrickData::onTeledoorEnter:1', 'object') +bl.type('fxDTSBrickData::onTeledoorExit:1', 'object') +bl.type('fxDTSBrickData::onTrustCheckFailed:1', 'object') +bl.type('fxDTSBrickData::onTrustCheckFinished:1', 'object') +bl.type('fxDTSBrickData::onUse:1', 'object') +bl.type('fxDTSBrickData::openTreasureChest:1', 'object') +bl.type('fxDTSBrickData::reappear:1', 'object') +bl.type('fxDayCycle.targetUseDefaultVector', 'bool') +bl.type('fxDayCycle::sendUpdate:1', 'object') +bl.type('fxDayCycle::setDayLength:1', 'object') +bl.type('fxDayCycle::setDayOffset:1', 'object') +bl.type('fxDayCycle::setEnabled:1', 'object') +bl.type('fxDayCycle::setEnabled:2', 'bool') +bl.type('fxLight.Enable', 'bool') +bl.type('fxLight::attachToBrick:1', 'object') +bl.type('fxLight::attachToBrick:2', 'object') +bl.type('fxLight::attachToObject:1', 'object') +bl.type('fxLight::attachToObject:2', 'object') +bl.type('fxLight::detachFromObject:1', 'object') +bl.type('fxLight::getPosition:1', 'object') +bl.type('fxLight::getTransform:1', 'object') +bl.type('fxLight::onRemove:1', 'object') +bl.type('fxLight::reset:1', 'object') +bl.type('fxLight::setEnable:1', 'object') +bl.type('fxLight::setEnable:2', 'bool') +bl.type('fxLightData.AnimBrightness', 'bool') +bl.type('fxLightData.AnimColor', 'bool') +bl.type('fxLightData.AnimOffsets', 'bool') +bl.type('fxLightData.AnimRadius', 'bool') +bl.type('fxLightData.AnimRotation', 'bool') +bl.type('fxLightData.ConstantSizeOn', 'bool') +bl.type('fxLightData.FlareOn', 'bool') +bl.type('fxLightData.FlareTP', 'bool') +bl.type('fxLightData.LerpBrightness', 'bool') +bl.type('fxLightData.LerpColor', 'bool') +bl.type('fxLightData.LerpOffset', 'bool') +bl.type('fxLightData.LerpRadius', 'bool') +bl.type('fxLightData.LerpRotation', 'bool') +bl.type('fxLightData.LightOn', 'bool') +bl.type('fxLightData.LinkFlare', 'bool') +bl.type('fxLightData.LinkFlareSize', 'bool') +bl.type('fxLightData.SingleColorKeys', 'bool') +bl.type('fxPlane.additiveBlend', 'bool') +bl.type('fxPlane.blend', 'bool') +bl.type('fxPlane.colorMultiply', 'bool') +bl.type('fxPlane.isSolid', 'bool') +bl.type('fxPlane::sendUpdate:1', 'object') +bl.type('fxSunLight.AnimAzimuth', 'bool') +bl.type('fxSunLight.AnimBrightness', 'bool') +bl.type('fxSunLight.AnimColor', 'bool') +bl.type('fxSunLight.AnimElevation', 'bool') +bl.type('fxSunLight.AnimRotation', 'bool') +bl.type('fxSunLight.AnimSize', 'bool') +bl.type('fxSunLight.Enable', 'bool') +bl.type('fxSunLight.FlareTP', 'bool') +bl.type('fxSunLight.LerpAzimuth', 'bool') +bl.type('fxSunLight.LerpBrightness', 'bool') +bl.type('fxSunLight.LerpColor', 'bool') +bl.type('fxSunLight.LerpElevation', 'bool') +bl.type('fxSunLight.LerpRotation', 'bool') +bl.type('fxSunLight.LerpSize', 'bool') +bl.type('fxSunLight.LinkFlareSize', 'bool') +bl.type('fxSunLight.LockToRealSun', 'bool') +bl.type('fxSunLight.SingleColorKeys', 'bool') +bl.type('fxSunLight::reset:1', 'object') +bl.type('fxSunLight::sendUpdate:1', 'object') +bl.type('fxSunLight::setAzimuthKeys:1', 'object') +bl.type('fxSunLight::setAzimuthTime:1', 'object') +bl.type('fxSunLight::setBlendMode:1', 'object') +bl.type('fxSunLight::setBlueKeys:1', 'object') +bl.type('fxSunLight::setBrightnessKeys:1', 'object') +bl.type('fxSunLight::setBrightnessTime:1', 'object') +bl.type('fxSunLight::setColorTime:1', 'object') +bl.type('fxSunLight::setElevationKeys:1', 'object') +bl.type('fxSunLight::setElevationTime:1', 'object') +bl.type('fxSunLight::setEnable:1', 'object') +bl.type('fxSunLight::setFadeTime:1', 'object') +bl.type('fxSunLight::setFlareBitmaps:1', 'object') +bl.type('fxSunLight::setFlareBrightness:1', 'object') +bl.type('fxSunLight::setFlareColor:1', 'object') +bl.type('fxSunLight::setFlareSize:1', 'object') +bl.type('fxSunLight::setFlareTP:1', 'object') +bl.type('fxSunLight::setGreenKeys:1', 'object') +bl.type('fxSunLight::setLerpAzimuth:1', 'object') +bl.type('fxSunLight::setLerpBrightness:1', 'object') +bl.type('fxSunLight::setLerpColor:1', 'object') +bl.type('fxSunLight::setLerpElevation:1', 'object') +bl.type('fxSunLight::setLerpRotation:1', 'object') +bl.type('fxSunLight::setLerpSize:1', 'object') +bl.type('fxSunLight::setLinkFlareSize:1', 'object') +bl.type('fxSunLight::setMaxAzimuth:1', 'object') +bl.type('fxSunLight::setMaxBrightness:1', 'object') +bl.type('fxSunLight::setMaxColor:1', 'object') +bl.type('fxSunLight::setMaxElevation:1', 'object') +bl.type('fxSunLight::setMaxRotation:1', 'object') +bl.type('fxSunLight::setMaxSize:1', 'object') +bl.type('fxSunLight::setMinAzimuth:1', 'object') +bl.type('fxSunLight::setMinBrightness:1', 'object') +bl.type('fxSunLight::setMinColor:1', 'object') +bl.type('fxSunLight::setMinElevation:1', 'object') +bl.type('fxSunLight::setMinRotation:1', 'object') +bl.type('fxSunLight::setMinSize:1', 'object') +bl.type('fxSunLight::setRedKeys:1', 'object') +bl.type('fxSunLight::setRotationKeys:1', 'object') +bl.type('fxSunLight::setRotationTime:1', 'object') +bl.type('fxSunLight::setSingleColorKeys:1', 'object') +bl.type('fxSunLight::setSizeKeys:1', 'object') +bl.type('fxSunLight::setSizeTime:1', 'object') +bl.type('fxSunLight::setSunAzimuth:1', 'object') +bl.type('fxSunLight::setSunElevation:1', 'object') +bl.type('fxSunLight::setUseAzimuth:1', 'object') +bl.type('fxSunLight::setUseBrightness:1', 'object') +bl.type('fxSunLight::setUseColor:1', 'object') +bl.type('fxSunLight::setUseElevation:1', 'object') +bl.type('fxSunLight::setUseRotation:1', 'object') +bl.type('fxSunLight::setUseSize:1', 'object') +bl.type('getBrickLimit', 'object') +bl.type('getCurrentQuotaObject', 'object') +bl.type('getParticleDisconnectMode', 'bool') +bl.type('glTexImage3D', 'bool') +bl.type('glowPaintProjectile::onCollision:1', 'object') +bl.type('greenKeyImage::onFire:1', 'object') +bl.type('greenKeyImage::onHitObject:1', 'object') +bl.type('greenKeyImage::onPreFire:1', 'object') +bl.type('greenKeyImage::onStopFire:1', 'object') +bl.type('gunImage::onFire:1', 'object') +bl.type('hammerImage::onFire:1', 'object') +bl.type('hammerImage::onHitObject:1', 'object') +bl.type('hammerImage::onPreFire:1', 'object') +bl.type('hammerImage::onStopFire:1', 'object') +bl.type('hatTCPObj::onConnectFailed:1', 'object') +bl.type('hatTCPObj::onConnected:1', 'object') +bl.type('hatTCPObj::onDNSFailed:1', 'object') +bl.type('hatTCPObj::onDisconnect:1', 'object') +bl.type('hatTCPObj::onLine:1', 'object') +bl.type('horseBasketballImage::onBallTrigger:1', 'object') +bl.type('horseBasketballImage::onFire:1', 'object') +bl.type('horseBasketballImage::onMount:1', 'object') +bl.type('horseBasketballImage::onUnMount:1', 'object') +bl.type('horseDodgeballImage::onBallTrigger:1', 'object') +bl.type('horseDodgeballImage::onFire:1', 'object') +bl.type('horseDodgeballImage::onMount:1', 'object') +bl.type('horseDodgeballImage::onUnMount:1', 'object') +bl.type('horseFootballImage::onBallTrigger:1', 'object') +bl.type('horseFootballImage::onCharge:1', 'object') +bl.type('horseFootballImage::onFire:1', 'object') +bl.type('horseFootballImage::onMount:1', 'object') +bl.type('horseFootballImage::onUnMount:1', 'object') +bl.type('horseRayImage::onFire:1', 'object') +bl.type('horseRayProjectile::Damage:1', 'object') +bl.type('horseSoccerBallImage::onBallTrigger:1', 'object') +bl.type('horseSoccerBallImage::onFire:1', 'object') +bl.type('horseSoccerBallImage::onMount:1', 'object') +bl.type('horseSoccerBallImage::onUnMount:1', 'object') +bl.type('horseSoccerBallStandImage::onBallTrigger:1', 'object') +bl.type('horseSoccerBallStandImage::onFire:1', 'object') +bl.type('horseSoccerBallStandImage::onMount:1', 'object') +bl.type('horseSoccerBallStandImage::onUnMount:1', 'object') +bl.type('isDeviceFullScreenOnly', 'bool') +bl.type('isEventPending', 'bool') +bl.type('isFile', 'bool') +bl.type('isFullScreen', 'bool') +bl.type('isFunction', 'bool') +bl.type('isJoystickDetected', 'bool') +bl.type('isKoreanBuild', 'bool') +bl.type('isLANAddress', 'bool') +bl.type('isMacintosh', 'bool') +bl.type('isObject', 'bool') +bl.type('isPackage', 'bool') +bl.type('isUnlocked', 'bool') +bl.type('isWindows', 'bool') +bl.type('isWriteableFileName', 'bool') +bl.type('jelloPaintProjectile::onCollision:1', 'object') +bl.type('joinMiniGameGui::ClickLeave:1', 'object') +bl.type('joinMiniGameGui::onWake:1', 'object') +bl.type('lockMouse:1', 'bool') +bl.type('mm_Fade::OnWait:1', 'object') +bl.type('mm_Fade::onDone:1', 'object') +bl.type('newMessageHud::onSleep:1', 'object') +bl.type('newMessageHud::onWake:1', 'object') +bl.type('newMessageHud::open:1', 'object') +bl.type('newMessageHud::updatePosition:1', 'object') +bl.type('newMessageHud::updateTypePosition:1', 'object') +bl.type('nextResolution', 'bool') +bl.type('noHudGui::onRender:1', 'object') +bl.type('noHudGui::onSleep:1', 'object') +bl.type('noHudGui::onWake:1', 'object') +bl.type('optionsDlg::RemapAll:1', 'object') +bl.type('optionsDlg::RemapNext:1', 'object') +bl.type('optionsDlg::UpdateAvailableShaders:1', 'object') +bl.type('optionsDlg::applyGraphics:1', 'object') +bl.type('optionsDlg::clearAllBinds:1', 'object') +bl.type('optionsDlg::clickLatencyOption:1', 'object') +bl.type('optionsDlg::onSleep:1', 'object') +bl.type('optionsDlg::onWake:1', 'object') +bl.type('optionsDlg::setBrickFXQuality:1', 'object') +bl.type('optionsDlg::setDefaultBinds:1', 'object') +bl.type('optionsDlg::setLightingQuality:1', 'object') +bl.type('optionsDlg::setPane:1', 'object') +bl.type('optionsDlg::setParticleQuality:1', 'object') +bl.type('optionsDlg::setPhysicsQuality:1', 'object') +bl.type('optionsDlg::setShaderQuality:1', 'object') +bl.type('optionsDlg::setTextureQuality:1', 'object') +bl.type('optionsDlg::updateDrawDistanceBlocker:1', 'object') +bl.type('optionsDlg::updateFOV:1', 'object') +bl.type('optionsDlg::updateMaxViewDistance:1', 'object') +bl.type('optionsDlg::updateTempBrickBlockers:1', 'object') +bl.type('paintProjectile::onCollision:1', 'object') +bl.type('pearlPaintProjectile::onCollision:1', 'object') +bl.type('playJournal:2', 'bool') +bl.type('postServerTCPObj::onConnectFailed:1', 'object') +bl.type('postServerTCPObj::onConnected:1', 'object') +bl.type('postServerTCPObj::onDNSFailed:1', 'object') +bl.type('postServerTCPObj::onDisconnect:1', 'object') +bl.type('postServerTCPObj::onLine:1', 'object') +bl.type('prevResolution', 'bool') +bl.type('protocolRegistryCheck', 'bool') +bl.type('pushBroomImage::onFire:1', 'object') +bl.type('pushBroomImage::onStopFire:1', 'object') +bl.type('queryMasterTCPObj::onConnectFailed:1', 'object') +bl.type('queryMasterTCPObj::onConnected:1', 'object') +bl.type('queryMasterTCPObj::onDNSFailed:1', 'object') +bl.type('queryMasterTCPObj::onDisconnect:1', 'object') +bl.type('queryMasterTCPObj::onLine:1', 'object') +bl.type('rainbowPaintProjectile::onCollision:1', 'object') +bl.type('recordingsDlg::onWake:1', 'object') +bl.type('redKeyImage::onFire:1', 'object') +bl.type('redKeyImage::onHitObject:1', 'object') +bl.type('redKeyImage::onPreFire:1', 'object') +bl.type('redKeyImage::onStopFire:1', 'object') +bl.type('redbookClose', 'bool') +bl.type('redbookOpen', 'bool') +bl.type('redbookPlay', 'bool') +bl.type('redbookSetVolume', 'bool') +bl.type('redbookStop', 'bool') +bl.type('regNameGui::onClose:1', 'object') +bl.type('regNameGui::onSleep:1', 'object') +bl.type('regNameGui::onType:1', 'object') +bl.type('regNameGui::onWake:1', 'object') +bl.type('regNameGui::register:1', 'object') +bl.type('regName_tcpObj::onConnectFailed:1', 'object') +bl.type('regName_tcpObj::onConnected:1', 'object') +bl.type('regName_tcpObj::onDNSFailed:1', 'object') +bl.type('regName_tcpObj::onDisconnect:1', 'object') +bl.type('regName_tcpObj::onLine:1', 'object') +bl.type('saveBricksGui::onSleep:1', 'object') +bl.type('saveBricksGui::onWake:1', 'object') +bl.type('screenShot', 'bool') +bl.type('selectBLIDGui::onSleep:1', 'object') +bl.type('selectBLIDGui::onWake:1', 'object') +bl.type('selectBLIDGui::select:1', 'object') +bl.type('sendTimeScaleToClient:1', 'object') +bl.type('servAuthTCPobj::onConnectFailed:1', 'object') +bl.type('servAuthTCPobj::onConnected:1', 'object') +bl.type('servAuthTCPobj::onDNSFailed:1', 'object') +bl.type('servAuthTCPobj::onLine:1', 'object') +bl.type('serverCmdSymbolHandeler', 'bool') +bl.type('setClipboard', 'bool') +bl.type('setCurrentQuotaObject:1', 'object') +bl.type('setDisplayDevice', 'bool') +bl.type('setDisplayDevice:5', 'bool') +bl.type('setEchoFileLoads:1', 'bool') +bl.type('setJoinIP_tcpObj::onLine:1', 'object') +bl.type('setNetPort', 'bool') +bl.type('setRes', 'bool') +bl.type('setScreenMode', 'bool') +bl.type('setScreenMode:4', 'bool') +bl.type('setServerInfo', 'bool') +bl.type('setVerticalSync', 'bool') +bl.type('setVerticalSync:1', 'bool') +bl.type('skiVehicle::onAdd:1', 'object') +bl.type('skiVehicle::onDriverLeave:1', 'object') +bl.type('skiVehicle::onImpact:1', 'object') +bl.type('skiVehicle::onUnMount:1', 'object') +bl.type('skiVehicle::onWreck:1', 'object') +bl.type('soccerBallImage::onBallTrigger:1', 'object') +bl.type('soccerBallImage::onCharge:1', 'object') +bl.type('soccerBallImage::onFire:1', 'object') +bl.type('soccerBallImage::onMount:1', 'object') +bl.type('soccerBallImage::onUnMount:1', 'object') +bl.type('soccerBallItem::onBallCollision:1', 'object') +bl.type('soccerBallItem::onUse:1', 'object') +bl.type('soccerBallProjectile::onCollision:1', 'object') +bl.type('soccerBallProjectile::onRest:1', 'object') +bl.type('soccerBallStandImage::onBallTrigger:1', 'object') +bl.type('soccerBallStandImage::onFire:1', 'object') +bl.type('soccerBallStandImage::onMount:1', 'object') +bl.type('soccerBallStandImage::onUnMount:1', 'object') +bl.type('spearImage::onAbortCharge:1', 'object') +bl.type('spearImage::onCharge:1', 'object') +bl.type('spearImage::onFire:1', 'object') +bl.type('stablePaintProjectile::onCollision:1', 'object') +bl.type('swirlPaintProjectile::onCollision:1', 'object') +bl.type('switchBitDepth', 'bool') +bl.type('swordImage::onPreFire:1', 'object') +bl.type('swordImage::onStopFire:1', 'object') +bl.type('ti_tcp::onConnectFailed:1', 'object') +bl.type('ti_tcp::onConnected:1', 'object') +bl.type('ti_tcp::onDisconnect:1', 'object') +bl.type('ti_tcp::onLine:1', 'object') +bl.type('toggleFullScreen', 'bool') +bl.type('trace:1', 'bool') +bl.type('unBanGui::clickUnBan:1', 'object') +bl.type('unBanGui::onSleep:1', 'object') +bl.type('unBanGui::onWake:1', 'object') +bl.type('unBanGui::sortList:1', 'object') +bl.type('unBanGui::sortNumList:1', 'object') +bl.type('unBanGui::unBan:1', 'object') +bl.type('upnpAdd', 'bool') +bl.type('wrenchBotDlg::LoadDataBlocks:1', 'object') +bl.type('wrenchBotDlg::Respawn:1', 'object') +bl.type('wrenchBotDlg::botOff:1', 'object') +bl.type('wrenchBotDlg::botOn:1', 'object') +bl.type('wrenchBotDlg::onSleep:1', 'object') +bl.type('wrenchBotDlg::onWake:1', 'object') +bl.type('wrenchBotDlg::send:1', 'object') +bl.type('wrenchDlg::onWake:1', 'object') +bl.type('wrenchEventsDlg::createTargetList:1', 'object') +bl.type('wrenchSoundDlg::onWake:1', 'object') +bl.type('wrenchVehicleSpawnDlg::onWake:1', 'object') +bl.type('yellowKeyImage::onFire:1', 'object') +bl.type('yellowKeyImage::onHitObject:1', 'object') +bl.type('yellowKeyImage::onPreFire:1', 'object') +bl.type('yellowKeyImage::onStopFire:1', 'object') + +-- Parsed from dumpConsoleClasses() and dumpConsoleFunctions() and manually verified +bl.type('GuiCanvas::getContent', 'object') +bl.type('ParticleEmitterNode::getEmitterDataBlock', 'object') +bl.type('ShapeBase::getControllingClient', 'object') +bl.type('ShapeBase::getMountedImage', 'object') +bl.type('ShapeBase::getPendingImage', 'object') +bl.type('SimObject::getGroup', 'object') +bl.type('containerSearchNext', 'object') +bl.type('fxDTSBrick.client', 'object') +bl.type('getDataBlock', 'object') +bl.type('alxPlay:1', 'object') + +-- Manually entered +bl.type('ShapeBase::getControlObject', 'object') +bl.type('GameConnection::getControlObject', 'object') +bl.type('GameBase::setDataBlock:2', 'object') +bl.type('NetObject::clearScopeToClient:2', 'object') + +print(' Executed libbl-types.lua') diff --git a/src/util/libbl.lua b/src/util/libbl.lua new file mode 100644 index 0000000..a5a60a8 --- /dev/null +++ b/src/util/libbl.lua @@ -0,0 +1,840 @@ +-- bl library +-- Main lua-side functionality of bllua, +-- provided through the global table 'bl.' + +-- todo: set + +local _bllua_ts = ts + +bl = bl or {} + +-- Misc +-- Apply a function to each element in a list, building a new list from the returns +local function map(t,f) + local u = {} + for i,v in ipairs(t) do + u[i] = f(v) + end + return u +end +local function isValidFuncName(name) + return type(name)=='string' and name:find('^[a-zA-Z0-9_]+$') +end +local function isValidFuncNameNs(name) + return type(name)=='string' and ( + name:find('^[a-zA-Z0-9_]+$') or + name:find('^[a-zA-Z0-9_]+::[a-zA-Z0-9_]+$') ) +end +local function isValidFuncNameNsArgn(name) + return type(name)=='string' and ( + name:find('^[a-zA-Z0-9_]+$') or + name:find('^[a-zA-Z0-9_]+%.[a-zA-Z0-9_]+$') or + name:find('^[a-zA-Z0-9_]+::[a-zA-Z0-9_]+$') or + name:find('^[a-zA-Z0-9_]+:[0-9]+$') or + name:find('^[a-zA-Z0-9_]+::[a-zA-Z0-9_]+:[0-9]+$') ) +end +-- Whether a var can be converted into a TS vector +local function isTsVector(val) + if type(val)~='table' then return false end + if #val~=3 and #val~=2 then return false end + if val.__is_vector then return true end + for _,v in ipairs(val) do + if type(v)~='number' then return false end + end + return true +end +-- Use strings for object types instead of integer bitmasks like in TS +local tsTypesByName = { + ['all'] = -1, + ['static'] = 1, + ['environment'] = 2, + ['terrain'] = 4, + ['water'] = 16, + ['trigger'] = 32, + ['marker'] = 64, + ['gamebase'] = 1024, + ['shapebase'] = 2048, + ['camera'] = 4096, + ['staticshape'] = 8192, + ['player'] = 16384, + ['item'] = 32768, + ['vehicle'] = 65536, + ['vehicleblocker'] = 131072, + ['projectile'] = 262144, + ['explosion'] = 524288, + ['corpse'] = 1048576, + ['debris'] = 4194304, + ['physicalzone'] = 8388608, + ['staticts'] = 16777216, + ['brick'] = 33554432, + ['brickalways'] = 67108864, + ['staticrendered'] = 134217728, + ['damagableitem'] = 268435456, +} +local tsTypesByNum = {} +for k,v in pairs(tsTypesByName) do + tsTypesByNum[v] = k +end + +-- Type conversion +local toTsObject +-- Convert a string from TS into a boolean +-- Note: Nonempty nonnumeric strings evaluate to 1, unlike in TS +local function tsBool(v) return v~='' and v~='0' end +-- Convert a Lua var into a TS string, or error if not possible +local function valToTs(val) + if val==nil then -- nil -> '' + return '' + elseif type(val)=='boolean' then -- bool -> 0 or 1 + return val and '1' or '0' + elseif type(val)=='number' then -- number + return tostring(val) + elseif type(val)=='string' then -- string + return val + elseif type(val)=='table' then + if val._tsObjectId then -- object -> object id + return tostring(val._tsObjectId) + elseif isTsVector(val) then -- vector - > 3 numbers + return table.concat(val, ' ') + elseif #val==2 and isTsVector(val[1]) and isTsVector(val[2]) then + -- box - > 6 numbers + return table.concat(val[1], ' ')..' '..table.concat(val[2], ' ') + else + error('valToTs: could not convert table', 3) + end + else + error('valToTs: could not convert '..type(val), 3) + end +end +bl._forceType = bl._forceType or {} +local function valFromTs(val, name) + if type(val)~='string' then + error('valFromTs: expected string, got '..type(val), 3) end + if name then + local nameL = name:lower() + if bl._forceType[nameL] then + local typ = bl._forceType[nameL] + if typ=='boolean' then + return tsBool(val) + elseif typ=='object' then + return toTsObject(val) + else + error('valFromTs: invalid force type '..typ, 3) + end + end + end + -- '' -> nil + if val=='' then return nil end + -- number + local num = tonumber(val) + if num then return num end + -- vector + local xS,yS,zS = val:match('^(%-?[0-9%.e]+) (%-?[0-9%.e]+) (%-?[0-9%.e]+)$') + if xS then return vector{tonumber(xS),tonumber(yS),tonumber(zS)} end + local x1S,y1S,z1S,x2S,y2S,z2S = val:match( + '^(%-?[0-9%.e]+) (%-?[0-9%.e]+) (%-?[0-9%.e]+) '.. + '(%-?[0-9%.e]+) (%-?[0-9%.e]+) (%-?[0-9%.e]+)$') + -- box (2 vectors) + if x1S then return { + vector{tonumber(x1S),tonumber(y1S),tonumber(z1S)}, + vector{tonumber(x2S),tonumber(y2S),tonumber(z2S)} } end + -- string + return val +end +local function arglistFromTs(name, argsS) + local args = {} + for i,arg in ipairs(argsS) do + args[i] = valFromTs(arg, name..':'..i) + end + return args +end +local function arglistToTs(args) + return map(args, valToTs) +end +function bl.type(name,typ) + if typ~='bool' and typ~='boolean' and typ~='object' and typ~=nil then + error('bl.type: can only set type to \'bool\' or \'object\' or nil', 2) end + if not isValidFuncNameNsArgn(name) then + error('bl.type: invalid function or variable name \''..name..'\'', 2) end + if typ=='bool' then typ='boolean' end + bl._forceType[name:lower()] = typ +end + + +-- Value detection + +local function isTsObject(t) + return type(t)=='table' and t._tsObjectId~=nil +end + +local function tsIsObject(name) return tsBool(_bllua_ts.call('isObject', name)) end +local function tsIsFunction(name) return tsBool(_bllua_ts.call('isFunction', name)) end +local function tsIsFunctionNs(ns, name) return tsBool(_bllua_ts.call('isFunction', ns, name)) end +local function tsIsFunctionNsname(nsname) + local ns, name = nsname:match('^([^:]+)::([^:]+)$') + if ns then return tsIsFunctionNs(ns, name) + else return tsIsFunction(nsname) end +end + +function bl.isObject(obj) + if isTsObject(obj) then + obj = obj._tsObjectId + elseif type(obj)=='number' then + obj = tostring(obj) + elseif type(obj)~='string' then + error('bl.isObject: argument #1: expected torque object, number, or string', 2) + end + return tsIsObject(obj) +end +function bl.isFunction(a1, a2) + if type(a1)~='string' then + error('bl.isFunction: argument #1: expected string', 2) end + if a2 then + if type(a2)~='string' then + error('bl.isFunction: argument #2: expected string', 2) end + return tsIsFunctionNs(a1, a2) + else + return tsIsFunction(a1) + end +end + +-- Torque object pseudo-class +bl._objectUserMetas = bl._objectUserMetas or {} +function bl.class(name, inherit) + if not ( type(name)=='string' and isValidFuncName(name) ) then + error('bl.class: argument #1: invalid class name', 2) end + if not ( inherit==nil or (type(inherit)=='string' and isValidFuncName(inherit)) ) then + error('bl.class: argument #2: inherit name must be a string or nil', 2) end + name = name:lower() + + local met = bl._objectUserMetas[name] or {} + bl._objectUserMetas[name] = met + met._name = name + + if inherit then + inherit = inherit:lower() + + local inh = bl._objectUserMetas[inherit] + if not inh then error('bl.class: argument #2: \''..inherit..'\' is not the '.. + 'name of an existing class', 2) end + + local inhI = bl._objectUserMetas[name]._inherit + if inhI and inhI~=inh then + error('bl.class: argument #2: class already exists and '.. + 'inherits a different parent.', 2) end + + bl._objectUserMetas[name]._inherit = inh + end +end +local function objectInheritedMetas(name) + local inh = bl._objectUserMetas[name:lower()] + return function() + local inhP = inh + if inhP==nil then return nil end + inh = inh._inherit + return inhP + end +end +local tsObjectMeta = { + -- __index: Called when accessing fields that don't exist in the object itself + -- Return torque member function or value + __index = function(t, name) + if rawget(t,'_deleted') then + error('ts object index: object no longer exists', 2) end + if type(name)~='string' and type(name)~='number' then + error('ts object index: index must be a string or number', 2) end + if getmetatable(t)[name] then + return getmetatable(t)[name] + elseif type(name)=='number' then + if not tsIsFunctionNs(rawget(t,'_tsNamespace'), 'getObject') then + error('ts object __index: index is number, but object does not have '.. + 'getObject method', 2) end + return toTsObject(_bllua_ts.callobj(t._tsObjectId, 'getObject', + tostring(name))) + else + for inh in objectInheritedMetas(rawget(t,'_tsClassName')) do + if inh[name] then return inh[name] end + end + if tsIsFunctionNs(rawget(t,'_tsNamespace'), name) then + return function(t, ...) + local args = {...} + local argsS = arglistToTs(args) + return valFromTs(_bllua_ts.callobj(rawget(t,'_tsObjectId'), name, unpack(argsS)), + rawget(t,'_tsNamespace')..'::'..name) + end + else + return valFromTs(_bllua_ts.getfield(rawget(t,'_tsObjectId'), name), + rawget(t,'_tsNamespace')..'.'..name) + end + end + end, + -- __newindex: Called when setting fields on the object + -- Set lua data + -- Use :set() to set Torque data + __newindex = function(t, name, val) + if rawget(t,'_deleted') then + error('ts object newindex: object no longer exists', 2) end + if type(name)~='string' then + error('ts object newindex: index must be a string', 2) end + rawset(t, name, val) + -- create strong reference since it's now storing lua data + bl._objectsStrong[rawget(t,'_tsObjectId')] = t + end, + -- object:set(fieldName, value) + -- Use to set torque data + set = function(t, name, val) + if t==nil or type(t)~='table' or not t._tsObjectId then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + error('ts object method: object no longer exists', 2) end + if type(name)~='string' then + error('ts object :set(): index must be a string', 2) end + _bllua_ts.setfield(t._tsObjectId, name, valToTs(val)) + end, + -- __tostring: Called when printing + -- Display a nice info string + __tostring = function(t) + return 'torque:'..t._tsNamespace..':'..t._tsObjectId.. + (t._tsName~='' and ('('..t._tsName..')') or '') + end, + -- #object + -- If the object has a getCount method, return its count + __len = function(t) + if t._deleted then + error('ts object __len: object no longer exists', 2) end + if not tsIsFunctionNs(t._tsNamespace, 'getCount') then + error('ts object __len: object has no getCount method', 2) end + return tonumber(_bllua_ts.callobj(t._tsObjectId, 'getCount')) + end, + -- object:iterate() + -- Return an iterator for Torque objects with the getCount and getObject methods + -- for index, object in group:iterate() do ... end + iterate = function(t) + if t==nil then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + error('ts object method: object no longer exists', 2) end + if not ( + tsIsFunctionNs(t._tsNamespace, 'getCount' ) and + tsIsFunctionNs(t._tsNamespace, 'getObject')) then + error('ts object :iterate() - '.. + 'Object does not have getCount and getObject methods', 2) end + local count = tonumber(_bllua_ts.callobj(t._tsObjectId, 'getCount')) + local idx = 0 + return function() + if idx < count then + local obj = toTsObject(_bllua_ts.callobj(t._tsObjectId, + 'getObject', tostring(idx))) + idx = idx+1 + return idx-1, obj + else + return nil + end + end + end, + -- Wrap some Torque functions for performance and error checking + getName = function(t) + if t==nil then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + error('ts object method: object no longer exists', 2) end + return t._tsName + end, + getId = function(t) + if t==nil then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + error('ts object method: object no longer exists', 2) end + return tonumber(t._tsObjectId) + end, + getType = function(t) + if t==nil then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + error('ts object method: object no longer exists', 2) end + return tsTypesByNum[_bllua_ts.callobj(t._tsObjectId, 'getType')] + end, + ---- Schedule method for objects + --schedule = function(t, time, cb, ...) + -- if type(t)~='table' or not t._tsObjectId then + -- error('ts object method: be sure to use :func() not .func()', 2) end + -- if t._deleted then + -- error('ts object method: object no longer exists', 2) end + -- if type(time)~='number' then + -- error('ts object schedule: argument #2: time must be a number', 2) end + -- if type(cb)~='function' then + -- error('ts object schedule: argument #3: callback must be a function', 2) end + -- local args = {...} + -- bl.schedule(time, function() + -- if tsBool(__bllua_ts.call('isObject', t._tsObjectId)) then + -- pcall(cb, unpack(args)) + -- end + -- end) + --end, + exists = function(t) + if t==nil then + error('ts object method: be sure to use :func() not .func()', 2) end + if t._deleted then + return false end + return tsIsObject(t._tsObjectId) + end, +} +-- Weak-values table for caching Torque object references +-- Objects in this table can be garbage collected if there are no other refs to them +if not bl._objectsWeak then + bl._objectsWeak = {} + setmetatable(bl._objectsWeak, { __mode='v' }) +end +-- Strong table for preserving Torque object references containing lua data +-- If an object in this table, it will remain here and in the Weak table until deleted +if not bl._objectsStrong then + bl._objectsStrong = {} +end +-- Hook object deletion to clean up its lua data +-- idS is expected to be the object ID number, NOT the object name +function _bllua_objectDeleted(idS) + local obj = bl._objectsWeak[idS] + if obj then + obj._deleted = true + bl._objectsStrong[idS] = nil + bl._objectsWeak[idS] = nil + bl._objectsWeak[obj._tsName:lower()] = nil + end +end + +-- Return a Torque object for the object ID string, or create one if none exists +toTsObject = function(idiS) + if type(idiS)~='string' then + error('toTsObject: input must be a string', 2) end + idiS = idiS:lower() + if bl._objectsWeak[idiS] then return bl._objectsWeak[idiS] end + + if not tsBool(_bllua_ts.call('isObject', idiS)) then + --error('toTsObject: object \''..idiS..'\' does not exist', 2) end + return nil end + + local className = _bllua_ts.callobj(idiS, 'getClassName') + local obj = { + _tsObjectId = _bllua_ts.callobj(idiS, 'getId' ), + _tsName = _bllua_ts.callobj(idiS, 'getName' ), + _tsNamespace = className, + _tsClassName = className:lower() + } + setmetatable(obj, tsObjectMeta) + + bl._objectsWeak[obj._tsObjectId ] = obj + bl._objectsWeak[obj._tsName:lower()] = obj + return obj +end + +-- Metatable for the global bl library +-- Allows accessing Torque objects, variables, and functions by indexing it +local tsMeta = { + -- __index: Called when accessing fields that don't exist in the table itself + -- Allow indexing by object id: bl[1234] + -- by object name: bl.mainMenuGui + -- by function name: bl.quit() + -- by variable name: bl.iAmAdmin + __index = function(t, name) + if getmetatable(t)[name] then + return getmetatable(t)[name] + elseif bl._objectUserMetas[name:lower()] then + return bl._objectUserMetas[name:lower()] + else + if type(name)=='number' then + return toTsObject(tostring(name)) + elseif name:find('::') then + local ns, rest = name:match('^([^:]+)::(.+)$') + if not ns then error('ts index: invalid name \''..name..'\'', 2) end + if not rest:find('::') and tsIsFunction(ns, rest) then + error('ts index: can\'t call a namespaced function from lua', 2) + else + return valFromTs(_bllua_ts.getvar(name), name) + end + elseif tsIsFunction(name) then + return function(...) + local args = {...} + local argsS = arglistToTs(args) + return valFromTs(_bllua_ts.call(name, unpack(argsS)), name) + end + elseif tsIsObject(name) then + return toTsObject(name) + else + return valFromTs(_bllua_ts.getvar(name), name) + end + end + end, +} + +-- bl.set(name, value) +-- Used to set global variables +function bl.set(t, name, val) + _bllua_ts.call('_bllua_set_var', name, valToTs(val)) +end + +-- Utility functions +function bl.call(func, ...) + local args = {...} + local argsS = arglistToTs(args) + return _bllua_ts.call(func, unpack(argsS)) +end +function bl.eval(code) + return valFromTs(_bllua_ts.call('eval', code)) +end +function bl.exec(file) + return valFromTs(_bllua_ts.call('exec', file)) +end +function bl.tobool(val) + return val~=nil and + val~=false and + --val~='' and + --val~='0' and + val~=0 +end +function bl.toobject(id) + if type(id)=='table' and id._tsObjectId then + return id + elseif type(id)=='string' or type(id)=='number' then + return toTsObject(tostring(id)) + else + error('bl.toobject: id must be a ts object, number, or string', 2) + end +end +function bl.array(name, ...) + local rest = {...} + return name..table.concat(rest, '_') +end +function _bllua_call(name, ...) + -- todo: call ts->lua using this instead of directly +end + +-- bl.schedule: Use TS's schedule function to schedule lua calls +-- bl.schedule(time, function, args...) +bl._scheduleTable = bl._scheduleTable or {} +bl._scheduleNextId = bl._scheduleNextId or 1 +local function cancelTsSched(sched) + if not (sched and sched.handle) then + error('schedule:cancel() - invalid object', 2) + end + _bllua_ts.call('cancel', sched.handle) + bl._scheduleTable[id] = nil +end +function bl.schedule(time, cb, ...) + local id = bl._scheduleNextId + bl._scheduleNextId = bl._scheduleNextId+1 + local args = {...} + local handle = tonumber(_bllua_ts.call('schedule', + time, 0, 'luacall', '_bllua_schedule_callback', id)) + local sch = { + callback = cb, + args = args, + handle = handle, + cancel = cancelTsSched, + } + bl._scheduleTable[id] = sch + return sch +end +function _bllua_schedule_callback(id) + id = tonumber(id) + local sch = bl._scheduleTable[id] + if not sch then error('_ts_schedule_callback: no schedule with id '..id) end + bl._scheduleTable[sched_id] = nil + sch.callback(unpack(sch.args)) +end + +-- serverCmd and clientCmd +-- bl.serverCmd('suicide', function(client) client.player:kill() end) +bl._cmds = bl._cmds or {} +function _bllua_process_cmd(cmdS, clientS, ...) + local client = toTsObject(clientS) + local argsS = {...} + local args = arglistFromTs(cmdS, argsS) + local func = bl._cmds[cmdS] + if not func then error('_bllua_process_cmd: no cmd named \''..cmd..'\'') end + pcall(func, client, unpack(args)) +end +local function addCmd(cmd, func) + if not isValidFuncName(cmd) then + error('addCmd: invalid function name \''..tostring(cmd)..'\'') end + bl._servercmds[cmd] = func + local arglist = '%a,%b,%c,%d,%e,%f,%g,%h' + _bllua_ts.eval('function '..cmd..'(%cl,'..arglist..'){'.. + 'luacall(_bllua_process_cmd,"'..cmd..'",%cl,'..arglist..');}') +end +function bl.serverCmd(name, func) addCmd('serverCmd'..name, func) end +function bl.clientCmd(name, func) addCmd('clientCmd'..name, func) end + +-- Hooks (using TS packages) +local function isPackageActive(pkg) + local numpkgs = tonumber(_bllua_ts.call('getNumActivePackages')) + for i = 0, numpkgs-1 do + local apkg = _bllua_ts.call('getActivePackage', tostring(i)) + if apkg==pkg then return true end + end + return false +end +local function activatePackage(pkg) + if not isPackageActive(pkg) then + _bllua_ts.call('activatePackage', pkg) + end +end +local function deactivatePackage(pkg) + if isPackageActive(pkg) then + _bllua_ts.call('deactivatePackage', pkg) + end +end +bl._hooks = bl._hooks or {} +function _bllua_process_hook(pkgS, nameS, timeS, ...) + local argsS = {...} + local args = arglistFromTs(nameS, argsS) + + local func = bl._hooks[pkgS] and bl._hooks[pkgS][nameS] and + bl._hooks[pkgS][nameS][timeS] + if not func then + error('_bllua_process_hook: no hook for '..pkgS..':'..nameS..':'..timeS) end + + pcall(func, args) +end +local function updateHook(pkg, name, hk) + local arglist = '%a,%b,%c,%d,%e,%f,%g,%h' + local beforeCode = hk.before and + ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. + '", "before", '..arglist..');') or '' + local parentCode = hk.override and + ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. + '", "override", '..arglist..');') or + (tsIsFunctionNsname(name) and + ('parent::'..name:match('[^:]+$')..'('..arglist..');') or '') + local afterCode = hk.after and + ('luacall("_bllua_process_hook", "'..pkg..'", "'..name.. + '", "after", '..arglist..');') or '' + bl.eval('package '..pkg..'{function '..name..'('..arglist..'){'.. + beforeCode..parentCode..afterCode..'}};') +end +function bl.hook(pkg, name, time, func) + if not isValidFuncName(pkg) then + error('bl.hook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end + if not isValidFuncNameNs(name) then + error('bl.hook: argument #2: invalid function name \''..tostring(name)..'\'', 2) end + if time~='before' and time~='after' and time~='override' then + error('bl.hook: argument #3: time must be one of '.. + '\'before\' \'after\' \'override\'', 2) end + if type(func)~='function' then + error('bl.hook: argument #4: expected a function', 2) end + + bl._hooks[pkg] = bl._hooks[pkg] or {} + bl._hooks[pkg][name] = bl._hooks[pkg][name] or {} + bl._hooks[pkg][name][time] = func + + updateHook(pkg, name, bl._hooks[pkg][name]) + activatePackage(pkg) +end +function bl.unhook(pkg, name, time) + if not isValidFuncName(pkg) then + error('bl.unhook: argument #1: invalid package name \''..tostring(pkg)..'\'', 2) end + if not isValidFuncNameNs(name) then + error('bl.unhook: argument #2: invalid function name \''..tostring(name)..'\'', 2) end + if time~='before' and time~='after' and time~='override' then + error('bl.unhook: argument #3: time must be one of '.. + '\'before\' \'after\' \'override\'', 2) end + + if not name then + if bl._hooks[pkg] then + for name,hk in pairs(bl._hooks[pkg]) do + updateHook(pkg, name, {}) + end + bl._hooks[pkg] = nil + else + --error('bl.unhook: no hooks registered under package name \''.. + -- pkg..'\'', 2) + end + deactivatePackage(pkg) + else + if bl._hooks[pkg][name] then + if not time then + bl._hooks[pkg][name] = nil + if table.isempty(bl._hooks[pkg]) then + bl._hooks[pkg] = nil + deactivatePackage(pkg) + end + updateHook(pkg, name, {}) + else + if time~='before' and time~='after' and time~='override' then + error('bl.unhook: argument #3: time must be nil or one of '.. + '\'before\' \'after\' \'override\'', 2) end + bl._hooks[pkg][name][time] = nil + if table.isempty(bl._hooks[pkg][name]) and table.empty(bl._hooks[pkg]) then + bl._hooks[pkg] = nil + deactivatePackage(pkg) + end + updateHook(pkg, name, bl._hooks[pkg][name]) + end + else + --error('bl.unhook: no hooks registered for function \''..name.. + -- '\' under package name \''..pkg..'\'', 2) + end + end +end + +-- Container search/raycast +local function vecToTs(v) + if not isTsVector(v) then + error('vecToTs: argument is not a vector', 3) end + return table.concat(v, ' ') +end +local function maskToTs(mask) + if type(mask)=='string' then + local val = tsTypesByName[mask:lower()] + if not val then + error('maskToTs: invalid mask \''..mask..'\'', 3) end + return tostring(val) + elseif type(mask)=='table' then + local tval = 0 + local seen = {} + for i,v in ipairs(mask) do + if not seen[v] then + local val = tsTypesByName[v:lower()] + if not val then + error('maskToTs: invalid mask \''..v.. + '\' at index '..i..' in mask list', 3) end + tval = tval + val + seen[v] = true + end + end + return tostring(tval) + else + error('maskToTs: mask must be a string or table', 3) + end +end +local function objToTs(obj) + if type(obj)=='number' or type(obj)=='string' then + return tostring(obj) + elseif type(obj)=='table' and obj._tsObjectId then + return tostring(obj._tsObjectId) + else + error('objToTs: invalid object \''..tostring(obj)..'\'', 3) + end +end +function bl.raycast(start, stop, mask, ignores) + local startS = vecToTs(start) + local stopS = vecToTs(start) + local maskS = maskToTs(mask) + local ignoresS = {} + for _,v in ipairs(ignores) do + table.insert(ignoresS, objToTs(v)) + end + + local retS = _bllua_ts.call('containerRaycast', startS, stopS, maskS, unpack(ignoresS)) + + if retS=='0' then + return nil + else + local hitS, pxS,pyS,pzS, nxS,nyS,nzS = retS:match('^([0-9]+) '.. + '(%-?[0-9%.e]+) (%-?[0-9%.e]+) (%-?[0-9%.e]+) '.. + '(%-?[0-9%.e]+) (%-?[0-9%.e]+) (%-?[0-9%.e]+)$') + local hit = toTsObject(hitS) + local pos = vector{tonumber(pxS),tonumber(pyS),tonumber(pzS)} + local norm = vector{tonumber(nxS),tonumber(nyS),tonumber(nzS)} + return hit, pos, norm + end +end +local function tsContainerSearchIterator() + local retS = _bllua_ts.call('containerSearchNext') + if retS=='0' then + return nil + else + return toTsObject(retS) + end +end +function bl.boxSearch(pos, size, mask) + local posS = vecToTs(pos) + local sizeS = vecToTs(size) + local maskS = maskToTs(mask) + + _bllua_ts.call('initContainerBoxSearch', posS, sizeS, maskS) + return tsContainerSearchIterator +end +function bl.radiusSearch(pos, radius, mask) + local posS = vecToTs(pos) + if type(radius)~='number' then + error('bl.radiusSearch: argument #2: radius must be a number', 2) end + local radiusS = tostring(radius) + local maskS = maskToTs(mask) + + _bllua_ts.call('initContainerRadiusSearch', posS, radiusS, maskS) + return tsContainerSearchIterator +end + +-- Print/Talk/Echo +local function valsToString(vals) + local strs = {} + for i,v in ipairs(vals) do + strs[i] = table.tostring(v) + end + return table.concat(strs, ' ') +end +bl.echo = function(...) + local str = valsToString({...}) + _bllua_ts.call('echo', str) +end +print = bl.echo +bl.talk = function(...) + local str = valsToString({...}) + _bllua_ts.call('echo', str) + _bllua_ts.call('talk', str) +end + +local function createTsObj(keyword, class, name, inherit, props) + local propsT = {} + for k,v in pairs(props) do + if not isValidFuncName(k) then + error('bl.new/datablock: invalid property name \''..k..'\'') end + table.insert(propsT, k..'="'..valToTs(v)..'";') + end + + local objS = _bllua_ts.eval( + 'return '..keyword..' '..class..'('.. + (name or '')..(inherit and (':'..inherit) or '')..'){'.. + table.concat(propsT)..'};') + local obj = toTsObject(objS) + if not obj then + error('bl.new/datablock: failed to create object', 3) end + + return obj +end +local function parseTsDecl(decl) + local class, name, inherit + if decl:find(' ') then -- class ... + local cl, rest = decl:match('^([^ ]+) ([^ ]+)$') + class = cl + if rest:find(':') then -- class name:inherit + name, inherit = rest:match('^([^:]*):([^:]+)$') + if not name then class = nil end -- error + if name=='' then name = nil end -- class :inherit + else + name = rest + end + else -- class + class = decl + end + if not ( + isValidFuncName(class) and + (name==nil or isValidFuncName(name)) and + (inherit==nil or isValidFuncName(inherit)) ) then + error('bl.new/datablock: invalid decl \''..decl..'\'\n'.. + 'must be of the format: \'className\', \'className name\', '.. + '\'className :inherit\', or \'className name:inherit\'', 3) end + return class, name, inherit +end +function bl.new(decl, props) + local class, name, inherit = parseTsDecl(decl) + return createTsObj('new', class, name, inherit, props) +end +function bl.datablock(decl, props) + local class, name, inherit = parseTsDecl(decl) + return createTsObj('datablock', class, name, inherit, props) +end + +setmetatable(bl, tsMeta) + +print(' Executed libbl.lua') diff --git a/src/util/libts-support.cs b/src/util/libts-support.cs new file mode 100644 index 0000000..c928408 --- /dev/null +++ b/src/util/libts-support.cs @@ -0,0 +1,52 @@ + +// Read an entire file as text and return its contents as a string +// Used for reading files from zips +function _bllua_ReadEntireFile(%fn) { + %text = ""; + %file = new FileObject(); + %file.openForRead(%fn); + while (!%file.isEOF()) { %text = %text @ %file.readLine() @ "\r\n"; } + %file.close(); + %file.delete(); + return %text; +} + +// Hack to create/set global variables +// since there's no easy way to do this from the DLL directly +function _bllua_set_var(%name, %val) { + %first = strLwr(getSubStr(%name, 0, 1)); + %rest = getSubStr(%name, 1, strLen(%name)); + switch$(%first) { + case "a": $a[%rest] = %val; return; + case "b": $b[%rest] = %val; return; + case "c": $c[%rest] = %val; return; + case "d": $d[%rest] = %val; return; + case "e": $e[%rest] = %val; return; + case "f": $f[%rest] = %val; return; + case "g": $g[%rest] = %val; return; + case "h": $h[%rest] = %val; return; + case "i": $i[%rest] = %val; return; + case "j": $j[%rest] = %val; return; + case "k": $k[%rest] = %val; return; + case "l": $l[%rest] = %val; return; + case "m": $m[%rest] = %val; return; + case "n": $n[%rest] = %val; return; + case "o": $o[%rest] = %val; return; + case "p": $p[%rest] = %val; return; + case "q": $q[%rest] = %val; return; + case "r": $r[%rest] = %val; return; + case "s": $s[%rest] = %val; return; + case "t": $t[%rest] = %val; return; + case "u": $u[%rest] = %val; return; + case "v": $v[%rest] = %val; return; + case "w": $w[%rest] = %val; return; + case "x": $x[%rest] = %val; return; + case "y": $y[%rest] = %val; return; + case "z": $z[%rest] = %val; return; + case "_": $_[%rest] = %val; return; + } + error("_bllua_set_var: invalid variable name " @ %name); + return ""; +} + +echo(" Executed libts-support.cs"); diff --git a/src/util/libts.lua b/src/util/libts.lua new file mode 100644 index 0000000..5b2daa9 --- /dev/null +++ b/src/util/libts.lua @@ -0,0 +1,212 @@ + +-- This Lua code provides some built-in utilities for writing Lua add-ons +-- It is eval'd automatically once BLLua3 has loaded the TS API and environment +-- It only has access to the sandboxed lua environment, just like user code. + +ts = _bllua_ts + +-- Provide limited OS functions +os = os or {} +function os.time() return math.floor(tonumber(_bllua_ts.call('getSimTime'))/1000) end +function os.clock() return tonumber(_bllua_ts.call('getSimTime'))/1000 end + +-- Virtual file class, emulating a file object as returned by io.open +-- Used to wrap io.open to allow reading from zips (using TS) +-- Not perfect because TS file I/O sucks +-- Can't read nulls, can't distinguish between CRLF and LF. +-- Todo someday: actually read the zip in lua? +local file_meta = { + read = function(file, mode) + file:_init() + if not file or type(file)~='table' or not file._is_file then error('File:read: Not a file', 2) end + if file._is_open ~= true then error('File:read: File is closed', 2) end + if mode=='*n' then + local ws, n = file.data:match('^([ \t\r\n]*)([0-9%.%-e]+)', file.pos) + if n then + file.pos = file.pos + #ws + #n + return n + else + return nil + end + elseif mode=='*a' then + local d = file.data:sub(file.pos, #file.data) + file.pos = #file.data + 1 + return d + elseif mode=='*l' then + local l, ws = file.data:match('^([^\r\n]*)(\r?\n)', file.pos) + if not l then + l = file.data:match('^([^\r\n]*)$', file.pos); ws = ''; + if l=='' then return nil end + end + if l then + file.pos = file.pos + #l + #ws + return l + else + return nil + end + elseif type(mode)=='number' then + local d = file.data:sub(file.pos, file.pos+mode) + file.pos = file.pos + #d + return d + else + error('File:read: Invalid mode \''..mode..'\'', 2) + end + end, + lines = function(file) + file:_init() + return function() + return file:read('*l') + end + end, + close = function(file) + if not file._is_open then error('File:close: File is not open', 2) end + file._is_open = false + end, + __index = function(f, k) return rawget(f, k) or getmetatable(f)[k] end, + _init = function(f) + if not f.data then + f.data = _bllua_ts.call('_bllua_ReadEntireFile', f.filename) + end + end, +} +local function new_file_obj(fn) + local file = { + _is_file = true, + _is_open = true, + pos = 1, + __index = file_meta.__index, + filename = fn, + data = nil, + } + setmetatable(file, file_meta) + return file +end + +local function tflip(t) local u = {}; for _, n in ipairs(t) do u[n] = true end; return u; end +local allowed_zip_dirs = tflip{ + 'add-ons', 'base', 'config', 'saves', 'screenshots', 'shaders' +} +local function io_open_absolute(fn, mode) + -- if file exists, use original mode + local res, err = _bllua_io_open(fn, mode) + if res then return res end + + -- otherwise, if TS sees file but Lua doesn't, it must be in a zip, so use TS reader + local dir = fn:match('^[^/]+') + if not allowed_zip_dirs[dir:lower()] then return nil, 'File is not in one of the allowed directories' end + local exist = _bllua_ts.call('isFile', fn) == '1' + if not exist then return nil, err end + + if mode~=nil and mode~='r' and mode~='rb' then + return nil, 'Files in zips can only be opened in read mode' end + + -- return a temp lua file object with the data + local fi = new_file_obj(fn) + return fi +end + +io = io or {} +function io.open(fn, mode, errn) + errn = errn or 1 + + -- try to open the file with relative path, otherwise use absolute path + local curfn = debug.getfilename(errn + 1) or _bllua_ts.getvar('Con::File') + if curfn == '' then curfn = nil end + if fn:find('^%.') then + local relfn = curfn and fn:find('^%./') and + curfn:gsub('[^/]+$', '')..fn:gsub('^%./', '') + if relfn then + local fi, err = io_open_absolute(relfn, mode, errn+1) + return fi, err, relfn + else + return nil, 'Invalid path', fn + end + else + local fi, err = io_open_absolute(fn, mode, errn+1) + return fi, err, fn + end +end +function io.lines(fn) + local fi, err, fn2 = io.open(fn, nil, 2) + if not fi then error('Error opening file \''..fn2..'\': '..err, 2) end + return fi:lines() +end +function io.type(f) + if type(f)=='table' and f._is_file then + return f._is_open and 'file' or 'closed file' + else + return _bllua_io_type(f) + end +end + +-- provide dofile +function dofile(fn, errn) + errn = errn or 1 + + local fi, err, fn2 = io.open(fn, 'r', errn+1) + if not fi then error('Error executing file \''..fn2..'\': '..err, errn+1) end + + print('Executing '..fn2) + local text = fi:read('*a') + fi:close() + return assert(loadstring('--[['..fn2..']]'..text))() +end + +-- provide require (just a wrapper for dofile) +-- searches for ?.lua and ?/init.lua in the following directories: +-- location of current file +-- blockland directory +-- current add-on +local function file_exists(fn, errn) + local fi, err, fn2 = io.open(fn, 'r', errn+1) + if fi then + fi:close() + return fn2 + else + return nil + end +end +function require(mod) + local fp = mod:gsub('%.', '/') + local fns = { + './'..fp..'.lua', -- local file + './'..fp..'/init.lua', -- local library + fp..'.lua', -- global file + fp..'/init.lua', -- global library + } + if fp:lower():find('^add-ons/') then + local addonpath = fp:lower():match('^add-ons/[^/]+')..'/' + table.insert(fns, addonpath..fp..'.lua') -- add-on file + table.insert(fns, addonpath..fp..'/init.lua') -- add-on library + end + for _,fn in ipairs(fns) do + local fne = file_exists(fn, 2) + if fne then + return dofile(fne, 2) + end + end + return _bllua_requiresecure(mod) +end + +-- Exposure to TS +function _bllua_getvar(name) return _G[name] end +function _bllua_setvar(name, val) _G[name] = val end +function _bllua_eval(code) return loadstring(code)() end +function _bllua_exec(fn) return dofile(fn, 2) end + +local function isValidCode(code) + local f,e = loadstring(code) + return f~=nil +end +function _bllua_smarteval(code) + if (not code:find('^print%(')) and isValidCode('print('..code..')') then + code = 'print('..code..')' end + local f,e = loadstring(code) + if f then + return f() + else + print(e) + end +end + +_bllua_ts.call('echo', ' Executed libts.lua') diff --git a/src/util/loadaddons.cs b/src/util/loadaddons.cs new file mode 100644 index 0000000..956c3df --- /dev/null +++ b/src/util/loadaddons.cs @@ -0,0 +1,412 @@ +// Package to allow add-ons to use server.lua or client.lua +// instead of or in addition to server.cs or client.cs +// Relevant .lua files are is executed before .cs files. + +function _bllua_strEndsWith(%str, %sch) { + %schL = strLen(%sch); + return getSubStr(%str, strLen(%str)-%schL, %schL) $= %sch; +} +//function _bllua_strRemoveEnd(%str, %sch) { +// %schL = strLen(%sch); +// return getSubStr(%str, 0, strLen(%str)-%schL); +//} +function _bllua_fileIsExecCs(%fn) { + return + _bllua_strEndsWith(%fn, "/server.cs" ) || + _bllua_strEndsWith(%fn, "/server.lua") || + _bllua_strEndsWith(%fn, "/client.cs" ) || + _bllua_strEndsWith(%fn, "/client.lua"); +} +function _bllua_execAddon(%dirName, %type) { + %i = 0; + %fnLua = "Add-Ons/" @ %dirName @ "/" @ %type @ ".lua"; + if(isFile(%fnLua)) { luaexec(%fnLua); %i++; } + %fnCs = "Add-Ons/" @ %dirName @ "/" @ %type @ ".cs"; + if(isFile(%fnCs )) { exec(%fnCs ); %i++; } + if(%i==0) { + error("Error Loading Add-On " @ %dirName @ ": Neither " @ + %type @ ".cs nor " @ %type @ ".lua exist"); + } +} + +// Rewrite built-in functions that scan for server.cs or client.cs +// and make them scan for server.lua or client.lua as well +// Note: I had to completely override several large functions, +// many of which are highly redundant, because Badspot didn't know +// what functional decomposition was when he wrote this shit. +package _bllua_addon_exec { + function CustomGameGuiServer::populateAddOnList() { + deleteVariables("$CustomGameGuiServer::AddOn*"); + $CustomGameGuiServer::AddOnCount = 0; + %pattern = "Add-Ons/*/server.*"; + %filename = findFirstFile(%pattern); + while(isFile(%filename)) { + if(_bllua_fileIsExecCs(%filename)) { + %path = filePath(%filename); + %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); + if(!%seenDirName[%dirName]) { + %seenDirName[%dirName] = 1; + %varName = getSafeVariableName(%dirName); + if(isValidAddOn(%dirName, 1)) { + $CustomGameGuiServer::AddOn[$CustomGameGuiServer::AddOnCount] = %dirName; + $CustomGameGuiServer::AddOnCount++; + } + } + } + %filename = findNextFile(%pattern); + } + } + function GameModeGuiServer::GetMissingAddOns(%filename) { + if(!isFile(%filename)) { + error("ERROR: GameModeGuiServer::GetMissingAddOns(" @ %filename @ ") - file does not exist"); + return 0; + } + %path = filePath(%filename); + %missingAddons = ""; + %descriptionFile = %path @ "/description.txt"; + %previewFile = %path @ "/preview.jpg"; + %thumbFile = %path @ "/thumb.jpg"; + %saveFile = %path @ "/save.bls"; + %colorSetFile = %path @ "/colorSet.txt"; + if(!isFile(%descriptionFile)) + %missingAddons = %missingAddons TAB %descriptionFile; + if(!isFile(%previewFile)) + %missingAddons = %missingAddons TAB %previewFile; + if(!isFile(%thumbFile)) + %missingAddons = %missingAddons TAB %thumbFile; + if(!isFile(%saveFile)) + %missingAddons = %missingAddons TAB %saveFile; + if(!isFile(%colorSetFile)) + %missingAddons = %missingAddons TAB %colorSetFile; + %file = new FileObject(""){}; + %file.openForRead(%filename); + while(!%file.isEOF()) { + %line = %file.readLine(); + %label = getWord(%line, 0); + %value = trim(getWords(%line, 1, 999)); + if(%label !$= "") { + if(getSubStr(%label, 0, 2) !$= "//") { + if(%label $= "ADDON") { + if(!isFile("Add-Ons/" @ %value @ "/description.txt") || + (!isFile("Add-Ons/" @ %value @ "/server.cs" ) && + !isFile("Add-Ons/" @ %value @ "/server.lua") ) ) { + if(strlen(%missingAddons) > 0) + %missingAddons = %missingAddons TAB %value; + else + %missingAddons = %value; + } + } else { + if(%label $= "MUSIC") { + if(!isFile("Add-Ons/Music/" @ %value @ ".ogg")) { + if(strlen(%missingAddons) > 0) + %missingAddons = %missingAddons TAB %value @ ".ogg"; + else + %missingAddons = %value; + } + } + } + } + } + } + %file.close(); + %file.delete(); + return %missingAddons; + } + function loadAddOns() { + echo(""); + updateAddOnList(); + echo("--------- Loading Add-Ons (+BlockLua) ---------"); + deleteVariables("$AddOnLoaded__*"); + %dir = "Add-Ons/*/server.*"; + %filename = findFirstFile(%dir); + %dirCount = 0; + if(isFile("Add-Ons/System_ReturnToBlockland/server.cs")) { + %dirNameList[%dirCount] = "System_ReturnToBlockland"; + %dirCount++; + } + while(%filename !$= "") { + if(_bllua_fileIsExecCs(%filename)) { + %path = filePath(%filename); + %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); + if(!%seenDirName[%dirName]) { + %seenDirName[%dirName] = 1; + if(%dirName !$= "System_ReturnToBlockland") { + %dirNameList[%dirCount] = %dirName; + %dirCount++; + } + } + } + %filename = findNextFile(%dir); + } + for(%addOnItr = 0; %addOnItr < %dirCount; %addOnItr++) { + %dirName = %dirNameList[%addOnItr]; + %varName = getSafeVariableName(%dirName); + if(!$Server::Dedicated) { + if(getRealTime() - $lastProgressBarTime > 200) { + LoadingProgress.setValue(%addOnItr / %dirCount); + $lastProgressBarTime = getRealTime(); + Canvas.repaint(); + } + } + if($AddOn__[%varName] $= 1 && isValidAddOn(%dirName)) { + if(%dirName $= "JVS_Content" && $AddOn__["Support_LegacyDoors"] $= 1) { + echo(" Skipping JVS_Content in favor of Support_LegacyDoors"); + } else if(!$AddOnLoaded__[%varName]) { + $AddOnLoaded__[%varName] = 1; + %zipFile = "Add-Ons/" @ %dirName @ ".zip"; + if(isFile(%zipFile)) { + %zipCRC = getFileCRC(%zipFile); + echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); + } else { + echo("\c5Loading Add-On: " @ %dirName); + } + if(VerifyAddOnScripts(%dirName)==0) { + echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); + } else { + %oldDBCount = DataBlockGroup.getCount(); + _bllua_execAddon(%dirName, "server"); + %dbDiff = DataBlockGroup.getCount() - %oldDBCount; + echo("\c2" @ %dbDiff @ " datablocks added."); + echo(""); + } + } + } + } + echo(""); + } + function loadGameModeAddOns() { + echo(""); + echo("--------- Loading Add-Ons (Game Mode) (+BlockLua) ---------"); + deleteVariables("$AddOnLoaded__*"); + for(%i=0; %i<$GameMode::AddOnCount; %i++) { + %dirName = $GameMode::AddOn[%i]; + %varName = getSafeVariableName(%dirName); + if(!$Server::Dedicated) { + if(getRealTime() - $lastProgressBarTime > 200) { + LoadingProgress.setValue(%i / $GameMode::AddOnCount); + $lastProgressBarTime = getRealTime(); + Canvas.repaint(); + } + } + if(!isValidAddOn(%dirName)) { + error("ERROR: Invalid add-on \'" @ %dirName @ "\' specified for game mode \'" @ $GameModeArg @ "\'"); + } else { + $AddOnLoaded__[%varName] = 1; + %zipFile = "Add-Ons/" @ %dirName @ ".zip"; + if(isFile(%zipFile)) { + %zipCRC = getFileCRC(%zipFile); + echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); + } else { + echo("\c5Loading Add-On: " @ %dirName); + } + if(VerifyAddOnScripts(%dirName) == 0) { + echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); + } else { + %oldDBCount = DataBlockGroup.getCount(); + _bllua_execAddon(%dirName, "server"); + %dbDiff = DataBlockGroup.getCount() - %oldDBCount; + echo("\c2" @ %dbDiff @ " datablocks added."); + echo(""); + } + } + } + echo(""); + } + function loadClientAddOns() { + echo(""); + echo("--------- Loading Client Add-Ons (+BlockLua) ---------"); + if(isFile("base/server/crapOns_Cache.cs")) + exec("base/server/crapOns_Cache.cs"); + %dir = "Add-Ons/*/client.*"; + %filename = findFirstFile(%dir); + %dirCount = 0; + if(isFile("Add-Ons/System_ReturnToBlockland/client.cs")) { + %dirNameList[%dirCount] = "System_ReturnToBlockland"; + %dirCount++; + } + while(%filename !$= "") { + if(_bllua_fileIsExecCs(%filename)) { + %path = filePath(%filename); + %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); + if(!%seenDirName[%dirName]) { + %seenDirName[%dirName] = 1; + if(%dirName !$= "System_ReturnToBlockland") { + %dirNameList[%dirCount] = %dirName; + %dirCount++; + } + } + } + %filename = findNextFile(%dir); + } + for(%i=0; %i<%dirCount; %i++) { + %dirName = %dirNameList[%i]; + %varName = getSafeVariableName(%dirName); + echo(""); + echo("Client checking Add-On: " @ %dirName); + if(!clientIsValidAddOn(%dirName, 1)) { + //deleteVariables("$AddOn__" @ %varName); // wtf + } else { + %name = %dirName; + %zipFile = "Add-Ons/" @ %dirName @ ".zip"; + if(isFile(%zipFile)) { + %zipCRC = getFileCRC(%zipFile); + echo("\c5Loading Add-On: " @ %dirName @ " \c2(CRC:" @ %zipCRC @ ")"); + } else { + echo("\c5Loading Add-On: " @ %dirName); + } + if(ClientVerifyAddOnScripts(%dirName)==0) + echo("\c3ADD-ON " @ %dirName @ " CONTAINS SYNTAX ERRORS\n"); + else + _bllua_execAddon(%dirName, "client"); + } + } + echo(""); + } + function updateAddOnList() { + echo("\n--------- Updating Add-On List (+BlockLua) ---------"); + deleteVariables("$AddOn__*"); + if(isFile("config/server/ADD_ON_LIST.cs")) { + exec("config/server/ADD_ON_LIST.cs"); + } else { + exec("base/server/defaultAddOnList.cs"); + } + if(isFile("base/server/crapOns_Cache.cs")) { + exec("base/server/crapOns_Cache.cs"); + } + %dir = "Add-Ons/*/server.*"; + %fileCount = getFileCount(%dir); + %filename = findFirstFile(%dir); + while(%filename !$= "") { + if(_bllua_fileIsExecCs(%filename)) { + %path = filePath(%filename); + %dirName = getSubStr(%path, strlen("Add-Ons/"), strlen(%path) - strlen("Add-Ons/")); + if(!%seenDirName[%dirName]) { + %seenDirName[%dirName] = 1; + %varName = getSafeVariableName(%dirName); + echo("Checking Add-On " @ %dirName); + if(!isValidAddOn(%dirName, 1)) { + deleteVariables("$AddOn__" @ %varName); + } else { + if (mFloor($AddOn__[%varName]) <= 0) + $AddOn__[%varName] = -1; + else + $AddOn__[%varName] = 1; + } + } + } + %filename = findNextFile(%dir); + } + echo(""); + export("$AddOn__*", "config/server/ADD_ON_LIST.cs"); + } +}; +activatePackage(_bllua_addon_exec); + +// Have to make new versions of these because packaging them is blocked FSFR +function forceRequiredAddOn_L(%dirName) { + if(%dirName $= "JVS_Content") { + if($GameModeArg $= "") { + if($AddOn__["Support_LegacyDoors"] == 1 || !isFile("add-ons/JVS_Content/server.cs") || ($AddOn__["Support_LegacyDoors"] != 1 && $AddOn__["JVS_Content"] != 1)) { + %dirName = "Support_LegacyDoors"; + } + } else { + %foundJVSContent = 0; + for(%i=0; %i<$GameMode::AddOnCount; %i++) { + if ($GameMode::AddOn[%i] $= "JVS_Content") { + %foundJVSContent = 1; + } + } + if(!%foundJVSContent) + %dirName = "Support_LegacyDoors"; + } + } + if(strstr(%dirName, " ") != -1) + %dirName = strreplace(%dirName, " ", "_"); + //if(strstr(%dirName, "/") != -1) + // return $Error::AddOn_Nested; + %varName = getSafeVariableName(%dirName); + if($GameModeArg !$= "") { + %foundIt = 0; + for(%i=0; %i<$GameMode::AddOnCount; %i++) { + if ($GameMode::AddOn[%i] $= %dirName) { + %foundIt = 1; + break; + } + } + if(!%foundIt) { + error("ERROR: ForceRequiredAddOn_L(\'" @ %dirName @ "\') - you can\'t force load an add-on that is not included in gamemode.txt"); + if (GameWindowExists() && !$Server::Dedicated) { + schedule(11, 0, MessageBoxOK, "Game Mode Error", "Required add-on " @ %dirName @ " should be added to gamemode.txt"); + } + if (!isEventPending($disconnectEvent)) { + $disconnectEvent = schedule(10, 0, disconnect); + } + return $Error::AddOn_NotFound; + } + } + if($AddOnLoaded__[%varName] == 1) + return $Error::None; + if($AddOn__[%varName] $= "" && $GameModeArg $= "" || !isValidAddOn(%dirName)) { + error("ERROR: ForceRequiredAddOn() - " @ %dirName @ " is not a valid add-on"); + return $Error::AddOn_NotFound; + } + echo(" Loading Add-On " @ %dirName @ ""); + _bllua_execAddon(%dirName, "server"); + $AddOnLoaded__[%varName] = 1; + if($AddOn__[%varName] $= 1) + return $Error::None; + else + return $Error::AddOn_Disabled; +} +function loadRequiredAddOn_L(%dirName) { + if(%dirName $= "JVS_Content") { + if($GameModeArg $= "") { + if($AddOn__["Support_LegacyDoors"] == 1 || !isFile("add-ons/JVS_Content/server.cs") || ($AddOn__["Support_LegacyDoors"] != 1 && $AddOn__["JVS_Content"] != 1)) { + %dirName = "Support_LegacyDoors"; + } + } else { + %foundJVSContent = 0; + for(%i=0; %i<$GameMode::AddOnCount; %i++) { + if ($GameMode::AddOn[%i] $= "JVS_Content") { + %foundJVSContent = 1; + } + } + if(!%foundJVSContent) + %dirName = "Support_LegacyDoors"; + } + } + if(strstr(%dirName, " ") != -1) + %dirName = strreplace(%dirName, " ", "_"); + //if(strstr(%dirName, "/") != -1) + // return $Error::AddOn_Nested; + %varName = getSafeVariableName(%dirName); + if ($GameModeArg !$= "") { + %foundIt = 0; + for(%i=0; %i<$GameMode::AddOnCount; %i++) { + if ($GameMode::AddOn[%i] $= %dirName) { + %foundIt = 1; + break; + } + } + if(!%foundIt) { + error("ERROR: LoadRequiredAddOn_L(\'" @ %dirName @ "\') - you can\'t force load an add-on that is not included in gamemode.txt"); + if (GameWindowExists() && !$Server::Dedicated) + schedule(11, 0, MessageBoxOK, "Game Mode Error", "Required add-on " @ %dirName @ " should be added to gamemode.txt"); + if (!isEventPending($disconnectEvent)) + $disconnectEvent = schedule(10, 0, disconnect); + return $Error::AddOn_NotFound; + } + } + if($AddOnLoaded__[%varName] == 1) + return $Error::None; + if($AddOn__[%varName] $= 1) { + echo(" Loading Add-On " @ %dirName @ ""); + _bllua_execAddon(%dirName, "server"); + $AddOnLoaded__[%varName] = 1; + return $Error::None; + } else { + return $Error::AddOn_Disabled; + } +} + +echo(" Executed loadaddons.cs"); diff --git a/src/util/std.lua b/src/util/std.lua new file mode 100644 index 0000000..23ddaf5 --- /dev/null +++ b/src/util/std.lua @@ -0,0 +1,360 @@ + +-- Basic functionality that should be standard in Lua + + +-- Table / List +-- Whether a table contains no keys +function table.empty(t) + for _,_ in pairs(t) do return false end + return true +end +-- Apply a function to each key in a table +function table.map(f, ...) + local ts = {...} + local u = {} + for k,_ in pairs(ts[1]) do + local args = {} + for j=1,#ts do args[j] = ts[j][i] end + u[i] = f(unpack(args)) + end + return u +end +function table.map_list(f, ...) + local ts = {...} + local u = {} + for i=1,#ts[1] do + local args = {} + for j=1,#ts do args[j] = ts[j][i] end + u[i] = f(unpack(args)) + end + return u +end +-- Swap keys/values +function table.swap(t) + local u = {} + for k,v in pairs(t) do u[v] = k end + return u +end +-- Reverse a list +function table.reverse(l) + local m = {} + for i=1,#l do m[#l-i+1] = l[i] end + return m +end +-- Convert i->v to v->true +function table.values(l) + local u = {} + for _,v in ipairs(l) do u[v] = true end + return u +end +-- Make a list of keys +function table.keys(t) + local u = {} + for k,_ in pairs(t) do table.insert(u, k) end + return u +end +-- Whether a table is a list/array (has only monotonic integer keys) +function table.islist(t) + local n = 0 + for i,_ in pairs(t) do + if type(i)~='number' or i%1~=0 then return false end + n = n+1 + end + return n==#t +end +-- Append contents of other tables to first table +function table.append(t, ...) + local a = {...} + for _,u in ipairs(a) do + for _,v in ipairs(u) do table.insert(t,v) end + end + return t +end +-- Create a new table containing all keys from any number of tables +-- latter tables in the arg list override prior ones +-- overlaps, NOT appends, integer keys +function table.join(...) + local ts = {...} + local w = {} + for _,t in ipairs(ts) do + for k,v in pairs(t) do w[k] = v end + end + return w +end +-- Whether a table contains a certain value in any key +function table.contains(t,s) + for _,v in pairs(t) do + if v==s then return true end + end + return false +end +function table.contains_list(t,s) + for _,v in ipairs(t) do + if v==s then return true end + end + return false +end +-- Copy a table to another table +function table.copy(t) + local u = {} + for k,v in pairs(t) do u[k] = v end + return u +end +function table.copy_list(l) + local m = {} + for i,v in ipairs(l) do m[i] = v end + return m +end +-- Sort a table in a new copy +function table.sortcopy(t, f) + local u = table.copy_list(t) + table.sort(u, f) + return u +end +-- Remove a value from a table +function table.removevalue(t, r) + local rem = {} + for k,v in pairs(t) do + if v==r then table.insert(rem, k) end + end + for _,k in ipairs(rem) do t[k] = nil end +end +function table.removevalue_list(t, r) + for i = #t, 1, -1 do + if t[i]==r then + table.remove(t, i) + end + end +end +-- Export tables into formatted executable strings +local function tabs(tabLevel) + return (' '):rep(tabLevel) +end +local valueToString +local function tableToString(t, tabLevel, seen) + if type(t)~='table' or (getmetatable(t) and getmetatable(t).__tostring) then + return tostring(t) + elseif table.islist(t) then + if #t==0 then + return '{}' + else + local strs = {} + local containsTables = false + for _,v in ipairs(t) do + if type(v)=='table' then containsTables = true end + table.insert(strs, valueToString(v, tabLevel+1, seen)..',') + end + if containsTables or #t>3 then + return '{\n'..tabs(tabLevel+1) + ..table.concat(strs, '\n'..tabs(tabLevel+1)) + ..'\n'..tabs(tabLevel)..'}' + else + return '{ '..table.concat(strs, ' ')..' }' + end + end + else + local containsNonStringKeys = false + for k,v in pairs(t) do + if type(k)~='string' or k:find('[^a-zA-Z0-9_]') then + containsNonStringKeys = true + elseif type(k)=='table' then + error('table.tostring: table contains a table as key, cannot serialize') + end + end + local strs = {} + if containsNonStringKeys then + for k,v in pairs(t) do + table.insert(strs, '\n'..tabs(tabLevel+1) + ..'['..valueToString(k, tabLevel+1, seen)..'] = ' + ..valueToString(v, tabLevel+1, seen)..',') + end + else + for k,v in pairs(t) do + table.insert(strs, '\n'..tabs(tabLevel+1) + ..k..' = '..valueToString(v, tabLevel+1, seen)..',') + end + end + return '{'..table.concat(strs)..'\n'..tabs(tabLevel)..'}' + end +end +valueToString = function(v, tabLevel, seen) + local t = type(v) + if t=='table' then + if seen[v] then + return 'nil --[[ already seen: '..tostring(v)..' ]]' + else + seen[v] = true + return tableToString(v, tabLevel, seen) + end + elseif t=='string' then + return '\''..string.escape(v)..'\'' + elseif t=='number' or t=='boolean' then + return tostring(v) + else + --error('table.tostring: table contains a '..t..' value, cannot serialize') + return 'nil --[[ cannot serialize '..t..': '..tostring(v)..' ]]' + end +end +function table.tostring(t) + return tableToString(t, 0, {}) +end + + +-- String + +-- Split string into table by separator +-- or by chars if no separator given +-- if regex is not true, sep is treated as a regex pattern +function string.split(str, sep, noregex) + if type(str)~='string' then + error('string.split: argument #1: expected string, got '..type(str), 2) end + if sep==nil or sep=='' then + local t = {} + local ns = #str + for x = 1, ns do + table.insert(t, str:sub(x, x)) + end + return t + elseif type(sep)=='string' then + local t = {} + if #str>0 then + local first = 1 + while true do + local last, newfirst = str:find(sep, first, noregex) + if not last then break end + table.insert(t, str:sub(first, last-1)) + first = newfirst+1 + end + table.insert(t, str:sub(first, #str)) + end + return t + else + error( + 'string.split: argument #2: expected string or nil, got '..type(sep), 2) + end +end +-- Split string to a list of char bytes +function string.bytes(s) + local b = {} + for i=1,#s do + local c = s:sub(i,i) + table.insert(b, c:byte()) + end + return b +end +-- Trim leading and trailing whitespace +function string.trim(s, ws) + ws = ws or '[ \t\r\t]' + return s:gsub('^'..ws..'+', ''):gsub(ws..'+$', '')..'' +end +-- String slicing and searching using [] operator +local str_meta = getmetatable('') +local str_meta_index_old= str_meta.__index +function str_meta.__index(s,k) + if type(k)=='string' then + return str_meta_index_old[k] + elseif type(k)=='number' then + if k<0 then k = #s+k+1 end + return string.sub(s,k,k) + elseif type(k)=='table' then + local a = k[1]<0 and (#s+k[1]+1) or k[1] + local b = k[2]<0 and (#s+k[2]+1) or k[2] + return string.sub(s,a,b) + end +end +-- String iterator +function string.chars(s) + local i = 0 + return function() + i = i+1 + if i<=#s then return s:sub(i,i) + else return nil end + end +end +-- Escape sequences +local defaultEscapes = { + ['\\'] = '\\\\', + ['\''] = '\\\'', + ['\"'] = '\\\"', + ['\t'] = '\\t', + ['\r'] = '\\r', + ['\n'] = '\\n', + ['\0'] = '\\0', +} +function string.escape(s, escapes) + escapes = escapes or defaultEscapes + local t = {} + for i=1,#s do + local c = s:sub(i,i) + table.insert(t, escapes[c] or c) + end + return table.concat(t) +end +local defaultEscapeChar = '\\' +local defaultUnescapes = { + ['\\'] = '\\', + ['\''] = '\'', + ['\"'] = '\"', + ['t'] = '\t', + ['r'] = '\r', + ['n'] = '\n', + ['0'] = '\0', +} +function string.unescape(s, escapeChar, unescapes) + escapeChar = escapeChar or defaultEscapeChar + unescapes = unescapes or defaultUnescapes + local t = {} + local inEscape = false + for i=1,#s do + local c = s:sub(i,i) + if inEscape then + table.insert(t, unescapes[c] + or error('string.unescape: invalid escape sequence: \'' + ..escapeChar..c..'\'')) + elseif c==escapeChar then + inEscape = true + else + table.insert(t, c) + end + end + return table.concat(t) +end + + +-- IO + +io = io or {} +-- Read entire file at once, return nil,err if access failed +function io.readfile(filename) + local fi,err = io.open(filename, 'rb') + if not fi then return nil,err end + local s = fi:read("*a") + fi:close() + return s +end +-- Write data to file all at once, return true if success / false,err if failure +function io.writefile(filename, data) + local fi,err = io.open(filename, 'wb') + if not fi then return false,err end + fi:write(data) + fi:close() + return true,nil +end + + +-- Math + +-- Round +function math.round(x) + return math.floor(x+0.5) +end +-- Mod that accounts for floating point inaccuracy +function math.mod(a,b) + local m = a%b + if m==0 or math.abs(m)<1e-15 or math.abs(m-b)<1e-15 then return 0 + else return m end +end +-- Clamp value between min and max +function math.clamp(v, n, x) + return math.min(x, math.max(v, n)) +end diff --git a/src/util/vector.lua b/src/util/vector.lua new file mode 100644 index 0000000..ec242b4 --- /dev/null +++ b/src/util/vector.lua @@ -0,0 +1,219 @@ + +-- Vector math class with operators +local vector_meta +local vector_new +local function vector_check(v, n, name, argn) + if not v.__is_vector then + error('vector '..name..': argument #'..(argn or 1) + ..': expected vector, got '..type(v), n+1) end +end +local function vector_checksamelen(v1, v2, name) + vector_check(v1, 3, name, 1) + vector_check(v2, 3, name, 2) + if #v1~=#v2 then + error('vector '..name..': vector lengths do not match (lengths are ' + ..#v1..' and '..#v2..')', 3) end + return #v1 +end +local function vector_checklen(v1, v2, name, len) + vector_check(v1, 3, name, 1) + vector_check(v2, 3, name, 2) + if #v1~=len or #v2~=len then + error('vector '..name..': vector lengths are not '..len..' (lengths are ' + ..#v1..' and '..#v2..')', 3) end +end +local function vector_opnnn(name, op) + return function(v1, v2) + local len = vector_checksamelen(v1, v2, name) + local v3 = {} + for i = 1, len do + v3[i] = op(v1[i], v2[i]) + end + return vector_new(v3) + end +end +local function vector_opnxn(name, op) + return function(v1, v2) + local v1v = type(v1)=='table' and v1.__is_vector + local v2v = type(v2)=='table' and v2.__is_vector + if v1v and v2v then + local len = vector_checksamelen(v1, v2, name) + local v3 = {} + for i = 1, len do + v3[i] = op(v1[i], v2[i]) + end + return vector_new(v3) + else + if v2v then v1,v2 = v2,v1 end + local len = #v1 + local v3 = {} + for i = 1, len do + v3[i] = op(v1[i], v2) + end + return vector_new(v3) + end + end +end +local function vector_opn0n(name, op) + return function(v1) + --vector_check(v1, 1, name) + local len = #v1 + local v2 = {} + for i = 1, len do + v2[i] = op(v1[i]) + end + return vector_new(v2) + end +end +local vector_indices = {x = 1, y = 2, z = 3, w = 4, r = 1, g = 2, b = 3, a = 4} +local vector_meta = { + __is_vector = true, + __index = function(t, k) + if tonumber(k) then return rawget(t, k) + elseif vector_indices[k] then return rawget(t, vector_indices[k]) + else return getmetatable(t)[k] + end + end, + __newindex = function(t, k, v) + if tonumber(k) then rawset(t, k, v) + elseif vector_indices[k] then rawset(t, vector_indices[k], v) + else return + end + end, + __add = vector_opnnn('add', function(x1, x2) return x1+x2 end), + __sub = vector_opnnn('sub', function(x1, x2) return x1-x2 end), + __mul = vector_opnxn('mul', function(x1, x2) return x1*x2 end), + __div = vector_opnxn('div', function(x1, x2) return x1/x2 end), + __pow = vector_opnxn('pow', function(x1, x2) return x1^x2 end), + __unm = vector_opn0n('inv', function(x1) return -x1 end), + __concat = nil, + --__len = function(v1) return #v1 end, + __len = nil, + __eq = function(v1, v2) + local len = vector_checksamelen(v1, v2, 'equals') + for i = 1, len do + if v1[i]~=v2[i] then return false end + end + return true + end, + __lt = nil, + __le = nil, + __call = nil, + abs = vector_opn0n('abs', math.abs), + length = function(v1) + --vector_check(v1, 2, 'length') + local len = #v1 + local l = 0 + for i = 1, len do + l = l + v1[i]^2 + end + return math.sqrt(l) + end, + normalize = function(v1) + --vector_check(v1, 2, 'normal') + local length = v1:length() + local len = #v1 + local v3 = {} + for i = 1, len do + if length==0 then v3[i] = 0 + else v3[i] = v1[i]/length end + end + return vector_new(v3) + end, + __tostring = function(v1) + --vector_check(v1, 2, 'tostring') + local st = {} + local len = #v1 + for i = 1, len do + table.insert(st, tostring(v1[i])) + end + return '{ '..table.concat(st, ', ')..' }' + end, + unpack = function(v1) return unpack(v1) end, + floor = vector_opn0n('floor', function(x1) return math.floor(x1) end), + ceil = vector_opn0n('ceil' , function(x1) return math.ceil (x1) end), + round = vector_opn0n('round', function(x1) return math.floor(x1+0.5) end), + dot = function(v1, v2) + local len = vector_checksamelen(v1, v2, 'dot') + local x = 0 + for i = 1, len do + x = x + v1[i]*v2[i] + end + return x + end, + cross = function(v1, v2) + vector_checklen(v1, v2, 'cross', 3) + return vector_new{ + v1[2]*v2[3] - v1[3]*v2[2], + v1[3]*v2[1] - v1[1]*v2[3], + v1[1]*v2[2] - v1[2]*v2[1], + } + end, + rotateByAngleId = function(v1, r) + --vector_check(v1, 2, 'rotate') + if type(r)~='number' or r%1~=0 then + error('vector rotateByAngleId: invalid rotation '..tostring(r), 2) end + r = r%4 + local v2 + if r==0 then v2 = vector_new{ v1[1], v1[2], v1[3] } + elseif r==1 then v2 = vector_new{ v1[2], -v1[1], v1[3] } + elseif r==2 then v2 = vector_new{ -v1[1], -v1[2], v1[3] } + elseif r==3 then v2 = vector_new{ -v1[2], v1[1], v1[3] } + else error('vector rotateByAngleId: invalid rotation '..r, 2) end + return v2 + end, + rotate2d = function(v, r) + --vector_check(v, 2, 'rotate2d') + if type(r)~='number' then + error('vector rotate2d: invalid rotation '..tostring(r), 2) end + local len = math.sqrt(v[1]^2 + v[2]^2) + local ang = math.atan2(v[2], v[1]) + r + local v2 = vector_new{ math.cos(ang)*len, math.sin(ang)*len } + return v2 + end, + tsString = function(v) + --vector_check(v, 2, 'tsString') + return table.concat(v, ' ') + end, + distance = function(v1, v2) + local len = vector_checksamelen(v1, v2, 'distance') + local sum = 0 + for i=1,len do + sum = sum + (v1[i] - v2[i])^2 + end + return math.sqrt(sum) + end, + copy = function(v) + --vector_check(v, 2, 'copy') + return vector_new(v) + end, +} +vector_new = function(vi) + if vi then + if type(vi)=='string' then + local vi2 = {} + for val in vi:gmatch('[0-9%.%-e]+') do + table.insert(vi2, tonumber(val)) + end + vi = vi2 + elseif type(vi)~='table' then + error('vector: argument #1: expected input table, got '..type(vi), 2) + end + local v = {} + if #vi>0 then + for i = 1, #vi do v[i] = vi[i] end + else + for n, i in pairs(vector_indices) do v[i] = vi[n] end + if #v==0 then + error('vector: argument #1: table contains no values', 2) + end + end + setmetatable(v, vector_meta) + return v + else + error('vector: argument #1: expected input table, got nil', 2) + end +end + +vector = vector_new +return vector_new