Перейти к контенту

ns ogsr NS OGSR: Правки и модификации


D1mon

Рекомендуемые сообщения

Подскажите пожалуйста - правил treasure_manager - пытался встроить отображение содержимого тайников на метке карты как в ОП 2.2.  в частности правил так 

--' Выдача тайника
function CTreasure:give_treasure(k, npc, friend)
    local v = self.treasure_info[k]
    local sim = alife()
    local sobj = sim:story_object(v.target)
    if sobj then
        news_manager.send_treasure(v.name)

                local txt_items = "%c[255,238,155,23] "
                
                if has_level.map_add_object_spot_ser(sobj.id, "treasure") then
                for i = 1, 65534 do
                local item = alife():object(i)
                if item and item.parent_id == sobj.id then
                txt_items = txt_items.."\\n • "..translate(system_ini():r_string(item:section_name(), "inv_name"))
                end


                                     
        --' Пометить на карте
        local text = "%c[255,238,155,23]" .. game.translate_string(v.name) .. "\\n" .. "%c[default]" .. game.translate_string(v.description)
        level.map_add_object_spot_ser(sobj.id, "treasure", text.."\\n"..txt_items)

не работат, что я накорявил нетак?

Поделиться этим сообщением


Ссылка на сообщение

@Купер , спасибо это сдвинуло с места - сумел нормально загрузиться и даже играть до выдачи тайника, при выдаче вылет. Насколько понимаю по логу ругается на это

[17.06.23 09:28:22.119] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
...l.k.e.r.ns.ogsr\gamedata\scripts\treasure_manager.script:519: attempt to index global 'has_level' (a nil value)
stack traceback:
	[C]: in function '__index'
	...l.k.e.r.ns.ogsr\gamedata\scripts\treasure_manager.script:519: in function 'give_treasure'

А так, это часть кода из правок к файлу treasure из мода ОП 2.2., котороая позволяет смотреть содержимое тайника на карте - пытаюсь адаптировать под NS OGSR 2023

Compare выдает различия между оригинальным кодом treasure.script из мода ОП 2.2. и поправленным для отображения содержимого тайников на карте в 12 строчек:

Оригинал:

--' Выдача тайника
function CTreasure:give(treasure_id,npc)
	if treasure_id==nil then
		abort("! ERROR invalid treasure_id from queue!!!")
	end
	local treasure_info = self.treasure_info[treasure_id]
	local obj = story_object(treasure_info.target)
	if obj ~= nil then
		if obj:clsid() ~= clsid.inventory_box then
			abort("Story object [%s] is not an inventory box", treasure_info.target)
		end

		news_manager.send_treasure(treasure_info.name, object_level_name(obj))

		--' Пометить на карте
		local text = "%c[255,238,155,23]"..translate(treasure_info.name).."\\n".."%c[default]"..translate(utils.cfg_get_string(self.ini, treasure_id, "description", nil, true, ""))
		map_spot(obj.id, "treasure", text)

		-- если тайник не именной, то заменим содержимое
		if treasure_info.named == false then
		   treasure_info.items = self:give_item_list(npc)
		else
			if not self.treasure_info[treasure_id].active then
				treasure_info.items = parse_spawns(utils.cfg_get_string(self.ini, treasure_id, "items", nil, true, ""))
			else
				treasure_info.items={}
			end
		end

		--' Сгенерить вещи
		for __,item_info in pairs(treasure_info.items) do
			for i=1,item_info.prob do
				create(item_info.section, obj.position, obj.m_level_vertex_id, obj.m_game_vertex_id, obj.id)
			end
		end

 

Поправленная версия:

--' Выдача тайника
function CTreasure:give(treasure_id,npc)
	if treasure_id==nil then
		abort("! ERROR invalid treasure_id from queue!!!")
	end
	local treasure_info = self.treasure_info[treasure_id]
	local obj = story_object(treasure_info.target)
	if obj ~= nil then
		if obj:clsid() ~= clsid.inventory_box then
			abort("Story object [%s] is not an inventory box", treasure_info.target)
		end

		news_manager.send_treasure(treasure_info.name, object_level_name(obj))

		-- если тайник не именной, то заменим содержимое
		if treasure_info.named == false then
		   treasure_info.items = self:give_item_list(npc)
		else
			if not self.treasure_info[treasure_id].active then
				treasure_info.items = parse_spawns(utils.cfg_get_string(self.ini, treasure_id, "items", nil, true, ""))
			else
				treasure_info.items={}
			end
		end

		local txt_items = "%c[255,238,155,23] "
		
		if has_map_spot(obj.id, "treasure") then
			for i = 1, 65534 do 
				local item = alife():object(i)
					if item and item.parent_id == obj.id then
						txt_items = txt_items.."\\n • "..translate(system_ini():r_string(item:section_name(), "inv_name"))
					end
			end
		end
		
		--' Сгенерить вещи
		for __,item_info in pairs(treasure_info.items) do
			for i=1,item_info.prob do
				create(item_info.section, obj.position, obj.m_level_vertex_id, obj.m_game_vertex_id, obj.id)
				txt_items = txt_items.."\\n • "..translate(system_ini():r_string(item_info.section, "inv_name"))
			end
		end
		
		--' Пометить на карте
		local text = "%c[255,238,155,23]"..translate(treasure_info.name).."\\n".."%c[default]"..translate(utils.cfg_get_string(self.ini, treasure_id, "description", nil, true, ""))
		map_spot(obj.id, "treasure", text.."\\n"..txt_items)

 

вот как можно перенести эту фишку с отображением содержимого тайников на карте в NS OGSR? я попробовал но мне явно не хватает опыта - мой опыт скриптера  ограничен OFP, да и то чисто шаблонными вещами - помогите кто может

Поделиться этим сообщением


Ссылка на сообщение

@Купер это не оригинал NS, это оригинал ОП 2.2. вот отсюда по заголовку "Содержимое тайника в метке на карте" . В оригинале ОП такого нет, но это было абсолютно работоспособно и удобно (по крайней мере мне) поскольку NS сейчас топ -было бы очень удобно иметь такую правку именно на NS а не на ОП. Спасибо попроюуб сегодня, отпишусь что как

Изменено пользователем MAD_LEX

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...