Some changes to make login.init more consistent.
This commit is contained in:
@@ -171,6 +171,7 @@ public:
|
||||
LuaExtraArgs(int i, int s) : index_(i), size_(s) {}
|
||||
|
||||
LuaSpecial operator[] (int n) const { return LuaSpecial(index_ + n); }
|
||||
int index(int n) const { return index_ + n; }
|
||||
int size() const { return size_; }
|
||||
|
||||
friend class LuaCoreStack;
|
||||
|
||||
@@ -607,20 +607,13 @@ LuaDefine(tangible_start, "tangible,function,arg1,arg2...",
|
||||
"|to continue running until it blocks. But from that point"
|
||||
"|forward, the thread will never be resumed for any reason.") {
|
||||
|
||||
int top = lua_gettop(L);
|
||||
if (top < 2) {
|
||||
luaL_error(L, "Not enough arguments to tangible.start");
|
||||
return 0;
|
||||
}
|
||||
int varlen = top - 2;
|
||||
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
w->guard_blockable(L, "tangible.start");
|
||||
|
||||
LuaArg place, fname;
|
||||
LuaExtraArgs extra;
|
||||
LuaVar mt, classtab, plthreads, thread, thinfo, func, tanlist;
|
||||
LuaDefStack LS(L, mt, classtab, plthreads, thread, thinfo, func, tanlist);
|
||||
LuaSpecial place(1);
|
||||
LuaSpecial fname(2);
|
||||
LuaDefStack LS(L, place, fname, extra, mt, classtab, plthreads, thread, thinfo, func, tanlist);
|
||||
|
||||
// If they passed in a single tangible, convert it to a tangible list.
|
||||
int64_t place_id = LS.tanid(place);
|
||||
@@ -677,10 +670,10 @@ LuaDefine(tangible_start, "tangible,function,arg1,arg2...",
|
||||
// Create a new thread, set up function and arguments.
|
||||
lua_State *CO = LS.newthread(thread);
|
||||
lua_pushvalue(L, func.index());
|
||||
for (int i = 0; i < varlen; i++) {
|
||||
lua_pushvalue(L, i + 3);
|
||||
for (int i = 0; i < extra.size(); i++) {
|
||||
lua_pushvalue(L, extra.index(i));
|
||||
}
|
||||
lua_xmove(L, CO, varlen + 1);
|
||||
lua_xmove(L, CO, extra.size() + 1);
|
||||
|
||||
// Create the thread info table.
|
||||
LS.newtable(thinfo);
|
||||
|
||||
@@ -310,10 +310,13 @@ int64_t World::connection_create() {
|
||||
assert(stack_is_clear());
|
||||
int64_t id = id_global_pool_.get_one();
|
||||
{
|
||||
LuaVar database, classtab, mt, func;
|
||||
LuaExtStack LS(state(), database, classtab, mt, func);
|
||||
LuaVar database, classtab, config, mt, func;
|
||||
LuaExtStack LS(state(), database, classtab, config, mt, func);
|
||||
Tangible *tan = tangible_make(LS, database, id);
|
||||
|
||||
|
||||
// A blank config table to pass to 'init'
|
||||
LS.newtable(config);
|
||||
|
||||
// Set the login flags.
|
||||
if (is_authoritative()) {
|
||||
tan->client_id_ = id;
|
||||
@@ -327,7 +330,9 @@ int64_t World::connection_create() {
|
||||
|
||||
if (is_authoritative()) {
|
||||
LS.rawget(func, classtab, "init");
|
||||
spawn(LS, id, id, func, 0, false);
|
||||
lua_pushvalue(state(), database.index());
|
||||
lua_pushvalue(state(), config.index());
|
||||
spawn(LS, id, id, func, 2, false);
|
||||
}
|
||||
}
|
||||
connections_.emplace(id, id);
|
||||
@@ -977,13 +982,18 @@ void World::invoke_lua_source(int64_t actor_id, int64_t place_id, std::string_vi
|
||||
if (errors.empty()) {
|
||||
{
|
||||
lua_State *L = state();
|
||||
LuaVar lclass, lfunc;
|
||||
LuaExtStack LS(L, lclass, lfunc);
|
||||
|
||||
LuaVar lclass, lfunc, tangibles, actor, config;
|
||||
LuaExtStack LS(L, lclass, lfunc, tangibles, actor, config);
|
||||
LS.rawget(tangibles, LuaRegistry, "tangibles");
|
||||
LS.rawget(actor, tangibles, actor_id);
|
||||
LS.newtable(config);
|
||||
|
||||
LS.getclass(lclass, "world");
|
||||
if (LS.classname(lclass) != "") {
|
||||
LS.rawget(lfunc, lclass, "init");
|
||||
spawn(LS, actor_id, place_id, lfunc, 0, false);
|
||||
lua_pushvalue(L, actor.index());
|
||||
lua_pushvalue(L, config.index());
|
||||
spawn(LS, actor_id, place_id, lfunc, 2, false);
|
||||
}
|
||||
}
|
||||
run_scheduled_threads();
|
||||
|
||||
Reference in New Issue
Block a user