--'------------------------------------------------------------------------------------------------------------------
--' Binder скриптовых зон
--' Используется только в одном месте в игре, на арене для того чтобы удалять "отработанные" предметы.
--'------------------------------------------------------------------------------------------------------------------

function bind(obj)
	local ini = obj:spawn_ini()

	if not ini then
		return
	end

	if ini:section_exist("arena_zone") then
		if alife() then
			obj:bind_object(arena_zone_binder(obj))
		end
	end
end

--'--------------------------------------------------------------------------------------------------------------------
--' класс arena_zone_binder. Он контролирует скриптовую зону для smart terrain
--'--------------------------------------------------------------------------------------------------------------------
local arena_zones = {}
class "arena_zone_binder" (object_binder)
function arena_zone_binder:__init(obj) super(obj)
	self.saved_obj = {}
	arena_zones[obj:name()] = self
end
function arena_zone_binder:net_spawn(server_object)
	if not object_binder.net_spawn(self, server_object) then
		return false
	end

	self.object:set_callback(callback.zone_enter, self.on_enter, self)
	self.object:set_callback(callback.zone_exit, self.on_exit, self)

	return true
end
function arena_zone_binder:net_destroy()
	self.object:set_callback(callback.zone_enter, nil)
	self.object:set_callback(callback.zone_exit, nil)

	object_binder.net_destroy(self)
end
function arena_zone_binder:purge_items()
	local alife = alife()
	for k,v in pairs(self.saved_obj) do
		local obj = alife:object(k)
		printf("release object %s, id %s", obj:name(), k)
		alife:release(obj, true)
	end	
end

--' Сохранение списка зарегистренных объектов
function arena_zone_binder:save(packet)
	printf("ARENA ZONE SAVE")
	object_binder.save(self, packet)
	set_save_marker(packet, "save", false, "arena_zone_binder")
	
	local num = #self.saved_obj
	packet:w_u8(num)
	for k,v in pairs(self.saved_obj) do
		packet:w_u16(k)
	end
	set_save_marker(packet, "save", true, "arena_zone_binder")
end
--' Загрузка списка зарегистренных объектов
function arena_zone_binder:load(packet)
	printf("ARENA ZONE LOAD")
	object_binder.load(self, packet)
	set_save_marker(packet, "load", false, "arena_zone_binder")

	local num = packet:r_u8()	
	for i=1,num do
		self.saved_obj[packet:r_u16()] = true
	end	
	set_save_marker(packet, "load", true, "arena_zone_binder")
end

--' callback на вход в зону. Нужно регистрить все объекты, кроме игрока.
--' Так как есть глюк, то этот коллбек вызывается и на вход и на выход из скриптовой зоны
function arena_zone_binder:on_enter(zone, obj)
	if obj:id() == db.actor:id() or obj:clsid() == clsid.obj_physic 
		or obj:clsid() == clsid.hanging_lamp or obj:clsid() == clsid.obj_phys_destroyable then
		return
	end

	printf("[zone %s] on_enter obj=%s, clsid=%s", zone:name(), obj:name(), obj:clsid())
	self.saved_obj[obj:id()] = true
end
function arena_zone_binder:on_exit(zone, obj)
	if obj:id() == db.actor:id() or obj:clsid() == clsid.obj_physic 
		or obj:clsid() == clsid.hanging_lamp or obj:clsid() == clsid.obj_phys_destroyable then
		return
	end

	printf("[zone %s] on_exit obj=%s, clsid=%s", zone:name(), obj:name(), obj:clsid())
	self.saved_obj[obj:id()] = nil
end


function purge_arena_items(name)
	local arena_zone = arena_zones[name]
	if arena_zone then
		arena_zone:purge_items()
	end
end