mirror of
https://github.com/UberGames/RPG-X2.git
synced 2025-02-01 04:40:42 +00:00
Added Multithreading to Lua where it made sense.
This commit is contained in:
parent
69de94a8dd
commit
af89563973
3 changed files with 220 additions and 69 deletions
287
game/g_lua.c
287
game/g_lua.c
|
@ -163,6 +163,28 @@ qboolean G_LuaInit()
|
||||||
return qtrue;
|
return qtrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean G_LuaResume(lvm_t *vm, lua_State *T, char *func, int nargs) {
|
||||||
|
int res = lua_resume(T, nargs);
|
||||||
|
|
||||||
|
if(res == LUA_ERRRUN) {
|
||||||
|
LUA_LOG("Lua: %s error running lua script: %s\n", func, lua_tostring(T, -1));
|
||||||
|
G_Printf(S_COLOR_YELLOW "Lua: %s error running lua script: %s\n", func, lua_tostring(T, -1));
|
||||||
|
lua_pop(T, 1);
|
||||||
|
vm->error++;
|
||||||
|
return qfalse;
|
||||||
|
} else if(res == LUA_ERRMEM) {
|
||||||
|
LUA_LOG("Lua: memory allocation error #2 ( %s )\n", vm->filename);
|
||||||
|
vm->error++;
|
||||||
|
return qfalse;
|
||||||
|
} else if(res == LUA_ERRERR) {
|
||||||
|
LUA_LOG("Lua: traceback error ( %s )\n", vm->filename);
|
||||||
|
G_Printf(S_COLOR_YELLOW "Lua: traceback error ( %s )\n", vm->filename);
|
||||||
|
vm->error++;
|
||||||
|
return qfalse;
|
||||||
|
}
|
||||||
|
return qtrue;
|
||||||
|
}
|
||||||
|
|
||||||
qboolean G_LuaCall(lvm_t * vm, char *func, int nargs, int nresults)
|
qboolean G_LuaCall(lvm_t * vm, char *func, int nargs, int nresults)
|
||||||
{
|
{
|
||||||
int res = lua_pcall(vm->L, nargs, nresults, 0);
|
int res = lua_pcall(vm->L, nargs, nresults, 0);
|
||||||
|
@ -194,6 +216,24 @@ qboolean G_LuaCall(lvm_t * vm, char *func, int nargs, int nresults)
|
||||||
#define SAY_ALL 0
|
#define SAY_ALL 0
|
||||||
#define SAY_TEAM 1
|
#define SAY_TEAM 1
|
||||||
|
|
||||||
|
qboolean G_LuaGetFunctionT(lua_State *T, char *name)
|
||||||
|
{
|
||||||
|
if(T)
|
||||||
|
{
|
||||||
|
lua_getglobal(T, name);
|
||||||
|
if(lua_isfunction(T, -1))
|
||||||
|
{
|
||||||
|
return qtrue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lua_pop(T, 1);
|
||||||
|
return qfalse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return qfalse;
|
||||||
|
}
|
||||||
|
|
||||||
qboolean G_LuaGetFunction(lvm_t * vm, char *name)
|
qboolean G_LuaGetFunction(lvm_t * vm, char *name)
|
||||||
{
|
{
|
||||||
if(vm->L)
|
if(vm->L)
|
||||||
|
@ -526,6 +566,7 @@ qboolean LuaHook_G_EntityThink(char *function, int entity)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -534,12 +575,21 @@ qboolean LuaHook_G_EntityThink(char *function, int entity)
|
||||||
{
|
{
|
||||||
if(vm->id < 0 )
|
if(vm->id < 0 )
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
if(!G_LuaCall(vm, function, 1, 0))
|
continue;
|
||||||
{
|
lua_pushinteger(vm->L, entity);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 1, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
if(!G_LuaResume(vm, t, function, 1))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -550,6 +600,7 @@ qboolean LuaHook_G_EntityTouch(char *function, int entity, int other)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -558,13 +609,23 @@ qboolean LuaHook_G_EntityTouch(char *function, int entity, int other)
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
lua_pushinteger(vm->L, other);
|
continue;
|
||||||
if(!G_LuaCall(vm, function, 2, 0))
|
lua_pushinteger(vm->L, entity);
|
||||||
{
|
lua_pushinteger(vm->L, other);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 2, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
lua_pushinteger(t, other);
|
||||||
|
if(!G_LuaResume(vm, t, function, 2))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -575,6 +636,7 @@ qboolean LuaHook_G_EntityUse(char *function, int entity, int other, int activato
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -583,14 +645,24 @@ qboolean LuaHook_G_EntityUse(char *function, int entity, int other, int activato
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
lua_pushinteger(vm->L, other);
|
continue;
|
||||||
lua_pushinteger(vm->L, activator);
|
lua_pushinteger(vm->L, entity);
|
||||||
if(!G_LuaCall(vm, function, 3, 0))
|
lua_pushinteger(vm->L, other);
|
||||||
{
|
lua_pushinteger(vm->L, activator);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 3, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
lua_pushinteger(t, other);
|
||||||
|
lua_pushinteger(t, activator);
|
||||||
|
G_LuaResume(vm, t, function, 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -601,6 +673,7 @@ qboolean LuaHook_G_EntityHurt(char *function, int entity, int inflictor, int att
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -609,14 +682,25 @@ qboolean LuaHook_G_EntityHurt(char *function, int entity, int inflictor, int att
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
lua_pushinteger(vm->L, inflictor);
|
continue;
|
||||||
lua_pushinteger(vm->L, attacker);
|
lua_pushinteger(vm->L, entity);
|
||||||
if(!G_LuaCall(vm, function, 3, 0))
|
lua_pushinteger(vm->L, inflictor);
|
||||||
{
|
lua_pushinteger(vm->L, attacker);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 3, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
lua_pushinteger(t, inflictor);
|
||||||
|
lua_pushinteger(t, attacker);
|
||||||
|
if(!G_LuaResume(vm, t, function, 3))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -626,7 +710,8 @@ qboolean LuaHook_G_EntityHurt(char *function, int entity, int inflictor, int att
|
||||||
qboolean LuaHook_G_EntityDie(char *function, int entity, int inflictor, int attacker, int dmg, int mod)
|
qboolean LuaHook_G_EntityDie(char *function, int entity, int inflictor, int attacker, int dmg, int mod)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -635,16 +720,29 @@ qboolean LuaHook_G_EntityDie(char *function, int entity, int inflictor, int atta
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
lua_pushinteger(vm->L, inflictor);
|
continue;
|
||||||
lua_pushinteger(vm->L, attacker);
|
lua_pushinteger(vm->L, entity);
|
||||||
lua_pushinteger(vm->L, dmg);
|
lua_pushinteger(vm->L, inflictor);
|
||||||
lua_pushinteger(vm->L, mod);
|
lua_pushinteger(vm->L, attacker);
|
||||||
if(!G_LuaCall(vm, function, 5, 0))
|
lua_pushinteger(vm->L, dmg);
|
||||||
{
|
lua_pushinteger(vm->L, mod);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 5, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
lua_pushinteger(t, inflictor);
|
||||||
|
lua_pushinteger(t, attacker);
|
||||||
|
lua_pushinteger(t, dmg);
|
||||||
|
lua_pushinteger(t, mod);
|
||||||
|
if(!G_LuaResume(vm, t, function, 5))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -655,6 +753,7 @@ qboolean LuaHook_G_EntityFree(char *function, int entity)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -663,12 +762,21 @@ qboolean LuaHook_G_EntityFree(char *function, int entity)
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
if(!G_LuaCall(vm, function, 1, 0))
|
continue;
|
||||||
{
|
lua_pushinteger(vm->L, entity);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 1, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
if(!G_LuaResume(vm, t, function, 1))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -678,17 +786,27 @@ qboolean LuaHook_G_EntityFree(char *function, int entity)
|
||||||
qboolean LuaHook_G_EntityReached(char *function, int entity) {
|
qboolean LuaHook_G_EntityReached(char *function, int entity) {
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++) {
|
for(i = 0; i < NUM_VMS; i++) {
|
||||||
vm = lVM[i];
|
vm = lVM[i];
|
||||||
if(vm) {
|
if(vm) {
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
if(!G_LuaCall(vm, function, 1, 0))
|
continue;
|
||||||
continue;
|
lua_pushinteger(vm->L, entity);
|
||||||
|
if(!G_LuaCall(vm, function, 1, 0))
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
if(!G_LuaResume(vm, t, function, 1))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return qfalse;
|
return qfalse;
|
||||||
|
@ -697,17 +815,27 @@ qboolean LuaHook_G_EntityReached(char *function, int entity) {
|
||||||
qboolean LuaHook_G_EntityReachedAngular(char *function, int entity) {
|
qboolean LuaHook_G_EntityReachedAngular(char *function, int entity) {
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++) {
|
for(i = 0; i < NUM_VMS; i++) {
|
||||||
vm = lVM[i];
|
vm = lVM[i];
|
||||||
if(vm) {
|
if(vm) {
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
if(!G_LuaCall(vm, function, 1, 0))
|
continue;
|
||||||
continue;
|
lua_pushinteger(vm->L, entity);
|
||||||
|
if(!G_LuaCall(vm, function, 1, 0))
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
if(!G_LuaResume(vm, t, function, 1))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return qfalse;
|
return qfalse;
|
||||||
|
@ -717,6 +845,7 @@ qboolean LuaHook_G_EntityTrigger(char *function, int entity, int other)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -725,13 +854,23 @@ qboolean LuaHook_G_EntityTrigger(char *function, int entity, int other)
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
lua_pushinteger(vm->L, other);
|
continue;
|
||||||
if(!G_LuaCall(vm, function, 2, 0))
|
lua_pushinteger(vm->L, entity);
|
||||||
{
|
lua_pushinteger(vm->L, other);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 2, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
lua_pushinteger(t, other);
|
||||||
|
if(!G_LuaResume(vm, t, function, 2))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -742,6 +881,7 @@ qboolean LuaHook_G_EntitySpawn(char *function, int entity)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
lvm_t *vm;
|
lvm_t *vm;
|
||||||
|
lua_State *t;
|
||||||
|
|
||||||
for(i = 0; i < NUM_VMS; i++)
|
for(i = 0; i < NUM_VMS; i++)
|
||||||
{
|
{
|
||||||
|
@ -750,12 +890,21 @@ qboolean LuaHook_G_EntitySpawn(char *function, int entity)
|
||||||
{
|
{
|
||||||
if(vm->id < 0)
|
if(vm->id < 0)
|
||||||
continue;
|
continue;
|
||||||
if(!G_LuaGetFunction(vm, function))
|
t = lua_newthread(vm->L);
|
||||||
continue;
|
if(!t) {
|
||||||
lua_pushinteger(vm->L, entity);
|
if(!G_LuaGetFunction(vm, function))
|
||||||
if(!G_LuaCall(vm, function, 1, 0))
|
continue;
|
||||||
{
|
lua_pushinteger(vm->L, entity);
|
||||||
continue;
|
if(!G_LuaCall(vm, function, 1, 0))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(!G_LuaGetFunctionT(t, function))
|
||||||
|
continue;
|
||||||
|
lua_pushinteger(t, entity);
|
||||||
|
if(!G_LuaResume(vm, t, function, 1))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,9 @@ void QDECL LUA_DEBUG(const char *fmt, ...);
|
||||||
void QDECL LUA_LOG(const char *fmt, ...);
|
void QDECL LUA_LOG(const char *fmt, ...);
|
||||||
qboolean G_LuaInit(void);
|
qboolean G_LuaInit(void);
|
||||||
qboolean G_LuaCall(lvm_t *vm, char *func, int nargs, int nresults);
|
qboolean G_LuaCall(lvm_t *vm, char *func, int nargs, int nresults);
|
||||||
|
qboolean G_LuaResume(lvm_t *vm, lua_State *T, char *func, int nargs);
|
||||||
qboolean G_LuaGetFunction(lvm_t *vm, char *name);
|
qboolean G_LuaGetFunction(lvm_t *vm, char *name);
|
||||||
|
qboolean G_LuaGetFunctionT(lua_State *T, char *name);
|
||||||
qboolean G_LuaStartVM(lvm_t *vm);
|
qboolean G_LuaStartVM(lvm_t *vm);
|
||||||
void G_LuaStopVM(lvm_t *vm);
|
void G_LuaStopVM(lvm_t *vm);
|
||||||
void G_LuaShutdown(void);
|
void G_LuaShutdown(void);
|
||||||
|
|
BIN
stefgame.suo
BIN
stefgame.suo
Binary file not shown.
Loading…
Reference in a new issue