local bom_id, upd_time
local start_flag = false
-- эта функция срабатывает при потере бомбы из инвентаря
function drop_bomb(item)
if item:section() == "bomba" then
start_flag = true
bom_id = item:id()
end
end
-- эта функция запускает меню установки таймера, а так же в ней находится сам таймер для бомбы
function update()
if start_flag then -- если выкинули бомбу
start_flag = false
local sobj = alife():object(bom_id) -- получаем серверный объект предмета
-- если бомбу переложили в ящик или труп, или продали её, то меню не открываем
if sobj == nil or sobj.parent_id ~= 65535 then
bom_id = nil
return
end
-- закрываем окно инвентаря, если оно открыто
if level.main_input_receiver() then
level.start_stop_menu(level.main_input_receiver(), true)
end
-- ищем в псторе актора свободную переменную для бомбы: для сохранения её id и для таймера
local ret = false
for i=1,10 do -- одновременно могут работать максимум 10 таймеров
if xr_logic.pstor_retrieve(db.actor, "bname"..i) == nil then
local hud = timer_menu(get_hud())
level.start_stop_menu(hud,true)
ret = true
break
end
end
if ret then return end
-- если вдруг превысили лимит: пришлём сообщение об этом
news_manager.send_tip(db.actor, "Нельзя устанавливать более 10-ти бомб одновременно!")
end
-- это сам таймер, подробно описывать его работу не буду
if not upd_time then upd_time = time_global() + 1000
elseif upd_time < time_global() then
upd_time = time_global() + 1000
local time = game.time()
for a=1,10 do
local t = xr_logic.pstor_retrieve(db.actor, "bt"..a)
if t and t <= time then
local id = xr_logic.pstor_retrieve(db.actor, "bname"..a)
expl_bomb(id)
db.storage[db.actor:id()].pstor["bt"..a] = nil
db.storage[db.actor:id()].pstor["bname"..a] = nil
break
end
end
end
end
-- этой функцией взрываем бомбу: наносим ей большой хит
function expl_bomb(b_id)
local obj = level.object_by_id(b_id)
if obj then -- если бомба в онлайне, то взрываем
local h = hit()
h.impulse = 0
h.draftsman = obj
h.direction = vector():set(0,0,0)
h.power = 100
h.type = hit.fire_wound
obj:hit(h)
else -- если бомба в оффлайне или её вообще не существует, пишем об ошибке
news_manager.send_tip(db.actor, "ОШИБКА! Бомба не взорвана!")
end
end
-- далее идёт класс меню для установки таймера
class "timer_menu" (CUIScriptWnd)
function timer_menu:__init() super()
self:Init(0,0,1024,768)
local xml = CScriptXmlInit()
xml:ParseFile("ui_bomba_menu.xml") -- файл-описатель
self.back = xml:InitStatic("background", self) -- фон-рамка
xml:InitStatic("cap_bomba", self.back) -- заголовок окна
xml:InitStatic("cap_timer", self.back) -- надпись
self.timer = xml:InitSpinNum("timer_num", self.back) -- окошко для установки времени
local btn
-- кнопка старта таймера
btn = xml:Init3tButton("btn_start", self.back)
self:Register(btn, "btn_start")
self:AddCallback("btn_start", ui_events.BUTTON_CLICKED, self.OnBtn_start, self)
-- кнопка отмены
btn = xml:Init3tButton("btn_cancel", self.back)
self:Register(btn, "btn_cancel")
self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.OnBtn_quit, self)
end
function timer_menu:__finalize() end
function timer_menu:OnBtn_start()
local t = tonumber(self.timer:GetText()) -- получаем значение
local time = game.time()+t*1000*system_ini():r_u32("alife", "time_factor") -- переводим его в игровые миллисекунды
-- запускаем таймер
for i=1,10 do
if xr_logic.pstor_retrieve(db.actor, "bname"..i) == nil then
xr_logic.pstor_store(db.actor, "bt"..i, time)
xr_logic.pstor_store(db.actor, "bname"..i, bom_id)
break
end
end
self:OnBtn_quit()
end
function timer_menu:OnBtn_quit()
bom_id = nil
self:GetHolder():start_stop_menu(self, true)
end
-- Управление с клавиатуры
function timer_menu:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self:OnBtn_quit()
elseif dik == DIK_keys.DIK_RETURN then
self:OnBtn_start()
end
end
return true
end