Change the creation/deletion of tangibles so that the tangible database is never really deleted.
This commit is contained in:
@@ -26,7 +26,7 @@ LuaDefine(tangible_animstate, "tan",
|
||||
LuaRet graphic, plane, x, y, z, facing;
|
||||
LuaStack LS(L, tanobj, graphic, plane, x, y, z, facing);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj, false);
|
||||
const AnimStep &aqback = tan->anim_queue_.back();
|
||||
LS.set(graphic, aqback.graphic());
|
||||
LS.set(plane, aqback.plane());
|
||||
@@ -44,7 +44,7 @@ LuaDefine(tangible_xyz, "tan",
|
||||
LuaRet x, y, z;
|
||||
LuaStack LS(L, tanobj, x, y, z);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj, false);
|
||||
const AnimStep &aqback = tan->anim_queue_.back();
|
||||
LS.set(x, aqback.xyz().x);
|
||||
LS.set(y, aqback.xyz().y);
|
||||
@@ -60,7 +60,7 @@ LuaDefine(tangible_animate, "tan,configtable",
|
||||
LuaStack LS(L, tanobj, config);
|
||||
LuaKeywordParser kp(LS, config);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj, false);
|
||||
int64_t id = w->alloc_id_predictable();
|
||||
AnimStep step;
|
||||
step.configure(kp, tan->anim_queue_.back());
|
||||
@@ -82,7 +82,7 @@ LuaDefine(tangible_setclass, "tan,class",
|
||||
LuaVar classtab, mt;
|
||||
LuaStack LS(L, tanobj, classname, classtab, mt);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
w->tangible_get(LS, tanobj);
|
||||
w->tangible_get(LS, tanobj, false);
|
||||
eng::string err = LS.getclass(classtab, classname);
|
||||
if (err != "") {
|
||||
luaL_error(L, "%s", err.c_str());
|
||||
@@ -101,7 +101,7 @@ LuaDefine(tangible_getclass, "tan",
|
||||
LuaRet classname;
|
||||
LuaStack LS(L, tanobj, mt, classtab, classname);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
w->tangible_get(LS, tanobj);
|
||||
w->tangible_get(LS, tanobj, false);
|
||||
LS.getmetatable(mt, tanobj);
|
||||
LS.rawget(classtab, mt, "__index");
|
||||
eng::string name = LS.classname(classtab);
|
||||
@@ -120,8 +120,10 @@ LuaDefine(tangible_delete, "tan",
|
||||
LuaArg tanobj;
|
||||
LuaStack LS(L, tanobj);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
Tangible *tan = w->tangible_get(LS, tanobj);
|
||||
assert(tan != nullptr); // this should be checked above.
|
||||
Tangible *tan = w->tangible_get(LS, tanobj, true);
|
||||
if (tan == nullptr) {
|
||||
return LS.result();
|
||||
}
|
||||
if (tan->is_an_actor()) {
|
||||
luaL_error(L, "Cannot delete a player using tangible.delete, use tangible.redirect instead.");
|
||||
return 0;
|
||||
@@ -205,14 +207,14 @@ LuaDefine(tangible_redirect, "tan1,tan2,bulldozetan1",
|
||||
LuaStack LS(L, actor1, actor2, bldz);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
bool bulldoze = LS.ckboolean(bldz);
|
||||
Tangible *tan1 = w->tangible_get(LS, actor1);
|
||||
Tangible *tan1 = w->tangible_get(LS, actor1, false);
|
||||
if (!tan1->is_an_actor()) {
|
||||
luaL_error(L, "redirect source is not an actor");
|
||||
}
|
||||
if (LS.isnil(actor2)) {
|
||||
w->redirects_[tan1->id()] = 0;
|
||||
} else {
|
||||
Tangible *tan2 = w->tangible_get(LS, actor2);
|
||||
Tangible *tan2 = w->tangible_get(LS, actor2, false);
|
||||
tan2->configure_id_pool_for_actor();
|
||||
w->redirects_[tan1->id()] = tan2->id();
|
||||
}
|
||||
@@ -268,7 +270,7 @@ LuaDefine(tangible_near, "tan,radius,omit_nowhere,omit_self",
|
||||
LuaRet list;
|
||||
LuaStack LS(L, ltan, lradius, lomit_nowhere, lomit_self, list);
|
||||
World *w = World::fetch_global_pointer(L);
|
||||
Tangible *tan = w->tangible_get(LS, ltan);
|
||||
Tangible *tan = w->tangible_get(LS, ltan, false);
|
||||
const AnimStep &aqback = tan->anim_queue_.back();
|
||||
|
||||
PlaneScan scan;
|
||||
@@ -460,13 +462,20 @@ LuaDefine(tangible_start, "tangible,function,arg1,arg2...",
|
||||
}
|
||||
}
|
||||
|
||||
// Check the entire tangible list for validity.
|
||||
for (int i = 1; ; i++) {
|
||||
LS.rawget(place, tanlist, i);
|
||||
if (LS.isnil(place)) break;
|
||||
w->tangible_get(LS, place, false);
|
||||
}
|
||||
|
||||
// Start threads on all the tangibles.
|
||||
for (int i = 1; ; i++) {
|
||||
LS.rawget(place, tanlist, i);
|
||||
if (LS.isnil(place)) break;
|
||||
|
||||
// Confirm that the place is a valid tangible,
|
||||
// and get the tangible ID.
|
||||
w->tangible_get(LS, place);
|
||||
place_id = LS.tanid(place);
|
||||
|
||||
// Get place's metatable and threads table.
|
||||
|
||||
Reference in New Issue
Block a user