Some changes to make login.init more consistent.

This commit is contained in:
2026-06-09 17:36:58 -04:00
parent 7d6898edb3
commit 0b5c47d8c7
5 changed files with 38 additions and 35 deletions

Binary file not shown.

View File

@@ -171,6 +171,7 @@ public:
LuaExtraArgs(int i, int s) : index_(i), size_(s) {} LuaExtraArgs(int i, int s) : index_(i), size_(s) {}
LuaSpecial operator[] (int n) const { return LuaSpecial(index_ + n); } LuaSpecial operator[] (int n) const { return LuaSpecial(index_ + n); }
int index(int n) const { return index_ + n; }
int size() const { return size_; } int size() const { return size_; }
friend class LuaCoreStack; friend class LuaCoreStack;

View File

@@ -607,20 +607,13 @@ LuaDefine(tangible_start, "tangible,function,arg1,arg2...",
"|to continue running until it blocks. But from that point" "|to continue running until it blocks. But from that point"
"|forward, the thread will never be resumed for any reason.") { "|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); World *w = World::fetch_global_pointer(L);
w->guard_blockable(L, "tangible.start"); w->guard_blockable(L, "tangible.start");
LuaArg place, fname;
LuaExtraArgs extra;
LuaVar mt, classtab, plthreads, thread, thinfo, func, tanlist; LuaVar mt, classtab, plthreads, thread, thinfo, func, tanlist;
LuaDefStack LS(L, mt, classtab, plthreads, thread, thinfo, func, tanlist); LuaDefStack LS(L, place, fname, extra, mt, classtab, plthreads, thread, thinfo, func, tanlist);
LuaSpecial place(1);
LuaSpecial fname(2);
// If they passed in a single tangible, convert it to a tangible list. // If they passed in a single tangible, convert it to a tangible list.
int64_t place_id = LS.tanid(place); 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. // Create a new thread, set up function and arguments.
lua_State *CO = LS.newthread(thread); lua_State *CO = LS.newthread(thread);
lua_pushvalue(L, func.index()); lua_pushvalue(L, func.index());
for (int i = 0; i < varlen; i++) { for (int i = 0; i < extra.size(); i++) {
lua_pushvalue(L, i + 3); lua_pushvalue(L, extra.index(i));
} }
lua_xmove(L, CO, varlen + 1); lua_xmove(L, CO, extra.size() + 1);
// Create the thread info table. // Create the thread info table.
LS.newtable(thinfo); LS.newtable(thinfo);

View File

@@ -310,10 +310,13 @@ int64_t World::connection_create() {
assert(stack_is_clear()); assert(stack_is_clear());
int64_t id = id_global_pool_.get_one(); int64_t id = id_global_pool_.get_one();
{ {
LuaVar database, classtab, mt, func; LuaVar database, classtab, config, mt, func;
LuaExtStack LS(state(), database, classtab, mt, func); LuaExtStack LS(state(), database, classtab, config, mt, func);
Tangible *tan = tangible_make(LS, database, id); Tangible *tan = tangible_make(LS, database, id);
// A blank config table to pass to 'init'
LS.newtable(config);
// Set the login flags. // Set the login flags.
if (is_authoritative()) { if (is_authoritative()) {
tan->client_id_ = id; tan->client_id_ = id;
@@ -327,7 +330,9 @@ int64_t World::connection_create() {
if (is_authoritative()) { if (is_authoritative()) {
LS.rawget(func, classtab, "init"); 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); 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()) { if (errors.empty()) {
{ {
lua_State *L = state(); lua_State *L = state();
LuaVar lclass, lfunc; LuaVar lclass, lfunc, tangibles, actor, config;
LuaExtStack LS(L, lclass, lfunc); 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"); LS.getclass(lclass, "world");
if (LS.classname(lclass) != "") { if (LS.classname(lclass) != "") {
LS.rawget(lfunc, lclass, "init"); 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(); run_scheduled_threads();

View File

@@ -32,21 +32,20 @@ end
-- tangible.delete(actor) -- If actor is a connected player it will disconnect -- tangible.delete(actor) -- If actor is a connected player it will disconnect
-- This gets called on every login except the admin user. -- This gets called on every login except the admin user.
function login.init() function login.init(self, config)
local player = global.get("nextplayer") local player = global.get("nextplayer")
global.set("nextplayer", player + 1) global.set("nextplayer", player + 1)
dprint("login.init initializing player ", player) dprintf("login.init initializing %p, player %d", self, player)
actor.player = player self.player = player
tangible.keepactor(actor) -- do not delete this login when the client disconnects self.color={0,0,0,0,0,0,0,0,0,0,0,0}
actor.color={0,0,0,0,0,0,0,0,0,0,0,0} self.kills=0
actor.kills=0 self.killed=0
actor.killed=0 tangible.animinit{tan=self, anim={bp="character", mesh="manny", plane="earth", xyz={player * 100, 0, 90}}}
tangible.animinit{tan=actor, anim={bp="character", mesh="manny", plane="earth", xyz={player * 100, 0, 90}}} tangible.start(self, login.startscanning)
dprint("About to start scanning")
actor.startscanning()
end end
function login.startscanning() function login.startscanning()
dprintf("Scanning started. Actor=%p Place=%p", actor, place)
while true do while true do
login.onescan() login.onescan()
wait(1) wait(1)
@@ -75,13 +74,13 @@ function login.onescan()
end end
-- This gets called on the admin user. You can call login.init in here if you want. -- This gets called on the admin user. You can call login.init in here if you want.
function world.init() function world.init(self, config)
dprint("world.init") dprint("world.init")
global.set("nextplayer", 0) global.set("nextplayer", 0)
tangible.build{class=roster, anim={plane="earth", xyz={2000,0,0} } } tangible.build{class=roster, anim={plane="earth", xyz={2000,0,0} } }
tangible.build{class=cube, anim={plane="earth", xyz={500,-100,0}, mat_color={1,0,0}}} tangible.build{class=cube, anim={plane="earth", xyz={500,-100,0}, mat_color={1,0,0}}}
tangible.build{class=sphere, anim={plane="earth", xyz={500,100,0}, mat_color={0,0,1}}} tangible.build{class=sphere, anim={plane="earth", xyz={500,100,0}, mat_color={0,0,1}}}
login.init() login.init(self, config)
end end