local bom_id upd_time local start_flag false -- эта функция срабатывае

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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