--==========================================================================
--== Скрипт определения списка предметов на поясе актора
--== Список заносится в таблицу db.belt
--== Автор: Singapur22
--== Дата последнего изменения: 23 августа 2010 года
--==========================================================================

local separator = nil        --//переменная для сохранения userdata разделителя
local del_separator = false  --//ключь удаления разделителя
local start_add_belt = false --//ключь начала заполнения таблицы db.belt
local stop_update = false
local start_function = true

--основная функция итерации инвентаря
--(привязана к функции update() в файле bind_stalker.script)
function IterateInventory()
	if stop_update == true then return end
	
	--//удаление всех случайно-сохранённых разделителей (производится при загрузке/перезагрузке скрипта)
	if start_function then
	    db.actor:inventory_for_each(function(item)
		    if item:section() == "separator2" then
			    alife():release(item, true)
			end
		end)
		separator = nil
	    del_separator = false
		start_function = false
	end
	
	--//удаление разделителя (третий цикл)
	if del_separator and separator then
	    this.DeleteSeparator()
		stop_update = true
		hud_detector.initialise_det()
		return
	end
	
	--//итерация инвентаря (второй цикл)
	if separator then
	    db.belt = {}
	    db.actor:inventory_for_each(ScanInventory)
		del_separator = true
		start_add_belt = false
	else
	--//спавн разделителя (первый цикл)
	    separator = alife():create("separator2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
	end
end

--функция удаления разделителя 
function DeleteSeparator()
    alife():release(separator, true)
	separator = nil
	del_separator = false
end

--функция сканирования инвентаря
function ScanInventory(item)
    local section = item:section()
	
    if start_add_belt and not DetermineSlot(item:id()) then
		db.belt[section] = (not db.belt[section] and 1) or (db.belt[section] + 1)
	end

    if item:section() == "separator2" then
	    start_add_belt = true
	end
end

--функция определения привязки объекта к одному из слотов
function DetermineSlot(item_id)	
	for i=0, 12 do
	    local obj = db.actor:item_in_slot( i )
		if obj and obj:id() == item_id then
		    return true
		end
	end
	return false
end

--функция запуска обновления таблицы при закрытии инвентаря
--(привязана к колбэку info_callback() в файле bind_stalker.script)
function InventoryInfo(info)
    if info == "ui_inventory" or info == "ui_car_body" or info == "ui_trade" then
		if separator then
		    this.DeleteSeparator()
		end
	elseif info == "ui_inventory_hide" or info == "ui_car_body_hide" or info == "ui_trade_hide" then
		stop_update = false
	end
end

--функция запуска обновления таблицы при потере предмета
--(привязана к колбэку on_item_drop() в файле bind_stalker.script)
function Drop(obj)
    if obj:section() ~= "separator2" then
	    stop_update = false
	end
end
