alife():create() при наличии в аргументах parent_id берет его координаты, если parent ИЛИ в онлайне, или в том же гэйм-вертексе, что указан в аргументах.
Иначе все становится нулями, после чего созданный объект зачем-то уничтожается.
Но, если parent не живой, и в онлайне, тогда, наоборот, его надо загнать в офф, чтобы координаты стали валидны.
Итого, alife():create( section, vector(), 0, 0, parent.id ) допустимо для онлайна, но alife():create( section, parent.pos, parent.lvid, parent.gvid, parent.id ) в остальных случаях. При этом соответствие/несоответствие позиции, lvid и gvid между собой имеет значение в зависимости от флагов И в зависимости от величины несоответствия. Так, позиция, относящаяся к соседнему gv даст случайные координаты входа в онлайн. Слишком большое удаление позиции от позиции lv даст "падение" в lv. При незначительном отклонении и отсутствии принудительной привязки к lv можем нормально "повесить в воздухе" именно там, где хотим.
upd: ну вот собственно да:
if (alife_query)
remove (smart_cast<CSE_ALifeDynamicObject*>(item),game_vertex_id);
else
level().remove (smart_cast<CSE_ALifeDynamicObject*>(item));
Именно должен совпадать gv, чтобы правильно удалить, чтобы потом привязать к parentу.
Ровно по анекдоту про тонзиллэктомию трансректально. Ибо ООП (tm)