XOBAH, а я что-то сказал про вылет? Вот описание логического типа для Lua:
Quote
К типу Boolean относятся значения false (ложь) и true (истина). Значения nil и false считаются ложными, любое другое значение считается истинным.
Как видно в Lua ноль и пустая строка всё же рассматривается как истина, так что похожие - не значит одинаковые. А теперь возьми и проведи вот такой эксперимент: вызови вот этот код:
Code
local console = get_console() if db.actor:object("af_medusa") ~= true then console:execute("load ~~~Actor hav't item") alife():create("af_medusa",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) else console:execute("load ~~~Actor have item") end
два раза, любым удобным тебе способом, и загляни в консоль. Единственным условие здесь служит отсутствие артефакта "медуза" при первом вызове этой функции.
Сообщение отредактировал ColR_iT - Понедельник, 04.06.2012, 19:18
ColR_iT, Действительно, db.actor:object("af_medusa") в функциях всегда возвращает false... Но все-таки, в precondition отлично используется return db.actor:object("af_medusa") Так я и не говорил, что они идентичны - просто похожи Спасибо
Кто знает как сделать так что бы во фриплее теней чернобыля после истинной концовки можно было поговорить с генералом Ворониным на Баре, а то захожу туда --- меня не пускают((( (ФРИПЛЕЙ ВЗЯЛ ИЗ OGSM 2.3.1.)
Может кому пригодится. Таймер с сохранением прошедшего времени.
local Timer_q local last_time_q = 0
function имя_функции() --/ (пере)запуск таймера (из диалога) ... Timer_q = time_global() + 180*1000 --/ взводим таймер на нужное время db.actor:give_info_portion("поршень") end
function timer_start_qwest() if has_alife_info("поршень") then if Timer_q==nil then if last_time_info ~= 0 then -- если есть остаток при перезагрузке, или переходе на другую локацию Timer_q = time_global()+last_time_q -- прибавляем к глобальному остаток end else last_time_q = Timer_q-time_global() -- определяем остаток if Timer_q < time_global() then -- если таймер меньше глобального то действие Timer_q = nil -- выключаем таймер last_time_q = 0 -- обнуляем остаток end end end
function init(obj) local torch = torch_binder(obj) obj:bind_object(torch) end
class "torch_binder" (object_binder) function torch_binder:__init(obj) super(obj) end
function torch_binder:reload(section) object_binder.reload(self, section) end
function torch_binder:reinit() object_binder.reinit(self) end
function torch_binder:update(delta) object_binder.update(self, delta) end
function torch_binder:net_spawn(data) return object_binder.net_spawn(self, data) end
function torch_binder:net_destroy() object_binder.net_destroy(self) end
function torch_binder:net_save_relevant() return true end
--// сохранение и загрузка табличных и прочих данных - так как фонарик всегда в онлайне - очень удобно использовать
function torch_binder:save(p) -- тут сохраняем значение object_binder.save(self, p) p:w_u32(last_time_q) -- запись p:w_u32(time_back.SaveBackTimer()) -- походу тут хранится end
function torch_binder:load® -- отсюда загружаем object_binder.load(self, r) last_time_q = r:r_u32() -- чтение time_back.LoadBackTimer(r:r_u32()) -- соответственно загружается end
Не забываем в items в секции фонаря прописать
Code
script_binding = имя функции.init
Лишнее оставил, может тоже кому то пригодится. Если это подходит к теме добавьте в шапку. Спс Erlik (aka Garry_Galler) за идею использования фонаря, и его код.
Добавлено (17.12.2012, 16:22) --------------------------------------------- Упс, забыл добавить что без скрипта time_back работать не будет!
Code
local iTimer local iLast
function StartBackTimer() if iLast then iTimer = time_global()+iLast --/ взводим таймер на остаток времени iLast else iTimer = time_global() + 900*1000 --/ 60 - это 1 минута, 900 - это 15 минут end end
function LoadBackTimer(iVal) iLast = iVal --// перезапуск таймера на остаток времени если мы выходили из игры if iLast then this.StartBackTimer() end end
function SaveBackTimer() --// запишем значение остатка времени return iLast end
Сообщение отредактировал ins33 - Понедельник, 17.12.2012, 17:45
"Проверка:Какой костюм одет(не одет)(например, Экзоскелет)" Надет ли костюм Код function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" одет else return false --/"exo_outfit" не одет end end Не надет ли костюм Код function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" не одет else return false --/"exo_outfit" одет end end
А это разве не одинаковые функции? Если нет, то в чём их разница (кроме комментариев)?
К сожалению не смог исправить пост выше. Таймер с сохранением прошедшего времени, и выводом секундомера на худ. Для использования, просто зарегистрируйте его в секции фонаря.
--[[--------------------------------------------------------------------------------------------------------- File : ins_timer.script Author of assembly : ins33 Start : Добавить в секцию фонаря "[device_torch]" script_binding = ins_timer.init -]]----------------------------------------------------------------------------------------------------------
local time_a -- Время таймера local rest_time_a = 0 -- Остаток
function update() this.timer() -- Таймер this.hud_timer() -- Вывод секундомера на худ. end
function start_timer() --/ запускаем таймер из диалога time_a = time_global() + 6*100 --/ взводим таймер 1000 = 1 сек. 60000 = 1 мин end
function timer() -- update if time_a == nil then if rest_time_a ~= 0 then -- если остаток > 0 то time_a = time_global() + rest_time_a -- прибавляем к глобальному остаток end else rest_time_a = time_a-time_global() -- определяем остаток? не понял зачем, вроде эта инфа уже есть! if time_a < time_global() then -- если таймер меньше глобального то --db.actor:give_info_portion("opozdal") -- выдача условия на провал (в данном случае инфопоршень) time_a = nil -- выключаем таймер rest_time_a = 0 -- обнуляем остаток end end end
-- выводим значение таймера в обратном отсчете на худ function hud_timer() --/ вызывается из ':update' сталкер-биндера local hud = get_hud() local st if time_a then st = hud:GetCustomStatic("hud_timer") if st==nil then hud:AddCustomStatic("hud_timer", true) st = hud:GetCustomStatic("hud_timer") end if rest_time_a~=nil then local hours = math.floor(rest_time_a/3600000) local minutes = math.floor(rest_time_a/60000 - hours*60) local seconds = math.floor(rest_time_a/1000 - hours*3600 - minutes*60) local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) st:wnd():SetTextST(text) end else if hud:GetCustomStatic("hud_timer")~=nil then hud:RemoveCustomStatic("hud_timer") end end end
function init(obj) local torch = torch_binder(obj) obj:bind_object(torch) end
class "torch_binder" (object_binder) function torch_binder:__init(obj) super(obj) end
function torch_binder:reload(section) object_binder.reload(self, section) end
function torch_binder:reinit() object_binder.reinit(self) end
function torch_binder:update(delta) object_binder.update(self, delta) update() end
function torch_binder:net_spawn(data) return object_binder.net_spawn(self, data) end
function torch_binder:net_destroy() object_binder.net_destroy(self) end
function torch_binder:net_save_relevant() return true end
--// сохранение и загрузка табличных и прочих данных - так как фонарик всегда в онлайне - очень удобно использовать
function torch_binder:save(p) -- тут сохраняем значение object_binder.save(self, p) p:w_u32(rest_time_a) p:w_u32(this.SaveBackTimer()) -- походу тут хранится end
function torch_binder:load® -- отсюда загружаем object_binder.load(self, r) rest_time_a = r:r_u32() this.LoadBackTimer(r:r_u32()) -- соответственно загружается end